sleepyhead-0.9.8/0000755000175000017500000000000012606377740013231 5ustar sergiosergiosleepyhead-0.9.8/Doxyfile0000644000175000017500000021564712412506713014743 0ustar sergiosergio# Doxyfile 1.7.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a 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. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = SleepyHead # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 0.8.x # 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 = OpenSource CPAP Review Software # With the PROJECT_LOGO tag one can specify an logo or 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 = ./docs/sheep.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = ./docs/doxygen # 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 cause performance problems for the file system. CREATE_SUBDIRS = 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. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) 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. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) 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. 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" "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. 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. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then 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. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then 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. STRIP_FROM_PATH = # 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 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 if your file system # doesn't support long names like on DOS, Mac, or CD-ROM. 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 # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) 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 comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) 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 behaviour. # 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 behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. 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. 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. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # 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 = # 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. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. 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. 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, CSharp, C, # C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. 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 that for custom extensions # you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # 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); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip 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. 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 (the default) # will make doxygen 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. 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. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) 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. 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). INLINE_GROUPED_CLASSES = NO # When TYPEDEF_HIDES_STRUCT 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. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_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 and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. 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. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When 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 (the default) only methods in the interface are included. 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 namespaces are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) 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. HIDE_UNDOC_MEMBERS = NO # 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 (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. 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 (the default) these declarations will be included in the # documentation. 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 (the default) these blocks will be appended to the # function's detailed documentation block. 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 (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. 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. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # 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. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) 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. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # 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 default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to 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 default) # the group names will appear in their defined order. 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 default), 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. 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. 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. GENERATE_TODOLIST = YES # 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. GENERATE_TESTLIST = YES # 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. 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. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or macro consists of 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 initializer of individual variables and macros in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. 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. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = 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 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 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 , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. 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. The 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. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED 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. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR 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. WARN_IF_DOC_ERROR = YES # The 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 (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # 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) 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 stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be 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. INPUT = ./ ./Graphs ./SleepLib ./SleepLib/loader_plugins # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. 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. 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 pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # 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. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. 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 = */quazip/* */qextserialport/* */fonts/* */docs/* */icons/* *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 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 = # 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. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # 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. 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 # info on how filters are used. If FILTER_PATTERNS is empty or if # non 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 be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). 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 option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # 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 also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. 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. 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. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # 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. REFERENCES_LINK_SOURCE = 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. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) 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. 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. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) 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 one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. 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. If left blank `html' will be used as the default path. 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). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is adviced to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # If the HTML_TIMESTAMP tag is set to YES then the generated HTML # documentation will contain the timesstamp. HTML_TIMESTAMP = NO # 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 the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_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. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the stylesheet 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. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 220 # 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. 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. 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 NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # 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. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # 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, 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. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # 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. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, 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. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_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. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, 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. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, 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. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, 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). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, 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. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. 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. 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. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. 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. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, 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. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, 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. 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. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) 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. ENUM_VALUES_PER_LINE = 4 # 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. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # 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. TREEVIEW_WIDTH = 250 # When 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. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # 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. 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 before the changes have effect. 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 prerendered 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 also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # 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.org site, so you can quickly see the result without installing # MathJax, but it is strongly recommended to install a local copy of MathJax # before deployment. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # 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. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will write a font called Helvetica to the output # directory and reference it in all dot files that doxygen generates. # When you want a differently looking font you can specify the font name # using DOT_FONTNAME. You need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES sleepyhead-0.9.8/.gitignore0000644000175000017500000000000012412506713015174 0ustar sergiosergiosleepyhead-0.9.8/SleepyHeadQT.pro0000644000175000017500000000060312412506713016227 0ustar sergiosergioTEMPLATE = subdirs SUBDIRS += sleepyhead CONFIG += ordered TRANSLATIONS += \ Translations/Nederlands.nl.ts \ Translations/Deutsch.de.ts \ Translations/Chinese.zh.ts \ Translations/Francais.fr.ts \ Translations/Svenska.se.ts \ Translations/Espaniol.es.ts \ Translations/Bulgarian.bg.ts \ Translations/English.en_UK.ts \ Translations/Portugues.pt.ts sleepyhead-0.9.8/configure0000755000175000017500000000101712412506713015124 0ustar sergiosergio#!/bin/bash command_exists() { type "$1" &> /dev/null } # Get the base directory of the source distribution (where this script is) DIR="$(cd "$(dirname $0)" && pwd)" # Attempt distro-specific Qt5 QMake detection. if command_exists qmake-qt5; then QMAKE=qmake-qt5 elif command_exists qt5-qmake; then QMAKE=qt5-qmake elif command_exists qmake; then QMAKE=qmake fi # If no qmake found, fail. if [[ -z ${QMAKE} ]]; then echo "Missing QMake for Qt5 on system." exit 1 fi # Finally, configure the build. ${QMAKE} "${DIR}" sleepyhead-0.9.8/innosetup/0000755000175000017500000000000012412506713015242 5ustar sergiosergiosleepyhead-0.9.8/innosetup/installer-angle.iss0000644000175000017500000000454112412506713021047 0ustar sergiosergio; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "SleepyHead" #define MyAppVersion "0.9.6" #define MyAppPublisher "Jedimark" #define MyAppURL "http://sleepyhead.sourceforge.net" #define MyAppExeName "SleepyHead.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{AF23DDE0-E745-456E-AA06-014BB6DEB63F} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} DefaultGroupName={#MyAppName} LicenseFile=C:\Users\Mark\Documents\src\COPYING.txt OutputDir=C:\Users\Mark\Documents\src\sleepyhead-code\innosetup OutputBaseFilename=SleepyHead-{#MyAppVersion}-ANGLE-Setup-32bit SetupIconFile=C:\Users\Mark\Documents\src\sleepyhead-code\sleepyhead\icons\bob-v3.0.ico Compression=lzma SolidCompression=yes [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MSVC2012-ANGLE-32bit\SleepyHead.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MSVC2012-ANGLE-32bit\*.dll"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MSVC2012-ANGLE-32bit\Translations\*.qm"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent sleepyhead-0.9.8/innosetup/installer-opengl.iss0000644000175000017500000000453412412506713021247 0ustar sergiosergio; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "SleepyHead" #define MyAppVersion "0.9.6" #define MyAppPublisher "Jedimark" #define MyAppURL "http://sleepyhead.sourceforge.net" #define MyAppExeName "SleepyHead.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{AF23DDE0-E745-456E-AA06-014BB6DEB63F} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} DefaultGroupName={#MyAppName} LicenseFile=C:\Users\Mark\Documents\src\COPYING.txt OutputDir=C:\Users\Mark\Documents\src\sleepyhead-code\innosetup OutputBaseFilename=SleepyHead-{#MyAppVersion}-OpenGL-Setup-32bit SetupIconFile=C:\Users\Mark\Documents\src\sleepyhead-code\sleepyhead\icons\bob-v3.0.ico Compression=lzma SolidCompression=yes [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl" Name: "french"; MessagesFile: "compiler:Languages\French.isl" Name: "german"; MessagesFile: "compiler:Languages\German.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MingW-OpenGL-32bit\SleepyHead.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MingW-OpenGL-32bit\*.dll"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MingW-OpenGL-32bit\Translations\*.qm"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent sleepyhead-0.9.8/README0000644000175000017500000000202712412506713014077 0ustar sergiosergioSleepyHead QT port v0.9 branch SleepyHead is cross platform, opensource sleep tracking program for reviewing CPAP and Oximetry data, which are devices used in the treatment of Sleep Disorders like Obstructive Sleep Apnea. Requirements: ------------- Qt5 SDK with webkit (opengl stuff recommended) Linux needs libudev-dev for qserialport to compile Building: -------- Recommend shadow building to not cruft up the source code folder: cd .. mkdir build_sleepyhead cd build_sleepyhead qmake ../sleepyhead-code/SleepyHeadQT.pro make You may need to add a -spec option to qmake to suit your platform. Adding -j3 speeds up the make command on a dual core or greater system. Author: Mark Watkins Copyright (C)2011-2014 Mark Watkins Licence Stuff ------------- This software is released under the GNU Public License version 3.0 Exceptions and 3rd Party Libraries: It uses QuaZip, by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.. http://sourceforge.net/projects/quazip/ sleepyhead-0.9.8/version.sh0000755000175000017500000000075712412506713015253 0ustar sergiosergio#!/bin/bash version=`cat ./sleepyhead/version.h | perl -ne 'my @array = /^const\s*int (major|minor|revision)_(version|number) = (\d+;).*/; print $array[2]' | perl -ne 'my @ar=split(";"); print join(".", @ar);'` buildno=`cat ./sleepyhead/scripts/build_number` gitversion=`git rev-parse --short HEAD` echo "SleepyHead Source Information" echo "Current Version: v${version}-${buildno} (git rev ${gitversion})" echo "Last commit: `git log -1 --format=%cd`" echo "Use 'git pull' to get up to date" sleepyhead-0.9.8/sleepyhead/0000755000175000017500000000000012412506713015341 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/exportcsv.h0000644000175000017500000000271112412506713017550 0ustar sergiosergio/* ExportCSV Module Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef EXPORTCSV_H #define EXPORTCSV_H #include #include #include "SleepLib/machine_common.h" namespace Ui { class ExportCSV; } struct DumpField { DumpField() { code = NoChannel; mtype = MT_UNKNOWN; type = ST_CNT; } DumpField(ChannelID c, MachineType mt, SummaryType t) { code = c; mtype = mt; type = t; } DumpField(const DumpField ©) {code = copy.code; mtype = copy.mtype; type = copy.type; } ChannelID code; MachineType mtype; SummaryType type; }; /*! \class ExportCSV \brief Dialog for exporting SleepLib data in CSV Format This module still needs a lot of work */ class ExportCSV : public QDialog { Q_OBJECT public: explicit ExportCSV(QWidget *parent = 0); ~ExportCSV(); private slots: void on_filenameBrowseButton_clicked(); void on_quickRangeCombo_activated(const QString &arg1); void on_exportButton_clicked(); void startDate_currentPageChanged(int year, int month); void endDate_currentPageChanged(int year, int month); private: void UpdateCalendarDay(QDateEdit *dateedit, QDate date); Ui::ExportCSV *ui; QList fields; }; #endif // EXPORTCSV_H sleepyhead-0.9.8/sleepyhead/report.ui0000644000175000017500000000163512412506713017220 0ustar sergiosergio Report 0 0 549 338 Form 0 0 about:blank QWebView QWidget
QtWebKit/QWebView
sleepyhead-0.9.8/sleepyhead/reports.h0000644000175000017500000000153412412506713017213 0ustar sergiosergio/* Reports Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef REPORTS_H #define REPORTS_H #include "Graphs/gGraphView.h" class Report { public: Report(); /*! \fn void PrintReport gGraphView *gv,QString name, QDate date=QDate::currentDate()); \brief Prepares a report using gGraphView object, and sends to a created QPrinter object \param gGraphView *gv GraphView Object containing which graph set to print \param QString name Report Title \param QDate date */ static void PrintReport(gGraphView *gv, QString name, QDate date = QDate::currentDate()); }; #endif // REPORTS_H sleepyhead-0.9.8/sleepyhead/docs/0000755000175000017500000000000012412506713016271 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/docs/countries.txt0000644000175000017500000000344712412506713021055 0ustar sergiosergioAfghanistan Albania Algeria Andorra Angola Antigua & Deps Argentina Armenia Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bhutan Bolivia Bosnia Herzegovina Botswana Brazil Brunei Bulgaria Burkina Burundi Cambodia Cameroon Canada Cape Verde Central African Rep Chad Chile China Colombia Comoros Congo Congo {Democratic Rep} Costa Rica Croatia Cuba Cyprus Czech Republic Denmark Djibouti Dominica Dominican Republic East Timor Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Ethiopia Fiji Finland France Gabon Gambia Georgia Germany Ghana Greece Grenada Guatemala Guinea Guinea-Bissau Guyana Haiti Honduras Hungary Iceland India Indonesia Iran Iraq Ireland {Republic} Israel Italy Ivory Coast Jamaica Japan Jordan Kazakhstan Kenya Kiribati Korea North Korea South Kosovo Kuwait Kyrgyzstan Laos Latvia Lebanon Lesotho Liberia Libya Liechtenstein Lithuania Luxembourg Macedonia Madagascar Malawi Malaysia Maldives Mali Malta Marshall Islands Mauritania Mauritius Mexico Micronesia Moldova Monaco Mongolia Montenegro Morocco Mozambique Myanmar, {Burma} Namibia Nauru Nepal Netherlands New Zealand Nicaragua Niger Nigeria Norway Oman Pakistan Palau Panama Papua New Guinea Paraguay Peru Philippines Poland Portugal Qatar Romania Russian Federation Rwanda St Kitts & Nevis St Lucia Saint Vincent & the Grenadines Samoa San Marino Sao Tome & Principe Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Slovakia Slovenia Solomon Islands Somalia South Africa Spain Sri Lanka Sudan Suriname Swaziland Sweden Switzerland Syria Taiwan Tajikistan Tanzania Thailand Togo Tonga Trinidad & Tobago Tunisia Turkey Turkmenistan Tuvalu Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Vatican City Venezuela Vietnam Yemen Zambia Zimbabwe sleepyhead-0.9.8/sleepyhead/docs/sheep2.svg0000644000175000017500000002451012412506713020202 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/docs/0.0.gif0000644000175000017500000002676412412506713017274 0ustar sergiosergioGIF89a––÷, "        €!!! "#*!-*$#*…*+& , .,)/,0,43*3Š34364373 :7;<<=1=;@>?ý?®¿@;@<@@ýA8PB“AD92DCBFHÿHDJD J˜JKGLLALLþMHkM´ÃQ›QRI^RRþSQQTR"UQUQ XZ X¹ÇZX\ZYþZ¡Y[Rlbdc[ cabccþc¦bd]nf¾Ëg]gfjjýkj kjkl«mplqjqÃÏsrrsrþsv#uqx³xy|zzzzzþ{q†|y}ÈÓ¸‚|‚‚‚þƒƒƒ„.ˆŒ Š…ŠŠ‹Š¼‰ŠÎ׋ŠþŽ‹!‘‘þ’“ ’–,’Á’’ÑÛ”““—™˜’¦™œ ››þ›Õޜƛš&ŸžŸ¡¤ ¢¤£ ¯££þ£Ùߦ̥ª«þ«©¬®­ª­«®­Üâ®®/¯¬»°TͲTв² ²³²³´³Ó³´Zε´þ¶¹¸aѸáç¹¼ ¹½ºØº¼lÓ¼»»¾¹ÈÀt×ÀÃÁ ÃÃÃÃÃþÃÜÂÃåëÄ{ÙÅÁ"ÇÄÒÇÊÈËɈÜÊÇ9ÊË$ÊáËËÊÀËËýÌÊÌÌÍÌéíÏ”ßÐÓÐÔÒœâÒÓþÓÓÒÔçÔÕ×#Õìð×ÕÜØ§åÚÚÚÚÙÚÜÛÛþܲçÜÛåÜëÛÜðôÝâ"ߺëßâââýãäãäÅîäðäåêæäìæëêÑñêêëêòëëþëòëôëïÛôñåõóåøóôëó÷ó÷#óøôöúô÷ õ÷óø€ø‰)øüãù4ùšGú”<ú Rú¥[úõ úöüúûóúüëûªeû±qû¶{û½†ûÁûÊžûõûúüÔ¯üü üüüü%ýÛ¾ýáÉýçÓýþþìÛþóèþþþ!ÿ NETSCAPE2.0!ùÿ,––ÿý H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³¦Í›8sêÜɳ§ÏŸ@ƒ :0®P±”å4ŠôQ…Êüøh ªU :` õ2êÔ«V³zá*1š³hÓÚát2V °p¯6(³ÒmÜ»s#âºk•HÉhJø ¶é$`Á| ?ü…X Ie#¶S²dÁ”FCŒe¤åË‚ýxŽ š¯è†ˆ½ŒìPqá¬[ó}½1Ýld †€[7_Þ `M¸à1”ø -øvÇ∑+gÎ×yBª¦CNi`$ìwtÿï¸]°’ñ¿G:ÜD!ÁÇrð—ñ»™9ʇKß ýá Åvmq²[B¹ñC"”à] *4‚`l}Xu Ý{]x—ui‡½ÅW, A ˜S ùG*òÅ"B.f— ‚á’` ,ô`\ªmÄ£‚IãŠÅ"X„ È—)©àBNÞeBnø‘‚õ—Ðf|u°—|y‰˜wY Pyw„Es !¶Ñ›Ö&˜B^Üiá‹ Åx‰e ×i ù©%BeðµHDF BÆ¥TFÎÆP¤pÍhÐ`õøŽ|U(aŽz—¨ MÈ—Ž‘—š™ÿxY • ­É®Ùʯ¹ —˜©:+C¾žª‘±»"KaB‘ð5HÉ6»PµpK¶`i[·WyëO•p1Ù‘®p¡Š³p¡˜º`©{»`¹{P(|ÙR^ŠdFüÆõèA˜‚¥iA{Ýå×G•ÞßBî5)F Çõ°B_5±|9ö›qå—ˆ`m2\"#DòUP• R¢|™ÐÁ|—ÌÑ<óÍ %"ØÂ %|W ùÌÐ Ñ Õé‘ÒÃ.$,\g5XÄ&45XU«Œ_Hr*Dç]lpvBcÇU¶B1”àöÛn_ì½WÉmPÆVÉ+Ð/±ôÿí·ß¬Î+˜Ýá]•Þ/ÙוI‰Wª‰%¤8\Œäx\žÖtu·½þ yšA#æ-¸}áTðUìOžŽ~þj€ƒ©Îº¥7ÙXlLŠ© »¬ÙÎcîqÂûë y¡üòÌ{¸F§ûVáÑ]ðJïpœp†D®öU1í;XØô=øâ7Ý}Hikß@àëF¾PûÒ¿ÚúÚ€ý Y@ù9™nøÇ=§‰D€¥üƇ:‡ 4 |ˆmL ÿñ¥3ñRAÝ`P‚ø#‰l°2òMAu£êÝCFXBÔP"TI$¼ ŒÀˆ¦À®d†5¼awȆ>åˆHL¢—ÈÄ&:ñ‰PŒ¢§HÅ*ZñŠXÌ¢·ÈÅ.zñ‹` £ÇHÆ2šñŒhL£×ÈÆ6ºñpŒ£çHÇ:ÚñŽxÌ£÷ÈÇ>úñ€ ¤ IÈBòˆL¤"ÉÈF:ò‘Œ¤$'IÉJZò’˜Ì¤&7ÉÉNzò“  ¥(GIÊRšò”¨L¥*WÉÊVºò•°Œ¥,!ùÿ,w-ÿý H°`?~ùôõ+Ȱ¡Ã‡#ú;˜p¡Ä‹ö‹Ç.¸ ?’{—/£I“;† 9²äɉñbÊœŸC}æVê ÞËŸ qîÚ󤾡 Ù1ìשÓr6¾dê)ÔŒüª¶3X®jÕxRQvõŠìÅ~UÝì7–lÙ°gÛºÝiVbÕwåÎÝîC½{Wö…XÕ§@xŽóûqâ¡‹í:5‹Ö«¹vìëÄËØ ÙË™½r†èñ­?wZ- ÄW©êΧSd]õuÃqNé l½S-ì“aä­ÓwAà¦ÿ:µ‰Oqc§æ„ûkŽ4rCÇC£C$·Ü_S¤†Öÿþ}hø†ãæDZ7R~Ùåî~(ü‡ò‘ê~xΩ>N…QÏG_N9Õ_Ÿ½_!ùÿ,w-ÿý H°à´`·‚M+Ȱ¡Ã‡#ú›–,áB‰36œFÉL C¶±DÏ-(Qrô(RdÉ“)RšI³&¥Wƒei‘¢¥O8ÅÊPçOŸ=ƒ¦ ÖdS‘f¾9JdœD‡N­ú3ÅUÉ:mñÆ`®USʪòlȦO»öT›q×8§¹E[•[Œzߊ„›"®O¿¹ê!¸„/_Q#6vl¸%d‰c XÈ1ß‘vF[y®HÐqP¥;QuKÃYÞ˜9û´òæÐyUŽ{¶`Í?RE‡kY‚¯\Åq·Àâ<+“-˜¼*óˆ{"Vþ/Ãd8¤ƒÿDìÜ÷ßÞ ‚ÿ-’¼ÃÉG!¿<6ꆣf)ïo>Õû "^ ûAEU8mÅ“O·5ÄUs¡)ÜC\E´U' wT2}±š{‘iˆ‡y8\‡Uã`qˆ_U‹9W•‹Â‘UUTUùwÔÎÝ2o IŸS@>$¡OþPRUzÙEUÎ9I”UEåCÐåõµÔ Câ&Uc:XDgzùÆ€ 6$"“¸-ÙRœ ÍÙD‚P…ƒ?8RuDðý![Æ'Q¡>‘øâQ ™xV„¦ˆÛ…“.j©CVff•?b(Q¨GÁ©?™úª>©ZP§>-ÿáÏdq5åjC¬¶Dé_Œv+C¹Š´kA¢P¨UýZP°!)³ 9;´) ‹Uûaú“µÀn™¶>q»¬· ù_Ô¦«¦ìäè_’nËî†CUT‰þ4èCÙÁÒ¡YåëÓ¾e÷À…µ `eÙ)ÒZ·'n]þ1D‹‘”ÝùÓ'U1Bds2…~F²?ŲRT)|Ô±¸‰2 ÌÉüÍ(—Ì€²B«OÇ…ö3UA?4tKE“éT\wRDvqher9àÕ eÅ×`}Ù\PŠ›L0l·Ýö»õ*’Ù¼.[%Ÿû¹o5ÿõ§CÐnÙPÞ>%Ù‘¦‰ô7[:§ xUM{”àßµÛìãTENÚSÂýeZt 8Dv‹T„çmzÊSè)Q¢î`=rÑ+ñªNy·“ í¯O±Ï^;ïé!üðÄëA©ÜGî®èªSJæÙ‚bVÕm>R&Ñ|¾}K<‹|TO ·Ûó-àà¹ä?ÝÞP»6þOê'ö½Hc¾Ù½÷Š«˜}ó©šåTÿIM ÿî—™Ð@rqŸC*f½8P#ÝK“?n<e$X…‘ C8ˆ¾œ,1Ò L~×¾8¬y¹C %~÷º"¸0&׉ ‘£‡7|! EXBÌð†B¼?yEÄ!ñˆ‘ !ùÿ,w-ÿý H°`5b­r1+Ȱ¡Ã‡#ú;˜p¡Ä‹V#D%„ >~ÔP£M«Œ(Qnì¤H’&S ÜH¨¦Í›£æ2"²§Ï4БI”áΟ"[¾Š’ØO J©0¬ÆE©K¤>_ä,*“ªU¬?µfTv)ƒ/Àªɇ«Ê´=¿"UÚöbµµcVƒ+×gK¥- ¹µûp_ X_\Û† ܵ)hñqRÈO'KÄ US|0‹6Aù!«rS#%-QÃeŸu«¹.ë2¤#\¨Ú÷sé²Å­ûõOß=‚DMA1¿>¹T#¨I9V Ó|>÷£têÖk¿ÿÌþÐD\Ÿ’†~–!±Ù‰µôx¸}Á÷j?´üsò(µ¬5XFÈçÏsQ CbU D;ÐÖSNÏõEr Gy¥Uņ…$¢_2ÄX'™gÜGÄ@D…Zéi§"V->ô"X1:Ä„Z-Ò¦T5ˆTcÚA' ù‘݈3­t'ÁƒE ÚY‰ØrSF¤¥„X>ÄV©•Dwõ‚v„˜QšX­ùÐjùÓ†” fhœˆÚÝù¡DBäç\þŒ‰”~…Gâo†þ„hrj•H`ià“Hi>YD¦ýIÄiOž2h¤@î¸å„ÕÀãoªbÿµD®‚UcCmbEZ„«Š4ëC¼buRiÁ"5,„jË$jú³ƒpÊ:t¢„üêV­ÂJ4-RÖRÖÎ&+Q±?E˹>™Ëº=©+‚H¸íkîÄ®H¹ü6¯OÝ®«V¾}Y–±rÛª”·V°_ýTƒp ”Ëy"Iuc_9î'œ¤EŠž¨Â•ZYFžÕ¨O6RÚÜSÊ ­üšªåE)XL>DñKÚÝŒUΩe)Dœ5¦‰ZRAäÔŠ€ûÛÑ`%ýÐÒX9­s\- E5R5DÄ,XöQ¶uX^«vC‡Õ(Dt‚U×okÏ©ÖÛÒî`÷Ývk檅š6ÿ4ªHî“Ëà„1AØúEAÆ ýýQÃù\VHa6ÔÊ_?!Ùн,XäçUÎÐå`iÎÕØ~¹»oOgÛ –çmýª›]ZZPÉe‚2 ŠUßq»c;´{ï>&|Q¹–·E­,üÓð Q›ª¡ú¼@ÑŸj¼Dm„/þømÌšø©Â} ìë•õWú=1ÞP¯=}¯”ðƒD¥CÖC$°hFÚßÕÀâ›¶I 3!8\ðØ)¨R CÖ‚ñ†Z;£@†,]]ÄeD#BA†œì0_ÙàEú'2 1*ÄÈAÔŠó]5@Z'×¹ŒÔP4Ñ! Aé÷‘<ùƒFÙj¸ Aþ10#„`‚ÌtÇÞ¥$A 1â@FÑ.0a/x¨À>4Ñ@á¢ÁXƒ1–ñŒƒ !ùÿ,w-ÿý H° À]» *\Ȱ¡C†JœØð’*2jÌèdOBŠ AZĸQcÇ!ý)Zɲ¥"Y w])Is£ŽA)s”Y³çÍÅzj£ÐУC`êÌiôhϤ º18Ä©SEKCVµ*ëD§u nå*ôRÖ‰cÉÖôúÐé‚NÔ:%uÖa\¹Bé¶=ŠS "¼Hë2Xè‰${²MìóŠ1i{¾lqOÇ­Nnh¹¤Yu¤”ÕÙ&å‚¡N%Hú¨Ž‡‘= ,­1¬BÚٞƭÂv壺ÞíIWVà…„…^9-иa†•Û= ³iϾ 2÷g½&v…ÚÎÿš0öF‡bŽ~¦l^#zõ Ó -æÏµÃè’™Ûoˆ¿æf…òõäÏ.G-×s=EÒx”‚ uG“?—åCÇ V¡Pf÷C© ¢w{ uÚ|•( C(š(¡lµ—Ñi/n´C2ªÐPrX“R WÓi>Ò¤WGñ'ÔkE–$CBÒDŸ`MnôäBQ–TÑsãõt¥pG¡tV—?>”åFb´aMNøs¦Fi*D&M_êôfFq4§“ ‘"T›wªgAšR¡f†É‚4-·§•‰ÎGÙ£ÕIèQS*Ä`MDUYi¤+RI¨C2T‚þxšÑ‘8&I™ª*°ÿºPŽ 5Uw›«‚ášÛC¼ÕÚSX<ú§"M¯QV,Mÿyè“°Æú)„þyš´¨B˦¶%õuT›[ÚªŸµáö´Zµk ˆÀkbC#Ò¤kAW8aï½öꨬbS1 0’y5”£¥-[µmZS²`>5؃íw–SƒRšÑ¹Ýyº=e¬š`9~\P‹cù¡Ê+„2q‚õ÷0[²Àª‚Éׄ³A2#‹Ý.6ï¬ÐDmô@ ¿pµœsaFKvŒB­‘P:mPÕV«€uCN}/Ôg-±CcV6Ø)”¶\::ǽ­–™r;µAv[G5DÞfë½|÷>óõÉÐ$'`  ˆ×J†0ÕJžL™à7^xrtX!DN­}ÞïMº´é¿õìyÛGë’l¬9¶²íÛ9:‚Æ–LÈæÙóëµ½ÓÈGËN:5·gµÎáÀ.ÜØ³÷Œäà 5¨¨‰ÿÞËÜÈ‘æ“esD Áü¼ðõx#… ÎL¶«.¡oÏ½ËÆœ`…d±d ‡7óÌnþèñ׃Èœ¤õ AP:ÿó~ÑFP ø$°Ž8@¤!Á#Ô>L”&‚ÔzÆì°7›ìM%@ÃÛ*uš¡a "0(#mÈa`YÇF¬zô¡¼8QMîC4#]Lª„ÿP°àoªÅ P€€òÚ¨ +Uia@P¤-ÙC (€P€< g‹5¼_þxguL?â^t —žA‚@ŒÂá,mÇKHûþP: Â,D,€ € p (þ(€ °"Š û&,Ð :ÚŠ ,@÷…ØR¸"P)¬ÑÌAŒ`'çð8F¦ fÜÂpE“ÅÝÁ˜‚*N8‰Ëjž—Í5y @Z(æÇê‰ä&kð¡ÇXÀÉvâR,li&@Ó– 7Æ£ÿ/‡±`} ¡æ‹ Ts“¸d6:Ä$_,€í@ÇÉÌ€°@ËD?€ ‚æ–ôB‹P“š gdP,`÷ôf !3¿4ƒeðGâ‚$Ä3U}ùÄDŠË J¤£™G%àÇx*ÆÉ{ á;uH:Êâ €âc8À-QêÕ™­ê=é¾5_< ca¦„ì@d|ìb%ªÊ:£z 5­›\+Ø~°>Ä5$.øÛ]czPd‚F~Õë&ÀÖ¨ýÎKC\©‚µ›­æ*Ëп–ÿA*°jÁF8DQl ÁJ=ö‰ÿHvŸQ-_¡WN>ÀØô˜7‚Є²ì ±[Ðí RÐVÓ4U®=*ÚjrrvUnªÔðb€ ‹‡Ðî›êá ¸—P¨Y……‡Šr e@àŸê Jtí@ìà(Rõ‡D('“°PóôrïEÀ(@j )fõ  È@Á¢1 ‚&§à PÓm=¾¸ÉoB´ ¡Û<ª`ƒDc˃°÷\ON>bK}ؤDPäA¼©²"0°:faà±1Nr Q\À®JJ…I9 Õ €È–ª*8Ð-$âÑý˜ËhB„à«ò3N°ILôÿ+Åò ÖŒ‰ÀÒH2ÛÆ4 ðÇìr¤a@pI€9G{qÛ‡žÐo4 xöØqæˆ0±$ð¯’ê‰ À _pevDÃ(˜?÷Ån á$äüNøÃ´V áË:ƒÀ­áÄ?„öí¥4 S‰}ÊlõøÄbÑ LuØ›æË=°Mszœ~)h ÛoSËM #ÎãÆ«½Û›>!±°Œ&rÿË÷€f+ÄRßç\ÀƒÀ;à‚KÂP€„;<@U€~ð‡ M H€Ìmq€Ãî¸ÈGó‡—^sä"ÿ/yÈQþp¿¨üä,øËcÞò™ÓÜá%@d”š›sQFpX€¶`àóØ®â#sT ‡0\¼H9ªT†ð ÉnN^²îs½‘ë£A‚Žf€ï¡c˜èC×·T‹>¤¢çwA½ïíõ} ƒ@òÚg”sü4üöCì vn€€ÏLÏÞ³Y- 2fÏ%<…HHõï± t©{ñz††43Þî ð/ l^—†8p€€»nÐ˳ 0Àþ,¬z”4Î(ADªCˆÕâ´=ÈîÑ…¨êó|±_”Q&TáÙF?**0EÖ^ù¦9Žÿ.H`D$f8h0µ?À0ìŸg5Ï`A'O vŸûå&MÂ^\–Í¿lá+a]½·]àt~¯ç @PO€PËÁ!7`7þ ð Ї‡Ða"@€ X#¬P åz¦Q¬Õe/¦E’ ÀÀpwPtÊWiðG+à?2756ÓÒKÜÂDÒuÿÓ Fzü}ó.ðþÀxMza9·w ?!è wðPð %´!ÔðO¯Å  YÇö€ °I,/!È*, L+  Ÿ—MÈ0ð2Õð (#] ‡„é¶v¶ó8HÐDÿ<çk‹¢ìWv‚ °žµx‰ˆ pP¶*@À“è ´!Þ€ÀIRð„ŠHÔ@` ÚÅu.:åÈP™`ƒöw0„ · hdÀÀ \‡@d "þPíÇPû€Àp¶‡Q™hPzõ·B`5cjH{«R `ˆÔ ˆ~ 3@D0§’ŽûÀ‰`\ñ (°“†‚3Ó=[ c»¸OSƒr¿B ÜHÉ…hB'õ %Q$fKò8©`”^Å´ˆ7,û  jðP ,  `ÇÚÿ0Jp8E#Ž©q ×að‰(Ž’#'õL4  %„ øCþF)Q‰Ú# I`K PÀ GÙ’L óøGüG|ÐGPØ5˜§n¾'ÞhK$` Ž£´Û€Ða p4@St·$ àpEëÐIp3±˜0`ºx¦à m!×ix–X0S]ÀÕ`§ÔWAQ"@†è ‘£„ƒ@€ÙDõô>##¿’ ®4Y£3™-$iÎX°K×™ÕÒnb'Ða  Ð)ÿ&#ÞƒŸÂ˜±p ^ȰglUjàœ6ø5ÍÃ.UWO%R Ÿò ‘te±S°ƒÄ¹À0M‡dK È0C£ö  gK…HÄ—§¡ B ;c±Ccñ 0|Ò1À@4Æ€° ¼É%¡# w  Â¤`IÐ zA‹K‚ ßpž qv}µ÷@ #°I%š%/J(¬ÒLi[ € ðϰ–§y3!Éi)»†”{A @`ˆÀ àG+°&8Ô +`ˆ pÐDRà…2ÂŒChÁ €õÀ ÊØ%È€ÿÆI ´™.ÙO@óÏ ?ÀTÅF°aÀƒ?Á à’uå zØWÒЖö¦p¥°Z  èB'YÉEè ‘ÜÀ P@O¹F @Oê§3Ú@DÀQ9±ÎàY¦™0TD¸”WôzYÖÜ` ZpÒù¨ÕD"P Ýã«Â]×!êÐ ðÜ€‘®ø+öÀ Aði$ 0“‡TAP À :HGIú7ŠÕ4QE©¢v©3â •à0¦8Q@ }Ï `] PD¶ô,pá¡*™Ú$ÀÂTcÞQâ!±}ÿÕ ,@Eá¬Ïº×ÀH¨¡R•@/eK–Ÿ†¨,ЙP ã93öÐмÄú{"Õ° ØynÞÚ›õð'H|"óR+~СjQ*\Í! sÀd`Ë .(@§r¨‰s“é íb±é,߉ Dri³1§=Nb§ðZ½³™ã×°°’kÚp`ᓠѬ,ò"§à,ÿ Ær÷` 4PúEä<0‹ê  Vph€¦ÛsÆÂ#>B/­œ€"f³p7?Ü 3€úÔg vÐ3€ s*´FЃ BÐQâÕ8ÁQê0 V@Ä/¡F’´€pœâÖ8Á;êà J€R` ¡œ™ *í‹ùÓ€½q V0A Ò°ÎÀRÚð k}p•-W‘ !Ô, VÐÃ(8‡ð§P Ù¥m¼À(pUpî÷Û«25ö@¼õ`ÇRð$Vð×·­>ñ @ü‘ð ˆ*ÀÚ¹›Æ´€4¸Ï RÈ€ VÀ YµÜÎÐ VPj¿L|ˆÖöÐ ¨ Bà%Ðà 1¤äý#Ñ ‘À6Ð'g¨€ ÔËrœ‚Þ@ È€ pI°`dÀÑÑÿ à.ÊÐ xð<0'À4 ]†P ˜@ÌÄœ …‘g°4À+°> ß(±(“¿ÎÆ.Á( Ê€ ‰€9à0ÊR>Êàð.Sà¸À Π3ÆeÛô;sleepyhead-0.9.8/sleepyhead/docs/script.js0000644000175000017500000000422012412506713020131 0ustar sergiosergio/* Borrowed from Michael Leigeber http://sixrevisions.com/tutorials/javascript_tutorial/create_lightweight_javascript_tooltip/ */ var tooltip=function(){ var id = 'tt'; var top = 3; var left = 3; var maxw = 300; var speed = 10; var timer = 20; var endalpha = 95; var alpha = 0; var tt,t,c,b,h; var ie = document.all ? true : false; return{ show:function(v,w){ if(tt == null){ tt = document.createElement('div'); tt.setAttribute('id',id); t = document.createElement('div'); t.setAttribute('id',id + 'top'); c = document.createElement('div'); c.setAttribute('id',id + 'cont'); b = document.createElement('div'); b.setAttribute('id',id + 'bot'); tt.appendChild(t); tt.appendChild(c); tt.appendChild(b); document.body.appendChild(tt); tt.style.opacity = 0; tt.style.filter = 'alpha(opacity=0)'; document.onmousemove = this.pos; } tt.style.display = 'block'; c.innerHTML = v; tt.style.width = w ? w + 'px' : 'auto'; if(!w && ie){ t.style.display = 'none'; b.style.display = 'none'; tt.style.width = tt.offsetWidth; t.style.display = 'block'; b.style.display = 'block'; } if(tt.offsetWidth > maxw){tt.style.width = maxw + 'px'} h = parseInt(tt.offsetHeight) + top; clearInterval(tt.timer); tt.timer = setInterval(function(){tooltip.fade(1)},timer); }, pos:function(e){ var u = ie ? event.clientY + document.documentElement.scrollTop : e.pageY; var l = ie ? event.clientX + document.documentElement.scrollLeft : e.pageX; tt.style.top = (u - h) + 'px'; tt.style.left = (l + left) + 'px'; }, fade:function(d){ var a = alpha; if((a != endalpha && d == 1) || (a != 0 && d == -1)){ var i = speed; if(endalpha - a < speed && d == 1){ i = endalpha - a; }else if(alpha < speed && d == -1){ i = a; } alpha = a + (i * d); tt.style.opacity = alpha * .01; tt.style.filter = 'alpha(opacity=' + alpha + ')'; }else{ clearInterval(tt.timer); if(d == -1){tt.style.display = 'none'} } }, hide:function(){ clearInterval(tt.timer); tt.timer = setInterval(function(){tooltip.fade(-1)},timer); } }; }(); sleepyhead-0.9.8/sleepyhead/docs/graphs.xml0000644000175000017500000000341712412506713020304 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/docs/PRS1 Data Format.odt0000644000175000017500000003435612412506713021604 0ustar sergiosergioPK¦Bõ>^Æ2 ''mimetypeapplication/vnd.oasis.opendocument.textPK¦Bõ>Configurations2/statusbar/PK¦Bõ>'Configurations2/accelerator/current.xmlPK¦Bõ>Configurations2/floater/PK¦Bõ>Configurations2/popupmenu/PK¦Bõ>Configurations2/progressbar/PK¦Bõ>Configurations2/toolpanel/PK¦Bõ>Configurations2/menubar/PK¦Bõ>Configurations2/toolbar/PK¦Bõ>Configurations2/images/Bitmaps/PK¦Bõ> content.xmlÍ<ívÛ¸rÿû¨{v}«oËñ®›ÄNãÖIÜÈÉÞ6g@$(aMºiI÷Wß¡oØ'éÌ€¤@‰²ÉXÙÝœÛÁÁ`f0ßÐÏ/QÈ„6RÅç{ýNo‰ØS¾Œ'ç{ŸïÞ¶O÷^^üÓÏ*¤'Î|契ˆ“¶§â~3x;6göéù^ªã3Å4g1„9K¼35qþÖ™;ûŒÖ²#&Y†µ_§ÉîÛ‰X$u_ƹ¥wù¸þÊ4Ù}Û×|^÷eœ Du_TÝ—&l ¨Íx"×°X„2¾?ß›&Éì¬ÛÏçùaGéI·ÿâÅ‹.=-öŠy³T‡4Ë÷º"¸˜éö;ýn>7 ¯‹ÎuQŠÓh,tmÒð„opÕ.&+追¿ySñÕdùôä¶ŒMÂãe42aëNºZÌ”N Âõ&pkPà6M¢pûqǧùÔ‰öýÊ©€ÎaŽ>¼öƒó)éÃÇåáE—&‚+E˜Ÿ’bn¶±˜ -q'áZö÷(À|r$ÃåùÞ|¦ÌOë3íè^÷qø—â7þ%e#Ø3{¯bµüúÄ <+ÇÚã@ DÊ:.M™ÉÄMÈ…ðŸB탌Ʃ]ŒÝlÅ«4ëû#õ‹ˆÿ3åñIöß"fïÄ# Ù˜úý±»‘`ˆInÙÛ…emb Ô´Šx%f l¤# RT 7˜W53—Æ< µµ³Óô=ŠÜÒ$"zv‚´S‘«‡_w›òÊÆyš(Ô˜^›àZ~–vsÛ/ÖÊpŸqÍ'šÏ¦ùÀ°ƒ>´í[#°½>×þ^y{–@èD Ãeq› 9™‚ «Ð/mÊ>hƒçñöÇèY†b‘MÀ;ûxdSƒßeS1š¥ð‘mmŸPl,›Rk‡ßek†•êþO±õáŸb뿯(ßmœOÄÿIÍ¢z ÞšôJèXÚdÈn}^`›Í¨ïÆÑ«…ïDÜÃô(²î¨2Ò:¤&…Çìèô‡Íe»[µqö`¬üeñá^üLI#þžŠx¥Õ7 ùÒÌB¾l«4 e,Ú!Ähs€ÿMí&¯Ã05‰5áˆã³€ÝåèyPÊÏri“:DöíT›ÙW\&ïâöÓ¨Ï.!co%Å[ 028³í¯ʤ[cÎÅ÷¦ìö‘MgcÁ0êc.9å†q6aÈ|À.}/zIªÃ—1læäû‚0‰)€¡4‹”Î`CåÝ›£µè‹ DÇl.“)¼Ý?bãeë Îl‹ñxɸï“ôò0&XøŒ²1¸TÙ(„Ú¨'àŒj$«/=ë²ƒÈ ë’åŒÄ‡ö‘¡,ü³Ý ‰çé*GÇÎJø¸{q‹6Xá¢ÓëõY¦ì<ð‡ÅÊÓùs$ í”F׈+ ª^a’‹CCxÃjxw2‚ƒ#€Þ¡a/_¾lõ¨ê/¹\6D´‘¤á8Cà :hÉœ"¦•èMäšÅŒÅY²è»†c¡LÂ<S@e°¹JCÐpHD’€~ó“A@)‘„ é‡)ÎŽAgr¿ÅÆiBÀ³ƒûK:¿O%hºP©ût¶£³†bœÏcdÞY-xµàè]49-_{ƒ_Ù×á)ëùð»×ÃGÅ_ø¬°^ÏþÇOGŒ Ö°¡øuwÛ¹öŽÔ°TK)žÔÊ'—Vt›l¶ä ÍVÃ>E;@&@è54­=þbóï»kgôw†¬ñÙ\ô5jíOÀf¢QC“iZ0Ñ S¬ÇåñG…Ÿ k• ëA# KÔé5¤º+È.¶‰––<„ k.ã"cÚ ·a ·£¦¸‘ÝhÁ£çƒdß"'ÇÏ’QrW6¯ÉÂ'îÂ%%à<8T¯[ؼ\Õ~ UÛq WïlYßE íÀŠflÿó‡ë¿±«™ò¦Mdì õ±šÇ¬r{¾jŸÌý#|µ«Ë$<Â~‡¡½3¹ÞÏa¿AÐTò\Ñ‘8§Ÿ',YoÑ Zl>•àWÂÛvÙ€ óÀñâa±~fàÒš¿d “QÙ41b åœM–T“(Í'À=Á’’³‘ÛÄ}tNÈMh¤ýþ”ö 8—»%X_ ¶XüZ½Ð6Cb$²Üp´ý†¨ôKö«×ß²úµô9¾ÇóÓpÉÁ÷,'pÒ Û½8Ù‘`¬p}[Š#C‰®å*P¦5Ù_Ø`Xšƒ"ÜÐÈÓrLF\ÍmäW>3Òбi!å†áÊá^AÃ-¥DDwΈ¼Lë‡lˆÌq™Í$'[ï²”~¦¼‘as¥ÁÀÜ¡«‚Àˆ$Ë)['àB«r5ú“ïüA(òlaHÁ¼µé*[¬·NŽ Üíþ58Kù±ð8Vw•çqCx´—H¬ÇË™™ÂnˆälÌ ,¯¬yÎn¸uv"”ß§K#n*¢'‹Bð–3q!¯kE @ÉLñp!çXYn±¬$eýr}*çCQ{@o”<4ŒÄbD­AžÒZxI¸Ü‰:ÝG¯F_ìÉÛ·ýnì耎~~™¦…åxãxø(ÆÆpÜmcú$"xC³W)l!Ö«Ç® ÄÂWÂÒ;ïŸùtõéÛ\@!€v{@"3¬q;•¡„øï“03©U,=îbEܨ ™s È/Uj#%ô„e|Ì‘èóÏrNa7D4ÞÛnE+ õ(p[( &±Ò04SŒ9ÁÎ,À…ú«HBv   3)é±7DíZñÔÎuSðð Ú¾D=á~¶Mo(‰[„T¸êæh¥4K^‰XäYñÊ*%p`o}èn•â4©Á$Ë&øüÑù×í)x—{§(!oe‰T·½Ú˜¹ý××·¯n- ì®à©‹hü뵡íh™†x +(v›†¦Šl¿2Dê®àVïñWÓ8_ã#Ù*Z¢ö nQããØ6ʇª| t·ÿ´Ž~%õœ/w½ä‡¿[ÎÔ,|G°=Î[ðnd$kÈžÖwcx+½E©<÷0—ÜîíºâkéÇ“‡9Äf©ý]3‹ž»+£OÝÛ׸\¦¶…ú¼Š¾:5-zÿ ï0¬•»óen¿·Çr„ühÄÏ~)ºÍ%_:C/ñ_yÑ ªïÎÂen<€:–óÏiæzËî—ìšVæ^£ÿüÔúo5ð9¸+~œîS±]tç åÁ³žŸ"Õgóêäæ“}¨ç-~«-ý]LéV“õ²½—/Ùy=Åp‡î)*ìÅð½ƒè ¨O<×èíÞ$¹o÷&éä;š¤ßÇ$¹íjÏUÎïmš}YÌGñ¬‘œ©°Ž©lû{Ûÿ_K‚) Bî÷l‘†zœÇZÝÃÑöѩΪ`vÐE7’âoÌq™*c¹Åê>y¤*Ìî­5» ñЬÑêþtìJZ=÷~‘:|6 ¥È€ÛKEc[®rkEØ’GÔ×<ñÝ áðÔÚ&'š{˜èq×/Ê:©aÉfpö³÷%°|xúECEivË–‹máÏG…›òÐng7©3[”b”d-Dd Jd©'9‘ôÙדSÛ÷~´úÑÇ6xì–ïÂã!6ÊãÇá0ï›ÔéÇ2]YÇ€Rn¶W£Ã½U©ÜÁ5¨=¬­î;ª=®=©=­}Q9ZËŸòÒÖº/³NÊŠàYÞÕ¶ ˜¾K йíœÃä¶Õ +µÖ¬wÖNá:U+Ÿ¿Ñ̪éñ8 60ºQsö‰Ç“oÅê›Q9Ü@åœLÿ\JE0 ƒšÝ,pß~ ,™v Æô½ŒÓD4¹gxQ.?Þ‚ë€ÉÑ;-'Ùâqþ‡f7\ V_° É7i«T‰¼“>—/*Ä&‘u}ê¹ ¬èôžLªÿ,¼¨æ,-U9)žµVæù‡oÿÇIòS›°B>Áj‚ ñA#n÷K”¹úÃ4ÄíáS–tu@±›±ÐçìvÄöóø‰Ò6ÇÔñÈr ÔO‰œ³u8õÀî^õ@© R<6òtê¸ß©M½±%éfŽì ûê2°gÃñ¯¬ÂNOXcvxÍ1;ùÃÁ v2¶¿ÇNæŠÙk}Å kð[¸w/Ë5~*5¨nð ^òÛ¹*Ù´^;5{>ViV8¿Ì¾¶±^Po‚Ù+Xò¥FOTŸ¤¿E¸øžë{ö Oî±¥úÇ0ùé7áK°(÷ÇÿVúVûâø$\O”š„â“Ýô1Î(ï€åD¬¾ÅÁê=w?E«‰Éº)¢1Mœ+Ø ÝL{ ›5Eîk“Ç߀½¿ã! åýÆðf”Æ2ÙM#Â0¼ ~ÂÌ„'É®M”½†ðó±ï” vì‘»­œÑWèža¿êùu¸ã—_ÒØT‹ ôÝ’*¾Wº‹¤»wQ5œí_ýN N@»Ëï)O™6¢&åâ­4(´a o²nÛ!T¯JúI®™X€òóÖi,“@ð|á-gS¡óœvMØK-y§ïF³ÖZór­Öì'Q|ƒB ö ªÉ2;sUýwVÅ£_“*t‚l»uÔbûØ1É2ïoC±°íç­Âo¢Vså‹áÒð@$^§fé7ž‚'..œ·ïää¤V¼ <çhÈÁ"IºSAÓ*¶þß1ÿƳ#b'~½"4ñ{V¸Ž¶ #mSȪ1ˆnâYÊ÷fØþŠe!- Ç Ï°½lÑ0lUì°’Jê-äsk0ó›l"žj6z]2ûí®X]ò ­Âæ/séÓ|ÎF—Ì+\e€²Ä‚Àv°ß=<1ó manifest.rdf¥‘±nƒ0Ew¾Ârfü‚YŠdh”¹j¿ÀCPÀù™’ü}]ŠÒ¢UÕÑöÕ¹÷Èùá:ôìÍ8êÐ<{ÎŒ­°îl[ðÉ7ñ?”QîêF=O,¤-©p*øÙûQÌó,æT k!ɲ ö¤ŒC"¦›õú[Úñ2b,·”¨#VÓ`¬_Aáꪱ"š:Šq4v!Zlš®2 ƒñÆK»ãìc~ÅÉ|¯ø³¦'íüòì áä*Sð ­"trø5MþÖú çð}øj"Õã'ôÔõæ.#ÿ*ƒu³•ù15t¥êe™´©Jÿ]µõÌaýâ2zPK¦Bõ> styles.xmlí[[Û¸~ï¯0´hßd]f&3vã,Š] 0Év7ÙíË‚–(‹‰HÊ—üú’¢DË’Gsñ¢4Ìsxxø+)ÎÛï÷e1Ûb.£+/š‡Þ Ó„¥„nVÞ¯_þîßyß¿ûÓ[–e$ÁË”%u‰©ô…<XÌ`2KC\y5§K†KŠJ,–2Y² S;iér/õRfD ›:]3»³%ÞË©“ïÑ\´ž¾²fvg§í¦NV¼€©;=cS'ïEágÌOXY!IzZì B¿®¼\Êj»Ýn¾»š3¾ ¢Åbhj«pÒòU5/4Wš¸Àj1Dó(°¼%–hª~Š×U‰ÖåóÉÐ ‰N¬*¶›É±ÝŒ@“äˆOö Í|lÞ«tºy¯Rwn‰d>b“»à#õï;_àåÔµïT 'Õämnw>c¬UUM0ªÕÃð:0¿îÝYö's‡=9Ëž "igåhÀÀáã­rSËÍÕ¦G%ßWŒËV‘lz‚tâ6¼rYãᥨ–uÃÓtÔ¹ ÔÀÑý-Á»ïŽòÏyüfj]Zˆ+9´Æ—_EóUŠƒ n²¬“ÙaGZÁ¥äˆ åD0ŠÔÈÄ\£ã+-´P#òB@’K³˜§Ù~xïlQÈ„ %ØOqRˆwoM0·Ã3ó[A¾òîYNäìG¼Em'‘7ƒøµÌ%)+ï/¨bâ¯}N3êçåÿˆGÿ¬gŸa‹³Œ²Qñ}ÆFüìH¸šào0Åœ€—,Åœ±TD&èÙãô!Õ>‘r]›Åf÷£zq]^©aúsè¿Éì?˜ÎÞã39a½¼v÷êˆvÓÙg˜;Kq‚jœ•hP³-8›¹G(^4I7à› šØ!ž¥Z/vdg•;‰ËçhwâH/êrÓô Æ’W3n\»g¨.š¶×Jn4ÝpTå$ñ,oóÛ¯8¤Q. ´Éªù[Š¥lçƒ|¥¿_yáü*=ˆ‡QBgâC#‡}Q¡ÚH?gœ|ÕQ¡X㻳Ì[¥FrÊ •oªÔÖ™ ,ìcGdî›ÆJTv÷V۞Ėš“¾Ì–ôá“×zQS¬µ€wÖ•´üPå˜ê„ë(…äk]Ve`÷’´êOô¸ª¦‰¬Àa—°o@ÿa—´®ä§“ªE ™º‰ºx9vÚ Àì‚å žå˜m¬„^ÒùÔšÖ‹†Òü%ÝT¯ÝzÛ@ ¼„G»‡m"é{!Ç%"ÔW'LëŠñ SU‹¼ÇòŒp1‡'£Øõ$s—±f\E‡r=HäàGª„òëç.ìs¶ë-#½8ýŠqåK¶Á2W—*ZØ]и÷gˆªñÔMÖxÔƒêìTÞ{ŒR'²GÅÁ@{æ«BUôº _`à·8ümÍÒÃZ%¶qÈ:Y¥ªîu¬«n7¾fRª4ä(nHc]©®Æ¨Ø¡ƒx(ÃŒ¤Ýäö²Çu:ÏIƒbžËJRçExÏE SW:86›¹äçxÄ“}ÞГ·{Eè)û8㸅9Á›Ž¬?ÊÚÑô þ€*åª/h+ØGŒÌ.üÆ"SßC›[RÝ‰Š¶rhŠî'ì%j8­#•ÜŒ©ÐÒ@3‡“ɦ04ÔÉ™jZ•u–jéÍb“mýùý Zšhyg-ýBfûÃÃâ›û>‰SÇ*ž‡ÓË9sÙ^`}UúiϤ¼‰ìôB°5ác*Ø€ƒ·=ìYë ÜKŽJø˜öBGN±ÎÏæ[Ï]-×Ìei[6· ä˜æ€ñ]ÿîÂÞaáÛ~|Z Œ¶g-¬†Àâæ¼mr’`IGXv$U_Nt38ÌÑhÓ}FÏ û6=ô®Š§ ÿÀ¼–¦gžØFG?«e·É#ýd(^±À[\4ì&¨°Û@Ö¥o¢qåµöQ·™ÚÏL.‰ ¢O‰úšÛ[´2dÚ UŸ<†ÄöXÙz0ƒ#ÛáÔ_Lé‡ÞÞso»v}Uónߨr¨-IôÌÊó]JâÎd7¥ÃypÓ@Ãs"Òñ«B:š‡Ñ›A¤]ÊÒ–pq¤¯^ÒñíÐ-¡‡³¿8Ìׯ æ›øzçŽÒÚ.ŽôÍ+CúöönéŽÒCÚ.Žô›W…t<¯†Ë¡K9BÚ.Žôí+C:¾.‡.¥‡´!\é»W†ôÍpšv=œoþ$½xe0ß.Æpî(=  áâHGá«‚új^×C—rµ%<êc’‹?e 8†ÒŒlêæ>¾%øÍKƘT¿‡L5;6϶¨¨±º£2ƒv¢p Ð_"Ý9æbK}ªTòì›9µßébšŽ)H†´â"CËŒ^Ë™Gú“ÉbÑ}xB§Ò¡ lÛÐM¸~'«š?牖Ö=Q7êe]â[‚½ðÚ€µÑ¬{t9ð±*#o€©w£)ÍåH Ƕ0jœPrL6¹Š÷Åüvt‡Í ô'°“æ z&É‘^ÿnä{¸K9äBcº{¯3Œÿù%Ú·{Q×|Ý;¢†AàÊŠ3X„p‚½ë±ŸÙýµºÇÔüŠ' £”©ÙC,(ý½ÒÛ¸€ç«Ö7în‰ºû±0ôÜW#Cæ´›Ê1R__õÀÝ©3x*h‚?Åÿ«þ ûS4ÝŸFNüߟžìOÁhæj%­ŒvµfPI:ûAÞÕÙÉxÁCrÞQ¯ãÏȈÝ$ÜS1þ{•wÿPKžò2Óï2PK¦Bõ>ÇK3QBBmeta.xml Mark Watkins2011-07-07T16:25:472011-07-21T18:21:13Mark WatkinsPT5H59M16S35LibreOffice/3.3$Linux LibreOffice_project/330m19$Build-301PK¦Bõ>& \ëëThumbnails/thumbnail.png‰PNG  IHDRZ¼¨öp²IDATxœínä* …]©ï}uŸ|¶«™M9Ä ?Øæ|ÒVÓ4;ÎØÆ€I¾_¯—|ÿüûúúzÿò#ÍÏëìçÔË{š¿r¤m~¿N.ÅÇ:Þ-OÍäýbº°PÀ¨?®&¤n[h¹²Æñ~ãÆ¦ »?r¬'®l±3 c Ä¹!jxnÐ)š©—îVRÑ˯”Ç+ø¥p&=r˲Sãû4¢Že§öKo<Óš²/†ÚP3¢ý_Õq„oëH©äˆíi’oëHÙ¾íéùòN=50·„R¿(u¥7ݾÔ¼¹/Ð1„[a ÓQf^ a(Í`])á¶×]iX)õg;}iO¢­C )õ,~'qp³›'áÔ1 ?ÚûµÒc5S”©ãlýi «œ:†ƒÙ‹Û—é–ýÒ[×Bº6ŽÜHþ’Óž¤Ø³4ΕªøM[:î¢oð˼>ê PB©ß@xž[B©_89èËNrn¾Ãïƒôe§ÆùŽÒŸµ?CÏJÈPmòÄ\©ºwJL*õĶbG®ÄÝN@kG»ˆd­ûYVÐB8Wš¡Ï•J’ƒ.â&og9œT‹ðc¨ö±ÁYâ7Y ÌvPP‘ì`v${ŸÒA#|¬£re•œ5u¥ÒüÀ­)ïå(B;ÜfSr)z½¸ÕA1”úßqÐÊSÏ¿©åï¿8ËUmpª…d=KýT¿ßy;`õ¡w»{á¼HYKÒ½´áBt9âM­úgX‘ýô"nG(]<”f¹ãj^s°d½ÚÂu÷ôO`-„…”M¡´7ÖIÃJ÷šèmÉ>»ÐB²é¹¨Óuowh]h!\XÈø ¥²›=®L&WŽHb îòÝ>ë¨ìÿQçŸ ñF¿_iöëÞ|¼Ì}öÒd®¿ð.ô‚uUiôüHöß;Z€Õ?ïu ÐYÊP€rô,‘:¦ z–0ZÈþn¶b»fün”b¨UØ`((ð;dm7y£ÄŽ•¡u´€¡(ÞìfÞ%Íä¸TN][Q7'¼vÜQÛÏ¢þšÜç²NUØ`ì(@9ÊP€rÜt´ÊQ/³Të K§Yæ¹gYÛ×B ÆŽ¹i¾99æ‘99æÒº ×/½Ó};“]ÙÿÕÿõ߉k›ÀYgùip¤yÖ+;Ú0”3C©Á¨|6”V8TP=x> ;ó7:ËX­îy{9óŒåLÈÑž¹Ü}Çåh‰Xý‘º—[ýÓÝ=Ѹ7õGcç_… g±å(@9€S=K¼ªËz–Z7epóÀP ü–¹ª6yÀ_IEND®B`‚PK¦Bõ> settings.xmlµZ]sÚ:}¿¿"ã÷B>&0  ¥¥%ÒÌí›°ЬõHr€ß• ¹)˜”ô”‰-íjW»gÏ®¹ý´ˆÅÉ+(ÍQÞçgåàdˆ—Ó»àiÔ>½ >Õÿ¹ÅÉ„‡P‹0LcæTƒ1´DŸÐv©kÙë» U²†Ls]“,]3a ëmµ÷«kNYöd!¸|¹ fÆ$µRi>ŸŸÍ/ÎPMKçÕjµäÞ®—†('|º¯ªlõ{Uˆø¦ÈnÈã”UÊåËRöp²:ä;×T‚úÚkóë·+ÙŸSn ¶¾9Y=¶G» Heí•ÃüÍkAÞ¾ß÷ü õ l„I°~c– ½áÒõêMµr[Ú²¿à.LLžäórù@ÉÏ<2³<Ñ•«êÍa²¿ŸÎòÏ}u~q]Løp†óDeК19½¡`Œ(€É nT ÅttdSá\ÃFp é§1KN¹Œ`Ѷ«ò#Ìí¡ÜPËýÞ‰6Nª¢ð ê6˜’]¡W)_\—º#S*åëërQ©šøÈ'ØCn;¹ƒ]9rqqU­$º‰Æ`œëç«r¥`þýDŒG$i3Úf¨HpáË£@cKLM EËÍœ^I??Tzñ壤ž0¡ b†õK›…ÕŽ³— ú¦£‡ 4µ=(pôœ‡ïÑe×ë`å/ ê¸=Í¤ŠªÎSXQÔgŠ ÒŽŽ…u „ðú}‚KÓg ¨¶Âx&ÝLøc„IG%š3ÙOehR犜9°”6KÃ1äw‰æ=%3yUò°|½ÇG4-–˜TÁ½bóÞø?Ý“}6õ‘·Cö ?2ÞØ“-Ú‡wŸãÄ,­¾‚wH9"àŽw*8À„†8wjHA‹ÉÄñÍ |w ×›L%|˜á,°$ÁçE8˜ò" U‚6ªÍª~ ×V¦‘ÌÒÚ“oZHU½8¨\äf®/›\2µ J{¸"UŠªã=3Ìnµ‡˜ªp ç2޽‡Ä.²h,B)–>îî÷·0Ž™ÜÑìc?JÍ#P#X˜gÅ’ž$ î£\I±|Ò ìÙ½ Še.#W4âøJÚDä3s:S‰ Ú\iCu:Ä̤éÈÇ4ƒúÀ¤î…<¦ ˆž¼Rï“iôe˜ÕÕQS0ù¢ ݬ-&ÂTxeG )Ñ8 »)LAÒžv 34°Ç÷!%OOD+ô{JòÐG¢:[8ÿàƒ¯Îÿ¸Ýâì[NF›-ò$‚!ü…ŸÄXä'Ã2ª@Û,„ \j›þ–jÃ'K›Xú™›Ù“)MìÅ[ïažX–¥*Ôkƒ¢B—(Ж½}(Aye™ÖÿU0ñÝec÷«a¸îΧ’òwh0¡*Î?Õù×WQ¥°óÊ ÖÀ‚kÃe«UÁ6zñÛj$0…& _¦ Ó-JuŒXÎ¥n9Ñì&wE‡Hò”i¢"Œù :À_½Ôع|^Aük9‘öÉP²ÛQ¨ê‰|ÉÿBy?û  ¿w;xø"pÌÞ2ߎT¼õ¼kG F]*Þ°ÒVF´ŠJ2(ÉÄêòAt*3…Zò×/ý´ú’µjìIÍwØjÿ¶wMETA-INF/manifest.xmlµ•MnÂ0…÷=Eäm»eUE¤Vê èg,ùOöÁíë iK«‚ðζÆß{3™ŒçËÑÕCTζì™?± ­t²CË>Vïõ [.æ¬ê1Rs\Tùž§mËR°ƒ¨bcÁ`lH6ΣíœL-5_ã›QiñPÁ½ÒXçÀ°¯ÎbØ)¨iï±eà½V(û[ÛñƒŸJp±óíIV³ÉqŸ´®=Цe‚‰«<\¦¼9Û«!…ƒ·8‘€R\C(ƒ)QcÞº d aÌ<·¸V^; ,÷Î'Ÿ;#Â7Œå¾49§=XÔeðceŠz/WŒâU‘‹j\Éþ>¥b²ãÏÉ“âr*ð?WŠóOŒ£à"<ëÓm³bšTèúÇ_%ŽgPKå÷®cc-PK¦Bõ>^Æ2 ''mimetypePK¦Bõ>MConfigurations2/statusbar/PK¦Bõ>'…Configurations2/accelerator/current.xmlPK¦Bõ>ÌConfigurations2/floater/PK¦Bõ>Configurations2/popupmenu/PK¦Bõ>:Configurations2/progressbar/PK¦Bõ>tConfigurations2/toolpanel/PK¦Bõ>¬Configurations2/menubar/PK¦Bõ>âConfigurations2/toolbar/PK¦Bõ>Configurations2/images/Bitmaps/PK¦Bõ>ËÕž˜0` Ucontent.xmlPK¦Bõ>ß=<1ó manifest.rdfPK¦Bõ>žò2Óï2 ¬styles.xmlPK¦Bõ>ÇK3QBB·!meta.xmlPK¦Bõ>& \ëë&Thumbnails/thumbnail.pngPK¦Bõ>þ¬wH›! @-settings.xmlPK¦Bõ>å÷®cc-Â2META-INF/manifest.xmlPKph4sleepyhead-0.9.8/sleepyhead/docs/release_notes.html0000644000175000017500000002231212412506713022007 0ustar sergiosergio

SleepyHead v0.9.8 Testing

Release Notes

Greetings!

Here is a definitely new and improved SleepyHead build :)

Warning: This is a test build, not all features are complete or will work 100% as intended yet!

This is the first public test build in a while, so there is a lot of new stuff to take in.

First up, a warning: Some new stuff is going down that might break on you.. Overview overhead figures aren't completely finished yet. I know about these and am working on them. You will likely have to Rebuild CPAP data to get this to behave properly.. If you have to do it more than once, somethings not right, and I need to know.

Right clicky menu has tons of new stuff for you to play with... some of this you're hopefully going to love! :)

New Graph Clone ability allows you to make a temporary copy of a graph, and operate it completely independently... You can even take these graph clones with you to another day! They aren't saved though. they are gone when you close SleepyHead.

Y-Axis menu allows for better control of Y-Axis scaling, all of this has been improved greatly... no more having to go into preferences to set minimum/maximum values (that SleepyHead wasn't honouring properly anyway). Now you can adjust these settings live for each graph!

Line Cursor mode (F3 to toggles) is a very powerful new feature.. Play with it and see what it does. It's off by default because it takes a lot more CPU power to work.

Sleep Well, and good luck!

JediMark


New features & bug fixes in v0.9.8
  • Rework of Records box
  • Initial support for Philips Respironics System One Oximetery attachment
  • Removed old unused Mask Preferences and other junk
  • Complete Overview SummaryChart overhaul
  • Prescription changes now caches to disk to save having to reload all data every time
  • Implemented Demand loading for SleepyHead Summary data files

  • New features & bug fixes in v0.9.7
  • Experimental ResMed AirSense S10 import support
  • F&P Icon timestamp fix, thanks to Roy Stone for the patch!
  • New Feature: Create independant temporary Graph Clones, which you can explore seperately, even carry over to another day
  • Split events and waveforms up in preferences, and sorted by machine type
  • Removed the old graph tab in preferences, as it's no longer needed
  • Graph YAxis scaling can now be adjusted easily in the right click menu
  • New Feature: Added toggle-able linechart Event-flag overlays
  • New Feature: Added toggle-able Graph Plots when multiple plots present
  • New Feature: Added toggle-able Dotted lines for each graph for various purposes
  • New Feature: Added right-click popup menu in Y-Axis and title graph area
  • Support for importing from CMS50F and CMS50I via cable. Thanks François Revol and Michael Masterson for their amazing help!
  • Fix duplicate Ti/Te graphs on VPAP Adapt
  • New Graph: Time at Pressure
  • Less ugly code hardwiring and more automatic smarts, plus better channel color and name consistencies underneath.
  • Daily panel (left) Sidebar can be toggled on/off with F9
  • Calendar can now be toggled on/off with f10, your preferences will be kept
  • Fixed screenshot in non fullscreen on Windows & Linux.. now autohides the calendar and right sidebar.
  • Press Alt-B while selecting in daily view to quickly add a bookmark without having to zoom in
  • New Feature: Can now edit channel information, including names, colors, etc. in preferences
  • Tooltips showing relevenat information when hovering over events on daily charts
  • New Feature: Large Leak flagging where not present, using redline threshold
  • New Feature: Can switch off individual daily view linechart event overlays in a combo box down the bottom left
  • New Feature: Events are now visible on all daily charts in line cursor mode
  • Fix an issue that caused some burried PRS1 session data to not be imported
  • Fix a lot of pressure and pressure relief strings
  • New Feature: Added (very experimental) Weinmann SOMNOsoft2 Import importer
  • Fixed inverted CMS50 .spoR file pulse and spo2
  • Added CMS50i .spo2 file import support
  • New Feature: Added a Welcome page to make things a little friendlier
  • Fixes another issue that caused session dupplicates on ResMed machines
  • Improved support for Intellipap BiLevel machines
  • New Feature: Press Ctrl-L (Cmd-L on Mac) to switch on/off a "line cursor", and display current graph information above graphs while hovering over graphs
  • New Feature: Preference option to Realign machine detected codes and fix dodgy PRS1 durations using user event flagging.
  • New Feature: Added second set of User Flags detection and preferences.
  • New Feature: Hit Escape key to go back through previous graph selection history
  • New Feature: Hold Alt while selecting a graph area with the mouse, pauses till you release the key, to allow you to take another attempt.
  • Fixed changing languages clobbering graph settings
  • Import now remembers last place you imported from
  • Lock files are now used to help protect the same profiles being open multiple times
  • Fixed a rare PRS1 duplicate session issue affecting multi-chunk files
  • Fixed ResMed STR.edf DST crossover bug causing duplicate sessions
  • Added PRS1 SD Card automatic backup functionality
  • Stopped faulty statistics calculations where only summary data was present (For now it should show zero where calculations are impossible)
  • Added .spo2 file import support for firmware 3.7 CMS50F oximeters.
  • Some pre-v3.7 firmware CMS50 oximeter serial importer improvements
  • Fixed ResMed AutoSet minimum pressure not displaying correctly
  • Fix ResMed EPR setting display
  • Restore display of MaskPressureHi plots when available
  • Fix wiki URL's thanks to sourceForge forcing move of SleepyHead's wiki
  • Fix ResMed importer crashes, finished rewriting stage2 multithreading code
  • Made database upgrade/purge process a bit more friendly (Keep your backups switched on!)
  • Fixed a SleepyHead summary error that prevented count indexes from being stored properly
  • Some other minor fixed and stuff

  • New features & bugs fixes in v0.9.6
  • Threadsafety improvements to debug/logger
  • Multithreaded PRS1 and ResMed loader improvements
  • Minor user interface tweaks
  • Added ChoiceMMed MD300W1 Oximeter file import support
  • Graph Preferences min/max settings are now honoured correctly
  • Complete Rewrite of CMS50 Importer
  • Completely redesigned Oximetery with new Import Wizard
  • Improved data Purge and Reimport from backup abilities
  • Improved ResMed STR.edf summary import support
  • Several Fisher & Paykel Icon improvements (including automatic backup)
  • Switched from raw OpenGL to Qt QPainter wrapped backend
  • Switched to Qt's pixmap caching engine
  • Fix ResMed session grouping bug that caused session double-ups
  • Fix EDF importer glitch on windows builds that led to faulty graph displays
  • Fixed CPAP card autoscanner on Windows platform
  • Added timeout dialog to CPAP card autoscanner
  • Microsoft compiler fixes

  • New features & bugs fixes since v0.9.5
  • Added ability to pin graphs to keep them on screen
  • Fixed tranlation loading on Mac
  • Updated Dutch Tranlsations (Thanks Arie)
  • Fixed overview graph legends showing wrong details
  • F12 to Screenshot restored on Apple Mac platform
  • Added CSV importer for Somnopose iOS Sleep Position application data
  • Added user information to Statistics page
  • Datacard autodetection ability
  • Philips Respironics 60 series fixes

  • New features & bugs fixes since v0.9.3
  • Retina display fixes for Mac platform
  • Introduced yAxis Scaling modes
  • Cleaned up mouse handling underneath
  • Better ResMed SD card backups
  • New Profile selection screen
  • Fixed inconsistency with graph legend markers
  • Improved CMS50 Oximetry serial importing, including support for CMS50E & F models
  • The foundations of loadable translations for non-English speakers
  • Better Fisher & Paykel ICON support
  • Printing works on Mac OSX 10.8.x again
  • Support for the PRS1 Series 60, in large part due to a patch from Keary Griffin.
  • A bunch of small PRS1 fixes, especially for the AutoSV.
  • Added Flow Limit to the summary and overview screens. This can be a useful indicator in certain types of apnea.
  • Some 64-bit fixes, and some other bugfixes mainly useful to those building from source, especially on linux.
  • Fixed some issues with the prescription changes table with certain machines.
  • sleepyhead-0.9.8/sleepyhead/docs/tz.txt0000644000175000017500000000766112412506713017501 0ustar sergiosergioPacific/Midway=(GMT-11:00) Midway Island, Samoa America/Adak=(GMT-10:00) Hawaii-Aleutian Etc/GMT+10=(GMT-10:00) Hawaii Pacific/Marquesas=(GMT-09:30) Marquesas Islands Pacific/Gambier=(GMT-09:00) Gambier Islands America/Anchorage=(GMT-09:00) Alaska America/Ensenada=(GMT-08:00) Tijuana, Baja California Etc/GMT+8=(GMT-08:00) Pitcairn Islands America/Los_Angeles=(GMT-08:00) Pacific Time (US & Canada) America/Denver=(GMT-07:00) Mountain Time (US & Canada) America/Chihuahua=(GMT-07:00) Chihuahua, La Paz, Mazatlan America/Dawson_Creek=(GMT-07:00) Arizona America/Belize=(GMT-06:00) Saskatchewan, Central America America/Cancun=(GMT-06:00) Guadalajara, Mexico City, Monterrey Chile/EasterIsland=(GMT-06:00) Easter Island America/Chicago=(GMT-06:00) Central Time (US & Canada) America/New_York=(GMT-05:00) Eastern Time (US & Canada) America/Havana=(GMT-05:00) Cuba America/Bogota=(GMT-05:00) Bogota, Lima, Quito, Rio Branco America/Caracas=(GMT-04:30) Caracas America/Santiago=(GMT-04:00) Santiago America/La_Paz=(GMT-04:00) La Paz Atlantic/Stanley=(GMT-04:00) Faukland Islands America/Campo_Grande=(GMT-04:00) Brazil America/Goose_Bay=(GMT-04:00) Atlantic Time (Goose Bay) America/Glace_Bay=(GMT-04:00) Atlantic Time (Canada) America/St_Johns=(GMT-03:30) Newfoundland America/Araguaina=(GMT-03:00) UTC-3, America/Montevideo=(GMT-03:00) Montevideo America/Miquelon=(GMT-03:00) Miquelon, St. Pierre America/Godthab=(GMT-03:00) Greenland America/Argentina/Buenos_Aires=(GMT-03:00) Buenos Aires America/Sao_Paulo=(GMT-03:00) Brasilia America/Noronha=(GMT-02:00) Mid-Atlantic Atlantic/Cape_Verde=(GMT-01:00) Cape Verde Is. Atlantic/Azores=(GMT-01:00) Azores Europe/Belfast=(GMT) Greenwich Mean Time : Belfast Europe/Dublin=(GMT) Greenwich Mean Time : Dublin Europe/Lisbon=(GMT) Greenwich Mean Time : Lisbon Europe/London=(GMT) Greenwich Mean Time : London Africa/Abidjan=(GMT) Monrovia, Reykjavik Europe/Amsterdam=(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna Europe/Belgrade=(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague Europe/Brussels=(GMT+01:00) Brussels, Copenhagen, Madrid, Paris Africa/Algiers=(GMT+01:00) West Central Africa Africa/Windhoek=(GMT+01:00) Windhoek Asia/Beirut=(GMT+02:00) Beirut Africa/Cairo=(GMT+02:00) Cairo Asia/Gaza=(GMT+02:00) Gaza Africa/Blantyre=(GMT+02:00) Harare, Pretoria Asia/Jerusalem=(GMT+02:00) Jerusalem Europe/Minsk=(GMT+02:00) Minsk Asia/Damascus=(GMT+02:00) Syria Europe/Moscow=(GMT+03:00) Moscow, St. Petersburg, Volgograd Africa/Addis_Ababa=(GMT+03:00) Nairobi Asia/Tehran=(GMT+03:30) Tehran Asia/Dubai=(GMT+04:00) Abu Dhabi, Muscat Asia/Yerevan=(GMT+04:00) Yerevan Asia/Kabul=(GMT+04:30) Kabul Asia/Yekaterinburg=(GMT+05:00) Ekaterinburg Asia/Tashkent=(GMT+05:00) Tashkent Asia/Kolkata=(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi Asia/Katmandu=(GMT+05:45) Kathmandu Asia/Dhaka=(GMT+06:00) Astana, Dhaka Asia/Novosibirsk=(GMT+06:00) Novosibirsk Asia/Rangoon=(GMT+06:30) Yangon (Rangoon) Asia/Bangkok=(GMT+07:00) Bangkok, Hanoi, Jakarta Asia/Krasnoyarsk=(GMT+07:00) Krasnoyarsk Asia/Hong_Kong=(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi Asia/Irkutsk=(GMT+08:00) Irkutsk, Ulaan Bataar Australia/Perth=(GMT+08:00) Perth Australia/Eucla=(GMT+08:45) Eucla Asia/Tokyo=(GMT+09:00) Osaka, Sapporo, Tokyo Asia/Seoul=(GMT+09:00) Seoul Asia/Yakutsk=(GMT+09:00) Yakutsk Australia/Adelaide=(GMT+09:30) Adelaide Australia/Darwin=(GMT+09:30) Darwin Australia/Brisbane=(GMT+10:00) Brisbane Australia/Melbourne=(GMT+10:00) Melbourne Australia/Hobart=(GMT+10:00) Hobart Asia/Vladivostok=(GMT+10:00) Vladivostok Australia/Lord_Howe=(GMT+10:30) Lord Howe Island Etc/GMT-11=(GMT+11:00) Solomon Is., New Caledonia Asia/Magadan=(GMT+11:00) Magadan Pacific/Norfolk=(GMT+11:30) Norfolk Island Asia/Anadyr=(GMT+12:00) Anadyr, Kamchatka Pacific/Auckland=(GMT+12:00) Auckland, Wellington Etc/GMT-12=(GMT+12:00) Fiji, Kamchatka, Marshall Is. Pacific/Chatham=(GMT+12:45) Chatham Islands Pacific/Tongatapu=(GMT+13:00) Nuku Alofa Pacific/Kiritimati=(GMT+14:00) Kiritimati sleepyhead-0.9.8/sleepyhead/docs/sheep.svg0000644000175000017500000015512612412506713020130 0ustar sergiosergio image/svg+xml sleepyhead-0.9.8/sleepyhead/docs/startup_tips.txt0000644000175000017500000000022412412506713021571 0ustar sergiosergioYou can reorder graphs by clicking and dragging on the title bar. SleepyHead project started out in March 2011, initially written in Python script. sleepyhead-0.9.8/sleepyhead/docs/sheep.png0000644000175000017500000007313612412506713020115 0ustar sergiosergio‰PNG  IHDRÜÜZÏsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ/³6/É IDATxÚìwœTõ¹ÿßß3½nï…Ýe© R£ØÐh$‰Ä^ð&š`4j,1^£Éï^¢Ñ ‰5ÞD£WcÔÆŠb,”(*méË.°½MÙ©çûûcÎTf —$ó}½ÎÎÎi3sæ|æó<Ÿçù>R’™‘_ÍP2— 32#¸ÌÈŒ à2#32ãð†>s ŽÜBŒ®rµU> øx 0µ@1à¶I)Û3WîßèɈ&Ghc€KøkœèÇVàOÀÃðe—éfj€9ÀÙÀÉGà´Ý;þQcA«Æ‚;¤”¡ÌUÏîß d§W§Ùýíçt:9餓0 ´µµ±eËÚÛ“‰K¯×£ª*ªª¦;E(…%}ÀjàI॔jæÛø'RÊÌ2À”¯r°å¢‹.’.—Kº\.év»¥Çã‘G>ÿüó²®®NÞ~ûí²µµUúý~é÷ûåÚµkåYg%E‘C9?° ˜–ù^þy— à Ìj€75‘#u[ØívyäæÍ›Û–ú8Ðÿõõõüñ¸\®¡¼-p‘”ò…Ì7ôÏ72aþÁV ¼–6‹ÅÂ’%KX»v-mmm´´´°~ýzöîÝË™gž3UUEJ™ô8Ðÿ£GæÓO?¥®®Žû￟––B¡{÷îå¶Ûn£¸8 ïfài!ĉ™o)ãÃý+îy`aôùÌ™3y饗ÐétI,—޵†Ãn‰ÿ´î®»îâî»ï&áûÚ LÌ*Àý«˜’_DŸO›6¿þõ¯ýj(à hƒ=BðÐCñƒü ñ­n>Þ^Ê„2€ûgÜÏ[ Û¶mÃh4Æ€ðe±ÛP@7aÂêëëûóíîRöf¾ÅŒ÷Ï6'óN8á„$¿?ÿ,uh[û¤{žºîºë®ëﭛ“2ßäÑ92©])Àb"Ù"ˆ&L˜€ªªIªdL&¥LzL·-º>ñyâÿé¶'®;çœsxá…˜4i@€uëÖ±aÃÂápô-—/ !¾-¥\Ÿùv3€;ÚÀV ü˜‘n{___ pQ¥k €õ¬Ts1`ý­ËÍÍåoû[Ò9ü~?çž{.o¼ñFômWë„«‰(­ÖJ)™[>cRþ_‚­X“lBt:mmmC2!ûÛ>”°@æcºué¶›L&V¬XÁ7Þ˜ú1N~®‰*„w !Ì™Û>#šü_€Í¨Ýˆ1°•••±lÙ2¦OŸÞß1C~<ÒbÉP¶ !8öØcÙ¸qã@}p®”rCæöÏî«ܵÀ¯£ÏçÏŸÏý÷ßOêõˆ>Ow† 8 ®tû­]»–Ë.»Œ±cÇâv»©¯¯§¹¹9õ­wS¥”»2Èî«b·´,’ã?žgžyæ `¥[nn¸ *øÒ-›7ofÞ¼yìÝ»7ñ-¿+¥<% ྠÀ ¬ŠÞÄŸþ9YYYi™m¨ÀKÜv8æäPÀu¨à›3g«W¯Nü˜§H)ßÍÀ £R~Ù#g«¬¬$77÷ 0¥Êó©àêO­L·ß@jejdê{éoûpÆ;ï¼Cii)­­­ÑU×À}…ãßU¥,IœEQP%éÿÄ%º~¨ÛAz( åP•Êá.÷Ýw_âu˜'„¨ÌÀ ¸/{ĤqÇÓ/Øú×`Lp”ÅRAw(ÀKÜg8@Œ·páÂD†T€ë20Ș”_öˆ%&ïܹEQ’LÇþÌÊþÌËLËÔÿ“&#bRögNF—Ä€ü`#ºoôÇ !3åûÚT¤I)›3È0Ü‘Lf3£Ï{zzxóÍ7d¨Ca·Î‘´˜-HÕ”Œ SV#‘´¶÷…ùHdTÊØœKd~[yê>6›>úˆ²²²´Jä@ eje:vKeºÔmG"0”¥©©‰‹.ºˆuëÖ¥‚ïcà„Ì» àhÙÀÕÀ÷€A…“ÉÄÿüÏÿðõ¯=-Èvoûœ—ÿ÷÷„‚A–Þ~BQ héÌËþ€w¤Á—È®B¶lÙÂ7¾ñ ÚÚÚ/Ť”Ë2ÐÈn¨@«!"w_ ØÓl'??Ÿ±cÇbµZùàƒp»Ý!0tÌ?}ÇÏžMVví­-üã“õ|´n#»÷uÆÎ1¡¶˜³ÎœCQq)^¯›¶ÖÚÛ;p:ÌúÚ‰|}þ%Ãb·¡/— ÔçC]êêêØ³gOôãùˆÌ$ß‘Gp­–H¢î‚t¾iee%çŸ>—]v‡;3•+W2jd5w}÷4² ùó?xcÍ.ú|Á¤có³,Ì;¡–)£ xC|¾æý]ºÓÏÒnfÒô“q÷vÒÜ´¿ÏKmÝ4Ìû bJ*k~ °bÅ –-[Æ?þñÔð!p†”ÒHp©@Ëî®!¥ª±‚iÓ¦q×]w1vìXÞ|óMn½õVººº¸â;s¹þÜZŒz2",„Ãaê÷´ÓÙÛ‡^'(ʵ2¢Ä‰ˆA©â †hítãñ …ÃHUr ÃÍŸßÝÉûŸH ÆÂ Ïüá÷Œ?ö„AÙ.uûPÍËÁX. ñç?ÿ™_ýêWýÍOdºß?Î/¸h>䵨’ ³êt:æÏŸÏwÜÓé"²ø¯~õ+zè!ÊËJ¹jÁt&t0¾ºD Q¹íFWÕÈzUEBªI “Hªv\ü±µÓÃê ûÙ} ¯/DŽÝÀ'Û;Y·µÚŠžxâIFM˜9 I9ðeñù|<óÌ3,_¾œ¦¦¦á\êÀ7¥”{3pù7œbð06•ÑæÌ™Ãý÷ßÝwß\.K—.eÕªUœxÂñ|±q]]ÝœuâX~uÓ¼8h Ævh€Š+ZÈ3tR°*R•€v¬ ƒª­×ö_³¹…Û·¶?§L¯eáÂs™{Þ Ó°À7ðY®··—'Ÿ|’Ç{ŒŽŽŽC½ä[)RJ_2ÿF€Ó&OÞܘê§M˜0x€êêê¤c¸ôÒKihhàÞ{ïeòäɼöÚküúב™9V³¾^ÉSUí†:í9ª¶?á8˜UIÇDzg7óêÇM„Â’ª'ÏüéYªÇLnEèA×ÞÞΣ>ÊþðÜîáY„ùùù±iÓ¦ÄÕ÷I)oÈ@æßpý±Znn.>ø ÇwÜAÇìܹ“ .¸€ÎÎN¤”Ü}÷ÝìÝ»—Õ«WS__Íbdù­ó9ijMhdÃŦj¬£¦€.Phæglÿ¨9ª"Õ8ј°£·_<³™××à´Y£ùãK«‡dV¼ÆÆFyäžþyáUT°Ûí,]º”ë®»»ÝÎ 'œÀ'Ÿ|ÝìJ2Áþ '„¸¸'‘ÕEáâ‹/æ'?ùIzhëV.¼ðBº»»c7¦Óé$ áõzWSį|#+òb“H„ŒîýOwó»ÿÁºÍM‚aŠóìœ6³škΙB~Ž¡F˜/î¿%€O¦3-5æ#"²„Õ0×=¸žuõ¬zóFŽ›>$€¥f¡Ô××óÛßþ–•+W&¦m iF.»ì2~ô£QPP3K{{{©¬¬$ŠÅÁ¯R>‘Í¿(à„¹À€¹‰ëkkkyòÉ')++;è)%ëׯçšk®Áår%Þ,Ø,FþãüÙ\¹pfƒN3ûâæ"DÒ§þëÉUìèr°téRX¶l 8¬F¾ą̊+5aBµÓRJ p‘J)Ãt»üœ÷Ÿb4èùÕ/Î gœ?,†[¿~=?ü0«V­:”ëË‚ ¸õÖ[©®®NkšžsÎ9¼õÖ[ÑC–R~/›Cú£lÓ€ç‰T Šýß~ûí,^¼8¶_0äã?fíÚµ|öÙg|öÙg¸\.l6ªÿ¥Ï˲±hÞ4.={&ù9¶¸É(d $B¤ªòôÊOyêÕÏY±b ìÙ³'i‚ªË`ɽ¯ñ—ÿ>—ªgTD®"–y.$B $„¤B¶ÝÄòïËeÿµ–s/ºŽºš»8cÎñÌ<î$¦|íë8s ÒíwÞᡇbíÚµ‡t}O:é$î¸ã&Mš””­(É!ÌiÓ¦%nt2ÿ‚€B\ü†„¸Ú¸qãxúé§ÉÎÎÆårñÆoðöÛo³zõj¼^oTy¹L›RǤ1•ÔU9yú¥ÕŒ­.âÄ飘uL‰HÿhÌ*BD@â „¹ïÞ' ñæ›oÒØØÈÆùâ‹/’Þ£×äíu \qö1T@DÀ„ˆ€MˆÈ© E{=D˜BQåþtÛLžüÛvpóèÓ+¸ïw/#¬úÛ Œ=f6áp˜W_}•åË—§ C'Nä¶ÛnãÄOŒ-d©À®yšÿd€BÜÜšè«Ýxã,Y²„uëÖñ /°råJ¼^/‹…YÓ'sʬ±œ4¥‚š{Ô®àÌãFÅâk‘›]DÀy%Õ@JT„à“MMô¸#ê÷ý÷ߢ(ø|éÕð¹ÇÒðe-RžPB© ED@Ib95¤ë:bÄn¼ñF¾õ­oŦ#õ²ÄukÖ¬IœÈ~ ¸ æoÙl<ýôÓìÞ½›‡~˜íÛ·£ÓéøÚÌcùö7¦3wf³ŽUìÑÅ3>d<¸!75¦B¢™”HÉÖN_ò\ÿ€ï·´ÀÁ{^¬IâÂI8²N‡â¾\¢b÷÷„vœTU:zý|ëÎ5å:èSÍé*o iäååqíµ×rá…Æú# ”™’ø¼¯¯ªªªD?ø)å}Øü“1œž˜.¤‰#/³£ëjjjX¼x1×]wäæä°ôêó¸è̉åšã b¸¡™Ž€P5†“HEc;)Bj13@HJ ³xü?¿ÃUw>cºtÃj6DX U3PEDáŒM@Ma9TªÆr jÿƒ@hì‹ôxC<÷Þ>ÂaÉîý‡F*V«•+¯¼’+®¸›ÍÖ¯Ÿ6I¹páÂTÑéÕ dŽR†Ó*c¥`$ðð)‘Œþ·ñÑêêêl߾ʊr®^tçÏ©ÅbÖk7rÔÿš”rÑÏEˆ™–ɬFäFWã,'¥J{§›?¾ºŽ]Mìkía_kmnÂjä¼f£žÏž½Eh*§ª¦ „cñ¸bQ'£s!#꥔*-]žz}~¾À¡ùNz½žE‹ñý¼¼Ø¤Õ¨*9PÎet”’óÎ;÷ß?ñÔ/H)¿ÌQ¸Ä2tý ¶ü/0/Q‰,..¦¹¹™Üœ®»ül.9sFƒˆ(Q ÉÈÿ" :ÒX•‰¦dlB˜&”HU33µ”,ÔhV‰ñéRbl=në6îåµ÷ëYñ÷zþ¶ü"*Šñà¶TµØ\ÜTŒ„ ¢æ¥fFj¦&2 ¨ìÞï≕;xõã}„ÂòP¯9óæÍcÉ’%úúú°Z­ÔÖÖb³Ù*ë0й¹sç¦ÍÛ‰ŽÍäS¥€;x‘H±Õw€V`PŒÓvëÑØM—xÓ!¸æ’|wá1dÙLZ–¼V’­–ÐLÉDvp±Ä䛉XÌMÕ\:5-èâ~U,Ô0‰×ë‹0®T‘Ú:T5‰ÑbLb95ÐM»;ùÝ_ëyû“fÔÃøŽ?þxN9åÞxã Ö¯_c4ˆ$rO:•‹/¾˜3Î8cH3 ÆŽ›Øo\ÆdæÇ}ù€[ ùUáa‚ÍNdªÌO F£Á 7½^³gÏFJIŸ·iÓf0~ôX‚¡Uµ5|öÙ'¼ôòËìØ¾ñãÆðý gSàÐqÌØŠˆœ.tš»#(1“Rhòº”"å}ÈX j^ÆLFUc;5?3çÖâmß]Œ‰ÔDA$QÜPc)^1%/Sb楪ÆÄ“µ›šyô¯[øhcëa}y&ƒB8,™6u2¯û”üü|Î<óLFEnn.íííìØ±ƒ×^{ŽŽjkk¹ùæ›9å”SÝM7Ý«D 4K)K2Pùò§.Ø÷àÇz½^žxÒ)æÂÂ"ý˜qcÉÎuâ´YQ%Uà XóѼûúë¨R²{÷n ò²éíéBJÉSÿï &­ÐÀ—ÐÌÉ㌱àÁ ¥Ô@©Æü¶hfId[XD†Õ Ið¹d4“$1]KVÔT$€B dVªá0«þ±—G_ÞÌç;;ëK+Í5ñsK(ÈÒñïW_}?üá èõú˜µ} …B¬X±‚{ï½—¶¶6-ZÄ-·Ü‚ÕjM º 6pÖYg%2œ-3SàËW)'â™ èÍfˇÃYSXXÌ„ñc™vì¼^xéÕ?óÎÛïð³ŸÝËŒ)“É6ÚÑô¬Y¿†÷ß§ÍBGg}þ`lÓ ¡D€&"PŠùv Ф$ñ¹$š‚)P‘B)‚Rê@ ƒ B‰ÄƤGÔËX–HäQDãkH-î&¤PTI‰Ñ¸œBK^}'½²‘ûzëËʲé¹òôRÎ. ³7À’åÛ°™ôÜùŸ÷p΂s5 Z¦RÎ>ûl¾þõ¯ó“Ÿü„§Ÿ~š;vð»ßý«Õzb9yòäÄÃ"M*3ÍÒ°€ ¨ eåÛ*+«FΘ>œ¬\>Þ´“×?ZÁ×CŸÇËß^ýŽòrDU%jFá,,¢¨´”ŸNÇÌcF%€-Êj"Á¯#&¿ìÆ%VÙŠÈÿˆhB‰Nˆp$ø-´´,¡±_ÔdU‰É÷QUTHV,OK Ôè:Ïà…·ëyü¯_°¿íð&L› žRÆ%§•`5F~,þóÙZºüá±eL?i~Âg=¸{b¨à—¿ü%ãÆãž{îáúë¯ç¡‡бb"èRŽ­Êîè\ì¼¹ùe-m-úƽ{pKÁÿ¾ÿ1íÍX¥§æ¯o¾®¨„N“žwÖoàØÒ ƌϋ.dùƒò›gßã{ß9E»¡•H¨LQ@OD4•JhâcT@ÑØG3,c±2!ˆÌqK`-„ŒMh±±ˆÈ"4>Ó-ãÒzäh¯­FÝIàòùãÊÏùŸ_ÐÑÓwXQ§æ_Ì’3+ÉwbAñëÚYSßËWÅÌSô ²Ô#ÑçW^y%V«•Ûn»›nº‰eË–%Åâ¢Ó™FF09ÊW¢9¥FE¡¹µö‚{_#v%D–ÍŒ!(ÃXÈÃŽÖV¼Þ>Ž+)¡ °‹ÕÊ/_A]m §Ìª‹MDÊl¢ì–ÀoBc8HŽhPE‰ƒNQµà·Æ‡2ˆŽ°f8‰0£@¤oÉØëJ¡ÐÖéâÉW>ᙿmÄí=üξ§[È÷ÎɈBS,Ô€„  ½ºE6®¹iY’¿–:Ò#Šþ¿hÑ"\.?ÿùÏ©©©á{ß‹Oøío›x5¸£pç“u:]ŸÃauõ:ú!D›I•¥Ìš1¼ü™xŠW3E„ŽÜ8¢¥Î5…r< ***Ú¦Í8Îjufc1šÈ²[(,-¤ªªšºQuÔÖÔ2¢¼‚é'áS‚xú\B »<¶íÛOaE‹]Dw¯‡[þûYÍ·Š2[ÄBA(:-…*y!¶MóÛcÇÈþQs1ŠŸ„ìe8Ïö'®„ ÛÚ¹~ÙJN]òO¯üì°ÁV[æ`ù¦óÄM3™T“Ýï~z·™ü,g_xÝ€½ã¢©ýR+Hß{l5Šþð‡¼öÚkœtÒIøý± Ïߪƒ^¯Ÿ&_õ {¹ôÒ+ÈË2ððS/—íäšÅs5ß, ¶è/¸Ö¤”‘mj8nr ´ wÔq“ ‚D|ƒaž}¿ùÓ»ìnj?"F§æŸ4’kL¤0×›9ÆNšªþ ÊÆ=nΘ=EÑ ´Ö§«èl·Û¹âŠ+xä‘G¢»ÍBŒ•RnÍÀäè5)ï(¯¨Äh4¢St¨á0û÷ï#+;RD§ÓÑÛÓ‹Ãá ;;›ÍÆþ¶ªŠŠ9mÆqôvw`T$}=.|:ÁšmÛñ#¨9‘Úª2–=ú{÷·i‚GÔlŠ!1³’J( ™' >YÌï“1SÓëðès«ùÚ÷rÓ¿pÄÀvê´J^þ¯oñ³«¿FQ®u¸JØÔà"R™5kfZQd¨ædjÃÇÄåÇ?þqb]3ðX"G)à„õz=5#kÉÊÎÆd2¡JI^^>ŠP0›Í„Ãa***°Z­äää››K–ÓA˾ý|ã„“qèô\Ý Ó…ÄãóÙç›)(«ÄæÌæ˜q5,¼æ‘d8zb ¦@€¢Ó>šHpÅâ1¶T«­»×Ã/_Éô?å?—¿Ls{Ϲ&ÇŽ)â™»çñÐNedyvÂ<¾á­e~úqs†Õ'ݺFŠp2[k`™Gà´"­W”””PUQ‰×롪º ¿ßÝfÃl4M(öùú0™ŒX­fJŠó©Y‹/ ?7‡3¾v]ím(„ép» ™õlÚ¾GV—^qßœ{:ûZ:™5ÿ†tºÂ0nhAs[7?}ঞs;¿|â5º{½G䢎,Ïá7·|ƒgï9›©c‹È9ë›<õ ã§œ8l¡d }SYnÉ’%Iù•™°ÀÑÉp—z!#GÖâõû@•c0@•جV‚Áf“žò²b¤Bj¡ŠŠ ()+£§½ƒs¾~YYv\®v„ÛM«¯·³aëV¾÷Ýk1ÚK3r ûZùã‹ïÄE’ĨѪÇÑdfA|¶’Ý-üðg¿gÆ‚ÛxôÙwðöŽÈE(ʳsï÷æðêpêôª~C;÷þ5eYMæAÖŸ9™æ‡2íúK.¹$ñé‚L+â£pZ§Ñó!Rôçk3§ÑÝÕMII)ápˆŽŽÊÊʃôú˜Ão³ÙÉË/ˆ§jD½žl“…+ΚOoW;„ý´uváÓÙÒÐÈãÏ=Çõ7þˆºIS0 üâáç“缩áÈ-îù ‘Ÿ×ïáª[æø…·ñÌ+'<2u6?ºd6oýæb¾}ÚxtŠèO><´ÐÜé§²´`HþÛP[[¥Š(ÑeéÒ¥ètºD_îæ Tކ»­]TVV6ãFDUUJKKðx< 1›Ì 99‘, ³ÙDQQpùÙ”•–ôù8yê4FV–áuu#!š{\¸€ Û#ýÌž}îy&M¬£¥­‹§^xC›¥­ÍQ#Þ8#Êj¬ÛÌùßû/N[t'¯¼µU=2³ÜW-˜Î»]Á’s§c1é5¶%©†ÊðñŸîƒ”¨Z{ü”—RÜm0ð¥“ÉÄÌ™3W]+„xOñ¼â<­ÂZf|Õ€Ó.|Ì™:qæ\>»ÝN^^.mm­d9íô:ô:…>¯/ædåädÇÀÐÖÖΈåX6ÌF ‹Ï< Ÿ·}¨.· _X¡¥­›‡~ÿ--ÍÜ÷«‡XöÈ‹lؼHž­Ê0[µŽ¹—ÜÉü«îaÕG_¹‹& ¿>‘·»Š[.?‰l»ùÐmÅD“éY°³7@0$)Y × IDAT//¶99T±$•ån½õÖÄÍfàD`!ð°]ñ}!D®â[Bˆ_ !þª-¿B,È€2ý8Ü8Ü@qTî¿ä¼Sit›±Ûí¨ªŠMs¾ssrðûü”SRRÔO¼(Â~Å%Å45íãÄIÓøSi)û[:q­tvõ’[RÄg {ø^Q1EEÅüê—¿bé Kùýóorÿ¸*@VU^|í|ò¯lÝÑxÄ/ØœµÜtÙÉŒ‘ï@|6¹FmO%ÔÅŒú”BFò沈‰ÙÜ™l]9bäA¦`q·|´tû¦Ž &MwwÚ2}•ÀÚ’n\ ´ !n–Rþ>áÚÌ'2¿®•Hq¢w¥”À m\ýgÆÄŒŽ ü½Øl6‡¯/2?¬½½‚‚‚¤åççP[[Ckg;UÇY³çðëÿý!Ÿ›vÅHN¨“ËÏûk>æ„™³ÈÊÉ%???¾¸ŠÙÓÆÑãöòÐS+Ø»¯íˆ_¨cÆ”ñã«NcÖ„ŠX#Ž#?d‚yZ»#¢ÎˆÚ±ý)ø†R *Q­<èÇeÎ^|ñE,XÀ„ ؾ};+W®¤§gHa“BàI!Ä©DzD|Sûv¦ìçB<ÜõïPÆáMJ!ı@l.þ¥—ÍcÅö¬Û¼¢Ãï÷ ‡#b‰Á@  °¨ ^Ž`Ŭ¼¬ÐÏ7O8™1UÕø<Ý•ÝøaþòÖÛŒ?–¥K¯Çl6òûçæ{ÄÁVSžÏ#?½€—}%³&ŽÐü+í3DA!4Q‘È^"ÆtB& §D‰È¨)úG·;¡•êqÃŽ» ÇwK5+oºé& ÙÙÙ\wÝu<øàƒ¬Y³†ÓN;-é¸Ù³gsà 7pë­·röÙgG”éøXL¤ÕÕiÀ`nV !ŠÿÕw8 wnôŸqãÆñY0ŸWV¿E¹T˜9n"û÷í§|DRU1™LƒAÐÖÖAaáÀ*seY9]í]ø¼>.ž{.O¿ö2³&Lbýþ&ö†Ü„›CÜ÷‡gøáE‹xáùgÙ¾ýÈΑ,ÈupÃ¥§òí3¦ WˆŠj!É AH*PDÔb룡‰Ø:‘,‘ÄJ°Gf:DúÕE^¡³7Âpù%•iYl \É¡°[Ç3}útÞ}÷]ìv;¡Pˆüü|üqæÎËxâ‰'8î¸ã’Žß½{7—]v[¶l9èœYYYŒ=ÇÃÎ;§ÍÖ!¾)¥Ü˜a¸ƒÇBƒ^Oõ”±¼ôÖ‡øšÛqZ­èt:hfÿþ8³²èîî&?/›ÍŠÁ04Œ×ÕÃírq⬩ÔÍ:Ž.ƒ ½ÉL§ÛCnV.»wEzµµµwrᢋ9䎔a·™¹ñò¯óþo`Ñ7§¡W"Ócds© Õœ#„``…ò0¦t¹ƒXL:ôzð„’¡2Û@þÞ©§žÊ®]»Øµk&“ «ÕŠÕjå?øA lz½ž¬¬,²²²0›ÍTWWóÌ3ÏàtÆ Íf³±lÙ2¾øâ ^yåÞ~ûm>ù䮸âŠTßð!ÄÕBˆ¹BˆÊ à"_Îx´^aÖœlvuwãvu¢ÓÍl¥×åBo2••E  ¤¤¡<ž¾$er@êÕë5j$¥Å”ŒÏ;;7ÑäîÅ6ÒâucðØžfÞ7Ï ¨°„›‰8 Ì :®\x<}ß_<«ÙùÕÖ¤ùX;âsrè‚ ñ˜a œ‘}E”ÜD"ÆÏÕé `·ÙœL®ÁÌÊDsà­·ÞBÁ`Àh4rÎ9ç0{ölÌf36›-VxÈl6c2™(--å¼óÎ#*¨=óÌ3,^¼³ÙŒÅbÁb±——ÇÝwßÍõ×_ŸøœÀ#À  A±Iq©ˆÖÒø7e¸ùQyÜ’“M'ˆN†1°éôzÜE¡¨¸€¾¾> =Íöhii9h]EU%{›ö±­~íûióxñI:ÕѨÐÝÚÊ?Ö¯¡ËçaÒ´YèúÉ¢̬ZpúTVÿá&îüÞ^á¿+àN0 dåe ‡Ñ!0ª FƒÞž¤”´··át:±Ùlètú¤@7Ô™¥°°0íÍàõ{¨ßµ Å`À”>f1®¼Š}û0uÚL¾ÍlÖl&Œ…Ãfú‡˜1†¿ýîz¼íÊ‹s´j]š_•ÊnÑ ËÄ›ƒD}2¡+ŠÉñ$0X¢ÿ6 `’^¡€ÇÂa3§-£0f`éÖK)Q…iÓ¦±nݺ¤m:®ßóDMH§Ó‰ÅbaäÈ‘Øív,KÒëèt:ìv;&“‰7Þxƒ%K–Ĭ›ÄÒ}Ú8x_áüwÜd½É„ÉfŽC ©˜„‚"! †().Äl6â÷‡ðûB}AÑúõímmýÞ µ#«Ð‡Ã(áH±„6¿—]x=nŠËK¹ûΟ°më6òòòøñ-·qÚ Çúæ'©àø.O/»šºÚÒ„ªÌ‘ç1¶QÓ±q &X¨ÑL—Tÿ-ÚÀƒR“DI)ñU6ËWÂlé˜nêÔ©ìÚµ‹ööö!ù~Ñs[,œN'v»=U¹L®Ãá ''‡;3?ü={öÐÐÐÀ믿ÎÙgŸ¸ûhà)!„^q²â‡Bˆÿ'„¸[q±¢ü_pš#[`±Ù CäÞ «dÛm  &…E”” ùhi9€Ë•\øéÀäääàp8xóÍìj<8þ9¢¨ˆïÌžÚçGgPñ©’U{hhm¦('¯_ò÷>bdMî¾e5èté?Öˆ²|~s×%¬xì7edrIóhÙóh+-s¥?vCʤ%ÞìQëJ—jz&™“êý7‰Äí £×+‡%Œ ´~Ð_W­óÚµk‡|ŽÁΛ¸]QG¬ÛÁ`@¯×3qâD~øan¾ùæTw¦‹Hw¦_7·iæÙ „xYQó¯Äp1 ‰tz £SÂáV‹@ ˆªªäææÐ×`ãÆÍ´´4SZV;ÛíN2Lf3°]»»Ò¾à¢3N§®°°×‹QÑÑäêå“Møú|”WWR¿­½Âj€+®¹ž¹s’òÉϱsÏòÞoæ[§LÒ,85¡Oœ¶¤öTj;¥ÌDQ“Pã!W'…¦b&úiš“ƒøo}þ0N»mX©Z‡°ÔÁ¨Q£b}Åt=B`4±Ûí8ìv;N§EQ¸îºë8öØ$ËÅ>Àýü-àBˆãþU7)§ÉqRh³!‚A,:#ÕeU|~^φ _°}Ûn&OžDaANì==®X¦I[[$P}Æé5 Ó¾`UY ?üÎ"ì¾ „U‚ŠžOìgw{ 9+¹9Ùlܲ•E‹.äó[¹ëgÿœ,Ó&TñÁs·qéü¯¡×) mª"L– ¶ø£LR5ß, »É»iyœI9¸9‰: ÿ_@—òƒa3Ûp º¼¼<²²²Øºuëa±ÚP÷IÜ7*Êœ{î¹)ª²ÓN;%K–pñÅS]]¸9øËÑ8­èPW35&ÔrÞÜoP•—È‚|¦;!@¯(lݸ™ÎövNs “&ÖÅn>ÐJiiñA‰^§#Çiäö§}Ñ‹æÅÂÙ§ryÐÚB~>ܳP]VISS+Ï>ÿgÜ}.<…¥KSV”CÃþ:;]ÚŽ5C”RZØ¢=¹SMÉ(˜dì±v‹wßiX,­9©'ÿ‘z&HúÁ ÆlGcÆŒ¡¾¾þˆ€y –KF£EQ˜:u*K–,aÑ¢Eœ~úé¬^½š'Ÿ|’Ûo¿{U«VqÏ=÷$N+*þ$„°M€;”L“دƈŠF׌åô½x\nœ6#>Ÿ§³’ìì**J©®;Ðãî#Ä.lsssRNeee!ï¿WßïóƒK.fÇþFÞÛ³řŖ®VVnÛJnV{ººhüðCž}ô·Züèx^{ó]ÖnØÆ/[Éò;Å}­X«á3™lÑ6T"fjj¾v\¤ƒj"»%ˆ, ¬¦š;íQ7'EÂ{вk”ütz]ÚÌþr!Sy ö¼?Ó2zþ‘#GòÚk¯¥ý^¾¤¦ž±óÚl6&OžÌĉ“Þ—Á`ˆÅÿ|>]t>Ÿ»ï¾;zšÓ€×µì•ÞV†Ë:º#kkiïñ²«±{v6(aBáF£›ÍŠÝj#''+v`gg7§#ö<'ùrùvjFæ¥6r‰#GrËÅ—PçÌÇàòÒ£y}÷^Y¿ží]]tU~ùpp›6naî7ç¡JÉÇvióåÂpD-ª‘F‰qE2l2¦JÆÃjÜä”ñ ®éÙMÆ$ÿèˆgª$›¦)æd” O›Å2lÓñPnòþFQQÝÝÝôõõ–¯v(ï5>°Z­±@{4ä`41 Øl÷òË/§¤$©äl-†—ûÏ ¸Â¨]éÜÌ–vÂBO®#EÕô‡c´nwD£ñ_|5ÀP(DVVVšÓ‡Xõö¦~_ü'žÄKoà;Óf’åîu“a”4Xùdk„!ë&Œãk'Ïã‡ß]LKG/_»àÿ%™t‘i5áXkádE2>í&ÒH#^Ò.fJªqÑE Än >™ÔZÇüAW'E´;k’9)c]{R3׎„™8œ?j‰ôöö~)l6”÷d00™LiC Š¢`±XÐétÌ™3'Ð÷þÑ*v(€Ë(+-‹˜…­mdÙÌdÛ¬ƒaÂá0@€pXM2¥”ñL®®®Ä’lqé~DèZšûï:ªª’[®¼šåKodRv6'Î,tw@Çm?ÿo½õ§z2ÇL=‘ü]næ.y(¡×¶ÖzXMízª 6ÍtLj7,ý¹?¯?vKðç¢þbb-–¸:©&¤Œõ¯.€†;ŠŠŠ’b§_åktþÄõƒƒÁÀÏþs>þøc-Z”¸}<‘äèYÿl€ ¦*¢ õô¹ÈsÚÈÎÉÂÕ×G0& b4ÉÎŽ3˜Çã%??.ƒéÉœ%%YìÞíê÷µ+++À´€¹§œH³·‡î¾^|áÍû:Üì>Ð ÀÅ—_ÅÅ.$¬J´õàñú4á$‹­EË3ô 6Ñ©¦dd¿xP<‘Éúc·„L•±$òC@’: M(‚ƒâ˜C‘óä°Ùl1†;Òjä‘<‡ÕjÅh4RZZÊ/~ñ nºé¦ÄÍÅÀ{Bˆkÿ™2 ”k ŠÝlÁb1ÑÝ݃A+k4PâŠÁ`0É_Kl˜:²³­tô¸|f“‰ýÛwòÍÇ3¢¸€-Û7¡Í]=ôx|lÞ²ƒÖÖ6{òIìyèt:Ü^??ZöR¼ªWÛ%$ fdÜœÔü½¨X"SR¼Rãn ÂnIÉÏœô¬Æ S)±šux}þƒæ« ;œÙÞÎív`¾lLº7ÌæXÿòï~÷»Œ3&Iø~-„xN›~ôNq¯ª*n_þöqF+6‡¡˜èéhǨÓa¶DÊ,è2>B¡p’9™Èv©£¼,Ÿ¢" {÷ö_ÏÄÈjŠÊ*èéìâŠó/ ßi'àéEJ•†®.:\nž~æ9r²””–qÆé§b³˜øû'»ÔÇDRMðÇ4°‰t`“ &h²š)dÂþ1“‘Ù-!Øž$–$0©Ý¬Ãç $)“ýUUîOÅÊ€&“éˆúp‡Àá£×ë±Z­(ŠÂÝwßÍâÅ‹c™MÚ8HvÊÑ8!„][În‚Å…Eœ0ûDtвsp8X¬6tŠ‚*ÃÁØ4Œè°XÌI±·4É©I£´4‡Á óÔŒ¬¡×í¢²°ˆKçŸKWwÕGwŸ‡FO/ ûöî †˜}âiŒ=Ÿ?È•?}.Iò—R°Zô¹ªUK[BH m|î S’X0œ„`{ì–Â8ûFü@§UŸ–á†Âtýi¸>aT¨ˆ2Ü‘Ìpçé åut:V«•Y³fqÏ=÷°zõjÎ8ãŒÄ]hSÍŽÀi”û_Àñ`¦¢×›jæœ@·ÍˆÕ¬G öðû1›MØv„Útz}üôv»-ÁOËô•åQYY6à>Å%Å”¨ ã@+‹¾ñMFãíé@‚NW ==lر“ÜÜ<!8íÌoQR”ËÎÆv›»ÔI5ɇ‹šBªqБ 6Í %QùL0¥»EÕLéb7™â'"%‹¯×ßo·ÁÂC×pý¿#á/I R°ÙlFœN'Ë—/ç˜cŽIÜåú£pBˆ*`9ðBˆï#q¢â˜)¢hÌxIúÜ}øì–ȲÚ"¹”áp«ÕÚ/‹õ§tʘ4qªT ü\ô­ùÈ€‹tŠŽ®@_Üùú‚ z=g>Ç?›½Í=¼úÞæ¸â¨‰(1Sãjd<¿2l‰ HGl¦@Ô”Tã~œLI ˆÝª¤¡­7>é@§|P<,1@×t¥ÌKº}RoúpxøE“†ÚùK¿É“ÉÞµ×&i&‹¿Ê0}?`› ,fêF”Ò"¬V%¿¬”¹óÎÇ”ÖR˜_ùaüõA|}}ø|>, V«•ÞÞ^>ýôST5̨ڑ̓ëoªFâhok'¿`hס¬¢ŒÆ¦FæŸþ þ¾áS¶4ìÁj¶J¾yù5ìhÜǸÒö·`ÉŠÈÛ¿åÌ™^Í¨Š¼X,,c‹²—I¦dØÁ¥5½ú1³‘¸))„h×â~"šÏ)Á±½ÉM}£‹­.ê›<ìØï¡/OF•Zèõ„jœÎOSUõ _/Ý1ÃeŸÏ÷•åËž¢(©‰Ðf"ÕžóUô2×÷Ãl·åF‹å½â™Ó§ÉPPéinÁQ˜ON–a‚§Þú ãjÇ3Ê™KWW;MMM8Ž;î8²³³ÑétÔoÝJýÖ-”••Q]]͘1£b*Ò`#¿ Ÿ={öPUU5è¾£GÕÒÞÙ†êósõ‚ó¹ãe˜t }!aâíwVQqþ·1šõäæ’—›‹Ž f“.ÆB"*hÈ„´*UÕ²HØ.H›–¹‰ÀJ0%µ¹u]½¶6v³µ¡—úÆ^¶6ºhhí°´?¨Òé ÐçéÅlu$åS¦úrý1[L÷UÆ÷z­Cñ@>lºÏ§ªjº2óˆ·ý‘”ò_9ÃEîtj(Tîik·ŽC^a1:¡Ã¤·"‚*KF°g#U㳑:»»éíîÆçó1gÎ)Œ3¤Êî];Ù¼e |ð»wïdÒ¤I”––éÍY,6oÞÂøñãg¹â"¶ÕïàØÉÓ˜>î>Þº ‹Ã? °fÛZö327Ÿ9À·ÎYÈïý-¯¼·•ï.œZʼ¶x<ŽŸMÆÁ–(ýÏ—TÃÐØêbkC7[övSßÐËÖÆÚºýÃþ’z½snïÎÍŒš0#­/—ªL¦²áP€6i©ªêÿ‰8ÐçÈGM·.úÞyç´’ð!Ä)å_%àÚ‰TÅ-vvïØÙd¦¬ªGv;öí¢)6³™Q#*1XôøÚƒøZ[øý̘6•²Ò¤TÑ+‚qãÆ2bD}}^¶lÙÂçŸoÂåòÄØn QTT„Ëíáíwß' ár¹ÈÍÏ¥¦²½½Å„Þl¢ ;›#jhؽ›öÎfæÏ=ƒŸ®¡ÈiÁPq˜ÔoÛAÕ¬‚¡fsD=}zåçœ5»–ò‡fVcµäé62i¶@|¿Ëùa¶7v±µ¡‹- ]lmèf[cß‘iÒ퉜gï®ÍÔÖMïd‰`J áøqÉ¿. Õ÷L Šn«ªªâ¥—^ÂçóñÁðÔSO%†;nB¬“R¾ò•NJéBlD8’BUB9ÅÅÆ¼²<~O…Nìj§ ¸ú-õtuwRQ^AGG'»÷ì& ÓÞÖŽÛ妸¸˜’²¦NJ8¬ÒÔÔÄþý(--ðÍmøì3÷Q]]ƒÅlaû®Ýôù|¬ß°¶>/;Ü:ƒ>²²³˜TVINXG÷žFfOŸÉô‰ãx÷³Ídç£tõ%$º»°ê ”––1ÿìù¼ôòKüñµÏ¹ùâã’€›÷–Æ_ëqùز§“Í{:ØÚÐÅÖ=]ì:ÐK8üåû5[7mà”y'j¨Yÿm(¢I”›;÷eìP•×tŠ¥^¯çôÓO}¦™3g²hÑ".ºè"vìˆÕ6ýoà•¯ŠáªTe5Ц¢eY0fLÝ^Ì:n·[+}—K(Šds¸Ý¬Y³–žÞLz3ãÆ£¹¥…Ý{öp ºŠ‚‚|F9¨·cÇNvîÜEÝØ:FÔVóÙöm|²k³FM¤tD9/þõY¶ïm¤¼ ˜–ûùdëL:y+ÍBP7q[³ ЉÄf²ÐÒÕM]a)}A?'Ï9•×__ÉËïÖ³èŒñ”ص¢[qVkj鉀kw[÷t°¥¡‹æÏÿ‰ÃoÐ ¶o«’9™¨f¦+ 4P ¯¿ðB”²³³¿ÔÏÙŸ y(¡tÇX,–¤Ïî÷û)..桇bîܹQ5v´b†”ríW8)å…§‹¥ªª~— Õ  â–*zTtŠ‚b4ár¹°;ìX­¦L™‚Õb¦·§ΈA¯0qÒ =;wìds § ƦM^ŽÙµÌš9GnŸoÞÄO=A§ß‡ÇëEÕ騾«ž™eÕ,>ó,Jª*iêéæ½Ï?á£Ûyèשՙ(v8ø<è­Yî^”Œèñx¼ôù7©š’ [w·³yO;›wEÀU¿·“^O€£eØÌ:¶ïl@J‰ªª¥Æ äË $ÌLBÄšz¤îpÙíËí`ÛŒF#RJFÍ 'œÀ»ï¾Ýt"°ö«b8€ÕDêÂËpXEQtèu:LŠ UH›b ìóÓÓÓƒÃn§½½¢‚‚Ø—[Qi|a³ÙQUIGW--­ÔÔT³fÍêêê(.>¸œüþ¦ý¸{zÑWèëqQ^RÂMWü.‡.W7í픟þ-N˜6êâŒf#åÅ…7n,o~ò)7ýæA&m6ª„Ý(F#Š[E Q³Ù‚ÅbÆi·òñçMLøÎã¨G™Ò]Y`âØ“k¬L©±òø›m|Tßœ8é&—¦‹Ù ÆÁ˜.àEø8Ò€ìñ‡½ž`0ȨQ£WýUš”ŸnÀôxðv÷ìó2¦v >—‡>kŽßOeE%ùtwuÓÙÙÁäÉ“)//¥³£·ÛEyy)^¯‡æ-ttv0qâxrs|úé§œy晽pGW¾ «•Ïë·ðm[ذi½Ý½ä9íè…ŸPùbÏnì63%¹äÚ”•ò×uSbµS˜•K—ÜA¶ÍA¯<ª§jD§W°˜Í„‚B¡^_ðÿ\BÀÈ+ÇÖØ™22²<»^+ ¹‘&ްðÊÚ.öíÙByõøÄRƒÊùCM (c¥³³3&dØŽÆðBÔ?M)F¬|Õ€3a¡(û›œºM6½Õl¦3'ŸÒ¼ŠõŠó ééîÂj13ù˜I477³}Û6ÊJJ(-)Âï÷ÅT½ââb‚A?{÷²fÍ:¾½ðöîm¤¾~cÆŒNœÇMPUy}õû<øü3ìij"$EÇÔQcPôz6íÝEžÙFnn.õ¢_(ŒŸ åŽ,Ž›t,O¾ö*v½™19y|ÜÜDÐh¢<¿ ‡Å†Él¤m÷NBáðÿ ÀE0¦ÜÆÔZSF:™2҆Ӭ硉´ON¼w&Œˆ”æXóÞJJ*ǤM(»äPMÍ(»ººp:ƒúpÃUÃe·þö…Bôôô°jÕª$kó«\6`‘ª*tSÁ¬ÏÓ#á0•¥e˜ˆäLV”•QXX@8¤ ?¼ì™ø|>üþH›a½^‰MÍ9ÿü…Üwß45ícoC##GŽdÛ¶Îl0b-/áÙwߥÛãÁi³£ª‘L~; {º;PC!BÞ>|z!½¡ªQ)¬©âÓ_à°[™”_I³§Ü}WäSš›‹Õf¡«³ƒ?¿ð<¡°ú•L¯Ôprì¨,¦Ö:9¦ÚÕD<™YMÉRQÕ„š–‘QUhÂnÖñ÷÷ÞáìÅKòãú3+ûc¸¡°câ9:;;)//?,¿m0° E09€å˜ÄZ;ÚX,„xZJùÎWÉp Ð>vâ¤Uz‡íÛ“ªj 3Gס†Â¥Ê±“§`6›Øµg7›7o¦¶¶–ÒâRTUÒÓÓC_Ÿ—Ë…Ó館¨ˆÂÂBÊÊÊØ±s7Û·ïdÊ”ÉÉ&ÛíæÀ¾ý”W”Ó×ç&³™°Æ,E‡ËëÅd1ãUî Šô9°)^ß´™0L™…·³V¯½N0‘C~NF£“¢qß#Öë;u˜ «³˜6:›)£²™XeÇbPÊ7„c…‰“•ebJXÊM¢Waæ­7#¥$Ž—²H x§ µîB¨ IDAT|'-øK‚Þ½{7uuuÃÛ`Á÷Ãì‘ ´ëõz X¸p!O<ñD"ÃýEqü‘lŸ5àÆkÛse[Çæ{n»s» „Æïݳ‡`8HEE%:Eaß¾}455 …hhh`úÔ©ø|>¡ðñÇkéî颺ª:6?iÜøqèõF¼^/§3ÙDijÚ‡ÇíÆÕÓÃñ“¦°µi/Mm­„B’lg6:ƒÖk¡SJä&õ«*„”س1‡ôìïóÐîíÆa±R–ƒÝjÅðòÁ»¯ÒÞuäÒæ¬&“ks8vTÓGg3~„ƒŽXá¡äZ))`S¤ÑöIÿ:3GÛY¾¢…úúzÆŽ‹Ñh<ˆÝRAw¨&\"øÂá0MMM|ûÛß>"Œr¨Lw(Š¿§×ë ‡ÃÜrË-ÔÔÔð³Ÿý,š;ê$RjoŠ”2ôe®ŒHéšM·ÞrË»½m‹Z[[" q8p¹z øýØì6ƌÎ;1¢‚ܼl\.f“…°¬ÿd»víaú´©„ÃaFÕÖ‚*†Ãè½’âœw‘å̦«³‡“¦O§¶º‚ûÿø$}± ‹¹o8H!ôFÑâ;zU€€€AE¯HB¾>ö·µáöûèr»˜T>‚l»ƒÁˆ§u7n:¬‹æ´˜R›Ë´1¹LÃØ Š aº+¹ 6í›Nª;Ÿy*–fä8J€ž]¾œ;x ɬìt©ù–Ca·T†Û³gáp˜ººº/]®)y¤^Ïh4¢ª*‹-¢´´”Ë/¿<æ>éYþ«/ pÚ<¸è¤¡ö>þè|£ÑZ[TTL]]åØívzº»p8œx½}ÔÕÕQZZB(Àï÷S¿u=½=dggó3N'¿ €ÆÆ&:4åÒd±âr¹1 I>77‡±cDZÿÀöïßGcs+9Å8gZñuyØïõâéë#ËDg1! zPD¤ðœÈP˜ !tF#>W:B¾ÃIaN. ~Ö}°‚O¶6ë"å:MLÇÔ1¹LKm™]ë˜óÿÛ;óø(«{ÿ¿Ï3[2Ù÷=laP© Å¥¢ BŪµ–kmë‚Ëm{U°Øºüô*mo­z­Ô]jÕ« ¢XEQQP"` „$„ì™ýüþ˜%O†™Ì’g0Â|_¯yÍ<û™óœÏù~ÏwõÄÍy}(]î ToVg·[fO°y9Zˆq¯’„à`xkE °nÅ ¤”Øl¶Ì}Í)„ð¥8WN+O’X)î¦þŸ&“ ‹ÅÂùçŸÏ¤I“Ô>—!^‘R6ÆŠÃÝì1ü9rór—ïÛûíìÌÌlãÙgŸCRRííítY, %õ |»wæ$3: // ©© “ÑÄ´éÓ¸ðü‰¾ât¹HHp§`h>ÚÌ A{üéÔÔd;£G`ïÞ*žYúo¾Ú¹ü”FJ‹«$—‚¥á(ŠI)% ]¢ ½NN§Çêp’˜œˆ"AA`Pôff‘™’Ê›¯.à7…씼ÌDÆËâÌáYœ1<›ÁùI Ñ]ìÃ…*̺sMz“uk l½ /v¥°½q;§ Á¦ÆFïÙC^Y™/x(;\$ÜÍŸÓmÙ²…äädN=õÔˆq¤Ê-A©+›·/t:.—‹3f¨— \ <ª9à<á9çU@Úyç]<ú´Ó‡¥$%cµZ©o¨Çîp 7hniA:]ôÚùìóÕd¤¥ãpØimiá̱c9íôQT×ì§²òRRÒÝ5…ŽÆÆzrr32d@ç±»òÖÖbNLà”Á¥4ÛZ¨:tµ{¶a·8¸vú¥dçd°~Ëfvïú†fKm-ngæ¬TZ,T6¤ÍeG˜t ,.à¹çžàåÅoì„âœ$ÆÈfÜðlÆ Ï¢(;Q•ØG]aÇå ,žìZþQÞÝÉ…<çzmiþ©|)+IÔÔa7òçW6‘#×èõüÞn祇bÎÂ…Øl6L&SÐÚߊ¢D¬¡ô„åååüð‡?D¯×‡Í‘¢ |FÌ dá¬].—/ ñÌ™3Ù¸q#¯¼â‹ÖùuL§¢f` Õf¹hÖ¬YJMu5](Šp×þ’.V«—(N'u‡Sw¨Ž$³¡ªkjÐô:TÇ¡C‡ikïB¯ÓaµZ)(È㜳'`±X¨Ù¿§]’™I^n6Y44T²oß· IÍ$ûô3iu;jkøhýÆÆÌiSÙwÁEìÞ½/¶nâõ÷ߣùèQ’’±(.†MMg†ŽvÖ¼ÿ.‹–ü£^Áæp›Æ”eòó ‡0vXy™ ݃Ôíð• V•òz⫸]·©J.äÀ@`ói$U…ƒÑ“ouÑdµòߣ…\!xãÓO¹ÝéÄjµöL¶$z Ð@ §ìUCCÛ·oç'?ù‰fæ-µ”Zh+½Z_«ÕÚãøïÿ{–.]ê”-„8MJ¹EkÀ5ë€ :nÉ»ï¼sÅС#(((D§(äææR[[KBB9¹¹¤¦¤as8@Jòóóiku+SÚ;:°Ù¬444‘‘IFF&ÍÍGÑéô¶n©dɛžÂ°¡CH0IJNF¯èij9JBB" ‰f†Ž)Ã$ëc‘’v)xyéR542°¨„öö.öìÝ I&L­z;ºÄF Fõê0«7|á‹„ÎJ5qÃŒa\sñnå…Ë[ÉÔxʱ±qžü‘=¸š*o¥o½v ·S‰šR46<°m9Ê’/×2U§c¼GAr©NÇóV+ÿ~ä.;×ÇåzK¿à/N…›JïÃ?DJyL6ãpEÃHÁìX(°…˽¿ív»ÏÃÄétŒ÷KJJbìØ±|öÙgÞ]ãmç ÏÙØNçøÔÔÔ¯¾©Ü}úE^¨ß¾}{÷³“ìì8t¨½AOJ²»v³N§CÑéÈÈHÇ`0á°;ÐéôzÉ)I 4˜ªªoùfßN&œ3“É@[KÙ9%èt .—‹ŽÚNššš0 Œ3’ÂüBò óÙÖPGAj»ŽaË{KHVô]n‘Í” '3¯g’‘Eðô›¯b²µQ÷ÕWÔ5¸#|$sëe#˜zfѱ óU·ñ––r±Ð\*Î'»ƒQ…T¯×ºA'TçD¶#–Dîzf#¹Bp³^ïËv>EQxxâ¹ç¸dÎÚÛÛŠ•Ðí¶,%C(·xñb233™0aBTÜ#N Øú¢<±X,=RQôÖ&?º±ÀBÍEJ)åGBˆ;€ûZ[[G¿¿ì]yÁ“¹úê«Ù¾}uuõèt‚ìì\*++9tð uB0`À0èudff¢ PßÐÀÎ}{)((¤0;›ôÔ4l+3fL§¸ Ÿýjh>ÚL[{›{]#z½E$2`` ‰‰É´wtR·ÿ0ƒÒsùÃÏgñÖªì?ÒDŠ)•®T #—?ì¬LV}¾Šç_~¤‡§Ç¯¦aúYÅ”&NUîU?yK¸•²CöTŒH|™š»×e`z€|LJ†0Áæ xj?-+ =*f Á•:ÿ×ÑÁÛþ33çÍ£«« ³Ù|ŒÈh³Ù‚:<S’xoÞ¼™¯¾úŠë¯¿þ#{_5±ö2 6/7 ç^‹…Í›7«w],„0J)mšÎC‡në:7mÚh¸`Ò$†F~~%%EØlv¤ta0¸o“œœìK‘—˜H‚AÏúظëœBaܨQn8ŠÃb¥eß·|½i#i©É$'§b0PúÈ´¾½Ø$ÆŸÉ&“ÉúË_þ*!%5C<¸Œ±cÇ’Ÿ“ËÁÚZ ³«‹C‡j}"M{{;éééìØ±½^ÍjÃf·¡3™0'&bÐéhjjÆdÔc6èz…²ñZ­X­6n`÷î]H8P„ ÑdÄf—ج. ²Ó7æ4Ê”’œ”L[k+½ý/½úIFØ´ç(§ Nç–KË8{T6^þåµ) w=“ éç¢*”x ÐŽý­»×kD¶÷6§óà+«£(üÍh$TBÁÿ¶ÛùÄéäoº‰KçÍ#55•äd· §±±1 F2§óþ>pà?þñÉÎÎfÍš5¤¤¤hÆÕ¢%#Qš„â|N§³GÊ¿pÚP]]ÍE]¤V¬œ)¥üRk×Ò Û¯¿áFó‘Æ£|Q¾š¶¶6J‹KÑéttvup¨®–ÄÄDJKK±Ûí˜ÍfÚÛÛÉÊÈÂd4¡7é±Y-èu’ÌŒtZšš±´%;7“Î.í+õGšq:´µ¶Ñu´•œÔ,²sò¨i8JÍ(f…ü¼ÆŽͨ²t M--|úþ"¶¹’×?Ø@K»¹W ã?/BaV"EY àál‚žjrß"Î2¡ª €‡ãáK$D0ñQ¨L¸T/Ê/é+¡Á¶jw½RÎHEá/F#¦0^àߺ\Üõì³drÖ5×ø‚EÕ3z0°ùsºúúzfÍš…Ífãå—_ö-ネ‘(TԜϿjS8ÜvÀ€Œ1‚;vxw´œ”r‡b10¯êÛos׬ýœ”äT’’ŒÔÚÓnÅœd¦££‹ÅFnn.)))n-cG))) >‚Šõعµ=‰F#«ƒôÜj4#«]²}gV«•ÌÌ,Ó éÔ5Ó`餫íƒ ²¸tÆTZL[ÛQvïÜBkÝ.v~]Îóo®¦¡ÙÂof¡$×Ì”qyÝÿA ¼Jé+å^kÉny¸™WlôíõçhЭîW/ÀUïc24‡ ;Ò¹÷ÅÕ U5 ·¬K2ð7£‘ßÙlÜ|ÿý<ÖÑÁ³g‡ 6õö–-[¸á†èèè`Ù²eŒ3¦Ï`ÓÊ,‰¡;Ø9V«µ×t½Ý/3³GÕ¢$"øð6à1õ¾I“Ï£lÈŠ HÏLÇa—mi§rw%EEEdfe¡( ™™Y¤¦¦ÒÜÖÎÁúFšÛ;iµX°Ûm B§#Ýl¦$;‡œô4½ ½£ƒ.‹•Üœ\rrÒÉÈJ!#9 sb"NK «?ûˆŠÕŸ±uÛšŽ¶q¤ÕÆÀ<3çÉáç”ëFÔÛj®%P‹Œ*nFÏ5š¯€Ê®†J™âýÚrm"ø¿µÉ,x»‚2Eáqƒô(¯–’yv;{\.fŸu¿Y°³§†C(°544°`Á^zé% À«¯¾Êé§ŸÞg׬¾l÷õ·ÿ¶ÕjÅétF nïï‰'R[ë«æ43Ú4z¡7x&ÔMFŽιçŒ'7/‰Žo*÷òúâ·xmÑ«Û,NeÛ7»v·v´NLH$55•šš*t¦Df½‰¼œwOr I& Bâ´´ÒÑvËÑý|»w'‹?ØHK»•AùfÌ :fžÏТd ³{Ò=~Šî^ì 0ÎTk²Þ€&TõŽáj„%B:¤Â£KaÉš­œ¥(Ì71÷ÁÆcþj·óÓIž^Ï/'OæÇ×_ÏÀñã{Ìáp°oß>¶mÛÆ|À§Ÿ~ŠËåböìÙ<ôÐC¾µx¬À¦Å±Þlvìn^åQ4kÆåË—«ë¸€)e½æ€3›Í×wuu=Ÿ–šBKkè“'Ç—_}MKKw ±òòUç³bâêóß“ºqÏž%z½~RZZjkB ×ëpùÍ…íÛv’––êTZZ*ÙÙY¹ tt´÷ÌL¼cÇŽ.!Ä8`Ðâ뀯yö#†f :]¿õTg9Üì áYxybÐô=ÃC˜Ç4à5Ä©«ò>Qƒ¬7Sëˆh.ïÊà±ÿÛ@³ÅÂÕz=· ±I €Ò®ºŠÜ{ïÕ h‘Š™Z¬ï"5¨¿{«'ßÛÿW…'Ÿ|’Ù³g{Ãv2qGÿ%Úw´%ö.ûiéé©gZ¬Vߨ.**dÔèž•lÆŽCaQ! &LdegR\Ü]çþûï·O?*»çV?þäÕÔéàª+øÍóihH—Óms¹ºÉtr¢.ÿ«þô8æ £ñ¦@ðÞÏåôÅ«ùR#¸¼yGœÝÏp¹<9"»cãÂÛ7MéÜð¿Ü÷ÂäÙl¼`2q—Á@‚§ócýI6‚¿ÿÝ—¾=Tl\¨s"Ýj­LÙ¨ ÑS ¸H¹òyçÇM7ݤÞõë¾L~AçR\iÖ.«±®î°gqLG{éii=”"ÙÙY$&˜ÐëõÇ$'5^v— lÎôûƒ)åÝàõÈŒT±íÓî^Ͻ‹iµª_€$®ž/ˆz€Iý‘jp˜º|°÷>NUXMdë´í™ÜùB×üy5ks¯ÑÈ¢„Æét(B—Oú¬Yþë_£1,.j0F¾PÀ u,‘3Úub0ºòÊ+՛Ä™š‹”&“iõþƒí”N­®®Énkkgõê ¨íUÒRIOKC§ÓùÂüu:og6'6Ùl6¦àŽ"PJù•ß_ãq%›ëY”š½ÛòŠj>\WÃ9§ðÛKŠ”éè)zDË€×£ãÕë^ïÝEOûœZ9Ȩ~ƺ™¼¸t/›j¶“&· üB¯'EúÕa‰‘·ÜBöƒï›EÈhÖs}I“§…˜¡<åææúﻀ¦k¸öåË—Wôúƒ@v eIqq!Í--$%'‘`òØ<º 67·”­@)ð"ðr°Š$ž‡? !×yÛ'¥¤|s-å›k)ÌNæÆC¸h”£Îë=L[)€OÆnw®è415m)|°ÞÁ»_ì ¡c;ÙB0×`à*½ž¤ã 4a2‘ùÀ¤ÞpCÌ`}š–iïb ¶`mó7xGÂ…ìÛ·O3À…0|' JM1¾‘˜h:ãp}cÀ‘3iòy®«÷i0ïàîêþó•íÕUÕÓ€5žEæ*)e[Ø b0wAã±ØÈ¤³Nå‚SS_Ô†YNˆ’äX\E㹕ÍélØî`åº}l¯k@ÎÕéø‰^Ï$î¸)DzÌžó =.Y}Z´EcímñÛߥ+\ ©×#Çét2mÚ4uý¸G¥”s47 ˜LÐÙÕ5X§S‚NÓ‡ëê9p ¶Çºîí·Þ]_S]3° ¥”ïF¡º¯®BÜ <ÌwÌÝœ9s(//gÅçŸóÁ*;ƒžÑ#†0fh§–è8%»ƒÌKßl*êrØ×œÂž.6m©§|w5m68EQø/ƒËôz Ž37SSâ´id=þ8ŠÇ+’5J_$@‹l6›-*°©I§Ó1}útüqŸÅ fG†Í¼ÂŒ¿˜™““í¨®®j–R:ÀÚ—$¥¬BøòÞzë­ÜtÓMÜ|óÍtuuñÅ_°råJV®\É?ß*ïVæde1°$—’¥é L$&)˜.Ì)÷ZÐ.V‡[ÙÓaÓÑØ¡ÐPo£±¾“C mì®m¤¦¹ÕÛ4!8KQ˜h4r¾NGÎw2]^ióç“8sfŸÀ¡…ˆ ð¢‰ôµNó~ÔyK"í ÿ¸¹¢¢¢«©˜îÜsÏmýä“Oèèè û† zàFkivi0®.ôþ˜2e RJEÁl63uêT¦Nê‹ãÚ²e Û¶mcóæÍìÞ½›ÍÛ¾ÁîpDÕ1BP¢(L68MQ8UQCCudúeóµ×’zÏ=ˆÔTÍ@) ´ʼnF¹¢þ¶Ûí!×i‘ôƒ?Ø„ìÝ»W½kDL—’’’ä~·"ìÂéiÍG[ª?D¨çGɪ6“?ßû]\\Lqq1Ó¦Mëqq}}=û7mâÀÂ…´TT`u¹°KI§‡' A2 é@‘¢':ú! éÇ?&é÷¿GÊ)šq­¾Š™Zœ`üÏw8=¢Ú£];†Ÿ'UžO€B”J)k4Všˆ­R{Œ5¢rÇŽÝ¥”-Àíwǘøw> ^~ùe&Mš0Ô¤·ʗ磦ëOàxë-¤ÃÁ÷‰Œ]„yî\ (E¢=/Và‹T©($ì&RQÒ»ÝÕÕÅäÉ“©«ó¥É¿QJù|Ä‚IoùÓŸ†GzÃíÛw “Rž‚Û}«Q£±¶Ñûã™gž Zz©·öÊò¢´”„‡&é‹/0ýö·èrrŽ‹ÇG´]J æë¯'ãóÏI}ùeôž8µH>Á€IýïH ß}Užôæaâ¿*—`0›Í\vÙeêÃÓ£Z ôÆX̆^µ1#G gì¸ÓʶH)µª åÓr–——sÏ=÷`·Ûê¦&õË……çÎ%qíZLO>‰~ʄɄÇ{ó»ýèt&L ùÑGÉØ¼óüùè† šPœ)R—®pÜ­B/”‡I8Ï Æù%pÖAº7°ù4%Å=t%eڮắ®×€³üü<ŸýÍêq§ÙÓŠw§¼øâ‹sóÍ7÷p' VÐÂ[]ÊI è§OG?}:ttà\±×G᪨@v§G‹=™ÍÎ?ý”)è/¼áQïGb¼ÖÒ£Dë\“¡ÀéΫ,9`ónWWW«w×j 8‰üoñÈû¹yÙŽúÃÏ;\×à]·ù›´.-ªà¶éùÈd2ù¸–BPÞ1œ”„næLt3gz¬Û•¸Ö®Enތܵ מ=Ћ‰$Ň2hÊg ;ã ”üeäHˆ2.N«ÂõZ˜´X¿…Zù\®€N_$¡ÖpË–-SzGs-åOz–ù7ÖvüñsݶXݹ²³0èõáî€íÛw‘••ÑyäÈQ³?84 ;pçu÷´ë§\~ùåÇth  2þûý‹íp!`øp”áûϷÙß~‹Vñ£^°éõzî½÷Þ œ,”F-×A¸J‚h´{á(´úhÕ†p´“á*IÂ}v eH¤þ±ÀÓO?í¶¥Ñ‚-”H9xGQ‚;´†ÊÊJÊ˻ݧÊÊÊØ³gC‡%--ͫ޼86ºIDATÑüîÜ%Ïj8Ÿ6¨¤¤„‚‚‚Ê‘@…+Ôò¿?—2™LÇÔ &Šú?#¤hdDÊíÂ@ÑÚÒ"='šÄ®¡ö9N‡æÑÑh$½ä—uºøÏ¾ æÞ÷–§ñUBˆeÀ¯>ùäÎ>ûlFŒAKK _ý5àN¶2lØ0oVî[€V!„NJù”€óY§ΞÁ”#j/”Þ¥Õjíõ……â¨ÄÌh*öU«ì}X_ÅÉp@át:ÃÊŠk°©·m6[¶ôÖæK)kû2˜Ãu üø ¹¹™¦¦&ºººÈÌ̤££ƒÆÆF.½ôRžzê)×àÁƒÁ]ù!Ĺî€÷Çž={hii *.†c@D<ŒÔˆìmC¬DÍp@£…A»71q²·>÷ï·P` ÇÈ®%Ø„¼ÿþû455©OÙ¡…º=œY…;÷È’%K–ÐÐÐàš5k¥¥¥Ì›7ßüæ7|öÙgX,å†nðr¤³û…#…è“Ký6ÜNÐØl6žzê©^g¿@†Ð`À Äp×mÑC­a"¿Öë¾pG»n 4!¹\.l6[ÄÀŠÔÎ)Ø.¹äƧ>íÎ>+#´Q\üàÎ;ïä¯ý+ ,`̘1¬]»–+®¸‚ÁƒóÀ8ßÿ}ÝúõëÁåè+`ŒR•&„˜üÑÛ÷Þ{/×]w]Ha°lM¡^@(mf(0œëµ7µÒXj™w2Ô>—ËÕÃR+‡èh¹Z í5kÖ0kÖ,õò&EJi9.€ó4hî„@\~ùåòšk®ô%ZY¾|9.—‹††y×]wy[_üCJùJ”.Ø„»@$ÇgêÔ©äæærÍ5×h¼pŽE«î×ÊD µ¿Ö¦5'RÛμkê¾z° !°X, ÞÃ¥xP_òE4³¡b ð-Àµ×^kŸ2eŠáСC †Δ)Søä“OøøãùŸÿùŸ>Û/„£=ëÈmiii”——“ªŠ ‹Ä.¸ÂH¸çÅt‘h,£U˜„ @‡ÃÑ£Îx´Üð»@GG#GŽTÊ‹¶®@(-e¯k:!Ä àÛììlCUU•9r¤¸ä’Kzø6VVV2cÆ Š‹‹y饗ذaÞNDñÌmBˆspÇÙî̸K–,ñÅÈù¿Œ`î^‘ çx µE8be(mh´`éMc‰Êß+ò©Û&„(1[gòæïK¥ÔHÖWð­Y³F}¨‘>FÀˆ¾ÈûBˆ”ÂÂÂV¯ËËc=vtܸq«W¯¦¤¤„Y³fñì³ÏRVVÆîÝ»¹õÖ[ÈÎÎnjllÌÄ«20áö(QOfµYwÙµÞ×_ñãÇÕB æH`ÅŠÞdš<®.ç«Ç¥âÒèv„vx”/ 2„3Ï<Ó—n!‡ñ_‡2”‡Ú÷œHE¾P†òH¹¥š;ÛÎ¥W9G‡jooqfÞ{ëõú Ò€úÙ±š“¤ÿ±úúzæÌ™£› ¿Z‰Çé{îZ×à.ÚÁ/~ñ zè!Wuuµ²wï^¦NÊÊ•+)))aäÈ‘TTT°mÛ6ÊË˱Ùl477³~ýz =z4ûöí£³³“ÒÒRét:EFF¾²AgœqK–,éÑYŠ¢õúå ©Ÿe°sÃq 4 Eé5~$ ör6ÿÁ ½­½Âñ¼"¦¿³ñw´hÀçý½iÓ&–/_NUU«V­ò¯¾@JùÛ¾bE“:IRÊ%Bˆ5@;ppFzzzÞ?ÿùOåÔSOeÀ€¼öÚkäååñ£ý—ËÅÁƒ9óÌ3™7o=öãÆ#++ ³Ù̺uë(--%))‰#GŽ!›7of̘1<òÈ#H)imm=Æ“DªH l8(Ô.˜n ë=7ËYoÀÄABqÚp¹œz2ÇpÞ[h´ :\ÍÛjµòôÓOzÔR`ŽXѬ0™”ò⸣³¯|â‰'~ $¥ÿä'?ÉúáÈÕW_ À“O>‰Óé$--M¾øâ‹Âf³!„`äÈ‘|øá‡TWW3~üxjjjØ·o×_=UUUüìg?ãÅ_¤¡¡={ö°cÇŸ)±.’Âí4Ž¡ EøÚÞ® D‡N׫âÅl‘ü?¯¾ ˆÞDQ-k i¾C‡ù_Ò \ßgå˜λ¦¶ !j€Ï€{<8dÁ‚­ ,X}øðáÉz½Þ˜““ÃW\”R¬]»–Ûo¿)%¯¾ú*û÷ïgîܹráÂ…Ân·síµ×öxƨQ£XµjsæÌaÑ¢E¤¥¥õ*2†ÀÁöû+КK ,S4J§ÓT!iþŽ`ç8Eé1I…ò0Ñ €±Z´Ë!¯½öš¿Fr¢”r‡–Ç#ÐQ±T\\ìÔét dNJJ"===aܸqÉÙÙÙI^ÿ̲²2öïßËå"//„„öìÙCQQ[·neýúõ¬ZµŠüü|êêê(--eΜ9Lž<ù˜ÚÔÑj£1dÇ Ï"Ñš´àX±Z,¹šwû‰'žàá‡{„|^$¥\¡ù{=N€;wºòݸS–›p× °ÆÜÜÜš³Ï>;·¼¼¸à´¨·+άY³Ø¶m[H€E;ÀB x­A‹g„{~4çDÚÎH’>…³/’ëTKÿ‰ú@pÁ‰ø¥wûàÁƒ\vÙe<ÿüóšÍÞZD]kÅåb!ÎyѦ`Àˆh‘ˆ”þû/^¬ö*©—R÷³ ø_õPåÔL|ІkhÍå´|†Vœ.’õY¤) û¾pYQQÁüùóÕ»ÞŒåXÇ+áh¬I‘€;0v4À°aÃX¶l™f*-TýZ› ´xw2FiÔÃùÏá*C´Ü·qãFÌf3õõõ¼÷Þ{¼ñÆꨈFàT)e]pá½Ü3< Sþò—¿ø"ÑcŠïÚæ+pöu\D&-@î¹W^y%ëÖ­ t¹ w€ô[±| 'yì}>ƒÊ}÷ÝÇâÅ‹{-;Û×u[¬5’Z‰§ZþçH×fáˆÑЉ‘œÛÚÚêŸÔÕK;€)±Û Çá<]ˆ»6/CII gŸ}6z½žäädî¼óN­žõ}œ”´ìëïLœŒ†#Î;—E‹©í拤”Ç¥:ç 8O–¥þÇÊÊÊøðÃ5|ýŒ±~Ÿ±Y¬ÖÞÞΟþô'^zé%õá…À-RJÛq›'"à<‰;Bw~5K–,aL€²½'j_ÄzâÐÚI¼¯@s:<úè£>|˜––V¯^í \öЗÀ¥”®ãÞŸ'ú B”“pŽwz†E‹ù{¬¬,ŒFãI@­4¶Ñ×|‡ƒO>ù„… ú'ÿQÓ>Ü‘û¾“>>Y•â<Ü1zäççsÇw0yòdÒÓÓÙ¿?ï¼óO?ý4………|ôÑGß™ØÖ_€¥—Ó P¡ö/\¸ûî»/Xj€§p§JhÿÎúþdšÅ…÷„:oРA¬X}(TèÓXg ë c!fnÚ´‰Y³fù‹ŽõÀ«Àb)eEƒzN"’RÞ+„hÁ­™2 kj8räÙÙÙQéû¢½Ô:iíñZË555ÑÑÑANN555¼ýöÛ,\¸ÎÎNï).ܵ0þ,¥ììW}~2* „eÀWùªC.<¶ÉÿøÿàÁüÞq¶þÄébÀû￟矾·fÝ$¥|¶_޽“]3'„ÈÇp¶wš¿Ç½Ç~÷»ßñ»ßý®Gb§ÓÉßÿþw6mÚÄu×]Lj#8|ø0………äääÄLü<žé´^«UUU‘››KRRR¯×Nž<™œœŠŠŠxøá‡}¹]Ô÷Ü´iW]u]]]nQüVˤ?qÀÅ|F ðU¼8p S¦L¡°°C‡ùòúSVV7Þx#'N$11‘ýû÷sÎ9ç|Ά 0`¹¹¹!ÛÔÚÚJss3¥¥Ý&E—ËÅúõë™0aBL9úš¦¦&6lØà«î}wìØÁìÙ³¹ãŽ;¸âŠ+‚>cíÚµ\uÕU¾ý'NäÁÄSo—ËÅ믿Îüùó9zô¨ÿmv/O— ‘8à¢ÝNÜuÅûLÓ§O箻ØíôÒÞÞοþõ/üq 3fÌ`ذaüâ¿À`0¼‡×=í /døðáØl6V¬XÁ7ß|óÏ>Ë…^¨9—;rä·Ür §Ÿ~:™™™ìß¿Ÿ÷Þ{»ÝΊ+|ÿÇŸ>üðC^zé%Î<óL6oÞÌgŸ}†Ó餠 €¥K—RPPp HÛÚÚ¸ì²Ë¨¬¬<¦Mƒ "%%…={öÐÑÑáÿÈWqWeZó½_qÀ3ð¶â±×… /=œp$½ø¤ !0`F£‘êêêcÊLš4‰¿ýíodddøöY­V{ì1žyæ™à/½žÛn»_þò—$'»3Ë777“––vL]soþLï~»ÝΪU«¸à‚ z$‡­®®ææ›ofçΟYRRÂsÏ=Ç)§œÒã?.[¶Œ¹sçEkï»ï>¦L™âkGEE÷Üs»wïŽôUýAJù—ïÝøŠ.jÀM—R¾/„0ãÉÀTà ¢p 7›Í\|ñÅS__ϪU«¨¯/Òß`0PRR‚”’êêjÊÊÊ8묳0›Ílݺ•;wrÝu×1aÂ’’’øúë¯Y¸p!••• 4ˆ &™™ÉîÝ»YµjU"HQÎ=÷\F…ÍfcíÚµêü!)33“ââbjkkilŒªÍRÊ¿}/ÇWp}\€ë³q{¶Lf…4Ë,¶¸Ë9?ÝqXîáäãaQÞ§HG•…-5ÙÑöý÷‚bQ;úûüñ jÆgZ÷šæ½ì½ûàÞƒq'Pú6ÌgDò9 Üèýžy1°9Šû-ýñ1à ðß—´ìûþúÑÇyZ¿ JàaàG@.[÷¤”Û‚L”û€?B öpÒ|ÏwîÔéžoÿ÷Ü‰Û £èðpÍdϾuÀò@u¬¥” !Vç{r‡›‡3±.ò”‰ÛÓ ìðj¿áN‘Rpýƒ\RÊ£”RöávÊ=‘X¬Bì pªë›5'ë‹Vâc=NqŠ.NqŠ.NqŠS| § yóçžZúdï+\ï8‡‹tð” !ގச’æ¥ó…gŸd}¥BÜ ¾~楓„wyœâ€;‰Áv®gà\E_ŒV !þá™ñOô¾2K€D0)y)·Íp·bDp''ØJíýŠnž9 ºìàÒ>Þ£øÂÜIFà6öjA7!¦À“Ó¸ÄÇP” <ÜI¶nóˆ‘ZÒ'p—Ý­ñýÎ÷€8¸“„®ŽÁ=ÏB¤žhåùO±àÞÓâ€;yèŠÜSÛ¬p¢Ñ zI¸ÔšÜÉ!NšÓbtûÁ'`—ý0ÞWÚÎÊ'ŽáD“ãIJt1pp"¬SÆÄè¾ÙB=îØ¾É¸ÓZœð 'a:ïÙÄN¿(‹Bs7/¯*.ôW }7£=žþŠ”V¿–RÖÄEÊþOCbxï‘Q®wô¸³N-ëOÞžèõX*‚¢µÇMv !.Œ®ÿSf€}Íý¤mïö#Ï•@~¥­ý¤mfÏunpý›ÄÀÏûQû&7ôãñ± õ•xÁ³Œ®ŸR“ßöÿØ÷]S1¢×è»×úY_ Ãmºˆ®ŸÒf¿í·K?kcYð7ô¤CP+&þ ôÇÌÆÓã€ë¿´\°)å.úg ÜÅý¤KU¿?Œ÷Up‘ÎÚ­À“žÍUžïü~ØÔáý¤©&¨•ý´¯J=áCqÀõSº×¶=ÛÅý°™ýd‚ª~ |-¥¬Jûé;Íü> ¼“2Å‚”²Sq Ý6³HŠ«;€-¸S½ý&†ÍÌíGýõºb½êÿGBu@¹‡3ÆR…ŸíyVpýtí~Ê€kƒÌ’ûpîX¬¾”RZ„gÄpJ?ë¯*ÏÏÀ6§ƒoõLFëµÀz¯7ˆâ“øXŽ'ò¦Û…s<¢e¶‡ó5µž5_¸Ȇvžõ­ý´¯¾Nõ$]*Äí‰b=Ù•{ã@¤ý‰Ü_qÀH.Ü*ðpýóq EN©5÷óþjްþýµÇ#ž{2ô×É®4Ñ‚Úp·hxÿoOðþúÚ9´ÆwâÓ.¿í•¸Ë;iEå'XUúm¿…vFôr„Ü ,‚Ö{^z·C­VâÑú¬Ë>Vý®’Rîа¿>þ¾tBp}£§ü8œVFᇥ”'X_½‰»–·¯Ð¨¿ÏÇwrÐóѯÖã"¦EµÓÀ_N´ŽòÔ›ûOÜ6O¯‰ ¯ýULñ3ñôkŠk)û6ˆBˆéÀuž]ÑúZp×\{LJ¹òî¯7…·¨8\´ýµwnËg=ÚÒï Åk|kÙ™B\†»>A(ªó¬ÑÖáöX©Tqô$è¯oõí¾*<ýõù÷1µBp±@fàB`"0·çŠÍ£ÙlBå}ï/1·§ÿ<Ü.·Š¿wÕF`£”ÒvÂüç8àâ§ãGq¥Iœâ\œâ\œâ§8àâ§8àâ§8ŧ8}·ôÿ#¿kÏ‹ä¦IEND®B`‚sleepyhead-0.9.8/sleepyhead/docs/channels.xml0000644000175000017500000001427712412506713020621 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/docs/usage.html0000644000175000017500000000265112412506713020267 0ustar sergiosergio
    Usage Notes

    To import your PRS1 or S9 CPAP data, select either the root or drive letter of the SD card, or any folder containing a copy of it. On the PRS1 this folder should either contain or be the P-Series folder.. For the S9, the folder you select must contain the DATALOG folder, and Journal.dat, etc..

    ResMed S9 Users Please Note: It's a good idea to keep a running backup of your DATALOG folder as your machine automatically deletes Flow waveform data past 7 days, and other waveforms after 30 days.

    CMS50 users: To import data recorded by the SpO2Review software, look for the "Application Data" folder in your Home directory, point at the folder containing the Spo2.ini, Spo2Review.ini and Data folder. Serial importing is still a work in progress and may or may not behave how you would expect.

    *** Attention Mac Users ***
    Please set your SD card to read-only before inserting it into your computer, as Mac OSX automatically writes a hidden index file, which can lead to data corruption on your SD card.


    Do NOT rely on this softwares accuracy when making medical decisions. Talk to your doctor.

    sleepyhead-0.9.8/sleepyhead/docs/tooltips.css0000644000175000017500000000315012412506713020657 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/docs/changelog.txt0000644000175000017500000000021712412506713020761 0ustar sergiosergioghttp://mobile-phones.smh.com.au/MobilePhones?utm_source=Widget_Fairfax_SMH_CompareAndSave&utm_medium=Widget&utm_campaign=New_BYO_Phone_Prices sleepyhead-0.9.8/sleepyhead/docs/schema.xml0000644000175000017500000000360612412506713020260 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/translation.h0000644000175000017500000000065712412506713020060 0ustar sergiosergio/* Multilingual Support header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef TRANSLATION_H #define TRANSLATION_H #include void initTranslations(QSettings & settings); #endif // TRANSLATION_H sleepyhead-0.9.8/sleepyhead/oximetry.ui0000644000175000017500000003360012412506713017562 0ustar sergiosergio Oximetry 0 0 791 373 Form 0 0 0 0 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 0 2 0 2 0 4 0 0 0 Date 0 0 d/MM/yy h:mm:ss AP 0 0 QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } R&eset Qt::Horizontal QSizePolicy::Fixed 10 20 0 0 SpO2 0 0 85 0 255 85 0 255 118 118 117 QFrame::Sunken 3 QLCDNumber::Flat Qt::Horizontal QSizePolicy::Fixed 5 20 0 0 Pulse 0 0 255 0 0 255 0 0 118 118 117 QFrame::Box QFrame::Sunken 3 QLCDNumber::Flat Qt::Horizontal 40 20 0 0 QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } ... :/icons/save.png:/icons/save.png 0 0 &Open .spo/R File false false 0 0 Serial &Import 0 0 &Start Live true QLayout::SetMinimumSize 0 0 Serial Port 0 0 120 0 0 0 &Rescan Ports Qt::Horizontal 40 20 sleepyhead-0.9.8/sleepyhead/profileselect.ui0000644000175000017500000002720512412506713020546 0ustar sergiosergio ProfileSelect 0 0 418 272 Select Profile :/icons/bob-v3.0.png:/icons/bob-v3.0.png QDialog { background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(240, 240, 240, 255), stop:1 rgba(220, 220, 220, 255)); } QGroupBox { background-color: white; border: 1px solid gray; border-radius: 5px; margin-top: 3ex; /* leave space at the top for the title */ } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; /* position at the top center */ padding: 2px; background-color: white; } QFrame { background: white; border: 1px solid gray; border-radius: 10px; } QLabel { background: transparent; border: 0px; } QPushButton { background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(240, 240, 240, 255), stop:1 rgba(255, 255, 255, 255)); border: 1px solid gray; border-radius: 10px; padding: 3px; padding-left: 20px; padding-right: 20px; } QPushButton:hover { background: white; border: 2px solid gray; } QPushButton:pressed { background: gray; } QLineEdit { border-radius: 5px; border: 1px solid gray; background: white; } 6 6 6 6 6 6 QFrame::StyledPanel QFrame::Raised border: 0px; Search: Qt::CustomContextMenu border: 0px; QFrame::NoFrame QAbstractScrollArea::AdjustToContents QAbstractItemView::ScrollPerPixel QFrame { background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 255, 255, 255), stop:1 rgba(220, 220, 220, 255)); }; QFrame::StyledPanel QFrame::Raised -1 16 16 16 16 0 0 Start with the selected user profile. &Select User :/icons/forward.png:/icons/forward.png false Qt::Horizontal Create a new user profile. New Profile false Qt::Horizontal Choose a different SleepyHead data folder. &Different Folder false Qt::Vertical 20 40 15 75 true border: 0px; SleepyHead Qt::AlignCenter border: 0px; [version] Qt::AlignCenter Qt::Vertical 20 40 Click here if you didn't want to start SleepyHead. &Quit false 0 0 QFrame::StyledPanel QFrame::Plain 4 4 4 4 4 75 true border: 0px; Folder: 0 0 The current location of SleepyHead data store. border: 0px; [data directory] true quitButton clicked() ProfileSelect reject() 52 276 199 149 sleepyhead-0.9.8/sleepyhead/statistics.cpp0000644000175000017500000023705412412506713020252 0ustar sergiosergio/* Statistics Report Generator Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include "mainwindow.h" #include "statistics.h" extern MainWindow *mainwin; QString formatTime(float time) { int hours = time; int seconds = time * 3600.0; int minutes = (seconds / 60) % 60; seconds %= 60; return QString().sprintf("%02i:%02i", hours, minutes); //,seconds); } QDataStream & operator>>(QDataStream & in, RXItem & rx) { in >> rx.start; in >> rx.end; in >> rx.days; in >> rx.ahi; in >> rx.rdi; in >> rx.hours; QString loadername; in >> loadername; QString serial; in >> serial; MachineLoader * loader = GetLoader(loadername); if (loader) { rx.machine = loader->lookupMachine(serial); } else { qDebug() << "Bad machine object" << loadername << serial; rx.machine = nullptr; } in >> rx.relief; in >> rx.mode; in >> rx.pressure; QList list; in >> list; rx.dates.clear(); for (int i=0; iFindDay(date, MT_CPAP); } in >> rx.s_count; in >> rx.s_sum; return in; } QDataStream & operator<<(QDataStream & out, const RXItem & rx) { out << rx.start; out << rx.end; out << rx.days; out << rx.ahi; out << rx.rdi; out << rx.hours; out << rx.machine->loaderName(); out << rx.machine->serial(); out << rx.relief; out << rx.mode; out << rx.pressure; out << rx.dates.keys(); out << rx.s_count; out << rx.s_sum; return out; } void Statistics::loadRXChanges() { QString path = p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" ); QFile file(path); if (!file.open(QFile::ReadOnly)) { return; } QDataStream in(&file); in.setByteOrder(QDataStream::LittleEndian); quint32 mag32; if (in.version() != QDataStream::Qt_5_0) { } in >> mag32; if (mag32 != magic) { return; } quint16 version; in >> version; in >> rxitems; } void Statistics::saveRXChanges() { QString path = p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" ); QFile file(path); if (!file.open(QFile::WriteOnly)) { return; } QDataStream out(&file); out.setByteOrder(QDataStream::LittleEndian); out.setVersion(QDataStream::Qt_5_0); out << magic; out << (quint16)0; out << rxitems; } bool rxAHILessThan(const RXItem * rx1, const RXItem * rx2) { return (double(rx1->ahi) / rx1->hours) < (double(rx2->ahi) / rx2->hours); } void Statistics::updateRXChanges() { rxitems.clear(); loadRXChanges(); QMap::iterator di; QMap::iterator it; QMap::iterator it_end = p_profile->daylist.end(); QMap::iterator ri; QMap::iterator ri_end = rxitems.end(); quint64 tmp; for (it = p_profile->daylist.begin(); it != it_end; ++it) { const QDate & date = it.key(); Day * day = it.value(); Machine * mach = day->machine(MT_CPAP); if (mach == nullptr) continue; bool fnd = false; ri_end = rxitems.end(); for (ri = rxitems.begin(); ri != ri_end; ++ri) { RXItem & rx = ri.value(); if ((date >= rx.start) && (date <= rx.end)) { // Fits in date range if (rx.dates.contains(date)) { fnd = true; break; } // First up, check if fits in date range, but isn't loaded for some reason // Need summaries for this day->OpenSummary(); QList flags = day->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN); QString relief = day->getPressureRelief(); QString mode = day->getCPAPMode(); QString pressure = day->getPressureSettings(); if ((rx.relief == relief) && (rx.mode == mode) && (rx.pressure == pressure) && (rx.machine == mach)) { for (int i=0; i < flags.size(); i++) { ChannelID code = flags.at(i); rx.s_count[code] += day->count(code); rx.s_sum[code] += day->sum(code); } tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway); rx.ahi += tmp; rx.rdi += tmp + day->count(CPAP_RERA); rx.hours += day->hours(MT_CPAP); rx.dates[date] = day; rx.days = rx.dates.size(); fnd = true; break; } else { // Bleh.... split the day record! RXItem rx1, rx2; // First create the new day.. rx1.start = date; rx1.end = date; rx1.days = 1; tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway); rx1.ahi = tmp; rx1.rdi = tmp + day->count(CPAP_RERA); for (int i=0; i < flags.size(); i++) { ChannelID code = flags.at(i); rx1.s_count[code] = day->count(code); rx1.s_sum[code] = day->sum(code); } rx1.hours = day->hours(MT_CPAP); rx1.relief = relief; rx1.mode = mode; rx1.pressure = pressure; rx1.machine = day->machine(MT_CPAP); rx1.dates[date] = day; rxitems.insert(date, rx1); QMap datecopy = rx.dates; rx.dates.clear(); rx.end = rx.start; rx2.start = rx.end; rx2.end = rx.start; rx2.ahi = 0; rx2.rdi = 0; rx2.hours = 0; rx.ahi = 0; rx.rdi = 0; rx.hours = 0; rx.s_count.clear(); rx2.s_count.clear(); rx.s_sum.clear(); rx2.s_sum.clear(); for (di = datecopy.begin(); di != datecopy.end(); ++di) { // Split everything before if (di.key() < date) { Day * dy = rx.dates[di.key()] = p_profile->GetDay(di.key(), MT_CPAP); tmp = dy->count(CPAP_Hypopnea) + dy->count(CPAP_Obstructive) + dy->count(CPAP_Apnea) + dy->count(CPAP_ClearAirway);; rx.ahi += tmp; rx.rdi += tmp + dy->count(CPAP_RERA); QList flags2 = dy->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN); for (int i=0; i < flags2.size(); i++) { ChannelID code = flags2.at(i); rx.s_count[code] += dy->count(code); rx.s_sum[code] += dy->sum(code); } rx.hours += dy->hours(MT_CPAP); //rx.days++; rx.end = qMax(di.key(), rx.end); } // Split everything after if (di.key() > date) { Day * dy = rx2.dates[di.key()] = p_profile->GetDay(di.key(), MT_CPAP); tmp = dy->count(CPAP_Hypopnea) + dy->count(CPAP_Obstructive) + dy->count(CPAP_Apnea) + dy->count(CPAP_ClearAirway);; rx2.ahi += tmp; rx2.rdi += tmp + dy->count(CPAP_RERA); QList flags2 = dy->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN); for (int i=0; i < flags2.size(); i++) { ChannelID code = flags2.at(i); rx2.s_count[code] += dy->count(code); rx2.s_sum[code] += dy->sum(code); } rx2.hours += dy->hours(MT_CPAP); rx2.end = qMax(di.key(), rx2.end); rx2.start = qMin(di.key(), rx2.start); } } rx.days = rx.dates.size(); rx2.pressure = rx.pressure; rx2.mode = rx.mode; rx2.relief = rx.relief; rx2.machine = rx.machine; rx2.days = rx2.dates.size(); rxitems.insert(rx2.end, rx2); fnd = true; break; } } } if (fnd) continue; day->OpenSummary(); QList flags3 = day->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN); QString relief = day->getPressureRelief(); QString mode = day->getCPAPMode(); QString pressure = day->getPressureSettings(); for (ri = rxitems.begin(); ri != ri_end; ++ri) { RXItem & rx = ri.value(); if (rx.end.daysTo(date) == 1) { if ((rx.relief == relief) && (rx.mode == mode) && (rx.pressure == pressure) && (rx.machine == day->machine(MT_CPAP)) ) { tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway); rx.ahi += tmp; rx.rdi += tmp + day->count(CPAP_RERA); for (int i=0; i < flags3.size(); i++) { ChannelID code = flags3.at(i); rx.s_count[code] += day->count(code); rx.s_sum[code] += day->sum(code); } rx.hours += day->hours(MT_CPAP); rx.dates[date] = day; rx.days = rx.dates.size(); rx.end = date; fnd = true; break; } } } if (!fnd) { RXItem rx; rx.start = date; rx.end = date; rx.days = 1; tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway); rx.ahi = tmp; rx.rdi = tmp + day->count(CPAP_RERA); for (int i=0; i < flags3.size(); i++) { ChannelID code = flags3.at(i); rx.s_count[code] = day->count(code); rx.s_sum[code] = day->sum(code); } rx.hours = day->hours(); rx.relief = relief; rx.mode = mode; rx.pressure = pressure; rx.machine = day->machine(MT_CPAP); rx.dates.insert(date, day); rxitems.insert(date, rx); } } saveRXChanges(); QList list; ri_end = rxitems.end(); for (ri = rxitems.begin(); ri != ri_end; ++ri) { list.append(&ri.value()); ri.value().highlight = 0; } qSort(list.begin(), list.end(), rxAHILessThan); if (list.size() >= 4) { list[0]->highlight = 1; // best list[1]->highlight = 2; // best int ls = list.size() - 1; list[ls-1]->highlight = 3; // best list[ls]->highlight = 4; } else if (list.size() >= 2) { list[0]->highlight = 1; // best int ls = list.size() - 1; list[ls]->highlight = 4; } else if (list.size() > 0) { list[0]->highlight = 1; // best } // update record box info.. } Statistics::Statistics(QObject *parent) : QObject(parent) { rows.push_back(StatisticsRow(tr("CPAP Statistics"), SC_HEADING, MT_CPAP)); rows.push_back(StatisticsRow("", SC_DAYS, MT_CPAP)); rows.push_back(StatisticsRow("", SC_COLUMNHEADERS, MT_CPAP)); rows.push_back(StatisticsRow(tr("CPAP Usage"), SC_SUBHEADING, MT_CPAP)); rows.push_back(StatisticsRow(tr("Average Hours per Night"), SC_HOURS, MT_CPAP)); rows.push_back(StatisticsRow(tr("Compliance"), SC_COMPLIANCE, MT_CPAP)); rows.push_back(StatisticsRow(tr("Therapy Efficiacy"), SC_SUBHEADING, MT_CPAP)); rows.push_back(StatisticsRow("AHI", SC_AHI, MT_CPAP)); rows.push_back(StatisticsRow("Obstructive", SC_CPH, MT_CPAP)); rows.push_back(StatisticsRow("Hypopnea", SC_CPH, MT_CPAP)); rows.push_back(StatisticsRow("ClearAirway", SC_CPH, MT_CPAP)); rows.push_back(StatisticsRow("FlowLimit", SC_CPH, MT_CPAP)); rows.push_back(StatisticsRow("RERA", SC_CPH, MT_CPAP)); rows.push_back(StatisticsRow("SensAwake", SC_CPH, MT_CPAP)); rows.push_back(StatisticsRow("CSR", SC_SPH, MT_CPAP)); rows.push_back(StatisticsRow(tr("Leak Statistics"), SC_SUBHEADING, MT_CPAP)); rows.push_back(StatisticsRow("Leak", SC_WAVG, MT_CPAP)); rows.push_back(StatisticsRow("Leak", SC_90P, MT_CPAP)); rows.push_back(StatisticsRow("Leak", SC_ABOVE, MT_CPAP)); rows.push_back(StatisticsRow(tr("Pressure Statistics"), SC_SUBHEADING, MT_CPAP)); rows.push_back(StatisticsRow("Pressure", SC_WAVG, MT_CPAP)); rows.push_back(StatisticsRow("Pressure", SC_MIN, MT_CPAP)); rows.push_back(StatisticsRow("Pressure", SC_MAX, MT_CPAP)); rows.push_back(StatisticsRow("Pressure", SC_90P, MT_CPAP)); rows.push_back(StatisticsRow("EPAP", SC_WAVG, MT_CPAP)); rows.push_back(StatisticsRow("EPAP", SC_MIN, MT_CPAP)); rows.push_back(StatisticsRow("EPAP", SC_MAX, MT_CPAP)); rows.push_back(StatisticsRow("IPAP", SC_WAVG, MT_CPAP)); rows.push_back(StatisticsRow("IPAP", SC_90P, MT_CPAP)); rows.push_back(StatisticsRow("IPAP", SC_MIN, MT_CPAP)); rows.push_back(StatisticsRow("IPAP", SC_MAX, MT_CPAP)); rows.push_back(StatisticsRow(tr("Oximeter Statistics"), SC_HEADING, MT_OXIMETER)); rows.push_back(StatisticsRow("", SC_DAYS, MT_OXIMETER)); rows.push_back(StatisticsRow("", SC_COLUMNHEADERS, MT_OXIMETER)); rows.push_back(StatisticsRow(tr("Blood Oxygen Saturation"), SC_SUBHEADING, MT_CPAP)); rows.push_back(StatisticsRow("SPO2", SC_WAVG, MT_OXIMETER)); rows.push_back(StatisticsRow("SPO2", SC_MIN, MT_OXIMETER)); rows.push_back(StatisticsRow("SPO2Drop", SC_CPH, MT_OXIMETER)); rows.push_back(StatisticsRow("SPO2Drop", SC_SPH, MT_OXIMETER)); rows.push_back(StatisticsRow(tr("Pulse Rate"), SC_SUBHEADING, MT_CPAP)); rows.push_back(StatisticsRow("Pulse", SC_WAVG, MT_OXIMETER)); rows.push_back(StatisticsRow("Pulse", SC_MIN, MT_OXIMETER)); rows.push_back(StatisticsRow("Pulse", SC_MAX, MT_OXIMETER)); rows.push_back(StatisticsRow("PulseChange", SC_CPH, MT_OXIMETER)); // These are for formatting the headers for the first column calcnames[SC_UNDEFINED] = ""; calcnames[SC_MEDIAN] = tr("%1 Median"); calcnames[SC_AVG] = tr("Average %1"); calcnames[SC_WAVG] = tr("Average %1"); calcnames[SC_90P] = tr("90% %1"); // this gets converted to whatever the upper percentile is set to calcnames[SC_MIN] = tr("Min %1"); calcnames[SC_MAX] = tr("Max %1"); calcnames[SC_CPH] = tr("%1 Index"); calcnames[SC_SPH] = tr("% of time in %1"); calcnames[SC_ABOVE] = tr("% of time above %1 threshold"); calcnames[SC_BELOW] = tr("% of time below %1 threshold"); machinenames[MT_UNKNOWN] = STR_TR_Unknown; machinenames[MT_CPAP] = STR_TR_CPAP; machinenames[MT_OXIMETER] = STR_TR_Oximetry; machinenames[MT_SLEEPSTAGE] = STR_TR_SleepStage; // { MT_JOURNAL, STR_TR_Journal }, // { MT_POSITION, STR_TR_Position }, } const QString table_width = "width=99%"; QString htmlHeader(bool showheader) { QString address = p_profile->user->address(); address.replace("\n", "
    "); QString userinfo; if (!p_profile->user->firstName().isEmpty()) { userinfo = QString(QObject::tr("Name: %1, %2")).arg(p_profile->user->lastName()).arg(p_profile->user->firstName()) + "
    "; if (!p_profile->user->DOB().isNull()) { userinfo += QString(QObject::tr("DOB: %1")).arg(p_profile->user->DOB().toString()) + "
    "; } if (!p_profile->user->phone().isEmpty()) { userinfo += QString(QObject::tr("Phone: %1")).arg(p_profile->user->phone()) + "
    "; } if (!p_profile->user->email().isEmpty()) { userinfo += QString(QObject::tr("Email: %1")).arg(p_profile->user->email()) + "

    "; } if (!p_profile->user->address().isEmpty()) { userinfo += QObject::tr("Address:")+"
    "+address; } } QString html = QString("")+ "" "" "" "" "" ""; if (showheader) { html += "
    " "" "" "
    "+userinfo+"" "" + STR_TR_SleepyHead + "
    " "" + QObject::tr("Usage Statistics") + "" "

    " "
    " "

    "; } return html; } QString htmlFooter(bool showinfo=true) { QString html; if (showinfo) { html += "
    "; html += QString(QObject::tr("This report was generated by a pre-release version of SleepyHead (%1), and has not been approved in any way for compliance or medical diagnostic purposes.")). arg(FullVersionString) + "

    " + QObject::tr("SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead"); html += "
    "; } html += ""; return html; } EventDataType calcAHI(QDate start, QDate end) { EventDataType val = (p_profile->calcCount(CPAP_Obstructive, MT_CPAP, start, end) + p_profile->calcCount(CPAP_Hypopnea, MT_CPAP, start, end) + p_profile->calcCount(CPAP_ClearAirway, MT_CPAP, start, end) + p_profile->calcCount(CPAP_Apnea, MT_CPAP, start, end)); if (p_profile->general->calculateRDI()) { val += p_profile->calcCount(CPAP_RERA, MT_CPAP, start, end); } EventDataType hours = p_profile->calcHours(MT_CPAP, start, end); if (hours > 0) { val /= hours; } else { val = 0; } return val; } EventDataType calcFL(QDate start, QDate end) { EventDataType val = (p_profile->calcCount(CPAP_FlowLimit, MT_CPAP, start, end)); EventDataType hours = p_profile->calcHours(MT_CPAP, start, end); if (hours > 0) { val /= hours; } else { val = 0; } return val; } EventDataType calcSA(QDate start, QDate end) { EventDataType val = (p_profile->calcCount(CPAP_SensAwake, MT_CPAP, start, end)); EventDataType hours = p_profile->calcHours(MT_CPAP, start, end); if (hours > 0) { val /= hours; } else { val = 0; } return val; } struct RXChange { RXChange() { highlight = 0; machine = nullptr; } RXChange(const RXChange ©) { first = copy.first; last = copy.last; days = copy.days; ahi = copy.ahi; fl = copy.fl; mode = copy.mode; min = copy.min; max = copy.max; ps = copy.ps; pshi = copy.pshi; maxipap = copy.maxipap; machine = copy.machine; per1 = copy.per1; per2 = copy.per2; highlight = copy.highlight; weighted = copy.weighted; pressure_string = copy.pressure_string; pr_relief_string = copy.pr_relief_string; } QDate first; QDate last; int days; EventDataType ahi; EventDataType fl; CPAPMode mode; QString pressure_string; QString pr_relief_string; EventDataType min; EventDataType max; EventDataType ps; EventDataType pshi; EventDataType maxipap; EventDataType per1; EventDataType per2; EventDataType weighted; Machine *machine; short highlight; }; //enum RXSortMode { RX_first, RX_last, RX_days, RX_ahi, RX_mode, RX_min, RX_max, RX_ps, RX_pshi, RX_maxipap, RX_per1, RX_per2, RX_weighted }; //RXSortMode RXsort = RX_first; //bool RXorder = false; /*bool operator<(const RXChange &c1, const RXChange &c2) { const RXChange *comp1 = &c1; const RXChange *comp2 = &c2; if (RXorder) { switch (RXsort) { case RX_ahi: return comp1->ahi < comp2->ahi; case RX_days: return comp1->days < comp2->days; case RX_first: return comp1->first < comp2->first; case RX_last: return comp1->last < comp2->last; case RX_mode: return comp1->mode < comp2->mode; case RX_min: return comp1->min < comp2->min; case RX_max: return comp1->max < comp2->max; case RX_ps: return comp1->ps < comp2->ps; case RX_pshi: return comp1->pshi < comp2->pshi; case RX_maxipap: return comp1->maxipap < comp2->maxipap; case RX_per1: return comp1->per1 < comp2->per1; case RX_per2: return comp1->per2 < comp2->per2; case RX_weighted: return comp1->weighted < comp2->weighted; }; } else { switch (RXsort) { case RX_ahi: return comp1->ahi > comp2->ahi; case RX_days: return comp1->days > comp2->days; case RX_first: return comp1->first > comp2->first; case RX_last: return comp1->last > comp2->last; case RX_mode: return comp1->mode > comp2->mode; case RX_min: return comp1->min > comp2->min; case RX_max: return comp1->max > comp2->max; case RX_ps: return comp1->ps > comp2->ps; case RX_pshi: return comp1->pshi > comp2->pshi; case RX_maxipap: return comp1->maxipap > comp2->maxipap; case RX_per1: return comp1->per1 > comp2->per1; case RX_per2: return comp1->per2 > comp2->per2; case RX_weighted: return comp1->weighted > comp2->weighted; }; } return true; } bool RXSort(const RXChange *comp1, const RXChange *comp2) { if (RXorder) { switch (RXsort) { case RX_ahi: return comp1->ahi < comp2->ahi; case RX_days: return comp1->days < comp2->days; case RX_first: return comp1->first < comp2->first; case RX_last: return comp1->last < comp2->last; case RX_mode: return comp1->mode < comp2->mode; case RX_min: return comp1->min < comp2->min; case RX_max: return comp1->max < comp2->max; case RX_ps: return comp1->ps < comp2->ps; case RX_pshi: return comp1->pshi < comp2->pshi; case RX_maxipap: return comp1->maxipap < comp2->maxipap; case RX_per1: return comp1->per1 < comp2->per1; case RX_per2: return comp1->per2 < comp2->per2; case RX_weighted: return comp1->weighted < comp2->weighted; }; } else { switch (RXsort) { case RX_ahi: return comp1->ahi > comp2->ahi; case RX_days: return comp1->days > comp2->days; case RX_first: return comp1->first > comp2->first; case RX_last: return comp1->last > comp2->last; case RX_mode: return comp1->mode > comp2->mode; case RX_min: return comp1->min > comp2->min; case RX_max: return comp1->max > comp2->max; case RX_ps: return comp1->ps > comp2->ps; case RX_pshi: return comp1->pshi > comp2->pshi; case RX_maxipap: return comp1->maxipap > comp2->maxipap; case RX_per1: return comp1->per1 > comp2->per1; case RX_per2: return comp1->per2 > comp2->per2; case RX_weighted: return comp1->weighted > comp2->weighted; }; } return true; } */ struct UsageData { UsageData() { ahi = 0; hours = 0; } UsageData(QDate d, EventDataType v, EventDataType h) { date = d; ahi = v; hours = h; } UsageData(const UsageData ©) { date = copy.date; ahi = copy.ahi; hours = copy.hours; } QDate date; EventDataType ahi; EventDataType hours; }; bool operator <(const UsageData &c1, const UsageData &c2) { if (c1.ahi < c2.ahi) { return true; } if ((c1.ahi == c2.ahi) && (c1.date > c2.date)) { return true; } return false; //return c1.value < c2.value; } struct Period { Period() { } Period(QDate start, QDate end, QString header) { this->start = start; this->end = end; this->header = header; } Period(const Period & copy) { start=copy.start; end=copy.end; header=copy.header; } QDate start; QDate end; QString header; }; const QString heading_color="#ffffff"; const QString subheading_color="#e0e0e0"; //const int rxthresh = 5; QString Statistics::GenerateMachineList() { QList cpap_machines = p_profile->GetMachines(MT_CPAP); QList oximeters = p_profile->GetMachines(MT_OXIMETER); QList mach; mach.append(cpap_machines); mach.append(oximeters); QString html; if (mach.size() > 0) { html += "

    "; html += QString(""); html += ""; html += ""; html += QString("") .arg(STR_TR_Brand) .arg(STR_TR_Series) .arg(STR_TR_Model) .arg(STR_TR_Serial) .arg(tr("First Use")) .arg(tr("Last Use")); html += ""; Machine *m; for (int i = 0; i < mach.size(); i++) { m = mach.at(i); if (m->type() == MT_JOURNAL) { continue; } QDate d1 = m->FirstDay(); QDate d2 = m->LastDay(); QString mn = m->modelnumber(); html += QString("") .arg(m->brand()) .arg(m->series()) .arg(m->model() + (mn.isEmpty() ? "" : QString(" (") + mn + QString(")"))) .arg(m->serial()) .arg(d1.toString(Qt::SystemLocaleShortDate)) .arg(d2.toString(Qt::SystemLocaleShortDate)); } html += "
    " + tr("Machine Information") + "
    %1%2%3%4%5%6
    %1%2%3%4%5%6
    "; html += "
    "; } return html; } QString Statistics::GenerateRXChanges() { updateRXChanges(); QString ahitxt; bool rdi = p_profile->general->calculateRDI(); if (rdi) { ahitxt = STR_TR_RDI; } else { ahitxt = STR_TR_AHI; } QString html = "

    "; html += QString(""); html += ""; html += ""; QString extratxt; QString tooltip; QStringList hdrlist; hdrlist.push_back(STR_TR_First); hdrlist.push_back(STR_TR_Last); hdrlist.push_back(tr("Days")); hdrlist.push_back(ahitxt); hdrlist.push_back(STR_TR_FL); hdrlist.push_back(STR_TR_Machine); hdrlist.push_back(tr("Pressure Relief")); hdrlist.push_back(STR_TR_Mode); hdrlist.push_back(tr("Pressure Settings")); html+="\n"; for (int i=0; i < hdrlist.size(); ++i) { html+=QString(" \n").arg(hdrlist.at(i)); } html+="\n"; html += ""; // html += ""; // html += ""; // html += ""; QMapIterator it(rxitems); it.toBack(); while (it.hasPrevious()) { it.previous(); const RXItem & rx = it.value(); QString color; if (rx.highlight == 1) { color = "#c0ffc0"; } else if (rx.highlight == 2) { color = "#e0ffe0"; } else if (rx.highlight == 3) { color = "#ffe0e0"; } else if (rx.highlight == 4) { color = "#ffc0c0"; } else { color = ""; } QString datarowclass; if (rx.highlight == 0) datarowclass="class=datarow"; html += QString("") .arg(color) .arg(rx.start.toString(Qt::ISODate)) .arg(rx.end.toString(Qt::ISODate)) .arg(datarowclass); double ahi = rdi ? (double(rx.rdi) / rx.hours) : (double(rx.ahi) /rx.hours); double fli = double(rx.count(CPAP_FlowLimit)) / rx. hours; html += QString("").arg(rx.start.toString())+ QString("").arg(rx.end.toString())+ QString("").arg(rx.days)+ QString("").arg(ahi, 0, 'f', 2)+ QString("").arg(fli, 0, 'f', 2)+ QString("").arg(rx.machine->loaderName())+ QString("").arg(rx.relief)+ QString("").arg(rx.mode)+ QString("").arg(rx.pressure)+ ""; } html+="
    " + tr("Changes to Prescription Settings") + "
    %1
    "; // html += QString("") + // tr("Efficacy highlighting ignores prescription settings with less than %1 days of recorded data."). // arg(rxthresh) + QString("
    "); // html += "
    %1%1%1%1%1%1%1%1%1
    "; return html; } QString Statistics::GenerateHTML() { QList cpap_machines = p_profile->GetMachines(MT_CPAP); QList oximeters = p_profile->GetMachines(MT_OXIMETER); QList mach; mach.append(cpap_machines); mach.append(oximeters); bool havedata = false; for (int i=0; i < mach.size(); ++i) { int daysize = mach[i]->day.size(); if (daysize > 0) { havedata = true; break; } } QString html = htmlHeader(havedata); // return ""; // Find first and last days with valid CPAP data QDate lastcpap = p_profile->LastGoodDay(MT_CPAP); QDate firstcpap = p_profile->FirstGoodDay(MT_CPAP); QDate cpapweek = lastcpap.addDays(-6); QDate cpapmonth = lastcpap.addDays(-29); QDate cpap6month = lastcpap.addMonths(-6); QDate cpapyear = lastcpap.addMonths(-12); if (cpapweek < firstcpap) { cpapweek = firstcpap; } if (cpapmonth < firstcpap) { cpapmonth = firstcpap; } if (cpap6month < firstcpap) { cpap6month = firstcpap; } if (cpapyear < firstcpap) { cpapyear = firstcpap; } if (!havedata) { html += "
    "; html += QString("
    ") + "" "

    " + tr("I can haz data?!?") + "

    "+ "

    "+tr("This lonely sleepy sheep has no data :(")+"

    " "
    "; html += htmlFooter(havedata); return html; } // int cpapdays = p_profile->countDays(MT_CPAP, firstcpap, lastcpap); // CPAPMode cpapmode = (CPAPMode)(int)p_profile->calcSettingsMax(CPAP_Mode, MT_CPAP, firstcpap, lastcpap); // float percentile = p_profile->general->prefCalcPercentile() / 100.0; // int mididx=p_profile->general->prefCalcMiddle(); // SummaryType ST_mid; // if (mididx==0) ST_mid=ST_PERC; // if (mididx==1) ST_mid=ST_WAVG; // if (mididx==2) ST_mid=ST_AVG; QString ahitxt; if (p_profile->general->calculateRDI()) { ahitxt = STR_TR_RDI; } else { ahitxt = STR_TR_AHI; } // int decimals = 2; html += "
    "; html += QString(""); int number_periods = 0; if (p_profile->general->statReportMode() == 1) { number_periods = p_profile->FirstDay().daysTo(p_profile->LastDay()) / 30; if (number_periods > 12) { number_periods = 12; } } QDate last = lastcpap, first = lastcpap; QList periods; bool skipsection = false;; for (QList::iterator i = rows.begin(); i != rows.end(); ++i) { StatisticsRow &row = (*i); QString name; if (row.calc == SC_HEADING) { // All sections begin with a heading last = p_profile->LastGoodDay(row.type); first = p_profile->FirstGoodDay(row.type); periods.clear(); if (p_profile->general->statReportMode() == 0) { periods.push_back(Period(last,last,tr("Most Recent"))); periods.push_back(Period(qMax(last.addDays(-6), first), last, tr("Last Week"))); periods.push_back(Period(qMax(last.addDays(-29),first), last, tr("Last 30 Days"))); periods.push_back(Period(qMax(last.addMonths(-6), first), last, tr("Last 6 Months"))); periods.push_back(Period(qMax(last.addMonths(-12), first), last, tr("Last Year"))); } else { QDate l=last,s=last; periods.push_back(Period(last,last,tr("Last Session"))); bool done=false; int j=0; do { s=QDate(l.year(), l.month(), 1); if (s < first) { done = true; s = first; } if (p_profile->countDays(row.type, s, l) > 0) { periods.push_back(Period(s, l, s.toString("MMMM"))); j++; } l = s.addDays(-1); } while ((l > first) && (j < number_periods)); // for (; j < number_periods; ++j) { // s=QDate(l.year(), l.month(), 1); // if (s < first) { // done = true; // s = first; // } // if (p_profile->countDays(row.type, s, l) > 0) { // periods.push_back(Period(s, l, s.toString("MMMM"))); // } else { // } // l = s.addDays(-1); // if (done || (l < first)) break; // } for (; j < number_periods; ++j) { periods.push_back(Period(last,last, "")); } } int days = p_profile->countDays(row.type, first, last); skipsection = (days == 0); if (days > 0) { html+=QString("\n"). arg(heading_color).arg(periods.size()+1).arg(row.src); } continue; } // Bypass this entire section if no data is present if (skipsection) continue; if (row.calc == SC_AHI) { name = ahitxt; } else if ((row.calc == SC_HOURS) || (row.calc == SC_COMPLIANCE)) { name = row.src; } else if (row.calc == SC_COLUMNHEADERS) { html += QString("\n").arg(tr("Details")); for (int j=0; j < periods.size(); j++) { html += QString("\n").arg(periods.at(j).start.toString(Qt::ISODate)).arg(periods.at(j).end.toString(Qt::ISODate)).arg(periods.at(j).header); } html += "\n"; continue; } else if (row.calc == SC_DAYS) { QDate first=p_profile->FirstGoodDay(row.type); QDate last=p_profile->LastGoodDay(row.type); QString & machine = machinenames[row.type]; int value=p_profile->countDays(row.type, first, last); if (value == 0) { html+=QString("\n").arg(periods.size()+1). arg(QString(tr("No %1 data available.")).arg(machine)); } else if (value == 1) { html+=QString("\n").arg(periods.size()+1). arg(QString(tr("%1 day of %2 Data on %3")) .arg(value) .arg(machine) .arg(last.toString())); } else { html+=QString("\n").arg(periods.size()+1). arg(QString(tr("%1 days of %2 Data, between %3 and %4")) .arg(value) .arg(machine) .arg(first.toString()) .arg(last.toString())); } continue; } else if (row.calc == SC_SUBHEADING) { // subheading.. html+=QString("\n"). arg(subheading_color).arg(periods.size()+1).arg(row.src); continue; } else if (row.calc == SC_UNDEFINED) { continue; } else { ChannelID id = schema::channel[row.src].id(); if ((id == NoChannel) || (!p_profile->channelAvailable(id))) { continue; } name = calcnames[row.calc].arg(schema::channel[id].fullname()); } QString line; line += QString("").arg(name); int np = periods.size(); int width; for (int j=0; j < np; j++) { if (p_profile->general->statReportMode() == 1) { width = j < np-1 ? 6 : 100 - (25 + 6*(np-1)); } else { width = 75/np; } line += QString(""; } html += line; html += "\n"; } html += "
    %3
    %1%3
    %2
    %2
    %2
    %3
    %1").arg(width); if (!periods.at(j).header.isEmpty()) { line += row.value(periods.at(j).start, periods.at(j).end); } else { line +=" "; } line += "
    "; html += "
    "; /* QList AHI; if (cpapdays > 0) { QDate first, last = lastcpap; CPAPMode mode = MODE_UNKNOWN, cmode = MODE_UNKNOWN; EventDataType cmin = 0, cmax = 0, cps = 0, cpshi = 0, cmaxipap = 0, min = 0, max = 0, maxipap = 0, ps = 0, pshi = 0; Machine *mach = nullptr, *lastmach = nullptr; QString last_prel_str, last_pressure_str, prel_str, pressure_str; QDate date = lastcpap; Day *day; bool lastchanged = false; QVector rxchange; EventDataType hours; int compliant = 0; do { day = p_profile->GetGoodDay(date, MT_CPAP); CPAPLoader * loader = nullptr; if (day) loader = dynamic_cast(day->machine(MT_CPAP)->loader()); if (day && loader) { lastchanged = false; hours = day->hours(MT_CPAP); if (hours > p_profile->cpap->complianceHours()) { compliant++; } EventDataType ahi = day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway); if (p_profile->general->calculateRDI()) { ahi += day->count(CPAP_RERA); } ahi /= hours; AHI.push_back(UsageData(date, ahi, hours)); prel_str = day->getPressureRelief(); pressure_str = day->getPressureSettings(); mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode)); if (mode ==0) { mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode)); } mach = day->machine(MT_CPAP); min = max = ps = pshi = maxipap = 0; if (mode == MODE_CPAP) { min = day->settings_min(CPAP_Pressure); } else if (mode == MODE_APAP) { min = day->settings_min(CPAP_PressureMin); max = day->settings_max(CPAP_PressureMax); } else if (mode == MODE_BILEVEL_FIXED) { min = day->settings_min(CPAP_EPAP); max = day->settings_max(CPAP_IPAP); ps = max-min; } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { min = day->settings_min(CPAP_EPAPLo); maxipap = max = day->settings_max(CPAP_IPAPHi); ps = day->settings_min(CPAP_PS); } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { // Similar pressure control as ASV Variable EPAP min = day->settings_min(CPAP_EPAPLo); max = day->settings_min(CPAP_EPAPHi); ps = day->settings_min(CPAP_PSMin); pshi = day->settings_max(CPAP_PSMax); maxipap = max = day->settings_max(CPAP_IPAPHi); } else if (mode == MODE_ASV) { min = day->settings_min(CPAP_EPAP); ps = day->settings_min(CPAP_PSMin); pshi = day->settings_max(CPAP_PSMax); maxipap = min+pshi; } else if (mode == MODE_ASV_VARIABLE_EPAP) { min = day->settings_min(CPAP_EPAPLo); max = day->settings_max(CPAP_EPAPHi); ps = day->settings_min(CPAP_PSMin); pshi = day->settings_max(CPAP_PSMax); maxipap = max + pshi; } if (lastmach == nullptr) { lastmach = mach; cmode = mode; last_pressure_str = pressure_str; last_prel_str = prel_str; } if ((mode != cmode) || (pressure_str != last_pressure_str) || (prel_str != last_prel_str) || (mach != lastmach)) { first = date.addDays(1); int days = p_profile->countDays(MT_CPAP, first, last); RXChange rx; rx.first = first; rx.last = last; rx.days = days; rx.ahi = calcAHI(first, last); rx.fl = calcFL(first, last); rx.mode = cmode; rx.pressure_string = last_pressure_str; rx.pr_relief_string = last_prel_str; rx.min = cmin; rx.max = cmax; rx.ps = cps; rx.pshi = cpshi; rx.maxipap = cmaxipap; rx.machine = lastmach; rx.per1 = 0; rx.per2 = 0; if (mode == MODE_APAP) { rx.per1 = p_profile->calcPercentile(CPAP_Pressure, percentile, MT_CPAP, first, last); rx.per2 = 0; } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_IPAP, percentile, MT_CPAP, first, last); } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); } else if (mode == MODE_ASV) { rx.per1 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); } else if (mode == MODE_ASV_VARIABLE_EPAP) { rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); } rx.weighted = float(rx.days) / float(cpapdays) * rx.ahi; rxchange.push_back(rx); cmode = mode; cmin = min; cmax = max; cps = ps; cpshi = pshi; cmaxipap = maxipap; last_prel_str = prel_str; last_pressure_str = pressure_str; last = date; lastmach = mach; lastchanged = true; } } date = date.addDays(-1); } while (date >= firstcpap); // Sort list by AHI qSort(AHI); lastchanged = false; // Add the final entry if (!lastchanged && (mach != nullptr)) { // last=date.addDays(1); first = firstcpap; int days = p_profile->countDays(MT_CPAP, first, last); RXChange rx; rx.first = first; rx.last = last; rx.days = days; rx.ahi = calcAHI(first, last); rx.fl = calcFL(first, last); rx.mode = mode; rx.min = min; rx.max = max; rx.ps = ps; rx.pshi = pshi; rx.maxipap = maxipap; rx.machine = mach; rx.pressure_string = pressure_str; rx.pr_relief_string = prel_str; // Todo: Clean up by Calculating this crap later.. if (mode == MODE_APAP) { rx.per1 = p_profile->calcPercentile(CPAP_Pressure, percentile, MT_CPAP, first, last); rx.per2 = 0; } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_IPAP, percentile, MT_CPAP, first, last); } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); } else if (mode == MODE_ASV) { rx.per1 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); } else if (mode == MODE_ASV_VARIABLE_EPAP) { rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last); rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last); } rx.weighted = float(rx.days) / float(cpapdays); //rx.weighted=float(days)*rx.ahi; rxchange.push_back(rx); } int rxthresh = 5; QVector tmpRX; for (int i = 0; i < rxchange.size(); i++) { RXChange &rx = rxchange[i]; if (rx.days >= rxthresh) { tmpRX.push_back(&rx); } } QString recbox = ""; recbox += ""; int numdays = AHI.size(); if (numdays > 1) { int z = numdays / 2; if (z > 4) { z = 4; } recbox += QString("").arg( tr("Usage Information")); recbox += QString("").arg(tr("Total Days")).arg( numdays); if (p_profile->cpap->showComplianceInfo()) { recbox += QString("").arg(tr("Compliant Days")).arg( compliant); } int highahi = 0; for (int i = 0; i < numdays; i++) { if (AHI.at(i).ahi > 5.0) { highahi++; } } recbox += QString("").arg(tr("Days AHI >5.0")).arg( highahi); recbox += QString(""); recbox += QString("").arg(tr("Best %1").arg( ahitxt)); for (int i = 0; i < z; i++) { const UsageData &a = AHI.at(i); recbox += QString("") .arg(a.date.toString(Qt::ISODate)) .arg(a.date.toString(Qt::SystemLocaleShortDate)) .arg(a.ahi, 0, 'f', decimals); } recbox += QString(""); recbox += QString("").arg( tr("Worst %1").arg(ahitxt)); for (int i = 0; i < z; i++) { const UsageData &a = AHI.at((numdays - 1) - i); recbox += QString("") .arg(a.date.toString(Qt::ISODate)) .arg(a.date.toString(Qt::SystemLocaleShortDate)) .arg(a.ahi, 0, 'f', decimals); } recbox += QString(""); } if (tmpRX.size() > 0) { RXsort = RX_ahi; qSort(tmpRX.begin(), tmpRX.end(), RXSort); tmpRX[0]->highlight = 4; // worst int ls = tmpRX.size() - 1; tmpRX[ls]->highlight = 1; //best QString modestr; QString idxstr[2]; int idx[2]; idx[0]=ls; idx[1]=0; idxstr[0]=tr("Best RX Setting"); idxstr[1]=tr("Worst RX Setting"); for (int i=0; i<2; ++i ) { int i2 = idx[i]; if ((i==1) && (ls == 0)) break; CPAPMode mode = (CPAPMode)(int)p_profile->calcSettingsMax(CPAP_Mode, MT_CPAP, tmpRX[i2]->first, tmpRX[i2]->last); if (mode == MODE_CPAP) { modestr = STR_TR_CPAP; } else if (mode == MODE_APAP) { // is AUTO? modestr = STR_TR_APAP; } else if (mode == MODE_BILEVEL_FIXED) { modestr = STR_TR_BiLevel; } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { modestr = QObject::tr("Auto Bi-Level"); } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { modestr = QObject::tr("Auto Bi-Level"); } else if (mode == MODE_ASV) { modestr = QObject::tr("ASV Fixed EPAP"); } else if (mode == MODE_ASV_VARIABLE_EPAP) { modestr = QObject::tr("ASV Auto EPAP"); } else modestr = STR_TR_Unknown; recbox += QString(""; } } recbox += "
    %1
    %1%2
    %1%2
    %1%2
     
    %1
    %2%3
     
    %1
    %2%3
     
    ") .arg(idxstr[i]); recbox += QString("") .arg(tmpRX[i2]->first.toString(Qt::ISODate)) .arg(tmpRX[i2]->last.toString(Qt::ISODate)) .arg(tmpRX[i2]->first.toString(Qt::SystemLocaleShortDate)) .arg(tmpRX[i2]->last.toString(Qt::SystemLocaleShortDate)); recbox += QString("").arg(ahitxt).arg(tmpRX[i2]->ahi, 0, 'f', decimals); recbox += QString("").arg(STR_TR_Mode).arg(modestr); if (mode == MODE_CPAP) { recbox += QString("").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O); } else if (mode == MODE_APAP) { recbox += QString("").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O); recbox += QString("").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O); } else if (mode == MODE_BILEVEL_FIXED) { recbox += QString("").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O); recbox += QString("").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O); } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { recbox += QString("").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O); recbox += QString("").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O); recbox += QString("").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(STR_UNIT_CMH2O); } else if (mode == MODE_ASV) { recbox += QString("").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O); recbox += QString("").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(tmpRX[i2]->pshi, 0, 'f', 1).arg(STR_UNIT_CMH2O); // recbox += QString("").arg(tmpRX[i2]->maxipap, 0, 'f', 1).arg(STR_UNIT_CMH2O); } else if (mode == MODE_ASV_VARIABLE_EPAP) { recbox += QString("").arg(tmpRX[i2]->min, 0, 'f', 1).arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O); recbox += QString("").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(tmpRX[i2]->pshi, 0, 'f', 1).arg(STR_UNIT_CMH2O); // recbox += QString("").arg(tmpRX[i2]->maxipap, 0, 'f', 1).arg(STR_UNIT_CMH2O); } recbox += "
    %3
    ") + STR_TR_Start + "
    " + STR_TR_End + QString("
    %3
    %4
    %1%2
    %1%2
    ")+QObject::tr("Fixed")+QString("%1%2
    ")+QObject::tr("Min")+QString("%1%2
    ")+QObject::tr("Max")+QString("%1%2
    ")+QObject::tr("EPAP")+QString("%1%2
    ")+QObject::tr("IPAP")+QString("%1%2
    ")+QObject::tr("Min EPAP")+QString("%1%2
    ")+QObject::tr("Max IPAP")+QString("%1%2
    ")+QObject::tr("PS")+QString("%1%2
    ")+QObject::tr("EPAP")+QString("%1%2
    ")+QObject::tr("PS")+QString("%1-%2%3
    ")+QObject::tr("Max IPAP")+QString("%1%2
    ")+QObject::tr("EPAP")+QString("%1-%2%3
    ")+QObject::tr("PS")+QString("%1-%2%3
    ")+QObject::tr("Max IPAP")+QString("%1%2

    "; recbox += ""; mainwin->setRecBoxHTML(recbox); */ /*RXsort=RX_min; RXorder=true; qSort(rxchange.begin(),rxchange.end());*/ /* html += "

    "; html += QString(""); html += ""; html += ""; QString extratxt; QString tooltip; QStringList hdrlist; hdrlist.push_back(STR_TR_First); hdrlist.push_back(STR_TR_Last); hdrlist.push_back(tr("Days")); hdrlist.push_back(ahitxt); hdrlist.push_back(STR_TR_FL); if (p_profile->hasChannel(CPAP_SensAwake)) { hdrlist.push_back(STR_TR_SA); } hdrlist.push_back(STR_TR_Machine); hdrlist.push_back(tr("Pressure Relief")); hdrlist.push_back(STR_TR_Mode); hdrlist.push_back(tr("Pressure Settings")); html+="\n"; for (int i=0; i < hdrlist.size(); ++i) { html+=QString(" \n").arg(hdrlist.at(i)); } html+="\n"; html += ""; html += ""; html += ""; html += ""; for (int i = 0; i < rxchange.size(); i++) { RXChange rx = rxchange.at(i); QString color; if (rx.highlight == 1) { color = "#c0ffc0"; } else if (rx.highlight == 2) { color = "#e0ffe0"; } else if (rx.highlight == 3) { color = "#ffe0e0"; } else if (rx.highlight == 4) { color = "#ffc0c0"; } else { color = ""; } QString machstr; if (!rx.machine->brand().isEmpty()) { machstr += rx.machine->brand(); } if (!rx.machine->model().isEmpty()) { machstr += " " + rx.machine->model(); } if (!rx.machine->serial().isEmpty()) { machstr += " (" + rx.machine->serial() + ")
    "; } mode = rx.mode; extratxt = "
    " + tr("Changes to Prescription Settings") + "
    %1
    "; html += QString("") + tr("Efficacy highlighting ignores prescription settings with less than %1 days of recorded data."). arg(rxthresh) + QString("
    "); html += "
    "; //cellpadding=0 cellspacing=0 // tooltip=QString("%1 %2% ").arg(machstr).arg(percentile*100.0)+STR_TR_EPAP+ // QString("=%1
    %2% ").arg(rx.per1,0,'f',decimals).arg(percentile*100.0)+ // STR_TR_IPAP+QString("=%1").arg(rx.per2,0,'f',decimals); tooltip = QString("%1").arg(machstr); extratxt += ""; // if (mode == MODE_CPAP) { // extratxt += "").arg(rx.min, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()); // } else if (mode == MODE_APAP) { // extratxt += "").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()); // } else if (mode == MODE_BILEVEL_FIXED) { // extratxt += "").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()); // } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { // extratxt += "").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()).arg(rx.ps, 4, 'f', 1); // } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { // extratxt += "").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()); // } else if (mode == MODE_ASV) { // extratxt += "").arg(rx.min, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()); // tooltip = QString("%1 %2% ").arg(machstr).arg(percentile * 100.0) + // STR_TR_EPAP + // QString("=%1
    %2% ").arg(rx.per1, 0, 'f', decimals) // .arg(percentile * 100.0) // + STR_TR_IPAP + QString("=%1").arg(rx.per2, 0, 'f', decimals); // } else if (mode == MODE_ASV_VARIABLE_EPAP) { // extratxt += "").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()); // tooltip = QString("%1 %2% ").arg(machstr).arg(percentile * 100.0) + // STR_TR_EPAP + // QString("=%1
    %2% ").arg(rx.per1, 0, 'f', decimals) // .arg(percentile * 100.0) // + STR_TR_IPAP + QString("=%1").arg(rx.per2, 0, 'f', decimals); // } else { // extratxt += ""; // tooltip = ""; // } extratxt += "
    "+rx.pressure_string+""+QString(tr("Fixed %1 %2")+""+QString(tr("%1 - %2 %3")+""+QString(tr("EPAP %1 %3 IPAP %2 %3")+""+QString(tr("PS %4 over %1 - %2 %3")+""+QString(tr("EPAP %1-%2, PS %3-%4 %5")+""+QString(tr("EPAP %1, PS %2-%3 %4")+""+QString(tr("EPAP %1-%2, PS %3-%4 %5")+"
    "; QString tooltipshow, tooltiphide; if (!tooltip.isEmpty()) { tooltipshow = QString("tooltip.show(\"%1\");").arg(tooltip); tooltiphide = "tooltip.hide();"; } QString datarowclass; if (rx.highlight == 0) datarowclass="class=datarow"; html += QString("") .arg(color) .arg(tooltipshow) .arg(tooltiphide) .arg(rx.first.toString(Qt::ISODate)) .arg(rx.last.toString(Qt::ISODate)) .arg(datarowclass); html += QString("%1").arg(rx.first.toString(Qt::SystemLocaleShortDate)); html += QString("%1").arg(rx.last.toString(Qt::SystemLocaleShortDate)); html += QString("%1").arg(rx.days); html += QString("%1").arg(rx.ahi, 0, 'f', decimals); html += QString("%1").arg(rx.fl, 0, 'f', decimals); // Not the best way to do this.. Todo: Add an extra field for data.. if (p_profile->hasChannel(CPAP_SensAwake)) { html += QString("%1").arg(calcSA(rx.first, rx.last), 0, 'f', decimals); } html += QString("%1").arg(rx.machine->loaderName()); html += QString("%1").arg(rx.pr_relief_string); html += QString("%1").arg(schema::channel[CPAP_Mode].option(int(rx.mode))); html += QString("%1").arg(extratxt); html += ""; } html += ""; html += "
    "; } */ html += GenerateRXChanges(); html += GenerateMachineList(); UpdateRecordsBox(); html += ""; //updateFavourites(); html += htmlFooter(); return html; } void Statistics::UpdateRecordsBox() { QString html = ""; Machine * cpap = p_profile->GetMachine(MT_CPAP); if (cpap) { QDate first = p_profile->FirstGoodDay(MT_CPAP); QDate last = p_profile->LastGoodDay(MT_CPAP); ///////////////////////////////////////////////////////////////////////////////////// /// Compliance and usage information ///////////////////////////////////////////////////////////////////////////////////// int totaldays = p_profile->countDays(MT_CPAP, first, last); int compliant = p_profile->countCompliantDays(MT_CPAP, first, last); float comperc = (100.0 / float(totaldays)) * float(compliant); html += ""+QObject::tr("CPAP Usage")+"
    "; html += QObject::tr("Days Used: %1").arg(totaldays) + "
    "; html += QObject::tr("Low Use Days: %1").arg(totaldays - compliant) + "
    "; html += QObject::tr("Compliance: %1%").arg(comperc, 0, 'f', 1) + "
    "; ///////////////////////////////////////////////////////////////////////////////////// /// AHI Records ///////////////////////////////////////////////////////////////////////////////////// if (p_profile->session->preloadSummaries()) { const int show_records = 5; QMultiMap::iterator it; QMultiMap::iterator it_end; QMultiMap ahilist; int baddays = 0; for (QDate date = first; date <= last; date = date.addDays(1)) { Day * day = p_profile->GetGoodDay(date, MT_CPAP); if (!day) continue; float ahi = day->calcAHI(); if (ahi >= 5) { baddays++; } ahilist.insert(ahi, date); } html += QObject::tr("Days AHI of 5 or greater: %1").arg(baddays) + "

    "; if (ahilist.size() > (show_records * 2)) { it = ahilist.begin(); it_end = ahilist.end(); html += ""+QObject::tr("Best AHI")+"
    "; for (int i=0; (i").arg(it.value().toString(Qt::ISODate)) +QObject::tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "
    "; } html += "
    "; html += ""+QObject::tr("Worst AHI")+"
    "; it = ahilist.end() - 1; it_end = ahilist.begin(); for (int i=0; (i").arg(it.value().toString(Qt::ISODate)) +QObject::tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "
    "; } html += "
    "; } ///////////////////////////////////////////////////////////////////////////////////// /// Flow Limitation Records ///////////////////////////////////////////////////////////////////////////////////// ahilist.clear(); for (QDate date = first; date <= last; date = date.addDays(1)) { Day * day = p_profile->GetGoodDay(date, MT_CPAP); if (!day) continue; float val = 0; if (day->channelHasData(CPAP_FlowLimit)) { val = day->calcIdx(CPAP_FlowLimit); } else if (day->channelHasData(CPAP_FLG)) { // Use 90th percentile val = day->calcPercentile(CPAP_FLG); } ahilist.insert(val, date); } int cnt = 0; if (ahilist.size() > (show_records * 2)) { it = ahilist.begin(); it_end = ahilist.end(); html += ""+QObject::tr("Best Flow Limitation")+"
    "; for (int i=0; (i").arg(it.value().toString(Qt::ISODate)) +QObject::tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "
    "; } html += "
    "; html += ""+QObject::tr("Worst Flow Limtation")+"
    "; it = ahilist.end() - 1; it_end = ahilist.begin(); for (int i=0; (i 0) { html += QString("").arg(it.value().toString(Qt::ISODate)) +QObject::tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "
    "; cnt++; } } if (cnt == 0) { html+= ""+QObject::tr("No Flow Limitation on record")+"
    "; } html += "
    "; } ///////////////////////////////////////////////////////////////////////////////////// /// Large Leak Records ///////////////////////////////////////////////////////////////////////////////////// ahilist.clear(); for (QDate date = first; date <= last; date = date.addDays(1)) { Day * day = p_profile->GetGoodDay(date, MT_CPAP); if (!day) continue; float leak = day->calcPON(CPAP_LargeLeak); ahilist.insert(leak, date); } cnt = 0; if (ahilist.size() > (show_records * 2)) { html += ""+QObject::tr("Worst Large Leaks")+"
    "; it = ahilist.end() - 1; it_end = ahilist.begin(); for (int i=0; (i 0) { html += QString("").arg(it.value().toString(Qt::ISODate)) +QObject::tr("Date: %1 Leak: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "
    "; cnt++; } } if (cnt == 0) { html+= ""+QObject::tr("No Large Leaks on record")+"
    "; } html += "
    "; } ///////////////////////////////////////////////////////////////////////////////////// /// ÇSR Records ///////////////////////////////////////////////////////////////////////////////////// cnt = 0; if (p_profile->hasChannel(CPAP_CSR)) { ahilist.clear(); for (QDate date = first; date <= last; date = date.addDays(1)) { Day * day = p_profile->GetGoodDay(date, MT_CPAP); if (!day) continue; float leak = day->calcPON(CPAP_CSR); ahilist.insert(leak, date); } if (ahilist.size() > (show_records * 2)) { html += ""+QObject::tr("Worst CSR")+"
    "; it = ahilist.end() - 1; it_end = ahilist.begin(); for (int i=0; (i 0) { html += QString("").arg(it.value().toString(Qt::ISODate)) +QObject::tr("Date: %1 CSR: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "
    "; cnt++; } } if (cnt == 0) { html+= ""+QObject::tr("No CSR on record")+"
    "; } html += "
    "; } } } else { html += "
    "+QObject::tr("Want more information?")+"
    "; html += ""+QObject::tr("SleepyHead needs all summary data loaded to calculate best/worst data for individual days.")+"

    "; html += ""+QObject::tr("Please enable Pre-Load Summaries checkbox in preferences to make sure this data is available.")+"

    "; } ///////////////////////////////////////////////////////////////////////////////////// /// Sort the RX list to get best and worst settings. ///////////////////////////////////////////////////////////////////////////////////// QList list; QMap::iterator ri_end = rxitems.end(); QMap::iterator ri; for (ri = rxitems.begin(); ri != ri_end; ++ri) { list.append(&ri.value()); ri.value().highlight = 0; } qSort(list.begin(), list.end(), rxAHILessThan); if (list.size() >= 2) { html += ""+QObject::tr("Best RX Setting")+"
    "; const RXItem & rxbest = *list.at(0); html += QString("").arg(rxbest.start.toString(Qt::ISODate)).arg(rxbest.end.toString(Qt::ISODate)) + QObject::tr("Date: %1 - %2").arg(rxbest.start.toString(Qt::SystemLocaleShortDate)).arg(rxbest.end.toString(Qt::SystemLocaleShortDate)) + "
    "; html += QString("%1").arg(rxbest.machine->model()) + "
    "; html += QString("Serial: %1").arg(rxbest.machine->serial()) + "
    "; html += QObject::tr("Culminative AHI: %1").arg(double(rxbest.ahi) / rxbest.hours, 0, 'f', 2) + "
    "; html += QObject::tr("Culminative Hours: %1").arg(rxbest.hours, 0, 'f', 2) + "
    "; html += QString("%1").arg(rxbest.pressure) + "
    "; html += QString("%1").arg(rxbest.relief) + "
    "; html += "
    "; html += ""+QObject::tr("Worst RX Setting")+"
    "; const RXItem & rxworst = *list.at(list.size() -1); html += QString("").arg(rxworst.start.toString(Qt::ISODate)).arg(rxworst.end.toString(Qt::ISODate)) + QObject::tr("Date: %1 - %2").arg(rxworst.start.toString(Qt::SystemLocaleShortDate)).arg(rxworst.end.toString(Qt::SystemLocaleShortDate)) + "
    "; html += QString("%1").arg(rxworst.machine->model()) + "
    "; html += QString("Serial: %1").arg(rxworst.machine->serial()) + "
    "; html += QObject::tr("Culminative AHI: %1").arg(double(rxworst.ahi) / rxworst.hours, 0, 'f', 2) + "
    "; html += QObject::tr("Culminative Hours: %1").arg(rxworst.hours, 0, 'f', 2) + "
    "; html += QString("%1").arg(rxworst.pressure) + "
    "; html += QString("%1").arg(rxworst.relief) + "
    "; } } html += ""; mainwin->setRecBoxHTML(html); } QString StatisticsRow::value(QDate start, QDate end) { const int decimals=2; QString value; float days = p_profile->countDays(type, start, end); // Handle special data sources first if (calc == SC_AHI) { value = QString("%1").arg(calcAHI(start, end), 0, 'f', decimals); } else if (calc == SC_HOURS) { value = QString("%1").arg(formatTime(p_profile->calcHours(type, start, end) / days)); } else if (calc == SC_COMPLIANCE) { float c = p_profile->countCompliantDays(type, start, end); float p = (100.0 / days) * c; value = QString("%1%").arg(p, 0, 'f', 0); } else if (calc == SC_DAYS) { value = QString("%1").arg(p_profile->countDays(type, start, end)); } else if ((calc == SC_COLUMNHEADERS) || (calc == SC_SUBHEADING) || (calc == SC_UNDEFINED)) { } else { // ChannelID code=channel(); EventDataType val = 0; QString fmt = "%1"; if (code != NoChannel) { switch(calc) { case SC_AVG: val = p_profile->calcAvg(code, type, start, end); break; case SC_WAVG: val = p_profile->calcWavg(code, type, start, end); break; case SC_MEDIAN: val = p_profile->calcPercentile(code, 0.5F, type, start, end); break; case SC_90P: val = p_profile->calcPercentile(code, 0.9F, type, start, end); break; case SC_MIN: val = p_profile->calcMin(code, type, start, end); break; case SC_MAX: val = p_profile->calcMax(code, type, start, end); break; case SC_CPH: val = p_profile->calcCount(code, type, start, end) / p_profile->calcHours(type, start, end); break; case SC_SPH: fmt += "%"; val = 100.0 / p_profile->calcHours(type, start, end) * p_profile->calcSum(code, type, start, end) / 3600.0; break; case SC_ABOVE: fmt += "%"; val = 100.0 / p_profile->calcHours(type, start, end) * (p_profile->calcAboveThreshold(code, schema::channel[code].upperThreshold(), type, start, end) / 60.0); break; case SC_BELOW: fmt += "%"; val = 100.0 / p_profile->calcHours(type, start, end) * (p_profile->calcBelowThreshold(code, schema::channel[code].lowerThreshold(), type, start, end) / 60.0); break; default: break; }; } if ((val == std::numeric_limits::min()) || (val == std::numeric_limits::max())) { value = "Err"; } else { value = fmt.arg(val, 0, 'f', decimals); } } return value; } sleepyhead-0.9.8/sleepyhead/Graphs/0000755000175000017500000000000012412506713016565 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/Graphs/gGraph.cpp0000644000175000017500000011275312412506713020512 0ustar sergiosergio/* gGraph Implemntation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "Graphs/gGraph.h" #include #include #include #include #include "mainwindow.h" #include "Graphs/gGraphView.h" #include "Graphs/layer.h" #include "SleepLib/profiles.h" extern MainWindow *mainwin; // Graph globals. QFont *defaultfont = nullptr; QFont *mediumfont = nullptr; QFont *bigfont = nullptr; QHash images; static bool globalsInitialized = false; // Graph constants. static const double zoom_hard_limit = 500.0; // Must be called from a thread inside the application. bool InitGraphGlobals() { if (globalsInitialized) { return true; } if (!PREF.contains("Fonts_Graph_Name")) { PREF["Fonts_Graph_Name"] = "Sans Serif"; PREF["Fonts_Graph_Size"] = 10; PREF["Fonts_Graph_Bold"] = false; PREF["Fonts_Graph_Italic"] = false; } if (!PREF.contains("Fonts_Title_Name")) { PREF["Fonts_Title_Name"] = "Sans Serif"; PREF["Fonts_Title_Size"] = 14; PREF["Fonts_Title_Bold"] = true; PREF["Fonts_Title_Italic"] = false; } if (!PREF.contains("Fonts_Big_Name")) { PREF["Fonts_Big_Name"] = "Serif"; PREF["Fonts_Big_Size"] = 35; PREF["Fonts_Big_Bold"] = false; PREF["Fonts_Big_Italic"] = false; } defaultfont = new QFont(PREF["Fonts_Graph_Name"].toString(), PREF["Fonts_Graph_Size"].toInt(), PREF["Fonts_Graph_Bold"].toBool() ? QFont::Bold : QFont::Normal, PREF["Fonts_Graph_Italic"].toBool() ); mediumfont = new QFont(PREF["Fonts_Title_Name"].toString(), PREF["Fonts_Title_Size"].toInt(), PREF["Fonts_Title_Bold"].toBool() ? QFont::Bold : QFont::Normal, PREF["Fonts_Title_Italic"].toBool() ); bigfont = new QFont(PREF["Fonts_Big_Name"].toString(), PREF["Fonts_Big_Size"].toInt(), PREF["Fonts_Big_Bold"].toBool() ? QFont::Bold : QFont::Normal, PREF["Fonts_Big_Italic"].toBool() ); defaultfont->setStyleHint(QFont::AnyStyle, QFont::OpenGLCompatible); mediumfont->setStyleHint(QFont::AnyStyle, QFont::OpenGLCompatible); bigfont->setStyleHint(QFont::AnyStyle, QFont::OpenGLCompatible); //images["mask"] = new QImage(":/icons/mask.png"); images["oximeter"] = new QImage(":/icons/cubeoximeter.png"); images["smiley"] = new QImage(":/icons/smileyface.png"); //images["sad"] = new QImage(":/icons/sadface.png"); images["sheep"] = new QImage(":/icons/sheep.png"); images["brick"] = new QImage(":/icons/brick.png"); images["nographs"] = new QImage(":/icons/nographs.png"); images["nodata"] = new QImage(":/icons/nodata.png"); globalsInitialized = true; return true; } void DestroyGraphGlobals() { if (!globalsInitialized) { return; } delete defaultfont; delete bigfont; delete mediumfont; for (QHash::iterator i = images.begin(); i != images.end(); i++) { delete i.value(); } globalsInitialized = false; } gGraph::gGraph(QString name, gGraphView *graphview, QString title, QString units, int height, short group) : m_name(name), m_graphview(graphview), m_title(title), m_units(units), m_visible(true) { if (height == 0) { height = p_profile->appearance->graphHeight(); } if (graphview && graphview->contains(name)) { qDebug() << "Trying to duplicate " << name << " when a graph with the same name already exists"; name+="-1"; } m_min_height = 60; m_width = 0; m_layers.clear(); m_snapshot = false; f_miny = f_maxy = 0; rmin_x = rmin_y = 0; rmax_x = rmax_y = 0; max_x = max_y = 0; min_x = min_y = 0; rec_miny = rec_maxy = 0; rphysmax_y = rphysmin_y = 0; m_zoomY = 0; m_selectedDuration = 0; if (graphview) { graphview->addGraph(this, group); timer = new QTimer(graphview); connect(timer, SIGNAL(timeout()), SLOT(Timeout())); } else { timer = new QTimer(); connect(timer, SIGNAL(timeout()), SLOT(Timeout())); // know what I'm doing now.. ;) // qWarning() << "gGraph created without a gGraphView container.. Naughty programmer!! Bad!!!"; } m_margintop = 14; m_marginbottom = 5; m_marginleft = 0; m_marginright = 15; m_selecting_area = m_blockzoom = false; m_pinned = false; m_lastx23 = 0; invalidate_yAxisImage = true; invalidate_xAxisImage = true; m_block_select = false; m_enforceMinY = m_enforceMaxY = false; m_showTitle = true; m_printing = false; } gGraph::~gGraph() { for (int i = 0; i < m_layers.size(); i++) { if (m_layers[i]->unref()) { delete m_layers[i]; } } m_layers.clear(); if (timer) { timer->stop(); disconnect(timer, 0, 0, 0); delete timer; } } void gGraph::Trigger(int ms) { if (timer->isActive()) { timer->stop(); } timer->setSingleShot(true); timer->start(ms); } void gGraph::Timeout() { deselect(); m_graphview->timedRedraw(0); } void gGraph::deselect() { for (QVector::iterator l = m_layers.begin(); l != m_layers.end(); l++) { (*l)->deselect(); } } bool gGraph::isSelected() { bool res = false; for (QVector::iterator l = m_layers.begin(); l != m_layers.end(); l++) { res = (*l)->isSelected(); if (res) { break; } } return res; } bool gGraph::isEmpty() { bool empty = true; for (QVector::iterator l = m_layers.begin(); l != m_layers.end(); l++) { if (!(*l)->isEmpty()) { empty = false; break; } } return empty; } float gGraph::printScaleX() { return m_graphview->printScaleX(); } float gGraph::printScaleY() { return m_graphview->printScaleY(); } //void gGraph::drawGLBuf() //{ // float linesize = 1; // if (m_printing) { linesize = 4; } //ceil(m_graphview->printScaleY()); // for (int i = 0; i < m_layers.size(); i++) { // m_layers[i]->drawGLBuf(linesize); // } //} void gGraph::setDay(Day *day) { // Don't update for snapshots.. if (m_snapshot) return; m_day = day; for (int i = 0; i < m_layers.size(); i++) { m_layers[i]->SetDay(day); } rmin_y = rmax_y = 0; ResetBounds(); } void gGraph::setZoomY(short zoom) { m_zoomY = zoom; timedRedraw(0); } void gGraph::renderText(QString text, int x, int y, float angle, QColor color, QFont *font, bool antialias) { m_graphview->AddTextQue(text, x, y, angle, color, font, antialias); } void gGraph::renderText(QString text, QRectF rect, quint32 flags, float angle, QColor color, QFont *font, bool antialias) { m_graphview->AddTextQue(text, rect, flags, angle, color, font, antialias); } void gGraph::paint(QPainter &painter, const QRegion ®ion) { m_rect = region.boundingRect(); int originX = m_rect.left(); int originY = m_rect.top(); int width = m_rect.width(); int height = m_rect.height(); int fw, font_height; GetTextExtent("Wg@", fw, font_height); if (m_margintop > 0) { m_margintop = font_height + (2*printScaleY()); } //m_marginbottom=5; left = marginLeft()*printScaleX(), right = marginRight()*printScaleX(), top = marginTop(), bottom = marginBottom() * printScaleY(); int x = 0, y = 0; if (m_showTitle) { int title_x, yh; painter.setFont(*mediumfont); QFontMetrics fm(*mediumfont); yh = fm.height(); //GetTextExtent("Wy@",x,yh,mediumfont); // This gets a better consistent height. should be cached. y = yh; x = fm.width(title()); //GetTextExtent(title(),x,y,mediumfont); title_x = float(yh) ; QString & txt = title(); graphView()->AddTextQue(txt, marginLeft() + title_x + 8*printScaleX(), originY + height / 2 - y / 2, 90, Qt::black, mediumfont); left += graphView()->titleWidth*printScaleX(); } else { left = 0; } if (m_snapshot) { QLinearGradient linearGrad(QPointF(100, 100), QPointF(width / 2, 100)); linearGrad.setColorAt(0, QColor(255, 150, 150,40)); linearGrad.setColorAt(1, QColor(255,255,255,20)); painter.fillRect(m_rect, QBrush(linearGrad)); painter.setFont(*defaultfont); painter.setPen(QColor(0,0,0,255)); QString t = name().section(";", -1); QString txt = QObject::tr("Snapshot %1").arg(t); QRectF rec = QRect(m_rect.left(),m_rect.top()+6*printScaleY(), m_rect.width(), 0); rec = painter.boundingRect(rec, Qt::AlignCenter, txt); painter.drawText(rec, Qt::AlignCenter, txt); m_margintop += rec.height(); top = m_margintop; } #ifdef DEBUG_LAYOUT QColor col = Qt::red; painter.setPen(col); painter.drawLine(0, originY, 0, originY + height); painter.drawLine(left, originY, left, originY + height); #endif int tmp; // left = 0; for (int i = 0; i < m_layers.size(); i++) { Layer *ll = m_layers[i]; if (!ll->visible()) { continue; } tmp = ll->minimumHeight();// * m_graphview->printScaleY(); if (ll->position() == LayerTop) { top += tmp; } if (ll->position() == LayerBottom) { bottom += tmp * printScaleY(); } } for (int i = 0; i < m_layers.size(); i++) { Layer *ll = m_layers[i]; if (!ll->visible()) { continue; } tmp = ll->minimumWidth(); tmp *= m_graphview->printScaleX(); tmp *= m_graphview->devicePixelRatio(); if (ll->position() == LayerLeft) { QRect rect(originX + left, originY + top, tmp, height - top - bottom); ll->m_rect = rect; // ll->paint(painter, *this, QRegion(rect)); left += tmp; #ifdef DEBUG_LAYOUT QColor col = Qt::red; painter.setPen(col); painter.drawLine(originX + left - 1, originY, originX + left - 1, originY + height); #endif } if (ll->position() == LayerRight) { right += tmp; QRect rect(originX + width - right, originY + top, tmp, height - top - bottom); ll->m_rect = rect; //ll->paint(painter, *this, QRegion(rect)); #ifdef DEBUG_LAYOUT QColor col = Qt::red; painter.setPen(col); painter.drawLine(originX + width - right, originY, originX + width - right, originY + height); #endif } } bottom = marginBottom() * printScaleY(); top = marginTop(); for (int i = 0; i < m_layers.size(); i++) { Layer *ll = m_layers[i]; if (!ll->visible()) { continue; } tmp = ll->minimumHeight(); if (ll->position() == LayerTop) { QRect rect(originX + left, originY + top, width - left - right, tmp); ll->m_rect = rect; ll->paint(painter, *this, QRegion(rect)); top += tmp; } if (ll->position() == LayerBottom) { bottom += tmp * printScaleY(); QRect rect(originX + left, originY + height - bottom, width - left - right, tmp); ll->m_rect = rect; ll->paint(painter, *this, QRegion(rect)); } } if (isPinned()) { // Fill the background on pinned graphs painter.fillRect(originX + left, originY + top, width - right, height - bottom - top, QBrush(QColor(Qt::white))); } for (int i = 0; i < m_layers.size(); i++) { Layer *ll = m_layers[i]; if (!ll->visible()) { continue; } if (ll->position() == LayerCenter) { QRect rect(originX + left, originY + top, width - left - right, height - top - bottom); ll->m_rect = rect; ll->paint(painter, *this, QRegion(rect)); } } // Draw anything like the YAxis labels afterwards, in case the graph scale was updated during draw for (int i = 0; i < m_layers.size(); i++) { Layer *ll = m_layers[i]; if (!ll->visible()) { continue; } if ((ll->position() == LayerLeft) || (ll->position() == LayerRight)) { ll->paint(painter, *this, QRegion(ll->m_rect)); } } if (m_selection.width() > 0 && m_selecting_area) { QColor col(128, 128, 255, 128); painter.fillRect(originX + m_selection.x(), originY + top, m_selection.width(), height - bottom - top,QBrush(col)); // quads()->add(originX + m_selection.x(), originY + top, // originX + m_selection.x() + m_selection.width(), originY + top, col.rgba()); // quads()->add(originX + m_selection.x() + m_selection.width(), originY + height - bottom, // originX + m_selection.x(), originY + height - bottom, col.rgba()); } if (isPinned() && !printing()) { painter.drawPixmap(-5, originY-10, m_graphview->pin_icon); } } QPixmap gGraph::renderPixmap(int w, int h, bool printing) { QFont *_defaultfont = defaultfont; QFont *_mediumfont = mediumfont; QFont *_bigfont = bigfont; QFont fa = *defaultfont; QFont fb = *mediumfont; QFont fc = *bigfont; m_printing = printing; if (printing) { fa.setPixelSize(28); fb.setPixelSize(32); fc.setPixelSize(70); graphView()->setPrintScaleX(2.5); graphView()->setPrintScaleY(2.2); } else { graphView()->setPrintScaleX(1); graphView()->setPrintScaleY(1); } defaultfont = &fa; mediumfont = &fb; bigfont = &fc; QPixmap pm(w,h); bool pixcaching = p_profile->appearance->usePixmapCaching(); graphView()->setUsePixmapCache(false); p_profile->appearance->setUsePixmapCaching(false); QPainter painter(&pm); painter.fillRect(0,0,w,h,QBrush(QColor(Qt::white))); QRegion region(0,0,w,h); paint(painter, region); DrawTextQue(painter); painter.end(); graphView()->setUsePixmapCache(pixcaching); p_profile->appearance->setUsePixmapCaching(pixcaching); graphView()->setPrintScaleX(1); graphView()->setPrintScaleY(1); defaultfont = _defaultfont; mediumfont = _mediumfont; bigfont = _bigfont; m_printing = false; return pm; } // Sets a new Min & Max X clipping, refreshing the graph and all it's layers. void gGraph::SetXBounds(qint64 minx, qint64 maxx) { invalidate_xAxisImage = true; min_x = minx; max_x = maxx; //repaint(); //m_graphview->redraw(); } int gGraph::flipY(int y) { return m_graphview->height() - y; } void gGraph::ResetBounds() { if (m_snapshot) return; invalidate_xAxisImage = true; min_x = MinX(); max_x = MaxX(); min_y = MinY(); max_y = MaxY(); } void gGraph::ToolTip(QString text, int x, int y, ToolTipAlignment align, int timeout) { if (timeout <= 0) { timeout = p_profile->general->tooltipTimeout(); } m_graphview->m_tooltip->display(text, x, y, align, timeout); } // YAxis Autoscaling code void gGraph::roundY(EventDataType &miny, EventDataType &maxy) { if (zoomY() == 2) { miny = rec_miny; maxy = rec_maxy; if (maxy > miny) return; } else if (zoomY() ==1) { miny = physMinY(); maxy = physMaxY(); if (maxy > miny) return; } miny = MinY(); maxy = MaxY(); int m, t; bool ymin_good = false, ymax_good = false; // Have no minx/miny reference, have to create one if (maxy == miny) { m = ceil(maxy / 2.0); t = m * 2; if (maxy == t) { t += 2; } if (!ymax_good) { maxy = t; } m = floor(miny / 2.0); t = m * 2; if (miny == t) { t -= 2; } if (miny >= 0 && t < 0) { t = 0; } if (!ymin_good) { miny = t; } if (miny < 0) { EventDataType tmp = qMax(qAbs(miny), qAbs(maxy)); maxy = tmp; miny = -tmp; } return; } if (maxy >= 400) { m = ceil(maxy / 50.0); t = m * 50; if (!ymax_good) { maxy = t; } m = floor(miny / 50.0); if (!ymin_good) { miny = m * 50; } } else if (maxy >= 30) { m = ceil(maxy / 5.0); t = m * 5; if (!ymax_good) { maxy = t; } m = floor(miny / 5.0); if (!ymin_good) { miny = m * 5; } } else { if (maxy == miny && maxy == 0) { maxy = 0.5; } else { //maxy*=4.0; //miny*=4.0; if (!ymax_good) { maxy = ceil(maxy); } if (!ymin_good) { miny = floor(miny); } //maxy/=4.0; //miny/=4.0; } } if (miny < 0) { EventDataType tmp = qMax(qAbs(miny), qAbs(maxy)); maxy = tmp; miny = -tmp; } //if (m_enforceMinY) { miny=f_miny; } //if (m_enforceMaxY) { maxy=f_maxy; } } void gGraph::AddLayer(Layer *l, LayerPosition position, short width, short height, short order, bool movable, short x, short y) { l->setLayout(position, width, height, order); l->setMovable(movable); l->setPos(x, y); l->addref(); m_layers.push_back(l); } void gGraph::dataChanged() { int size = m_layers.size(); for (int i=0; i < size; i++) { m_layers[i]->dataChanged(); } } void gGraph::redraw() { m_graphview->redraw(); } void gGraph::timedRedraw(int ms) { m_graphview->timedRedraw(ms); } double gGraph::currentTime() const { return m_graphview->currentTime(); } double gGraph::screenToTime(int xpos) { double w = m_rect.width() - left - right; double xx = m_blockzoom ? rmax_x - rmin_x : max_x - min_x; double xmult = xx / w; double x = xpos - m_rect.left() - left; double res = xmult * x; res += m_blockzoom ? rmin_x : min_x; return res; } void gGraph::mouseMoveEvent(QMouseEvent *event) { // qDebug() << m_title << "Move" << event->pos() << m_graphview->pointClicked(); if (m_rect.width() == 0) return; int y = event->y(); int x = event->x(); bool doredraw = false; timedRedraw(0); for (int i = 0; i < m_layers.size(); i++) { if (m_layers[i]->m_rect.contains(x, y)) if (m_layers[i]->mouseMoveEvent(event, this)) { return; // doredraw = true; } } y -= m_rect.top(); x -= m_rect.left(); int x2 = m_graphview->pointClicked().x() - m_rect.left(); int w = m_rect.width() - left - right; double xx = max_x - min_x; double xmult = xx / double(w); { xmult = (m_blockzoom ? double(rmax_x - rmin_x) : double(max_x - min_x)) / double(w); double a = x; if (a < left) a = left; if (a > left+w) a = left+w; a -= left; a *= xmult; a += m_blockzoom ? rmin_x : min_x; m_currentTime = a; m_graphview->setCurrentTime(a); } if (m_graphview->m_selected_graph == this) { // Left Mouse button dragging if (event->buttons() & Qt::LeftButton) { //qDebug() << m_title << "Moved" << x << y << left << right << top << bottom << m_width << h; int a1 = MIN(x, x2); int a2 = MAX(x, x2); if (a1 < left) { a1 = left; } if (a2 > left + w) { a2 = left + w; } m_selecting_area = true; m_selection = QRect(a1 - 1, 0, a2 - a1, m_rect.height()); double w2 = m_rect.width() - right - left; if (m_blockzoom) { xmult = (rmax_x - rmin_x) / w2; } else { xmult = (max_x - min_x) / w2; } qint64 a = double(a2 - a1) * xmult; m_selectedDuration = a; float d = double(a) / 86400000.0; int h = a / 3600000; int m = (a / 60000) % 60; int s = (a / 1000) % 60; int ms(a % 1000); if (d > 1) { m_selDurString.sprintf("%1.0f days", d); } else { m_selDurString.sprintf("%02i:%02i:%02i:%03i", h, m, s, ms); } ToolTipAlignment align = x >= x2 ? TT_AlignLeft : TT_AlignRight; int offset = (x >= x2) ? 20 : - 20; ToolTip(m_selDurString, m_rect.left() + x + offset, m_rect.top() + y + 20, align); doredraw = true; } else if (event->buttons() & Qt::RightButton) { // Right Mouse button dragging m_graphview->setPointClicked(event->pos()); x -= left; x2 -= left; if (!m_blockzoom) { xx = max_x - min_x; xmult = xx / double(w); qint64 j1 = xmult * x; qint64 j2 = xmult * x2; qint64 jj = j2 - j1; min_x += jj; max_x += jj; if (min_x < rmin_x) { min_x = rmin_x; max_x = rmin_x + xx; } if (max_x > rmax_x) { max_x = rmax_x; min_x = rmax_x - xx; } m_graphview->SetXBounds(min_x, max_x, m_group, false); doredraw = true; } else { qint64 qq = rmax_x - rmin_x; xx = max_x - min_x; if (xx == qq) { xx = 1800000; } xmult = qq / double(w); qint64 j1 = (xmult * x); min_x = rmin_x + j1 - (xx / 2); max_x = min_x + xx; if (min_x < rmin_x) { min_x = rmin_x; max_x = rmin_x + xx; } if (max_x > rmax_x) { max_x = rmax_x; min_x = rmax_x - xx; } m_graphview->SetXBounds(min_x, max_x, m_group, false); doredraw = true; } } } //if (!nolayer) { // no mouse button // if (doredraw) { // m_graphview->timedRedraw(0); // } //} //if (x>left+m_marginleft && xtop+m_margintop && ymetaSelect(); } void gGraph::mousePressEvent(QMouseEvent *event) { int y = event->pos().y(); int x = event->pos().x(); for (int i = 0; i < m_layers.size(); i++) { if (m_layers[i]->m_rect.contains(x, y)) if (m_layers[i]->mousePressEvent(event, this)) { return; } } /* int w=m_lastbounds.width()-(right+m_marginright); //int h=m_lastbounds.height()-(bottom+m_marginbottom); //int x2,y2; double xx=max_x-min_x; //double xmult=xx/w; if (x>left+m_marginleft && xtop+m_margintop && ypos().y(); int x = event->pos().x(); for (int i = 0; i < m_layers.size(); i++) { if (m_layers[i]->m_rect.contains(x, y)) if (m_layers[i]->mouseReleaseEvent(event, this)) { return; } } x -= m_rect.left(); y -= m_rect.top(); int w = m_rect.width() - left - right; //(m_marginleft+left+right+m_marginright); int h = m_rect.height() - bottom; //+m_marginbottom); int x2 = m_graphview->pointClicked().x() - m_rect.left(); int y2 = m_graphview->pointClicked().y() - m_rect.top(); m_selDurString = QString(); //qDebug() << m_title << "Released" << min_x << max_x << x << y << x2 << y2 << left << right << top << bottom << m_width << m_height; if (m_selecting_area) { m_selecting_area = false; m_selection.setWidth(0); if (m_graphview->horizTravel() > mouse_movement_threshold) { x -= left; //+m_marginleft; y -= top; //+m_margintop; x2 -= left; //+m_marginleft; y2 -= top; //+m_margintop; if (x < 0) { x = 0; } if (x2 < 0) { x2 = 0; } if (x > w) { x = w; } if (x2 > w) { x2 = w; } double xx; double xmult; if (!m_blockzoom) { xx = max_x - min_x; xmult = xx / double(w); qint64 j1 = min_x + xmult * x; qint64 j2 = min_x + xmult * x2; qint64 a1 = MIN(j1, j2) qint64 a2 = MAX(j1, j2) //if (a1 rmax_x) { a2 = rmax_x; } if (a1 <= rmin_x && a2 <= rmin_x) { //qDebug() << "Foo??"; } else { if (a2 - a1 < zoom_hard_limit) { a2 = a1 + zoom_hard_limit; } m_graphview->SetXBounds(a1, a2, m_group); } } else { xx = rmax_x - rmin_x; xmult = xx / double(w); qint64 j1 = rmin_x + xmult * x; qint64 j2 = rmin_x + xmult * x2; qint64 a1 = MIN(j1, j2) qint64 a2 = MAX(j1, j2) //if (a1 rmax_x) { a2 = rmax_x; } if (a1 <= rmin_x && a2 <= rmin_x) { qDebug() << "Foo2??"; } else { if (a2 - a1 < zoom_hard_limit) { a2 = a1 + zoom_hard_limit; } m_graphview->SetXBounds(a1, a2, m_group); } } return; } else { m_graphview->redraw(); } } if ((m_graphview->horizTravel() < mouse_movement_threshold) && (x > left && x < w + left && y > top && y < h)) { // normal click in main area if (!m_blockzoom) { double zoom; if (event->button() & Qt::RightButton) { zoom = 1.33; if (event->modifiers() & Qt::ControlModifier) { zoom *= 1.5; } ZoomX(zoom, x); // Zoom out return; } else if (event->button() & Qt::LeftButton) { zoom = 0.75; if (event->modifiers() & Qt::ControlModifier) { zoom /= 1.5; } ZoomX(zoom, x); // zoom in. return; } } else { x -= left; y -= top; //w-=m_marginleft+left; double qq = rmax_x - rmin_x; double xmult; double xx = max_x - min_x; //if (xx==qq) xx=1800000; xmult = qq / double(w); if ((xx == qq) || (x == m_lastx23)) { double zoom = 1; if (event->button() & Qt::RightButton) { zoom = 1.33; if (event->modifiers() & Qt::ControlModifier) { zoom *= 1.5; } } else if (event->button() & Qt::LeftButton) { zoom = 0.75; if (event->modifiers() & Qt::ControlModifier) { zoom /= 1.5; } } xx *= zoom; if (xx < qq / zoom_hard_limit) { xx = qq / zoom_hard_limit; } if (xx > qq) { xx = qq; } } double j1 = xmult * x; min_x = rmin_x + j1 - (xx / 2.0); max_x = min_x + xx; if (min_x < rmin_x) { min_x = rmin_x; max_x = rmin_x + xx; } else if (max_x > rmax_x) { max_x = rmax_x; min_x = rmax_x - xx; } m_graphview->SetXBounds(min_x, max_x, m_group); m_lastx23 = x; } } //m_graphview->redraw(); } void gGraph::wheelEvent(QWheelEvent *event) { //qDebug() << m_title << "Wheel" << event->x() << event->y() << event->delta(); //int y=event->pos().y(); if (event->orientation() == Qt::Horizontal) { return; } int x = event->pos().x() - m_graphview->titleWidth; //(left+m_marginleft); if (event->delta() > 0) { ZoomX(0.75, x); } else { ZoomX(1.5, x); } int y = event->pos().y(); x = event->pos().x(); for (int i = 0; i < m_layers.size(); i++) { if (m_layers[i]->m_rect.contains(x, y)) { m_layers[i]->wheelEvent(event, this); } } } void gGraph::mouseDoubleClickEvent(QMouseEvent *event) { //mousePressEvent(event); //mouseReleaseEvent(event); int y = event->pos().y(); int x = event->pos().x(); for (int i = 0; i < m_layers.size(); i++) { if (m_layers[i]->m_rect.contains(x, y)) { m_layers[i]->mouseDoubleClickEvent(event, this); } } //int w=m_lastbounds.width()-(m_marginleft+left+right+m_marginright); //int h=m_lastbounds.height()-(bottom+m_marginbottom); //int x2=m_graphview->pointClicked().x(),y2=m_graphview->pointClicked().y(); // if ((m_graphview->horizTravel()left+m_marginleft && xtop+m_margintop && ybutton() & Qt::RightButton) { // ZoomX(1.66,x); // Zoon out // return; // } else if (event->button() & Qt::LeftButton) { // ZoomX(0.75/2.0,x); // zoom in. // return; // } // } else { // Propagate the events to graph Layers // } //mousePressEvent(event); //mouseReleaseEvent(event); //qDebug() << m_title << "Double Clicked" << event->x() << event->y(); } void gGraph::keyPressEvent(QKeyEvent *event) { for (QVector::iterator i = m_layers.begin(); i != m_layers.end(); i++) { (*i)->keyPressEvent(event, this); } //qDebug() << m_title << "Key Pressed.. implement me" << event->key(); } void gGraph::keyReleaseEvent(QKeyEvent *event) { if (!m_graphview) return; if (m_graphview->selectionInProgress() && m_graphview->metaSelect()) { if (!(event->modifiers() & Qt::AltModifier)) { } } } void gGraph::ZoomX(double mult, int origin_px) { int width = m_rect.width() - left - right; //(m_marginleft+left+right+m_marginright); if (origin_px == 0) { origin_px = (width / 2); } else { origin_px -= left; } if (origin_px < 0) { origin_px = 0; } if (origin_px > width) { origin_px = width; } // Okay, I want it to zoom in centered on the mouse click area.. // Find X graph position of mouse click // find current zoom width // apply zoom // center on point found in step 1. qint64 min = min_x; qint64 max = max_x; double hardspan = rmax_x - rmin_x; double span = max - min; double ww = double(origin_px) / double(width); double origin = ww * span; //double center=0.5*span; //double dist=(origin-center); double q = span * mult; if (q > hardspan) { q = hardspan; } if (q < hardspan / zoom_hard_limit) { q = hardspan / zoom_hard_limit; } min = min + origin - (q * ww); max = min + q; if (min < rmin_x) { min = rmin_x; max = min + q; } if (max > rmax_x) { max = rmax_x; min = max - q; } extern const int max_history; m_graphview->SetXBounds(min, max, m_group); //updateSelectionTime(max-min); } void gGraph::DrawTextQue(QPainter &painter) { m_graphview->DrawTextQue(painter); } // margin recalcs.. void gGraph::resize(int width, int height) { invalidate_xAxisImage = true; invalidate_yAxisImage = true; Q_UNUSED(width); Q_UNUSED(height); //m_height=height; //m_width=width; } qint64 gGraph::MinX() { qint64 val = 0, tmp; for (QVector::iterator l = m_layers.begin(); l != m_layers.end(); l++) { if ((*l)->isEmpty()) { continue; } tmp = (*l)->Minx(); if (!tmp) { continue; } if (!val || tmp < val) { val = tmp; } } if (val) { rmin_x = val; } return val; } qint64 gGraph::MaxX() { //bool first=true; qint64 val = 0, tmp; for (QVector::iterator l = m_layers.begin(); l != m_layers.end(); l++) { if ((*l)->isEmpty()) { continue; } tmp = (*l)->Maxx(); //if (!tmp) continue; if (!val || tmp > val) { val = tmp; } } if (val) { rmax_x = val; } return val; } EventDataType gGraph::MinY() { bool first = true; EventDataType val = 0, tmp; if (m_enforceMinY) { return rmin_y = f_miny; } for (QVector::iterator l = m_layers.begin(); l != m_layers.end(); l++) { if ((*l)->isEmpty() || ((*l)->layerType() == LT_Other)) { continue; } tmp = (*l)->Miny(); // if (tmp == 0 && tmp == (*l)->Maxy()) { // continue; // } if (first) { val = tmp; first = false; } else { if (tmp < val) { val = tmp; } } } return rmin_y = val; } EventDataType gGraph::MaxY() { bool first = true; EventDataType val = 0, tmp; if (m_enforceMaxY) { return rmax_y = f_maxy; } QVector::const_iterator iterEnd = m_layers.constEnd(); for (QVector::const_iterator iter = m_layers.constBegin(); iter != iterEnd; ++iter) { Layer *layer = *iter; if (layer->isEmpty() || (layer->layerType() == LT_Other)) { continue; } tmp = layer->Maxy(); // if (tmp == 0 && layer->Miny() == 0) { // continue; // } if (first) { val = tmp; first = false; } else { if (tmp > val) { val = tmp; } } } return rmax_y = val; } EventDataType gGraph::physMinY() { bool first = true; EventDataType val = 0, tmp; //if (m_enforceMinY) return rmin_y=f_miny; QVector::const_iterator iterEnd = m_layers.constEnd(); for (QVector::const_iterator iter = m_layers.constBegin(); iter != iterEnd; ++iter) { Layer *layer = *iter; if (layer->isEmpty()) { continue; } tmp = layer->physMiny(); if (tmp == 0 && layer->physMaxy() == 0) { continue; } if (first) { val = tmp; first = false; } else { if (tmp < val) { val = tmp; } } } return rphysmin_y = val; } EventDataType gGraph::physMaxY() { bool first = true; EventDataType val = 0, tmp; // if (m_enforceMaxY) return rmax_y=f_maxy; QVector::const_iterator iterEnd = m_layers.constEnd(); for (QVector::const_iterator iter = m_layers.constBegin(); iter != iterEnd; ++iter) { Layer *layer = *iter; if (layer->isEmpty()) { continue; } tmp = layer->physMaxy(); if (tmp == 0 && layer->physMiny() == 0) { continue; } if (first) { val = tmp; first = false; } else { if (tmp > val) { val = tmp; } } } return rphysmax_y = val; } void gGraph::SetMinX(qint64 v) { rmin_x = min_x = v; } void gGraph::SetMaxX(qint64 v) { rmax_x = max_x = v; } void gGraph::SetMinY(EventDataType v) { rmin_y = min_y = v; } void gGraph::SetMaxY(EventDataType v) { rmax_y = max_y = v; } Layer *gGraph::getLineChart() { gLineChart *lc; for (int i = 0; i < m_layers.size(); i++) { lc = dynamic_cast(m_layers[i]); if (lc) { return lc; } } return nullptr; } int gGraph::minHeight() { int minheight = m_min_height; int top = 0; int center = 0; int bottom = 0; for (int i=0; iminimumHeight(); mh += m_margintop + m_marginbottom; if (mh > minheight) minheight = mh; } // layers need to set their own too.. return minheight; } void GetTextExtent(QString text, int &width, int &height, QFont *font) { #ifdef ENABLE_THREADED_DRAWING static QMutex mut; mut.lock(); #endif QFontMetrics fm(*font); //#ifdef Q_OS_WIN32 QRect r = fm.boundingRect(text); width = r.width(); height = r.height(); //#else // width=fm.width(text); // height=fm.xHeight()+2; // doesn't work properly on windows.. //#endif #ifdef ENABLE_THREADED_DRAWING mut.unlock(); #endif } int GetXHeight(QFont *font) { QFontMetrics fm(*font); return fm.xHeight(); } void gGraph::dumpInfo() { for (int i = 0; i < m_layers.size(); i++) { Layer *ll = m_layers[i]; if (!ll->visible()) { continue; } if (ll->position() == LayerCenter) { gLineChart *lc = dynamic_cast(ll); if (lc != nullptr) { QString text = lc->getMetaString(currentTime()); if (!text.isEmpty()) { mainwin->log(text); } } } } } sleepyhead-0.9.8/sleepyhead/Graphs/layer.h0000644000175000017500000002401012412506713020047 0ustar sergiosergio/* Graph Layer Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef graphs_layer_h #define graphs_layer_h #include #include #include #include #include #include "SleepLib/common.h" #include "SleepLib/day.h" #include "SleepLib/machine_common.h" class gGraph; class LayerGroup; enum LayerPosition { LayerLeft, LayerRight, LayerTop, LayerBottom, LayerCenter, LayerOverlay }; enum ToolTipAlignment { TT_AlignCenter, TT_AlignLeft, TT_AlignRight }; enum LayerType { LT_Other = 0, LT_LineChart, LT_SummaryChart, LT_EventFlags, LT_Spacer, LT_Overview }; /*! \class Layer \brief The base component for all individual Graph layers */ class Layer { friend class gGraph; friend class LayerGroup; public: Layer(ChannelID code) : m_refcount(0), m_day(nullptr), m_visible(true), m_movable(false), m_minx(0), m_maxx(0), m_miny(0), m_maxy(0), m_physminy(0), m_physmaxy(0), m_code(code), m_width(0), m_height(0), m_X(0), m_Y(0), m_order(0), m_position(LayerCenter), m_recalculating(false), m_layertype(LT_Other) { } virtual void recalculate(gGraph * graph) { Q_UNUSED(graph)} virtual ~Layer(); virtual Layer * Clone() { return nullptr; } void CloneInto(Layer *); //! \brief This gets called on day selection, allowing this layer to precalculate any drawing data virtual void SetDay(Day *d); //! \brief Set the ChannelID used in this layer virtual void SetCode(ChannelID c) { m_code = c; } //! \brief Return the ChannelID used in this layer const ChannelID & code() { return m_code; } const LayerType & layerType() { return m_layertype; } //! \brief returns true if this layer contains no data. virtual bool isEmpty(); //! \brief Override and returns true if there are any highlighted components virtual bool isSelected() { return false; } //! \brief Deselect any highlighted components virtual void deselect() { } //! \brief Override to set the minimum allowed height for this layer virtual int minimumHeight() { return 0; } //! \brief Override to set the minimum allowed width for this layer virtual int minimumWidth() { return 0; } //! \brief Return this layers physical minimum date boundary virtual qint64 Minx() { return m_day ? m_day->first() : m_minx; } //! \brief Return this layers physical maximum date boundary virtual qint64 Maxx() { return m_day ? m_day->last() : m_maxx; } //! \brief Return this layers physical minimum Yaxis value virtual EventDataType Miny() { return m_miny; } //! \brief Return this layers physical maximum Yaxis value virtual EventDataType Maxy() { return m_maxy; } //! \brief Return this layers physical minimum Yaxis value virtual EventDataType physMiny() { return m_physminy; } //! \brief Return this layers physical maximum Yaxis value virtual EventDataType physMaxy() { return m_physmaxy; } //! \brief Set this layers physical minimum date boundary virtual void setMinX(qint64 val) { m_minx = val; } //! \brief Set this layers physical maximum date boundary virtual void setMaxX(qint64 val) { m_maxx = val; } //! \brief Set this layers physical minimum Yaxis value virtual void setMinY(EventDataType val) { m_miny = val; } //! \brief Set this layers physical maximum Yaxis value virtual void setMaxY(EventDataType val) { m_maxy = val; } //! \brief Set this layers Visibility status void setVisible(bool b) { m_visible = b; } //! \brief Return this layers Visibility status inline bool visible() const { return m_visible; } //! \brief Set this layers Moveability status (not really used yet) void setMovable(bool b) { m_movable = b; } //! \brief Return this layers Moveability status (not really used yet) inline bool movable() const { return m_movable; } inline bool recalculating() const { return m_recalculating; } virtual void dataChanged() {} /*! \brief Override this for the drawing code, using GLBuffer components for drawing \param gGraph & gv Graph Object that holds this layer \param int left \param int top \param int width \param int height */ virtual void paint(QPainter &painter, gGraph &gv, const QRegion ®ion) = 0; //! \brief Set the layout position and order for this layer. void setLayout(LayerPosition position, short width, short height, short order); void setPos(short x, short y) { m_X = x; m_Y = y; } inline int Width() const { return m_width; } inline int Height() const { return m_height; } //! \brief Return this Layers Layout Position. LayerPosition position() { return m_position; } //void X() { return m_X; } //void Y() { return m_Y; } // //! \brief Draw all this layers custom GLBuffers (ie. the actual OpenGL Vertices) // virtual void drawGLBuf(float linesize); //! \brief not sure why I needed the reference counting stuff. short m_refcount; void addref() { m_refcount++; } bool unref() { m_refcount--; return (m_refcount <= 0); } protected: // //! \brief Add a GLBuffer (vertex) object customized to this layer // void addGLBuf(GLBuffer *buf) { mgl_buffers.push_back(buf); } // void addVertexBuffer(gVertexBuffer *buf) { mv_buffers.push_back(buf); } //QRect bounds; // bounds, relative to top of individual graph. Day *m_day; bool m_visible; bool m_movable; qint64 m_minx, m_maxx; EventDataType m_miny, m_maxy; EventDataType m_physminy, m_physmaxy; ChannelID m_code; short m_width; // reserved x pixels needed for this layer. 0==Depends on position.. short m_height; // reserved y pixels needed for this layer. both 0 == expand to all free area. short m_X; // offset for repositionable layers.. short m_Y; short m_order; // order for positioning.. LayerPosition m_position; QRect m_rect; bool m_mouseover; volatile bool m_recalculating; LayerType m_layertype; public: // //! \brief A vector containing all this layers custom drawing buffers // QVector mgl_buffers; // QVector mv_buffers; //! \brief Mouse wheel moved somewhere over this layer virtual bool wheelEvent(QWheelEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } //! \brief Mouse moved somewhere over this layer virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } //! \brief Mouse left or right button pressed somewhere on this layer virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } //! \brief Mouse button released that was originally pressed somewhere on this layer virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } //! \brief Mouse button double clicked somewhere on this layer virtual bool mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } //! \brief A key was pressed on the keyboard while the graph area was focused. virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } }; /*! \class LayerGroup \brief Contains a list of graph Layer objects */ class LayerGroup : public Layer { public: LayerGroup() : Layer(NoChannel) { } virtual ~LayerGroup(); //! \brief Add Layer to this Layer Group virtual void AddLayer(Layer *l); //! \brief Returns the minimum time value for all Layers contained in this group (milliseconds since epoch) virtual qint64 Minx(); //! \brief Returns the maximum time value for all Layers contained in this group (milliseconds since epoch) virtual qint64 Maxx(); //! \brief Returns the minimum Y-axis value for all Layers contained in this group virtual EventDataType Miny(); //! \brief Returns the maximum Y-axis value for all Layers contained in this group virtual EventDataType Maxy(); //! \brief Check all layers contained and return true if none contain data virtual bool isEmpty(); //! \brief Calls SetDay for all Layers contained in this object virtual void SetDay(Day *d); // //! \brief Calls drawGLBuf for all Layers contained in this object // virtual void drawGLBuf(float linesize); //! \brief Return the list of Layers this object holds QVector &getLayers() { return layers; } protected: //! \brief Contains all Layer objects in this group QVector layers; //! \brief Mouse wheel moved somewhere over this LayerGroup virtual bool wheelEvent(QWheelEvent *event, gGraph *graph); //! \brief Mouse moved somewhere over this LayerGroup virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); //! \brief Mouse left or right button pressed somewhere on this LayerGroup virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph); //! \brief Mouse button released that was originally pressed somewhere on this LayerGroup virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph); //! \brief Mouse button double clicked somewhere on this layerGroup virtual bool mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph); //! \brief A key was pressed on the keyboard while the graph area was focused. virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph); }; #endif // graphs_layer_h sleepyhead-0.9.8/sleepyhead/Graphs/glcommon.cpp0000644000175000017500000000200312412506713021077 0ustar sergiosergio/* glcommon GL code & font stuff * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include "glcommon.h" float brightness(QColor color) { return color.redF()*0.299 + color.greenF()*0.587 + color.blueF()*0.114; } QColor brighten(QColor color, float mult) { int cr, cg, cb; cr = color.red(); cg = color.green(); cb = color.blue(); if (cr < 64) { cr = 64; } if (cg < 64) { cg = 64; } if (cb < 64) { cb = 64; } cr *= mult; cg *= mult; cb *= mult; if (cr > 255) { cr = 255; } if (cg > 255) { cg = 255; } if (cb > 255) { cb = 255; } return QColor(cr, cg, cb, 255); } #ifdef BUILD_WITH_MSVC #if (_MSC_VER < 1800) double round(double number) { return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5); } #endif #endif sleepyhead-0.9.8/sleepyhead/Graphs/gFooBar.h0000644000175000017500000000251412412506713020257 0ustar sergiosergio/* gFooBar Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GFOOBAR_H #define GFOOBAR_H #include "Graphs/layer.h" /*! \class gShadowArea \brief Displays a Shadow for all graph areas not highlighted (used in Event Flags) */ class gShadowArea: public Layer { public: gShadowArea(QColor shadow_color = QColor(40, 40, 40, 40), QColor line_color = Qt::blue); virtual ~gShadowArea(); virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); protected: QColor m_shadow_color; QColor m_line_color; }; /*! \class gFooBar \brief Was a kind of scrollbar thingy that used to be used for representing the overall graph areas. Currently Unused and empty. */ class gFooBar: public Layer { public: static const int Margin = 15; public: gFooBar(int offset = 10, QColor handle_color = QColor("orange"), QColor line_color = QColor("dark grey")); virtual ~gFooBar(); virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); protected: int m_offset; QColor m_handle_color; QColor m_line_color; }; #endif // GFOOBAR_H sleepyhead-0.9.8/sleepyhead/Graphs/gStatsLine.cpp0000644000175000017500000000316012412506713021346 0ustar sergiosergio/* gStatsLine Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "SleepLib/day.h" #include "gYAxis.h" #include "gStatsLine.h" gStatsLine::gStatsLine(ChannelID code, QString label, QColor textcolor) : Layer(code), m_label(label), m_textcolor(textcolor) { } void gStatsLine::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { Q_UNUSED(painter) int left = region.boundingRect().left(); int top = region.boundingRect().top(); int width = region.boundingRect().width(); int height = region.boundingRect().height(); if (!m_visible) { return; } //if (m_empty) return; Q_UNUSED(height); int z = (width + gYAxis::Margin) / 5; int p = left - gYAxis::Margin; top += 4; w.renderText(m_label, p, top); //w.renderText(m_text,p,top,0,m_textcolor); p += z; w.renderText(st_min, p, top); p += z; w.renderText(st_avg, p, top); p += z; w.renderText(st_p90, p, top); p += z; w.renderText(st_max, p, top); } void gStatsLine::SetDay(Day *d) { Layer::SetDay(d); if (!m_day) { return; } m_min = d->Min(m_code); m_max = d->Max(m_code); m_avg = d->wavg(m_code); m_p90 = d->p90(m_code); st_min = "Min=" + QString::number(m_min, 'f', 2); st_max = "Max=" + QString::number(m_max, 'f', 2); st_avg = "Avg=" + QString::number(m_avg, 'f', 2); st_p90 = "90%=" + QString::number(m_p90, 'f', 2); } sleepyhead-0.9.8/sleepyhead/Graphs/gGraphView.h0000644000175000017500000005106612412506713021011 0ustar sergiosergio/* gGraphView Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GGRAPHVIEW_H #define GGRAPHVIEW_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef BROKEN_OPENGL_BUILD #include #endif #include #include #include class MinMaxWidget:public QWidget { Q_OBJECT public: explicit MinMaxWidget(gGraph * graph, QWidget *parent); ~MinMaxWidget() {} void createLayout(); void setMin(double d) { minbox->setValue(d); } void setMax(double d) { maxbox->setValue(d); } double min() { return minbox->value(); } double max() { return maxbox->value(); } void setComboIndex(int i) { combobox->setCurrentIndex(i); } int comboIndex() { return combobox->currentIndex(); } // void setChecked(bool b) { checkbox->setChecked(b); } // bool checked() { return checkbox->isChecked(); } public slots: void onMinChanged(double d); void onMaxChanged(double d); void onComboChanged(int idx); void onResetClicked(); protected: gGraph * graph; QComboBox *combobox; // QCheckBox *checkbox; QDoubleSpinBox *minbox; QDoubleSpinBox *maxbox; double step; QToolButton * reset; }; enum FlagType { FT_Bar, FT_Dot, FT_Span }; void setEmptyImage(QString text, QPixmap pixmap); class MyLabel:public QWidget { Q_OBJECT public: MyLabel(QWidget * parent); virtual ~MyLabel(); void setText(QString text); void setAlignment(Qt::Alignment alignment); void setFont(QFont & font); QFont & font() { return m_font; } virtual void paintEvent(QPaintEvent *); QFont m_font; QString m_text; Qt::Alignment m_alignment; QTime time; protected slots: void doRedraw(); }; class gGraphView; const int textque_max = 512; /*! \struct TextQue \brief Holds a single item of text for the drawing queue */ struct TextQue { TextQue() { } TextQue(short x, short y, float angle, QString text, QColor color, QFont * font, bool antialias): x(x), y(y), angle(angle), text(text), color(color), font(font), antialias(antialias) { } TextQue(const TextQue & copy) { x=copy.x; y=copy.y; text=copy.text; angle=copy.angle; color=copy.color; font=copy.font; antialias=copy.antialias; } //! \variable contains the x axis screen position to draw the text short x; //! \variable contains the y axis screen position to draw the text short y; //! \variable the angle in degrees for drawing rotated text float angle; //! \variable the actual text to draw QString text; //! \variable the color the text will be drawn in QColor color; //! \variable a pointer to the QFont to use to draw this text QFont *font; //! \variable whether to use antialiasing to draw this text bool antialias; }; struct TextQueRect { TextQueRect() { } TextQueRect(QRectF r, quint32 flags, QString text, float angle, QColor color, QFont * font, bool antialias): rect(r), flags(flags), text(text), angle(angle), color(color), font(font), antialias(antialias) { } TextQueRect(const TextQueRect & copy) { rect = copy.rect; flags = copy.flags; text = copy.text; angle = copy.angle; color = copy.color; font = copy.font; antialias = copy.antialias; } //! \variable contains the QRect containing the text object QRectF rect; //! \variable Qt alignment flags.. quint32 flags; //! \variable the actual text to draw QString text; //! \variable the angle in degrees for drawing rotated text float angle; //! \variable the color the text will be drawn in QColor color; //! \variable a pointer to the QFont to use to draw this text QFont *font; //! \variable whether to use antialiasing to draw this text bool antialias; }; /*! \class MyScrollBar \brief An custom scrollbar to interface with gGraphWindow */ class MyScrollBar : public QScrollBar { public: MyScrollBar(QWidget *parent = nullptr) : QScrollBar(parent) { } void SendWheelEvent(QWheelEvent *e) { wheelEvent(e); } }; /*! \class gThread \brief Part of the Threaded drawing code This is currently broken, as Qt didn't behave anyway, and it offered no performance improvement drawing-wise */ class gThread : public QThread { public: gThread(gGraphView *g); ~gThread(); //! \brief Start thread process void run(); //! \brief Kill thread process void die() { m_running = false; } QMutex mutex; protected: gGraphView *graphview; volatile bool m_running; }; /*! \class gToolTip \brief Popup Tooltip to display information over the OpenGL graphs */ class gToolTip : public QObject { Q_OBJECT public: //! \brief Initializes the ToolTip object, and connects the timeout to the gGraphView object gToolTip(gGraphView *graphview); virtual ~gToolTip(); /*! \fn virtual void display(QString text, int x, int y, int timeout=2000); \brief Set the tooltips display message, position, and timeout value */ virtual void display(QString text, int x, int y, ToolTipAlignment align = TT_AlignCenter, int timeout = 0); //! \brief Draw the tooltip virtual void paint(QPainter &paint); //actually paints it. //! \brief Close the tooltip early. void cancel(); //! \brief Returns true if the tooltip is currently visible bool visible() { return m_visible; } protected: gGraphView *m_graphview; QTimer *timer; QPoint m_pos; int tw, th; QString m_text; bool m_visible; int m_spacer; QImage m_image; bool m_invalidate; ToolTipAlignment m_alignment; protected slots: //! \brief Timeout to hide tooltip, and redraw without it. void timerDone(); }; struct SelectionHistoryItem { SelectionHistoryItem() { minx=maxx=0; } SelectionHistoryItem(quint64 m1, quint64 m2) { minx=m1; maxx=m2; } SelectionHistoryItem(const SelectionHistoryItem & copy) { minx = copy.minx; maxx = copy.maxx; } quint64 minx; quint64 maxx; }; /*! \class gGraphView \brief Main OpenGL Graph Area, derived from QGLWidget This widget contains a list of graphs, and provides the means to display them, scroll via an attached scrollbar, change the order around, and resize individual graphs. It replaced QScrollArea and multiple QGLWidgets graphs, and a very buggy QSplitter. It led to quite a performance increase over the old Qt method. */ class gGraphView #ifdef BROKEN_OPENGL_BUILD :public QWidget #else :public QGLWidget #endif { friend class gGraph; Q_OBJECT public: /*! \fn explicit gGraphView(QWidget *parent = 0,gGraphView * shared=0); \brief Constructs a new gGraphView object (main graph area) \param QWidget * parent \param gGraphView * shared The shared parameter allows for OpenGL context sharing. But this must not be shared with Printers snapshot gGraphView object, or it will lead to display/font corruption */ explicit gGraphView(QWidget *parent = 0, gGraphView *shared = 0); virtual ~gGraphView(); virtual void closeEvent(QCloseEvent * event); //! \brief Add gGraph g to this gGraphView, in the requested graph-linkage group void addGraph(gGraph *g, short group = 0); //! \brief The width of the vertical text Title area for all graphs static const int titleWidth = 30; //! \brief The splitter is drawn inside this gap static const int graphSpacer = 4; bool contains(QString name) { for (int i=0; iname() == name) return true; } return false; } gGraph *operator [](QString name) { for (int i=0; iname() == name) return m_graphs[i]; } return nullptr; } //! \brief Finds the top pixel position of the supplied graph float findTop(gGraph *graph); //! \brief Returns the scaleY value, which is used when laying out less graphs than fit on the screen. float scaleY() { return m_scaleY; } //! \brief Sets the scaleY value, which is used when laying out less graphs than fit on the screen. void setScaleY(float sy) { m_scaleY = sy; } //! \brief Returns the current selected time range void GetXBounds(qint64 &st, qint64 &et); //! \brief Returns the maximum time range bounds void GetRXBounds(qint64 &st, qint64 &et); //! \brief Resets the time range to default for this day. Refreshing the display if refresh==true. void ResetBounds(bool refresh = true); //! \brief Supplies time range to all graph objects in linked group, refreshing if requested void SetXBounds(qint64 minx, qint64 maxx, short group = 0, bool refresh = true); //! \brief Saves the current graph order, heights, min & Max Y values to disk void SaveSettings(QString title); //! \brief Loads the current graph order, heights, min & max Y values from disk bool LoadSettings(QString title); //! \brief Returns the graph object matching the supplied name, nullptr if it does not exist. gGraph *findGraph(QString name); //! \brief Returns the graph object matching the graph title, nullptr if it does not exist. gGraph *findGraphTitle(QString title); //! \brief Returns true if control key is down during select operation inline bool metaSelect() const { return m_metaselect; } //! \brief Returns true if currently selecting data with mouse inline bool selectionInProgress() const { return m_button_down; } inline float printScaleX() const { return print_scaleX; } inline float printScaleY() const { return print_scaleY; } inline void setPrintScaleX(float x) { print_scaleX = x; } inline void setPrintScaleY(float y) { print_scaleY = y; } void saveHistory() { history.push_front(SelectionHistoryItem(m_minx, m_maxx)); if (history.size() > max_history) { history.pop_back(); } } //! \brief Returns true if all Graph objects contain NO day data. ie, graph area is completely empty. bool isEmpty(); Day * day() { return m_day; } //! \brief Tell all graphs to deslect any highlighted areas void deselect(); QPoint pointClicked() const { return m_point_clicked; } void setPointClicked(QPoint p) { m_point_clicked = p; } //! \brief Set a redraw timer for ms milliseconds, clearing any previous redraw timer. void timedRedraw(int ms=0); gGraph *m_selected_graph; gToolTip *m_tooltip; QTimer *timer; //! \brief Add the Text information to the Text Drawing Queue (called by gGraphs renderText method) void AddTextQue(const QString &text, QRectF rect, quint32 flags, float angle = 0.0, QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true); //! \brief Add the Text information to the Text Drawing Queue (called by gGraphs renderText method) void AddTextQue(const QString &text, short x, short y, float angle = 0.0, QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true); // //! \brief Draw all Text in the text drawing queue // void DrawTextQue(); //! \brief Draw all text components using QPainter object painter void DrawTextQue(QPainter &painter); //! \brief Returns number of graphs contained (whether they are visible or not) int size() const { return m_graphs.size(); } //! \brief Return individual graph by index value gGraph *operator[](int i) { return m_graphs[i]; } //! \brief Returns the custom scrollbar object linked to this gGraphArea MyScrollBar *scrollBar() const { return m_scrollbar; } //! \brief Sets the custom scrollbar object linked to this gGraphArea void setScrollBar(MyScrollBar *sb); //! \brief Calculates the correct scrollbar parameters for all visible, non empty graphs. void updateScrollBar(); //! \brief Called on resize, fits graphs when too few to show, by scaling to fit screen size. Calls updateScrollBar() void updateScale(); // update scale & Scrollbar //! \brief Returns a count of all visible, non-empty Graphs. int visibleGraphs(); //! \brief Returns the horizontal travel of the mouse, for use in Mouse Handling code. int horizTravel() const { return m_horiz_travel; } //! \brief Sets the message displayed when there are no graphs to draw void setEmptyText(QString s) { m_emptytext = s; } //! \brief Returns the message displayed when there are no graphs to draw QString emptyText() { return m_emptytext; } //! \brief Sets the message displayed when there are no graphs to draw void setEmptyImage(QPixmap pm) { m_emptyimage = pm; } inline const float &devicePixelRatio() { return m_dpr; } void setDevicePixelRatio(float dpr) { m_dpr = dpr; } #ifdef ENABLE_THREADED_DRAWING QMutex text_mutex; QMutex gl_mutex; QSemaphore *masterlock; bool useThreads() { return m_idealthreads > 1; } QVector m_threads; int m_idealthreads; QMutex dl_mutex; #endif //! \brief Sends day object to be distributed to all Graphs Layers objects void setDay(Day *day); //! \brief pops a graph off the list for multithreaded drawing code gGraph *popGraph(); // exposed for multithreaded drawing //! \brief Hides the splitter, used in report printing code void hideSplitter() { m_showsplitter = false; } //! \brief Re-enabled the in-between graph splitters. void showSplitter() { m_showsplitter = true; } //! \brief Trash all graph objects listed (without destroying Graph contents) void trashGraphs(bool destroy); //! \brief Enable or disable the Text Pixmap Caching system preference overide void setUsePixmapCache(bool b) { use_pixmap_cache = b; } //! \brief Return whether or not the Pixmap Cache for text rendering is being used. bool usePixmapCache(); //! \brief Graph drawing routines, returns true if there weren't any graphs to draw bool renderGraphs(QPainter &painter); //! \brief Used internally by graph mousehandler to set modifier state void setMetaSelect(bool b) { m_metaselect = b; } //! \brief The current time the mouse pointer is hovering over inline double currentTime() { return m_currenttime; } //! \brief Returns a context formatted text string with the currently selected time range QString getRangeString(); Layer * findLayer(gGraph * graph, LayerType type); void populateMenu(gGraph *); QMenu * limits_menu; QMenu * lines_menu; QMenu * plots_menu; QMenu * oximeter_menu; QMenu * cpap_menu; inline void setCurrentTime(double time) { m_currenttime = time; } inline QPoint currentMousePos() const { return m_mouse; } void dumpInfo(); void resetMouse() { m_mouse = QPoint(0,0); } void getSelectionTimes(qint64 & start, qint64 & end); //! \brief Whether to show a little authorship message down the bottom of empty graphs. void setShowAuthorMessage(bool b) { m_showAuthorMessage = b; } // for profiling purposes, a count of lines drawn in a single frame int lines_drawn_this_frame; int quads_drawn_this_frame; int strings_drawn_this_frame; int strings_cached_this_frame; QVector history; protected: virtual void leaveEvent (QEvent * event); //! \brief The heart of the drawing code #ifdef BROKEN_OPENGL_BUILD virtual void paintEvent(QPaintEvent *); #else virtual void paintGL(); #endif //! \brief Calculates the sum of all graph heights float totalHeight(); //! \brief Calculates the sum of all graph heights, taking scaling into consideration float scaleHeight(); //! \brief Update the OpenGL area when the screen is resized virtual void resizeEvent(QResizeEvent *); //! \brief Set the Vertical offset (used in scrolling) void setOffsetY(int offsetY); //! \brief Set the Horizontal offset (not used yet) void setOffsetX(int offsetX); //! \brief Mouse Moved somewhere in main gGraphArea, propagates to the individual graphs virtual void mouseMoveEvent(QMouseEvent *event); //! \brief Mouse Button Press Event somewhere in main gGraphArea, propagates to the individual graphs virtual void mousePressEvent(QMouseEvent *event); //! \brief Mouse Button Release Event somewhere in main gGraphArea, propagates to the individual graphs virtual void mouseReleaseEvent(QMouseEvent *event); //! \brief Mouse Button Double Click Event somewhere in main gGraphArea, propagates to the individual graphs virtual void mouseDoubleClickEvent(QMouseEvent *event); //! \brief Mouse Wheel Event somewhere in main gGraphArea, propagates to the individual graphs virtual void wheelEvent(QWheelEvent *event); //! \brief Keyboard event while main gGraphArea has focus. virtual void keyPressEvent(QKeyEvent *event); //! \brief Keyboard event while main gGraphArea has focus. virtual void keyReleaseEvent(QKeyEvent *event); //! \brief Add Graph to drawing queue, mainly for the benefit of multithreaded drawing code void queGraph(gGraph *, int originX, int originY, int width, int height); Day *m_day; //! \brief the list of graphs to draw this frame QList m_drawlist; //! \brief Linked graph object containing shared GL Context (in this app, daily view's gGraphView) gGraphView *m_shared; //! \brief List of all graphs contained in this area QList m_graphs; //! \brief List of all graphs contained, indexed by title QHash m_graphsbyname; //! \variable Vertical scroll offset (adjusted when scrollbar gets moved) int m_offsetY; //! \variable Horizontal scroll offset (unused, but can be made to work if necessary) int m_offsetX; //! \variable Scale used to enlarge graphs when less graphs than can fit on screen. float m_scaleY; float m_dpr; bool m_sizer_dragging; int m_sizer_index; bool m_button_down; QPoint m_point_clicked; QPoint m_point_released; bool m_metaselect; QPoint m_sizer_point; int m_horiz_travel; MyScrollBar *m_scrollbar; QTimer *redrawtimer; bool m_graph_dragging; int m_graph_index; //! \brief List of all queue text to draw.. not sure why I didn't use a vector here.. Might of been a leak issue QVector m_textque; //! \brief ANother text que with rect alignment capabilities... QVector m_textqueRect; int m_lastxpos, m_lastypos; QString m_emptytext; QPixmap m_emptyimage; bool m_showsplitter; qint64 m_minx, m_maxx; QVector fwd_history; float print_scaleX, print_scaleY; QPixmap previous_day_snapshot; QPixmap current_day_snapshot; bool m_fadingOut; bool m_fadingIn; bool m_limbo; bool m_fadedir; bool m_inAnimation; bool m_blockUpdates; QPoint m_mouse; double m_currenttime; QTime m_animationStarted; bool use_pixmap_cache; QPixmapCache pixmapcache; QTime horizScrollTime, vertScrollTime; QMenu * context_menu; QAction * pin_action; QPixmap pin_icon; gGraph *pin_graph; QAction * snap_action; QAction * zoom100_action; bool m_showAuthorMessage; signals: void updateCurrentTime(double); void updateRange(double,double); void GraphsChanged(); public slots: //! \brief Callback from the ScrollBar, to change scroll position void scrollbarValueChanged(int val); //! \brief Simply refreshes the GL view, called when timeout expires. void refreshTimeout(); //! \brief Call UpdateGL unless animation is in progress void redraw(); //! \brief Resets all contained graphs to have a uniform height. void resetLayout(); void resetZoom() { ResetBounds(true); } void dataChanged(); bool hasSnapshots(); void togglePin(); protected slots: void onLinesClicked(QAction *); void onPlotsClicked(QAction *); void onOverlaysClicked(QAction *); void onSnapshotGraphToggle(); }; #endif // GGRAPHVIEW_H sleepyhead-0.9.8/sleepyhead/Graphs/gspacer.h0000644000175000017500000000136112412506713020363 0ustar sergiosergio/* graph spacer Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GSPACER_H #define GSPACER_H #include "gGraphView.h" /*! \class gSpacer \brief A dummy graph spacer layer object */ class gSpacer: public Layer { public: gSpacer(int space = 20); // orientation? virtual void paint(QPainter &painter, gGraph &g, const QRegion ®ion) { Q_UNUSED(painter); Q_UNUSED(g); Q_UNUSED(region); } int space() { return m_space; } protected: int m_space; }; #endif // GSPACER_H sleepyhead-0.9.8/sleepyhead/Graphs/gStatsLine.h0000644000175000017500000000162212412506713021014 0ustar sergiosergio/* gStatsLine * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GSTATSLINE_H #define GSTATSLINE_H #include "SleepLib/machine.h" #include "gGraphView.h" /*! \class gStatsLine \brief Show a rendered stats area in place of a graph. This is currently unused */ class gStatsLine : public Layer { public: gStatsLine(ChannelID code, QString label = "", QColor textcolor = Qt::black); virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); void SetDay(Day *d); protected: QString m_label; QColor m_textcolor; EventDataType m_min, m_max, m_avg, m_p90; QString st_min, st_max, st_avg, st_p90; float m_tx, m_ty; }; #endif // GSTATSLINE_H sleepyhead-0.9.8/sleepyhead/Graphs/gSummaryChart.h0000644000175000017500000001135112412506713021525 0ustar sergiosergio/* gSummaryChart Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GBARCHART_H #define GBARCHART_H #include #include "gGraphView.h" #include "gXAxis.h" /*! \enum GraphType \value GT_BAR Display as a BarGraph \value GT_LINE Display as a line plot \value GT_SESSIONS Display type for session times chart */ enum GraphType { GT_BAR, GT_LINE, GT_POINTS, GT_SESSIONS }; /*! \class SummaryChart \brief The main overall chart type layer used in Overview page */ class SummaryChart: public Layer { public: //! \brief Constructs a SummaryChart with QString label, of GraphType type SummaryChart(QString label, GraphType type = GT_BAR); virtual ~SummaryChart(); //! \brief Renders the graph to the QPainter object virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); //! \brief Precalculation code prior to drawing. Day object is not needed here, it's just here for Layer compatability. virtual void SetDay(Day *day = nullptr); //! \brief Returns true if no data was found for this day during SetDay virtual bool isEmpty() { return m_empty; } //! \brief Adds a layer to the summaryChart (When in Bar mode, it becomes culminative, eg, the AHI chart) void addSlice(ChannelID code, QColor color, SummaryType type, EventDataType tval = 0.00f) { m_codes.push_back(code); m_colors.push_back(color); m_type.push_back(type); //m_zeros.push_back(ignore_zeros); m_typeval.push_back(tval); } //! \brief Deselect highlighting (the gold bar) virtual void deselect() { hl_day = -1; } //! \brief Returns true if currently selected.. virtual bool isSelected() { return hl_day >= 0; } //! \brief Sets the MachineType this SummaryChart is interested in void setMachineType(MachineType type) { m_machinetype = type; } //! \brief Returns the MachineType this SummaryChart is interested in MachineType machineType() { return m_machinetype; } virtual Layer * Clone() { SummaryChart * sc = new SummaryChart(m_label); Layer::CloneInto(sc); CloneInto(sc); return sc; } void CloneInto(SummaryChart * layer) { layer->m_orientation = m_orientation; layer->m_colors = m_colors; layer->m_codes = m_codes; layer->m_goodcodes = m_goodcodes; layer->m_type = m_type; layer->m_typeval = m_typeval; layer->m_values = m_values; layer->m_times = m_times; layer->m_hours = m_hours; layer->m_days = m_days; layer->m_empty = m_empty; layer->m_fday = m_fday; layer->m_label = m_label; layer->barw = barw; layer->l_offset = l_offset; layer->offset = offset; layer->l_left = l_left; layer->l_top = l_top; layer->l_width= l_width; layer->l_height = l_height; layer->rtop = rtop; layer->l_minx = l_minx; layer->l_maxx = l_maxx; layer->hl_day = hl_day; layer->m_graphtype = m_graphtype; layer->m_machinetype = m_machinetype; layer->tz_offset = tz_offset; layer->tz_hours = tz_hours; } protected: Qt::Orientation m_orientation; QVector m_colors; QVector m_codes; QVector m_goodcodes; //QVector m_zeros; QVector m_type; QVector m_typeval; QHash > m_values; QHash > m_times; QHash m_hours; QHash m_days; bool m_empty; int m_fday; QString m_label; float barw; // bar width from last draw qint64 l_offset; // last offset float offset; // in pixels; int l_left, l_top, l_width, l_height; int rtop; qint64 l_minx, l_maxx; int hl_day; //gGraph *graph; GraphType m_graphtype; MachineType m_machinetype; int tz_offset; float tz_hours; //! \brief Key was pressed that effects this layer virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph); //! \brief Mouse moved over this layers area (shows the hover-over tooltips here) virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); //! \brief Mouse Button was pressed over this area virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph); //! \brief Mouse Button was released over this area. (jumps to daily view here) virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph); }; #endif // GBARCHART_H sleepyhead-0.9.8/sleepyhead/Graphs/gspacer.cpp0000644000175000017500000000061012412506713020712 0ustar sergiosergio/* graph spacer Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "gspacer.h" gSpacer::gSpacer(int space) : Layer(NoChannel) { m_space = space; } sleepyhead-0.9.8/sleepyhead/Graphs/MinutesAtPressure.h0000644000175000017500000000552012412506713022402 0ustar sergiosergio/* Minutes At Pressure Graph Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef MINUTESATPRESSURE_H #define MINUTESATPRESSURE_H #include "Graphs/layer.h" #include "SleepLib/day.h" class MinutesAtPressure; class RecalcMAP:public QRunnable { friend class MinutesAtPressure; public: explicit RecalcMAP(MinutesAtPressure * map) :map(map), m_quit(false), m_done(false) {} virtual ~RecalcMAP(); virtual void run(); void quit(); protected: MinutesAtPressure * map; volatile bool m_quit; volatile bool m_done; }; class MinutesAtPressure:public Layer { friend class RecalcMAP; public: MinutesAtPressure(); virtual ~MinutesAtPressure(); virtual void recalculate(gGraph * graph); virtual void SetDay(Day *d); virtual bool isEmpty(); virtual int minimumHeight(); //! Draw filled rectangles behind Event Flag's, and an outlines around them all, Calls the individual paint for each gFlagLine virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); bool mousePressEvent(QMouseEvent *event, gGraph *graph); bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph); virtual void recalcFinished(); virtual Layer * Clone() { MinutesAtPressure * map = new MinutesAtPressure(); Layer::CloneInto(map); CloneInto(map); return map; } void CloneInto(MinutesAtPressure * layer) { mutex.lock(); timelock.lock(); layer->m_empty = m_empty; layer->m_minimum_height = m_minimum_height; layer->m_lastminx = m_lastminx; layer->m_lastmaxx = m_lastmaxx; layer->times = times; layer->chans = chans; layer->events = events; layer->maxtime = maxtime; layer->maxevents = maxevents; layer->m_presChannel = m_presChannel; layer->m_minpressure = m_minpressure; layer->m_maxpressure = m_maxpressure; layer->max_mins = max_mins; layer->ahis = ahis; mutex.unlock(); timelock.unlock(); } protected: QMutex timelock; QMutex mutex; bool m_empty; int m_minimum_height; qint64 m_lastminx; qint64 m_lastmaxx; gGraph * m_graph; RecalcMAP * m_remap; QMap times; QList chans; QHash > events; int maxtime; int maxevents; ChannelID m_presChannel; EventStoreType m_minpressure; EventStoreType m_maxpressure; EventDataType max_mins; QMap ahis; }; #endif // MINUTESATPRESSURE_H sleepyhead-0.9.8/sleepyhead/Graphs/graphdata.h0000644000175000017500000000735112412506713020677 0ustar sergiosergio/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * * gGraphData Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GRAPHDATA_H #define GRAPHDATA_H #include "graphlayer.h" #include "SleepLib/day.h" #include using namespace std; /*enum gDataType { gDT_Point, gDT_Point3D, gDT_Stacked, gDT_Segmented }; class gLayer; class gGraphData { public: gGraphData(int mp,gDataType t=gDT_Point); virtual ~gGraphData(); virtual void Reload(Day *day=nullptr) { day=day; } virtual void Update(Day *day=nullptr); //inline wxRealPoint & operator [](int i) { return vpoint[seg][i]; } //inline vector & Vec(int i) { return yaxis[i]; } //virtual inline const int & NP(int i) { return vnp[i]; } //virtual inline const int & MP(int i) { return vsize[i]; } inline const gDataType & Type() { return type; } virtual double CalcAverage()=0; virtual double CalcMinY()=0; virtual double CalcMaxY()=0; virtual inline double MaxX() { return max_x; } virtual inline double MinX() { return min_x; } virtual inline double MaxY() { return max_y; } virtual inline double MinY() { return min_y; } virtual inline void SetMaxX(double v) { max_x=v; if (max_x>real_max_x) max_x=real_max_x; } virtual inline void SetMinX(double v) { min_x=v; if (min_xreal_max_y) max_y=real_max_y; } virtual inline void SetMinY(double v) { min_y=v; if (min_y np; vector maxsize; bool IsReady() { return m_ready; } void SetReady(bool b) { m_ready=b; } bool isEmpty(); void AddLayer(gLayer *g); protected: virtual void AddSegment(int max_points) { max_points=max_points; } double real_min_x, real_max_x, real_min_y, real_max_y; double min_x, max_x, min_y, max_y; double force_min_y,force_max_y; int vc; gDataType type; int max_points; bool m_ready; list notify_layers; }; class QPointD { public: QPointD() {}; QPointD(double _x,double _y):X(_x),Y(_y) {}; //QPointD(const QPointD & ref):X(ref.X),Y(ref.Y) {}; double x() { return X; }; double y() { return Y; }; void setX(double v) { X=v; }; void setY(double v) { Y=v; }; protected: double X,Y; }; class gPointData:public gGraphData { public: gPointData(int mp); virtual ~gPointData(); virtual void Reload(Day *day=nullptr){ day=day; }; virtual void AddSegment(int max_points); virtual double CalcAverage(); virtual double CalcMinY(); virtual double CalcMaxY(); vector point; }; */ #endif // GRAPHDATA_H sleepyhead-0.9.8/sleepyhead/Graphs/layer.cpp0000644000175000017500000001457512412506713020421 0ustar sergiosergio/* Graph Layer Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "Graphs/layer.h" Layer::~Layer() { // for (int i = 0; i < mgl_buffers.size(); i++) { // delete mgl_buffers[i]; // } // for (int i = 0; i < mv_buffers.size(); i++) { // delete mv_buffers[i]; // } } //void Layer::drawGLBuf(float linesize) //{ // int type; // float size; // if (!m_visible) { return; } // GLBuffer *buf; // gVertexBuffer *vb; // for (int i = 0; i < mv_buffers.size(); i++) { // vb = mv_buffers[i]; // size = vb->size(); // type = vb->type(); // if ((linesize > size) && ((type == GL_LINES) || (type == GL_LINE_LOOP))) { // vb->setSize(linesize); // } // vb->draw(); // vb->setSize(size); // } // for (int i = 0; i < mgl_buffers.size(); i++) { // buf = mgl_buffers[i]; // size = buf->size(); // type = buf->type(); // if ((linesize > size) && ((type == GL_LINES) || (type == GL_LINE_LOOP))) { // buf->setSize(linesize); // } // buf->draw(); // //if ((linesize>size) && ((type==GL_LINES) || (type==GL_LINE_LOOP))) { // buf->setSize(size); // //} // } //} void Layer::CloneInto(Layer * layer) { layer->m_refcount = m_refcount; layer->m_day = m_day; layer->m_visible = m_visible; layer->m_movable = m_movable; layer->m_minx = m_minx; layer->m_maxx = m_maxx; layer->m_miny = m_miny; layer->m_maxy = m_maxy; layer->m_physmaxy = m_physmaxy; layer->m_physminy = m_physminy; layer->m_code = m_code; layer->m_width = m_width; layer->m_height = m_height; layer->m_X = m_X; layer->m_Y = m_Y; layer->m_order = m_order; layer->m_position = m_position; layer->m_rect = m_rect; layer->m_mouseover = m_mouseover; layer->m_recalculating = m_recalculating; layer->m_layertype = m_layertype; } void Layer::SetDay(Day *d) { m_day = d; if (d) { m_minx = d->first(m_code); m_maxx = d->last(m_code); m_miny = d->Min(m_code); m_maxy = d->Max(m_code); } else { m_day = nullptr; } } bool Layer::isEmpty() { //if (m_day && (m_day->count(m_code)>0)) if (m_day && (m_day->channelExists(m_code))) { return false; } return true; } void Layer::setLayout(LayerPosition position, short width, short height, short order) { m_position = position; m_width = width; m_height = height; m_order = order; } LayerGroup::~LayerGroup() { for (int i = 0; i < layers.size(); i++) { delete layers[i]; } } bool LayerGroup::isEmpty() { if (!m_day) { return true; } bool empty = true; for (int i = 0; i < layers.size(); i++) { if (layers[i]->isEmpty()) { empty = false; break; } } return empty; } //void LayerGroup::drawGLBuf(float linesize) //{ // Layer::drawGLBuf(linesize); // for (int i = 0; i < layers.size(); i++) { // layers[i]->drawGLBuf(linesize); // } //} void LayerGroup::SetDay(Day *d) { m_day = d; for (int i = 0; i < layers.size(); i++) { layers[i]->SetDay(d); } } void LayerGroup::AddLayer(Layer *l) { layers.push_back(l); l->addref(); } qint64 LayerGroup::Minx() { bool first = true; qint64 m = 0, t; for (int i = 0; i < layers.size(); i++) { t = layers[i]->Minx(); if (!t) { continue; } if (first) { m = t; first = false; } else if (m > t) { m = t; } } return m; } qint64 LayerGroup::Maxx() { bool first = true; qint64 m = 0, t; for (int i = 0; i < layers.size(); i++) { t = layers[i]->Maxx(); if (!t) { continue; } if (first) { m = t; first = false; } else if (m < t) { m = t; } } return m; } EventDataType LayerGroup::Miny() { bool first = true; EventDataType m = 0, t; for (int i = 0; i < layers.size(); i++) { t = layers[i]->Miny(); if (t == layers[i]->Maxy()) { continue; } if (first) { m = t; first = false; } else { if (m > t) { m = t; } } } return m; } EventDataType LayerGroup::Maxy() { bool first = true; EventDataType m = 0, t; for (int i = 0; i < layers.size(); i++) { t = layers[i]->Maxy(); if (t == layers[i]->Miny()) { continue; } if (first) { m = t; first = false; } else if (m < t) { m = t; } } return m; } //! \brief Mouse wheel moved somewhere over this layer bool LayerGroup::wheelEvent(QWheelEvent *event, gGraph *graph) { for (int i = 0; i < layers.size(); i++) if (layers[i]->wheelEvent(event, graph)) { return true; } return false; } //! \brief Mouse moved somewhere over this layer bool LayerGroup::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { for (int i = 0; i < layers.size(); i++) if (layers[i]->mouseMoveEvent(event, graph)) { return true; } return false; } //! \brief Mouse left or right button pressed somewhere on this layer bool LayerGroup::mousePressEvent(QMouseEvent *event, gGraph *graph) { for (int i = 0; i < layers.size(); i++) if (layers[i]->mousePressEvent(event, graph)) { return true; } return false; } //! \brief Mouse button released that was originally pressed somewhere on this layer bool LayerGroup::mouseReleaseEvent(QMouseEvent *event, gGraph *graph) { for (int i = 0; i < layers.size(); i++) if (layers[i]->mouseReleaseEvent(event, graph)) { return true; } return false; } //! \brief Mouse button double clicked somewhere on this layer bool LayerGroup::mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph) { for (int i = 0; i < layers.size(); i++) if (layers[i]->mouseDoubleClickEvent(event, graph)) { return true; } return false; } //! \brief A key was pressed on the keyboard while the graph area was focused. bool LayerGroup::keyPressEvent(QKeyEvent *event, gGraph *graph) { for (int i = 0; i < layers.size(); i++) if (layers[i]->keyPressEvent(event, graph)) { return true; } return false; } sleepyhead-0.9.8/sleepyhead/Graphs/gSegmentChart.h0000644000175000017500000000453212412506713021475 0ustar sergiosergio/* gSegmentChart Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GSEGMENTCHART_H #define GSEGMENTCHART_H #include "gGraphView.h" enum GraphSegmentType { GST_Pie, GST_CandleStick, GST_Line }; /*! \class gSegmentChart \brief Draws a PieChart, CandleStick or 2D Line plots containing multiple Channel 'slices' */ class gSegmentChart : public Layer { public: gSegmentChart(GraphSegmentType gt = GST_Pie, QColor gradient_color = Qt::white, QColor outline_color = Qt::black); virtual ~gSegmentChart(); //! \brief The drawing code that fills the Vertex buffers virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); //! \brief Pre-fills a buffer with the data needed to draw virtual void SetDay(Day *d); //! \brief Returns true if no data available for drawing virtual bool isEmpty(); //! \brief Adds a channel slice, and sets the color and label void AddSlice(ChannelID code, QColor col, QString name = ""); //! \brief Sets the fade-out color to make the graphs look more attractive void setGradientColor(QColor &color) { m_gradient_color = color; } //! \brief Sets the outline color for the edges drawn around the Pie slices void setOutlineColor(QColor &color) { m_outline_color = color; } const GraphSegmentType &graphType() { return m_graph_type; } void setGraphType(GraphSegmentType type) { m_graph_type = type; } protected: QVector m_codes; QVector m_names; QVector m_values; QVector m_colors; EventDataType m_total; GraphSegmentType m_graph_type; QColor m_gradient_color; QColor m_outline_color; bool m_empty; }; /*! \class gTAPGraph \brief Time at Pressure chart, derived from gSegmentChart \notes Currently unused */ class gTAPGraph: public gSegmentChart { public: gTAPGraph(ChannelID code, GraphSegmentType gt = GST_CandleStick, QColor gradient_color = Qt::lightGray, QColor outline_color = Qt::black); virtual ~gTAPGraph(); virtual void SetDay(Day *d); protected: ChannelID m_code; }; #endif // GSEGMENTCHART_H sleepyhead-0.9.8/sleepyhead/Graphs/gXAxis.h0000644000175000017500000001045312412506713020144 0ustar sergiosergio/* gXAxis Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GXAXIS_H #define GXAXIS_H #include #include #include "Graphs/layer.h" /*! \class gXAxis \brief Draws the XTicker timescales underneath graphs */ class gXAxis: public Layer { public: static const int Margin = 30; // How much room does this take up. (Bottom margin) public: gXAxis(QColor col = Qt::black, bool fadeout = true); virtual ~gXAxis(); virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); void SetShowMinorLines(bool b) { m_show_minor_lines = b; } void SetShowMajorLines(bool b) { m_show_major_lines = b; } bool ShowMinorLines() { return m_show_minor_lines; } bool ShowMajorLines() { return m_show_major_lines; } void SetShowMinorTicks(bool b) { m_show_minor_ticks = b; } void SetShowMajorTicks(bool b) { m_show_major_ticks = b; } bool ShowMinorTicks() { return m_show_minor_ticks; } bool ShowMajorTicks() { return m_show_major_ticks; } void setUtcFix(bool b) { m_utcfix = b; } void setRoundDays(bool b) { m_roundDays = b; } //! \brief Returns the minimum height needed to fit virtual int minimumHeight(); virtual Layer * Clone() { gXAxis * xaxis = new gXAxis(); Layer::CloneInto(xaxis); CloneInto(xaxis); return xaxis; } void CloneInto(gXAxis * layer) { layer->m_show_major_ticks = m_show_major_ticks; layer->m_show_minor_ticks = m_show_minor_ticks; layer->m_show_major_lines = m_show_major_lines; layer->m_show_minor_lines = m_show_minor_lines; layer->m_major_color = m_major_color; layer->m_minor_color = m_minor_color; layer->m_line_color = m_line_color; layer->m_text_color = m_text_color; layer->m_utcfix = m_utcfix; layer->m_fadeout = m_fadeout; layer->tz_offset = tz_offset; layer->tz_hours = tz_hours; layer->m_image = m_image; layer->m_roundDays = m_roundDays; } protected: bool m_show_major_lines; bool m_show_minor_lines; bool m_show_minor_ticks; bool m_show_major_ticks; bool m_utcfix; QColor m_line_color; QColor m_text_color; QColor m_major_color; QColor m_minor_color; bool m_fadeout; qint64 tz_offset; float tz_hours; QImage m_image; bool m_roundDays; }; class gXAxisDay: public Layer { public: static const int Margin = 30; // How much room does this take up. (Bottom margin) public: gXAxisDay(QColor col = Qt::black); virtual ~gXAxisDay(); virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); void SetShowMinorLines(bool b) { m_show_minor_lines = b; } void SetShowMajorLines(bool b) { m_show_major_lines = b; } bool ShowMinorLines() { return m_show_minor_lines; } bool ShowMajorLines() { return m_show_major_lines; } void SetShowMinorTicks(bool b) { m_show_minor_ticks = b; } void SetShowMajorTicks(bool b) { m_show_major_ticks = b; } bool ShowMinorTicks() { return m_show_minor_ticks; } bool ShowMajorTicks() { return m_show_major_ticks; } //! \brief Returns the minimum height needed to fit virtual int minimumHeight(); virtual Layer * Clone() { gXAxisDay * xaxis = new gXAxisDay(); Layer::CloneInto(xaxis); CloneInto(xaxis); return xaxis; } void CloneInto(gXAxisDay * layer) { layer->m_show_major_ticks = m_show_major_ticks; layer->m_show_minor_ticks = m_show_minor_ticks; layer->m_show_major_lines = m_show_major_lines; layer->m_show_minor_lines = m_show_minor_lines; layer->m_major_color = m_major_color; layer->m_minor_color = m_minor_color; layer->m_line_color = m_line_color; layer->m_text_color = m_text_color; layer->m_image = m_image; } protected: bool m_show_major_lines; bool m_show_minor_lines; bool m_show_minor_ticks; bool m_show_major_ticks; QColor m_line_color; QColor m_text_color; QColor m_major_color; QColor m_minor_color; QImage m_image; }; #endif // GXAXIS_H sleepyhead-0.9.8/sleepyhead/Graphs/gSessionTimesChart.cpp0000644000175000017500000013224012412506713023051 0ustar sergiosergio/* gSessionTimesChart Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include "mainwindow.h" #include "SleepLib/profiles.h" #include "gSessionTimesChart.h" #include "gYAxis.h" extern MainWindow * mainwin; short SummaryCalcItem::midcalc; gSummaryChart::gSummaryChart(QString label, MachineType machtype) :Layer(NoChannel), m_label(label), m_machtype(machtype) { m_layertype = LT_Overview; QDateTime d1 = QDateTime::currentDateTime(); QDateTime d2 = d1; d1.setTimeSpec(Qt::UTC); // CHECK: Does this deal with DST? tz_offset = d2.secsTo(d1); tz_hours = tz_offset / 3600.0; expected_slices = 5; } gSummaryChart::gSummaryChart(ChannelID code, MachineType machtype) :Layer(code), m_machtype(machtype) { m_layertype = LT_Overview; QDateTime d1 = QDateTime::currentDateTime(); QDateTime d2 = d1; d1.setTimeSpec(Qt::UTC); // CHECK: Does this deal with DST? tz_offset = d2.secsTo(d1); tz_hours = tz_offset / 3600.0; expected_slices = 5; addCalc(code, ST_MIN, brighten(schema::channel[code].defaultColor() ,0.90)); addCalc(code, ST_MID, brighten(schema::channel[code].defaultColor() ,1.30)); addCalc(code, ST_90P, brighten(schema::channel[code].defaultColor() ,1.50)); addCalc(code, ST_MAX, brighten(schema::channel[code].defaultColor() ,1.80)); } gSummaryChart::~gSummaryChart() { } void gSummaryChart::SetDay(Day *unused_day) { cache.clear(); Q_UNUSED(unused_day) Layer::SetDay(nullptr); firstday = p_profile->FirstDay(m_machtype); lastday = p_profile->LastDay(m_machtype); dayindex.clear(); daylist.clear(); if (!firstday.isValid() || !lastday.isValid()) return; // daylist.reserve(firstday.daysTo(lastday)+1); QDate date = firstday; int idx = 0; do { QMap::iterator di = p_profile->daylist.find(date); Day * day = nullptr; if (di != p_profile->daylist.end()) { day = di.value(); } daylist.append(day); dayindex[date] = idx; idx++; date = date.addDays(1); } while (date <= lastday); m_minx = QDateTime(firstday, QTime(0,0,0)).toMSecsSinceEpoch(); m_maxx = QDateTime(lastday, QTime(23,59,59)).toMSecsSinceEpoch(); m_miny = 0; m_maxy = 20; m_empty = false; } //QMap gSummaryChart::dayindex; //QList gSummaryChart::daylist; bool gSummaryChart::keyPressEvent(QKeyEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) return false; } bool gSummaryChart::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) return false; } bool gSummaryChart::mousePressEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) return false; } bool gSummaryChart::mouseReleaseEvent(QMouseEvent *event, gGraph *graph) { if (!(event->modifiers() & Qt::ShiftModifier)) return false; float x = event->x() - m_rect.left(); float y = event->y() - m_rect.top(); qDebug() << x << y; EventDataType miny; EventDataType maxy; graph->roundY(miny, maxy); QDate date = QDateTime::fromMSecsSinceEpoch(m_minx).date(); int days = ceil(double(m_maxx - m_minx) / 86400000.0); float barw = float(m_rect.width()) / float(days); float idx = x/barw; date = date.addDays(idx); QMap::iterator it = dayindex.find(date); if (it != dayindex.end()) { Day * day = daylist.at(it.value()); if (day) { mainwin->getDaily()->LoadDate(date); mainwin->JumpDaily(); } } return true; } void gSummaryChart::preCalc() { midcalc = p_profile->general->prefCalcMiddle(); for (int i=0; i & slices) { int size = slices.size(); if (size != calcitems.size()) { return; } float hour = day->hours(m_machtype); for (int i=0; i < size; ++i) { const SummaryChartSlice & slice = slices.at(i); SummaryCalcItem & calc = calcitems[i]; calc.update(slice.value, hour); } } void gSummaryChart::afterDraw(QPainter &painter, gGraph &graph, QRect rect) { if (totaldays == nousedays) return; if (calcitems.size() == 0) return; QStringList strlist; QString txt; int midcalc = p_profile->general->prefCalcMiddle(); QString midstr; if (midcalc == 0) { midstr = QObject::tr("Med."); } else if (midcalc == 1) { midstr = QObject::tr("W-Avg"); } else { midstr = QObject::tr("Avg"); } float perc = p_profile->general->prefCalcPercentile(); QString percstr = QObject::tr("%1%").arg(perc, 0, 'f',0); schema::Channel & chan = schema::channel[calcitems.at(0).code]; for (int i=0; i 0) { mid = median(calc.median_data.begin(), calc.median_data.end()); } break; case 1: mid = calc.wavg_sum / calc.divisor; break; case 2: mid = calc.avg_sum / calc.cnt; break; } float val = 0; switch (calc.type) { case ST_CPH: val = mid; txt = midstr+": "; break; case ST_SPH: val = mid; txt = midstr+": "; break; case ST_MIN: val = calc.min; if (val >= 99998) continue; txt = QObject::tr("Min: "); break; case ST_MAX: val = calc.max; if (val <= -99998) continue; txt = QObject::tr("Max: "); break; case ST_SETMIN: val = calc.min; if (val >= 99998) continue; txt = QObject::tr("Min: "); break; case ST_SETMAX: val = calc.max; if (val <= -99998) continue; txt = QObject::tr("Max: "); break; case ST_MID: val = mid; txt = QObject::tr("%1: ").arg(midstr); break; case ST_90P: val = mid; txt = QObject::tr("%1: ").arg(percstr); break; default: val = mid; txt = QObject::tr("???: "); break; } strlist.append(QString("%1%2").arg(txt).arg(val,0,'f',2)); if (calcitems.size() == 1) { val = calc.max; if (val > -99998) strlist.append(QObject::tr("Max: %1").arg(val,0,'f',2)); } } QString str; if (totaldays > 1) { str = QObject::tr("%1 (%2 days): ").arg(chan.fullname()).arg(totaldays); } else { str = QObject::tr("%1 (%2 day): ").arg(chan.fullname()).arg(totaldays); } str += " "+strlist.join(", "); QRectF rec(rect.left(), rect.top(), 0,0); painter.setFont(*defaultfont); rec = painter.boundingRect(rec, Qt::AlignTop, str); rec.moveBottom(rect.top()-3*graph.printScaleY()); painter.drawText(rec, Qt::AlignTop, str); // graph.renderText(str, rect.left(), rect.top()-5*graph.printScaleY(), 0); } QString gSummaryChart::tooltipData(Day *, int idx) { QVector & slices = cache[idx]; QString txt; for (int i=0; i< slices.size(); ++i) { SummaryChartSlice & slice = slices[i]; txt += QString("\n%1: %2").arg(slice.name).arg(float(slice.value), 0, 'f', 2); } return txt; } void gSummaryChart::populate(Day * day, int idx) { int size = calcitems.size(); bool good = false; for (int i=0; i < size; ++i) { const SummaryCalcItem & item = calcitems.at(i); if (day->hasData(item.code, item.type)) { good = true; break; } } if (!good) return; QVector & slices = cache[idx]; float hours = day->hours(m_machtype); float base = 0; for (int i=0; i < size; ++i) { SummaryCalcItem & item = calcitems[i]; ChannelID code = item.code; schema::Channel & chan = schema::channel[code]; float value = 0; QString name; QColor color; switch (item.type) { case ST_CPH: value = day->count(code) / hours; name = chan.label(); color = item.color; slices.append(SummaryChartSlice(&item, value, value, name, color)); break; case ST_SPH: value = (100.0 / hours) * (day->sum(code) / 3600.0); name = QObject::tr("% in %1").arg(chan.label()); color = item.color; slices.append(SummaryChartSlice(&item, value, value, name, color)); break; case ST_HOURS: value = hours; name = QObject::tr("Hours"); color = COLOR_LightBlue; slices.append(SummaryChartSlice(&item, hours, hours, name, color)); break; case ST_MIN: value = day->Min(code); name = QObject::tr("Min %1").arg(chan.label()); color = item.color; slices.append(SummaryChartSlice(&item, value, value - base, name, color)); base = value; break; case ST_MID: value = day->calcMiddle(code); name = day->calcMiddleLabel(code); color = item.color; slices.append(SummaryChartSlice(&item, value, value - base, name, color)); base = value; break; case ST_90P: value = day->calcPercentile(code); name = day->calcPercentileLabel(code); color = item.color; slices.append(SummaryChartSlice(&item, value, value - base, name, color)); base = value; break; case ST_MAX: value = day->calcMax(code); name = day->calcMaxLabel(code); color = item.color; slices.append(SummaryChartSlice(&item, value, value - base, name, color)); base = value; break; default: break; } } } void gSummaryChart::paint(QPainter &painter, gGraph &graph, const QRegion ®ion) { QRect rect = region.boundingRect(); painter.setPen(QColor(Qt::black)); painter.drawRect(rect); rect.moveBottom(rect.bottom()+1); m_minx = graph.min_x; m_maxx = graph.max_x; QDateTime date2 = QDateTime::fromMSecsSinceEpoch(m_minx); QDateTime enddate2 = QDateTime::fromMSecsSinceEpoch(m_maxx); QDate date = date2.date(); QDate enddate = enddate2.date(); int days = ceil(double(m_maxx - m_minx) / 86400000.0); //float lasty1 = rect.bottom(); QMap::iterator it = dayindex.find(date); idx_start=0; if (it != dayindex.end()) { idx_start = it.value(); } int idx = idx_start; QMap::iterator ite = dayindex.find(enddate); idx_end = daylist.size()-1; if (ite != dayindex.end()) { idx_end = ite.value(); } QPoint mouse = graph.graphView()->currentMousePos(); nousedays = 0; totaldays = 0; QRectF hl_rect; QDate hl_date; Day * hl_day = nullptr; int hl_idx = -1; bool hl = false; if ((daylist.size() == 0) || (it == dayindex.end())) return; Day * lastday = nullptr; // int dc = 0; // for (int i=idx; i<=idx_end; ++i) { // Day * day = daylist.at(i); // if (day || lastday) { // dc++; // } // lastday = day; // } // days = dc; // lastday = nullptr; float barw = float(rect.width()) / float(days); QString hl2_text = ""; QVector outlines; int size = idx_end - idx; outlines.reserve(size * expected_slices); // Virtual call to setup any custom graph stuff preCalc(); float lastx1 = rect.left(); float right_edge = (rect.left()+rect.width()+1); ///////////////////////////////////////////////////////////////////// /// Calculate Graph Peaks ///////////////////////////////////////////////////////////////////// peak_value = 0; for (int i=idx; i <= idx_end; ++i, lastx1 += barw) { Day * day = daylist.at(i); if ((lastx1 + barw) > right_edge) break; if (!day) { continue; } day->OpenSummary(); QHash >::iterator cit = cache.find(i); if (cit == cache.end()) { populate(day, i); cit = cache.find(i); } if (cit != cache.end()) { QVector & list = cit.value(); float base = 0, val; int listsize = list.size(); for (int j=0; j < listsize; ++j) { SummaryChartSlice & slice = list[j]; val = slice.height; base += val; } peak_value = qMax(peak_value, base); } } m_miny = 0; m_maxy = ceil(peak_value); ///////////////////////////////////////////////////////////////////// /// Y-Axis scaling ///////////////////////////////////////////////////////////////////// EventDataType miny; EventDataType maxy; graph.roundY(miny, maxy); float ymult = float(rect.height()) / (maxy-miny); lastx1 = rect.left(); ///////////////////////////////////////////////////////////////////// /// Main drawing loop ///////////////////////////////////////////////////////////////////// do { Day * day = daylist.at(idx); if ((lastx1 + barw) > right_edge) break; totaldays++; if (!day) {// || !day->hasMachine(m_machtype)) { // lasty1 = rect.bottom(); lastx1 += barw; it++; nousedays++; lastday = day; continue; } lastday = day; float x1 = lastx1 + barw; day->OpenSummary(); QRectF hl2_rect; bool hlday = false; QRectF rec2(lastx1, rect.top(), barw, rect.height()); if (rec2.contains(mouse)) { hl_rect = rec2; hl_day = day; hl_date = it.key(); hl_idx = idx; hl = true; hlday = true; } QHash >::iterator cit = cache.find(idx); if (cit == cache.end()) { populate(day, idx); cit = cache.find(idx); } float lastval = 0, val, y1,y2; if (cit != cache.end()) { ///////////////////////////////////////////////////////////////////////////////////// /// Draw pressure settings ///////////////////////////////////////////////////////////////////////////////////// QVector & list = cit.value(); customCalc(day, list); int listsize = list.size(); QLinearGradient gradient(lastx1, 0, lastx1 + barw, 0); //rect.bottom(), barw, rect.bottom()); for (int i=0; i < listsize; ++i) { SummaryChartSlice & slice = list[i]; val = slice.height; y1 = ((lastval-miny) * ymult); y2 = (val * ymult); QColor color = slice.color; QRectF rec = QRectF(lastx1, rect.bottom() - y1, barw, -y2).intersected(rect); if (hlday) { if (rec.contains(mouse.x(), mouse.y())) { color = Qt::yellow; hl2_rect = rec; } } if (barw <= 3) { painter.fillRect(rec, QBrush(color)); } else if (barw > 8) { gradient.setColorAt(0,color); gradient.setColorAt(1,brighten(color, 2.0)); painter.fillRect(rec, QBrush(gradient)); // painter.fillRect(rec, slice.brush); outlines.append(rec); } else { painter.fillRect(rec, QBrush(brighten(color,1.25))); outlines.append(rec); } lastval += val; } } lastx1 = x1; it++; } while (++idx <= idx_end); painter.setPen(QPen(Qt::black,1)); painter.drawRects(outlines); if (hl) { QColor col2(255,0,0,64); painter.fillRect(hl_rect, QBrush(col2)); QString txt = hl_date.toString(Qt::SystemLocaleShortDate)+" "; if (hl_day) { // grab extra tooltip data txt += tooltipData(hl_day, hl_idx); if (!hl2_text.isEmpty()) { QColor col = Qt::yellow; col.setAlpha(255); // painter.fillRect(hl2_rect, QBrush(col)); txt += hl2_text; } } graph.ToolTip(txt, mouse.x()-15, mouse.y()+5, TT_AlignRight); } try { afterDraw(painter, graph, rect); } catch(...) { qDebug() << "Bad median call in" << m_label; } // This could be turning off graphs prematurely.. if (cache.size() == 0) { m_empty = true; graph.graphView()->updateScale(); } } QString gUsageChart::tooltipData(Day * day, int) { return QObject::tr("\nHours: %1").arg(day->hours(m_machtype), 0, 'f', 2); } void gUsageChart::populate(Day *day, int idx) { QVector & slices = cache[idx]; float hours = day->hours(); QColor cpapcolor = day->summaryOnly() ? QColor(128,128,128) : calcitems[0].color; bool haveoxi = day->hasMachine(MT_OXIMETER); QColor goodcolor = haveoxi ? QColor(128,255,196) : cpapcolor; QColor color = (hours < compliance_threshold) ? QColor(255,64,64) : goodcolor; slices.append(SummaryChartSlice(&calcitems[0], hours, hours, QObject::tr("Hours"), color)); } void gUsageChart::preCalc() { midcalc = p_profile->general->prefCalcMiddle(); compliance_threshold = p_profile->cpap->complianceHours(); incompdays = 0; SummaryCalcItem & calc = calcitems[0]; calc.reset(idx_end - idx_start); } void gUsageChart::customCalc(Day *, QVector &list) { if (list.size() == 0) { incompdays++; return; } SummaryChartSlice & slice = list[0]; SummaryCalcItem & calc = calcitems[0]; if (slice.value < compliance_threshold) incompdays++; calc.update(slice.value, 1); } void gUsageChart::afterDraw(QPainter &, gGraph &graph, QRect rect) { if (totaldays == nousedays) return; if (totaldays > 1) { float comp = 100.0 - ((float(incompdays + nousedays) / float(totaldays)) * 100.0); int midcalc = p_profile->general->prefCalcMiddle(); float mid = 0; SummaryCalcItem & calc = calcitems[0]; switch (midcalc) { case 0: // median mid = median(calc.median_data.begin(), calc.median_data.end()); break; case 1: // w-avg mid = calc.wavg_sum / calc.divisor; break; case 2: mid = calc.avg_sum / calc.cnt; break; } QString txt = QObject::tr("%1 low usage, %2 no usage, out of %3 days (%4% compliant.) Length: %5 / %6 / %7"). arg(incompdays).arg(nousedays).arg(totaldays).arg(comp,0,'f',1).arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2);; graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0); } } void gSessionTimesChart::preCalc() { midcalc = p_profile->general->prefCalcMiddle(); num_slices = 0; num_days = 0; total_length = 0; SummaryCalcItem & calc = calcitems[0]; calc.reset((idx_end - idx_start) * 6); SummaryCalcItem & calc1 = calcitems[1]; calc1.reset(idx_end - idx_start); SummaryCalcItem & calc2 = calcitems[2]; calc2.reset(idx_end - idx_start); } void gSessionTimesChart::customCalc(Day *, QVector & slices) { int size = slices.size(); num_slices += size; SummaryCalcItem & calc1 = calcitems[1]; calc1.update(slices.size(), 1); EventDataType max = 0; for (int i=0; igeneral->prefCalcMiddle(); float mid = 0, mid1 = 0, midlongest = 0; switch (midcalc) { case 0: if (calc.median_data.size() > 0) { mid = median(calc.median_data.begin(), calc.median_data.end()); mid1 = median(calc1.median_data.begin(), calc1.median_data.end()); midlongest = median(calc2.median_data.begin(), calc2.median_data.end()); } break; case 1: mid = calc.wavg_sum / calc.divisor; mid1 = calc1.wavg_sum / calc1.divisor; midlongest = calc2.wavg_sum / calc2.divisor; break; case 2: mid = calc.avg_sum / calc.cnt; mid1 = calc1.avg_sum / calc1.cnt; midlongest = calc2.avg_sum / calc2.cnt; break; } // float avgsess = float(num_slices) / float(num_days); QString txt = QObject::tr("Sessions: %1 / %2 / %3 Length: %4 / %5 / %6 Longest: %7 / %8 / %9") .arg(calc1.min, 0, 'f', 2).arg(mid1, 0, 'f', 2).arg(calc1.max, 0, 'f', 2) .arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2) .arg(calc2.min, 0, 'f', 2).arg(midlongest, 0, 'f', 2).arg(calc2.max, 0, 'f', 2); graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0); } void gSessionTimesChart::paint(QPainter &painter, gGraph &graph, const QRegion ®ion) { QRect rect = region.boundingRect(); painter.setPen(QColor(Qt::black)); painter.drawRect(rect); m_minx = graph.min_x; m_maxx = graph.max_x; QDateTime date2 = QDateTime::fromMSecsSinceEpoch(m_minx); QDateTime enddate2 = QDateTime::fromMSecsSinceEpoch(m_maxx); QDate date = date2.date(); QDate enddate = enddate2.date(); int days = ceil(double(m_maxx - m_minx) / 86400000.0); float barw = float(rect.width()) / float(days); QDateTime splittime; // float lasty1 = rect.bottom(); float lastx1 = rect.left(); QMap::iterator it = dayindex.find(date); int idx=0; if (it != dayindex.end()) { idx = it.value(); } QMap::iterator ite = dayindex.find(enddate); int idx_end = daylist.size()-1; if (ite != dayindex.end()) { idx_end = ite.value(); } QPoint mouse = graph.graphView()->currentMousePos(); if (daylist.size() == 0) return; QVector outlines; int size = idx_end - idx; outlines.reserve(size * 5); QMap::iterator it2 = it; ///////////////////////////////////////////////////////////////////// /// Calculate Graph Peaks ///////////////////////////////////////////////////////////////////// peak_value = 0; min_value = 999; QMap::iterator it_end = dayindex.end(); float right_edge = (rect.left()+rect.width()+1); for (int i=idx; (i <= idx_end) && (it2 != it_end); ++i, ++it2, lastx1 += barw) { Day * day = daylist.at(i); if ((lastx1 + barw) > right_edge) break; if (!day) { continue; } QHash >::iterator cit = cache.find(i); if (cit == cache.end()) { day->OpenSummary(); date = it2.key(); splittime = QDateTime(date, split); QList::iterator si; QVector & slices = cache[i]; bool haveoxi = day->hasMachine(MT_OXIMETER); QColor goodcolor = haveoxi ? QColor(128,255,196) : QColor(64,128,255); QString datestr = date.toString(Qt::SystemLocaleShortDate); for (si = day->begin(); si != day->end(); ++si) { Session *sess = (*si); if (!sess->enabled() || (sess->type() != m_machtype)) continue; // Look at mask on/off slices... int slize = sess->m_slices.size(); if (slize > 0) { // segments for (int j=0; jm_slices.at(j); QDateTime st = QDateTime::fromMSecsSinceEpoch(slice.start); float s1 = float(splittime.secsTo(st)) / 3600.0; float s2 = double(slice.end - slice.start) / 3600000.0; QColor col = (slice.status == EquipmentOn) ? goodcolor : Qt::black; QString txt = QObject::tr("%1\nLength: %3\nStart: %2\n").arg(datestr).arg(st.time().toString("hh:mm:ss")).arg(s2,0,'f',2); txt += (slice.status == EquipmentOn) ? QObject::tr("Mask On") : QObject::tr("Mask Off"); slices.append(SummaryChartSlice(&calcitems[0], s1, s2, txt, col)); } } else { // otherwise just show session duration qint64 sf = sess->first(); QDateTime st = QDateTime::fromMSecsSinceEpoch(sf); float s1 = float(splittime.secsTo(st)) / 3600.0; float s2 = sess->hours(); QString txt = QObject::tr("%1\nLength: %3\nStart: %2").arg(datestr).arg(st.time().toString("hh:mm:ss")).arg(s2,0,'f',2); slices.append(SummaryChartSlice(&calcitems[0], s1, s2, txt, goodcolor)); } } cit = cache.find(i); } if (cit != cache.end()) { QVector & list = cit.value(); int listsize = list.size(); float peak = 0, base = 999; for (int j=0; j < listsize; ++j) { SummaryChartSlice & slice = list[j]; float s1 = slice.value; float s2 = slice.height; peak = qMax(peak, s1+s2); base = qMin(base, s1); } peak_value = qMax(peak_value, peak); min_value = qMin(min_value, base); } } m_miny = (min_value < 999) ? floor(min_value) : 0; m_maxy = ceil(peak_value); ///////////////////////////////////////////////////////////////////// /// Y-Axis scaling ///////////////////////////////////////////////////////////////////// EventDataType miny; EventDataType maxy; graph.roundY(miny, maxy); float ymult = float(rect.height()) / (maxy-miny); preCalc(); totaldays = 0; nousedays = 0; lastx1 = rect.left(); ///////////////////////////////////////////////////////////////////// /// Main Loop scaling ///////////////////////////////////////////////////////////////////// do { Day * day = daylist.at(idx); if ((lastx1 + barw) > right_edge) break; totaldays++; if (!day) { // || !day->hasMachine(m_machtype)) { // lasty1 = rect.bottom(); lastx1 += barw; nousedays++; // it++; continue; } QHash >::iterator cit = cache.find(idx); float x1 = lastx1 + barw; bool hl = false; QRect rec2(lastx1, rect.top(), barw, rect.height()); if (rec2.contains(mouse)) { QColor col2(255,0,0,64); painter.fillRect(rec2, QBrush(col2)); hl = true; } if (cit != cache.end()) { QVector & slices = cit.value(); customCalc(day, slices); int size = slices.size(); QLinearGradient gradient(lastx1, rect.bottom(), lastx1+barw, rect.bottom()); for (int i=0; i < size; ++i) { const SummaryChartSlice & slice = slices.at(i); float s1 = slice.value - miny; float s2 = slice.height; float y1 = (s1 * ymult); float y2 = (s2 * ymult); QColor col = slice.color; QRect rec(lastx1, rect.bottom() - y1 - y2, barw, y2); rec = rec.intersected(rect); // QBrush brush = slice.brush; if (rec.contains(mouse)) { col = Qt::yellow; graph.ToolTip(slice.name, mouse.x() - 15,mouse.y() + 15, TT_AlignRight); } if (barw > 8) { gradient.setColorAt(0,col); gradient.setColorAt(1,brighten(col, 2.0)); painter.fillRect(rec, QBrush(gradient)); // painter.fillRect(rec, brush); outlines.append(rec); } else if (barw > 3) { painter.fillRect(rec, QBrush(brighten(col,1.25))); outlines.append(rec); } else { painter.fillRect(rec, QBrush(col)); } } } lastx1 = x1; } while (++idx <= idx_end); painter.setPen(QPen(Qt::black,1)); painter.drawRects(outlines); afterDraw(painter, graph, rect); } //////////////////////////////////////////////////////////////////////////// /// Total Time in Apnea Chart Stuff //////////////////////////////////////////////////////////////////////////// void gTTIAChart::preCalc() { gSummaryChart::preCalc(); } void gTTIAChart::customCalc(Day *, QVector & slices) { if (slices.size() == 0) return; const SummaryChartSlice & slice = slices.at(0); calcitems[0].update(slice.value, slice.value); } void gTTIAChart::afterDraw(QPainter &, gGraph &graph, QRect rect) { QStringList txtlist; int num_channels = calcitems.size(); for (int i=0; i < num_channels; ++i) { SummaryCalcItem & calc = calcitems[i]; //ChannelID code = calc.code; //schema::Channel & chan = schema::channel[code]; float mid = 0; switch (midcalc) { case 0: if (calc.median_data.size() > 0) { mid = median(calc.median_data.begin(), calc.median_data.end()); } break; case 1: if (calc.divisor > 0) { mid = calc.wavg_sum / calc.divisor; } break; case 2: if (calc.divisor > 0) { mid = calc.avg_sum / calc.divisor; } break; } txtlist.append(QString("%1 %2 / %3 / %4").arg(QObject::tr("TTIA:")).arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2)); } QString txt = txtlist.join(", "); graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0); } void gTTIAChart::populate(Day *day, int idx) { QVector & slices = cache[idx]; float ttia = day->sum(CPAP_Obstructive) + day->sum(CPAP_ClearAirway) + day->sum(CPAP_Apnea) + day->sum(CPAP_Hypopnea); int h = ttia / 3600; int m = int(ttia) / 60 % 60; int s = int(ttia) % 60; slices.append(SummaryChartSlice(&calcitems[0], ttia / 60.0, ttia / 60.0, QObject::tr("\nTTIA: %1").arg(QString().sprintf("%02i:%02i:%02i",h,m,s)), QColor(255,147,150))); } QString gTTIAChart::tooltipData(Day *, int idx) { QVector & slices = cache[idx]; if (slices.size() == 0) return QString(); const SummaryChartSlice & slice = slices.at(0); return slice.name; } //////////////////////////////////////////////////////////////////////////// /// AHI Chart Stuff //////////////////////////////////////////////////////////////////////////// void gAHIChart::preCalc() { gSummaryChart::preCalc(); ahi_wavg = 0; ahi_avg = 0; calc_cnt = 0; total_hours = 0; min_ahi = 99999; max_ahi = -99999; ahi_data.clear(); ahi_data.reserve(idx_end-idx_start); } void gAHIChart::customCalc(Day *day, QVector &list) { int size = list.size(); if (size == 0) return; EventDataType hours = day->hours(m_machtype); EventDataType ahi_cnt = 0; for (int i=0; i < size; ++i) { SummaryChartSlice & slice = list[i]; SummaryCalcItem * calc = slice.calc; EventDataType value = slice.value; float valh = value/ hours; switch (midcalc) { case 0: calc->median_data.append(valh); break; case 1: calc->wavg_sum += value; calc->divisor += hours; default: calc->avg_sum += value; calc->cnt++; break; } calc->min = qMin(valh, calc->min); calc->max = qMax(valh, calc->max); ahi_cnt += value; } min_ahi = qMin(ahi_cnt / hours, min_ahi); max_ahi = qMax(ahi_cnt / hours, max_ahi); ahi_data.append(ahi_cnt / hours); ahi_wavg += ahi_cnt; ahi_avg += ahi_cnt; total_hours += hours; calc_cnt++; } void gAHIChart::afterDraw(QPainter & /*painter */, gGraph &graph, QRect rect) { if (totaldays == nousedays) return; //int size = idx_end - idx_start; bool skip = true; float med = 0; switch (midcalc) { case 0: if (ahi_data.size() > 0) { med = median(ahi_data.begin(), ahi_data.end()); skip = false; } break; case 1: // wavg if (total_hours > 0) { med = ahi_wavg / total_hours; skip = false; } break; case 2: // avg if (calc_cnt > 0) { med = ahi_avg / calc_cnt; skip = false; } break; } QStringList txtlist; if (!skip) txtlist.append(QObject::tr("%1 %2 / %3 / %4").arg(STR_TR_AHI).arg(min_ahi, 0, 'f', 2).arg(med, 0, 'f', 2).arg(max_ahi, 0, 'f', 2)); int num_channels = calcitems.size(); for (int i=0; i < num_channels; ++i) { SummaryCalcItem & calc = calcitems[i]; ChannelID code = calc.code; schema::Channel & chan = schema::channel[code]; float mid = 0; skip = true; switch (midcalc) { case 0: if (calc.median_data.size() > 0) { mid = median(calc.median_data.begin(), calc.median_data.end()); skip = false; } break; case 1: if (calc.divisor > 0) { mid = calc.wavg_sum / calc.divisor; skip = false; } break; case 2: if (calc.cnt > 0) { mid = calc.avg_sum / calc.cnt; skip = false; } break; } if (!skip) txtlist.append(QString("%1 %2 / %3 / %4").arg(chan.label()).arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2)); } QString txt = txtlist.join(", "); graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0); } void gAHIChart::populate(Day *day, int idx) { QVector & slices = cache[idx]; float hours = day->hours(); int num_channels = calcitems.size(); for (int i=0; i < num_channels; ++i) { SummaryCalcItem & calc = calcitems[i]; ChannelID code = calc.code; if (!day->hasData(code, ST_CNT)) continue; schema::Channel *chan = schema::channel.channels.find(code).value(); float c = day->count(code); slices.append(SummaryChartSlice(&calc, c, c / hours, chan->label(), calc.color)); } } QString gAHIChart::tooltipData(Day *day, int idx) { QVector & slices = cache[idx]; float total = 0; float hour = day->hours(m_machtype); QString txt; for (int i=0; i< slices.size(); ++i) { SummaryChartSlice & slice = slices[i]; total += slice.value; txt += QString("\n%1: %2").arg(slice.name).arg(float(slice.value) / hour, 0, 'f', 2); } return QString("\n%1: %2").arg(STR_TR_AHI).arg(float(total) / hour,0,'f',2)+txt; } gPressureChart::gPressureChart() :gSummaryChart("Pressure", MT_CPAP) { // Do not reorder these!!! :P addCalc(CPAP_Pressure, ST_SETMAX, schema::channel[CPAP_Pressure].defaultColor()); // 00 addCalc(CPAP_Pressure, ST_MID, schema::channel[CPAP_Pressure].defaultColor()); // 01 addCalc(CPAP_Pressure, ST_90P, brighten(schema::channel[CPAP_Pressure].defaultColor(), 1.33)); // 02 addCalc(CPAP_PressureMin, ST_SETMIN, schema::channel[CPAP_PressureMin].defaultColor()); // 03 addCalc(CPAP_PressureMax, ST_SETMAX, schema::channel[CPAP_PressureMax].defaultColor()); // 04 addCalc(CPAP_EPAP, ST_SETMAX, schema::channel[CPAP_EPAP].defaultColor()); // 05 addCalc(CPAP_IPAP, ST_SETMAX, schema::channel[CPAP_IPAP].defaultColor()); // 06 addCalc(CPAP_EPAPLo, ST_SETMAX, schema::channel[CPAP_EPAPLo].defaultColor()); // 07 addCalc(CPAP_IPAPHi, ST_SETMAX, schema::channel[CPAP_IPAPHi].defaultColor()); // 08 addCalc(CPAP_EPAP, ST_MID, schema::channel[CPAP_EPAP].defaultColor()); // 09 addCalc(CPAP_EPAP, ST_90P, brighten(schema::channel[CPAP_EPAP].defaultColor(),1.33)); // 10 addCalc(CPAP_IPAP, ST_MID, schema::channel[CPAP_IPAP].defaultColor()); // 11 addCalc(CPAP_IPAP, ST_90P, brighten(schema::channel[CPAP_IPAP].defaultColor(),1.33)); // 12 } void gPressureChart::afterDraw(QPainter &, gGraph &graph, QRect rect) { int pressure_cnt = calcitems[0].cnt; int pressuremin_cnt = calcitems[3].cnt; int epap_cnt = calcitems[5].cnt; int ipap_cnt = calcitems[6].cnt; int ipaphi_cnt = calcitems[8].cnt; int epaplo_cnt = calcitems[7].cnt; QStringList presstr; float mid = 0; if (pressure_cnt > 0) { mid = calcitems[0].mid(); presstr.append(QString("%1 %2/%3/%4"). arg(STR_TR_CPAP). arg(calcitems[0].min,0,'f',1). arg(mid, 0, 'f', 1). arg(calcitems[0].max,0,'f',1)); } if (pressuremin_cnt > 0) { presstr.append(QString("%1 %2/%3/%4/%5"). arg(STR_TR_APAP). arg(calcitems[3].min,0,'f',1). arg(calcitems[1].mid(), 0, 'f', 1). arg(calcitems[2].mid(),0,'f',1). arg(calcitems[4].max, 0, 'f', 1)); } if (epap_cnt > 0) { presstr.append(QString("%1 %2/%3/%4"). arg(STR_TR_EPAP). arg(calcitems[5].min,0,'f',1). arg(calcitems[5].mid(), 0, 'f', 1). arg(calcitems[5].max, 0, 'f', 1)); } if (ipap_cnt > 0) { presstr.append(QString("%1 %2/%3/%4"). arg(STR_TR_IPAP). arg(calcitems[6].min,0,'f',1). arg(calcitems[6].mid(), 0, 'f', 1). arg(calcitems[6].max, 0, 'f', 1)); } if (epaplo_cnt > 0) { presstr.append(QString("%1 %2/%3/%4"). arg(STR_TR_EPAPLo). arg(calcitems[7].min,0,'f',1). arg(calcitems[7].mid(), 0, 'f', 1). arg(calcitems[7].max, 0, 'f', 1)); } if (ipaphi_cnt > 0) { presstr.append(QString("%1 %2/%3/%4"). arg(STR_TR_IPAPHi). arg(calcitems[8].min,0,'f',1). arg(calcitems[8].mid(), 0, 'f', 1). arg(calcitems[8].max, 0, 'f', 1)); } QString txt = presstr.join(" "); graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0); } void gPressureChart::populate(Day * day, int idx) { float tmp; CPAPMode mode = (CPAPMode)(int)qRound(day->settings_wavg(CPAP_Mode)); QVector & slices = cache[idx]; if (mode == MODE_CPAP) { float pr = day->settings_max(CPAP_Pressure); slices.append(SummaryChartSlice(&calcitems[0], pr, pr, schema::channel[CPAP_Pressure].label(), calcitems[0].color)); } else if (mode == MODE_APAP) { float min = day->settings_min(CPAP_PressureMin); float max = day->settings_max(CPAP_PressureMax); tmp = min; slices.append(SummaryChartSlice(&calcitems[3], min, min, schema::channel[CPAP_PressureMin].label(), calcitems[3].color)); if (!day->summaryOnly()) { float med = day->calcMiddle(CPAP_Pressure); slices.append(SummaryChartSlice(&calcitems[1], med, med - tmp, day->calcMiddleLabel(CPAP_Pressure), calcitems[1].color)); tmp += med - tmp; float p90 = day->calcPercentile(CPAP_Pressure); slices.append(SummaryChartSlice(&calcitems[2], p90, p90 - tmp, day->calcPercentileLabel(CPAP_Pressure), calcitems[2].color)); tmp += p90 - tmp; } slices.append(SummaryChartSlice(&calcitems[4], max, max - tmp, schema::channel[CPAP_PressureMax].label(), calcitems[4].color)); } else if (mode == MODE_BILEVEL_FIXED) { float epap = day->settings_max(CPAP_EPAP); float ipap = day->settings_max(CPAP_IPAP); slices.append(SummaryChartSlice(&calcitems[5], epap, epap, schema::channel[CPAP_EPAP].label(), calcitems[5].color)); slices.append(SummaryChartSlice(&calcitems[6], ipap, ipap - epap, schema::channel[CPAP_IPAP].label(), calcitems[6].color)); } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { float epap = day->settings_max(CPAP_EPAPLo); tmp = epap; float ipap = day->settings_max(CPAP_IPAPHi); slices.append(SummaryChartSlice(&calcitems[7], epap, epap, schema::channel[CPAP_EPAPLo].label(), calcitems[7].color)); if (!day->summaryOnly()) { float e50 = day->calcMiddle(CPAP_EPAP); slices.append(SummaryChartSlice(&calcitems[9], e50, e50 - tmp, day->calcMiddleLabel(CPAP_EPAP), calcitems[9].color)); tmp += e50 - tmp; float e90 = day->calcPercentile(CPAP_EPAP); slices.append(SummaryChartSlice(&calcitems[10], e90, e90 - tmp, day->calcPercentileLabel(CPAP_EPAP), calcitems[10].color)); tmp += e90 - tmp; float i50 = day->calcMiddle(CPAP_IPAP); slices.append(SummaryChartSlice(&calcitems[11], i50, i50 - tmp, day->calcMiddleLabel(CPAP_IPAP), calcitems[11].color)); tmp += i50 - tmp; float i90 = day->calcPercentile(CPAP_IPAP); slices.append(SummaryChartSlice(&calcitems[12], i90, i90 - tmp, day->calcPercentileLabel(CPAP_IPAP), calcitems[12].color)); tmp += i90 - tmp; } slices.append(SummaryChartSlice(&calcitems[8], ipap, ipap - tmp, schema::channel[CPAP_IPAPHi].label(), calcitems[8].color)); } else if ((mode == MODE_BILEVEL_AUTO_VARIABLE_PS) || (mode == MODE_ASV_VARIABLE_EPAP)) { float epap = day->settings_max(CPAP_EPAPLo); tmp = epap; slices.append(SummaryChartSlice(&calcitems[7], epap, epap, schema::channel[CPAP_EPAPLo].label(), calcitems[7].color)); if (!day->summaryOnly()) { float e50 = day->calcMiddle(CPAP_EPAP); slices.append(SummaryChartSlice(&calcitems[9], e50, e50 - tmp, day->calcMiddleLabel(CPAP_EPAP), calcitems[9].color)); tmp += e50 - tmp; float e90 = day->calcPercentile(CPAP_EPAP); slices.append(SummaryChartSlice(&calcitems[10], e90, e90 - tmp, day->calcPercentileLabel(CPAP_EPAP), calcitems[10].color)); tmp += e90 - tmp; float i50 = day->calcMiddle(CPAP_IPAP); slices.append(SummaryChartSlice(&calcitems[11], i50, i50 - tmp, day->calcMiddleLabel(CPAP_IPAP), calcitems[11].color)); tmp += i50 - tmp; float i90 = day->calcPercentile(CPAP_IPAP); slices.append(SummaryChartSlice(&calcitems[12], i90, i90 - tmp, day->calcPercentileLabel(CPAP_IPAP), calcitems[12].color)); tmp += i90 - tmp; } float ipap = day->settings_max(CPAP_IPAPHi); slices.append(SummaryChartSlice(&calcitems[8], ipap, ipap - tmp, schema::channel[CPAP_IPAPHi].label(), calcitems[8].color)); } else if (mode == MODE_ASV) { float epap = day->settings_max(CPAP_EPAP); tmp = epap; slices.append(SummaryChartSlice(&calcitems[5], epap, epap, schema::channel[CPAP_EPAP].label(), calcitems[5].color)); if (!day->summaryOnly()) { float i50 = day->calcMiddle(CPAP_IPAP); slices.append(SummaryChartSlice(&calcitems[11], i50, i50 - tmp, day->calcMiddleLabel(CPAP_IPAP), calcitems[11].color)); tmp += i50 - tmp; float i90 = day->calcPercentile(CPAP_IPAP); slices.append(SummaryChartSlice(&calcitems[12], i90, i90 - tmp, day->calcPercentileLabel(CPAP_IPAP), calcitems[12].color)); tmp += i90 - tmp; } float ipap = day->settings_max(CPAP_IPAPHi); slices.append(SummaryChartSlice(&calcitems[8], ipap, ipap - tmp, schema::channel[CPAP_IPAPHi].label(), calcitems[8].color)); } } //void gPressureChart::afterDraw(QPainter &painter, gGraph &graph, QRect rect) //{ //} sleepyhead-0.9.8/sleepyhead/Graphs/gGraph.h0000644000175000017500000003462412412506713020157 0ustar sergiosergio/* gGraph Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef graphs_ggraph_h #define graphs_ggraph_h //#define DEBUG_LAYOUT #include #include #include #include #include #include #include "Graphs/glcommon.h" #include "Graphs/layer.h" class gGraphView; // Graph globals. extern QFont *defaultfont; extern QFont *mediumfont; extern QFont *bigfont; extern QHash images; bool InitGraphGlobals(); void DestroyGraphGlobals(); const int mouse_movement_threshold = 6; /*! \class gGraph \brief Single Graph object, containing multiple layers and Layer layout code */ class gGraph : public QObject { Q_OBJECT public: friend class gGraphView; /*! \brief Creates a new graph object \param gGraphView * graphview if not null, links the graph to that object \param QString title containing the graph Title which is rendered vertically \param int height containing the opening height for this graph \param short group containing which graph-link group this graph belongs to */ gGraph(QString name, gGraphView *graphview = nullptr, QString title = "", QString units = "", int height = 0, short group = 0); virtual ~gGraph(); //! \brief Tells all Layers to deselect any highlighting void deselect(); //! \brief Returns true if any Layers have anything highlighted bool isSelected(); //! \brief Starts the singleshot Timer running, for ms milliseconds void Trigger(int ms); /*! \fn QPixmap renderPixmap(int width, int height, float fontscale=1.0); \brief Returns a QPixmap containing a snapshot of the graph rendered at size widthxheight \param int width Width of graph 'screenshot' \param int height Height of graph 'screenshot' \param float fontscale Scaling value to adjust DPI (when used for HighRes printing) Note if width or height is more than the OpenGL system allows, it could result in a crash Keeping them under 2048 is a reasonably safe value. */ QPixmap renderPixmap(int width, int height, bool printing = false); //! \brief Set Graph visibility status void setVisible(bool b) { m_visible = b; } //! \brief Return Graph visibility status bool visible() { return m_visible; } //! \brief Returns true if Graph is currently being snapshotted for printing bool printing() { return m_printing; } //! \brief Return height element. This is used by the scaler in gGraphView. inline const float & height() { return m_height; } //! \brief Set the height element. (relative to the total of all heights) void setHeight(float height) { m_height = height; invalidate_yAxisImage = true; } //! \brief Return minimum height this graph is allowed to (considering layer preferences too) int minHeight(); void setMinHeight(int height) { m_min_height = height; } int maxHeight() { return m_max_height; } void setMaxHeight(int height) { m_max_height = height; } //! \brief Returns true if the vertical graph title is shown bool showTitle() { return m_showTitle; } //! \brief Set whether or not to render the vertical graph title void setShowTitle(bool b) { m_showTitle = b; } //! \brief Returns printScaleX, used for DPI scaling in report printing float printScaleX(); //! \brief Returns printScaleY, used for DPI scaling in report printing float printScaleY(); //! \brief Returns true if none of the included layers have data attached bool isEmpty(); //! \brief Returns true if the user is currently dragging the mouse to select an area bool selectingArea(); double currentTime() const; void setCurrentTime(double value) { m_currentTime = value; } //! \brief Add Layer l to graph object, allowing you to specify position, // margin sizes, order, movability status and offsets void AddLayer(Layer *l, LayerPosition position = LayerCenter, short pixelsX = 0, short pixelsY = 0, short order = 0, bool movable = false, short x = 0, short y = 0); //! \brief Queues text for gGraphView object to draw it. void renderText(QString text, int x, int y, float angle = 0.0, QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true); //! \brief Queues text for gGraphView object to draw it, using given rect. void renderText(QString text, QRectF rect, quint32 flags = Qt::AlignCenter, float angle = 0.0, QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true); //! \brief Rounds Y scale values to make them look nice.. // Applies the Graph Preference min/max settings. void roundY(EventDataType &miny, EventDataType &maxy); // //! \brief Process all Layers GLBuffer (Vertex) objects, drawing the actual OpenGL stuff. // void drawGLBuf(); //! \brief Returns the Graph's (vertical) title inline QString & title() { return m_title; } //! \brief Returns the Graph's internal name inline QString & name() { return m_name; } //! \brief Sets the Graph's (vertical) title void setTitle(const QString title) { m_title = title; } //! \brief Returns the measurement Units the Y scale is referring to QString units() { return m_units; } //! \brief Sets the measurement Units the Y scale is referring to void setUnits(const QString units) { m_units = units; } //virtual void repaint(); // Repaint individual graph.. //! \brief Resets the graphs X & Y dimensions based on the Layer data virtual void ResetBounds(); //! \brief Sets the time range selected for this graph (in milliseconds since 1970 epoch) virtual void SetXBounds(qint64 minx, qint64 maxx); //! \brief Returns the physical Minimum time for all layers contained (in milliseconds since epoch) virtual qint64 MinX(); //! \brief Returns the physical Maximum time for all layers contained (in milliseconds since epoch) virtual qint64 MaxX(); //! \brief Returns the physical Minimum Y scale value for all layers contained virtual EventDataType MinY(); //! \brief Returns the physical Maximum Y scale value for all layers contained virtual EventDataType MaxY(); //! \brief Returns the physical Minimum Y scale value for all layers contained virtual EventDataType physMinY(); //! \brief Returns the physical Maximum Y scale value for all layers contained virtual EventDataType physMaxY(); //! \brief Sets the physical start of this graphs time range (in milliseconds since epoch) virtual void SetMinX(qint64 v); //! \brief Sets the physical end of this graphs time range (in milliseconds since epoch) virtual void SetMaxX(qint64 v); //! \brief Sets the physical Minimum Y scale value used while drawing this graph virtual void SetMinY(EventDataType v); //! \brief Sets the physical Maximum Y scale value used while drawing this graph virtual void SetMaxY(EventDataType v); //! \brief Forces Y Minimum to always select this value virtual void setForceMinY(EventDataType v) { f_miny = v; m_enforceMinY = true; } //! \brief Forces Y Maximum to always select this value virtual void setForceMaxY(EventDataType v) { f_maxy = v; m_enforceMaxY = true; } virtual EventDataType forceMinY() { return rec_miny; } virtual EventDataType forceMaxY() { return rec_maxy; } //! \brief Set recommended Y minimum.. It won't go under this unless the data does. // It won't go above this. virtual void setRecMinY(EventDataType v) { rec_miny = v; } //! \brief Set recommended Y minimum.. It won't go above this unless the data does. // It won't go under this. virtual void setRecMaxY(EventDataType v) { rec_maxy = v; } //! \brief Returns the recommended Y minimum.. It won't go under this unless the data does. // It won't go above this. virtual EventDataType RecMinY() { return rec_miny; } //! \brief Returns the recommended Y maximum.. It won't go under this unless the data does. // It won't go above this. virtual EventDataType RecMaxY() { return rec_maxy; } //! \brief Called when main graph area is resized void resize(int width, int height); // margin recalcs.. qint64 max_x, min_x, rmax_x, rmin_x; EventDataType max_y, min_y, rmax_y, rmin_y, f_miny, f_maxy, rec_miny, rec_maxy; EventDataType rphysmin_y, rphysmax_y; // not sure why there's two.. I can't remember void setEnforceMinY(bool b) { m_enforceMinY = b; } void setEnforceMaxY(bool b) { m_enforceMaxY = b; } //! \brief Returns whether this graph shows overall timescale, or a zoomed area bool blockZoom() { return m_blockzoom; } //! \brief Sets whether this graph shows an overall timescale, or a zoomed area. void setBlockZoom(bool b) { m_blockzoom = b; } //! \brief Flips the GL coordinates from the graphs perspective.. Used in Scissor calculations int flipY(int y); // flip GL coordinates //! \brief Returns the graph-linking group this Graph belongs in short group() { return m_group; } //! \brief Sets the graph-linking group this Graph belongs in void setGroup(short group) { m_group = group; } //! \brief Forces the main gGraphView object to draw all Text Components void DrawTextQue(QPainter &painter); //! \brief Sends supplied day object to all Graph layers so they can precalculate stuff void setDay(Day *day); //! \brief Returns the current day object Day *day() { return m_day; } //! \brief The Layer, layout and title drawing code virtual void paint(QPainter &painter, const QRegion ®ion); //! \brief Gives the supplied data to the main ToolTip object for display void ToolTip(QString text, int x, int y, ToolTipAlignment align = TT_AlignCenter, int timeout = 0); //! \brief Public version of updateGL(), to redraw all graphs.. Not for normal use void redraw(); //! \brief Asks the main gGraphView to redraw after ms milliseconds void timedRedraw(int ms); double screenToTime(int xpos); void dataChanged(); //! \brief Sets the margins for the four sides of this graph. void setMargins(short left, short right, short top, short bottom) { m_marginleft = left; m_marginright = right; m_margintop = top; m_marginbottom = bottom; } //! \brief Returns this graphs left margin inline short marginLeft() { return m_marginleft; } //! \brief Returns this graphs right margin inline short marginRight() { return m_marginright; } //! \brief Returns this graphs top margin inline short marginTop() { return m_margintop; } //! \brief Returns this graphs bottom margin inline short marginBottom() { return m_marginbottom; } const inline QRect &rect() const { return m_rect; } bool isPinned() { return m_pinned; } void setPinned(bool b) { m_pinned = b; } bool isSnapshot() { return m_snapshot; } void setSnapshot(bool b) { m_snapshot = b; } short left, right, top, bottom; // dirty magin hacks.. Layer *getLineChart(); QTimer *timer; // This gets set to true to force a redraw of the yAxis tickers when graphs are resized. bool invalidate_yAxisImage; bool invalidate_xAxisImage; //! \brief Returns a Vector reference containing all this graphs layers QVector &layers() { return m_layers; } gGraphView *graphView() { return m_graphview; } short m_marginleft, m_marginright, m_margintop, m_marginbottom; inline short zoomY() { return m_zoomY; } void setZoomY(short zoom); static const short maxZoomY = 2; inline qint64 selectedDuration() const { return m_selectedDuration; } inline QString selDurString() const { return m_selDurString; } inline bool blockSelect() const { return m_block_select; } void setBlockSelect(bool b) { m_block_select = b; } inline bool printing() const { return m_printing; } protected: //! \brief Mouse Wheel events virtual void wheelEvent(QWheelEvent *event); //! \brief Mouse Movement events virtual void mouseMoveEvent(QMouseEvent *event); //! \brief Mouse Button Pressed events virtual void mousePressEvent(QMouseEvent *event); //! \brief Mouse Button Released events virtual void mouseReleaseEvent(QMouseEvent *event); //! \brief Mouse Button Double Clicked events virtual void mouseDoubleClickEvent(QMouseEvent *event); //! \brief Key Pressed event virtual void keyPressEvent(QKeyEvent *event); //! \brief Key Pressed event virtual void keyReleaseEvent(QKeyEvent *event); void cancelSelection() { m_selecting_area = false; m_selection = QRect(0,0,0,0); } void dumpInfo(); //! \brief Change the current selected time boundaries by mult, from origin position origin_px void ZoomX(double mult, int origin_px); //! \brief The Main gGraphView object holding this graph // (this can be pinched temporarily by print code) QString m_name; gGraphView *m_graphview; QString m_title; QString m_units; //! \brief Vector containing all this graphs Layers QVector m_layers; float m_height, m_width; int m_min_height; int m_max_height; bool m_visible; bool m_blockzoom; QRect m_selection; bool m_selecting_area; QPoint m_current; short m_group; short m_lastx23; Day *m_day; bool m_enforceMinY, m_enforceMaxY; bool m_showTitle; bool m_printing; bool m_pinned; short m_zoomY; bool m_block_select; QRect m_rect; qint64 m_selectedDuration; double m_currentTime; qint64 m_clickTime; QString m_selDurString; bool m_snapshot; protected slots: //! \brief Deselects any highlights, and schedules a main gGraphView redraw void Timeout(); }; /*! \brief Gets the width and height parameters for supplied text \param QString text - The text string in question \param int & width \param int & height \param QFont * font - The selected font used in the size calculations */ void GetTextExtent(QString text, int &width, int &height, QFont *font = defaultfont); //! \brief Return the height of the letter x for the selected font. int GetXHeight(QFont *font = defaultfont); #endif // graphs_ggraph_h sleepyhead-0.9.8/sleepyhead/Graphs/gLineOverlay.h0000644000175000017500000000551412412506713021343 0ustar sergiosergio/* gLineOverlayBar Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GLINEOVERLAY_H #define GLINEOVERLAY_H #include "SleepLib/common.h" #include "gGraphView.h" /*! \class gLineOverlayBar \brief Shows a flag line, a dot, or a span over the top of a 2D line chart. */ class gLineOverlayBar: public Layer { public: //! \brief Constructs a gLineOverlayBar object of type code, setting the flag/span color, the label to show when zoomed //! in, and the display method requested, of either FT_Bar, FT_Span, or FT_Dot gLineOverlayBar(ChannelID code, QColor col, QString _label = "", FlagType _flt = FT_Bar); virtual ~gLineOverlayBar(); //! \brief The drawing code that fills the OpenGL vertex GLBuffers virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); virtual EventDataType Miny() { return 0; } virtual EventDataType Maxy() { return 0; } //! \brief Returns true if no Channel data available for this code virtual bool isEmpty() { return true; } //! \brief returns a count of all flags drawn during render. (for gLineOverlaySummary) int count() { return m_count; } double sum() { return m_sum; } FlagType flagtype() { return m_flt; } bool hover() { return m_hover; } void setBlockHover(bool b) { m_blockhover = b; } inline void setOverlayDisplayType(OverlayDisplayType odt) { m_odt = odt; } inline OverlayDisplayType overlayDisplayType() { return m_odt; } protected: //! \brief Mouse moved over this layers area (shows the hover-over tooltips here) virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); QColor m_flag_color; QString m_label; FlagType m_flt; OverlayDisplayType m_odt; int m_count; double m_sum; bool m_hover; bool m_blockhover; }; /*! \class gLineOverlaySummary \brief A container class to hold a group of gLineOverlayBar's, and shows the "Section AHI" over the Flow Rate waveform. */ class gLineOverlaySummary: public Layer { public: gLineOverlaySummary(QString text, int x, int y); virtual ~gLineOverlaySummary(); virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); virtual EventDataType Miny() { return 0; } virtual EventDataType Maxy() { return 0; } //! \brief Returns true if no Channel data available for this code virtual bool isEmpty() { return true; } //! \brief Adds a gLineOverlayBar to this list gLineOverlayBar *add(gLineOverlayBar *bar) { m_overlays.push_back(bar); return bar; } protected: QVector m_overlays; QString m_text; int m_x, m_y; }; #endif // GLINEOVERLAY_H sleepyhead-0.9.8/sleepyhead/Graphs/gdailysummary.h0000644000175000017500000000316712412506713021634 0ustar sergiosergio/* gDailySummary Graph Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GDAILYSUMMARY_H #define GDAILYSUMMARY_H #include "Graphs/layer.h" #include "SleepLib/day.h" class gDailySummary:public Layer { public: gDailySummary(); virtual ~gDailySummary() {} virtual void SetDay(Day *d); virtual bool isEmpty(); //! Draw filled rectangles behind Event Flag's, and an outlines around them all, Calls the individual paint for each gFlagLine virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); virtual int minimumHeight() { return m_minimum_height; } bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); bool mousePressEvent(QMouseEvent *event, gGraph *graph); bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph); protected: QList flag_values; QList flag_labels; QList flag_codes; QList flag_foreground; QList flag_background; QList pie_chan; QList pie_data; QList pie_labels; EventDataType pie_total; QList settings; QList info; QList info_background; QList info_foreground; float flag_height; float flag_label_width; float flag_value_width; double ahi; int info_height; int info_width; int m_minimum_height; bool m_empty; }; #endif // GDAILYSUMMARY_H sleepyhead-0.9.8/sleepyhead/Graphs/gFlagsLine.cpp0000644000175000017500000002761112412506713021313 0ustar sergiosergio/* gFlagsLine Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include "SleepLib/profiles.h" #include "gFlagsLine.h" #include "gYAxis.h" gLabelArea::gLabelArea(Layer * layer) : gSpacer(20) { m_layertype = LT_Spacer; m_mainlayer = layer; } bool gLabelArea::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { if (m_mainlayer) { return m_mainlayer->mouseMoveEvent(event, graph); } return false; } int gLabelArea::minimumWidth() { return gYAxis::Margin; } gFlagsGroup::gFlagsGroup() { m_barh = 0; m_empty = true; } gFlagsGroup::~gFlagsGroup() { } qint64 gFlagsGroup::Minx() { if (m_day) { return m_day->first(); } return 0; } qint64 gFlagsGroup::Maxx() { if (m_day) { return m_day->last(); } return 0; } void gFlagsGroup::SetDay(Day *d) { LayerGroup::SetDay(d); int cnt = 0; if (!d) { m_empty = true; return; } quint32 z = schema::FLAG | schema::SPAN; if (p_profile->general->showUnknownFlags()) z |= schema::UNKNOWN; availableChans = d->getSortedMachineChannels(z); m_rebuild_cpap = (availableChans.size() == 0); if (m_rebuild_cpap) { QHash chans; for (int i=0; i< m_day->size(); ++i) { Session * sess = m_day->sessions.at(i); QHash >::iterator it; for (it = sess->eventlist.begin(); it != sess->eventlist.end(); ++it) { ChannelID code = it.key(); if (chans.contains(code)) continue; schema::Channel * chan = &schema::channel[code]; if (chan->type() == schema::FLAG) { availableChans.push_back(code); } else if (chan->type() == schema::MINOR_FLAG) { availableChans.push_back(code); } else if (chan->type() == schema::SPAN) { availableChans.push_back(code); } else if (chan->type() == schema::UNKNOWN) { availableChans.push_back(code); } } } availableChans = chans.keys(); } lvisible.clear(); for (int i=0; i < availableChans.size(); ++i) { ChannelID code = availableChans.at(i); // const schema::Channel & chan = schema::channel[code]; gFlagsLine * fl = new gFlagsLine(code); fl->SetDay(d); lvisible.push_back(fl); } cnt = lvisible.size(); // for (int i = 0; i < layers.size(); i++) { // gFlagsLine *f = dynamic_cast(layers[i]); // if (!f) { continue; } // bool e = f->isEmpty(); // if (!e || f->isAlwaysVisible()) { // lvisible.push_back(f); // if (!e) { // cnt++; // } // } // } m_empty = (cnt == 0); if (m_empty) { if (d) { m_empty = !d->hasEvents(); } } m_barh = 0; } bool gFlagsGroup::isEmpty() { if (m_day) { if (m_day->hasEnabledSessions() && m_day->hasEvents()) return false; } return true; } void gFlagsGroup::paint(QPainter &painter, gGraph &g, const QRegion ®ion) { int left = region.boundingRect().left(); int top = region.boundingRect().top(); int width = region.boundingRect().width(); int height = region.boundingRect().height(); if (!m_visible) { return; } if (!m_day) { return; } QVector visflags; for (int i = 0; i < lvisible.size(); i++) { if (schema::channel[lvisible.at(i)->code()].enabled()) visflags.push_back(lvisible.at(i)); } int vis = visflags.size(); m_barh = float(height) / float(vis); float linetop = top; QColor barcol; for (int i = 0; i < visflags.size(); i++) { schema::Channel & chan = schema::channel[visflags.at(i)->code()]; // Alternating box color if (i & 1) { barcol = COLOR_ALT_BG1; } else { barcol = COLOR_ALT_BG2; } painter.fillRect(left, floor(linetop), width-1, ceil(m_barh), QBrush(barcol)); // barcol = chan.defaultColor(); // barcol.setAlpha(16); // painter.fillRect(left, floor(linetop), width-1, ceil(m_barh), QBrush(barcol)); // Paint the actual flags QRect rect(left, linetop, width, m_barh); visflags[i]->m_rect = rect; visflags[i]->paint(painter, g, QRegion(rect)); linetop += m_barh; } painter.setPen(COLOR_Outline); painter.drawLine(left - 1, top, left - 1, top + height); painter.drawLine(left - 1, top + height, left + width, top + height); painter.drawLine(left + width, top + height, left + width, top); painter.drawLine(left + width, top, left - 1, top); if (m_rebuild_cpap) { QString txt = QObject::tr("Database Outdated\nPlease Rebuild CPAP Data"); painter.setFont(*bigfont); painter.setPen(QPen(QColor(0,0,0,32))); painter.drawText(region.boundingRect(), Qt::AlignCenter | Qt::AlignVCenter, txt); } } bool gFlagsGroup::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { //if (p_profile->appearance->lineCursorMode()) { graph->timedRedraw(0); // } if (!p_profile->appearance->graphTooltips()) { return false; } for (int i = 0; i < lvisible.size(); i++) { gFlagsLine *fl = lvisible[i]; if (fl->m_rect.contains(event->x(), event->y())) { if (fl->mouseMoveEvent(event, graph)) { return true; } } else { // Inside main graph area? if ((event->y() > fl->m_rect.y()) && (event->y()) < (fl->m_rect.y() + fl->m_rect.height())) { if (event->x() < lvisible[i]->m_rect.x()) { // Display tooltip QString ttip = schema::channel[fl->code()].fullname() + "\n" + schema::channel[fl->code()].description(); graph->ToolTip(ttip, event->x()+15, event->y(), TT_AlignLeft); graph->timedRedraw(0); } } } } return false; } gFlagsLine::gFlagsLine(ChannelID code) : Layer(code) { } gFlagsLine::~gFlagsLine() { } void gFlagsLine::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { int left = region.boundingRect().left(); int top = region.boundingRect().top(); int width = region.boundingRect().width(); int height = region.boundingRect().height(); if (!m_visible) { return; } if (!m_day) { return; } double minx; double maxx; if (w.blockZoom()) { minx = w.rmin_x; maxx = w.rmax_x; } else { minx = w.min_x; maxx = w.max_x; } double xx = maxx - minx; if (xx <= 0) { return; } double xmult = width / xx; schema::Channel & chan = schema::channel[m_code]; GetTextExtent(chan.label(), m_lx, m_ly); // Draw text label w.renderText(chan.label(), left - m_lx - 10, top + (height / 2) + (m_ly / 2)); float x1, x2; float bartop = top + 2; float bottom = top + height - 2; qint64 X, X2, L; qint64 start; quint32 *tptr; EventStoreType *dptr, * eptr; int idx; QHash >::iterator cei; qint64 clockdrift = qint64(p_profile->cpap->clockDrift()) * 1000L; qint64 drift = 0; QVector vlines; QColor color=schema::channel[m_code].defaultColor(); QBrush brush(color); bool hover = false; for (QList::iterator s = m_day->begin(); s != m_day->end(); s++) { if (!(*s)->enabled()) { continue; } drift = ((*s)->type() == MT_CPAP) ? clockdrift : 0; cei = (*s)->eventlist.find(m_code); if (cei == (*s)->eventlist.end()) { continue; } QVector &evlist = cei.value(); for (int k = 0; k < evlist.size(); k++) { EventList &el = *(evlist[k]); start = el.first() + drift; tptr = el.rawTime(); dptr = el.rawData(); int np = el.count(); eptr = dptr + np; for (idx = 0; dptr < eptr; dptr++, tptr++, idx++) { X = start + *tptr; L = *dptr * 1000; if (X >= minx) { break; } X2 = X - L; if (X2 >= minx) { break; } } np -= idx; if (chan.type() == schema::SPAN) { /////////////////////////////////////////////////////////////////////////// // Draw Event Flag Spans /////////////////////////////////////////////////////////////////////////// for (; dptr < eptr; dptr++) { X = start + * tptr++; L = *dptr * 1000L; X2 = X - L; if (X2 > maxx) { break; } x1 = double(X - minx) * xmult + left; x2 = double(X2 - minx) * xmult + left; brush = QBrush(color); painter.fillRect(x2, bartop, x1-x2, bottom-bartop, brush); if (!w.selectingArea() && !hover && QRect(x2, bartop, x1-x2, bottom-bartop).contains(w.graphView()->currentMousePos())) { hover = true; painter.setPen(QPen(Qt::red,1)); painter.drawRect(x2, bartop, x1-x2, bottom-bartop); int x,y; int s = *dptr; int m = s / 60; s %= 60; QString lab = QString("%1").arg(schema::channel[m_code].fullname()); if (m>0) { lab += QObject::tr(" (%2 min, %3 sec)").arg(m).arg(s); } else { lab += QObject::tr(" (%3 sec)").arg(m).arg(s); } GetTextExtent(lab, x, y); w.ToolTip(lab, x2 - 10, bartop + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout()); } } } else { //if (chan.type() == schema::FLAG) { /////////////////////////////////////////////////////////////////////////// // Draw Event Flag Bars /////////////////////////////////////////////////////////////////////////// for (int i = 0; i < np; i++) { X = start + *tptr++; if (X > maxx) { break; } x1 = (X - minx) * xmult + left; if (!w.selectingArea() && !hover && QRect(x1-3, bartop-2, 6, bottom-bartop+4).contains(w.graphView()->currentMousePos())) { hover = true; painter.setPen(QPen(Qt::red,1)); painter.drawRect(x1-2, bartop-2, 4, bottom-bartop+4); int x,y; QString lab = QString("%1 (%2)").arg(schema::channel[m_code].fullname()).arg(*dptr); GetTextExtent(lab, x, y); w.ToolTip(lab, x1 - 10, bartop + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout()); } vlines.append(QLine(x1, bartop, x1, bottom)); } } } } painter.setPen(color); painter.drawLines(vlines); } bool gFlagsLine::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) // qDebug() << code() << event->x() << event->y() << graph->rect(); return false; } sleepyhead-0.9.8/sleepyhead/Graphs/gGraphView.cpp0000644000175000017500000030144312412506713021341 0ustar sergiosergio/* gGraphView Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "Graphs/gGraphView.h" #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) # include #endif #ifdef DEBUG_EFFICIENCY // Only works in 4.8 # include #endif #include #include "mainwindow.h" #include "Graphs/glcommon.h" #include "Graphs/gLineChart.h" #include "Graphs/gSummaryChart.h" #include "Graphs/gSessionTimesChart.h" #include "Graphs/gYAxis.h" #include "Graphs/gFlagsLine.h" #include "SleepLib/profiles.h" extern MainWindow *mainwin; #include MyLabel::MyLabel(QWidget * parent) : QWidget(parent) { m_font = QApplication::font(); time.start(); } MyLabel::~MyLabel() { } void MyLabel::setText(QString text) { m_text = text; update(); } void MyLabel::setFont(QFont & font) { m_font=font; } void MyLabel::doRedraw() { update(); } void MyLabel::setAlignment(Qt::Alignment alignment) { m_alignment = alignment; doRedraw(); } void MyLabel::paintEvent(QPaintEvent * /*event*/) { QPainter painter(this); painter.setFont(m_font); painter.drawText(rect(), m_alignment, m_text); } gToolTip::gToolTip(gGraphView *graphview) : m_graphview(graphview) { m_pos.setX(0); m_pos.setY(0); m_visible = false; m_alignment = TT_AlignCenter; m_spacer = 8; // pixels around text area timer = new QTimer(graphview); connect(timer, SIGNAL(timeout()), SLOT(timerDone())); } gToolTip::~gToolTip() { disconnect(timer, 0, 0, 0); delete timer; } //void gToolTip::calcSize(QString text,int &w, int &h) //{ /*GetTextExtent(text,w,h); w+=m_spacer*2; h+=m_spacer*2; */ //} void gToolTip::display(QString text, int x, int y, ToolTipAlignment align, int timeout) { if (timeout <= 0) { timeout = p_profile->general->tooltipTimeout(); } m_alignment = align; m_text = text; m_visible = true; // TODO: split multiline here //calcSize(m_text,tw,th); m_pos.setX(x); m_pos.setY(y); //tw+=m_spacer*2; //th+=m_spacer*2; //th*=2; if (timer->isActive()) { timer->stop(); } timer->setSingleShot(true); timer->start(timeout); m_invalidate = true; } void gToolTip::cancel() { m_visible = false; timer->stop(); } void gToolTip::paint(QPainter &painter) //actually paints it. { if (!m_visible) { return; } int x = m_pos.x(); int y = m_pos.y(); QRect rect(x, y, 0, 0); painter.setFont(*defaultfont); rect = painter.boundingRect(rect, Qt::AlignCenter, m_text); int w = rect.width() + m_spacer * 2; int xx = rect.x() - m_spacer; if (xx < 0) { xx = 0; } rect.setLeft(xx); rect.setTop(rect.y() - 15); rect.setWidth(w); int z = rect.x() + rect.width(); if (z > m_graphview->width() - 10) { rect.setLeft(m_graphview->width() - 2 - rect.width()); rect.setRight(m_graphview->width() - 2); } int h = rect.height(); if (rect.y() < 0) { rect.setY(0); rect.setHeight(h); } if (m_alignment == TT_AlignRight) { rect.moveTopRight(m_pos); if ((x-w) < 0) { rect.moveLeft(0); } } else if (m_alignment == TT_AlignLeft) { rect.moveTopLeft(m_pos); } QBrush brush(QColor(255, 255, 128, 230)); brush.setStyle(Qt::SolidPattern); painter.setBrush(brush); painter.setPen(QColor(0, 0, 0, 255)); painter.drawRoundedRect(rect, 5, 5); painter.setBrush(Qt::black); painter.setFont(*defaultfont); painter.drawText(rect, Qt::AlignCenter, m_text); } void gToolTip::timerDone() { m_visible = false; m_graphview->redraw(); m_graphview->resetMouse(); } #ifdef ENABLE_THREADED_DRAWING gThread::gThread(gGraphView *g) { graphview = g; mutex.lock(); } gThread::~gThread() { if (isRunning()) { m_running = false; mutex.unlock(); wait(); terminate(); } } void gThread::run() { m_running = true; gGraph *g; while (m_running) { mutex.lock(); //mutex.unlock(); if (!m_running) { break; } do { g = graphview->popGraph(); if (g) { g->paint(QRegion(g->m_lastbounds)); //int i=0; } else { //mutex.lock(); graphview->masterlock->release(1); // This thread gives up for now.. } } while (g); } } #endif // ENABLE_THREADED_DRAWING void gGraphView::queGraph(gGraph *g, int left, int top, int width, int height) { g->m_rect = QRect(left, top, width, height); #ifdef ENABLED_THREADED_DRAWING dl_mutex.lock(); #endif m_drawlist.push_back(g); #ifdef ENABLED_THREADED_DRAWING dl_mutex.unlock(); #endif } void gGraphView::trashGraphs(bool destroy) { if (destroy) { for (int i=0; i< m_graphs.size(); ++i) { delete m_graphs[i]; } } // Don't actually want to delete them here.. we are just borrowing the graphs m_graphs.clear(); m_graphsbyname.clear(); } // Take the next graph to render from the drawing list gGraph *gGraphView::popGraph() { gGraph *g; #ifdef ENABLED_THREADED_DRAWING dl_mutex.lock(); #endif if (!m_drawlist.isEmpty()) { g = m_drawlist.at(0); m_drawlist.pop_front(); } else { g = nullptr; } #ifdef ENABLED_THREADED_DRAWING dl_mutex.unlock(); #endif return g; } gGraphView::gGraphView(QWidget *parent, gGraphView *shared) #ifdef BROKEN_OPENGL_BUILD : QWidget(parent), #else : QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DirectRendering | QGL::HasOverlay | QGL::Rgba),parent,shared), #endif m_offsetY(0), m_offsetX(0), m_scaleY(0.0), m_scrollbar(nullptr) { m_shared = shared; m_sizer_index = m_graph_index = 0; m_metaselect = m_button_down = m_graph_dragging = m_sizer_dragging = false; m_lastypos = m_lastxpos = 0; m_horiz_travel = 0; m_minx = m_maxx = 0; m_day = nullptr; m_selected_graph = nullptr; m_scrollbar = nullptr; m_point_released = m_point_clicked = QPoint(0,0); m_showAuthorMessage = true; horizScrollTime.start(); vertScrollTime.start(); this->setMouseTracking(true); m_emptytext = STR_Empty_NoData; InitGraphGlobals(); // FIXME: sstangl: handle error return. #ifdef ENABLE_THREADED_DRAWING m_idealthreads = QThread::idealThreadCount(); if (m_idealthreads <= 0) { m_idealthreads = 1; } masterlock = new QSemaphore(m_idealthreads); #endif m_tooltip = new gToolTip(this); /*for (int i=0;istart(); }*/ setFocusPolicy(Qt::StrongFocus); m_showsplitter = true; timer = new QTimer(this); connect(timer, SIGNAL(timeout()), SLOT(refreshTimeout())); print_scaleY = print_scaleX = 1.0; redrawtimer = new QTimer(this); connect(redrawtimer, SIGNAL(timeout()), SLOT(redraw())); m_fadingOut = false; m_fadingIn = false; m_inAnimation = false; m_limbo = false; m_fadedir = false; m_blockUpdates = false; use_pixmap_cache = p_profile->appearance->usePixmapCaching(); pin_graph = nullptr; // pixmapcache.setCacheLimit(10240*2); #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) m_dpr = devicePixelRatio(); m_dpr = 1; #endif #ifndef BROKEN_OPENGL_BUILD setAutoFillBackground(false); setAutoBufferSwap(false); #endif context_menu = new QMenu(this); pin_action = context_menu->addAction(QString(), this, SLOT(togglePin())); pin_icon = QPixmap(":/icons/pushpin.png"); snap_action = context_menu->addAction(QString(), this, SLOT(onSnapshotGraphToggle())); context_menu->addSeparator(); zoom100_action = context_menu->addAction(tr("100% zoom level"), this, SLOT(resetZoom())); zoom100_action->setToolTip(tr("Restore X-axis zoom too 100% to view entire days data.")); QAction * action = context_menu->addAction(tr("Reset Graph Layout"), this, SLOT(resetLayout())); action->setToolTip(tr("Resets all graphs to a uniform height and default order.")); context_menu->addSeparator(); limits_menu = context_menu->addMenu(tr("Y-Axis")); plots_menu = context_menu->addMenu(tr("Plots")); connect(plots_menu, SIGNAL(triggered(QAction*)), this, SLOT(onPlotsClicked(QAction*))); // overlay_menu = context_menu->addMenu("Overlays"); cpap_menu = context_menu->addMenu(tr("CPAP Overlays")); connect(cpap_menu, SIGNAL(triggered(QAction*)), this, SLOT(onOverlaysClicked(QAction*))); oximeter_menu = context_menu->addMenu(tr("Oximeter Overlays")); connect(oximeter_menu, SIGNAL(triggered(QAction*)), this, SLOT(onOverlaysClicked(QAction*))); lines_menu = context_menu->addMenu(tr("Dotted Lines")); connect(lines_menu, SIGNAL(triggered(QAction*)), this, SLOT(onLinesClicked(QAction*))); #if !defined(Q_OS_MAC) context_menu->setStyleSheet("QMenu {\ background-color: #f0f0f0; /* sets background of the menu */\ border: 1px solid black;\ }\ QMenu::item {\ /* sets background of menu item. set this to something non-transparent\ if you want menu color and menu item color to be different */\ background-color: #f0f0f0;\ }\ QMenu::item:selected { /* when user selects item using mouse or keyboard */\ background-color: #ABCDEF;\ }"); #else context_menu->setStyleSheet("QMenu::item:selected { /* when user selects item using mouse or keyboard */\ background-color: #ABCDEF;\ }"); #endif } void gGraphView::togglePin() { if (pin_graph) { pin_graph->setPinned(!pin_graph->isPinned()); timedRedraw(0); } } void gGraphView::closeEvent(QCloseEvent * event) { timer->stop(); redrawtimer->stop(); disconnect(redrawtimer, 0, 0, 0); disconnect(timer, 0, 0, 0); timer->deleteLater(); redrawtimer->deleteLater(); pixmapcache.clear(); if (m_scrollbar) { this->disconnect(m_scrollbar, SIGNAL(sliderMoved(int)), 0, 0); } #ifdef BROKEN_OPENGL_BUILD QWidget::closeEvent(event); #else QGLWidget::closeEvent(event); #endif } gGraphView::~gGraphView() { #ifndef BROKEN_OPENGL_BUILD doneCurrent(); #endif #ifdef ENABLE_THREADED_DRAWING for (int i = 0; i < m_threads.size(); i++) { delete m_threads[i]; } delete masterlock; #endif // Note: This will cause a crash if two graphs accidentally have the same name for (QList::iterator g = m_graphs.begin(); g!= m_graphs.end(); ++g) { gGraph * graph = *g; delete graph; } delete m_tooltip; m_graphs.clear(); } void gGraphView::dumpInfo() { QDate date = mainwin->getDaily()->getDate(); QString text = "==================== CPAP Information Dump ===================="; mainwin->log(text); Day * day = p_profile->GetGoodDay(date, MT_CPAP); if (day) { QDateTime dt=QDateTime::fromMSecsSinceEpoch(day->first()); mainwin->log(QString("Available Channels for %1").arg(dt.toString("MMM dd yyyy"))); QHash > list; for (int i=0; i< day->size(); ++i) { Session * sess = day->sessions.at(i); QHash >::iterator it; for (it = sess->eventlist.begin(); it != sess->eventlist.end(); ++it) { ChannelID code = it.key(); schema::Channel * chan = &schema::channel[code]; list[chan->type()].append(chan); } } QHash >::iterator lit; for (lit = list.begin(); lit != list.end(); ++lit) { switch (lit.key()) { case schema::DATA: text = "DATA: "; break; case schema::SETTING: text = "SETTING: "; break; case schema::FLAG: text = "FLAG: "; break; case schema::MINOR_FLAG: text = "MINOR_FLAG: "; break; case schema::SPAN: text = "SPAN: "; break; case schema::WAVEFORM: text = "WAVEFORM: "; break; case schema::UNKNOWN: text = "UNKNOWN: "; break; default: break; } QStringList str; for (int i=0; i< lit.value().size(); ++i) { str.append(lit.value().at(i)->code()); } str.sort(); text.append(str.join(", ")); mainwin->log(text); } } // for (int i=0;idumpInfo(); // } } bool gGraphView::usePixmapCache() { //use_pixmap_cache is an overide setting return p_profile->appearance->usePixmapCaching(); } #define CACHE_DRAWTEXT #ifndef CACHE_DRAWTEXT // Render all qued text via QPainter method void gGraphView::DrawTextQue(QPainter &painter) { int w, h; // not sure if global antialiasing would be better.. //painter.setRenderHint(QPainter::TextAntialiasing, p_profile->appearance->antiAliasing()); int items = m_textque.size(); for (int i = 0; i < items; ++i) { TextQue &q = m_textque[i]; painter.setPen(q.color); painter.setRenderHint(QPainter::TextAntialiasing, q.antialias); QFont font = *q.font; painter.setFont(font); if (q.angle == 0) { // normal text painter.drawText(q.x, q.y, q.text); } else { // rotated text w = painter.fontMetrics().width(q.text); h = painter.fontMetrics().xHeight() + 2; painter.translate(q.x, q.y); painter.rotate(-q.angle); painter.drawText(floor(-w / 2.0), floor(-h / 2.0), q.text); painter.rotate(+q.angle); painter.translate(-q.x, -q.y); } strings_drawn_this_frame++; q.text.clear(); } m_textque.clear(); items = m_textqueRect.size(); for (int i=0; i< items; ++i) { TextQueRect &q = m_textqueRect[i]; painter.setPen(q.color); painter.setRenderHint(QPainter::TextAntialiasing, q.antialias); QFont font = *q.font; painter.setFont(font); if (q.angle == 0) { // normal text painter.drawText(q.rect, q.flags, q.text); } else { // rotated text int x = q.rect.x(); int y = q.rect.y(); w = painter.fontMetrics().width(q.text); h = painter.fontMetrics().xHeight() + 2; painter.translate(x, y); painter.rotate(-q.angle); painter.drawText(floor(-w / 2.0), floor(-h / 2.0), q.text); painter.rotate(+q.angle); painter.translate(-x, -y); } strings_drawn_this_frame++; q.text.clear(); } m_textqueRect.clear(); } #else // Render graphs with QPainter or pixmap caching, depending on preferences void gGraphView::DrawTextQue(QPainter &painter) { { // process the text drawing queue int m_textque_items = m_textque.size(); int h,w; for (int i = 0; i < m_textque_items; ++i) { const TextQue &q = m_textque.at(i); // can do antialiased text via texture cache fine on mac if (usePixmapCache()) { // Generate the pixmap cache "key" QString hstr = QString("%1:%2:%3"). arg(q.text). arg(q.color.name()). arg(q.font->pointSize()); QPixmap pm; const int buf = 8; if (!QPixmapCache::find(hstr, &pm)) { QFontMetrics fm(*q.font); // QRect rect=fm.tightBoundingRect(q.text); w = fm.width(q.text); h = fm.height()+buf; pm=QPixmap(w, h); pm.fill(Qt::transparent); QPainter imgpainter(&pm); imgpainter.setPen(q.color); imgpainter.setFont(*q.font); imgpainter.setRenderHint(QPainter::TextAntialiasing, q.antialias); imgpainter.drawText(0, h-buf, q.text); imgpainter.end(); QPixmapCache::insert(hstr, pm); strings_drawn_this_frame++; } else { //cached strings_cached_this_frame++; } h = pm.height(); w = pm.width(); if (q.angle != 0) { float xxx = q.x - h - (h / 2); float yyy = q.y + w / 2; // + buf / 2; xxx+=4; yyy+=4; painter.translate(xxx, yyy); painter.rotate(-q.angle); painter.drawPixmap(QRect(0, h / 2, w, h), pm); painter.rotate(+q.angle); painter.translate(-xxx, -yyy); } else { QRect r1(q.x - buf / 2 + 4, q.y - h + buf, w, h); painter.drawPixmap(r1, pm); } } else { // Just draw the fonts.. painter.setPen(QColor(q.color)); painter.setFont(*q.font); if (q.angle == 0) { painter.drawText(q.x, q.y, q.text); } else { painter.setFont(*q.font); w = painter.fontMetrics().width(q.text); h = painter.fontMetrics().xHeight() + 2; painter.translate(q.x, q.y); painter.rotate(-q.angle); painter.drawText(floor(-w / 2.0)-6, floor(-h / 2.0), q.text); painter.rotate(+q.angle); painter.translate(-q.x, -q.y); } strings_drawn_this_frame++; } //q.text.clear(); //q.text.squeeze(); } m_textque.clear(); } //////////////////////////////////////////////////////////////////////// // Text Rectangle Queues.. //////////////////////////////////////////////////////////////////////// int items = m_textqueRect.size(); float ww, hh; for (int i = 0; i < items; ++i) { const TextQueRect &q = m_textqueRect.at(i); // can do antialiased text via texture cache fine on mac if (usePixmapCache()) { // Generate the pixmap cache "key" QString hstr = QString("%1:%2:%3"). arg(q.text). arg(q.color.name()). arg(q.font->pointSize()); QPixmap pm; if (!QPixmapCache::find(hstr, &pm)) { ww = q.rect.width(); hh = q.rect.height(); pm=QPixmap(ww, hh); //int aaw1 = pm.width(); pm.fill(Qt::transparent); QPainter imgpainter(&pm); //int aaw2 = pm.width(); imgpainter.setPen(q.color); imgpainter.setFont(*q.font); imgpainter.setRenderHint(QPainter::Antialiasing, true); imgpainter.setRenderHint(QPainter::TextAntialiasing, true); QRectF rect(0,0, ww, hh); imgpainter.drawText(rect, q.flags, q.text); //int aaw3 = pm.width(); imgpainter.end(); QPixmapCache::insert(hstr, pm); //int aaw4 = pm.width(); strings_drawn_this_frame++; } else { //cached strings_cached_this_frame++; } hh = pm.height(); ww = pm.width(); if (q.angle != 0) { float xxx = q.rect.x() - hh - (hh / 2); float yyy = q.rect.y() + ww / 2; // + buf / 2; xxx+=4; yyy+=4; painter.translate(xxx, yyy); painter.rotate(-q.angle); painter.drawPixmap(QRect(0, hh / 2, ww, hh), pm); painter.rotate(+q.angle); painter.translate(-xxx, -yyy); } else { //painter.drawPixmap(QPoint(q.rect.x(), q.rect.y()), pm); painter.drawPixmap(q.rect,pm, QRect(0,0,ww,hh)); } } else { // Just draw the fonts.. painter.setPen(QColor(q.color)); painter.setFont(*q.font); if (q.angle == 0) { painter.drawText(q.rect, q.flags, q.text); } else { painter.setFont(*q.font); ww = painter.fontMetrics().width(q.text); hh = painter.fontMetrics().xHeight() + 2; painter.translate(q.rect.x(), q.rect.y()); painter.rotate(-q.angle); painter.drawText(floor(-ww / 2.0), floor(-hh / 2.0), q.text); painter.rotate(+q.angle); painter.translate(-q.rect.x(), -q.rect.y()); } strings_drawn_this_frame++; } //q.text.clear(); //q.text.squeeze(); } m_textqueRect.clear(); } #endif void gGraphView::AddTextQue(const QString &text, QRectF rect, quint32 flags, float angle, QColor color, QFont *font, bool antialias) { #ifdef ENABLED_THREADED_DRAWING text_mutex.lock(); #endif m_textqueRect.append(TextQueRect(rect,flags,text,angle,color,font,antialias)); #ifdef ENABLED_THREADED_DRAWING text_mutex.unlock(); #endif } void gGraphView::AddTextQue(const QString &text, short x, short y, float angle, QColor color, QFont *font, bool antialias) { #ifdef ENABLED_THREADED_DRAWING text_mutex.lock(); #endif m_textque.append(TextQue(x,y,angle,text,color,font,antialias)); #ifdef ENABLED_THREADED_DRAWING text_mutex.unlock(); #endif } void gGraphView::addGraph(gGraph *g, short group) { if (!g) { qDebug() << "Attempted to add an empty graph!"; return; } if (!m_graphs.contains(g)) { g->setGroup(group); m_graphs.push_back(g); if (!m_graphsbyname.contains(g->name())) { m_graphsbyname[g->name()] = g; } else { qDebug() << "Can't have two graphs with the same code string in the same GraphView!!"; } // updateScrollBar(); } } // Calculate total height of all graphs including spacers float gGraphView::totalHeight() { float th = 0; for (int i = 0; i < m_graphs.size(); i++) { gGraph * g = m_graphs[i]; if (g->isEmpty() || (!g->visible())) { continue; } th += g->height() + graphSpacer; } return ceil(th); } float gGraphView::findTop(gGraph *graph) { float th = -m_offsetY; for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i] == graph) { break; } if (m_graphs[i]->isEmpty() || (!m_graphs[i]->visible())) { continue; } th += m_graphs[i]->height() * m_scaleY + graphSpacer; } return ceil(th); } float gGraphView::scaleHeight() { float th = 0; for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]->isEmpty() || (!m_graphs[i]->visible())) { continue; } th += m_graphs[i]->height() * m_scaleY + graphSpacer; } return ceil(th); } void gGraphView::updateScale() { if (!isVisible()) { m_scaleY = 0.0; return; } float th = totalHeight(); // height of all graphs float h = height(); // height of main widget if (th < h) { th -= graphSpacer; // th -= visibleGraphs() * graphSpacer; // compensate for spacer height m_scaleY = h / th; // less graphs than fits on screen, so scale to fit } else { m_scaleY = 1.0; } updateScrollBar(); } void gGraphView::resizeEvent(QResizeEvent *e) { // QWidget::resizeEvent(e); // This ques a redraw event.. updateScale(); if (m_scaleY > 0.0001) { for (int i = 0; i < m_graphs.size(); i++) { m_graphs[i]->resize(e->size().width(), m_graphs[i]->height() * m_scaleY); } } e->accept(); } void gGraphView::scrollbarValueChanged(int val) { //qDebug() << "Scrollbar Changed" << val; if (m_offsetY != val) { m_offsetY = val; timedRedraw(); // do this on a timer? } } void gGraphView::GetRXBounds(qint64 &st, qint64 &et) { //qint64 m1=0,m2=0; gGraph *g = nullptr; for (int i = 0; i < m_graphs.size(); i++) { g = m_graphs[i]; if (g->group() == 0) { break; } } st = g->rmin_x; et = g->rmax_x; } void gGraphView::ResetBounds(bool refresh) //short group) { if (m_graphs.size() == 0) return; Q_UNUSED(refresh) qint64 m1 = 0, m2 = 0; gGraph *g = nullptr; for (int i = 0; i < m_graphs.size(); i++) { m_graphs[i]->ResetBounds(); if (!m_graphs[i]->min_x) { continue; } g = m_graphs[i]; if (!m1 || m_graphs[i]->min_x < m1) { m1 = m_graphs[i]->min_x; } if (!m2 || m_graphs[i]->max_x > m2) { m2 = m_graphs[i]->max_x; } } // if (p_profile->general->linkGroups()) { // for (int i = 0; i < m_graphs.size(); i++) { // m_graphs[i]->SetMinX(m1); // m_graphs[i]->SetMaxX(m2); // } // } if (!g) { g = m_graphs[0]; } m_minx = g->min_x; m_maxx = g->max_x; updateScale(); } void gGraphView::GetXBounds(qint64 &st, qint64 &et) { st = m_minx; et = m_maxx; } void gGraphView::SetXBounds(qint64 minx, qint64 maxx, short group, bool refresh) { for (int i = 0; i < m_graphs.size(); i++) { if ((m_graphs[i]->group() == group)) { m_graphs[i]->SetXBounds(minx, maxx); } } m_minx = minx; m_maxx = maxx; if (refresh) { timedRedraw(0); } } void gGraphView::updateScrollBar() { if (!m_scrollbar || (m_graphs.size() == 0)) { return; } float th = scaleHeight(); // height of all graphs float h = height(); // height of main widget float vis = 0; for (int i = 0; i < m_graphs.size(); i++) { vis += (m_graphs[i]->isEmpty() || !m_graphs[i]->visible()) ? 0 : 1; } if (th < h) { // less graphs than fits on screen m_scrollbar->setMaximum(0); // turn scrollbar off. } else { // more graphs than fit on screen //m_scaleY=1.0; float avgheight = th / vis; m_scrollbar->setPageStep(avgheight); m_scrollbar->setSingleStep(avgheight / 8.0); m_scrollbar->setMaximum(th - height()); if (m_offsetY > th - height()) { m_offsetY = th - height(); } } } void gGraphView::setScrollBar(MyScrollBar *sb) { m_scrollbar = sb; m_scrollbar->setMinimum(0); updateScrollBar(); this->connect(m_scrollbar, SIGNAL(valueChanged(int)), SLOT(scrollbarValueChanged(int))); } bool gGraphView::renderGraphs(QPainter &painter) { float px = m_offsetX; float py = -m_offsetY; int numgraphs = 0; float h, w; //ax=px;//-m_offsetX; //bool threaded; // Tempory hack using this pref.. //#ifdef ENABLED_THREADED_DRAWING /*if (profile->session->multithreading()) { // && (m_idealthreads>1)) { threaded=true; for (int i=0;iisRunning()) m_threads[i]->start(); } } else threaded=false; */ //#endif //threaded=false; if (height() < 40) return false; if (m_scaleY < 0.0000001) { updateScale(); } lines_drawn_this_frame = 0; quads_drawn_this_frame = 0; // Calculate the height of pinned graphs float pinned_height = 0; // pixel height total int pinned_graphs = 0; // count gGraph * g = nullptr; for (int i = 0; i < m_graphs.size(); i++) { g = m_graphs[i]; int minh = g->minHeight(); if (g->height() < minh) { g->setHeight(minh); } if (g->isEmpty()) { continue; } if (!g->visible()) { continue; } if (!g->isPinned()) { continue; } h = g->height() * m_scaleY; pinned_height += h + graphSpacer; pinned_graphs++; } py += pinned_height; // start drawing at the end of pinned space // Draw non pinned graphs for (int i = 0; i < m_graphs.size(); i++) { g = m_graphs[i]; if (g->isEmpty()) { continue; } if (!g->visible()) { continue; } if (g->isPinned()) { continue; } numgraphs++; h = g->height() * m_scaleY; // set clipping? if (py > height()) { break; // we are done.. can't draw anymore } if ((py + h + graphSpacer) >= 0) { w = width(); int tw = 0; // (g->showTitle() ? titleWidth : 0); queGraph(g, px + tw, py, width() - tw, h); if ((m_graphs.size() > 1) && m_showsplitter) { // draw the splitter handle painter.setPen(QColor(220, 220, 220, 255)); painter.drawLine(0, py + h, w, py + h); painter.setPen(QColor(158,158,158,255)); painter.drawLine(0, py + h + 1, w, py + h + 1); painter.setPen(QColor(240, 240, 240, 255)); painter.drawLine(0, py + h + 2, w, py + h + 2); } } py = ceil(py + h + graphSpacer); } // Physically draw the unpinned graphs int s = m_drawlist.size(); for (int i = 0; i < s; i++) { g = m_drawlist.at(0); m_drawlist.pop_front(); g->paint(painter, QRegion(g->m_rect)); } if (m_graphs.size() > 1) { DrawTextQue(painter); // Draw a gradient behind pinned graphs QLinearGradient linearGrad(QPointF(100, 100), QPointF(width() / 2, 100)); linearGrad.setColorAt(0, QColor(216, 216, 255)); linearGrad.setColorAt(1, Qt::white); painter.fillRect(0, 0, width(), pinned_height, QBrush(linearGrad)); } py = 0; // start drawing at top... // Draw Pinned graphs for (int i = 0; i < m_graphs.size(); i++) { g = m_graphs[i]; if (g->isEmpty()) { continue; } if (!g->visible()) { continue; } if (!g->isPinned()) { continue; } h = g->height() * m_scaleY; numgraphs++; if (py > height()) { break; // we are done.. can't draw anymore } if ((py + h + graphSpacer) >= 0) { w = width(); int tw = 0; //(g->showTitle() ? titleWidth : 0); queGraph(g, px + tw, py, width() - tw, h); if ((m_graphs.size() > 1) && m_showsplitter) { // draw the splitter handle painter.setPen(QColor(220, 220, 220, 255)); painter.drawLine(0, py + h, w, py + h); painter.setPen(QColor(128, 128, 128, 255)); painter.drawLine(0, py + h + 1, w, py + h + 1); painter.setPen(QColor(190, 190, 190, 255)); painter.drawLine(0, py + h + 2, w, py + h + 2); } } py = ceil(py + h + graphSpacer); } //int thr=m_idealthreads; #ifdef ENABLED_THREADED_DRAWING if (threaded) { for (int i = 0; i < m_idealthreads; i++) { masterlock->acquire(1); m_threads[i]->mutex.unlock(); } // wait till all the threads are done // ask for all the CPU's back.. masterlock->acquire(m_idealthreads); masterlock->release(m_idealthreads); } else { #endif s = m_drawlist.size(); for (int i = 0; i < s; i++) { g = m_drawlist.at(0); m_drawlist.pop_front(); g->paint(painter, QRegion(g->m_rect)); } #ifdef ENABLED_THREADED_DRAWING } #endif //int elapsed=time.elapsed(); //QColor col=Qt::black; // lines->setSize(linesize); DrawTextQue(painter); //glDisable(GL_TEXTURE_2D); //glDisable(GL_DEPTH_TEST); return numgraphs > 0; } #include "version.h" #ifdef BROKEN_OPENGL_BUILD void gGraphView::paintEvent(QPaintEvent *) #else void gGraphView::paintGL() #endif { if (!isVisible()) { // wtf is this even getting CALLED?? return; } #ifdef DEBUG_EFFICIENCY QElapsedTimer time; time.start(); #endif if (redrawtimer->isActive()) { redrawtimer->stop(); } bool render_cube = false; //p_profile->appearance->animations(); // do something to if (width() <= 0) { return; } if (height() <= 0) { return; } // Create QPainter object, note this is only valid from paintGL events! QPainter painter(this); painter.setRenderHint(QPainter::TextAntialiasing, true); QRect bgrect(0, 0, width(), height()); painter.fillRect(bgrect,QBrush(QColor(255,255,255))); bool graphs_drawn = true; lines_drawn_this_frame = 0; quads_drawn_this_frame = 0; strings_drawn_this_frame = 0; strings_cached_this_frame = 0; graphs_drawn = renderGraphs(painter); if (!graphs_drawn) { // No graphs drawn? show something useful :) QString txt; if (m_showAuthorMessage) { if (emptyText() == STR_Empty_Brick) { txt = "\nI'm very sorry your machine doesn't record useful data to graph in Daily View :("; } else { // not proud of telling them their machine is a Brick.. ;) txt = QObject::tr("SleepyHead is proudly brought to you by JediMark."); } } // int x2, y2; // GetTextExtent(m_emptytext, x2, y2, bigfont); // int tp2, tp1; if (!m_emptyimage.isNull()) { painter.drawPixmap(width() /2 - m_emptyimage.width() /2, height() /2 - m_emptyimage.height() /2 , m_emptyimage); // tp2 = height() /2 + m_emptyimage.height()/2 + y2; } /*else { tp2 = height() / 2 + y2; }*/ QColor col = Qt::black; painter.setPen(col); // painter.setFont(*bigfont); // painter.drawText((width() / 2) - x2 / 2, tp2, m_emptytext); QRectF rec(0,0,width(),0); painter.setFont(*defaultfont); rec = painter.boundingRect(rec, Qt::AlignHCenter | Qt::AlignBottom, txt); rec.moveBottom(height()-5); painter.drawText(rec, Qt::AlignHCenter | Qt::AlignBottom, txt); } if (p_profile->appearance->lineCursorMode()) { emit updateCurrentTime(graphs_drawn ? m_currenttime : 0.0F); } else { emit updateRange(graphs_drawn ? m_minx : 0.0F, m_maxx); } DrawTextQue(painter); m_tooltip->paint(painter); #ifdef DEBUG_EFFICIENCY const int rs = 10; static double ring[rs] = {0}; static int rp = 0; // Show FPS and draw time if (m_showsplitter && p_profile->general->showPerformance()) { QString ss; qint64 ela = time.nsecsElapsed(); double ms = double(ela) / 1000000.0; ring[rp++] = 1000.0 / ms; rp %= rs; double v = 0; for (int i = 0; i < rs; i++) { v += ring[i]; } double fps = v / double(rs); ss = "Debug Mode " + QString::number(fps, 'f', 1) + "fps " + QString::number(lines_drawn_this_frame, 'f', 0) + " lines " // + QString::number(quads_drawn_this_frame, 'f', 0) + " quads " + QString::number(strings_drawn_this_frame, 'f', 0) + " strings " + QString::number(strings_cached_this_frame, 'f', 0) + " cached "; int w, h; // this uses tightBoundingRect, which is different on Mac than it is on Windows & Linux. GetTextExtent(ss, w, h); QColor col = Qt::white; if (m_graphs.size() > 0) { painter.fillRect(width() - m_graphs[0]->marginRight(), 0, m_graphs[0]->marginRight(), w, QBrush(col)); } #ifndef Q_OS_MAC // if (usePixmapCache()) xx+=4; else xx-=3; #endif AddTextQue(ss, width(), w / 2, 90, QColor(Qt::black), defaultfont); DrawTextQue(painter); } // painter.setPen(Qt::lightGray); // painter.drawLine(0, 0, 0, height()); // painter.drawLine(0, 0, width(), 0); // painter.setPen(Qt::darkGray); //painter.drawLine(width(), 0, width(), height()); #endif painter.end(); #ifndef BROKEN_OPENGL_BUILD swapBuffers(); #endif if (this->isVisible() && !graphs_drawn && render_cube) { // keep the cube spinning redrawtimer->setInterval(1000.0 / 50); // 50 FPS redrawtimer->setSingleShot(true); redrawtimer->start(); } } QString gGraphView::getRangeString() { QString fmt; qint64 diff = m_maxx - m_minx; if (diff > 86400000) { int days = ceil(double(m_maxx-m_minx) / 86400000.0); qint64 minx = floor(double(m_minx)/86400000.0); minx *= 86400000L; qint64 maxx = minx + 86400000L * qint64(days)-1; QDateTime st = QDateTime::fromMSecsSinceEpoch(minx); QDateTime et = QDateTime::fromMSecsSinceEpoch(maxx); QString txt = st.toString("d MMM") + " - " + et.addDays(-1).toString("d MMM yyyy"); return txt; } else if (diff > 60000) { fmt = "HH:mm:ss"; } else { fmt = "HH:mm:ss:zzz"; } QDateTime st = QDateTime::fromMSecsSinceEpoch(m_minx); QDateTime et = QDateTime::fromMSecsSinceEpoch(m_maxx); QString txt = st.toString(QObject::tr("d MMM [ %1 - %2 ]").arg(fmt).arg(et.toString(fmt))) ; return txt; } void gGraphView::leaveEvent(QEvent * event) { Q_UNUSED(event); if (m_metaselect) { m_metaselect = false; timedRedraw(0); } releaseKeyboard(); } // For manual scrolling void gGraphView::setOffsetY(int offsetY) { if (m_offsetY != offsetY) { m_offsetY = offsetY; redraw(); //issue full redraw.. } } // For manual X scrolling (not really needed) void gGraphView::setOffsetX(int offsetX) { if (m_offsetX != offsetX) { m_offsetX = offsetX; redraw(); //issue redraw } } void gGraphView::mouseMoveEvent(QMouseEvent *event) { grabKeyboard(); int x = event->x(); int y = event->y(); m_mouse = QPoint(x, y); if (m_sizer_dragging) { // Resize handle being dragged float my = y - m_sizer_point.y(); //qDebug() << "Sizer moved vertically" << m_sizer_index << my*m_scaleY; float h = m_graphs[m_sizer_index]->height(); h += my / m_scaleY; if (h > m_graphs[m_sizer_index]->minHeight()) { m_graphs[m_sizer_index]->setHeight(h); m_sizer_point.setX(x); m_sizer_point.setY(y); updateScrollBar(); timedRedraw(); } return; } if (m_graph_dragging) { // Title bar being dragged to reorder gGraph *p; int yy = m_sizer_point.y(); bool empty; if (y < yy) { for (int i = m_graph_index - 1; i >= 0; i--) { if (m_graphs[i]->isPinned() != m_graphs[m_graph_index]->isPinned()) { // fix cursor continue; } empty = m_graphs[i]->isEmpty() || (!m_graphs[i]->visible()); // swapping upwards. int yy2 = yy - graphSpacer - m_graphs[i]->height() * m_scaleY; yy2 += m_graphs[m_graph_index]->height() * m_scaleY; if (y < yy2) { //qDebug() << "Graph Reorder" << m_graph_index; p = m_graphs[m_graph_index]; m_graphs[m_graph_index] = m_graphs[i]; m_graphs[i] = p; if (!empty) { m_sizer_point.setY(yy - graphSpacer - m_graphs[m_graph_index]->height()*m_scaleY); redraw(); } m_graph_index--; } if (!empty) { break; } } } else if (y > yy + graphSpacer + m_graphs[m_graph_index]->height()*m_scaleY) { // swapping downwards //qDebug() << "Graph Reorder" << m_graph_index; for (int i = m_graph_index + 1; i < m_graphs.size(); i++) { if (m_graphs[i]->isPinned() != m_graphs[m_graph_index]->isPinned()) { //m_graph_dragging=false; // fix cursor continue; } empty = m_graphs[i]->isEmpty() || (!m_graphs[i]->visible()); p = m_graphs[m_graph_index]; m_graphs[m_graph_index] = m_graphs[i]; m_graphs[i] = p; if (!empty) { m_sizer_point.setY(yy + graphSpacer + m_graphs[m_graph_index]->height()*m_scaleY); timedRedraw(); } m_graph_index++; if (!empty) { break; } } } return; } float py = 0, pinned_height = 0, h; bool done = false; // Do pinned graphs first for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]->isEmpty() || !m_graphs[i]->visible() || !m_graphs[i]->isPinned()) { continue; } h = m_graphs[i]->height() * m_scaleY; pinned_height += h + graphSpacer; if (py > height()) { break; // we are done.. can't draw anymore } if (!((y >= py + m_graphs[i]->top) && (y < py + h - m_graphs[i]->bottom))) { if (m_graphs[i]->isSelected()) { m_graphs[i]->deselect(); timedRedraw(150); } } // Update Mouse Cursor shape if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) { this->setCursor(Qt::SplitVCursor); done = true; } else if ((y >= py + 1) && (y < py + h)) { if (x >= titleWidth + 10) { this->setCursor(Qt::ArrowCursor); } else { m_tooltip->display("Double click title to pin / unpin\nClick and drag to reorder graphs", x + 10, y, TT_AlignLeft); timedRedraw(0); this->setCursor(Qt::OpenHandCursor); } m_horiz_travel += qAbs(x - m_lastxpos) + qAbs(y - m_lastypos); m_lastxpos = x; m_lastypos = y; // QPoint p(x,y); // QMouseEvent e(event->type(),p,event->button(),event->buttons(),event->modifiers()); m_graphs[i]->mouseMoveEvent(event); done = true; } py += h + graphSpacer; } py = -m_offsetY; py += pinned_height; // Propagate mouseMove events to relevant graphs if (!done) for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]->isEmpty() || !m_graphs[i]->visible() || m_graphs[i]->isPinned()) { continue; } h = m_graphs[i]->height() * m_scaleY; if (py > height()) { break; // we are done.. can't draw anymore } if (!((y >= py + m_graphs[i]->top) && (y < py + h - m_graphs[i]->bottom))) { if (m_graphs[i]->isSelected()) { m_graphs[i]->deselect(); timedRedraw(150); } } // Update Mouse Cursor shape if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) { this->setCursor(Qt::SplitVCursor); } else if ((y >= py + 1) && (y < py + h)) { if (x >= titleWidth + 10) { this->setCursor(Qt::ArrowCursor); } else { m_tooltip->display("Double click title to pin / unpin\nClick and drag to reorder graphs", x + 10, y, TT_AlignLeft); timedRedraw(0); this->setCursor(Qt::OpenHandCursor); } m_horiz_travel += qAbs(x - m_lastxpos) + qAbs(y - m_lastypos); m_lastxpos = x; m_lastypos = y; gGraph *g = m_graphs[i]; if (g) { g->mouseMoveEvent(event); } } /* else if (!m_button_down && (y >= py) && (y < py+m_graphs[i]->top)) { // Mouse cursor is in top graph margin. } else if (!m_button_down && (y >= py+h-m_graphs[i]->bottom) && (y <= py+h)) { // Mouse cursor is in bottom grpah margin. } else if (m_button_down || ((y >= py+m_graphs[i]->top) && (y < py + h-m_graphs[i]->bottom))) { if (m_button_down || (x >= titleWidth+10)) { //(gYAxis::Margin-5) this->setCursor(Qt::ArrowCursor); m_horiz_travel+=qAbs(x-m_lastxpos)+qAbs(y-m_lastypos); m_lastxpos=x; m_lastypos=y; QPoint p(x-titleWidth,y-py); QMouseEvent e(event->type(),p,event->button(),event->buttons(),event->modifiers()); m_graphs[i]->mouseMoveEvent(&e); if (!m_button_down && (x<=titleWidth+(gYAxis::Margin-5))) { //qDebug() << "Hovering over" << m_graphs[i]->title(); if (m_graphsbytitle[STR_TR_EventFlags]==m_graphs[i]) { QVector & layers=m_graphs[i]->layers(); gFlagsGroup *fg; for (int i=0;i(layers[i]))!=nullptr) { float bh=fg->barHeight(); int count=fg->count(); float yp=py+m_graphs[i]->marginTop(); yp=y-yp; float th=(float(count)*bh); if (yp>=0 && ypvisibleLayers()[i]->code(); QString ttip=schema::channel[code].description(); m_tooltip->display(ttip,x,y-20,p_profile->general->tooltipTimeout()); redraw(); //qDebug() << code << ttip; } } break; } } } else { if (!m_graphs[i]->units().isEmpty()) { m_tooltip->display(m_graphs[i]->units(),x,y-20,p_profile->general->tooltipTimeout()); redraw(); } } } } else { this->setCursor(Qt::OpenHandCursor); } } */ // } py += h + graphSpacer; } } Layer * gGraphView::findLayer(gGraph * graph, LayerType type) { for (int i=0; i< graph->layers().size(); i++) { Layer * l = graph->layers()[i]; if (l->layerType() == type) { return l; } } return nullptr; } class MyWidgetAction : public QWidgetAction { public: MyWidgetAction(ChannelID code, QObject * parent = nullptr) :QWidgetAction(parent), code(code) { chbox = nullptr; } protected: virtual QWidget * createWidget(QWidget * parent) { connect(chbox, SIGNAL(toggled(bool)), this, SLOT(setChecked(bool))); connect(chbox, SIGNAL(clicked()), this, SLOT(trigger())); return chbox; } QCheckBox * chbox; ChannelID code; }; MinMaxWidget::MinMaxWidget(gGraph * graph, QWidget *parent) :QWidget(parent), graph(graph) { step = 1; createLayout(); } void MinMaxWidget::onMinChanged(double d) { graph->rec_miny = d; graph->timedRedraw(0); } void MinMaxWidget::onMaxChanged(double d) { graph->rec_maxy = d; graph->timedRedraw(0); } void MinMaxWidget::onResetClicked() { int tmp = graph->zoomY(); graph->setZoomY(0); EventDataType miny = graph->MinY(), maxy = graph->MaxY(); graph->roundY(miny, maxy); setMin(graph->rec_miny = miny); setMax(graph->rec_maxy = maxy); float r = maxy-miny; if (r > 400) { step = 50; } else if (r > 100) { step = 10; } else if (r > 50) { step = 5; } else { step = 1; } graph->setZoomY(tmp); } void MinMaxWidget::onComboChanged(int idx) { minbox->setEnabled(idx == 2); maxbox->setEnabled(idx == 2); reset->setEnabled(idx == 2); graph->setZoomY(idx); if (idx == 2) { if (qAbs(graph->rec_maxy - graph->rec_miny) < 0.0001) { onResetClicked(); } } } void MinMaxWidget::createLayout() { QGridLayout * layout = new QGridLayout; layout->setMargin(4); layout->setSpacing(4); combobox = new QComboBox(this); combobox->addItem(tr("Auto-Fit"), 0); combobox->addItem(tr("Defaults"), 1); combobox->addItem(tr("Override"), 2); combobox->setToolTip(tr("The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.")); connect(combobox, SIGNAL(activated(int)), this, SLOT(onComboChanged(int))); minbox = new QDoubleSpinBox(this); maxbox = new QDoubleSpinBox(this); minbox->setToolTip(tr("The Minimum Y-Axis value.. Note this can be a negative number if you wish.")); maxbox->setToolTip(tr("The Maximum Y-Axis value.. Must be greater than Minimum to work.")); int idx = graph->zoomY(); combobox->setCurrentIndex(idx); minbox->setEnabled(idx == 2); maxbox->setEnabled(idx == 2); minbox->setAlignment(Qt::AlignRight); maxbox->setAlignment(Qt::AlignRight); minbox->setMinimum(-9999.0); maxbox->setMinimum(-9999.0); minbox->setMaximum(9999.99); maxbox->setMaximum(9999.99); setMin(graph->rec_miny); setMax(graph->rec_maxy); float r = graph->rec_maxy - graph->rec_miny; if (r > 400) { step = 50; } else if (r > 100) { step = 10; } else if (r > 50) { step = 5; } else { step = 1; } minbox->setSingleStep(step); maxbox->setSingleStep(step); connect(minbox, SIGNAL(valueChanged(double)), this, SLOT(onMinChanged(double))); connect(maxbox, SIGNAL(valueChanged(double)), this, SLOT(onMaxChanged(double))); QLabel * label = new QLabel(tr("Scaling Mode")); QFont font = label->font(); font.setBold(true); label->setFont(font); label->setAlignment(Qt::AlignCenter); layout->addWidget(label,0,0); layout->addWidget(combobox,1,0); label = new QLabel(STR_TR_Min); label->setFont(font); label->setAlignment(Qt::AlignCenter); layout->addWidget(label,0,1); layout->addWidget(minbox,1,1); label = new QLabel(STR_TR_Max); label->setFont(font); label->setAlignment(Qt::AlignCenter); layout->addWidget(label,0,2); layout->addWidget(maxbox,1,2); reset = new QToolButton(this); reset->setIcon(QIcon(":/icons/refresh.png")); reset->setToolTip(tr("This button resets the Min and Max to match the Auto-Fit")); reset->setEnabled(idx == 2); layout->addWidget(reset,1,3); connect(reset, SIGNAL(clicked()), this, SLOT(onResetClicked())); this->setLayout(layout); } void gGraphView::populateMenu(gGraph * graph) { QAction * action; if (graph->isSnapshot()) { snap_action->setText(tr("Remove Clone")); snap_action->setData(graph->name()+"|remove"); // zoom100_action->setVisible(false); } else { snap_action->setText(tr("Clone %1 Graph").arg(graph->title())); snap_action->setData(graph->name()+"|snapshot"); // zoom100_action->setVisible(true); } // Menu title fonts QFont font = QApplication::font(); font.setBold(true); font.setPointSize(font.pointSize() + 3); gLineChart * lc = dynamic_cast(findLayer(graph,LT_LineChart)); SummaryChart * sc = dynamic_cast(findLayer(graph,LT_SummaryChart)); gSummaryChart * stg = dynamic_cast(findLayer(graph,LT_Overview)); limits_menu->clear(); if (lc || sc || stg) { QWidgetAction * widget = new QWidgetAction(this); MinMaxWidget * minmax = new MinMaxWidget(graph, this); widget->setDefaultWidget(minmax); limits_menu->addAction(widget); limits_menu->menuAction()->setVisible(true); } else { limits_menu->menuAction()->setVisible(false); } // First check for any linechart for this graph.. if (lc) { lines_menu->clear(); for (int i=0; i < lc->m_dotlines.size(); i++) { DottedLine & dot = lc->m_dotlines[i]; if (!lc->m_enabled[dot.code]) continue; schema::Channel &chan = schema::channel[dot.code]; if (dot.available) { QWidgetAction * widget = new QWidgetAction(context_menu); QCheckBox *chbox = new QCheckBox(chan.calc[dot.type].label(), context_menu); chbox->setMouseTracking(true); chbox->setStyleSheet(QString("QCheckBox:hover { background: %1; }").arg(QApplication::palette().highlight().color().name())); widget->setDefaultWidget(chbox); widget->setCheckable(true); widget->setData(QString("%1|%2").arg(graph->name()).arg(i)); connect(chbox, SIGNAL(toggled(bool)), widget, SLOT(setChecked(bool))); connect(chbox, SIGNAL(clicked()), widget, SLOT(trigger())); bool b = lc->m_dot_enabled[dot.code][dot.type]; //chan.calc[dot.type].enabled; chbox->setChecked(b); lines_menu->addAction(widget); // QAction *action = lines_menu->addAction(chan.calc[dot.type].label()); // action->setData(graph->name()); // action->setCheckable(true); // action->setChecked(chan.calc[dot.type].enabled); } } lines_menu->menuAction()->setVisible(lines_menu->actions().size() > 0); if (lines_menu->actions().size() > 0) { lines_menu->insertSeparator(lines_menu->actions()[0]); action = new QAction(QObject::tr("%1").arg(graph->title()), lines_menu); lines_menu->insertAction(lines_menu->actions()[0], action); action->setFont(font); action->setData(QString("")); action->setEnabled(false); } ////////////////////////////////////////////////////////////////////////////////////// // Populate Plots Menus ////////////////////////////////////////////////////////////////////////////////////// plots_menu->clear(); if (lc->m_codes.size() > 1) { for (int i=0; i m_codes.size(); ++i) { ChannelID code = lc->m_codes[i]; if (lc->m_day && !lc->m_day->channelHasData(code)) continue; QWidgetAction * widget = new QWidgetAction(context_menu); QCheckBox *chbox = new QCheckBox(schema::channel[code].label(), context_menu); chbox->setMouseTracking(true); chbox->setToolTip(schema::channel[code].description()); chbox->setStyleSheet(QString("QCheckBox:hover { background: %1; }").arg(QApplication::palette().highlight().color().name())); widget->setDefaultWidget(chbox); widget->setCheckable(true); widget->setData(QString("%1|%2").arg(graph->name()).arg(code)); connect(chbox, SIGNAL(toggled(bool)), widget, SLOT(setChecked(bool))); connect(chbox, SIGNAL(clicked()), widget, SLOT(trigger())); bool b = lc->m_enabled[code]; chbox->setChecked(b); plots_menu->addAction(widget); // QAction * action = plots_menu->addAction(schema::channel[code].label()); // action->setData(QString("%1|%2").arg(graph->name()).arg(code)); // action->setCheckable(true); // action->setChecked(lc->m_enabled[code]); } } plots_menu->menuAction()->setVisible((plots_menu->actions().size() > 1)); if (plots_menu->actions().size() > 0) { plots_menu->insertSeparator(plots_menu->actions()[0]); action = new QAction(QObject::tr("%1").arg(graph->title()), plots_menu); plots_menu->insertAction(plots_menu->actions()[0], action); action->setFont(font); action->setData(QString("")); action->setEnabled(false); } ////////////////////////////////////////////////////////////////////////////////////// // Populate Event Menus ////////////////////////////////////////////////////////////////////////////////////// oximeter_menu->clear(); cpap_menu->clear(); using namespace schema; quint32 showflags = schema::FLAG | schema::MINOR_FLAG | schema::SPAN; if (p_profile->general->showUnknownFlags()) showflags |= schema::UNKNOWN; QList chans = lc->m_day->getSortedMachineChannels(showflags); QHash Vis; for (int i=0; i < chans.size() ; ++i) { ChannelID code = chans.at(i); schema::Channel & chan = schema::channel[code]; QWidgetAction * widget = new QWidgetAction(context_menu); QCheckBox *chbox = new QCheckBox(schema::channel[code].fullname(), context_menu); chbox->setPalette(context_menu->palette()); chbox->setMouseTracking(true); chbox->setToolTip(schema::channel[code].description()); chbox->setStyleSheet(QString("QCheckBox:hover { background: %1; }").arg(QApplication::palette().highlight().color().name())); widget->setDefaultWidget(chbox); widget->setCheckable(true); widget->setData(QString("%1|%2").arg(graph->name()).arg(code)); connect(chbox, SIGNAL(toggled(bool)), widget, SLOT(setChecked(bool))); connect(chbox, SIGNAL(clicked()), widget, SLOT(trigger())); bool b = lc->m_flags_enabled[code]; chbox->setChecked(b); Vis[chan.machtype()] += b ? 1 : 0; action = nullptr; if (chan.machtype() == MT_OXIMETER) { oximeter_menu->insertAction(nullptr, widget); } else if ( chan.machtype() == MT_CPAP) { cpap_menu->insertAction(nullptr,widget); } } QString HideAllEvents = QObject::tr("Hide All Events"); QString ShowAllEvents = QObject::tr("Show All Events"); oximeter_menu->menuAction()->setVisible(oximeter_menu->actions().size() > 0); cpap_menu->menuAction()->setVisible(cpap_menu->actions().size() > 0); if (cpap_menu->actions().size() > 0) { cpap_menu->addSeparator(); if (Vis[MT_CPAP] > 0) { action = cpap_menu->addAction(HideAllEvents); action->setData(QString("%1|HideAll:CPAP").arg(graph->name())); } else { action = cpap_menu->addAction(ShowAllEvents); action->setData(QString("%1|ShowAll:CPAP").arg(graph->name())); } // Show CPAP Events menu Header... cpap_menu->insertSeparator(cpap_menu->actions()[0]); action = new QAction(QObject::tr("%1").arg(graph->title()), cpap_menu); cpap_menu->insertAction(cpap_menu->actions()[0], action); action->setFont(font); action->setData(QString("")); action->setEnabled(false); } if (oximeter_menu->actions().size() > 0) { oximeter_menu->addSeparator(); if (Vis[MT_OXIMETER] > 0) { action = oximeter_menu->addAction(HideAllEvents); action->setData(QString("%1|HideAll:OXI").arg(graph->name())); } else { action = oximeter_menu->addAction(ShowAllEvents); action->setData(QString("%1|ShowAll:OXI").arg(graph->name())); } oximeter_menu->insertSeparator(oximeter_menu->actions()[0]); action = new QAction(QObject::tr("%1").arg(graph->title()), oximeter_menu); oximeter_menu->insertAction(oximeter_menu->actions()[0], action); action->setFont(font); action->setData(QString("")); action->setEnabled(false); } } else { lines_menu->clear(); lines_menu->menuAction()->setVisible(false); plots_menu->clear(); plots_menu->menuAction()->setVisible(false); oximeter_menu->clear(); oximeter_menu->menuAction()->setVisible(false); cpap_menu->clear(); cpap_menu->menuAction()->setVisible(false); } } void gGraphView::onSnapshotGraphToggle() { QString name = snap_action->data().toString().section("|",0,0); QString cmd = snap_action->data().toString().section("|",-1).toLower(); QHash::iterator it = m_graphsbyname.find(name); if (it == m_graphsbyname.end()) return; gGraph * graph = it.value(); if (cmd == "snapshot") { QString basename = name+";"; if (graph->m_day) { QDateTime date = QDateTime::fromMSecsSinceEpoch(graph->min_x); basename += date.date().toString(Qt::SystemLocaleLongDate); } QString newname; // Find a new name.. How many snapshots for each graph counts as stupid? for (int i=1;i < 100;i++) { newname = basename+" ("+QString::number(i)+")"; it = m_graphsbyname.find(newname); if (it == m_graphsbyname.end()) { break; } } QString newtitle; bool fnd = false; // someday, some clown will keep adding new graphs to break this.. for (int i=1; i < 100; i++) { newtitle = graph->title()+"-"+QString::number(i); fnd = false; for (int j=0; jtitle() == newtitle) { fnd = true; break; } } if (!fnd) break; } if (fnd) { // holy crap.. what patience. but not what I meant by as many as you like ;) return; } gGraph * newgraph = new gGraph(newname, nullptr, newtitle, graph->units(), graph->height(), graph->group()); // newgraph->setBlockSelect(true); newgraph->setHeight(graph->height()); short group = 0; m_graphs.insert(m_graphs.indexOf(graph)+1, newgraph); m_graphsbyname[newname] = newgraph; newgraph->m_graphview = this; for (int i=0; i < graph->m_layers.size(); ++i) { Layer * layer = graph->m_layers.at(i)->Clone(); if (layer) { newgraph->m_layers.append(layer); } } for (int i=0;igroup(), group); } newgraph->setGroup(group+1); //newgraph->setMinHeight(pm.height()); newgraph->setDay(graph->m_day); if (graph->m_day) { graph->m_day->incUseCounter(); } newgraph->min_x = graph->min_x; newgraph->max_x = graph->max_x; if (graph->blockZoom()) { newgraph->setBlockZoom(graph->blockZoom()); newgraph->setBlockSelect(true); } if (graph->blockSelect()) { newgraph->setBlockSelect(true); } newgraph->setZoomY(graph->zoomY()); newgraph->setSnapshot(true); emit GraphsChanged(); // addGraph(newgraph); updateScale(); timedRedraw(0); } else if (cmd == "remove") { if (graph->m_day) { graph->m_day->decUseCounter(); if (graph->m_day->useCounter() == 0) { } } m_graphsbyname.remove(graph->name()); m_graphs.removeAll(it.value()); delete graph; updateScale(); timedRedraw(0); emit GraphsChanged(); } qDebug() << cmd << name; } bool gGraphView::hasSnapshots() { int size = m_graphs.size(); bool snap = false; for (int i=0; i< size; ++i) { gGraph * graph = m_graphs.at(i); if (graph->isSnapshot()) { snap = true; break; } } return snap; } void gGraphView::onPlotsClicked(QAction *action) { QString name = action->data().toString().section("|",0,0); ChannelID code = action->data().toString().section("|",-1).toInt(); QHash::iterator it = m_graphsbyname.find(name); if (it == m_graphsbyname.end()) return; gGraph * graph = it.value(); gLineChart * lc = dynamic_cast(findLayer(graph, LT_LineChart)); if (!lc) return; lc->m_enabled[code] = !lc->m_enabled[code]; graph->min_y = graph->MinY(); graph->max_y = graph->MaxY(); graph->timedRedraw(0); // lc->Miny(); // lc->Maxy(); } void gGraphView::onOverlaysClicked(QAction *action) { QString name = action->data().toString().section("|",0,0); QString data = action->data().toString().section("|",-1); QHash::iterator it = m_graphsbyname.find(name); if (it == m_graphsbyname.end()) return; gGraph * graph = it.value(); gLineChart * lc = dynamic_cast(findLayer(graph, LT_LineChart)); if (!lc) return; bool ok; ChannelID code = data.toInt(&ok); if (ok) { // Just toggling a flag on/off bool b = ! lc->m_flags_enabled[code]; lc->m_flags_enabled[code] = b; QWidgetAction * widget = qobject_cast(action); if (widget) { widget->setChecked(b); } timedRedraw(0); return; } QString hideall = data.section(":",0,0); if ((hideall == "HideAll") || (hideall == "ShowAll")) { bool value = (hideall == "HideAll") ? false : true; QString group = data.section(":",-1).toUpper(); MachineType mtype; if (group == "CPAP") mtype = MT_CPAP; else if (group == "OXI") mtype = MT_OXIMETER; else mtype = MT_UNKNOWN; QHash::iterator it; QHash::iterator mfe = lc->m_flags_enabled.end(); // First toggle the actual flag bits for (it = lc->m_flags_enabled.begin(); it != mfe; ++it) { if (schema::channel[it.key()].machtype() == mtype) { lc->m_flags_enabled[it.key()] = value; } } // Now toggle the menu actions.. bleh if (mtype == MT_CPAP) { for (int i=0; i< cpap_menu->actions().size(); i++) { if (cpap_menu->actions().at(i)->isCheckable()) { cpap_menu->actions().at(i)->setChecked(value); } } } else if (mtype == MT_OXIMETER) { for (int i=0; i< oximeter_menu->actions().size(); i++) { if (oximeter_menu->actions().at(i)->isCheckable()) { oximeter_menu->actions().at(i)->setChecked(value); } } } } } void gGraphView::onLinesClicked(QAction *action) { QString name = action->data().toString().section("|",0,0); QString data = action->data().toString().section("|",-1); QHash::iterator it = m_graphsbyname.find(name); if (it == m_graphsbyname.end()) return; gGraph * graph = it.value(); gLineChart * lc = dynamic_cast(findLayer(graph, LT_LineChart)); if (!lc) return; bool ok; int i = data.toInt(&ok); if (ok) { DottedLine & dot = lc->m_dotlines[i]; schema::Channel &chan = schema::channel[dot.code]; chan.calc[dot.type].enabled = !chan.calc[dot.type].enabled; lc->m_dot_enabled[dot.code][dot.type] = !lc->m_dot_enabled[dot.code][dot.type]; } timedRedraw(0); } void gGraphView::mousePressEvent(QMouseEvent *event) { int x = event->x(); int y = event->y(); float h, pinned_height = 0, py = 0; bool done = false; // first handle pinned graphs. // Calculate total height of all pinned graphs for (int i = 0; i < m_graphs.size(); i++) { gGraph *g = m_graphs[i]; if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) { continue; } h = g->height() * m_scaleY; pinned_height += h + graphSpacer; if (py > height()) { break; } if ((py + h + graphSpacer) >= 0) { if ((y >= py + h - 1) && (y <= py + h + graphSpacer)) { this->setCursor(Qt::SplitVCursor); m_sizer_dragging = true; m_sizer_index = i; m_sizer_point.setX(x); m_sizer_point.setY(y); done = true; } else if ((y >= py) && (y < py + h)) { //qDebug() << "Clicked" << i; if ((event->button() == Qt::LeftButton) && (x < titleWidth + 20)) { // clicked on title to drag graph.. // Note: reorder has to be limited to pinned graphs. m_graph_dragging = true; m_tooltip->cancel(); timedRedraw(50); m_graph_index = i; m_sizer_point.setX(x); m_sizer_point.setY(py); // point at top of graph.. this->setCursor(Qt::ClosedHandCursor); done=true; } else if ((event->button() == Qt::RightButton) && (x < (titleWidth + gYAxis::Margin))) { this->setCursor(Qt::ArrowCursor); pin_action->setText(QObject::tr("Unpin %1 Graph").arg(g->title())); pin_graph = g; populateMenu(g); context_menu->popup(event->globalPos()); done=true; } else if (!g->blockSelect()) { if (m_metaselect) { if (m_selected_graph) { m_selected_graph->m_selecting_area = false; } } // send event to graph.. m_point_clicked = QPoint(event->x(), event->y()); //QMouseEvent e(event->type(),m_point_clicked,event->button(),event->buttons(),event->modifiers()); m_button_down = true; m_metaselect = event->modifiers() && Qt::AltModifier; m_horiz_travel = 0; m_graph_index = i; m_selected_graph = g; g->mousePressEvent(event); } done = true; } } py += h + graphSpacer; } // then handle the remainder... py = -m_offsetY; py += pinned_height; if (!done) for (int i = 0; i < m_graphs.size(); i++) { gGraph * g = m_graphs[i]; if (!g) continue; if (!g || g->isEmpty() || !g->visible() || g->isPinned()) { continue; } h = g->height() * m_scaleY; if (py > height()) { break; } if ((py + h + graphSpacer) >= 0) { if ((y >= py + h - 1) && (y <= py + h + graphSpacer)) { this->setCursor(Qt::SplitVCursor); m_sizer_dragging = true; m_sizer_index = i; m_sizer_point.setX(x); m_sizer_point.setY(y); //qDebug() << "Sizer clicked" << i; done=true; } else if ((y >= py) && (y < py + h)) { //qDebug() << "Clicked" << i; if ((event->button() == Qt::LeftButton) && (x < (titleWidth + 20))) { // clicked on title to drag graph.. m_graph_dragging = true; m_tooltip->cancel(); redraw(); m_graph_index = i; m_sizer_point.setX(x); m_sizer_point.setY(py); // point at top of graph.. this->setCursor(Qt::ClosedHandCursor); done=true; } else if ((event->button() == Qt::RightButton) && (x < (titleWidth + gYAxis::Margin))) { this->setCursor(Qt::ArrowCursor); pin_action->setText(QObject::tr("Pin %1 Graph").arg(g->title())); pin_graph = g; populateMenu(g); context_menu->popup(event->globalPos()); done=true; } else if (!g->blockSelect()) { if (m_metaselect) { if (m_selected_graph) { m_selected_graph->m_selecting_area = false; } } // send event to graph.. m_point_clicked = QPoint(event->x(), event->y()); //QMouseEvent e(event->type(),m_point_clicked,event->button(),event->buttons(),event->modifiers()); m_button_down = true; m_metaselect = event->modifiers() && Qt::AltModifier; m_horiz_travel = 0; m_graph_index = i; m_selected_graph = g; g->mousePressEvent(event); } } } py += h + graphSpacer; done=true; } if (!done) { // if (event->button() == Qt::RightButton) { // this->setCursor(Qt::ArrowCursor); // context_menu->popup(event->globalPos()); // done=true; // } } } void gGraphView::mouseReleaseEvent(QMouseEvent *event) { int x = event->x(); int y = event->y(); float h, py = 0, pinned_height = 0; bool done = false; // Copy to a local variable to make sure this gets cleared bool button_down = m_button_down; m_button_down = false; // Handle pinned graphs first for (int i = 0; i < m_graphs.size(); i++) { gGraph *g = m_graphs[i]; if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) { continue; } h = g->height() * m_scaleY; pinned_height += h + graphSpacer; if (py > height()) { break; // we are done.. can't draw anymore } if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) { this->setCursor(Qt::SplitVCursor); done = true; } else if ((y >= py + 1) && (y <= py + h)) { // if (!m_sizer_dragging && !m_graph_dragging) { // g->mouseReleaseEvent(event); // } if (x >= titleWidth + 10) { this->setCursor(Qt::ArrowCursor); } else { this->setCursor(Qt::OpenHandCursor); } done = true; } py += h + graphSpacer; } // Now do the unpinned ones py = -m_offsetY; py += pinned_height; if (done) for (int i = 0; i < m_graphs.size(); i++) { gGraph *g = m_graphs[i]; if (!g || g->isEmpty() || !g->visible() || g->isPinned()) { continue; } h = g->height() * m_scaleY; if (py > height()) { break; // we are done.. can't draw anymore } if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) { this->setCursor(Qt::SplitVCursor); } else if ((y >= py + 1) && (y <= py + h)) { // if (!m_sizer_dragging && !m_graph_dragging) { // g->mouseReleaseEvent(event); // } if (x >= titleWidth + 10) { this->setCursor(Qt::ArrowCursor); } else { this->setCursor(Qt::OpenHandCursor); } } py += h + graphSpacer; } if (m_sizer_dragging) { m_sizer_dragging = false; return; } if (m_graph_dragging) { m_graph_dragging = false; // not sure why the cursor code doesn't catch this.. if (x >= titleWidth + 10) { this->setCursor(Qt::ArrowCursor); } else { this->setCursor(Qt::OpenHandCursor); } return; } // The graph that got the button press gets the release event if (button_down) { // m_button_down = false; m_metaselect = event->modifiers() & Qt::AltModifier; saveHistory(); if (m_metaselect) { m_point_released = event->pos(); } else { if ((m_graph_index >= 0) && (m_graphs[m_graph_index])) { m_graphs[m_graph_index]->mouseReleaseEvent(event); } } } timedRedraw(0); } void gGraphView::keyReleaseEvent(QKeyEvent *event) { if (m_metaselect && !(event->modifiers() & Qt::AltModifier)) { QMouseEvent mevent(QEvent::MouseButtonRelease, m_point_released, Qt::LeftButton, Qt::LeftButton, event->modifiers()); if (m_graph_index>=0) { m_graphs[m_graph_index]->mouseReleaseEvent(&mevent); } m_metaselect = false; timedRedraw(50); } if (event->key() == Qt::Key_Escape) { if (history.size() > 0) { SelectionHistoryItem h = history.takeFirst(); SetXBounds(h.minx, h.maxx); // could Forward push this to another list? } else { ResetBounds(); } return; } #ifdef BROKEN_OPENGL_BUILD QWidget::keyReleaseEvent(event); #else QGLWidget::keyReleaseEvent(event); #endif } void gGraphView::mouseDoubleClickEvent(QMouseEvent *event) { mousePressEvent(event); // signal missing.. a qt change might "fix" this if we are not careful. int x = event->x(); int y = event->y(); float h, py = 0, pinned_height = 0; bool done = false; // Handle pinned graphs first for (int i = 0; i < m_graphs.size(); i++) { gGraph *g = m_graphs[i]; if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) { continue; } h = g->height() * m_scaleY; pinned_height += h + graphSpacer; if (py > height()) { break; // we are done.. can't draw anymore } if ((py + h + graphSpacer) >= 0) { if ((y >= py) && (y <= py + h)) { if (x < titleWidth) { // What to do when double clicked on the graph title ?? g->mouseDoubleClickEvent(event); // pin the graph?? g->setPinned(false); redraw(); } else { // send event to graph.. g->mouseDoubleClickEvent(event); } done = true; } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) { // What to do when double clicked on the resize handle? done = true; } } py += h; py += graphSpacer; // do we want the extra spacer down the bottom? } py = -m_offsetY; py += pinned_height; if (!done) // then handle unpinned graphs for (int i = 0; i < m_graphs.size(); i++) { gGraph *g = m_graphs[i]; if (!g || g->isEmpty() || !g->visible() || g->isPinned()) { continue; } h = g->height() * m_scaleY; if (py > height()) { break; } if ((py + h + graphSpacer) >= 0) { if ((y >= py) && (y <= py + h)) { if (x < titleWidth) { // What to do when double clicked on the graph title ?? g->mouseDoubleClickEvent(event); g->setPinned(true); redraw(); } else { // send event to graph.. g->mouseDoubleClickEvent(event); } } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) { // What to do when double clicked on the resize handle? } } py += h; py += graphSpacer; // do we want the extra spacer down the bottom? } } void gGraphView::wheelEvent(QWheelEvent *event) { // Hmm.. I could optionalize this to change mousewheel behaviour without affecting the scrollbar now.. if (m_button_down) return; if (event->modifiers() == Qt::NoModifier) { int scrollDampening = p_profile->general->scrollDampening(); if (event->orientation() == Qt::Vertical) { // Vertical Scrolling if (horizScrollTime.elapsed() < scrollDampening) { return; } if (m_scrollbar) m_scrollbar->SendWheelEvent(event); // Just forwarding the event to scrollbar for now.. m_tooltip->cancel(); vertScrollTime.start(); return; } // (This is a total pain in the butt on MacBook touchpads..) if (vertScrollTime.elapsed() < scrollDampening) { return; } horizScrollTime.start(); } gGraph *graph = nullptr; int group = 0; int x = event->x(); int y = event->y(); float h, py = 0, pinned_height = 0; // Find graph hovered over for (int i = 0; i < m_graphs.size(); i++) { gGraph *g = m_graphs[i]; if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) { continue; } h = g->height() * m_scaleY; pinned_height += h + graphSpacer; if (py > height()) { break; // we are done.. can't draw anymore } if ((py + h + graphSpacer) >= 0) { if ((y >= py) && (y <= py + h)) { graph = g; break; } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) { // What to do when double clicked on the resize handle? graph = g; break; } } py += h; py += graphSpacer; // do we want the extra spacer down the bottom? } if (!graph) { py = -m_offsetY; py += pinned_height; for (int i = 0; i < m_graphs.size(); i++) { gGraph *g = m_graphs[i]; if (!g || g->isEmpty() || !g->visible() || g->isPinned()) { continue; } h = g->height() * m_scaleY; if (py > height()) { break; } if ((py + h + graphSpacer) >= 0) { if ((y >= py) && (y <= py + h)) { graph = g; break; } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) { // What to do when double clicked on the resize handle? graph = g; break; } } py += h; py += graphSpacer; // do we want the extra spacer down the bottom? } } if (event->modifiers() == Qt::NoModifier) { if (!graph) { // just pick any graph then for (int i = 0; i < m_graphs.size(); i++) { if (!m_graphs[i]) continue; if (!m_graphs[i]->isEmpty()) { graph = m_graphs[i]; group = graph->group(); break; } } } else group=graph->group(); if (!graph) { return; } double xx = (graph->max_x - graph->min_x); double zoom = 240.0; int delta = event->delta(); if (delta > 0) { graph->min_x -= (xx / zoom) * (float)abs(delta); } else { graph->min_x += (xx / zoom) * (float)abs(delta); } graph->max_x = graph->min_x + xx; if (graph->min_x < graph->rmin_x) { graph->min_x = graph->rmin_x; graph->max_x = graph->rmin_x + xx; } if (graph->max_x > graph->rmax_x) { graph->max_x = graph->rmax_x; graph->min_x = graph->max_x - xx; } saveHistory(); SetXBounds(graph->min_x, graph->max_x, group); } else if ((event->modifiers() & Qt::ControlModifier)) { if (graph) graph->wheelEvent(event); // int x = event->x(); // int y = event->y(); // float py = -m_offsetY; // float h; // for (int i = 0; i < m_graphs.size(); i++) { // gGraph *g = m_graphs[i]; // if (!g || g->isEmpty() || !g->visible()) { continue; } // h = g->height() * m_scaleY; // if (py > height()) { // break; // } // if ((py + h + graphSpacer) >= 0) { // if ((y >= py) && (y <= py + h)) { // if (x < titleWidth) { // // What to do when ctrl+wheel is used on the graph title ?? // } else { // // send event to graph.. // g->wheelEvent(event); // } // } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) { // // What to do when the wheel is used on the resize handle? // } // } // py += h; // py += graphSpacer; // do we want the extra spacer down the bottom? // } } } void gGraphView::getSelectionTimes(qint64 & start, qint64 & end) { if (m_graph_index >= 0) { gGraph *g = m_graphs[m_graph_index]; if (!g) { start = 0; end = 0; return; } int x1 = g->m_selection.x() + titleWidth; int x2 = x1 + g->m_selection.width(); start = g->screenToTime(x1); end = g->screenToTime(x2); } } void gGraphView::keyPressEvent(QKeyEvent *event) { m_metaselect = event->modifiers() & Qt::AltModifier; if (m_metaselect && ((event->key() == Qt::Key_B) || (event->key() == 8747))) { if (mainwin->getDaily()->graphView() == this) { if (m_graph_index >= 0) { m_metaselect=false; qint64 start,end; getSelectionTimes(start,end); QDateTime d1 = QDateTime::fromMSecsSinceEpoch(start); // QDateTime d2 = QDateTime::fromMSecsSinceEpoch(end); mainwin->getDaily()->addBookmark(start, end, QString("Bookmark at %1").arg(d1.time().toString("HH:mm:ss"))); m_graphs[m_graph_index]->cancelSelection(); m_graph_index = -1; timedRedraw(0); } event->accept(); return; } } if ((m_metaselect) && (event->key() >= Qt::Key_0) && (event->key() <= Qt::Key_9)) { int bk = (int)event->key()-Qt::Key_0; m_metaselect = false; timedRedraw(0); } if (event->key() == Qt::Key_F3) { p_profile->appearance->setLineCursorMode(!p_profile->appearance->lineCursorMode()); timedRedraw(0); } if ((event->key() == Qt::Key_F1)) { dumpInfo(); } if (event->key() == Qt::Key_Tab) { event->ignore(); return; } if (event->key() == Qt::Key_PageUp) { if (m_scrollbar) { m_offsetY -= p_profile->appearance->graphHeight() * 3 * m_scaleY; m_scrollbar->setValue(m_offsetY); m_offsetY = m_scrollbar->value(); redraw(); } return; } else if (event->key() == Qt::Key_PageDown) { if (m_scrollbar) { m_offsetY += p_profile->appearance->graphHeight() * 3 * m_scaleY; //p_profile->appearance->graphHeight(); if (m_offsetY < 0) { m_offsetY = 0; } m_scrollbar->setValue(m_offsetY); m_offsetY = m_scrollbar->value(); redraw(); } return; // redraw(); } gGraph *g = nullptr; int group = 0; // Pick the first valid graph in the primary group for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]->group() == group) { if (!m_graphs[i]->isEmpty() && m_graphs[i]->visible()) { g = m_graphs[i]; break; } } } if (!g) { for (int i = 0; i < m_graphs.size(); i++) { if (!m_graphs[i]->isEmpty()) { g = m_graphs[i]; group = g->group(); break; } } } if (!g) { return; } g->keyPressEvent(event); if (event->key() == Qt::Key_Left) { double xx = g->max_x - g->min_x; double zoom = 8.0; if (event->modifiers() & Qt::ControlModifier) { zoom /= 4; } g->min_x -= xx / zoom;; g->max_x = g->min_x + xx; if (g->min_x < g->rmin_x) { g->min_x = g->rmin_x; g->max_x = g->rmin_x + xx; } saveHistory(); SetXBounds(g->min_x, g->max_x, group); } else if (event->key() == Qt::Key_Right) { double xx = g->max_x - g->min_x; double zoom = 8.0; if (event->modifiers() & Qt::ControlModifier) { zoom /= 4; } g->min_x += xx / zoom; g->max_x = g->min_x + xx; if (g->max_x > g->rmax_x) { g->max_x = g->rmax_x; g->min_x = g->rmax_x - xx; } saveHistory(); SetXBounds(g->min_x, g->max_x, group); } else if (event->key() == Qt::Key_Up) { float zoom = 0.75F; if (event->modifiers() & Qt::ControlModifier) { zoom /= 1.5; } g->ZoomX(zoom, 0); // zoom in. } else if (event->key() == Qt::Key_Down) { float zoom = 1.33F; if (event->modifiers() & Qt::ControlModifier) { zoom *= 1.5; } g->ZoomX(zoom, 0); // Zoom out } //qDebug() << "Keypress??"; } void gGraphView::setDay(Day *day) { m_day = day; for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]) m_graphs[i]->setDay(day); } ResetBounds(false); } bool gGraphView::isEmpty() { bool res = true; for (int i = 0; i < m_graphs.size(); i++) { gGraph * graph = m_graphs.at(i); if (!graph->isSnapshot() && !graph->isEmpty()) { res = false; break; } } return res; } void gGraphView::refreshTimeout() { if (this->isVisible()) { redraw(); } } void gGraphView::timedRedraw(int ms) { if (timer->isActive()) { if (ms == 0) { timer->stop(); } else { int m = timer->remainingTime(); if (m > ms) { timer->stop(); } else return; } } timer->setSingleShot(true); timer->start(ms); } void gGraphView::resetLayout() { int default_height = p_profile->appearance->graphHeight(); for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]) m_graphs[i]->setHeight(default_height); } updateScale(); timedRedraw(0); } void gGraphView::deselect() { for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]) m_graphs[i]->deselect(); } } const quint32 gvmagic = 0x41756728; const quint16 gvversion = 4; void gGraphView::SaveSettings(QString title) { qDebug() << "Saving" << title << "settings"; QString filename = p_profile->Get("{DataFolder}/") + title.toLower() + ".shg"; QFile f(filename); f.open(QFile::WriteOnly); QDataStream out(&f); out.setVersion(QDataStream::Qt_4_6); out.setByteOrder(QDataStream::LittleEndian); out << (quint32)gvmagic; out << (quint16)gvversion; out << (qint16)size(); for (qint16 i = 0; i < size(); i++) { gGraph * graph = m_graphs[i]; if (!graph) continue; if (graph->isSnapshot()) continue; out << graph->name(); out << graph->height(); out << graph->visible(); out << graph->RecMinY(); out << graph->RecMaxY(); out << graph->zoomY(); out << (bool)graph->isPinned(); gLineChart * lc = dynamic_cast(findLayer(graph, LT_LineChart)); if (lc) { out << (quint32)LT_LineChart; out << lc->m_flags_enabled; out << lc->m_enabled; out << lc->m_dot_enabled; } else { out << (quint32)LT_Other; } } f.close(); } bool gGraphView::LoadSettings(QString title) { QString filename = p_profile->Get("{DataFolder}/") + title.toLower() + ".shg"; QFile f(filename); if (!f.exists()) { return false; } f.open(QFile::ReadOnly); QDataStream in(&f); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); quint32 t1; quint16 version; in >> t1; if (t1 != gvmagic) { qDebug() << "gGraphView" << title << "settings magic doesn't match" << t1 << gvmagic; return false; } in >> version; if (version < gvversion) { qDebug() << "gGraphView" << title << "settings will be upgraded."; } qint16 siz; in >> siz; QString name; float hght; bool vis; EventDataType recminy, recmaxy; bool pinned; short zoomy = 0; QList neworder; QHash::iterator gi; for (int i = 0; i < siz; i++) { in >> name; in >> hght; in >> vis; in >> recminy; in >> recmaxy; if (gvversion >= 1) { in >> zoomy; } if (gvversion >= 2) { in >> pinned; } QHash flags_enabled; QHash plots_enabled; QHash > dot_enabled; // Warning: Do not break the follow section up!!! quint32 layertype; if (gvversion >= 4) { in >> layertype; if (layertype == LT_LineChart) { in >> flags_enabled; in >> plots_enabled; in >> dot_enabled; } } gGraph *g = nullptr; if (version <= 2) { continue; // // Names were stored as translated strings, so look up title instead. // g = nullptr; // for (int z=0; ztitle() == name) { // g = m_graphs[z]; // break; // } // } } else { gi = m_graphsbyname.find(name); if (gi == m_graphsbyname.end()) { qDebug() << "Graph" << name << "has been renamed or removed"; } else { g = gi.value(); } } if (g) { neworder.push_back(g); g->setHeight(hght); g->setVisible(vis); g->setRecMinY(recminy); g->setRecMaxY(recmaxy); g->setZoomY(zoomy); g->setPinned(pinned); if (gvversion >= 4) { if (layertype == LT_LineChart) { gLineChart * lc = dynamic_cast(findLayer(g, LT_LineChart)); if (lc) { lc->m_flags_enabled = flags_enabled; lc->m_enabled = plots_enabled; lc->m_dot_enabled = dot_enabled; } } } } } if (neworder.size() == m_graphs.size()) { m_graphs = neworder; } f.close(); updateScale(); return true; } gGraph *gGraphView::findGraph(QString name) { QHash::iterator i = m_graphsbyname.find(name); if (i == m_graphsbyname.end()) { return nullptr; } return i.value(); } gGraph *gGraphView::findGraphTitle(QString title) { for (int i=0; i< m_graphs.size(); ++i) { if (m_graphs[i]->title() == title) return m_graphs[i]; } return nullptr; } int gGraphView::visibleGraphs() { int cnt = 0; for (int i = 0; i < m_graphs.size(); i++) { if (m_graphs[i]->visible() && !m_graphs[i]->isEmpty()) { cnt++; } } return cnt; } void gGraphView::dataChanged() { for (int i = 0; i < m_graphs.size(); i++) { m_graphs[i]->dataChanged(); } } void gGraphView::redraw() { #ifdef BROKEN_OPENGL_BUILD repaint(); #else updateGL(); #endif } sleepyhead-0.9.8/sleepyhead/Graphs/gLineChart.cpp0000644000175000017500000011240012412506713021307 0ustar sergiosergio/* gLineChart Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "Graphs/gLineChart.h" #include #include #include #include "Graphs/glcommon.h" #include "Graphs/gGraph.h" #include "Graphs/gGraphView.h" #include "SleepLib/profiles.h" #include "Graphs/gLineOverlay.h" #define EXTRA_ASSERTS 1 QDataStream & operator<<(QDataStream & stream, const DottedLine & dot) { stream << dot.code; stream << dot.type; stream << dot.value; stream << dot.visible; stream << dot.available; return stream; } QDataStream & operator>>(QDataStream & stream, DottedLine & dot) { quint32 tmp; stream >> dot.code; stream >> tmp; stream >> dot.value; stream >> dot.visible; stream >> dot.available; dot.type = (ChannelCalcType)tmp; return stream; } QColor darken(QColor color, float p) { int r = qMin(int(color.red() * p), 255); int g = qMin(int(color.green() * p), 255); int b = qMin(int(color.blue() * p), 255); return QColor(r,g,b, color.alpha()); } gLineChart::gLineChart(ChannelID code, bool square_plot, bool disable_accel) : Layer(code), m_square_plot(square_plot), m_disable_accel(disable_accel) { addPlot(code, square_plot); m_report_empty = false; lines.reserve(50000); lasttime = 0; m_layertype = LT_LineChart; } gLineChart::~gLineChart() { QHash::iterator fit; for (fit = flags.begin(); fit != flags.end(); ++fit) { // destroy any overlay bar from previous day delete fit.value(); } flags.clear(); } bool gLineChart::isEmpty() { if (!m_day) { return true; } for (int j = 0; j < m_codes.size(); j++) { ChannelID code = m_codes[j]; for (int i = 0; i < m_day->size(); i++) { Session *sess = m_day->sessions[i]; if (sess->channelExists(code)) { return false; } } } return true; } void gLineChart::SetDay(Day *d) { // Layer::SetDay(d); m_day = d; m_minx = 0, m_maxx = 0; m_miny = 0, m_maxy = 0; m_physminy = 0, m_physmaxy = 0; if (!d) { return; } qint64 t64; EventDataType tmp; bool first = true; for (int j = 0; j < m_codes.size(); j++) { ChannelID code = m_codes[j]; for (int i = 0; i < d->size(); i++) { Session *sess = d->sessions[i]; if (!sess->enabled()) continue; if (code == CPAP_MaskPressure) { if (sess->channelExists(CPAP_MaskPressureHi)) { code = m_codes[j] = CPAP_MaskPressureHi; m_enabled[code] = schema::channel[CPAP_MaskPressureHi].enabled(); goto skipcheck; // why not :P } } if (!sess->channelExists(code)) { continue; } skipcheck: if (first) { m_miny = sess->Min(code); m_maxy = sess->Max(code); m_physminy = sess->physMin(code); m_physmaxy = sess->physMax(code); m_minx = sess->first(code); m_maxx = sess->last(code); first = false; } else { tmp = sess->physMin(code); if (m_physminy > tmp) { m_physminy = tmp; } tmp = sess->physMax(code); if (m_physmaxy < tmp) { m_physmaxy = tmp; } tmp = sess->Min(code); if (m_miny > tmp) { m_miny = tmp; } tmp = sess->Max(code); if (m_maxy < tmp) { m_maxy = tmp; } t64 = sess->first(code); if (m_minx > t64) { m_minx = t64; } t64 = sess->last(code); if (m_maxx < t64) { m_maxx = t64; } } } } subtract_offset = 0; QHash::iterator fit; for (fit = flags.begin(); fit != flags.end(); ++fit) { // destroy any overlay bar from previous day delete fit.value(); } flags.clear(); quint32 z = schema::FLAG | schema::MINOR_FLAG | schema::SPAN; if (p_profile->general->showUnknownFlags()) z |= schema::UNKNOWN; QList available = m_day->getSortedMachineChannels(z); for (int i=0; i < available.size(); ++i) { ChannelID code = available.at(i); if (!m_flags_enabled.contains(code)) { bool b = false; if (((m_codes[0] == CPAP_FlowRate) || ((m_codes[0] == CPAP_MaskPressureHi))) && (schema::channel[code].machtype() == MT_CPAP)) b = true; if ((m_codes[0] == CPAP_Leak) && (code == CPAP_LargeLeak)) b = true; m_flags_enabled[code] = b; } if (!m_day->channelExists(code)) continue; schema::Channel * chan = &schema::channel[code]; gLineOverlayBar * lob = nullptr; if (chan->type() == schema::FLAG) { lob = new gLineOverlayBar(code, chan->defaultColor(), chan->label(), FT_Bar); } else if ((chan->type() == schema::MINOR_FLAG) || (chan->type() == schema::UNKNOWN)) { lob = new gLineOverlayBar(code, chan->defaultColor(), chan->label(), FT_Dot); } else if (chan->type() == schema::SPAN) { lob = new gLineOverlayBar(code, chan->defaultColor(), chan->label(), FT_Span); } if (lob != nullptr) { lob->setOverlayDisplayType(((m_codes[0] == CPAP_FlowRate))? (OverlayDisplayType)p_profile->appearance->overlayType() : ODT_TopAndBottom); lob->SetDay(m_day); flags[code] = lob; } } m_dotlines.clear(); for (int i=0; i< m_codes.size(); i++) { ChannelID code = m_codes[i]; schema::Channel & chan = schema::channel[code]; addDotLine(DottedLine(code, Calc_Max,chan.calc[Calc_Max].enabled)); if ((code != CPAP_FlowRate) && (code != CPAP_MaskPressure) && (code != CPAP_MaskPressureHi)) { addDotLine(DottedLine(code, Calc_Perc,chan.calc[Calc_Perc].enabled)); addDotLine(DottedLine(code, Calc_Middle, chan.calc[Calc_Middle].enabled)); } if ((code != CPAP_Snore) && (code != CPAP_FlowLimit) && (code != CPAP_RDI) && (code != CPAP_AHI)) { addDotLine(DottedLine(code, Calc_Min, chan.calc[Calc_Min].enabled)); } } if (m_codes[0] == CPAP_Leak) { addDotLine(DottedLine(CPAP_Leak, Calc_UpperThresh, schema::channel[CPAP_Leak].calc[Calc_UpperThresh].enabled)); } else if (m_codes[0] == CPAP_FlowRate) { addDotLine(DottedLine(CPAP_FlowRate, Calc_Zero, schema::channel[CPAP_FlowRate].calc[Calc_Zero].enabled)); } else if (m_codes[0] == OXI_Pulse) { addDotLine(DottedLine(OXI_Pulse, Calc_UpperThresh, schema::channel[OXI_Pulse].calc[Calc_UpperThresh].enabled)); addDotLine(DottedLine(OXI_Pulse, Calc_LowerThresh, schema::channel[OXI_Pulse].calc[Calc_LowerThresh].enabled)); } else if (m_codes[0] == OXI_SPO2) { addDotLine(DottedLine(OXI_SPO2, Calc_LowerThresh, schema::channel[OXI_SPO2].calc[Calc_LowerThresh].enabled)); } if (m_day) { for (int i=0; i < m_dotlines.size(); i++) { m_dotlines[i].calc(m_day); ChannelID code = m_dotlines[i].code; ChannelCalcType type = m_dotlines[i].type; bool b = false; // default value QHash >::iterator cit = m_dot_enabled.find(code); if (cit == m_dot_enabled.end()) { m_dot_enabled[code].insert(type, b); } else { QHash::iterator it = cit.value().find(type); if (it == cit.value().end()) { cit.value().insert(type, b); } } } } } EventDataType gLineChart::Miny() { int size = m_codes.size(); if (size == 0) return 0; if (!m_day) return 0; bool first = false; EventDataType min = 0, tmp; for (int i=0; i< size; ++i) { ChannelID code = m_codes[i]; if (!m_enabled[code] || !m_day->channelExists(code)) continue; tmp = m_day->Min(code); if (!first) { min = tmp; first = true; } else { min = qMin(tmp, min); } } if (!first) min = 0; m_miny = min; return min; // int m = Layer::Miny(); // if (subtract_offset > 0) { // m -= subtract_offset; // if (m < 0) { m = 0; } // } // return m; } EventDataType gLineChart::Maxy() { int size = m_codes.size(); if (size == 0) return 0; if (!m_day) return 0; bool first = false; EventDataType max = 0, tmp; for (int i=0; i< size; ++i) { ChannelID code = m_codes[i]; if (!m_enabled[code] || !m_day->channelExists(code)) continue; tmp = m_day->Max(code); if (!first) { max = tmp; first = true; } else { max = qMax(tmp, max); } } if (!first) max = 0; m_maxy = max; return max; // return Layer::Maxy() - subtract_offset; } bool gLineChart::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) graph->timedRedraw(0); return false; } QString gLineChart::getMetaString(qint64 time) { lasttext = QString(); if (!m_day) return lasttext; EventDataType val; EventDataType ipap = 0, epap = 0; bool addPS = false; for (int i=0; ichannelHasData(code)) { val = m_day->lookupValue(code, time, m_square_plot); lasttext += " "+QString("%1: %2").arg(schema::channel[code].label()).arg(val,0,'f',2); //.arg(schema::channel[code].units()); if (code == CPAP_IPAP) { ipap = val; addPS = true; } if (code == CPAP_EPAP) { epap = val; } } } if (addPS) { val = ipap - epap; lasttext += " "+QString("%1: %2").arg(schema::channel[CPAP_PS].label()).arg(val,0,'f',2);//.arg(schema::channel[CPAP_PS].units()); } lasttime = time; return lasttext; } // Time Domain Line Chart void gLineChart::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { QRect rect = region.boundingRect(); // TODO: Just use QRect directly. int left = rect.left(); int top = rect.top(); int width = rect.width(); int height = rect.height(); if (!m_visible) { return; } if (!m_day) { return; } //if (!m_day->channelExists(m_code)) return; if (width < 0) { return; } top++; double minx, maxx; if (w.blockZoom()) { minx = w.rmin_x, maxx = w.rmax_x; } else { maxx = w.max_x, minx = w.min_x; } // hmmm.. subtract_offset.. EventDataType miny = m_physminy; EventDataType maxy = m_physmaxy; w.roundY(miny, maxy); //#define DEBUG_AUTOSCALER #ifdef DEBUG_AUTOSCALER QString a = QString().sprintf("%.2f - %.2f",miny, maxy); w.renderText(a,width/2,top-5); #endif // the middle of minx and maxy does not have to be the center... double logX = painter.device()->logicalDpiX(); double physX = painter.device()->physicalDpiX(); double ratioX = physX / logX * w.printScaleX(); double logY = painter.device()->logicalDpiY(); double physY = painter.device()->physicalDpiY(); double ratioY = physY / logY * w.printScaleY(); double xx = maxx - minx; double xmult = double(width) / xx; EventDataType yy = maxy - miny; EventDataType ymult = EventDataType(height - 3) / yy; // time to pixel conversion multiplier // Return on screwy min/max conditions if (xx < 0) { return; } if (yy <= 0) { if (miny == 0) { return; } } bool mouseover = false; if (rect.contains(w.graphView()->currentMousePos())) { mouseover = true; painter.fillRect(rect, QBrush(QColor(255,255,245,128))); } bool linecursormode = p_profile->appearance->lineCursorMode(); //////////////////////////////////////////////////////////////////////// // Display Line Cursor //////////////////////////////////////////////////////////////////////// if (linecursormode) { double time = w.currentTime(); if ((time > minx) && (time < maxx)) { double xpos = (time - double(minx)) * xmult; painter.setPen(QPen(QBrush(QColor(0,255,0,255)),1)); painter.drawLine(left+xpos, top-w.marginTop()-3, left+xpos, top+height+w.bottom-1); } if ((time != lasttime) || lasttext.isEmpty()) { getMetaString(time); } if (m_codes[0] != CPAP_FlowRate) { QString text = lasttext; int wid, h; GetTextExtent(text, wid, h); w.renderText(text, left , top-h+7*w.printScaleY()); //+ width/2 - wid/2 } } EventDataType lastpx, lastpy; EventDataType px, py; int idx; bool done; double x0, xL; double sr; int sam; int minz, maxz; // Draw bounding box painter.setPen(QColor(Qt::black)); painter.drawLine(left, top, left, top + height); painter.drawLine(left, top + height, left + width, top + height); painter.drawLine(left + width, top + height, left + width, top); painter.drawLine(left + width, top, left, top); width--; height -= 2; int num_points = 0; int visible_points = 0; int total_points = 0; int total_visible = 0; bool square_plot, accel; qint64 clockdrift = qint64(p_profile->cpap->clockDrift()) * 1000L; qint64 drift = 0; QHash >::iterator ci; //m_line_color=schema::channel[m_code].defaultColor(); int legendx = left + width; int codepoints; painter.setClipRect(left, top, width, height+1); painter.setClipping(true); painter.setRenderHint(QPainter::Antialiasing, p_profile->appearance->antiAliasing()); painter.setFont(*defaultfont); bool showDottedLines = true; int dotlinesize = m_dotlines.size(); // Unset Dotted lines visible status, so we only draw necessary labels later for (int i=0; i < dotlinesize; i++) { DottedLine & dot = m_dotlines[i]; dot.visible = false; } Session * sess = nullptr; ChannelID code; for (int gi = 0; gi < m_codes.size(); gi++) { code = m_codes[gi]; schema::Channel &chan = schema::channel[code]; //////////////////////////////////////////////////////////////////////// // Draw the Channel Threshold dotted lines, and flow waveform centreline //////////////////////////////////////////////////////////////////////// if (showDottedLines) { for (int i=0; i < dotlinesize; i++) { DottedLine & dot = m_dotlines[i]; if ((dot.code != code) || (!m_dot_enabled[dot.code][dot.type]) || (!dot.available) || (!m_enabled[dot.code])) { continue; } schema::Channel & chan = schema::channel[code]; dot.visible = true; QColor color = chan.calc[dot.type].color; color.setAlpha(200); painter.setPen(QPen(QBrush(color), p_profile->appearance->lineThickness(), Qt::DotLine)); EventDataType y=top + height + 1 - ((dot.value - miny) * ymult); painter.drawLine(left + 1, y, left + 1 + width, y); } } if (!m_enabled[code]) continue; lines.clear(); codepoints = 0; // For each session... int daysize = m_day->size(); for (int svi = 0; svi < daysize; svi++) { sess = (*m_day)[svi]; if (!sess) { qWarning() << "gLineChart::Plot() nullptr Session Record.. This should not happen"; continue; } drift = (sess->type() == MT_CPAP) ? clockdrift : 0; if (!sess->enabled()) { continue; } schema::Channel ch = schema::channel[code]; bool fndbetter = false; QList::iterator mlend=ch.m_links.end(); for (QList::iterator l = ch.m_links.begin(); l != mlend; l++) { schema::Channel &c = *(*l); ci = (*m_day)[svi]->eventlist.find(c.id()); if (ci != (*m_day)[svi]->eventlist.end()) { fndbetter = true; break; } } if (!fndbetter) { ci = (*m_day)[svi]->eventlist.find(code); if (ci == (*m_day)[svi]->eventlist.end()) { continue; } } QVector &evec = ci.value(); num_points = 0; QVector::iterator evec_end = evec.end(); QVector::iterator ni; for (ni = evec.begin(); ni != evec_end; ++ni) { num_points += (*ni)->count(); } total_points += num_points; codepoints += num_points; // Max number of samples taken from samples per pixel for better min/max values const int num_averages = 20; int n=0; for (ni = evec.begin(); ni != evec_end; ++ni, ++n) { EventList & el = *(EventList*) (*ni); accel = (el.type() == EVL_Waveform); // Turn on acceleration if this is a waveform. if (accel) { sr = el.rate(); // Time distance between samples if (sr <= 0) { qWarning() << "qLineChart::Plot() assert(sr>0)"; continue; } } if (m_disable_accel) { accel = false; } square_plot = m_square_plot; if (accel || num_points > 20000) { // Don't square plot if too many points or waveform square_plot = false; } int siz = el.count(); if (siz <= 1) { continue; } // Don't bother drawing 1 point or less. x0 = el.time(0) + drift; xL = el.time(siz - 1) + drift; if (maxx < x0) { continue; } if (xL < minx) { continue; } if (x0 > xL) { if (siz == 2) { // this happens on CPAP quint32 t = el.getTime()[0]; el.getTime()[0] = el.getTime()[1]; el.getTime()[1] = t; EventStoreType d = el.getData()[0]; el.getData()[0] = el.getData()[1]; el.getData()[1] = d; } else { qDebug() << "Reversed order sample fed to gLineChart - ignored."; continue; //assert(x1 0) { sam = 1; } if (ZW < num_averages) { sam = 1; accel = false; } else { sam = ZW / num_averages; if (sam < 1) { sam = 1; accel = false; } } // Prepare the min max y values if we still are accelerating this plot if (accel) { for (int i = 0; i < width; i++) { m_drawlist[i].setX(height); m_drawlist[i].setY(0); } minz = width; maxz = 0; } total_visible += visible_points; } else { sam = 1; } // these calculations over estimate // The Z? values are much more accurate idx = 0; if (el.type() == EVL_Waveform) { // We can skip data previous to minx if this is a waveform if (minx > x0) { double j = minx - x0; // == starting min of first sample in this segment idx = (j / sr); //idx/=(sam*num_averages); //idx*=(sam*num_averages); // Loose the precision idx += sam - (idx % sam); } // else just start from the beginning } int xst = left + 1; int yst = top + height + 1; double time; EventDataType data; EventDataType gain = el.gain(); done = false; if (el.type() == EVL_Waveform) { // Waveform Plot if (idx > sam) { idx -= sam; } time = el.time(idx) + drift; double rate = double(sr) * double(sam); EventStoreType *ptr = el.rawData() + idx; if ((unsigned) siz > el.count()) siz = el.count(); if (accel) { ////////////////////////////////////////////////////////////////// // Accelerated Waveform Plot ////////////////////////////////////////////////////////////////// for (int i = idx; i <= siz; i += sam, ptr += sam) { time += rate; // This is much faster than QVector access. data = *ptr + el.offset(); data *= gain; // Scale the time scale X to pixel scale X px = ((time - minx) * xmult); // Same for Y scale, with gain factored in nmult py = ((data - miny) * ymult); // In accel mode, each pixel has a min/max Y value. // m_drawlist's index is the pixel index for the X pixel axis. int z = round(px); // Hmmm... round may screw this up. if (z < minz) { minz = z; // minz=First pixel } if (z > maxz) { maxz = z; // maxz=Last pixel } if (minz < 0) { qDebug() << "gLineChart::Plot() minz<0 should never happen!! minz =" << minz; minz = 0; } if (maxz > max_drawlist_size) { qDebug() << "gLineChart::Plot() maxz>max_drawlist_size!!!! maxz = " << maxz << " max_drawlist_size =" << max_drawlist_size; maxz = max_drawlist_size; } // Update the Y pixel bounds. if (py < m_drawlist[z].x()) { m_drawlist[z].setX(py); } if (py > m_drawlist[z].y()) { m_drawlist[z].setY(py); } if (time > maxx) { done = true; break; } } // Plot compressed accelerated vertex list if (maxz > width) { maxz = width; } float ax1, ay1; QPoint *drl = m_drawlist + minz; // Don't need to cap VertexBuffer here, as it's limited to max_drawlist_size anyway // Cap within VertexBuffer capacity, one vertex per line point // int np = (maxz - minz) * 2; for (int i = minz; i < maxz; i++, drl++) { ax1 = drl->x(); ay1 = drl->y(); lines.append(QLine(xst + i, yst - ax1, xst + i, yst - ay1)); } } else { // Zoomed in Waveform ////////////////////////////////////////////////////////////////// // Normal Waveform Plot ////////////////////////////////////////////////////////////////// // Prime first point data = (*ptr + el.offset()) * gain; lastpx = xst + ((time - minx) * xmult); lastpy = yst - ((data - miny) * ymult); siz--; for (int i = idx; i < siz; i += sam) { ptr += sam; time += rate; data = (*ptr + el.offset()) * gain; px = xst + ((time - minx) * xmult); // Scale the time scale X to pixel scale X py = yst - ((data - miny) * ymult); // Same for Y scale, with precomputed gain //py=yst-((data - ymin) * nmult); // Same for Y scale, with precomputed gain lines.append(QLine(lastpx, lastpy, px, py)); lastpx = px; lastpy = py; if (time >= maxx) { done = true; break; } } } painter.setPen(QPen(chan.defaultColor(), p_profile->appearance->lineThickness())); painter.drawLines(lines); w.graphView()->lines_drawn_this_frame += lines.count(); lines.clear(); } else { ////////////////////////////////////////////////////////////////// // Standard events/zoomed in Plot ////////////////////////////////////////////////////////////////// double start = el.first() + drift; quint32 *tptr = el.rawTime(); int idx = 0; if (siz > 15) { // Prime a bit... for (; idx < siz; ++idx) { time = start + *tptr++; if (time >= minx) { break; } } if (idx > 0) { idx--; } } // Step one backwards if possible (to draw through the left margin) EventStoreType *dptr = el.rawData() + idx; tptr = el.rawTime() + idx; time = start + *tptr++; data = (*dptr++ + el.offset()) * gain; idx++; lastpx = xst + ((time - minx) * xmult); // Scale the time scale X to pixel scale X lastpy = yst - ((data - miny) * ymult); // Same for Y scale without precomputed gain siz -= idx; int gs = siz << 1; if (square_plot) { gs <<= 1; } // Unrolling square plot outside of loop to gain a minor speed improvement. EventStoreType *eptr = dptr + siz; if (square_plot) { for (; dptr < eptr; dptr++) { time = start + *tptr++; data = gain * (*dptr + el.offset()); px = xst + ((time - minx) * xmult); // Scale the time scale X to pixel scale X py = yst - ((data - miny) * ymult); // Same for Y scale without precomputed gain // Horizontal lines are easy to cap if (py == lastpy) { // Cap px to left margin if (lastpx < xst) { lastpx = xst; } // Cap px to right margin if (px > xst + width) { px = xst + width; } // lines.append(QLine(lastpx, lastpy, px, lastpy)); // lines.append(QLine(px, lastpy, px, py)); } // else { // Letting the scissor do the dirty work for non horizontal lines // This really should be changed, as it might be cause that weird // display glitch on Linux.. lines.append(QLine(lastpx, lastpy, px, lastpy)); lines.append(QLine(px, lastpy, px, py)); // } lastpx = px; lastpy = py; if (time > maxx) { done = true; // Let this iteration finish.. (This point will be in far clipping) break; } } } else { for (; dptr < eptr; dptr++) { //for (int i=0;i xst + width) { px = xst + width; } // lines.append(QLine(lastpx, lastpy, px, py)); } //else { // Letting the scissor do the dirty work for non horizontal lines // This really should be changed, as it might be cause that weird // display glitch on Linux.. lines.append(QLine(lastpx, lastpy, px, py)); //} lastpx = px; lastpy = py; if (time > maxx) { // Past right edge, abort further drawing.. done = true; break; } } } painter.setPen(QPen(chan.defaultColor(),p_profile->appearance->lineThickness())); painter.drawLines(lines); w.graphView()->lines_drawn_this_frame+=lines.count(); lines.clear(); } if (done) { break; } } } // painter.setPen(QPen(m_colors[gi],p_profile->appearance->lineThickness())); // painter.drawLines(lines); // w.graphView()->lines_drawn_this_frame+=lines.count(); // lines.clear(); //////////////////////////////////////////////////////////////////// // Draw Legends on the top line //////////////////////////////////////////////////////////////////// if ((codepoints > 0)) { QString text = schema::channel[code].label(); QRectF rec(0, rect.top()-3, 0,0); rec = painter.boundingRect(rec, Qt::AlignBottom | Qt::AlignLeft, text); rec.moveRight(legendx); legendx -= rec.width(); painter.setClipping(false); painter.setPen(Qt::black); painter.drawText(rec, Qt::AlignBottom | Qt::AlignRight, text); float ps = 1 * ratioY; ps = qMax(ps, 1.0f); painter.setPen(QPen(chan.defaultColor(), ps)); int linewidth = (10 * ratioX); int yp = rec.top()+(rec.height()/2); painter.drawLine(rec.left()-linewidth, yp , rec.left()-(2 * ratioX), yp); painter.setClipping(true); legendx -= linewidth + (2*ratioX); } } painter.setClipping(false); //////////////////////////////////////////////////////////////////// // Draw Channel Threshold legend markers //////////////////////////////////////////////////////////////////// for (int i=0; i < dotlinesize; i++) { DottedLine & dot = m_dotlines[i]; if (!dot.visible) continue; code = dot.code; schema::Channel &chan = schema::channel[code]; int linewidth = (10 * ratioX); QRectF rec(0, rect.top()-3, 0,0); QString text = chan.calc[dot.type].label(); rec = painter.boundingRect(rec, Qt::AlignBottom | Qt::AlignLeft, text); rec.moveRight(legendx); legendx -= rec.width(); painter.setPen(Qt::black); painter.drawText(rec, Qt::AlignBottom | Qt::AlignRight, text); QColor color = chan.calc[dot.type].color; color.setAlpha(200); float ps = 1 * ratioY; ps = qMax(ps, 1.0f); painter.setPen(QPen(QBrush(color), ps,Qt::DotLine)); int yp = rec.top()+(rec.height()/2); painter.drawLine(rec.left()-linewidth, yp , rec.left()-(2 * ratioX), yp); legendx -= linewidth + (2*ratioX); } painter.setClipping(true); if (!total_points) { // No Data? QString msg = QObject::tr("Plots Disabled"); int x, y; GetTextExtent(msg, x, y, bigfont); w.renderText(msg, rect, Qt::AlignCenter, 0, Qt::gray, bigfont); } painter.setClipping(false); // Calculate combined session times within selected area... double first, last; double time = 0; // Calculate the CPAP session time. for (QList::iterator s = m_day->begin(); s != m_day->end(); s++) { sess = *s; if (!sess->enabled() || (sess->type() != MT_CPAP)) continue; first = sess->first(); last = sess->last(); if (last < w.min_x) { continue; } if (first > w.max_x) { continue; } if (first < w.min_x) { first = w.min_x; } if (last > w.max_x) { last = w.max_x; } time += last - first; } time /= 1000; QList ahilist; ahilist.push_back(CPAP_Hypopnea); ahilist.push_back(CPAP_Obstructive); ahilist.push_back(CPAP_Apnea); ahilist.push_back(CPAP_ClearAirway); QList extras; extras.push_back(CPAP_NRI); extras.push_back(CPAP_UserFlag1); extras.push_back(CPAP_UserFlag2); double sum = 0; int cnt = 0; // Draw the linechart overlays if (m_day && (p_profile->appearance->lineCursorMode() || (m_codes[0]==CPAP_FlowRate))) { QHash::iterator fit; bool blockhover = false; for (fit = flags.begin(); fit != flags.end(); ++fit) { code = fit.key(); if ((!m_flags_enabled[code]) || (!m_day->channelExists(code))) continue; gLineOverlayBar * lob = fit.value(); lob->setBlockHover(blockhover); lob->paint(painter, w, region); if (lob->hover()) blockhover = true; // did it render a hover over? if (ahilist.contains(code)) { sum += lob->sum(); cnt += lob->count(); } } } // if (m_codes[0] == OXI_SPO2Drop) { // } if (m_codes[0] == CPAP_FlowRate) { float hours = time / 3600.0; int h = time / 3600; int m = int(time / 60) % 60; int s = int(time) % 60; double f = double(cnt) / hours; // / (sum / 3600.0); QString txt = QObject::tr("Duration %1:%2:%3").arg(h,2,10,QChar('0')).arg(m,2,10,QChar('0')).arg(s,2,10,QChar('0')) + " "+ QObject::tr("AHI %1").arg(f,0,'f',2);// +" " + // QObject::tr("Events %1").arg(cnt) + " " + // QObject::tr("Hours %1").arg(hours,0,'f',2); if (linecursormode) txt+=lasttext; w.renderText(txt,left,top-6); } painter.setRenderHint(QPainter::Antialiasing, false); } sleepyhead-0.9.8/sleepyhead/Graphs/gSessionTimesChart.h0000644000175000017500000002754012412506713022524 0ustar sergiosergio/* gSessionTimesChart Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GSESSIONTIMESCHART_H #define GSESSIONTIMESCHART_H #include "SleepLib/day.h" #include "SleepLib/profiles.h" #include "gGraphView.h" struct TimeSpan { public: TimeSpan():begin(0), end(0) {} TimeSpan(float b, float e) : begin(b), end(e) {} TimeSpan(const TimeSpan & copy) { begin = copy.begin; end = copy.end; } ~TimeSpan() {} float begin; float end; }; struct SummaryCalcItem { SummaryCalcItem() { code = 0; type = ST_CNT; color = Qt::black; wavg_sum = 0; avg_sum = 0; cnt = 0; divisor = 0; min = 0; max = 0; } SummaryCalcItem(const SummaryCalcItem & copy) { code = copy.code; type = copy.type; color = copy.color; wavg_sum = 0; avg_sum = 0; cnt = 0; divisor = 0; min = 0; max = 0; midcalc = p_profile->general->prefCalcMiddle(); } SummaryCalcItem(ChannelID code, SummaryType type, QColor color) :code(code), type(type), color(color) { } float mid() { float val = 0; switch (midcalc) { case 0: if (median_data.size() > 0) val = median(median_data.begin(), median_data.end()); break; case 1: if (divisor > 0) val = wavg_sum / divisor; break; case 2: if (cnt > 0) val = avg_sum / cnt; } return val; } inline void update(float value, float weight) { if (midcalc == 0) { median_data.append(value); } avg_sum += value; cnt++; wavg_sum += value * weight; divisor += weight; min = qMin(min, value); max = qMax(max, value); } void reset(int reserve) { midcalc = p_profile->general->prefCalcMiddle(); wavg_sum = 0; avg_sum = 0; divisor = 0; cnt = 0; min = 99999; max = -99999; median_data.clear(); if (midcalc == 0) { median_data.reserve(reserve); } } ChannelID code; SummaryType type; QColor color; double wavg_sum; double divisor; double avg_sum; int cnt; EventDataType min; EventDataType max; static short midcalc; QList median_data; }; struct SummaryChartSlice { SummaryChartSlice() { calc = nullptr; height = 0; value = 0; name = ST_CNT; color = Qt::black; } SummaryChartSlice(const SummaryChartSlice & copy) { calc = copy.calc; value = copy.value; height = copy.height; name = copy.name; color = copy.color; // brush = copy.brush; } SummaryChartSlice(SummaryCalcItem * calc, EventDataType value, EventDataType height, QString name, QColor color) :calc(calc), value(value), height(height), name(name), color(color) { // QLinearGradient gradient(0, 0, 1, 0); // gradient.setCoordinateMode(QGradient::ObjectBoundingMode); // gradient.setColorAt(0,color); // gradient.setColorAt(1,brighten(color)); // brush = QBrush(gradient); } SummaryCalcItem * calc; EventDataType value; EventDataType height; QString name; QColor color; // QBrush brush; }; class gSummaryChart : public Layer { public: gSummaryChart(QString label, MachineType machtype); gSummaryChart(ChannelID code, MachineType machtype); virtual ~gSummaryChart(); //! \brief Renders the graph to the QPainter object virtual void paint(QPainter &, gGraph &, const QRegion &); //! \brief Called whenever data model changes underneath. Day object is not needed here, it's just here for Layer compatability. virtual void SetDay(Day *day = nullptr); //! \brief Returns true if no data was found for this day during SetDay virtual bool isEmpty() { return m_empty; } virtual void populate(Day *, int idx); //! \brief Override to setup custom stuff before main loop virtual void preCalc(); //! \brief Override to call stuff in main loop virtual void customCalc(Day *, QVector &); //! \brief Override to call stuff after draw is complete virtual void afterDraw(QPainter &, gGraph &, QRect); //! \brief Return any extra data to show beneath the date in the hover over tooltip virtual QString tooltipData(Day *, int); virtual void dataChanged() { cache.clear(); } void addCalc(ChannelID code, SummaryType type, QColor color) { calcitems.append(SummaryCalcItem(code, type, color)); } void addCalc(ChannelID code, SummaryType type) { calcitems.append(SummaryCalcItem(code, type, schema::channel[code].defaultColor())); } virtual Layer * Clone() { gSummaryChart * sc = new gSummaryChart(m_label, m_machtype); Layer::CloneInto(sc); CloneInto(sc); // copy this here, because only base summary charts need it sc->calcitems = calcitems; return sc; } void CloneInto(gSummaryChart * layer) { layer->m_empty = m_empty; layer->firstday = firstday; layer->lastday = lastday; layer->expected_slices = expected_slices; layer->nousedays = nousedays; layer->totaldays = totaldays; layer->peak_value = peak_value; layer->idx_start = idx_start; layer->idx_end = idx_end; layer->cache.clear(); layer->dayindex = dayindex; layer->daylist = daylist; } protected: //! \brief Key was pressed that effects this layer virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph); //! \brief Mouse moved over this layers area (shows the hover-over tooltips here) virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); //! \brief Mouse Button was pressed over this area virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph); //! \brief Mouse Button was released over this area. (jumps to daily view here) virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph); QString m_label; MachineType m_machtype; bool m_empty; int hl_day; int tz_offset; float tz_hours; QDate firstday; QDate lastday; QMap dayindex; QList daylist; QHash > cache; QVector calcitems; int expected_slices; int nousedays; int totaldays; EventDataType peak_value; EventDataType min_value; int idx_start; int idx_end; short midcalc; }; /*! \class gSessionTimesChart \brief Displays a summary of session times */ class gSessionTimesChart : public gSummaryChart { public: gSessionTimesChart() :gSummaryChart("SessionTimes", MT_CPAP) { addCalc(NoChannel, ST_SESSIONS, QColor(64,128,255)); addCalc(NoChannel, ST_SESSIONS, QColor(64,128,255)); addCalc(NoChannel, ST_SESSIONS, QColor(64,128,255)); } virtual ~gSessionTimesChart() {} virtual void SetDay(Day * day = nullptr) { gSummaryChart::SetDay(day); split = p_profile->session->daySplitTime(); m_miny = 0; m_maxy = 28; } virtual void preCalc(); virtual void customCalc(Day *, QVector & slices); virtual void afterDraw(QPainter &, gGraph &, QRect); //! \brief Renders the graph to the QPainter object virtual void paint(QPainter &painter, gGraph &graph, const QRegion ®ion); virtual Layer * Clone() { gSessionTimesChart * sc = new gSessionTimesChart(); gSummaryChart::CloneInto(sc); CloneInto(sc); return sc; } void CloneInto(gSessionTimesChart * layer) { layer->split = split; } QTime split; int num_slices; int num_days; int total_slices; double total_length; QList session_data; }; class gUsageChart : public gSummaryChart { public: gUsageChart() :gSummaryChart("Usage", MT_CPAP) { addCalc(NoChannel, ST_HOURS, QColor(64,128,255)); } virtual ~gUsageChart() {} virtual void preCalc(); virtual void customCalc(Day *, QVector &); virtual void afterDraw(QPainter &, gGraph &, QRect); virtual void populate(Day *day, int idx); virtual QString tooltipData(Day * day, int); virtual Layer * Clone() { gUsageChart * sc = new gUsageChart(); gSummaryChart::CloneInto(sc); CloneInto(sc); return sc; } void CloneInto(gUsageChart * layer) { layer->incompdays = incompdays; layer->compliance_threshold = compliance_threshold; } private: int incompdays; EventDataType compliance_threshold; }; class gTTIAChart : public gSummaryChart { public: gTTIAChart() :gSummaryChart("TTIA", MT_CPAP) { addCalc(NoChannel, ST_CNT, QColor(255,147,150)); } virtual ~gTTIAChart() {} virtual void preCalc(); virtual void customCalc(Day *, QVector &); virtual void afterDraw(QPainter &, gGraph &, QRect); virtual void populate(Day *day, int idx); virtual QString tooltipData(Day * day, int); virtual Layer * Clone() { gTTIAChart * sc = new gTTIAChart(); gSummaryChart::CloneInto(sc); CloneInto(sc); return sc; } void CloneInto(gTTIAChart * /* layer*/) { } private: }; class gAHIChart : public gSummaryChart { public: gAHIChart() :gSummaryChart("AHIChart", MT_CPAP) { addCalc(CPAP_ClearAirway, ST_CPH); addCalc(CPAP_Obstructive, ST_CPH); addCalc(CPAP_Apnea, ST_CPH); addCalc(CPAP_Hypopnea, ST_CPH); if (p_profile->general->calculateRDI()) addCalc(CPAP_RERA, ST_CPH); } virtual ~gAHIChart() {} virtual void preCalc(); virtual void customCalc(Day *, QVector &); virtual void afterDraw(QPainter &, gGraph &, QRect); virtual void populate(Day *, int idx); virtual QString tooltipData(Day * day, int); virtual Layer * Clone() { gAHIChart * sc = new gAHIChart(); gSummaryChart::CloneInto(sc); CloneInto(sc); return sc; } void CloneInto(gAHIChart * /* layer */) { // layer->ahicalc = ahicalc; // layer->ahi_wavg = ahi_wavg; // layer->ahi_avg = ahi_avg; // layer->total_hours = total_hours; // layer->max_ahi = max_ahi; // layer->min_ahi = min_ahi; // layer->calc_cnt = calc_cnt; // layer->ahi_data = ahi_data; } // SummaryCalcItem ahicalc; double ahi_wavg; double ahi_avg; double total_hours; float max_ahi; float min_ahi; int calc_cnt; QList ahi_data; }; class gPressureChart : public gSummaryChart { public: gPressureChart(); virtual ~gPressureChart() {} virtual Layer * Clone() { gPressureChart * sc = new gPressureChart(); gSummaryChart::CloneInto(sc); return sc; } // virtual void preCalc(); virtual void customCalc(Day *day, QVector &slices) { int size = slices.size(); float hour = day->hours(m_machtype); for (int i=0; i < size; ++i) { SummaryChartSlice & slice = slices[i]; SummaryCalcItem * calc = slices[i].calc; calc->update(slice.value, hour); } } virtual void afterDraw(QPainter &, gGraph &, QRect); virtual void populate(Day * day, int idx); virtual QString tooltipData(Day * day, int idx) { return day->getCPAPMode() + "\n" + day->getPressureSettings() + gSummaryChart::tooltipData(day, idx); } }; #endif // GSESSIONTIMESCHART_H sleepyhead-0.9.8/sleepyhead/Graphs/gYAxis.h0000644000175000017500000001354712412506713020154 0ustar sergiosergio/* gYAxis Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GYAXIS_H #define GYAXIS_H #include #include "Graphs/layer.h" /*! \class gXGrid \brief Draws the horizintal major/minor grids over graphs */ class gXGrid: public Layer { public: //! \brief Constructs an gXGrid object with default settings, and col for line colour. gXGrid(QColor col = QColor("black")); virtual ~gXGrid(); //! \brief Draw the horizontal lines by adding the to the Vertex GLbuffers virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); //! \brief set the visibility status of Major lines void setShowMinorLines(bool b) { m_show_minor_lines = b; } //! \brief set the visibility status of Minor lines void setShowMajorLines(bool b) { m_show_major_lines = b; } //! \brief Returns the visibility status of minor lines bool showMinorLines() { return m_show_minor_lines; } //! \brief Returns the visibility status of Major lines bool showMajorLines() { return m_show_major_lines; } virtual Layer * Clone() { gXGrid * grid = new gXGrid(); Layer::CloneInto(grid); CloneInto(grid); return grid; } void CloneInto(gXGrid * layer) { layer->m_show_major_lines = m_show_major_lines; layer->m_show_minor_lines = m_show_minor_lines; layer->m_major_color = m_major_color; layer->m_minor_color = m_minor_color; } protected: bool m_show_major_lines; bool m_show_minor_lines; QColor m_major_color; QColor m_minor_color; }; /*! \class gYAxis \brief Draws the YAxis tick markers, and numeric labels */ class gYAxis: public Layer { public: //! \brief Left Margin space in pixels static const int Margin = 60; public: //! \brief Construct a gYAxis object, with QColor col for tickers & text gYAxis(QColor col = Qt::black); virtual ~gYAxis(); //! \brief Draw the horizontal tickers display virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); //! \brief Sets the visibility status of minor ticks void SetShowMinorTicks(bool b) { m_show_minor_ticks = b; } //! \brief Sets the visibility status of Major ticks void SetShowMajorTicks(bool b) { m_show_major_ticks = b; } //! \brief Returns the visibility status of Minor ticks bool ShowMinorTicks() { return m_show_minor_ticks; } //! \brief Returns the visibility status of Major ticks bool ShowMajorTicks() { return m_show_major_ticks; } //! \brief Formats the ticker value.. Override to implement other types virtual const QString Format(EventDataType v, int dp); virtual int minimumWidth(); //! \brief Set the scale of the Y axis values.. Values can be multiplied by this to convert formats void SetScale(float f) { m_yaxis_scale = f; } //! \brief Returns the scale of the Y axis values.. // Values can be multiplied by this to convert formats float Scale() { return m_yaxis_scale; } protected: bool m_show_minor_ticks; bool m_show_major_ticks; float m_yaxis_scale; QColor m_line_color; QColor m_text_color; virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); virtual bool mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph); QImage m_image; virtual Layer * Clone() { gYAxis * yaxis = new gYAxis(); Layer::CloneInto(yaxis); CloneInto(yaxis); return yaxis; } void CloneInto(gYAxis * layer) { layer->m_show_major_ticks = m_show_major_ticks; layer->m_show_minor_ticks = m_show_minor_ticks; layer->m_line_color = m_line_color; layer->m_text_color = m_text_color; layer->m_image = m_image; } }; /*! \class gYAxisTime \brief Draws the YAxis tick markers, and labels in time format */ class gYAxisTime: public gYAxis { public: //! \brief Construct a gYAxisTime object, with QColor col for tickers & times gYAxisTime(bool hr12 = true, QColor col = Qt::black) : gYAxis(col), show_12hr(hr12) {} virtual ~gYAxisTime() {} protected: //! \brief Overrides gYAxis Format to display Time format virtual const QString Format(EventDataType v, int dp); //! \brief Whether to format as 12 or 24 hour times bool show_12hr; virtual Layer * Clone() { gYAxisTime * yaxis = new gYAxisTime(); Layer::CloneInto(yaxis); CloneInto(yaxis); return yaxis; } void CloneInto(gYAxisTime * layer) { gYAxis::CloneInto(layer); layer->show_12hr = show_12hr; } }; /*! \class gYAxisWeight \brief Draws the YAxis tick markers, and labels in weight format */ class gYAxisWeight: public gYAxis { public: //! \brief Construct a gYAxisWeight object, with QColor col for tickers & weight values gYAxisWeight(UnitSystem us = US_Metric, QColor col = Qt::black) : gYAxis(col), m_unitsystem(us) {} virtual ~gYAxisWeight() {} //! \brief Returns the current UnitSystem displayed (eg, US_Metric (the rest of the world), US_Archiac (American) ) UnitSystem unitSystem() { return m_unitsystem; } //! \brief Set the unit system displayed by this YTicker void setUnitSystem(UnitSystem us) { m_unitsystem = us; } protected: //! \brief Overrides gYAxis Format to display Time format virtual const QString Format(EventDataType v, int dp); UnitSystem m_unitsystem; virtual Layer * Clone() { gYAxisWeight * yaxis = new gYAxisWeight(); Layer::CloneInto(yaxis); CloneInto(yaxis); return yaxis; } void CloneInto(gYAxisWeight * layer) { gYAxis::CloneInto(layer); layer->m_unitsystem = m_unitsystem; } }; #endif // GYAXIS_H sleepyhead-0.9.8/sleepyhead/Graphs/gXAxis.cpp0000644000175000017500000003165612412506713020507 0ustar sergiosergio/* gXAxis Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include "Graphs/gXAxis.h" #include "SleepLib/profiles.h" #include "Graphs/glcommon.h" #include "Graphs/gGraph.h" #include "Graphs/gGraphView.h" // These divisors are used to round xaxis timestamps to reasonable increments const quint64 divisors[] = { 15552000000ULL, 7776000000ULL, 5184000000ULL, 2419200000ULL, 1814400000ULL, 1209600000L, 604800000L, 259200000L, 172800000L, 86400000, 2880000, 14400000, 7200000, 3600000, 2700000, 1800000, 1200000, 900000, 600000, 300000, 120000, 60000, 45000, 30000, 20000, 15000, 10000, 5000, 2000, 1000, 500, 100, 50, 10, 1 }; const int divcnt = sizeof(divisors) / sizeof(quint64); gXAxis::gXAxis(QColor col, bool fadeout) : Layer(NoChannel) { m_line_color = col; m_text_color = col; m_major_color = Qt::darkGray; m_minor_color = Qt::lightGray; m_show_major_lines = false; m_show_minor_lines = false; m_show_minor_ticks = true; m_show_major_ticks = true; m_utcfix = false; m_fadeout = fadeout; tz_offset = timezoneOffset(); tz_hours = tz_offset / 3600000.0; m_roundDays = false; } gXAxis::~gXAxis() { } int gXAxis::minimumHeight() { QFontMetrics fm(*defaultfont); int h = fm.height(); #if defined(Q_OS_MAC) return 9+h; #else return 11+h; #endif } void gXAxis::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { int left = region.boundingRect().left(); int top = region.boundingRect().top(); int width = region.boundingRect().width(); int height = region.boundingRect().height(); QString months[] = { QObject::tr("Jan"), QObject::tr("Feb"), QObject::tr("Mar"), QObject::tr("Apr"), QObject::tr("May"), QObject::tr("Jun"), QObject::tr("Jul"), QObject::tr("Aug"), QObject::tr("Sep"), QObject::tr("Oct"), QObject::tr("Nov"), QObject::tr("Dec") }; //static QString dow[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; QVector ticks; QPainter painter2; // Only need this for pixmap caching // pixmap caching screws font size when printing bool usepixmap = w.graphView()->usePixmapCache(); // Whether or not to use pixmap caching if (!usepixmap || (usepixmap && w.invalidate_xAxisImage)) { // Redraw graph xaxis labels and ticks either to pixmap or directly to screen if (usepixmap) { // Initialize a new cache image m_image = QImage(width + 22, height + 4, QImage::Format_ARGB32_Premultiplied); m_image.fill(Qt::transparent); painter2.begin(&m_image); painter2.setPen(Qt::black); painter2.setFont(*defaultfont); } double px, py; int start_px = left; //int start_py=top; //int width=scrx-(w.GetLeftMargin()+w.GetRightMargin()); // float height=scry-(w.GetTopMargin()+w.GetBottomMargin()); if (width < 40) { return; } qint64 minx; qint64 maxx; if (w.blockZoom()) { // Lock zoom to entire data range minx = w.rmin_x; maxx = w.rmax_x; } else { // Allow zoom minx = w.min_x; maxx = w.max_x; } int days = ceil(double(maxx-minx) / 86400000.0); if (m_roundDays) { minx = floor(double(minx)/86400000.0); minx *= 86400000L; maxx = minx + 86400000L * qint64(days); } // duration of graph display window in milliseconds. qint64 xx = maxx - minx; // shouldn't really be negative, but this is safer than an assert if (xx <= 0) { return; } //Most of this could be precalculated when min/max is set.. QString fd, tmpstr; int divmax, dividx; int fitmode; // Have a quick look at the scale and prep the autoscaler a little faster if (xx >= 86400000L) { // Day fd = "Mjj 00"; dividx = 0; divmax = 10; fitmode = 0; } else if (xx > 1800000) { // Minutes fd = " j0:00"; dividx = 10; divmax = 21; fitmode = 1; } else if (xx > 5000) { // Seconds fd = " j0:00:00"; dividx = 16; divmax = 29; fitmode = 2; } else { // Microseconds fd = "j0:00:00:000"; dividx = 28; divmax = divcnt; fitmode = 3; } //if (divmax>divcnt) divmax=divcnt; int x, y; // grab the text extent of the dummy text fields above to know how much space is needed GetTextExtent(fd, x, y); // Not sure when this was a problem... Q_ASSERT(x > 0); // if (x <= 0) { // qWarning() << "gXAxis::Plot() x<=0 font size bug"; // return; // } // Max number of ticks that will fit, with a bit of room for a buffer int max_ticks = width / (x + 15); int fit_ticks = 0; int div = -1; qint64 closest = 0, tmp, tmpft; // Scan through divisor list with the index range given above, to find which // gives the closest number of ticks to the maximum that will physically fit for (int i = dividx; i < divmax; i++) { tmpft = xx / divisors[i]; tmp = max_ticks - tmpft; if (tmp < 0) { continue; } if (tmpft > closest) { // Find the closest scale to the number closest = tmpft; // that will fit div = i; fit_ticks = tmpft; } } if (fit_ticks == 0) { qDebug() << "gXAxis::Plot() Couldn't fit ticks.. Too short?" << minx << maxx << xx; return; } if ((div < 0) || (div > divcnt)) { qDebug() << "gXAxis::Plot() div out of bounds"; return; } qint64 step = divisors[div]; //Align left minimum to divisor by losing precision qint64 aligned_start = minx / step; aligned_start *= step; while (aligned_start < minx) { aligned_start += step; } painter.setPen(QColor(Qt::black)); //int utcoff=m_utcfix ? tz_hours : 0; //utcoff=0; int num_minor_ticks; if (step >= 86400000) { qint64 i = step / 86400000L; // number of days if (i > 14) { i /= 2; } if (i < 0) { i = 1; } num_minor_ticks = i; } else { num_minor_ticks = 10; } float xmult = double(width) / double(xx); float step_pixels = double(step / float(num_minor_ticks)) * xmult; py = left + float(aligned_start - minx) * xmult; //py+=usepixmap ? 20 : left; int mintop = top + 3.0 * (float(y) / 10.0); int majtop = top + 6.0 * (float(y) / 10.0); int texttop = majtop + y; // 18*w.printScaleY(); #if defined (Q_OS_MAC) texttop += 2; #endif // Fill in the minor tick marks up to the first major alignment tick for (int i = 0; i < num_minor_ticks; i++) { py -= step_pixels; if (py < start_px) { continue; } if (usepixmap) { ticks.append(QLine(py - left + 20, 0, py - left + 20, mintop - top)); } else { ticks.append(QLine(py, top+2, py, mintop+2)); } } int ms, m, h, s, d; qint64 j; for (qint64 i = aligned_start; i < maxx; i += step) { px = (i - minx) * xmult; px += left; if (usepixmap) { ticks.append(QLine(px - left + 20, 0, px - left + 20, majtop - top)); } else { ticks.append(QLine(px, top+2, px, majtop+2)); } j = i; if (!m_utcfix) { j += tz_offset; } ms = j % 1000; s = (j / 1000L) % 60L; m = (j / 60000L) % 60L; h = (j / 3600000L) % 24L; //int d=(j/86400000) % 7; if (fitmode == 0) { d = (j / 1000); QDateTime dt = QDateTime::fromTime_t(d).toUTC(); QDate date = dt.date(); // SLOW SLOW SLOW!!! On Mac especially, this function is pathetically slow. //dt.toString("MMM dd"); // Doing it this way instead because it's MUUUUUUCH faster tmpstr = QString("%1 %2").arg(months[date.month() - 1]).arg(date.day()); //} else if (fitmode==0) { // tmpstr=QString("%1 %2:%3").arg(dow[d]).arg(h,2,10,QChar('0')).arg(m,2,10,QChar('0')); } else if (fitmode == 1) { // minute tmpstr = QString("%1:%2").arg(h, 2, 10, QChar('0')).arg(m, 2, 10, QChar('0')); } else if (fitmode == 2) { // second tmpstr = QString("%1:%2:%3").arg(h, 2, 10, QChar('0')).arg(m, 2, 10, QChar('0')).arg(s, 2, 10, QChar('0')); } else if (fitmode == 3) { // milli tmpstr = QString("%1:%2:%3:%4").arg(h, 2, 10, QChar('0')).arg(m, 2, 10, QChar('0')).arg(s, 2, 10, QChar('0')).arg(ms, 3, 10, QChar('0')); } int tx = px - x / 2.0; if (m_utcfix) { tx += step_pixels / 2.0; } if ((tx + x) < (left + width)) { if (!usepixmap) { w.renderText(tmpstr, tx, texttop, 0, Qt::black, defaultfont); } else { painter2.drawText(tx - left + 20, texttop - top, tmpstr); } } py = px; for (int j = 1; j < num_minor_ticks; j++) { py += step_pixels; if (py >= left + width) { break; } if (usepixmap) { ticks.append(QLine(py - left + 20, 0, py - left + 20, mintop - top)); } else { ticks.append(QLine(py, top+2, py, mintop+2)); } } } if (usepixmap) { painter2.drawLines(ticks); painter2.end(); } else { painter.drawLines(ticks); } w.graphView()->lines_drawn_this_frame += ticks.size(); w.invalidate_xAxisImage = false; } if (usepixmap && !m_image.isNull()) { painter.drawImage(QPoint(left - 20, top + height - m_image.height() + 5), m_image); } } gXAxisDay::gXAxisDay(QColor col) :Layer(NoChannel) { m_line_color = col; m_text_color = col; m_major_color = Qt::darkGray; m_minor_color = Qt::lightGray; m_show_major_lines = false; m_show_minor_lines = false; m_show_minor_ticks = true; m_show_major_ticks = true; } gXAxisDay::~gXAxisDay() { } int gXAxisDay::minimumHeight() { QFontMetrics fm(*defaultfont); int h = fm.height(); #if defined(Q_OS_MAC) return 9+h; #else return 11+h; #endif } void gXAxisDay::paint(QPainter &painter, gGraph &graph, const QRegion ®ion) { float left = region.boundingRect().left(); float top = region.boundingRect().top(); float width = region.boundingRect().width(); float height = region.boundingRect().height(); QString months[] = { QObject::tr("Jan"), QObject::tr("Feb"), QObject::tr("Mar"), QObject::tr("Apr"), QObject::tr("May"), QObject::tr("Jun"), QObject::tr("Jul"), QObject::tr("Aug"), QObject::tr("Sep"), QObject::tr("Oct"), QObject::tr("Nov"), QObject::tr("Dec") }; qint64 minx; qint64 maxx; minx = graph.min_x; maxx = graph.max_x; QDateTime date2 = QDateTime::fromMSecsSinceEpoch(minx); QDateTime enddate2 = QDateTime::fromMSecsSinceEpoch(maxx); QDate date = date2.date(); // QDate enddate = enddate2.date(); int days = ceil(double(maxx - minx) / 86400000.0); float barw = width / float(days); qint64 xx = maxx - minx; // shouldn't really be negative, but this is safer than an assert if (xx <= 0) { return; } float lastx = left; float y1 = top; QString fd = "Mjj 00"; int x,y; GetTextExtent(fd, x, y); float xpos = (barw / 2.0) - (float(x) / 2.0); float lastxpos = 0; QVector lines; for (int i=0; i < days; i++) { if ((lastx + barw) > (left + width + 1)) break; QString tmpstr = QString("%1 %2").arg(months[date.month() - 1]).arg(date.day(), 2, 10, QChar('0')); float x1 = lastx + xpos; //lines.append(QLine(lastx, top, lastx, top+6)); if (x1 > (lastxpos + x + 8*graph.printScaleX())) { graph.renderText(tmpstr, x1, y1 + y + 8); lastxpos = x1; lines.append(QLine(lastx+barw/2, top, lastx+barw/2, top+6)); } lastx = lastx + barw; date = date.addDays(1); } painter.setPen(QPen(Qt::black,1)); painter.drawLines(lines); } sleepyhead-0.9.8/sleepyhead/Graphs/gFlagsLine.h0000644000175000017500000001115012412506713020747 0ustar sergiosergio/* gFlagsLine Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GFLAGSLINE_H #define GFLAGSLINE_H #include "gGraphView.h" #include "gspacer.h" class gFlagsGroup; /*! \class gYSpacer \brief A dummy vertical spacer object */ class gLabelArea: public gSpacer { public: gLabelArea(Layer * layer); virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion) { Q_UNUSED(w); Q_UNUSED(painter); Q_UNUSED(region); } virtual int minimumWidth(); protected: Layer *m_mainlayer; virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); virtual Layer * Clone() { gLabelArea * layer = new gLabelArea(nullptr); //ouchie.. Layer::CloneInto(layer); CloneInto(layer); return layer; } void CloneInto(gLabelArea * ) { } }; /*! \class gFlagsLine \brief One single line of event flags in the Event Flags chart */ class gFlagsLine: public Layer { friend class gFlagsGroup; public: /*! \brief Constructs an individual gFlagsLine object \param code The Channel the data is sourced from \param col The colour to draw this flag \param label The label to show to the left of the Flags line. \param always_visible Whether to always show this line, even if empty \param Type of Flag, either FT_Bar, or FT_Span */ gFlagsLine(ChannelID code); virtual ~gFlagsLine(); //! \brief Drawing code to add the flags and span markers to the Vertex buffers. virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); void setTotalLines(int i) { total_lines = i; } void setLineNum(int i) { line_num = i; } virtual Layer * Clone() { gFlagsLine * layer = new gFlagsLine(nullptr); //ouchie.. Layer::CloneInto(layer); CloneInto(layer); return layer; } void CloneInto(gFlagsLine * layer ) { layer->m_always_visible = m_always_visible; layer->total_lines = total_lines; layer->line_num = line_num; layer->m_lx = m_lx; layer->m_ly = m_ly; } protected: virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); bool m_always_visible; int total_lines, line_num; int m_lx, m_ly; }; /*! \class gFlagsGroup \brief Contains multiple gFlagsLine entries for the Events Flag graph */ class gFlagsGroup: public LayerGroup { friend class gFlagsLabelArea; public: gFlagsGroup(); virtual ~gFlagsGroup(); //! Draw filled rectangles behind Event Flag's, and an outlines around them all, Calls the individual paint for each gFlagLine virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); //! Returns the first time represented by all gFlagLine layers, in milliseconds since epoch virtual qint64 Minx(); //! Returns the last time represented by all gFlagLine layers, in milliseconds since epoch. virtual qint64 Maxx(); //! Checks if each flag has data, and adds valid gFlagLines to the visible layers list virtual void SetDay(Day *); //! Returns true if none of the gFlagLine objects contain any data for this day virtual bool isEmpty(); //! Returns the count of visible flag line entries int count() { return lvisible.size(); } //! Returns the height in pixels of each bar int barHeight() { return m_barh; } //! Returns a list of Visible gFlagsLine layers to draw QVector &visibleLayers() { return lvisible; } void alwaysVisible(ChannelID code) { m_alwaysvisible.push_back(code); } virtual Layer * Clone() { gFlagsGroup * layer = new gFlagsGroup(); //ouchie.. Layer::CloneInto(layer); CloneInto(layer); return layer; } void CloneInto(gFlagsGroup * layer) { layer->m_alwaysvisible = m_alwaysvisible; layer->availableChans = availableChans; for (int i=0; ilvisible.append(dynamic_cast(lvisible.at(i)->Clone())); } layer->m_barh = m_barh; layer->m_empty = m_empty; layer->m_rebuild_cpap = m_rebuild_cpap; } protected: virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); QList m_alwaysvisible; QList availableChans; QVector lvisible; float m_barh; bool m_empty; bool m_rebuild_cpap; }; #endif // GFLAGSLINE_H sleepyhead-0.9.8/sleepyhead/Graphs/gLineChart.h0000644000175000017500000001371612412506713020766 0ustar sergiosergio/* gLineChart Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GLINECHART_H #define GLINECHART_H #include #include #include "Graphs/layer.h" #include "SleepLib/event.h" #include "SleepLib/day.h" #include "Graphs/gLineOverlay.h" enum DottedLineCalc { DLC_Zero, DLC_Min, DLC_Mid, DLC_Perc, DLC_Max, DLC_UpperThresh, DLC_LowerThresh }; QColor darken(QColor color, float p = 0.5); struct DottedLine { public: DottedLine() { code = NoChannel; type = Calc_Zero; value = 0; visible = false; available = false; } DottedLine(const DottedLine & copy) { code = copy.code; type = copy.type; value = copy.value; available = copy.available; visible = copy.visible; } DottedLine(ChannelID code, ChannelCalcType type, bool available = false): code(code), type(type), available(available) {} EventDataType calc(Day * day) { Q_ASSERT(day != nullptr); available = day->channelExists(code); value = day->calc(code, type); return value; } ChannelID code; ChannelCalcType type; EventDataType value; bool visible; bool available; }; QDataStream & operator<<(QDataStream &, const DottedLine &); QDataStream & operator>>(QDataStream &, DottedLine &); /*! \class gLineChart \brief Draws a 2D linechart from all Session data in a day. EVL_Waveforms typed EventLists are accelerated. */ class gLineChart: public Layer { friend class gGraphView; public: /*! \brief Creates a new 2D gLineChart Layer \param code The Channel that gets drawn by this layer \param square_plot Whether or not to use square plots (only effective for EVL_Event typed EventList data) \param disable_accel Whether or not to disable acceleration for EVL_Waveform typed EventList data */ gLineChart(ChannelID code, bool square_plot = false, bool disable_accel = false); virtual ~gLineChart(); //! \brief The drawing code that fills the vertex buffers virtual void paint(QPainter &painter, gGraph &w, const QRegion ®ion); //! \brief Set Use Square plots for non EVL_Waveform data void SetSquarePlot(bool b) { m_square_plot = b; } //! \brief Returns true if using Square plots for non EVL_Waveform data bool GetSquarePlot() { return m_square_plot; } //! \brief Set this if you want this layer to draw it's empty data message //! They don't show anymore due to the changes in gGraphView. Should modify isEmpty if this still gets to live void ReportEmpty(bool b) { m_report_empty = b; } //! \brief Returns whether or not to show the empty text message bool GetReportEmpty() { return m_report_empty; } //! \brief Sets the ability to Disable waveform plot acceleration (which hides unseen data) void setDisableAccel(bool b) { m_disable_accel = b; } //! \brief Returns true if waveform plot acceleration is disabled bool disableAccel() { return m_disable_accel; } //! \brief Sets the Day object containing the Sessions this linechart draws from virtual void SetDay(Day *d); //! \brief Returns Minimum Y-axis value for this layer virtual EventDataType Miny(); //! \brief Returns Maximum Y-axis value for this layer virtual EventDataType Maxy(); //! \brief Returns true if all subplots contain no data virtual bool isEmpty(); //! \brief Add Subplot 'code'. Note the first one is added in the constructor. void addPlot(ChannelID code, bool square=false) { m_codes.push_back(code); m_enabled[code] = true; m_square.push_back(square); } //! \brief Returns true of the subplot 'code' is enabled. bool plotEnabled(ChannelID code) { if ((m_enabled.contains(code)) && m_enabled[code]) { return true; } else { return false; } } //! \brief Enable or Disable the subplot identified by code. void setPlotEnabled(ChannelID code, bool b) { m_enabled[code] = b; } QString getMetaString(qint64 time); void addDotLine(DottedLine dot) { m_dotlines.append(dot); } QVector m_dotlines; QHash m_flags_enabled; QHash > m_dot_enabled; virtual Layer * Clone() { gLineChart * lc = new gLineChart(m_code); Layer::CloneInto(lc); CloneInto(lc); return lc; } void CloneInto(gLineChart * layer) { layer->m_dotlines = m_dotlines; layer->m_flags_enabled = m_flags_enabled; layer->m_dot_enabled = m_dot_enabled; layer->m_report_empty = m_report_empty; layer->m_square_plot = m_square_plot; layer->m_disable_accel = m_disable_accel; layer->subtract_offset = layer->subtract_offset; layer->m_codes = layer->m_codes; layer->m_threshold = m_threshold; layer->m_square = m_square; layer->m_enabled = m_enabled; layer->lines = lines; layer->lasttext = lasttext; layer->lasttime = lasttime; } protected: //! \brief Mouse moved over this layers area (shows the hover-over tooltips here) virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph); bool m_report_empty; bool m_square_plot; bool m_disable_accel; //! \brief Used by accelerated waveform plots. Must be >= Screen Resolution (or at least graph width) static const int max_drawlist_size = 10000; //! \brief The list of screen points used for accelerated waveform plots.. QPoint m_drawlist[max_drawlist_size]; int subtract_offset; QVector m_codes; QStringList m_threshold; QVector m_square; QHash m_enabled; // plot enabled QHash flags; QVector lines; QString lasttext; qint64 lasttime; }; #endif // GLINECHART_H sleepyhead-0.9.8/sleepyhead/Graphs/gFooBar.cpp0000644000175000017500000000704112412506713020612 0ustar sergiosergio/* gFooBar Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "Graphs/gFooBar.h" #include #include "Graphs/gGraph.h" #include "Graphs/gYAxis.h" gShadowArea::gShadowArea(QColor shadow_color, QColor line_color) : Layer(NoChannel), m_shadow_color(shadow_color), m_line_color(line_color) { } gShadowArea::~gShadowArea() { } void gShadowArea::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { int left = region.boundingRect().left(); int top = region.boundingRect().top(); int width = region.boundingRect().width(); int height = region.boundingRect().height(); if (!m_visible) { return; } double xx = w.max_x - w.min_x; if (xx == 0) { return; } int start_px = left - 1; int end_px = left + width; double rmx = w.rmax_x - w.rmin_x; double px = ((1.0 / rmx) * (w.min_x - w.rmin_x)) * width; double py = ((1.0 / rmx) * (w.max_x - w.rmin_x)) * width; painter.fillRect(start_px, top, px, height, QBrush(m_shadow_color)); painter.fillRect(start_px + py, top, end_px-start_px-py, height, QBrush(m_shadow_color)); painter.setPen(m_line_color); painter.drawLine(start_px + px, top, start_px + py, top); painter.drawLine(start_px + px, top + height + 1, start_px + py, top + height + 1); } gFooBar::gFooBar(int offset, QColor handle_color, QColor line_color) : Layer(NoChannel), m_offset(offset), m_handle_color(handle_color), m_line_color(line_color) { } gFooBar::~gFooBar() { } void gFooBar::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { Q_UNUSED(painter); Q_UNUSED(region); if (!m_visible) { return; } double xx = w.max_x - w.min_x; if (xx == 0) { return; } //int start_px=left; //int end_px=left+width; //float h=top; /* glLineWidth(1); glBegin(GL_LINES); w.qglColor(m_line_color); glVertex2f(start_px, h); glVertex2f(start_px+width, h); glEnd(); double rmx=w.rmax_x-w.rmin_x; double px=((1/rmx)*(w.min_x-w.rmin_x))*width; double py=((1/rmx)*(w.max_x-w.rmin_x))*width; int extra=0; if (fabs(px-py)<2) extra=2; int hh=25; glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glBegin(GL_QUADS); w.qglColor(m_handle_color); glVertex2f(start_px+px-extra,top-hh); glVertex2f(start_px+py+extra,top-hh); //glColor4ub(255,255,255,128); glColor4ub(255,255,255,128); glVertex2f(start_px+py+extra,top-hh/2.0); glVertex2f(start_px+px-extra,top-hh/2.0); // glColor4ub(255,255,255,128); glColor4ub(255,255,255,128); glVertex2f(start_px+px-extra,top-hh/2.0); glVertex2f(start_px+py+extra,top-hh/2.0); w.qglColor(m_handle_color); // glColor4ub(192,192,192,128); glVertex2f(start_px+py+extra,h); glVertex2f(start_px+px-extra,h); glEnd(); glDisable(GL_BLEND); w.qglColor(m_handle_color); glBegin(GL_LINE_LOOP); glVertex2f(start_px+px-extra,top-hh); glVertex2f(start_px+py+extra,top-hh); glVertex2f(start_px+py+extra,h); glVertex2f(start_px+px-extra,h); glEnd(); glLineWidth(3); glBegin(GL_LINES); w.qglColor(m_handle_color); glVertex2f(start_px+px-extra,h); glVertex2f(start_px+py+extra,h); glEnd(); glLineWidth(1); */ } sleepyhead-0.9.8/sleepyhead/Graphs/glcommon.h0000644000175000017500000000436612412506713020562 0ustar sergiosergio/* glcommon GL code & font stuff Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef GLCOMMON_H #define GLCOMMON_H #include #ifndef nullptr #define nullptr NULL #endif //! \brief Returns the grayscale brightness (between 0 and 1) of a color float brightness(QColor color); #define MIN(a,b) (((a)<(b)) ? (a) : (b)); #define MAX(a,b) (((a)<(b)) ? (b) : (a)); const QColor COLOR_Black = Qt::black; const QColor COLOR_LightGreen = QColor("light green"); const QColor COLOR_DarkGreen = Qt::darkGreen; const QColor COLOR_Purple = QColor("purple"); const QColor COLOR_Aqua = QColor("#40c0ff"); const QColor COLOR_Magenta = Qt::magenta; const QColor COLOR_Blue = Qt::blue; const QColor COLOR_LightBlue = QColor("light blue"); const QColor COLOR_Gray = Qt::gray; const QColor COLOR_LightGray = Qt::lightGray; const QColor COLOR_DarkGray = Qt::darkGray; const QColor COLOR_Cyan = Qt::cyan; const QColor COLOR_DarkCyan = Qt::darkCyan; const QColor COLOR_DarkBlue = Qt::darkBlue; const QColor COLOR_DarkMagenta = Qt::darkMagenta; const QColor COLOR_Gold = QColor("gold"); const QColor COLOR_White = Qt::white; const QColor COLOR_Red = Qt::red; const QColor COLOR_Pink = QColor("pink"); const QColor COLOR_DarkRed = Qt::darkRed; const QColor COLOR_Yellow = Qt::yellow; const QColor COLOR_DarkYellow = Qt::darkYellow; const QColor COLOR_Orange = QColor("orange"); const QColor COLOR_Green = Qt::green; const QColor COLOR_Brown = QColor("brown"); const QColor COLOR_Text = Qt::black; const QColor COLOR_Outline = Qt::black; const QColor COLOR_ALT_BG1 = QColor(0xc8, 0xff, 0xc8, 0x7f); // Alternating Background Color 1 (Event Flags) const QColor COLOR_ALT_BG2 = COLOR_White; // Alternating Background Color 2 (Event Flags) QColor brighten(QColor color, float mult = 2.0); const int max_history = 50; #ifndef M_PI const double M_PI = 3.141592653589793; #endif #ifdef BUILD_WITH_MSVC // Visual C++ earlier than 2013 doesn't have round in it's maths header.. #if (_MSC_VER < 1800) double round(double number); #endif #endif #endif // GLCOMMON_H sleepyhead-0.9.8/sleepyhead/Graphs/MinutesAtPressure.cpp0000644000175000017500000004567212412506713022751 0ustar sergiosergio/* MinutesAtPressure Graph Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include "MinutesAtPressure.h" #include "Graphs/gGraph.h" #include "Graphs/gGraphView.h" #include "SleepLib/profiles.h" #include "Graphs/gXAxis.h" #include "Graphs/gYAxis.h" MinutesAtPressure::MinutesAtPressure() :Layer(NoChannel) { m_remap = nullptr; m_minpressure = 3; m_maxpressure = 30; m_minimum_height = 0; } MinutesAtPressure::~MinutesAtPressure() { while (recalculating()) {}; } RecalcMAP::~RecalcMAP() { } void RecalcMAP::quit() { m_quit = true; map->mutex.lock(); map->mutex.unlock(); } void MinutesAtPressure::SetDay(Day *day) { Layer::SetDay(day); // look at session summaryValues. Machine * cpap = nullptr; if (day) cpap = day->machine(MT_CPAP); if (cpap) { QList::iterator sit; EventDataType minpressure = 40; EventDataType maxpressure = 0; QMap::iterator it; QMap::iterator day_end = cpap->day.end(); // look at overall pressure ranges and find the max for (it = cpap->day.begin(); it != day_end; ++it) { Day * d = it.value(); QList::iterator sess_end = d->end(); for (sit = d->begin(); sit != sess_end; ++sit) { Session * sess = (*sit); if (sess->channelExists(CPAP_Pressure)) { minpressure = qMin(sess->Min(CPAP_Pressure), minpressure); maxpressure = qMax(sess->Max(CPAP_Pressure), maxpressure); } if (sess->channelExists(CPAP_EPAP)) { minpressure = qMin(sess->Min(CPAP_EPAP), minpressure); maxpressure = qMax(sess->Max(CPAP_EPAP), maxpressure); } if (sess->channelExists(CPAP_IPAP)) { minpressure = qMin(sess->Min(CPAP_IPAP), minpressure); maxpressure = qMax(sess->Max(CPAP_IPAP), maxpressure); } } } m_minpressure = qMax(float(4), floor(minpressure)); m_maxpressure = ceil(maxpressure); const int minimum_cells = 12; int c = m_maxpressure - m_minpressure; if (c < minimum_cells) { int v = minimum_cells - c; m_minpressure -= v/2.0; m_minpressure = qMax((EventStoreType)4, m_minpressure); m_maxpressure = m_minpressure + minimum_cells; } QFontMetrics FM(*defaultfont); QList chans = day->getSortedMachineChannels(schema::SPAN | schema::FLAG | schema::MINOR_FLAG); m_minimum_height = (chans.size()+3) * FM.height() - 5; } m_empty = false; m_recalculating = false; m_lastminx = 0; m_lastmaxx = 0; m_empty = !m_day || !(m_day->channelExists(CPAP_Pressure) || m_day->channelExists(CPAP_EPAP)); } int MinutesAtPressure::minimumHeight() { return m_minimum_height; } bool MinutesAtPressure::isEmpty() { return m_empty; } void MinutesAtPressure::paint(QPainter &painter, gGraph &graph, const QRegion ®ion) { QRect rect = region.boundingRect(); int cells = m_maxpressure-m_minpressure+1; int top = rect.top()-10; float width = rect.width(); float height = rect.height(); float left = rect.left(); float pix = width / float(cells); int numchans = chans.size(); int cells_high = numchans + 2; //height += 10; float hix = height / cells_high; m_minx = graph.min_x; m_maxx = graph.max_x; if (graph.printing() || ((m_lastminx != m_minx) || (m_lastmaxx != m_maxx))) { recalculate(&graph); } m_lastminx = m_minx; m_lastmaxx = m_maxx; QMap::iterator it; if (graph.printing()) { // lock the other mutex... // while (recalculating()) {}; // recalculate(&graph); while (recalculating()) {}; } if (!painter.isActive()) return; // Lock the stuff we need to draw timelock.lock(); painter.setFont(*defaultfont); painter.setPen(Qt::black); QMap::iterator times_end = times.end(); QPoint mouse = graph.graphView()->currentMousePos(); float ypos = top; int titleWidth = graph.graphView()->titleWidth; int marginWidth = gYAxis::Margin; QString text = schema::channel[m_presChannel].label(); QRectF rec(titleWidth-4, ypos, marginWidth, hix); rec.moveRight(left - 4); // graph.renderText(text, rec, Qt::AlignRight | Qt::AlignVCenter); if (rec.contains(mouse)) { QString text = schema::channel[m_presChannel].description(); graph.ToolTip(text, mouse.x() + 10, mouse.y(), TT_AlignLeft); } int w,h; GetTextExtent(text, w,h); graph.renderText(text, (left-4) - w, ypos + hix/2.0 + float(h)/2.0); text = STR_UNIT_Minutes; rec = QRectF(titleWidth-4, ypos+hix, marginWidth, hix); rec.moveRight(left - 4); GetTextExtent(text, w,h); graph.renderText(text, (left-4) - w, ypos + hix + hix/2.0 + float(h)/2.0); // graph.renderText(text, rec, Qt::AlignRight | Qt::AlignVCenter); float xpos = left; for (it = times.begin(); it != times_end; ++it) { QString text = QString::number(it.key()); QString value = QString("%1").arg(float(it.value()) / 60.0, 5, 'f', 1); QRectF rec(xpos, top, pix-1, hix); GetTextExtent(text, w,h); painter.fillRect(rec, QColor("orange")); graph.renderText(text, xpos + pix/2 - w/2, top + hix /2 + h/2); GetTextExtent(value, w,h); // rec.moveTop(top + hix); graph.renderText(value, xpos + pix/2 - w/2, top + hix+ hix /2+ h/2); xpos += pix; } ypos += hix * 2; // left = rect.left(); QHash >::iterator eit; QHash >::iterator ev_end = events.end(); QMap::iterator vit; int row = 0; for (int i=0; i< numchans; ++i) { ChannelID code = chans.at(i); schema::Channel & chan = schema::channel[code]; if (!chan.enabled()) continue; schema::ChanType type = chan.type(); eit = events.find(code); xpos = left; QMap::iterator eit_end = eit.value().end(); QString text = chan.label(); rec = QRectF(titleWidth, ypos, marginWidth, hix); rec.moveRight(xpos - 4); if (rec.contains(mouse)) { QString text = chan.fullname(); if (type == schema::SPAN) { text += "\n"+QObject::tr("(% of time)"); } graph.ToolTip(text, mouse.x() + 10, mouse.y(), TT_AlignLeft); } GetTextExtent(text, w,h); graph.renderText(text, (left-4) - w, ypos + hix/2.0 + float(h)/2.0); for (it = times.begin(), vit = eit.value().begin(); vit != eit_end; ++vit, ++it) { float minutes = float(it.value()) / 60.0; float value = vit.value(); QString fmt = "%1"; if (type != schema::SPAN) { //fmt = "%1"; value = (minutes > 0.000001) ? (value * 60.0) / minutes : 0; } else { //fmt = "%1%"; value = (minutes > 0.000001) ? (100/minutes) * (value / 60.0) : 0; } QRectF rec(xpos, ypos, pix-1, hix); if ((row & 1) == 0) { painter.fillRect(rec, QColor(245,245,255,240)); } text = QString(fmt).arg(value,5,'f',2); GetTextExtent(text, w,h); graph.renderText(text, xpos + pix/2 - w/2, ypos + hix /2 + h/2); // painter.drawText(rec, Qt::AlignCenter, QString(fmt).arg(value,5,'f',2)); xpos += pix; } ypos += hix; row++; } float maxmins = float(maxtime) / 60.0; float ymult = height / maxmins; row = 0; xpos = left ;//+ pix / 2; float y1, y2; it = times.begin(); float bottom = top+height; if (it != times_end) { float minutes = float(it.value()) / 60.0; y1 = minutes * ymult; painter.setPen(QPen(QColor(Qt::gray), 2)); it++; for (; it != times_end; ++it) { float minutes = float(it.value()) / 60.0; y2 = minutes * ymult; painter.drawLine(xpos, bottom-y1, xpos+pix, bottom-y2); y1 = y2; xpos += pix; } float maxev = 0; for (int i=0; i< numchans; ++i) { ChannelID code = chans.at(i); if (code == CPAP_AHI) continue; schema::Channel & chan = schema::channel[code]; if (!chan.enabled()) continue; schema::ChanType type = chan.type(); if (type == schema::SPAN) continue; eit = events.find(code); QMap::iterator eit_end = eit.value().end(); for (it = times.begin(), vit = eit.value().begin(); vit != eit_end; ++vit, ++it) { //float minutes = float(it.value()) / 60.0; float value = vit.value(); maxev = qMax(value, maxev); } } float emult = height / float(maxev); if (maxev < 0.00001) emult = 0; for (int i=0; i< numchans; ++i) { ChannelID code = chans.at(i); if (code == CPAP_AHI) continue; schema::Channel & chan = schema::channel[code]; if (!chan.enabled()) continue; schema::ChanType type = chan.type(); if (type == schema::SPAN) continue; painter.setPen(QPen(QColor(chan.defaultColor()), 2)); eit = events.find(code); xpos = left;//+pix/2; y1 = 0; QMap::iterator eit_end = eit.value().end(); for (it = times.begin(), vit = eit.value().begin(); vit != eit_end; ++vit, ++it) { //float minutes = float(it.value()) / 60.0; float value = vit.value(); y2 = value * emult; //painter.drawPoint(xpos, bottom-y1); painter.drawLine(xpos, bottom-y1, xpos+pix, bottom-y2); xpos += pix; y1 = y2; } } } // QString txt=QString("%1 %2").arg(maxmins).arg(float(maxevents * 60.0) / maxmins); // graph.renderText(txt, rect.left(), rect.top()-10); timelock.unlock(); if (m_recalculating) { // painter.setFont(*defaultfont); // painter.setPen(QColor(0,0,0,125)); // painter.drawText(region.boundingRect(), Qt::AlignCenter, QObject::tr("Recalculating...")); } // painter.setPen(QPen(Qt::black,1)); // painter.drawRect(rect); // Draw the goodies... } void RecalcMAP::run() { QMutexLocker locker(&map->mutex); map->m_recalculating = true; Day * day = map->m_day; if (!day) return; QList::iterator sit; QList::iterator sess_end = day->end(); QMap times; QHash > events; QList chans = day->getSortedMachineChannels(schema::SPAN | schema::FLAG | schema::MINOR_FLAG); ChannelID code; QList badchans; for (int i=0 ; i < chans.size(); ++i) { code = chans.at(i); // if (!day->channelExists(code)) badchans.push_back(code); } for (int i=0; i < badchans.size(); ++i) { code = badchans.at(i); chans.removeAll(code); } int numchans = chans.size(); // Zero the pressure counts for (int i=map->m_minpressure; i <= map->m_maxpressure; i++) { times[i] = 0; for (int c = 0; c < numchans; ++c) { code = chans.at(c); events[code].insert(i, 0); } } ChannelID prescode = CPAP_Pressure; // if (day->channelExists(CPAP_IPAP)) { // prescode = CPAP_IPAP; // } else if (day->channelExists(CPAP_EPAP)) { prescode = CPAP_EPAP; } qint64 minx, maxx; map->m_graph->graphView()->GetXBounds(minx, maxx); for (sit = day->begin(); sit != sess_end; ++sit) { Session * sess = (*sit); QHash >::iterator ei = sess->eventlist.find(prescode); if (ei == sess->eventlist.end()) continue; const QVector & evec = ei.value(); int esize = evec.size(); for (int ei = 0; ei < esize; ++ei) { const EventList *EL = evec.at(ei); EventDataType gain = EL->gain(); quint32 ELsize = EL->count(); if (ELsize < 1) return; qint64 lasttime = 0; //EL->time(0); EventStoreType lastdata = 0; // EL->raw(0); bool first = true; if ((EL->first() > maxx) || (EL->last() < minx)) { continue; } for (quint32 e = 0; e < ELsize; ++e) { qint64 time = EL->time(e); EventStoreType data = EL->raw(e); if ((time < minx)) { lasttime = time; lastdata = data; first = false; goto skip; } if (first) { lasttime = time; lastdata = data; first = false; } if (lastdata != data) { qint64 d1 = qMax(minx, lasttime); qint64 d2 = qMin(maxx, time); int duration = (d2 - d1) / 1000L; EventStoreType key = floor(lastdata * gain); if (key <= 30) { times[key] += duration; for (int c = 0; c < chans.size(); ++c) { ChannelID code = chans.at(c); schema::Channel & chan = schema::channel[code]; if (chan.type() == schema::SPAN) { events[code][key] += sess->rangeSum(code, d1, d2); } else { events[code][key] += sess->rangeCount(code, d1, d2); } } } lasttime = time; lastdata = data; } if (time > maxx) { break; } skip: if (m_quit) { m_done = true; return; } } if (lasttime < maxx) { qint64 d1 = qMax(lasttime, minx); qint64 d2 = qMin(maxx, EL->last()); int duration = (d2 - d1) / 1000L; EventStoreType key = floor(lastdata * gain); if (key <= 30) { times[key] += duration; for (int c = 0; c < chans.size(); ++c) { ChannelID code = chans.at(c); schema::Channel & chan = schema::channel[code]; if (chan.type() == schema::SPAN) { events[code][key] += sess->rangeSum(code, d1, d2); } else { events[code][key] += sess->rangeCount(code, d1, d2); } } } } } } QMap::iterator it; QMap::iterator times_end = times.end(); int maxtime = 0; QList trash; for (it = times.begin(); it != times_end; ++it) { EventStoreType key = it.key(); int value = it.value(); // if (value == 0) { // trash.append(key); // } else { maxtime = qMax(value, maxtime); // } } chans.push_front(CPAP_AHI); int maxevents = 0, val; for (int i = map->m_minpressure; i <= map->m_maxpressure; i++) { val = events[CPAP_Obstructive][i] + events[CPAP_Hypopnea][i] + events[CPAP_Apnea][i] + events[CPAP_ClearAirway][i]; events[CPAP_AHI].insert(i, val); // maxevents = qMax(val, maxevents); } for (int i = map->m_minpressure; i <= map->m_maxpressure; i++) { for (int j=0 ; j < chans.size(); ++j) { code = chans.at(j); if ((code == CPAP_AHI) || (schema::channel[code].type() == schema::SPAN)) continue; val = events[code][i]; maxevents = qMax(val, maxevents); } } QHash >::iterator eit; // for (int i=0; i< trash.size(); ++i) { // EventStoreType key = trash.at(i); // times.remove(key); // for (eit = events.begin(); eit != events.end(); ++eit) { // eit.value().remove(key); // } // } QMutexLocker timelock(&map->timelock); map->times = times; map->events = events; map->maxtime = maxtime; map->maxevents = maxevents; map->chans = chans; map->m_presChannel = prescode; timelock.unlock(); map->recalcFinished(); m_done = true; } void MinutesAtPressure::recalculate(gGraph * graph) { while (recalculating()) m_remap->quit(); m_remap = new RecalcMAP(this); m_remap->setAutoDelete(true); m_graph = graph; QThreadPool * tp = QThreadPool::globalInstance(); // tp->reserveThread(); if (graph->printing()) { m_remap->run(); } else { while(!tp->tryStart(m_remap)); } // Start recalculating in another thread, organize a callback to redraw when done.. } void MinutesAtPressure::recalcFinished() { if (m_graph) { m_graph->timedRedraw(0); } m_recalculating = false; m_remap = nullptr; // QThreadPool * tp = QThreadPool::globalInstance(); // tp->releaseThread(); } bool MinutesAtPressure::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { // int y = event->y() - m_rect.top(); // int x = event->x() - graph->graphView()->titleWidth; // double w = m_rect.width() - gYAxis::Margin; // double xmult = (graph->blockZoom() ? double(graph->rmax_x - graph->rmin_x) : double(graph->max_x - graph->min_x)) / w; // double a = x - gYAxis::Margin; // if (a < 0) a = 0; // if (a > w) a = w; // double b = a * xmult; // double c= b + (graph->blockZoom() ? graph->rmin_x : graph->min_x); // graph->graphView()->setCurrentTime(c); graph->timedRedraw(0); return false; } bool MinutesAtPressure::mousePressEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } bool MinutesAtPressure::mouseReleaseEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event); Q_UNUSED(graph); return false; } sleepyhead-0.9.8/sleepyhead/Graphs/graphdata_custom.h0000644000175000017500000000614612412506713022272 0ustar sergiosergio/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * * Custom graph data Headers * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ /*#ifndef GRAPHDATA_CUSTOM_H #define GRAPHDATA_CUSTOM_H #include #include "SleepLib/profiles.h" #include "SleepLib/day.h" #include "SleepLib/machine_common.h" #include "graphdata.h" class FlagData:public gPointData { public: FlagData(MachineCode _code,int _field=-1,int _offset=-1); virtual ~FlagData(); virtual void Reload(Day *day=nullptr); protected: MachineCode code; int field; int offset; }; class TAPData:public gPointData { public: TAPData(MachineCode _code); virtual ~TAPData(); virtual void Reload(Day *day=nullptr); static const int max_slots=4096; double pTime[max_slots]; MachineCode code; }; class WaveData:public gPointData { public: WaveData(MachineCode _code,int _size=1000000); virtual ~WaveData(); virtual void Reload(Day *day=nullptr); protected: MachineCode code; }; class EventData:public gPointData { public: EventData(MachineCode _code,int _field=0,int _size=250000,bool _skipzero=false); virtual ~EventData(); virtual void Reload(Day *day=nullptr); protected: MachineCode code; int field; bool skipzero; }; class AHIData:public gPointData { public: AHIData(); virtual ~AHIData(); virtual void Reload(Day *day=nullptr); }; class HistoryData:public gPointData { public: HistoryData(Profile * _profile,int mpts=2048); virtual ~HistoryData(); void SetProfile(Profile *_profile) { profile=_profile; Reload(); } Profile * GetProfile() { return profile; } //double GetAverage(); virtual double Calc(Day *day); virtual void Reload(Day *day=nullptr); virtual void ResetDateRange(); virtual void SetDateRange(QDate start,QDate end); // virtual void Reload(Machine *machine=nullptr); protected: Profile * profile; }; class SessionTimes:public HistoryData { public: SessionTimes(Profile * _profile); virtual ~SessionTimes(); //void SetProfile(Profile *_profile) { profile=_profile; Reload(); } //Profile * GetProfile() { return profile; } //virtual double GetAverage(); // length?? virtual void Reload(Day *day=nullptr); //virtual void ResetDateRange(); //virtual void SetDateRange(QDate start,QDate end); protected: // Profile * profile; }; class HistoryCodeData:public HistoryData { public: HistoryCodeData(Profile *_profile,MachineCode _code); virtual ~HistoryCodeData(); virtual double Calc(Day *day); protected: MachineCode code; }; enum T_UHD { UHD_Bedtime, UHD_Waketime, UHD_Hours }; class UsageHistoryData:public HistoryData { public: UsageHistoryData(Profile *_profile,T_UHD _uhd); virtual ~UsageHistoryData(); virtual double Calc(Day *day); protected: T_UHD uhd; }; #endif // GRAPHDATA_CUSTOM_H */ sleepyhead-0.9.8/sleepyhead/Graphs/gdailysummary.cpp0000644000175000017500000003704512412506713022171 0ustar sergiosergio/* gDailySummary Graph Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include "gdailysummary.h" #include "Graphs/gGraph.h" #include "Graphs/gGraphView.h" #include "SleepLib/profiles.h" gDailySummary::gDailySummary() : Layer(NoChannel) { } void gDailySummary::SetDay(Day *day) { QList piechans; piechans.append(CPAP_ClearAirway); piechans.append(CPAP_Obstructive); piechans.append(CPAP_Apnea); piechans.append(CPAP_Hypopnea); piechans.append(CPAP_RERA); piechans.append(CPAP_FlowLimit); pie_data.clear(); pie_chan.clear(); pie_labels.clear(); pie_total = 0; m_day = day; Machine * cpap = nullptr; if (day) cpap = day->machine(MT_CPAP); if (cpap) { m_minx = m_day->first(); m_maxx = m_day->last();; quint32 zchans = schema::SPAN | schema::FLAG; bool show_minors = true; if (p_profile->general->showUnknownFlags()) zchans |= schema::UNKNOWN; if (show_minors) zchans |= schema::MINOR_FLAG; QList available = day->getSortedMachineChannels(zchans); flag_values.clear(); flag_background.clear(); flag_foreground.clear(); flag_labels.clear(); flag_codes.clear(); EventDataType val; EventDataType hours = day->hours(); int x,y; flag_value_width = flag_label_width = flag_height = 0; for (int i=0; i < available.size(); ++i) { ChannelID code = available.at(i); schema::Channel & chan = schema::channel[code]; QString str; if (chan.type() == schema::SPAN) { val = (100.0 / hours)*(day->sum(code)/3600.0); str = QString("%1%").arg(val,0,'f',2); } else { val = day->count(code) / hours; str = QString("%1").arg(val,0,'f',2); } flag_values.push_back(str); flag_codes.push_back(code); flag_background.push_back(chan.defaultColor()); flag_foreground.push_back((brightness(chan.defaultColor()) < 0.3) ? Qt::white : Qt::black); // pick a contrasting color QString label = chan.fullname(); if (piechans.contains(code)) { pie_data.push_back(val); pie_labels.push_back(chan.label()); pie_chan.append(code); pie_total += val; } flag_labels.push_back(label); GetTextExtent(label, x, y, defaultfont); // Update maximum text boundaries if (y > flag_height) flag_height = y; if (x > flag_label_width) flag_label_width = x; GetTextExtent(str, x, y, defaultfont); if (x > flag_value_width) flag_value_width = x; if (y > flag_height) flag_height = y; } info.clear(); info_background.clear(); settings.clear(); ahi = day->calcAHI(); CPAPMode mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode)); info.append(QObject::tr("%1: %2").arg(STR_TR_AHI).arg(day->calcAHI(),0,'f',2)); info_background.append(QColor("orange")); settings.append(cpap->brand()+ " " + cpap->series()); settings.append(cpap->model()+ " " + cpap->modelnumber()); settings.append(schema::channel[CPAP_Mode].option(mode)); if (mode == MODE_CPAP) { EventDataType p = round(day->settings_max(CPAP_Pressure)); settings.append(QString("Fixed %1%2").arg(p,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); } else if (mode == MODE_APAP) { EventDataType min = round(day->settings_min(CPAP_PressureMin)); EventDataType max = round(day->settings_max(CPAP_PressureMax)); settings.append(QString("Min Pressure %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); settings.append(QString("Max Pressure %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { EventDataType min = round(day->settings_min(CPAP_EPAPLo)); EventDataType max = round(day->settings_max(CPAP_IPAPHi)); EventDataType ps = round(day->settings_max(CPAP_PS)); settings.append(QString("Min EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); settings.append(QString("Max IPAP %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); settings.append(QString("PS %1%2").arg(ps,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); } else if (mode == MODE_BILEVEL_FIXED) { EventDataType min = round(day->settings_min(CPAP_EPAP)); EventDataType max = round(day->settings_max(CPAP_IPAP)); settings.append(QString("EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); settings.append(QString("IPAP %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { EventDataType min = round(day->settings_min(CPAP_EPAPLo)); EventDataType max = round(day->settings_max(CPAP_IPAPHi)); EventDataType ps = round(day->settings_max(CPAP_PSMin)); EventDataType pshi = round(day->settings_max(CPAP_PSMax)); settings.append(QString("Min EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); settings.append(QString("Max IPAP %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); settings.append(QString("PS %1-%2%3").arg(ps,0,'f',2).arg(pshi,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); } else if (mode == MODE_ASV) { EventDataType min = round(day->settings_min(CPAP_EPAP)); EventDataType ps = round(day->settings_max(CPAP_PSMin)); EventDataType pshi = round(day->settings_max(CPAP_PSMax)); settings.append(QString("EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); settings.append(QString("PS %1-%2%3").arg(ps,0,'f',2).arg(pshi,0,'f',2).arg(schema::channel[CPAP_Pressure].units())); } settings.append(QObject::tr("Relief: %1").arg(day->getPressureRelief())); int secs = hours * 3600.0; int h = secs / 3600; int m = secs / 60 % 60; int s = secs % 60; info.append(QObject::tr("Hours: %1h, %2m, %3s").arg(h).arg(m).arg(s)); info_background.append(QColor("light blue")); info_width = info_height = 0; for (int i=0; i < info.size(); ++i) { GetTextExtent(info.at(i), x, y, mediumfont); if (y > info_height) info_height = y; if (x > info_width) info_width = x; } m_minimum_height = flag_values.size() * flag_height; m_empty = !(day->channelExists(CPAP_Pressure) || day->channelExists(CPAP_IPAP)); } else { m_minx = m_maxx = 0; m_miny = m_maxy = 0; m_empty = true; m_day = nullptr; } } bool gDailySummary::isEmpty() { return m_empty; } void gDailySummary::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { QRect rect = region.boundingRect(); int top = rect.top()-10; int left = rect.left(); int width = rect.width(); int height = rect.height()+10; // Draw bounding box painter.setPen(QColor(Qt::black)); // painter.drawRect(QRect(left,top,width,height),5,5); QRectF rect1, rect2; int size; // QFontMetrics fm(*mediumfont); // top += fm.height(); // painter.setFont(*mediumfont); // size = info_values.size(); // // for (int i=0; i < size; ++i) { // rect1 = QRect(0,0,200,100), rect2 = QRect(0,0,200,100); // rect1 = painter.boundingRect(rect1, info_labels.at(i)); // w.renderText(info_labels.at(i), column, row, 0, Qt::black, mediumfont); // rect2 = painter.boundingRect(rect2, info_values.at(i)); // w.renderText(info_values.at(i), column, row + rect1.height(), 0, Qt::black, mediumfont); // column += qMax(rect1.width(), rect2.width()) + 15; // } // row += rect1.height()+rect2.height()-5; // column = left + 10; float row = top + 10; float column = left+10; painter.setFont(*mediumfont); size = info.size(); float xpos = left + 10;; float ypos = top + 10; double maxwidth = 0 ; for (int i=0; i< info.size(); ++i) { rect1 = QRectF(xpos, ypos, 0, 0); QString txt = info.at(i); rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt); rect1.setHeight(rect1.height() * 1.25); maxwidth = qMax(rect1.width(), maxwidth); ypos += rect1.height() + 5; } painter.setFont(*defaultfont); float tpos = ypos+5; for (int i=0; i< settings.size(); ++i) { rect1 = QRectF(xpos, tpos, 0, 0); QString txt = settings.at(i); rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt); rect1.setHeight(rect1.height() * 1.25); maxwidth = qMax(rect1.width(), maxwidth); tpos += rect1.height(); } maxwidth *= 1.1; QRectF rect3 = QRectF(xpos, tpos, 0, 0); QString machinfo = QObject::tr("Machine Information"); rect3 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, machinfo); maxwidth = qMax(rect1.width(), maxwidth); painter.drawRect(QRect(xpos, ypos + rect3.height()+4, maxwidth, tpos-ypos)); ypos = top + 10; painter.setFont(*mediumfont); for (int i=0; i< info.size(); ++i) { rect1 = QRectF(xpos, ypos, 0, 0); QString txt = info.at(i); rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt); rect1.setWidth(maxwidth); rect1.setHeight(rect1.height() * 1.25); painter.fillRect(rect1, QColor(info_background.at(i))); painter.setPen(Qt::black); painter.drawText(rect1, Qt::AlignCenter, txt); painter.drawRoundedRect(rect1, 5, 5); ypos += rect1.height() + 5; } rect3.moveTop(ypos+1); rect3.setWidth(maxwidth); QFont ffont = *defaultfont; ffont.setBold(true); painter.setFont(ffont); painter.drawText(rect3, Qt::AlignCenter, machinfo); painter.setFont(*defaultfont); ypos += 6 + rect3.height(); for (int i=0; i< settings.size(); ++i) { rect1 = QRectF(xpos, ypos, 0, 0); QString txt = settings.at(i); rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt); rect1.setWidth(maxwidth); rect1.setHeight(rect1.height() * 1.25); // painter.fillRect(rect1, QColor("orange")); painter.setPen(Qt::black); painter.drawText(rect1, Qt::AlignCenter, txt); // painter.drawRoundedRect(rect1, 5, 5); ypos += rect1.height(); } column += rect1.width() + 15; size = flag_values.size(); int vis = 0; for (int i=0; i < size; ++i) { schema::Channel & chan = schema::channel[flag_codes.at(i)]; if (chan.enabled()) vis++; } flag_value_width = 0; flag_label_width = 0; flag_height = 0; float hpl = float(height-20) / float(vis); QFont font(defaultfont->family()); font.setPixelSize(hpl*0.75); font.setBold(true); font.setItalic(true); painter.setFont(font); for (int i=0; i < size; ++i) { rect1 = QRectF(0,0,0,0), rect2 = QRectF(0,0,0,0); rect1 = painter.boundingRect(rect1, Qt::AlignLeft | Qt::AlignTop, flag_labels.at(i)); rect2 = painter.boundingRect(rect2, Qt::AlignLeft | Qt::AlignTop, flag_values.at(i)); if (rect1.width() > flag_label_width) flag_label_width = rect1.width(); if (rect2.width() > flag_value_width) flag_value_width = rect2.width(); if (rect1.height() > flag_height) flag_height = rect1.height(); if (rect2.height() > flag_height) flag_height = rect2.height(); } flag_height = hpl; QRect flag_outline(column -5, row -5, (flag_value_width + flag_label_width + 20 + 4) + 10, (hpl * vis) + 10); painter.setPen(QPen(Qt::gray, 1)); painter.drawRoundedRect(flag_outline, 5, 5); font.setBold(false); font.setItalic(false); painter.setFont(font); for (int i=0; i < size; ++i) { schema::Channel & chan = schema::channel[flag_codes.at(i)]; if (!chan.enabled()) continue; painter.setPen(flag_foreground.at(i)); QRectF box(column, floor(row) , (flag_value_width + flag_label_width + 20 + 4), ceil(flag_height)); painter.fillRect(box, QBrush(flag_background.at(i))); if (box.contains(w.graphView()->currentMousePos())) { w.ToolTip(chan.description(), w.graphView()->currentMousePos().x()+5, w.graphView()->currentMousePos().y(), TT_AlignLeft); font.setBold(true); font.setItalic(true); painter.setFont(font); QRect rect1 = QRect(column+2, row , flag_label_width, ceil(hpl)); painter.drawText(rect1, Qt::AlignVCenter, flag_labels.at(i)); QRect rect2 = QRect(column+2 + flag_label_width + 20, row, flag_value_width, ceil(hpl)); painter.drawText(rect2, Qt::AlignVCenter, flag_values.at(i)); font.setBold(false); font.setItalic(false); painter.setFont(font); } else { QRect rect1 = QRect(column+2, row , flag_label_width, ceil(hpl)); painter.drawText(rect1, Qt::AlignVCenter, flag_labels.at(i)); QRect rect2 = QRect(column+2 + flag_label_width + 20, row, flag_value_width, ceil(hpl)); painter.drawText(rect2, Qt::AlignVCenter, flag_values.at(i)); } row += (flag_height); } column += 22 + flag_label_width + flag_value_width + 20; row = top + 10; //////////////////////////////////////////////////////////////////////////////// // Pie Chart //////////////////////////////////////////////////////////////////////////////// painter.setRenderHint(QPainter::Antialiasing); QRect pierect(column, row, height-30, height-30); float sum = -90.0; int slices = pie_data.size(); EventDataType data; for (int i=0; i < slices; ++i) { data = pie_data[i]; if (data == 0) { continue; } // Setup the shiny radial gradient float len = 360.0 / float(pie_total) * float(data); QColor col = schema::channel[pie_chan[i]].defaultColor(); painter.setPen(QPen(col, 0)); QRadialGradient gradient(pierect.center(), float(pierect.width()) / 2.0, pierect.center()); gradient.setColorAt(0, Qt::white); gradient.setColorAt(1, col); // draw filled pie painter.setBrush(gradient); painter.setBackgroundMode(Qt::OpaqueMode); painter.drawPie(pierect, -sum * 16.0, -len * 16.0); // draw outline painter.setBackgroundMode(Qt::TransparentMode); painter.setBrush(QBrush(col,Qt::NoBrush)); painter.setPen(QPen(QColor(Qt::black),1.5)); painter.drawPie(pierect, -sum * 16.0, -len * 16.0); sum += len; } } bool gDailySummary::mousePressEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) return true; } bool gDailySummary::mouseReleaseEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) return true; } bool gDailySummary::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { graph->timedRedraw(0); Q_UNUSED(event) Q_UNUSED(graph) return true; } sleepyhead-0.9.8/sleepyhead/Graphs/gYAxis.cpp0000644000175000017500000001747012412506713020506 0ustar sergiosergio/* gYAxis Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "Graphs/gYAxis.h" #include #include #include "Graphs/glcommon.h" #include "Graphs/gGraph.h" #include "Graphs/gGraphView.h" #include "SleepLib/profiles.h" gXGrid::gXGrid(QColor col) : Layer(NoChannel) { Q_UNUSED(col) m_major_color = QColor(180, 180, 180, 64); //m_major_color=QColor(180,180,180,92); m_minor_color = QColor(230, 230, 230, 64); m_show_major_lines = true; m_show_minor_lines = true; } gXGrid::~gXGrid() { } void gXGrid::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { int left = region.boundingRect().left(); int top = region.boundingRect().top()+1; int width = region.boundingRect().width(); int height = region.boundingRect().height(); int x, y; EventDataType miny = w.physMinY(); EventDataType maxy = w.physMaxY(); w.roundY(miny, maxy); //EventDataType dy=maxy-miny; if (height < 0) { return; } static QString fd = "0"; GetTextExtent(fd, x, y); double max_yticks = round(height / (y + 14.0*w.printScaleY())); // plus spacing between lines //double yt=1/max_yticks; double mxy = maxy; //MAX(fabs(maxy), fabs(miny)); double mny = miny; // if (miny < 0) { // mny = -mxy; // } double rxy = mxy - mny; int myt; bool fnd = false; for (myt = max_yticks; myt >= 1; myt--) { float v = rxy / float(myt); if (float(v) == int(v)) { fnd = true; break; } } if (fnd) { max_yticks = myt; } else { max_yticks = 2; } double yt = 1 / max_yticks; double ymult = height / rxy; double min_ytick = rxy * yt; float ty, h; if (min_ytick <= 0) { qDebug() << "min_ytick error in gXGrid::paint() in" << w.title(); return; } if (min_ytick >= 1000000) { min_ytick = 100; } QVector majorlines; QVector minorlines; for (double i = miny; i <= maxy + min_ytick - 0.00001; i += min_ytick) { ty = (i - miny) * ymult; h = top + height - ty; if (m_show_major_lines && (i > miny)) { majorlines.append(QLine(left, h, left + width, h)); } double z = (min_ytick / 4) * ymult; double g = h; for (int i = 0; i < 3; i++) { g += z; if (g > top + height) { break; } //if (vertcnt>=maxverts) { // qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" < 2; myt--) { float v = rxy / float(myt); if (qAbs(v - int(v)) < 0.000001) { fnd = true; break; } } if (fnd) { max_yticks = myt; } double yt = 1 / max_yticks; double ymult = height / rxy; double min_ytick = rxy * yt; //if (dy>5) { // min_ytick=round(min_ytick); //} else { //} float ty, h; if (min_ytick <= 0) { qDebug() << "min_ytick error in gYAxis::paint() in" << w.title(); return; } if (min_ytick >= 1000000) { min_ytick = 100; } QVector ticks; float shorttick = 4.0 * w.printScaleX(); for (double i = miny; i <= maxy + min_ytick - 0.00001; i += min_ytick) { ty = (i - miny) * ymult; if (dy < 5) { fd = Format(i * m_yaxis_scale, 2); } else { fd = Format(i * m_yaxis_scale, 1); } GetTextExtent(fd, x, y); // performance bottleneck.. if (x > labelW) { labelW = x; } h = top + height - ty; if (h < top) { continue; } w.renderText(fd, left + width - shorttick*2 - x, (h + (y / 2.0)), 0, m_text_color, defaultfont); ticks.append(QLine(left + width - shorttick, h, left + width, h)); double z = (min_ytick / 4) * ymult; double g = h; for (int i = 0; i < 3; i++) { g += z; if (g > top + height) { break; } ticks.append(QLine(left + width - shorttick/2, g, left + width, g)); } } painter.setPen(m_line_color); painter.drawLines(ticks); w.graphView()->lines_drawn_this_frame += ticks.size(); } } const QString gYAxis::Format(EventDataType v, int dp) { return QString::number(v, 'f', dp); } bool gYAxis::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { if (!p_profile->appearance->graphTooltips()) { return false; } graph->timedRedraw(0); int x = event->x(); int y = event->y(); if (!graph->units().isEmpty()) { graph->ToolTip(graph->units(), x+10, y+10, TT_AlignLeft); // graph->redraw(); } return false; } bool gYAxis::mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph) { if (graph) { // int x=event->x(); // int y=event->y(); short z = (graph->zoomY() + 1) % gGraph::maxZoomY; graph->setZoomY(z); qDebug() << "Mouse double clicked for" << graph->name() << z; } Q_UNUSED(event); return false; } const QString gYAxisTime::Format(EventDataType v, int dp) { int h = int(v) % 24; int m = int(v * 60) % 60; int s = int(v * 3600) % 60; char pm[3] = {"pm"}; if (show_12hr) { h >= 12 ? pm[0] = 'a' : pm[0] = 'p'; h %= 12; if (h == 0) { h = 12; } } else { pm[0] = 0; } if (dp > 2) { return QString().sprintf("%02i:%02i:%02i%s", h, m, s, pm); } return QString().sprintf("%i:%02i%s", h, m, pm); } const QString gYAxisWeight::Format(EventDataType v, int dp) { Q_UNUSED(dp) return weightString(v, m_unitsystem); } sleepyhead-0.9.8/sleepyhead/Graphs/gSegmentChart.cpp0000644000175000017500000002255112412506713022031 0ustar sergiosergio/* gSegmentChart Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include "gSegmentChart.h" gSegmentChart::gSegmentChart(GraphSegmentType type, QColor gradient_color, QColor outline_color) : Layer(NoChannel), m_graph_type(type), m_gradient_color(gradient_color), m_outline_color(outline_color) { m_empty = true; } gSegmentChart::~gSegmentChart() { } void gSegmentChart::AddSlice(ChannelID code, QColor color, QString name) { m_codes.push_back(code); m_values.push_back(0); m_colors.push_back(color); m_names.push_back(name); m_total = 0; } void gSegmentChart::SetDay(Day *d) { Layer::SetDay(d); m_total = 0; if (!m_day) { return; } for (int c = 0; c < m_codes.size(); c++) { m_values[c] = 0; for (QList::iterator s = m_day->begin(); s != m_day->end(); ++s) { if ((*s)->enabled() && (*s)->m_cnt.contains(m_codes[c])) { EventDataType cnt = (*s)->count(m_codes[c]); m_values[c] += cnt; m_total += cnt; } } } m_empty = true; for (int i = 0; i < m_codes.size(); i++) { if (m_day->count(m_codes[i]) > 0) { m_empty = false; break; } } } bool gSegmentChart::isEmpty() { return m_empty; } void gSegmentChart::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { QRect rect = region.boundingRect(); int height = qMin(rect.height(), rect.width()); int width = qMin(rect.height(), rect.width()); int left = rect.left(); int top = rect.top(); if (rect.width() > rect.height()) { left = rect.left() + (rect.width() - rect.height()); } //left --; if (!m_visible) { return; } if (!m_day) { return; } int start_px = left; int start_py = top; width--; float diameter = MIN(width, height); diameter -= 8; float radius = diameter / 2.0; float xmult = float(width) / float(m_total); float ymult = float(height) / float(m_total); float xp = left; int xoffset = width / 2; int yoffset = height / 2; if (m_total == 0) { QColor col = Qt::green; QString a = ":-)"; int x, y; GetTextExtent(a, x, y, bigfont); w.renderText(a, start_px + xoffset - x / 2, (start_py + yoffset + y / 2), 0, col, bigfont); return; } EventDataType data; unsigned size = m_values.size(); float line_step = float(width) / float(size - 1); bool line_first = true; int line_last; float sum = -90.0; painter.setFont(*defaultfont); for (unsigned m = 0; m < size; m++) { data = m_values[m]; if (data == 0) { continue; } ///////////////////////////////////////////////////////////////////////////////////// // Pie Chart ///////////////////////////////////////////////////////////////////////////////////// if (m_graph_type == GST_Pie) { const QColor col = schema::channel[m_codes[m]].defaultColor(); // length of this segment in degrees float len = 360.0 / m_total * data; // Setup the shiny radial gradient painter.setRenderHint(QPainter::Antialiasing); QRect pierect(start_px+1, start_py+1, width-2, height-2); painter.setPen(QPen(col, 0)); QRadialGradient gradient(pierect.center(), pierect.width()/2, pierect.center()); gradient.setColorAt(0, Qt::white); gradient.setColorAt(1, col); // draw filled pie painter.setBrush(gradient); painter.setBackgroundMode(Qt::OpaqueMode); if (m_total == data) { painter.drawEllipse(pierect); } else { painter.drawPie(pierect, -sum * 16.0, -len * 16.0); } // draw outline painter.setBackgroundMode(Qt::TransparentMode); painter.setBrush(QBrush(col,Qt::NoBrush)); painter.setPen(QPen(QColor(Qt::black),1.5)); if (m_total == data) { painter.drawEllipse(pierect); } else { painter.drawPie(pierect, -sum * 16.0, -len * 16.0); } // Draw text labels if they fit if (len > 20) { float angle = (sum+90.0) + len / 2.0; double tpx = (pierect.x() + pierect.width()/2) + (sin((180 - angle) * (M_PI / 180.0)) * (radius / 1.65)); double tpy = (pierect.y() + pierect.height()/2) + (cos((180 - angle) * (M_PI / 180.0)) * (radius / 1.65)); QString txt = schema::channel[m_codes[m]].label(); //QString::number(floor(100.0/m_total*data),'f',0)+"%"; int x, y; GetTextExtent(txt, x, y); // antialiasing looks like crap here.. painter.setPen(QColor(Qt::black)); painter.drawText(tpx - (x / 2.0), tpy+3, txt); } sum += len; } else if (m_graph_type == GST_CandleStick) { ///////////////////////////////////////////////////////////////////////////////////// // CandleStick Chart ///////////////////////////////////////////////////////////////////////////////////// QColor &col = m_colors[m % m_colors.size()]; float bw = xmult * float(data); QLinearGradient linearGrad(QPointF(0, 0), QPointF(bw, 0)); linearGrad.setColorAt(0, col); linearGrad.setColorAt(1, Qt::white); painter.fillRect(xp, start_py, bw, height, QBrush(linearGrad)); painter.setPen(m_outline_color); painter.drawLine(xp, start_py, xp + bw, start_py); painter.drawLine(xp + bw, start_py + height, xp, start_py + height); if (!m_names[m].isEmpty()) { int px, py; GetTextExtent(m_names[m], px, py); if (px + 5 < bw) { w.renderText(m_names[m], (xp + bw / 2) - (px / 2), top + ((height / 2) - (py / 2)), 0, Qt::black); } } xp += bw; ///////////////////////////////////////////////////////////////////////////////////// // Line Chart ///////////////////////////////////////////////////////////////////////////////////// } else if (m_graph_type == GST_Line) { QColor col = Qt::black; //m_colors[m % m_colors.size()]; painter.setPen(col); float h = (top + height) - (float(data) * ymult); if (line_first) { line_first = false; } else { painter.drawLine(xp, line_last, xp + line_step, h); xp += line_step; } line_last = h; } } } gTAPGraph::gTAPGraph(ChannelID code, GraphSegmentType gt, QColor gradient_color, QColor outline_color) : gSegmentChart(gt, gradient_color, outline_color), m_code(code) { m_colors.push_back(Qt::red); m_colors.push_back(Qt::green); } gTAPGraph::~gTAPGraph() { } void gTAPGraph::SetDay(Day *d) { Layer::SetDay(d); m_total = 0; if (!m_day) { return; } QMap tap; EventStoreType data = 0, lastval = 0; qint64 time = 0, lasttime = 0; //bool first; bool rfirst = true; //bool changed; EventDataType gain = 1, offset = 0; QHash >::iterator ei; for (QList::iterator s = m_day->begin(); s != m_day->end(); ++s) { if (!(*s)->enabled()) { continue; } if ((ei = (*s)->eventlist.find(m_code)) == (*s)->eventlist.end()) { continue; } for (int q = 0; q < ei.value().size(); q++) { EventList &el = *(ei.value()[q]); lasttime = el.time(0); lastval = el.raw(0); if (rfirst) { gain = el.gain(); offset = el.offset(); rfirst = false; } //first=true; //changed=false; for (quint32 i = 1; i < el.count(); i++) { data = el.raw(i); time = el.time(i); if (lastval != data) { qint64 v = (time - lasttime); if (tap.find(lastval) != tap.end()) { tap[lastval] += v; } else { tap[lastval] = v; } //changed=true; lasttime = time; lastval = data; } } if (time != lasttime) { qint64 v = (time - lasttime); if (tap.find(lastval) != tap.end()) { tap[data] += v; } else { tap[data] = v; } } } } m_values.clear(); m_names.clear(); m_total = 0; EventDataType val; for (QMap::iterator i = tap.begin(); i != tap.end(); i++) { val = float(i.key()) * gain + offset; m_values.push_back(i.value() / 1000L); m_total += i.value() / 1000L; m_names.push_back(QString::number(val, 'f', 2)); } m_empty = m_values.size() == 0; } sleepyhead-0.9.8/sleepyhead/Graphs/gSummaryChart.cpp0000644000175000017500000011556312412506713022072 0ustar sergiosergio/* gSummaryChart Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include "gYAxis.h" #include "gSummaryChart.h" SummaryChart::SummaryChart(QString label, GraphType type) : Layer(NoChannel), m_label(label), m_graphtype(type) { m_empty = true; hl_day = -1; m_machinetype = MT_CPAP; QDateTime d1 = QDateTime::currentDateTime(); QDateTime d2 = d1; d1.setTimeSpec(Qt::UTC); tz_offset = d2.secsTo(d1); tz_hours = tz_offset / 3600.0; m_layertype = LT_SummaryChart; } SummaryChart::~SummaryChart() { } void SummaryChart::SetDay(Day * nullday) { Q_UNUSED(nullday) Day *day = nullptr; Layer::SetDay(day); m_values.clear(); m_times.clear(); m_days.clear(); m_hours.clear(); m_goodcodes.clear(); m_miny = 999999999.0F; m_maxy = -999999999.0F; m_physmaxy = 0; m_physminy = 0; m_minx = 0; m_maxx = 0; int dn; EventDataType tmp, tmp2, total; ChannelID code; CPAPMode cpapmode = (CPAPMode)(int)p_profile->calcSettingsMax(CPAP_Mode, MT_CPAP, p_profile->FirstDay(MT_CPAP), p_profile->LastDay(MT_CPAP)); ////////////////////////////////////////////////////////// // Setup for dealing with different CPAP Pressure types ////////////////////////////////////////////////////////// if (m_label == STR_TR_Pressure) { m_codes.clear(); m_colors.clear(); m_type.clear(); m_typeval.clear(); float perc = p_profile->general->prefCalcPercentile() / 100.0; int mididx = p_profile->general->prefCalcMiddle(); SummaryType mid; if (mididx == 0) { mid = ST_PERC; } else if (mididx == 1) { mid = ST_WAVG; } else if (mididx == 2) { mid = ST_AVG; } if (cpapmode >= MODE_ASV) { addSlice(CPAP_EPAP, QColor("green"), ST_SETMIN); addSlice(CPAP_IPAPLo, QColor("light blue"), ST_SETMIN); addSlice(CPAP_IPAP, QColor("cyan"), mid, 0.5); addSlice(CPAP_IPAP, QColor("dark cyan"), ST_PERC, perc); //addSlice(CPAP_IPAP,QColor("light blue"),ST_PERC,0.95); addSlice(CPAP_IPAPHi, QColor("blue"), ST_SETMAX); } else if (cpapmode >= MODE_BILEVEL_AUTO_FIXED_PS) { addSlice(CPAP_EPAP, QColor("green"), ST_SETMIN); addSlice(CPAP_IPAP, QColor("light cyan"), mid, 0.5); addSlice(CPAP_IPAP, QColor("light blue"), ST_PERC, perc); addSlice(CPAP_PSMin, QColor("blue"), ST_SETMIN, perc); addSlice(CPAP_PSMax, QColor("red"), ST_SETMAX, perc); } else if (cpapmode >= MODE_BILEVEL_FIXED) { addSlice(CPAP_EPAP, QColor("green"), ST_SETMIN); addSlice(CPAP_EPAP, QColor("light green"), ST_PERC, perc); addSlice(CPAP_IPAP, QColor("light cyan"), mid, 0.5); addSlice(CPAP_IPAP, QColor("light blue"), ST_PERC, perc); addSlice(CPAP_IPAPHi, QColor("blue"), ST_SETMAX); } else if (cpapmode >= MODE_APAP) { addSlice(CPAP_PressureMin, QColor("orange"), ST_SETMIN); addSlice(CPAP_Pressure, QColor("dark green"), mid, 0.5); addSlice(CPAP_Pressure, QColor("grey"), ST_PERC, perc); addSlice(CPAP_PressureMax, QColor("red"), ST_SETMAX); } else { addSlice(CPAP_Pressure, QColor("dark green"), ST_SETWAVG); } } // Initialize goodcodes (which identified which legends are drawn) to all off m_goodcodes.resize(m_codes.size()); for (int i = 0; i < m_codes.size(); i++) { m_goodcodes[i] = false; } m_fday = 0; qint64 tt, zt; m_empty = true; if (m_graphtype == GT_SESSIONS) { // No point drawing anything if no real data on record if (p_profile->countDays(MT_CPAP, p_profile->FirstDay(MT_CPAP), p_profile->LastDay(MT_CPAP)) == 0) { return; } } int suboffset; SummaryType type; bool first = true; // For each day in the main profile daylist QMap::iterator d; for (d = p_profile->daylist.begin(); d != p_profile->daylist.end(); d++) { // get the timestamp of this day. tt = QDateTime(d.key(), QTime(0, 0, 0), Qt::UTC).toTime_t(); // calculate day number dn = tt / 86400; // to ms since epoch. tt *= 1000L; // update min and max for this timestamp if (!m_minx || tt < m_minx) { m_minx = tt; } if (!m_maxx || tt > m_maxx) { m_maxx = tt; } total = 0; bool fnd = false; ////////////////////////////////////////////////////////// // Setup for Sessions Time display chart ////////////////////////////////////////////////////////// if (m_graphtype == GT_SESSIONS) { // Turn all legends on for (int i = 0; i < m_codes.size(); i++) { m_goodcodes[i] = true; } // for each day object on record for this date day = d.value(); // skip any empty or irrelevant day records if (!day || (day->machine(m_machinetype) == nullptr)) { continue; } int ft = qint64(day->first()) / 1000L; ft += tz_offset; // convert to local time int dz2 = ft / 86400; dz2 *= 86400; // ft = first sessions time, rounded back to midnight.. // For each session in this day record for (int s = 0; s < day->size(); s++) { Session *sess = (*day)[s]; if (!sess->enabled()) { continue; } // Get session duration tmp = sess->hours(); m_values[dn][s] = tmp; total += tmp; // Get session start timestamp zt = qint64(sess->first()) / 1000L; zt += tz_offset; // Calculate the starting hour tmp2 = zt - dn * 86400; tmp2 /= 3600.0; m_times[dn][s] = tmp2; // Update min & max Y values if (first) { m_miny = tmp2; m_maxy = tmp2 + tmp; first = false; } else { if (tmp2 < m_miny) { m_miny = tmp2; } if (tmp2 + tmp > m_maxy) { m_maxy = tmp2 + tmp; } } } // for each session // if total hours for all sessions more than 0, register the day as valid if (total > 0) { m_days[dn] = day; m_hours[dn] = total; m_empty = false; } } else { ////////////////////////////////////////////////////////////////////////////// // Data Channel summary charts ////////////////////////////////////////////////////////////////////////////// // For each Channel for (int j = 0; j < m_codes.size(); j++) { code = m_codes[j]; suboffset = 0; type = m_type[j]; EventDataType typeval = m_typeval[j]; day = d.value(); CPAPMode mode = (CPAPMode)(int)day->settings_max(CPAP_Mode); // ignore irrelevent day objects if (day->machine(m_machinetype) == nullptr) { continue; } bool hascode = //day->channelHasData(code) || (type == ST_HOURS) || (type == ST_SESSIONS) || day->settingExists(code) || day->hasData(code, type); if (code == CPAP_Pressure) { if ((cpapmode > MODE_CPAP) && (mode == MODE_CPAP)) { hascode = false; if ((type == ST_WAVG) || (type == ST_AVG) || ((type == ST_PERC) && (typeval == 0.5))) { type = ST_SETWAVG; hascode = true; } } else { type = m_type[j]; } } //if (code==CPAP_Hypopnea) { // Make sure at least one of the CPAP data gets through with 0 // hascode=true; //} if (hascode) { m_days[dn] = day; switch (type) { case ST_AVG: tmp = day->avg(code); break; case ST_SUM: tmp = day->sum(code); break; case ST_WAVG: tmp = day->wavg(code); break; case ST_90P: tmp = day->p90(code); break; case ST_PERC: tmp = day->percentile(code, typeval); break; case ST_MIN: tmp = day->Min(code); break; case ST_MAX: tmp = day->Max(code); break; case ST_CNT: tmp = day->count(code); break; case ST_CPH: tmp = day->count(code) / day->hours(m_machinetype); break; case ST_SPH: tmp = day->sph(code); break; case ST_HOURS: tmp = day->hours(m_machinetype); break; case ST_SESSIONS: tmp = day->size(); break; case ST_SETMIN: tmp = day->settings_min(code); break; case ST_SETMAX: tmp = day->settings_max(code); break; case ST_SETAVG: tmp = day->settings_avg(code); break; case ST_SETWAVG: tmp = day->settings_wavg(code); break; case ST_SETSUM: tmp = day->settings_sum(code); break; default: tmp = 0; break; } if (suboffset > 0) { tmp -= suboffset; if (tmp < 0) { tmp = 0; } } total += tmp; m_values[dn][j + 1] = tmp; if (tmp < m_miny) { m_miny = tmp; } if (tmp > m_maxy) { m_maxy = tmp; } m_goodcodes[j] = true; fnd = true; } } if (fnd) { if (!m_fday) { m_fday = dn; } m_values[dn][0] = total; m_hours[dn] = day->hours(m_machinetype); if (m_graphtype == GT_BAR) { if (total < m_miny) { m_miny = total; } if (total > m_maxy) { m_maxy = total; } } } } } m_empty = true; for (int i = 0; i < m_goodcodes.size(); i++) { if (m_goodcodes[i]) { m_empty = false; break; } } if (m_graphtype == GT_BAR) { m_miny = 0; } // m_minx=qint64(QDateTime(p_profile->FirstDay(),QTime(0,0,0),Qt::UTC).toTime_t())*1000L; m_maxx = qint64(QDateTime(p_profile->LastDay(), QTime(23, 59, 0), Qt::UTC).toTime_t()) * 1000L; m_physmaxy = m_maxy; m_physminy = m_miny; } void SummaryChart::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { int left = region.boundingRect().left(); int top = region.boundingRect().top(); int width = region.boundingRect().width(); int height = region.boundingRect().height(); if (!m_visible) { return; } GraphType graphtype = m_graphtype; if (graphtype == GT_LINE || graphtype == GT_POINTS) { bool pts = p_profile->appearance->overviewLinechartMode() == OLC_Lines; graphtype = pts ? GT_POINTS : GT_LINE; } rtop = top; painter.setPen(QColor(Qt::black)); painter.drawLine(left, top, left, top+height); painter.drawLine(left, top+height, left+width, top+height); painter.drawLine(left+width, top+height, left+width, top); painter.drawLine( left+width, top, left, top); qint64 minx = w.min_x, maxx = w.max_x; int days = ceil(double(maxx-minx) / 86400000.0); bool buttuglydaysteps = !p_profile->appearance->animations(); double lcursor = w.graphView()->currentTime(); if (days >= 1) { double b = w.max_x - w.min_x; double a = lcursor - w.min_x; double c = a / b; if (buttuglydaysteps) { // this kills the beautiful smooth scrolling and makes days stop on day boundaries :( minx = floor(double(minx)/86400000.0); minx *= 86400000L; maxx = minx + 86400000L * qint64(days)-1; } b = maxx - minx; double d = c * b; lcursor = d + minx; } qint64 xx = maxx - minx; EventDataType miny = m_physminy; EventDataType maxy = m_physmaxy; w.roundY(miny, maxy); EventDataType yy = maxy - miny; EventDataType ymult = float(height - 2) / yy; barw = (float(width) / float(days)); // graph = &w; float px = left; l_left = w.marginLeft() + gYAxis::Margin; l_top = w.marginTop(); l_width = width; l_height = height; float py; EventDataType total; int daynum = 0; EventDataType h, tmp, tmp2; l_offset = (minx) % 86400000L; offset = float(l_offset) / 86400000.0; offset *= barw; px = left - offset; l_minx = minx; l_maxx = maxx + 86400000L; int total_days = 0; double total_val = 0; double total_hours = 0; bool lastdaygood = false; QVector totalcounts; QVector totalvalues; QVector lastX; QVector lastY; int numcodes = m_codes.size(); totalcounts.resize(numcodes); totalvalues.resize(numcodes); lastX.resize(numcodes); lastY.resize(numcodes); int zd = minx / 86400000L; zd--; QHash >::iterator d = m_values.find(zd); QVector goodcodes; goodcodes.resize(m_goodcodes.size()); lastdaygood = true; // Display Line Cursor if (p_profile->appearance->lineCursorMode()) { qint64 time = lcursor; double xmult = double(width) / xx; if ((time > minx) && (time < maxx)) { double xpos = (time - minx) * xmult; painter.setPen(QPen(QBrush(QColor(0,255,0,255)),1)); painter.drawLine(left+xpos, top-w.marginTop()-3, left+xpos, top+height+w.bottom-1); } // QDateTime dt=QDateTime::fromMSecsSinceEpoch(time,Qt::UTC); // QString text = dt.date().toString(Qt::SystemLocaleLongDate); // int wid, h; // GetTextExtent(text, wid, h); // w.renderText(text, left + width/2 - wid/2, top-h+5); } for (int i = 0; i < numcodes; i++) { totalcounts[i] = 0; // Set min and max to the opposite largest starting value if ((m_type[i] == ST_MIN) || (m_type[i] == ST_SETMIN)) { totalvalues[i] = maxy; } else if ((m_type[i] == ST_MAX) || (m_type[i] == ST_SETMAX)) { totalvalues[i] = miny; } else { totalvalues[i] = 0; } // Turn off legend display.. It will only display if it's turned back on during draw. goodcodes[i] = false; if (!m_goodcodes[i]) { continue; } lastX[i] = px; if (d != m_values.end() && d.value().contains(i + 1)) { tmp = d.value()[i + 1]; h = tmp * ymult; } else { lastdaygood = false; h = 0; } lastY[i] = top + height - 1 - h; } float compliance_hours = 0; if (p_profile->cpap->showComplianceInfo()) { compliance_hours = p_profile->cpap->complianceHours(); } int incompliant = 0; Day *day; EventDataType hours; //quint32 * tptr; //EventStoreType * dptr; short px2, py2; const qint64 ms_per_day = 86400000L; painter.setClipRect(left, top, width, height); painter.setClipping(true); QColor summaryColor = QColor("dark gray"); for (qint64 Q = minx; Q <= maxx + ms_per_day; Q += ms_per_day) { zd = Q / ms_per_day; d = m_values.find(zd); if (Q < minx) { goto jumpnext; } if (d != m_values.end()) { day = m_days[zd]; bool summary_only = day && day->summaryOnly(); if (!m_hours.contains(zd)) { goto jumpnext; } hours = m_hours[zd]; int x1 = px; //x1-=(barw/2.0); int x2 = px + barw; //if (x1 < left) { x1 = left; } if (x2 > left + width) { x2 = left + width; } // if (x2add(x1 - 1, top, x1 - 1, top + height, x2, top + height, x2, top, col.rgba()); } else { painter.fillRect((x1+barw/2)-5, top, barw, height, QBrush(col)); // quads->add((x1 + barw / 2) - 5, top, (x1 + barw / 2) - 5, top + height, (x2 - barw / 2) + 5, // top + height, (x2 - barw / 2) + 5, top, col.rgba()); } } if (graphtype == GT_SESSIONS) { int j; QHash >::iterator times = m_times.find(zd); QColor col = m_colors[0]; //if (hourssetColor(Qt::black); int np = d.value().size(); if (np > 0) { for (int i = 0; i < goodcodes.size(); i++) { goodcodes[i] = true; } } for (j = 0; j < np; j++) { tmp2 = times.value()[j] - miny; py = top + height - (tmp2 * ymult); tmp = d.value()[j]; // length //tmp-=miny; h = tmp * ymult; QLinearGradient gradient(x1, py-h, x1+barw, py-h); gradient.setColorAt(0,col1); gradient.setColorAt(1,col2); painter.fillRect(x1, py-h, barw, h, QBrush(gradient)); // quads->add(x1, py, x1, py - h, x2, py - h, x2, py, col1, col2); if ((h > 0) && (barw > 2)) { painter.setPen(QColor(Qt::black)); painter.drawLine(x1, py, x1, py - h); painter.drawLine(x1, py - h, x2, py - h); painter.drawLine(x1, py, x2, py); painter.drawLine(x2, py, x2, py - h); } totalvalues[0] += hours * tmp; } totalcounts[0] += hours; totalvalues[1] += j; totalcounts[1]++; total_val += hours; total_hours += hours; total_days++; } else { if (!d.value().contains(0)) { goto jumpnext; } total = d.value()[0]; //if (total>0) { if (day) { EventDataType hours = m_hours[zd]; total_val += total * hours; total_hours += hours; total_days++; } py = top + height; //} bool good; SummaryType type; for (QMap::iterator g = d.value().begin(); g != d.value().end(); g++) { short j = g.key(); if (!j) { continue; } j--; good = m_goodcodes[j]; if (!good) { continue; } type = m_type[j]; // code was actually used (to signal the display of the legend summary) goodcodes[j] = good; tmp = g.value(); QColor col = m_colors[j]; if (type == ST_HOURS) { if (tmp < compliance_hours) { col = QColor("#f04040"); incompliant++; } else if (summary_only) { col = summaryColor; } } if (zd == hl_day) { col = COLOR_Gold; } //if (!tmp) continue; if ((type == ST_MAX) || (type == ST_SETMAX)) { if (totalvalues[j] < tmp) { totalvalues[j] = tmp; } } else if ((type == ST_MIN) || (type == ST_SETMIN)) { if (totalvalues[j] > tmp) { totalvalues[j] = tmp; } } else { totalvalues[j] += tmp * hours; } //if (tmp) { totalcounts[j] += hours; //} tmp -= miny; h = tmp * ymult; // height in pixels if (graphtype == GT_BAR) { QColor col1 = col; QColor col2 = brighten(col,2.5); QLinearGradient gradient(x1, py-h, x1+barw, py-h); gradient.setColorAt(0,col1); gradient.setColorAt(1,col2); painter.fillRect(x1, py-h, barw, h, QBrush(gradient)); // quads->add(x1, py, x1, py - h, col1); // quads->add(x2, py - h, x2, py, col2); if (h > 0 && barw > 2) { painter.setPen(QColor(Qt::black)); painter.drawLine(x1, py, x1, py - h); painter.drawLine(x1, py - h, x2, py - h); painter.drawLine(x1, py, x2, py); painter.drawLine(x2, py, x2, py - h); } // if (bar py -= h; } else if (graphtype == GT_LINE) { // if (m_graphtype==GT_BAR QColor col1 = col; QColor col2 = m_colors[j]; px2 = px + barw; py2 = (top + height - 1) - h; // If more than 1 day between records, skip the vertical crud. if ((px2 - lastX[j]) > barw + 1) { lastdaygood = false; } if (lastdaygood) { if (lastY[j] != py2) { // vertical line painter.setPen(QPen(col2,p_profile->appearance->lineThickness())); painter.drawLine(lastX[j], lastY[j], px, py2); } painter.setPen(QPen(col1,p_profile->appearance->lineThickness())); painter.drawLine(px, py2, px2, py2); } else { painter.setPen(QPen(col1,p_profile->appearance->lineThickness())); painter.drawLine(x1, py2, x2, py2); } lastX[j] = px2; lastY[j] = py2; } else if (graphtype == GT_POINTS) { QColor col1 = col; QColor col2 = m_colors[j]; px2 = px + barw; py2 = (top + height - 2) - h; // If more than 1 day between records, skip the vertical crud. if ((px2 - lastX[j]) > barw + 1) { lastdaygood = false; } if (zd == hl_day) { painter.setPen(QPen(brighten(col2),10)); painter.drawPoint(px2 - barw / 2, py2); } if (lastdaygood) { painter.setPen(QPen(col2,p_profile->appearance->lineThickness())); painter.drawLine(lastX[j] - barw / 2, lastY[j], px2 - barw / 2, py2); } else { painter.setPen(QPen(col1,p_profile->appearance->lineThickness())); painter.drawLine(px + barw / 2 - 1, py2, px + barw / 2 + 1, py2); } lastX[j] = px2; lastY[j] = py2; } } // for(QHashmaxx+extra) break; } else { if (Q < maxx) { incompliant++; } lastdaygood = false; } jumpnext: if (px >= left + width + barw) { break; } px += barw; daynum++; //lastQ=Q; } painter.setClipping(false); //#if QT_VERSION >= QT_VERSION_CHECK(5,0,0) // quads->scissor(left * dpr, w.flipY(top + height + 2)*dpr, (width)*dpr, (height + 1)*dpr); // lines->scissor(left * dpr, w.flipY(top + height + 2)*dpr, (width + 1)*dpr, (height + 1)*dpr); // outlines->scissor(left * dpr, w.flipY(top + height + 2)*dpr, (width)*dpr, (height + 1)*dpr); //#else // lines->scissor(left, w.flipY(top + height + 2), width + 1, height + 2); // outlines->scissor(left, w.flipY(top + height + 2), width, height + 2); // quads->scissor(left, w.flipY(top + height + 2), width, height + 2); //#endif // Draw Ledgend px = left + width - 3; py = top - 5; int legendx = px; QString a, b; int x, y; QFontMetrics fm(*defaultfont); int bw = fm.width('X'); int bh = fm.height() / 1.8; bool ishours = false; int good = 0; // if (w.title().compare("Resp. Rate")==0) { // int i=5; // } for (int j = 0; j < m_codes.size(); j++) { if (!goodcodes[j]) { continue; } good++; SummaryType type = m_type[j]; ChannelID code = m_codes[j]; EventDataType tval = m_typeval[j]; switch (type) { case ST_WAVG: b = "Avg"; break; case ST_AVG: b = "Avg"; break; case ST_90P: b = "90%"; break; case ST_PERC: if (tval >= 0.99) { b = STR_TR_Max; } else if (tval == 0.5) { b = STR_TR_Med; } else { b = QString("%1%").arg(tval * 100.0, 0, 'f', 0); } break; //b=QString("%1%").arg(tval*100.0,0,'f',0); break; case ST_MIN: b = STR_TR_Min; break; case ST_MAX: b = STR_TR_Max; break; case ST_SETMIN: b = STR_TR_Min; break; case ST_SETMAX: b = STR_TR_Max; break; case ST_CPH: b = ""; break; case ST_SPH: b = "%"; break; case ST_HOURS: b = STR_UNIT_Hours; break; case ST_SESSIONS: b = STR_TR_Sessions; break; default: b = ""; break; } a = schema::channel[code].label(); if (a == w.title() && !b.isEmpty()) { a = b; } else { a += " " + b; } QString val; float f = 0; if (totalcounts[j] > 0) { if ((type == ST_MIN) || (type == ST_MAX) || (type == ST_SETMIN) || (type == ST_SETMAX)) { f = totalvalues[j]; } else { f = totalvalues[j] / totalcounts[j]; } } if (type == ST_HOURS) { int h = f; int m = int(f * 60) % 60; val.sprintf("%02i:%02i", h, m); ishours = true; } else { val = QString::number(f, 'f', 2); } a += ": " + val; //GetTextExtent(a,x,y); //float wt=20*w.printScaleX(); //px-=wt+x; //w.renderText(a,px+wt,py+1); //quads->add(px+wt-y/4-y,py-y,px+wt-y/4,py-y,px+wt-y/4,py+1,px+wt-y/4-y,py+1,m_colors[j].rgba()); //QString text=schema::channel[code].label(); int wid, hi; GetTextExtent(a, wid, hi); legendx -= wid; w.renderText(a, legendx, top - 4); // legendx-=bw/2; painter.fillRect(legendx - bw-4, top-w.marginTop()-1, bh, w.marginTop(), QBrush(m_colors[j])); legendx -= bw * 2; //lines->add(px,py,px+20,py,m_colors[j]); //lines->add(px,py+1,px+20,py+1,m_colors[j]); } if ((m_graphtype == GT_BAR) && (good > 0)) { if (m_type.size() > 1) { float val = total_val / float(total_hours); a = m_label + ": " + QString::number(val, 'f', 2) + " "; GetTextExtent(a, x, y); legendx -= x; w.renderText(a, legendx, py + 1); } } a = ""; /*if (m_graphtype==GT_BAR) { if (m_type.size()>1) { float val=total_val/float(total_days); a+=m_label+": "+QString::number(val,'f',2)+" "; // } }*/ a += QString(QObject::tr("Days: %1")).arg(total_days, 0); if (p_profile->cpap->showComplianceInfo()) { if (ishours && incompliant > 0) { a += " "+QString(QObject::tr("Low Usage Days: %1")).arg(incompliant, 0)+ " "+QString(QObject::tr("(%1% compliant, defined as > %2 hours)")). arg((1.0 / daynum) * (total_days - incompliant) * 100.0, 0, 'f', 2).arg(compliance_hours, 0, 'f', 1); } } //GetTextExtent(a,x,y); //legendx-=30+x; //w.renderText(a,px+24,py+5); w.renderText(a, left, py + 1); } QString formatTime(EventDataType v, bool show_seconds = false, bool duration = false, bool show_12hr = false) { int h = int(v); if (!duration) { h %= 24; } else { show_12hr = false; } int m = int(v * 60) % 60; int s = int(v * 3600) % 60; char pm[3] = {"am"}; if (show_12hr) { h >= 12 ? pm[0] = 'p' : pm[0] = 'a'; h %= 12; if (h == 0) { h = 12; } } else { pm[0] = 0; } if (show_seconds) { return QString().sprintf("%i:%02i:%02i%s", h, m, s, pm); } else { return QString().sprintf("%i:%02i%s", h, m, pm); } } bool SummaryChart::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { graph->timedRedraw(0); int x = event->x(); int y = event->y(); if (!m_rect.contains(x, y)) { // if ((x<0 || y<0 || x>l_width || y>l_height)) { hl_day = -1; //graph->timedRedraw(2000); return false; } x -= m_rect.left(); y -= m_rect.top(); double xx = l_maxx - l_minx; double xmult = xx / double(l_width + barw); qint64 mx = ceil(xmult * double(x - offset)); mx += l_minx; mx = mx + l_offset; //-86400000L; int zd = mx / 86400000L; Day *day; //if (hl_day!=zd) // This line is an optimization { hl_day = zd; graph->Trigger(2000); QHash >::iterator d = m_values.find(hl_day); QMap &valhash = d.value(); x += m_rect.left(); //gYAxis::Margin+gGraphView::titleWidth; //graph->m_marginleft+ int y = event->y() - m_rect.top() + rtop - 15; //QDateTime dt1=QDateTime::fromTime_t(hl_day*86400).toLocalTime(); QDateTime dt2 = QDateTime::fromTime_t(hl_day * 86400).toUTC(); //QTime t1=dt1.time(); //QTime t2=dt2.time(); QDate dt = dt2.date(); day = m_days[zd]; if ((d != m_values.end()) && (day != nullptr)) { bool summary_only = day->summaryOnly(); QString z = dt.toString(Qt::SystemLocaleShortDate); // Day * day=m_days[hl_day]; //EventDataType val; QString val; if (m_graphtype == GT_SESSIONS) { if (m_type[0] == ST_HOURS) { int t = m_hours[zd] * 3600.0; int h = t / 3600; int m = (t / 60) % 60; //int s=t % 60; val.sprintf("%02i:%02i", h, m); } else { val = QString::number(d.value()[0], 'f', 2); } z += "\r\n" + m_label + ": " + val; if (m_type[1] == ST_SESSIONS) { z += " "+QString(QObject::tr("(Sess: %1)")).arg(day->size(), 0); } EventDataType v = m_times[zd][0]; int lastt = m_times[zd].size() - 1; if (lastt < 0) { lastt = 0; } z += "\r\n"+QString(QObject::tr("Bedtime: %1")).arg(formatTime(v, false, false, true)); v = m_times[zd][lastt] + m_values[zd][lastt]; z += "\r\n"+QString(QObject::tr("Waketime: %1")).arg(formatTime(v, false, false, true)); } else if (m_graphtype == GT_BAR) { if (m_type[0] == ST_HOURS) { int t = d.value()[0] * 3600.0; int h = t / 3600; int m = (t / 60) % 60; //int s=t % 60; val.sprintf("%02i:%02i", h, m); } else { val = QString::number(d.value()[0], 'f', 2); } z += "\r\n" + m_label + ": " + val; //z+="\r\nMode="+QString::number(day->settings_min("FlexSet"),'f',0); } else { QString a; for (int i = 0; i < m_type.size(); i++) { if (!m_goodcodes[i]) { continue; } if (!valhash.contains(i + 1)) { continue; } EventDataType tval = m_typeval[i]; switch (m_type[i]) { case ST_WAVG: a = STR_TR_WAvg; break; case ST_AVG: a = STR_TR_Avg; break; case ST_90P: a = QObject::tr("90%"); break; case ST_PERC: if (tval >= 0.99) { a = STR_TR_Max; } else if (tval == 0.5) { a = STR_TR_Med; } else { a = QString("%1%").arg(tval * 100.0, 0, 'f', 0); } break; case ST_MIN: a = STR_TR_Min; break; case ST_MAX: a = STR_TR_Max; break; case ST_CPH: a = ""; break; case ST_SPH: a = "%"; break; case ST_HOURS: a = STR_UNIT_Hours; break; case ST_SESSIONS: a = STR_TR_Sessions; break; case ST_SETMIN: a = STR_TR_Min; break; case ST_SETMAX: a = STR_TR_Max; break; default: a = ""; break; } if (m_type[i] == ST_SESSIONS) { val = QString::number(d.value()[i + 1], 'f', 0); z += "\r\n" + a + ": " + val; } else { //if (day && (day->channelExists(m_codes[i]) || day->settingExists(m_codes[i]))) { schema::Channel &chan = schema::channel[m_codes[i]]; EventDataType v; if (valhash.contains(i + 1)) { v = valhash[i + 1]; } else { v = 0; } if (m_codes[i] == Journal_Weight) { val = weightString(v, p_profile->general->unitSystem()); } else { val = QString::number(v, 'f', 2); } z += "\r\n" + chan.label() + " " + a + ": " + val; //} } } } if (summary_only) { z += "\r\n"+QObject::tr("(Summary Only)"); } graph->ToolTip(z, x, y - 15); return false; } else { QString z = dt.toString(Qt::SystemLocaleShortDate) + "\r\n"+QObject::tr("No Data"); graph->ToolTip(z, x, y - 15); return false; } } return false; } bool SummaryChart::mousePressEvent(QMouseEvent *event, gGraph *graph) { if (event->modifiers() & Qt::ShiftModifier) { //qDebug() << "Jump to daily view?"; return true; } Q_UNUSED(graph) return false; } bool SummaryChart::keyPressEvent(QKeyEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) //qDebug() << "Summarychart Keypress"; return false; } #include "mainwindow.h" extern MainWindow *mainwin; bool SummaryChart::mouseReleaseEvent(QMouseEvent *event, gGraph *graph) { if (event->modifiers() & Qt::ShiftModifier) { if (hl_day < 0) { mouseMoveEvent(event, graph); } if (hl_day > 0) { QDateTime d = QDateTime::fromTime_t(hl_day * 86400).toUTC(); mainwin->getDaily()->LoadDate(d.date()); mainwin->JumpDaily(); //qDebug() << "Jump to daily view?" << d; return true; } } Q_UNUSED(event) hl_day = -1; graph->timedRedraw(2000); return false; } sleepyhead-0.9.8/sleepyhead/Graphs/gLineOverlay.cpp0000644000175000017500000003367012412506713021702 0ustar sergiosergio/* gLineOverlayBar Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include "SleepLib/profiles.h" #include "gLineOverlay.h" gLineOverlayBar::gLineOverlayBar(ChannelID code, QColor color, QString label, FlagType flt) : Layer(code), m_flag_color(color), m_label(label), m_flt(flt), m_odt(ODT_TopAndBottom) { m_hover = false; m_blockhover = false; } gLineOverlayBar::~gLineOverlayBar() { } QColor brighten(QColor, float); void gLineOverlayBar::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { m_hover = false; if (!schema::channel[m_code].enabled()) return; int left = region.boundingRect().left(); int topp = region.boundingRect().top(); // FIXME: Misspelling intentional. int width = region.boundingRect().width(); int height = region.boundingRect().height(); if (!m_visible) { return; } if (!m_day) { return; } int start_py = topp; double xx = w.max_x - w.min_x; double yy = w.max_y - w.min_y; double jj = double(width) / double(xx); if (xx <= 0) { return; } double x1, x2; int x, y; float bottom = start_py + height - 25 * w.printScaleY(), top = start_py + 25 * w.printScaleY(); double X; double Y; QPoint mouse=w.graphView()->currentMousePos(); m_count = 0; m_sum = 0; m_flag_color = schema::channel[m_code].defaultColor(); if (m_flt == FT_Span) { m_flag_color.setAlpha(128); } painter.setPen(m_flag_color); EventStoreType raw; quint32 *tptr; EventStoreType *dptr, *eptr; qint64 stime; OverlayDisplayType odt = m_odt; QHash >::iterator cei; int count; qint64 clockdrift = qint64(p_profile->cpap->clockDrift()) * 1000L; qint64 drift = 0; bool hover = false; // For each session, process it's eventlist for (QList::iterator s = m_day->begin(); s != m_day->end(); s++) { if (!(*s)->enabled()) { continue; } cei = (*s)->eventlist.find(m_code); if (cei == (*s)->eventlist.end()) { continue; } QVector &evlist = cei.value(); if (evlist.size() == 0) { continue; } drift = ((*s)->type() == MT_CPAP) ? clockdrift : 0; // Could loop through here, but nowhere uses more than one yet.. for (int k = 0; k < evlist.size(); k++) { EventList &el = *(evlist[k]); count = el.count(); stime = el.first() + drift; dptr = el.rawData(); eptr = dptr + count; tptr = el.rawTime(); //////////////////////////////////////////////////////////////////////////// // Skip data previous to minx bounds //////////////////////////////////////////////////////////////////////////// for (; dptr < eptr; dptr++) { X = stime + *tptr; if (X >= w.min_x) { break; } tptr++; } if (m_flt == FT_Span) { //////////////////////////////////////////////////////////////////////////// // FT_Span //////////////////////////////////////////////////////////////////////////// for (; dptr < eptr; dptr++) { hover = false; X = stime + *tptr++; raw = *dptr; Y = X - (qint64(raw) * 1000.0L); // duration if (Y > w.max_x) { break; } x1 = jj * double(X - w.min_x) + left; m_count++; m_sum += raw; x2 = jj * double(Y - w.min_x) + left; if (int(x1) == int(x2)) { x2 += 1; } if (x2 < left) { x2 = left; } if (x1 > width + left) { x1 = width + left; } QRect rect(x2, start_py, x1-x2, height); QColor col = m_flag_color; if (rect.contains(mouse)) { hover = true; } painter.fillRect(rect, QBrush(col)); } }/* else if (m_flt == FT_Dot) { //////////////////////////////////////////////////////////////////////////// // FT_Dot //////////////////////////////////////////////////////////////////////////// for (; dptr < eptr; dptr++) { hover = false; X = stime + *tptr++; //el.time(i); raw = *dptr; //el.data(i); if (X > w.max_x) { break; } x1 = jj * double(X - w.min_x) + left; m_count++; m_sum += raw; // if ((odt == ODT_Bars) || (xx < 3600000)) { // show the fat dots in the middle painter.setPen(QPen(m_flag_color,4)); painter.drawPoint(x1, double(height) / double(yy)*double(-20 - w.min_y) + topp); painter.setPen(QPen(m_flag_color,1)); // } else { // // thin lines down the bottom // painter.drawLine(x1, start_py + 1, x1, start_py + 1 + 12); // } } } */else if ((m_flt == FT_Bar) || (m_flt == FT_Dot)) { //////////////////////////////////////////////////////////////////////////// // FT_Bar //////////////////////////////////////////////////////////////////////////// for (; dptr < eptr; dptr++) { hover = false; X = stime + *tptr++; raw = *dptr; if (X > w.max_x) { break; } x1 = jj * (double(X) - double(w.min_x)) + left; m_count++; m_sum += raw; int z = start_py + height; double d1 = jj * double(raw) * 1000.0; if ((m_flt == FT_Bar) && (odt == ODT_Bars)) { // || (xx < 3600000)) { QRect rect(x1-d1, top, d1+4, height); QColor col = m_flag_color; painter.setPen(QPen(col,4)); painter.drawPoint(x1, top); if (!w.selectingArea() && !m_blockhover && rect.contains(mouse) && !m_hover) { m_hover = true; QColor col2(230,230,230,128); QRect rect((x1-d1), start_py+2, d1, height-2); if (rect.x() < left) { rect.setX(left); } painter.fillRect(rect, QBrush(col2)); painter.setPen(col); painter.drawRect(rect); // Draw text label QString lab = QString("%1 (%2)").arg(schema::channel[m_code].fullname()).arg(raw); GetTextExtent(lab, x, y); w.ToolTip(lab, x1 - 10, start_py + 24 + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout()); //painter.fillRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4, QBrush(QColor(255,255,255,245))); // painter.setPen(QPen(Qt::gray,1)); // painter.drawRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4); // w.renderText(lab, x1 - (x / 2)+2 - x, start_py + 14 + y + (3 * w.printScaleY()),0); // painter.drawLine(rect.x(), top, rect.x()+d1, top); // painter.drawLine(rect.x(), bottom, rect.x()+d1, bottom); // painter.drawLine(rect.x(), top, rect.x(), bottom); // col = COLOR_Gold; hover = true; painter.setPen(QPen(col,3)); } else { painter.setPen(QPen(col,1)); } painter.drawLine(x1, top, x1, bottom); if (xx < (3600000)) { QString lab = QString("%1").arg(m_label); GetTextExtent(lab, x, y); w.renderText(lab, x1 - (x / 2), top - y + (5 * w.printScaleY()),0); } } else { ////////////////////////////////////////////////////////////////////////////////////// // Top and bottom markers ////////////////////////////////////////////////////////////////////////////////////// bool b = false; if (!w.selectingArea() && !m_blockhover && QRect(x1-2, topp, 6, height).contains(mouse) && !m_hover) { // only want to draw the highlight/label once per frame m_hover = true; b = true; // Draw text label QString lab = QString("%1 (%2)").arg(schema::channel[m_code].fullname()).arg(raw); GetTextExtent(lab, x, y, defaultfont); w.ToolTip(lab, x1 - 10, start_py + 24 + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout()); // painter.fillRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4, QBrush(QColor(255,255,255,245))); // painter.setPen(QPen(Qt::gray,1)); // painter.drawRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4); // w.renderText(lab, x1 - (x / 2)+2 - x, start_py + 14 + y + (3 * w.printScaleY()),0); //x1-=1; QColor col = m_flag_color; col.setAlpha(60); painter.setPen(QPen(col, 4)); painter.drawLine(x1, start_py+14, x1, z - 12); painter.setPen(QPen(m_flag_color,4)); painter.drawLine(x1, z, x1, z - 14); painter.drawLine(x1, start_py+2, x1, start_py + 16); } else { QColor col = m_flag_color; col.setAlpha(10); painter.setPen(QPen(col,1)); painter.drawLine(x1, start_py+14, x1, z); painter.setPen(QPen(m_flag_color,1)); // painter.drawLine(x1, z, x1, z - 12); painter.drawLine(x1, start_py+2, x1, start_py + 14); } } } } } } } bool gLineOverlayBar::mouseMoveEvent(QMouseEvent *event, gGraph *graph) { Q_UNUSED(event) Q_UNUSED(graph) return false; } gLineOverlaySummary::gLineOverlaySummary(QString text, int x, int y) : Layer(CPAP_Obstructive), m_text(text), m_x(x), m_y(y) // The Layer code is a dummy here. { } gLineOverlaySummary::~gLineOverlaySummary() { } void gLineOverlaySummary::paint(QPainter &painter, gGraph &w, const QRegion ®ion) { Q_UNUSED(painter) int left = region.boundingRect().left(); int top = region.boundingRect().top(); int width = region.boundingRect().width(); int height = region.boundingRect().height(); if (!m_visible) { return; } if (!m_day) { return; } Q_UNUSED(width); Q_UNUSED(height); float cnt = 0; double sum = 0; bool isSpan = false; for (int i = 0; i < m_overlays.size(); i++) { cnt += m_overlays[i]->count(); sum += m_overlays[i]->sum(); if (m_overlays[i]->flagtype() == FT_Span) { isSpan = true; } } double val, first, last; double time = 0; // Calculate the session time. for (QList::iterator s = m_day->begin(); s != m_day->end(); s++) { if (!(*s)->enabled()) { continue; } first = (*s)->first(); last = (*s)->last(); if (last < w.min_x) { continue; } if (first > w.max_x) { continue; } if (first < w.min_x) { first = w.min_x; } if (last > w.max_x) { last = w.max_x; } time += last - first; } val = 0; time /= 1000; int h = time / 3600; int m = int(time / 60) % 60; int s = int(time) % 60; time /= 3600; //if (time<1) time=1; if (time > 0) { val = cnt / time; } QString a; if (0) { //(w.graphView()->selectionInProgress())) { // || w.graphView()->metaSelect()) && (!w.selDurString().isEmpty())) { a = QObject::tr("Duration")+": "+w.selDurString(); } else { a = QObject::tr("Events") + ": " + QString::number(cnt) + ", " + QObject::tr("Duration") + " " + QString().sprintf("%02i:%02i:%02i", h, m, s) + ", " + m_text + ": " + QString::number(val, 'f', 2); } if (isSpan) { float sph; if (!time) { sph = 0; } else { sph = (100.0 / float(time)) * (sum / 3600.0); if (sph > 100) { sph = 100; } } // eg: %num of time in a span, like Periodic Breathing a += " " + QObject::tr("(% %1 in events)").arg(sph, 0, 'f', 2); } w.renderText(a, left + m_x, top + m_y); } sleepyhead-0.9.8/sleepyhead/mainwindow.ui0000644000175000017500000033476512412506713020076 0ustar sergiosergio MainWindow 0 0 1005 849 0 1 16777215 16777215 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 127 127 127 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 127 127 127 255 255 255 127 127 127 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 SleepyHead :/icons/bob-v3.0.png:/icons/bob-v3.0.png 64 64 0 0 4 0 0 0 0 Qt::Horizontal QFrame::StyledPanel Qt::Vertical 0 0 16777215 16777215 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 127 127 127 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 127 127 127 255 255 255 127 127 127 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 true true QTabWidget::North QTabWidget::Rounded 1 false false false Welcome 0 0 0 0 0 0 0 14 50 false false background-color: red; color: yellow; <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> Qt::AlignHCenter|Qt::AlignTop 0 0 about:blank &Statistics 0 0 0 0 0 0 0 about:blank 0 0 QFrame::StyledPanel QFrame::Raised 8 8 4 4 4 Report Mode Standard true Monthly Date Range true true Qt::Horizontal 40 20 0 0 &Help Browser 0 0 0 0 0 0 0 0 40 16777215 40 QFrame::NoFrame QFrame::Plain 4 6 0 6 0 ... :/icons/back.png:/icons/back.png 24 24 true ... :/icons/forward.png:/icons/forward.png 24 24 true ... :/icons/go-home.png:/icons/go-home.png 24 24 true true QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 0 200 0 200 qrc:/docs/index.html true 230 0 180 16777215 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 12 QToolBox { icon-size: 24px; border-radius: 15px; background: rgb(163, 190, 255) } QToolBox::tab { color: #444444; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #8181b1, stop: 1.0 #8393c3); } QToolBox::tab:pressed { font: italic; color: #ffffff; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #8181b1, stop: 1.0 #8393c3); } QToolBox::tab:selected { font: italic; color: #ffffff; background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #8181b1, stop: 1.0 #8393c3); } QFrame::Box QFrame::Sunken 1 1 2 0 0 0 250 724 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 true background: rgb(163, 190, 255) :/icons/bob-v3.0.png:/icons/bob-v3.0.png Navigation 0 0 QToolButton { background: transparent; border: 2px solid transparent; border-radius: 30px; } QToolButton:hover { border: 2px solid #56789a; border-radius: 30px; } QToolButton:pressed { background-color: #8080ff; border: 2px solid #56789a; border-radius: 30px; } Statistics :/icons/eye.png:/icons/eye.png 64 64 Qt::ToolButtonTextUnderIcon true 0 0 0 0 QToolButton { background: transparent; border: 2px solid transparent; border-radius: 30px; } QToolButton:hover { border: 2px solid #56789a; border-radius: 30px; } QToolButton:pressed { background-color: #8080ff; border: 2px solid #56789a; border-radius: 30px; } Daily :/icons/edit-find.png:/icons/edit-find.png 64 64 Qt::ToolButtonTextUnderIcon true 0 0 QToolButton { background: transparent; border: 2px solid transparent; border-radius: 30px; } QToolButton:hover { border: 2px solid #56789a; border-radius: 30px; } QToolButton:pressed { background-color: #8080ff; border: 2px solid #56789a; border-radius: 30px; } Overview :/icons/overview.png:/icons/overview.png 64 64 Qt::ToolButtonTextUnderIcon true 0 0 QToolButton { background: transparent; border: 2px solid transparent; border-radius: 30px; } QToolButton:hover { border: 2px solid #56789a; border-radius: 30px; } QToolButton:pressed { background-color: #8080ff; border: 2px solid #56789a; border-radius: 30px; } Oximetry :/icons/oximeter.png:/icons/oximeter.png 64 64 Qt::ToolButtonTextUnderIcon true 0 0 0 0 QToolButton { background: transparent; border: 2px solid transparent; border-radius: 30px; } QToolButton:hover { border: 2px solid #56789a; border-radius: 30px; } QToolButton:pressed { background-color: #8080ff; border: 2px solid #56789a; border-radius: 30px; } Import :/icons/sdcard.png:/icons/sdcard.png 64 64 false Qt::ToolButtonTextUnderIcon true Qt::NoArrow 0 0 QToolButton { background: transparent; border: 2px solid transparent; border-radius: 30px; } QToolButton:hover { border: 2px solid #56789a; border-radius: 30px; } QToolButton:pressed { background-color: #8080ff; border: 2px solid #56789a; border-radius: 30px; } Help :/icons/help.png:/icons/help.png 64 64 Qt::ToolButtonTextUnderIcon true Qt::Vertical QSizePolicy::Expanding 0 0 0 0 250 724 170 170 255 170 170 255 170 170 255 170 170 255 0 31 237 170 170 255 true :/icons/bookmark.png:/icons/bookmark.png Bookmarks 0 QLayout::SetNoConstraint 0 0 0 0 0 0 0 0 0 125 125 255 200 200 255 255 255 255 212 212 255 85 85 127 113 113 170 0 0 0 255 255 255 0 0 0 125 125 255 200 200 255 125 125 255 200 200 255 0 0 0 212 212 255 255 255 220 0 0 0 0 0 0 125 125 255 200 200 255 255 255 255 212 212 255 85 85 127 113 113 170 0 0 0 255 255 255 0 0 0 125 125 255 200 200 255 125 125 255 200 200 255 0 0 0 212 212 255 255 255 220 0 0 0 85 85 127 125 125 255 200 200 255 255 255 255 212 212 255 85 85 127 113 113 170 85 85 127 255 255 255 85 85 127 125 125 255 200 200 255 125 125 255 200 200 255 0 0 0 170 170 255 255 255 220 0 0 0 background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(125, 125, 255, 255), stop:1 rgba(200, 200, 255, 255)) QFrame::Box QFrame::Sunken 0 0 0 0 0 0 0 255 255 255 190 209 255 255 255 255 255 255 255 190 209 255 190 209 255 170 170 255 255 255 255 190 209 255 255 255 255 255 255 255 190 209 255 190 209 255 170 170 255 255 255 255 190 209 255 255 255 255 255 255 255 190 209 255 190 209 255 170 170 255 15 QLineEdit { border: 1px solid #6060e0; border-radius: 20px; color: white; background-color: rgb(190, 209, 255); } QLineEdit:selected { background-color: rgb(190, 209, 255); } 0 0 163 190 255 163 190 255 163 190 255 170 170 255 163 190 255 163 190 255 163 190 255 170 170 255 163 190 255 163 190 255 163 190 255 170 170 255 QToolButton { background: rgb(163, 190, 255); } QToolButton:hover { background: rgb(163, 190, 255); border: 2px solid #272727; border-radius: 10px; } QToolButton:pressed { background: #6060c0; border: 2px solid #272727; border-radius: 10px; } ... :/icons/refresh.png:/icons/refresh.png true 0 0 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 163 190 255 background: rgb(163, 190, 255) about:blank 0 0 230 724 true :/icons/trophy.png:/icons/trophy.png Records 0 0 0 0 0 10 background: rgb(163, 190, 255) about:blank 0 0 1005 22 0 0 &File Exp&ort Data &View &Help &Data &Advanced Purge Oximetery Data Purge ALL CPAP Data Rebuild CPAP Data 0 0 16777215 7 true &Import Data Shift+F2 &Preferences &Profiles Exit View &Daily F5 View &Overview F6 View &Welcome F4 - Ctrl+Tab true Use &AntiAliasing &About SleepyHead true &Fullscreen Toggle F11 true Show Debug Pane &Reset Graph Layout Check for &Updates Take &Screenshot F12 O&ximetry Wizard F7 Print &Report &Edit Profile Online Users &Guide &Frequently Asked Questions &Automatic Oximetry Cleanup Change &User Purge &Current Selected Day true true Right &Sidebar F10 View S&tatistics View Statistics View Statistics F4 Import &ZEO Data Import RemStar &MSeries Data &Support SleepyHead Development Sleep Disorder Terms &Glossary Change &Language Change &Data Folder Import &Somnopose Data Current Days true Toggle &Line Cursor Ctrl+L true true Daily Sidebar F8 true true Daily Calendar F9 Backup &Journal true Show Performance Information Export as CSV Export for Review QWebView QWidget
    QtWebKitWidgets/QWebView
    action_Exit triggered() MainWindow close() -1 -1 399 299 actionView_Daily triggered() dailyButton click() -1 -1 850 219 actionView_Overview triggered() overviewButton click() -1 -1 850 301 actionView_Statistics triggered() statisticsButton click() -1 -1 772 101
    sleepyhead-0.9.8/sleepyhead/Resources.qrc0000644000175000017500000000353212412506713020025 0ustar sergiosergio icons/sdcard.png icons/preferences.png icons/overview.png icons/moon.png icons/go-home.png icons/forward.png icons/edit-find.png icons/back.png fonts/FreeSans.ttf icons/refresh.png docs/usage.html icons/oximeter.png docs/0.0.gif docs/schema.xml docs/channels.xml icons/last.png docs/release_notes.html icons/save.png docs/countries.txt docs/tz.txt icons/arrow-end.png icons/arrow-left.png icons/arrow-right.png icons/smileyface.png icons/sadface.png icons/mask.png icons/cubeoximeter.png icons/trophy.png icons/bookmark.png icons/help.png docs/tooltips.css icons/session-off.png icons/session-on.png icons/bob-v3.0.png docs/script.js docs/sheep.png icons/Jedimark.png COPYING icons/sdcard-lock.png icons/statistics.png icons/prs1.png icons/cms50f.png icons/rms9.png icons/intellipap.png icons/pushpin.png icons/eye.png icons/prs1_60s.png sleepyhead-0.9.8/sleepyhead/profileselect.cpp0000644000175000017500000003424012412506713020710 0ustar sergiosergio/* Profile Select Implementation (Login Screen) * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "profileselect.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "ui_profileselect.h" #include "SleepLib/profiles.h" #include "newprofile.h" #include "mainwindow.h" ProfileSelect::ProfileSelect(QWidget *parent) : QDialog(parent), ui(new Ui::ProfileSelect) { ui->setupUi(this); QStringList str; model = new QStandardItemModel(0, 0); int i = 0; int sel = -1; QString name; QIcon icon(":/icons/moon.png"); int w=0; QFont font("Sans Serif", 18, QFont::Bold, false); ui->listView->setFont(font); QFontMetrics fm(font); for (QMap::iterator p = Profiles::profiles.begin(); p != Profiles::profiles.end(); p++) { name = p.key(); if (PREF.contains(STR_GEN_Profile) && (name == PREF[STR_GEN_Profile].toString())) { sel = i; } QStandardItem *item = new QStandardItem(name); item->setData(p.key(), Qt::UserRole+2); item->setEditable(false); if (!(*p)->checkLock().isEmpty()) { item->setForeground(QBrush(Qt::red)); item->setText(name+" (open)"); } QRect rect = fm.boundingRect(name); if (rect.width() > w) w = rect.width(); // Profile fonts arern't loaded yet.. Using generic font. item->setFont(font); model->appendRow(item); i++; } w+=20; ui->listView->setMinimumWidth(w); proxy = new QSortFilterProxyModel(this); proxy->setSourceModel(model); proxy->setSortCaseSensitivity(Qt::CaseInsensitive); ui->listView->setModel(proxy); ui->listView->setSelectionBehavior(QAbstractItemView::SelectRows); ui->listView->setSelectionMode(QAbstractItemView::SingleSelection); if (sel >= 0) { ui->listView->setCurrentIndex(proxy->index(sel,0)); } //model->item(sel)->index()); } proxy->sort(0, Qt::AscendingOrder); m_tries = 0; /*PREF["SkipLogin"]=false; if ((i==1) && PREF["SkipLogin"].toBool()) { if (!Profiles::profiles.contains(name)) PREF[STR_GEN_Profile]=name; QTimer::singleShot(0,this,SLOT(earlyExit())); hide(); } */ popupMenu = new QMenu(this); popupMenu->addAction(tr("Open Profile"), this, SLOT(openProfile())); popupMenu->addAction(tr("Edit Profile"), this, SLOT(editProfile())); popupMenu->addSeparator(); popupMenu->addAction(tr("Delete Profile"), this, SLOT(deleteProfile())); ui->labelAppName->setText(STR_TR_SleepyHead); ui->labelVersion->setText("v" + VersionString + " " + ReleaseStatus); // if (GIT_BRANCH!="master") // ui->labelBuild->setText(GIT_BRANCH); // else ui->labelBuild->setText(QString()); ui->labelFolder->setText(GetAppRoot()); ui->labelFolder->setToolTip("Current SleepyHead data folder\n" + GetAppRoot()); ui->listView->verticalScrollBar()->setStyleSheet("QScrollBar:vertical {border: 0px solid grey; background: transparent; }" "QScrollBar::handle:vertical {" " background: qlineargradient(x1:0, y1:0, x2:1, y2:0," " stop: 0 rgb(230, 230, 230), stop: 0.5 rgb(255, 255, 255), stop:1 rgb(230, 230, 230));" " min-height: 0px;" " border: 1px solid gray;" " border-radius: 5px;" "}"); } ProfileSelect::~ProfileSelect() { delete model; // why is this not being cleaned up by Qt? delete popupMenu; delete ui; } void ProfileSelect::earlyExit() { accept(); } void ProfileSelect::editProfile() { QString name = ui->listView->currentIndex().data(Qt::UserRole+2).toString(); Profile *profile = Profiles::Get(name); if (!profile) { return; } if (!profile->isOpen()) { profile->Open(); } bool reallyEdit = false; if (profile->user->hasPassword()) { QDialog dialog(this, Qt::Dialog); QLineEdit *e = new QLineEdit(&dialog); e->setEchoMode(QLineEdit::Password); dialog.connect(e, SIGNAL(returnPressed()), &dialog, SLOT(accept())); dialog.setWindowTitle(tr("Enter Password for %1").arg(name)); dialog.setMinimumWidth(300); QVBoxLayout *lay = new QVBoxLayout(); dialog.setLayout(lay); lay->addWidget(e); int tries = 0; do { e->setText(""); if (dialog.exec() != QDialog::Accepted) { break; } tries++; if (profile->user->checkPassword(e->text())) { reallyEdit = true; break; } else { if (tries < 3) { QMessageBox::warning(this, STR_MessageBox_Error, tr("Incorrect Password"), QMessageBox::Ok); } else { QMessageBox::warning(this, STR_MessageBox_Error, tr("You entered the password wrong too many times."), QMessageBox::Ok); reject(); } } } while (tries < 3); } else { reallyEdit = true; } if (reallyEdit) { NewProfile newprof(this); newprof.edit(name); newprof.exec(); } //qDebug() << "edit" << name; } void ProfileSelect::deleteProfile() { QString name = ui->listView->currentIndex().data(Qt::UserRole+2).toString(); QDialog confirmdlg; QVBoxLayout layout(&confirmdlg); QLabel message(QString(""+STR_MessageBox_Warning+": "+tr("You are about to destroy profile '%1'.")+"

    "+tr("Enter the word DELETE below to confirm.")).arg(name), &confirmdlg); layout.insertWidget(0,&message,1); QLineEdit lineedit(&confirmdlg); layout.insertWidget(1, &lineedit, 1); QHBoxLayout layout2; layout.insertLayout(2,&layout2,1); QPushButton cancel(QString("&Cancel"), &confirmdlg); QPushButton accept(QString("&Delete Profile"), &confirmdlg); layout2.addWidget(&cancel); layout2.addStretch(1); layout2.addWidget(&accept); confirmdlg.connect(&cancel, SIGNAL(clicked()), &confirmdlg, SLOT(reject())); confirmdlg.connect(&accept, SIGNAL(clicked()), &confirmdlg, SLOT(accept())); confirmdlg.connect(&lineedit, SIGNAL(returnPressed()), &confirmdlg, SLOT(accept())); if (confirmdlg.exec() != QDialog::Accepted) return; if (lineedit.text().compare("DELETE")!=0) { QMessageBox::information(NULL, tr("Sorry"), tr("You need to enter DELETE in capital letters."), QMessageBox::Ok); return; } Profile * profile = Profiles::profiles[name]; p_profile = profile; if (!profile->Open()) { QMessageBox::warning(this, STR_MessageBox_Error, QString(tr("Could not open profile.. You will need to delete this profile directory manually")+ "\n\n"+tr("You will find it under the following location:")+"\n\n%1").arg(QDir::toNativeSeparators(GetAppRoot() + "/Profiles/" + profile->user->userName())), QMessageBox::Ok); return; } bool reallydelete = false; if (profile->user->hasPassword()) { QDialog dialog(this, Qt::Dialog); QLineEdit *e = new QLineEdit(&dialog); e->setEchoMode(QLineEdit::Password); dialog.connect(e, SIGNAL(returnPressed()), &dialog, SLOT(accept())); dialog.setWindowTitle(tr("Enter Password for %1").arg(name)); dialog.setMinimumWidth(300); QVBoxLayout *lay = new QVBoxLayout(); dialog.setLayout(lay); lay->addWidget(e); int tries = 0; do { e->setText(""); if (dialog.exec() != QDialog::Accepted) { break; } tries++; if (profile->user->checkPassword(e->text())) { reallydelete = true; break; } else { if (tries < 3) { QMessageBox::warning(this, STR_MessageBox_Error, tr("You entered an incorrect password"), QMessageBox::Ok); } else { QMessageBox::warning(this, STR_MessageBox_Error, tr("If you're trying to delete because you forgot the password, you need to delete it manually."), QMessageBox::Ok); } } } while (tries < 3); } else { reallydelete = true; } if (reallydelete) { QString path = profile->Get(PrefMacro(STR_GEN_DataFolder)); if (!path.isEmpty()) { if (!removeDir(path)) { QMessageBox::information(this, STR_MessageBox_Error, tr("There was an error deleting the profile directory, you need to manually remove it.")+QString("\n\n%1").arg(path), QMessageBox::Ok); } qDebug() << "Delete" << path; QMessageBox::information(this, STR_MessageBox_Information, QString(tr("Profile '%1' was succesfully deleted").arg(name)),QMessageBox::Ok); } model->removeRow(ui->listView->currentIndex().row()); delete p_profile; p_profile = nullptr; } } //! \fn ProfileSelect::QuickLogin() //! \brief For programmatically bypassing the login window void ProfileSelect::QuickLogin() { on_listView_activated(ui->listView->currentIndex()); } void ProfileSelect::on_selectButton_clicked() { on_listView_activated(ui->listView->currentIndex()); } void ProfileSelect::openProfile() { on_listView_activated(ui->listView->currentIndex()); } void ProfileSelect::on_newProfileButton_clicked() { NewProfile newprof(this); newprof.skipWelcomeScreen(); newprof.setWindowTitle(tr("Create new profile")); if (newprof.exec() == NewProfile::Rejected) { // reject(); } else { accept(); } } //! \fn ProfileSelect::on_listView_activated(const QModelIndex &index) //! \brief Process the selected login, requesting passwords if required. void ProfileSelect::on_listView_activated(const QModelIndex &index) { QString name = index.data(Qt::UserRole+2).toString(); Profile *profile = Profiles::profiles[name]; if (!profile) { return; } if (!profile->isOpen()) { QString lockhost = profile->checkLock(); if (!lockhost.isEmpty()) { if (lockhost.compare(QHostInfo::localHostName()) == 0) { // Localhost has it locked.. if (QMessageBox::warning(nullptr, STR_MessageBox_Warning, QObject::tr("There is a lockfile already present for profile '%1'.").arg(name)+"\n\n"+ QObject::tr("You can only work with one instance of an individual SleepyHead profile at a time.")+"\n\n"+ QObject::tr("Please close any other instances of SleepyHead running with this profile before proceeding.")+"\n\n"+ QObject::tr("If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message."), QMessageBox::Cancel |QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Cancel) { return; } } else { if (QMessageBox::warning(nullptr, STR_MessageBox_Warning, QObject::tr("There is a lockfile already present for this profile '%1', claimed on '%2'.").arg(name).arg(lockhost)+"\n\n"+ QObject::tr("You can only work with one instance of an individual SleepyHead profile at a time.")+"\n\n"+ QObject::tr("If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding."), QMessageBox::Cancel |QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Cancel) { return; } } profile->removeLock(); } p_profile = profile; profile->Open(); // Do this in case user renames the directory (otherwise it won't load) // Essentially makes the folder name the user name, but whatever.. // TODO: Change the profile editor one day to make it rename the actual folder profile->p_preferences[STR_UI_UserName] = name; } if (!profile->user->hasPassword()) { m_selectedProfile = name; PREF[STR_GEN_Profile] = name; accept(); return; } else { int tries = 0; do { QDialog dialog(this, Qt::Dialog); QLineEdit *e = new QLineEdit(&dialog); e->setEchoMode(QLineEdit::Password); dialog.connect(e, SIGNAL(returnPressed()), &dialog, SLOT(accept())); dialog.setWindowTitle(tr("Enter Password")); QVBoxLayout *lay = new QVBoxLayout(); dialog.setLayout(lay); lay->addWidget(e); dialog.exec(); if (profile->user->checkPassword(e->text())) { m_selectedProfile = name; PREF[STR_GEN_Profile] = name; accept(); return; } tries++; if (tries < 3) { QMessageBox::warning(this, STR_MessageBox_Error, tr("Incorrect Password"), QMessageBox::Ok); } else { QMessageBox::warning(this, STR_MessageBox_Error, tr("You entered an Incorrect Password too many times. Exiting!"), QMessageBox::Ok); } } while (tries < 3); } reject(); return; } void ProfileSelect::on_listView_customContextMenuRequested(const QPoint &pos) { popupMenu->popup(QWidget::mapToGlobal(pos)); } void ProfileSelect::on_pushButton_clicked() { MainWindow::RestartApplication(false, true); } void ProfileSelect::on_filter_textChanged(const QString &arg1) { QRegExp regExp("*"+arg1+"*", Qt::CaseInsensitive, QRegExp::Wildcard); proxy->setFilterRegExp(regExp); } sleepyhead-0.9.8/sleepyhead/newprofile.ui0000644000175000017500000010345412412506713020061 0ustar sergiosergio NewProfile 0 0 667 450 Edit User Profile :/icons/bob-v3.0.png:/icons/bob-v3.0.png 8 8 8 8 0 0 QTextEdit::AutoNone about:blank false false I agree to all the conditions above. Qt::Horizontal 40 20 -1 8 8 8 8 User Information false -1 8 8 8 8 User Name Keep the kids out.. Nothing more.. This isn't meant to be uber security. Password Protect Profile false true false 8 8 8 8 Password QLineEdit::PasswordEchoOnEdit ...twice... QLineEdit::PasswordEchoOnEdit Locale Settings 8 8 8 8 -1 0 0 DST Zone 0 0 TimeZone Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Qt::Vertical 20 40 0 0 Country Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter -1 8 8 8 8 Personal Information (for reports) -1 -1 8 8 8 8 First Name Last Name D.O.B. true Gender Male Female 0 0 Height Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 2 350.000000000000000 0 1.000000000000000 0 0 metric archiac Contact Information QFormLayout::AllNonFixedFieldsGrow -1 -1 8 8 8 8 Address Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true Email Phone Qt::Vertical 20 40 -1 8 8 8 8 CPAP Treatment Information QFormLayout::AllNonFixedFieldsGrow -1 -1 8 8 8 8 Date Diagnosed true Untreated AHI 999.990000000000009 CPAP Mode CPAP APAP Bi-Level ASV RX Pressure true -1 8 8 8 8 Doctors / Clinic Information QFormLayout::AllNonFixedFieldsGrow -1 -1 8 8 8 8 Doctors Name Qt::Horizontal Practice Name Patient ID Qt::Horizontal Address true Qt::Horizontal Phone Email Qt::Vertical 20 40 0 0 14 75 false true SleepyHead Qt::AlignHCenter|Qt::AlignTop true TextLabel Qt::AlignCenter :/docs/sheep.png true Qt::Vertical 20 40 16 8 8 8 8 Qt::Horizontal 40 20 0 0 &Cancel false 0 0 &Back false 0 0 &Next false false cancelButton clicked() NewProfile reject() 425 373 288 197 sleepyhead-0.9.8/sleepyhead/logger.h0000644000175000017500000000170712412506713016776 0ustar sergiosergio#ifndef LOGGER_H #define LOGGER_H #include #include #include #include #include void initializeLogger(); void shutdownLogger(); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) void MyOutputHandler(QtMsgType type, const char *msgtxt); #else void MyOutputHandler(QtMsgType type, const QMessageLogContext &context, const QString &msgtxt); #endif class LogThread:public QObject, public QRunnable { Q_OBJECT public: explicit LogThread() : QRunnable() { running = false; logtime.start(); } virtual ~LogThread() {} void run(); void append(QString msg); void appendClean(QString msg); bool isRunning() { return running; } void quit(); QStringList buffer; QMutex strlock; QThreadPool *threadpool; signals: void outputLog(QString); protected: volatile bool running; QTime logtime; }; extern LogThread * logger; extern QThreadPool * otherThreadPool; #endif // LOGGER_H sleepyhead-0.9.8/sleepyhead/preferencesdialog.h0000644000175000017500000000556612412506713021207 0ustar sergiosergio/* SleepyHead Preferences Dialog Headers * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef PREFERENCESDIALOG_H #define PREFERENCESDIALOG_H #include #include #include #include #include #include #include "SleepLib/profiles.h" namespace Ui { class PreferencesDialog; } /*! \class MySortFilterProxyModel \brief Enables the Graph tabs view to be filtered */ class MySortFilterProxyModel: public QSortFilterProxyModel { Q_OBJECT public: MySortFilterProxyModel(QObject *parent = 0); protected: //! \brief Simply extends filterAcceptRow to scan children as well bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; }; /*! \class PreferencesDialog \brief SleepyHead's Main Preferences Window This provides the Preferences form and logic to alter Preferences for SleepyHead */ class PreferencesDialog : public QDialog { Q_OBJECT public: explicit PreferencesDialog(QWidget *parent, Profile *_profile); ~PreferencesDialog(); //! \brief Save the current preferences, called when Ok button is clicked on. bool Save(); //! \brief Updates the date text of the last time updates where checked void RefreshLastChecked(); private slots: void on_combineSlider_valueChanged(int value); void on_IgnoreSlider_valueChanged(int value); void on_checkForUpdatesButton_clicked(); //void on_genOpWidget_itemActivated(QListWidgetItem *item); void on_createSDBackups_toggled(bool checked); void on_okButton_clicked(); void on_scrollDampeningSlider_valueChanged(int value); void on_tooltipTimeoutSlider_valueChanged(int value); void on_createSDBackups_clicked(bool checked); void on_resetChannelDefaults_clicked(); void on_channelSearch_textChanged(const QString &arg1); void on_chanView_doubleClicked(const QModelIndex &index); void on_waveSearch_textChanged(const QString &arg1); void on_resetWaveformChannels_clicked(); void on_waveView_doubleClicked(const QModelIndex &index); private: void InitChanInfo(); void InitWaveInfo(); void saveChanInfo(); void saveWaveInfo(); QHash toplevel; QHash machlevel; Ui::PreferencesDialog *ui; Profile *profile; QHash m_new_colors; QStringList importLocations; QStringListModel *importModel; MySortFilterProxyModel * chanFilterModel; QStandardItemModel *chanModel; MySortFilterProxyModel * waveFilterModel; QStandardItemModel *waveModel; }; #endif // PREFERENCESDIALOG_H sleepyhead-0.9.8/sleepyhead/fonts/0000755000175000017500000000000012412506713016472 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/fonts/FreeSans.ttf0000644000175000017500000160314012412506713020724 0ustar sergiosergio FFTMP9£DGDEFVwMÔzGPOSµÍ0wÆ$@ GSUB‘€öd–P/ÔOS/2ùs¾P¨VcmapѨcÕ@„fcvt RŠU¨$fpgm‹…BSìÆgaspÈ glyf÷ž„j”T5üheadóØÊÁ,6hheaç·d$hmtxþÙ¨>„loca!8ŽtUÌ>ˆmaxp 3ˆ nameZ D¹ÊP Ypost³¡3¡Ô¬»prepˆ^¤T´ôA‰×êU‹_<õ èÈ £È £üBþ2`èþÔZªüBü—`¡¡¸du ¹Š»/ŒŠ»ÿ]ß1 äŽÿBýÿ GNU @ ÿÿ ÿ8è,`¿ß÷ôCM|c4,,!y›4¿0MIM&…(H2WM.Wÿø,+,f,", ,,#,+,.,%,&nnH-H2H2,M÷"››OÒ0ÒY›ZcZ ,ÒSdô›O,PAKÒL &›[ &Ò]›0cÒU›°›› c@ÿøÕ,,ÿêM,*,6ô,,(,,FÞBÞÿîô:ÞDAF,F,$,6,MEô",Aô ÒôôôN+dNHKz,4,,C, d,+Máÿór%À-H(M.áÿóM^—H2^^M\,A0WM'^Em(À.e=e=e,`››››››è Ò0›Z›Z›Z›ZGÿÿÒÒL & & & & &H_ ÒUÒUÒUÒU› š[cC,*,*,*,*,*,*y"ô,(,(,(,(Aÿù,$,F,$,$,$,$,$H2c,A,A,A,Aô+6ô›,*›,*›,+Ò0ôÒ0ôÒ0ôÒ0ôÒYÒÒ,›Z,(›Z,(›Z,(›Z,(›Z,( ,, ,, ,, ,,ÒS,FÒ',ÿöÿë ÿÿÿýÿñÞÿî_^¼dvBôÞÿà›Oô:ô:,FÞ@,PÞ9,PƒD,PôD,ÞÒL,FÒL,FÒL,FÒ.ÒL,F &,$ &,$ &,$è+°(Ò]MEÒ]M;Ò]M1›0ô"›0ô"›0ô"›0ô"cc»c ÒU,AÒU,AÒU,AÒU,AÒU,AÒU,A°Ò› ô› côcôcô,V0œP,6›ÿÏ,ÿÙÒ0Ò0ôÒƒ0›O,64&›ZÒ/›0c ,› yFBM›Oô:M0A@Òÿô,F &&5$°&Ò$J0,6š[›0ô"cMÿîccUpA ÒUÒÿô,côc c ô ô",",@,6drdH2|Y¸Y  P P¼D†L°L F›,*ÿù &,$ÒU,AÒU,AÒU,AÒU,AÒU,A,(›,*›,*è y" ,, ,,›Oô: &,$ &,$c ô Þÿß5YÆY  ,,v[ÒL,F›,*è y" c›,›,*›Z,›Z,(ÿ{ÿzÿýÿñ &, &,$Ò]Mÿ¹Ò]M-ÒU,ÿóÒU,A›0ô"c ‰ÒS,Fcô›,*›Z,( &,$ &,$ &,$ &,$› ôÞÿî,*,,,6ôô ,,,(,($(ô"ó$æ"ô!Þÿî,,"ô, ,F,F,FÞÿøÞB Ù«ÞDcDAFAFAF,ÿî,F7F,$ $Òå9MEMEMEMEME€TqE"6"6ô"¼,ÿør"Bô Òô, ôôô (4,/,/,/Ò0 &úFô"".F¼ô:®F,,/,/°°°±ú üþ”DAD-æ5mM M § ì&ìg(ôJ1Æ1WWWM•MOMMMMM3M3MMM‚MM\MdMMSM#MgMgMzM{M M M M MMsMOM9MMÿÝMþMº:MMN(((((HHMMM1M3M.MMGLµµM nÈÈÈÈM M MþÉÿþÇþ¸þÏþ=þÂÿ&þÑþäÿþ´þÆÿ1þìþ=þÂþÂÿ)ÿ2ÿ,ÿ+þÉþþþèÿÿ5ÿwÿ þäþäþäþXÿUÿ­þòþ˜þÁþîþþìþýþÏþÀþÆþÆþÂþÂþ}þý§ý§þ>þeý9ýCýCÿþ–þ”þ‚þÓÿ!ý¨þÉÿþ¨ÿ2þžþ¿þÏþŒþ¸þòþþhþ‘ýàþ”þ»ÿ:þ¡þQþkþ|þÿ;þ½þnýýþ¯þ´þ¸þ¼þ¼þ©þ´þÔþ©þ–þäþ“þ®þµþ¤þ¹þnþâþÍþ”þž1ÇLnMsM›VÿØ<ÿØqÿØAÿêMÿØ ÿØÿê››OFR 5›ZtÒS &d›O›AKÒLvA &ÒP›[t(c› Í›é4 4 › T0'$382T024$'Ç&$ (8þ<'<ô Ö"$k92#"l"ì2å.; –*ä$ÿß2"$2ä$D6æ4M l4å9ä$,,69 &H0›P‘PþFPÒ0›0dô8SöSþtPÚPe ÒSšœPœPFP,"‘P‰ ›0ÚPÚPxP¢!NPÑP.ÑPŽPÒ0ce ]0‘æPr8>PSPIjPžPÍ*éP®(&&&úF”FZ#&óó$7F7FéFjF.F&&-FAF&¼$Ôa&ÒBFò0´FÈF˜²F F$÷F%&%&A”F&ö$àFßÿî-UFAéF7FÔ.F®µú<–* 0&&®µ®µÔþ„þþÿÿ ý×ýüýûPGF± ŒP<FYPFM ˆ OPÛFŸ >•*í"’PþF£PF¬ GäP:FÛPÊF"P(FÒ0þ&Ò0&c’œ Bœ L ˜è¨§~0 0v<ò0vPòFŸ/»$—*¿&þP‰ óœPF¸  ÑP.FèP;Fv<ò0ePwFþPš(&š(&è o"‘P#&Ò/ Ò/ ‰ ó›0ó$c  ÚP7FÚP7F.&& 0&& 0&&Í*$e Ôe Ôe Ôr8ò0FP‹FjP²F›0ë"™ý &?$¦ÈsPéFÐF¸Fî<Õ<»Fï2¾F¿FFA¹F†FTF#ºFI2‹A’(÷<S- [(¿FˆBºAè-âF¿FãA”-µFo<F-x-Ê(MOÞ5ÈMMM MAA'F<#9A"AE#aF'A8F9#(FFF#)FF#8A(,AùÿìF•#'A†#AAý& A!AHAoA(A(#-FtAB,#œ* FZM kn€ͽÏÒEuååè&yÔ>FnŠ€:O:ÒV&n?Ô>_'o?`=È:&&9X%o?m0Ô>z3_=K$?98? N3^>#%<¯#¨>œ<8¸+X6X8É4É2É3É,ôjôjôjrTrW>>…ˆ>Ä#Ä9>ÿ¸…ÿ¸…ÿ¸ýkýkªmId”±sÿ¸Îÿ¸Îÿ¸äÿ¸ªÿ²Xa”ÿ¸ªkkÎÿ¸ΧÎÿ¸>ÿ¸>ÿ¸~Iÿ¸ýkªÿ¸ªcÎ,õÍãõÍÜ}© «ý §§ª¨§ÕþÔÿ>1?ÍÍ=ÏÏE#˜®®®®X <E Xí  KŠk¿³¥8c_4“*ôO( 8ÝØêA*±±””ê…ÝšäþšºÓÿßÓÿùÓÿþ2þÄþÐþÐþÔTþÓþ|þLàÿ¸êÿ!ÓÿMÓÿ,ÿ^Gÿ‡ýà þ, ˆî  ¿eØ*ƒqqxqv¢s¢î?Z?q?X?d?N?e?e?"?‚?mjƒÍþÌ,"RÿåÿåÕÿÞÿçÿß%ÿéRátD#s#e:ÿÝÓ×+¬ÿçã ˜ÿåýÿñOÿç3ÿç}ÿÇ”ÿô ÿÙ˜ÿÕÂ?ÿßÝ¢ÿé±-½ÿØó Hÿçyÿç+ÿéÀÿè§ÿá†ÿçòÿßòÿí©ÿéïÿì¸ÿçþ„¸ÿçÁÿ±½ÿÚ´þwÿÿ@ÿþ·üÿÑóÿ²yÿÜaÿ×ÿ/d Ûþì ÿç˜ÿé¬ÿëRátþïýÏôAµMß1ñ9ô1â÷`$áyÿçyÿç­ÿû­Þ(! žm+eþ¼ÿw_0\ÿù@ÿùeÿà ÿöÓÿùÓÿù™ÿöYÿùÌÿùZÿùªÿøzÿó¸ÿùèÿù‰ÿ÷¢ÿúÿøÿöuÿùÿúÿù‘ÿöŠÿøÿ÷‹ÿù€ÿúzÿú–ÿøvÿöqÿô…ÿ÷ÿøpÿ÷eÿ÷’ÿùÞÿúlÿú¤ÿöÏÿërÿùšÿùšÿùfÿöÿ]ÿóBÿû-ÿ"ýúýúþ ýßþ!ýÏþ®|ÿóúÿúŒÿöÿúÿú !nn@Mý…•þÑþœšÿöÖÿùÁ þ˜ÿ<¹ÿÍÓÿÆLÿú3ÿû ÿþÔÿì®ÿÏÿäÿäÿäÓÿÓÓÿÔÓÿÓbÿö oÿõbÿ÷Yÿöfÿö‚ÿõ¬ÿðzÿô„ÿôýÿþÿþ ‘ÿó#ÿühÿøîYÿôsÿõ lÿ÷³ÿï¯ÿðÔNÿùý;ÿù¯ÿñÿýlÿö?ÿülÿö%ÿû5þÄŸ ñ<ºÙÿ, þ’þÆ&þƒþË-þr)þt.þOÏÿ_¾ÿ)¶ÿÿ ÂÿεÿÏßöä×õÿõÎ ÆïðßS}ú ’”ÿ±¤D ÉèèP - - - °è¤P Ø :˜ÿä1ÿé_¹¹² iÿþe [ ¹ey ( $¨ }þTþ´T Š Í  ª Mv[  qlˆèK<l<‚</<X<S<<}Pn<U<«<Z<[PPK<o<YP<ÔO<W<,<[<NPò<T<P‹<TPx<Q<´ë´¿¿tÞÁ½KÁÁªÁàªÔÆo¹¿¾¿Ö¸xÁÖÁÚvŠ£¦´<›,*›O,6›O,6›O,6Ò0ôÒY,ÒY,ÒY,ÒY,ÒY,›Z,(›Z,(›Z,(›Z,(›Z,(cZ ,,ÒS,FÒS,FÒS,FÒÿñ,ÿßÒS,FÿöÞÿÏ›Oô:›Oô:›Oô:,PÞ:,PÞÿå,PÞÿå,PÞÿÞAKAFAKAFAKAFÒL,FÒL,FÒL,FÒL,F &,$ &,$ &,$ &,$›[,6›[,6Ò]MEÒ]M;Ò]M;Ò]Mÿæ›0ô"›0ô"›0ô"›0ô"›0ô"ccccÒU,AÒU,AÒU,AÒU,AÒU,A›ô ›ô °Ò°Ò°Ò°Ò°Ò›ô›ô› ôcôcôcô,FÒô+*›,*›,*›,*›,ÿÇ›,*›,*›,*›,*›,*›,*›,*›,*›Z,(›Z,(›Z,(›Z,(›,ÿÄ›Z,(›Z,(›Z,(SN_Þ9 &,$ &,$ &,$ &,ÿ§ &,$ &,$ &,$&5$&5$&5$&5$&5$ÒU,AÒU,AUpAUpAUpAUpAUpA› ô› ô› ô› ôT0T0T0T0T0T0T0T0››æÿòôÿó´ÿï»ÿí¡ÿñ›ÿå''''''ÚÿóÊÿî„ÿðrÿñcÿïoÿñ$$$$$$$$ÿñ ÿ÷±ÿò³ÿø¯ÿô²ÿôUÿÝUÿÝ,8ÿôÿ÷ÿûÿùÿËÿËBÿñAÿõâÿòåÿñÝÿñäÿóŠÿà†ÿÞ"$"$"$"$"$"$ÿïÿôÞÿòÛÿówÿñÿó22222222ëÿî“ÿïËÿô_ÿïä$ä$ä$ä$ä$ä$ä$ä$ÿóÿñÌÿñÊÿïoÿó–ÿï…ÿ÷…ÿóT0T0''$$8"$"$22ä$ä$T0T0T0T0T0T0T0T0><”ÿò”ÿóUÿï\ÿíCÿñ;ÿå$$$$$$$$ ÿñ£ÿ÷PÿòUÿøKÿôNÿôñÿÝôÿÝä$ä$ä$ä$ä$ä$ä$ä$¦ÿó¦ÿñjÿñhÿïÿó5ÿï&ÿ÷)ÿóT0T0T0T0T0T0T0›››ÿÝ›@MtÈMtM M $$$$$Aÿ÷ÿã°€kSRBM ÿÍÿÛÿäÿðÿÇÿðÿý ÿåxÿâDQM 2222929222› › 1ÿÚ;ÿÉåÿó‰"‰"M ä$ä$ä$ä$ä$Aÿ¿AÿêPÿÇ.ÿÚ«4MRMvôèôèMú§,ÈdM.M.,ÿû,ÿûèÿ÷èÿ÷8K6ÿkÞAÝ@Þ@Ý@M0M1M/M1,&,&^2^FWšsèsWôè P 1Õ1¨11Õ1¨1x ú1ú1nb,|,M,ÿê’;’;¶#H 5§ÿNNyNXMBMB|,.0 …(?’;…(z<ô’;$<W1Ò<Õ<à<Ò<\<à<à<^^”^^^^^^^^ ^ ^o^N^'^^E^^^^^^^^^^ ^ ^o^L^]^^^g&Y c,,AFªG%[²]o2e<6$›c:"¬'ÍZ››[€!ýùýùÿ6ÿý¨ý¨þ)ý´ý2ý1ý4ý2ýwýCþËþPþ)þ0üBý®ýüýùý·ý¨þÔÊsÓsù,3lTšY›0—(É!g,<V):^j ¡ë¦AáÿóX4Rÿþ»èUÎ1è? 4 ›O›Œ"o,(¼2-)L)8€:P:ÒV&Cg(Î2 ,,P,P› ¨/â(eEeeEeeeeEeeEeeeeEd,dBd±d›±Çݱd›±Ç,PÒ0ÒYAKÞB¼BšBÒBô Ò ° Ž ÒBôÒ°ÞDô,AFÛ [-Û1[-    Û0ÛÛ-’Û Û |8‰#Û Û-|8{ Û Û['Û-[,['D ›,+›Z7Ç Ç H7H7H-H7H7É-7i7i$)H(H2H2þÿüˆ(H]H§ÉÉÈK 8KT[[((,dd¼d,__£HKHK=Kô%H3H*H(H(H2H2H2HIHI*H2H2H(H(H-H-»-»-*H-H-H-H-HHH-H-H(H(H-H-H7H7H7H7HH6HH6(|4|P|B|B|E|E+++++’L’’’XL`L|>|>|>|>èèü=ü=W×@Æ>H(H(|B|B7'ÈbÇHÇ_ÈI,æ,d’;’;II€(€(€(€,€€,„X„X„X„7„à„7,æ,ÿ÷ô##########èèèÌè¤èèèÌè¤èèèÌè¤èÌèÌè¤è¤èèèèèÌèÌè¤è¤èèèèèÌèÌè¤è¤è¤è¤è¤è¤èèèèè¤èèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèèè|èÌè|è|èèèèÌè|è|èèèèÌè|è|èèèèèèèèèèèèèèèèèèèèèèèèèèèèèôèèèèèkèèôèôèèèèèèèè–è–è–è–è–è,èÈ|#|#$é#r¡Br"¶#S"#r"¶#S"#M7+7Ò7Ò7ŸBy<’2‰"###ü=ü=H(M.þÝþüýèÄþ^þLþL)&êÿ²ÿNþ†ÂSþ'þpÿ—þäýìþAþ/ý‰þiÙÿíM' 2ÿîÿè4ÿî ÿç’ÿôGÿæ£ÿî&-ÿå!ÿ÷‘ÿâ#ÿáÏ T 5 0ÿè¼ÿÓMK¡ÿîÿî‹ÿïÈÿé/ÿêÿÿÕòšÿÎâÿ×:ÿîwÿî#ÿá2ÿñÿÿî®þÞ"ÿ5ÿ°xÿFxÿYñÿá¸ÿÕ|ÿòß×ÌÿôêÿóÿôOÿçÖÿîØÿó ÿÙäÿñÿåÿßï÷ÿïááÿ÷ ÿáó }ÿù¼ÿð ÿç+ÿéØÿö×ÿøòÿíÒÿëïÿìâÿ×ÅÿóØÿí»ÿó˜ÿÕ8ÿé¸ÿé¸ÿÍ”ÿÙÙÿí”ÿÙÙÿí”ÿÙÙÿíßÿó:ÿÝ8ÿÝ:ÿݘÿÕ˜ÿÕ˜ÿÕrÿéäý++×+×++¬ÿçÿÕKÿó·ÿò·ÿêÿû×ÿçéÿíéÿòéÿóGÿè‘ÿëÿçÿçÿçâÿï˜ÿåÿæÿæ]ÿéŸÿÍq!:!ÃÿàëÿôÿÇVÿâwÿé§ÿÙX X  ²ÿöš,²ÿö1`Â?n?+ÿÝ+ÿÝõÿß!ÿé¢ÿßÿßþÿÑÕÿÑêÿÓêÿÓÿìÿéÿé¢ÿéÿËíÿËÿååÿé±-Z-PÿÓPÿÓÏÿç@ÿç@ÿç¼ÿÓÿñÿð ÿáÿð ÿánÿÓmÿÓqÿð ÿë ÿëDÿô½ÿØhÿØ~ÿñùÿðë3ôó ó ó gÿÜòÿîHÿçkÿç[ÿé[ÿé+ÿéyÿçÿõyÿç+ÿéÿê.ÿéÏÿé©ÿéÀÿèVÿéXÿéÈÿéÿÙÿÙÈÿéÈÿéÈÿèƒÿé_ÿèÈÿéÀÿèÿéÿéHÿÓñÿݱÿÒ±ÿÒjÿÕjÿÕñÿñÆÿÕeÿòñÿñ‘ÿßÈÿÕzÿôÿíòÿí“ÿíòÿíÿÎSÿÎCÿî·ÿÝOÿõ ÿëOÿõæÿà¬ÿéÿÎÿ΄ÿé„ÿé/ÿÎHÿéhÿ׃ÿ×hÿ×0ÿç÷ÿß%ÿã÷ÿß%ÿã ÿóÿ÷âÿ× ÿñâÿ×úÿÓïÿìÿ׌ÿ׌ÿ×ÊÿñÊÿñÿדÿìâÿ×ïÿì¸ÿç ÿÓ˜ÿé.ÿç¸ÿçFÿç:ÿÝ×+¬ÿç˜ÿåýÿñOÿç}ÿÇ ÿÙÂ?ÿßÝÿèÝ-±- ÿá½ÿØó Àÿç+ÿéÈÿéüÿèÀÿèÐÿôòÿßòÿíâÿ×ïÿìÜÿç¸ÿçßpÿù—q˜+t+ ÿçÍÿç½ÿåšÿå–rÿûÄÿî‡ÿï–q ÿá ÿá ÿá ÿá?ÿë÷ÿëž q ž x ‡ÿú_ÿúCÿçÿçÃÿç£ÿç–ÿöoÿöðÿéÍÿéJÿçÿçñÿññÿñ¬ÿíÿí­ÿí„ÿí·ÿΕÿÎâÿ×$ÿ×âÿ×ÿׯÿì†ÿì3ÿ×ÿ×*ÿ×ÿ×­ÿì‹ÿì¹ÿÓ ÿÓCÿçÿçGÿçÿç™ÿítÿí:ÿÝÓ×+¬ÿçã ˜ÿåýÿñOÿç3ÿç}ÿÇ”ÿô ÿÙ˜ÿÕÂ?ÿßÝ¢ÿé±-½ÿØó Hÿçyÿç+ÿéÀÿè§ÿá†ÿçòÿßòÿí©ÿéïÿì¸ÿç ÿç˜ÿé¬ÿëyÿçyÿç™þWþþaþaþ ÿáþ‘þíþÔþn2þþþFýΚÿÉÄÿí¤ÿHÿÿÓ‰ÿ߉ÿíÿïâÿ×–ÿì¸ÿçò·ÿÝþc›ÿ•qÿ³ÿïØÿòÿï8ƒƒÏþ|ÓÿUþLþLÿ'ä aŸ¡\´ÿþvu®ÐËÿÅÒÿóoÚÄåÿó?]ãc‚®Òɾ'„)èB'iN¨)¡g'>>øÿóÒ|)CÒ»¥øäþ|à2ùàbÚx˜jj¢r­tèJÿÿ„è**jUUüØ Úÿµÿóèâ ÿó‹Óÿ5Óþ]ÖÿJÔþkÓÿ5Óþ]ÓÿùÓÿùÓÿù )º¾uÞ#Ïÿÿ³ þ=ÿ ùÿ'þ!áÿãÓÿùÓÿóÓÿðÓÓÿÓÿþ|þ|þ|þLþLþLÓÿUÓÿ,þL¯ÜÿDÊ([Š8côÚùþ?z]s®»—*U QY„)è*à; ù§ÿç€bÿþ(.õ&Áÿôb³NE9EoEøÿóŠäô8côäŠ(EE9EÒÒ3ÿôôÿúÆ·ÂÿÿEÿó[ÿöØÿóÏ´¹ÿýÍÿþbù&ÿø ÿúA ²§ ÿúr¹œÄÿÿÿúØÿîÆ¯éÿüÿíÿúëÿõ¼Ïÿÿšÿ츿Ùÿþ– ÿùÿúH uÿîKÿú;ÿû,ÿþ(ÿèÿÞvÿø,ÿèôÿìÖÿì¶ÿï/ÿþ.ÿüÿò/ÿü6ÿüÿù‰ÿôêÿçÿóhÿ÷îÿé”ÿÛæ…[ÿêQÿø¼ÿð­ÿòÿí*ÿëÿÿ‚ÿò^ÿ÷KÿúÿóÒÿå®ÿðŽÿõXÿøhÿö[ÿ÷[ÿ÷uÿõ2ÿû˯ÿðï ÿæÿþèÿàËÿåäÿãBþmÿ÷€þç+ÿ*%ÿ5)þL\ÿß3ÿã3ÿã\ÿßäÿúÿ,ÿó°ÿòÿþÿþ µ · À ¼ÿéNÿïLÿíÿ4ÿ2,þG:þ<0þ1,þT$þq0þ`.þ^)þV2þ[/þX1þ¦*þK*þKåÿÐâbÿö oÿõbÿ÷Yÿöfÿö‚ÿõ¬ÿðzÿô„ÿôýÿþÿþ ‘ÿó#ÿühÿ÷îYÿôsÿõ ÿþlÿ÷³ÿï¯ÿðÔNÿøÿÿô;ÿù¯ÿñÿýlÿõ?ÿúpÿÒ%ÿûäÿúÄÿö þ¿ þa þTÿö þ1 þ@ þ> þ[ þ£ þ³þ¿ þB þg þ˜þ¿ þRQì1Šÿôÿóµÿù´ÿùÄÿù©ÿøïÿù‰ÿ÷¯ÿú‘ÿørÿù‚ÿú‡ÿò•ÿöÿ÷‹ÿù‚ÿúrÿú™ÿø{ÿöuÿôÿ÷oÿ÷jÿ÷ÿùáÿúmÿúuÿùšÿùgÿöZÿù ÿùhÿë›ÿöÖÿùÖÿùšÿöZÿùÎÿù]ÿùCÿùlÿó þa þb þ¿ þ_ þaïÌ ÑŒ…ìAAA AèAÈ:18K%z:P&h? 9R%i?%©#H2<<<<€:€:€:O:ÒV&n?_`= &&9X%m0z3_=?98?N3^>#%<¯#Ô>O:&98?€H# Þ a?ÆÞ\¿üJ.€d>-£¶Œšâ€Çþa|£,d€ËìqV Âé‚€2Cê#€ìIèö³ Cå €øoñM}€ù#pn_åÿÿÛÿÿC™1a\šÿþêæ7Ð7·7ï7£7é7É7H6—7‚7ô7Ø7&7€7@7u7Û7M7A7R77”7 7Ä7»77Á7b77,ü\, üа°~»õ37ouz~ŠŒ¡Î×ñõasùV_‡Š¹Äêô ,J 9 M T r ƒ Œ ¨ ° ² ¹ Ä È Î × Ý ã ú   ( 0 3 6 9 < B H M \ ^ t ƒ ‹ ‘ ¨ ° ³ ¹ Å É Í Ð à ï ñ ƒ Š • š œ Ÿ ¤ ª µ ¹ Á È Í × í ñÀõùû›ùEMWY[]}´ÄÓÛïôþ d q Ž ” ® µ Ó × á ð!!! ! !!!!"!3!;!D!K!N!!™!¦!ª!µ!Ã!Ì!Õ!Ý""" """" "."4">"I"M"P"b"e"k"s"}"‰"Œ"™"§"µ"Ã"Æ"È"ã## ###*#¦#®$#$i%K%l%¡%¥%ª%¬%³%½%Ç%Ë%ï&,&g&o'@** .ûûû6û<û>ûAûDûOÿýÿÿ  ¾÷$7Ptz~„ŒŽ£Ñðôp|‚1Ya‰°»Ðð0  < P X … “ ª ² ¶ ¼ Ç Ë × Ü ß æ     * 2 5 8 < > G K Y ^ f … “ ª ² µ ¼ Ç Ë Ð à æ ñ ‚ … Ž ’ ™ œ ž £ ¨ ® · ¾ Æ Ê × ê ñ Ðùû  HPY[]_€¶ÆÖÝòö p t ¡ ° Ð Ö Û å!!! ! !!!! !&!5!A!J!M!S!!¦!©!µ!¼!Ì!Ð!Ý""""""" "#"4"<"@"M"P"`"d"j"m"z"€"Œ""¢"²"À"Å"È"à### #)#›#®$"$`%%P%€%£%ª%¬%³%½%Ç%Ê%ï&,&`&i'@** .ûûûû8û>û@ûCûFÿýÿÿÿãÿÂÿÀÿ¿ÿ»ÿ¸ÿ ÿœÿ˜ÿ•ÿÿÿŽÿÿ‹ÿsÿqÿgÿYÿQÿOÿ9ÿ3ÿ"ÿ ÿÿþùþøþíþèýÝýÜýÙü#ü!üüüü ü ü üüüüüûþûöûòûñûïûéûèûäûâûáûàûßûÞûÜûÛû×ûÕûÊûÉûÂû¶ûµû´û³û²û±û°û¯û­û¬û«û©ûšû•û”ûûûúÿúüúûúúú÷úôúñúðúìúèúçúÞúÌúÉöö ö öééèúèøèöèôèòèñèðèïèîèìèëèêèèèçèåèäèãèØèÖèÕèÉèÈè®è¬è©è¦è—è–è•è”è“è’èèèŠè‰è„èè~èzèjè^è\èRèLèDèAè:èèèèèèèèè èèçÿçýçîçíçéçèçâçàçÞçÜçÔçÊçÀç¿ç¾ç§ç‹ç„çpçkæûæôææEå¯å«å˜å—å“å’åŒåƒåzåxåUåäæäåäáVáRÝEùìçæåäãâ5 `Ü ~ »b¾õ~÷¶$3ß77ïPoðtuzz~~„ŠŒŒŽ¡£Î0Ñ×\ðñcôõeagpsÉ|Í‚ùÑIM1VSY_ya‡€‰Š§°¹©»Ä³Ðê½ðôØ Ý,ë0J  9$ < M] P To X rt ƒ … Œ’ š “ ¨œ ª °² ² ²¹ ¶ ¹º ¼ ľ Ç ÈÇ Ë ÎÉ × ×Í Ü ÝÎ ß ãÐ æ úÕ  ê  í  ó  (õ * 0 2 3 5 6 8 9 < < > B G H K M Y \# ^ ^' f t( ƒ7 … ‹: A ‘B “ ¨E ª °[ ² ³b µ ¹d ¼ Åi Ç És Ë Ív Ð Ðy à àz æ ï{ ñ ñ… ‚ ƒ† … Šˆ Ž Ž ’ •‘ ™ š• œ œ— ž Ÿ˜ £ ¤š ¨ ªœ ® µŸ · ¹§ ¾ Áª Æ È® Ê Í± × ×µ ê í¶ ñ ñº À»ÐõÜùùûû› ù ú EHM<PWBYYJ[[K]]L_}M€´l¶Ä¡ÆÓ°ÖÛ¾ÝïÄòô×öþÚ dã p q H t Ž J ” e ¡ ® j ° µ x Ð Ó ~ Ö × ‚ Û á „ å ð ‹!! —!! ™! ! ž! ! Ÿ!! ¡!! ¨!! «! !" ­!&!3 °!5!; ¾!A!D Å!J!K É!M!N Ë!S! Í!!™ ú!¦!¦ !©!ª !µ!µ !¼!à !Ì!Ì !Ð!Õ !Ý!Ý "" "" "" "" $"" -"" /" " 1"#". 2"4"4 >"<"> ?"@"I B"M"M L"P"P M"`"b N"d"e Q"j"k S"m"s U"z"} \"€"‰ `"Œ"Œ j""™ k"¢"§ v"²"µ |"À"à €"Å"Æ „"È"È †"à"ã ‡## ‹## Œ# ## #)#* ”#›#¦ –#®#® ¢$"$# £$`$i ¥%%K ¯%P%l û%€%¡ %£%¥ :%ª%ª =%¬%¬ >%³%³ ?%½%½ @%Ç%Ç A%Ê%Ë B%ï%ï D&,&, E&`&g F&i&o N'@'@ U** V* * [.. \ûûùûûÿûû6û8û<û>û>#û@ûA$ûCûD&ûFûO(ÿýÿý2€3ŸÃQÈÕv  „      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾ rdei x¡pk ¯vj Nˆš 0s Q Rgw  & $M :l|6¨ºcn .T J m} b‚…—ö÷ÿ ûü¹ BÁ: ' u  úû yý  „ŒƒŠ‘Ž•–”œ›óf|qxyzz}{g°,°K°*PX°JvY°#?°+X=YK°*PX}Y Ô°.-°, Ú/°+\X G#Faj X db8!!Y!Y-°,KRXE#Y!-°,i °@PX!°@Y-°,°+X!#!zXÝÍYKRXXýíY!°+X°FvYXÝÍYYY-°, \Z-°,±"ˆPX° ˆ\\°Y-°,±$ˆPX°@ˆ\\°Y-°, 9/-¸ÿ…K°PX±ŽY±F+X!°YK°RX!°€Y°+\X° E°+D° E²‡+°+D° E²:+°+D° E²+°+D° Eºv+°+D° E²y+°+D° Eº ÿ+°+D° E°+D° E² +±Fv+D° Eº “+±Fv+D° Eº ÿ+±Fv+D° Eºÿ+±Fv+D° E²@+±Fv+D° Eºÿ+±Fv+DY ®ÙNEJSSUUU^^,,,,Xˆè”(Ää<x¤ÌèhäPˆì\Œp”Èì<œ T Œ ð L ˆ ¸ ä P € œ Ø  0 d ” à $ „ ô€¤à<x¤Ôø8\x”(|Ì$ˆÈ@„¬è8œÜ(|Ðt¸øTˆÈøXtÐ(<¤<´ü Ôøˆ @`| <„¼„ ð ( < Œ ¸!!$!„""°"Ä"Ü"ô# #$#<#T# $@$X$p$ˆ$ $¸$Ð$è%%P%h%€%˜%°%È%à&&ˆ& &¸&Ð&è''D'°'È'à'ø((((@))”)¬)Ä)Ü)ô* *$*<*T*Ø*ð++ +8+P+h+œ,,(,@,X,p,ˆ,Ü,ô- -$-<-T-´.d.|.”.¬.Ä.Ü.ô/ /$/</T/¤00 080P0h0€0˜0ð1Œ1¤1¼1Ø1ð22 282P2h2€2˜2°2ü3P3h3€3˜3°3È3à4 4l4„4 4¸4Ð4è55505`5x55¨5À5Ø5ð66 6T6„6œ6´6Ì6ä6ü77,7t7Ì7ä7ü88,8D8\8à9p9ˆ9 9¸9Ð9è:::0:H:`;,;ä;ü<>(>@>X>p>ˆ> ??t?Œ?¤?¼?Ô?ì@@@4@L@d@|@°AA A°B BXB´BÈC<C C°DDhDÀDÔEEE˜EØF0F°G GˆG¼GèH4HxH¤IIxI¼IüJTJÄK,KœL LtLÜM8MÀN0NdNÈO OdO¼OôPLP¨P¼QQpQÈRRDR SSLSÄT(TˆTìTüUUPU`UxUU¨UÀUØUðVV V8VPVhV€V˜V°VÈVàVøWW0WPWhWˆW WÀWØWìX X$XDX\XtXŒYYY¨YÀYØYðZhZÜZô[ [$[<[T[l[„[œ[´[Ì\0\H\`\„\œ\´\Ì\ä\ü]],]D]\]t]Œ]¤]¼]Ô]ì^^^4^L^d^|^”^¬^Ä^Ü^ô_ _$_<_T_l_„_œ```¨`ÀaaPaha€aðb”b¬bÄbÜbôc c$c<cTclc„c´cÈd4dHd°dÄeLe¼f(fˆfœg8g g°h\hÐii j,jjðk|kkèlTlˆl¼lèmHmmÀn n4n˜oohoÀoðpDp¤q,q<qPq„qÌrrLr|r°sss sät<t€tôuuLu¤vvpv„v˜v¬vÔww€wÐxlx¸yyyxyy z z„z”{{{0{œ{ø|T|È}d~~ Ì€T€Ì X°‚‚0‚D‚€‚”‚¨‚ðƒƒƒ,ƒ<ƒTƒ|ƒ¤ƒÌƒà„„\„¨„Ì„à………<…`…t…„…”…¤…¼…Ð…ä…ø††,†@†T†t†ˆ†°†Ì†ü‡‡\‡”‡Ð‡øˆ8ˆPˆdˆxˆŒˆ ˆ´ˆÔˆü‰$‰L‰l‰Œ‰°‰Ä‰Ü‰ìŠŠŠ(Š<ŠPŠdŠ€ŠœŠ°ŠÀŠÜŠø‹ ‹ ‹@‹`‹¨‹¼‹Ð‹ä‹øŒ Œ(Œ<ŒPŒdŒ¨Œ¼ŒÐŒäŒü<Xl€¨ÐàôŽŽ(Ž<Ž\ŽŒŽ ŽÀŽàL|¤¸äø Dœ°ÄØì‘‘‘(‘D‘X‘l‘€‘œ‘¸‘Ì‘à’’X’Œ’È’Ü’ð“““$“8“L“`“x““¬“ü” ”<”T”ˆ”ˆ”œ”°”Ì”à”ô••@•T•h•¤– –È—(—<—X—l—À—Ô˜˜˜,˜@˜T˜h˜|˜˜¤˜¸˜Ì˜à˜ô™™™4™h™x™Œ™¼™Ì™ä™üšš0š@šPšhš€šš šÄšìšü› ››t›„›”›¸›È›Øœœ œDœTœˆœ˜œ¨ tØðžž ž8žPžhž€žøŸpŸ¸ 8 ¤ ü¡X¡Ä¡ø¢(¢”¢ä¢ô£x£ˆ£Ô¤@¤´¥ ¥H¥¥ü¦d¦°§$§<§T§l§„§œ¨$¨ˆ¨ ¨¸© © ªªdªèªø«8«P«h«¼«Ô¬<¬L¬\¬t¬„¬ø­T­”­¬­Ä­Ü®®®p®€® ®ì®ü¯L¯Ô°°°P°œ°¬°¼°Ì°ô±±±$±L±ð²²0²d²”²Ì³³h³°´´t´À´ÐµPµ°µÐ¶¶ ¶d¶Ì¶ø··@·ˆ·À·ì·ü¸ ¸0¸@¸d¸t¹¹¹D¹x¹¨¹àº$ºxº¼»»|»Ì»ä»ü¼l¼„¼Ü¼ì¼ü½½$½„½Ô¾,¾D¾\¾t¾ ¿¿D¿T¿d¿¼ÀÀ0ÀPÀhÀ€ÀÈÀôÁÁ Á<Á|ÁÄÂÜÃ4ÃŒÃàÄ0ÄŒÄôÅÅ<ÅlÅœÅèÆ<ÆÆÜÇ|ÈÈDÈxÈÀÉÉDÉ„ÉÀÉôÊ,Ê`Ê”ÊÄËËxÌÌtÌôÍhÍ”ÍÀÍìÎÎTΈÎÈÏÏ<ÏtÏ´ÏìÐ4ÐtЬÐÜÑ|ÒÒÐӌӨÓÀÓØÔ,Ô|ÔÐÕ ÕdÕ ÕØÖ ÖLÖ„ÖÀ×××(×@×X×p×¼Øt،ؤÙÙ$Ù<ÙTÙlلٜٴÙÄÙÔÙìÚÚÚ4ÚLÚdÚtڄڜڴÚÌÚäÚüÛÛ,ÛDÛ\ÛtیۤÛÌÛôÜ Ü$ܬÝÝpÝÈÝØÝèÝøÞÞLÞÞäß@߬àà\àÜáá\áìâDâ”â°ããŒãää0äÔåå„娿dæ¸ççpçàè4èÔé0éxéÔêTê¨ë8ë\ëàìHì¬í@íPíxí”íÐíàî,îPî´ïïlïÄððpðœðèñhñÀòò(òxòèó,ótô ôXô°õ0õlõÀö$öpöè÷T÷èø<øˆøÐù<ù„úú8ú°ûûŒüüdüˆüÀüØýýý8ýPýhý„ýœý¼ýÔýôþþ þ<þTþpþŒþ þ°þÄÿÿPÿ”ÿ¼ÿü8lÄà LœØ4d°ü<°ô4€¬LtœÈèœÈô<ˆÔ l´ü ” Ì ô   Ô  8    X  ð 8 t ¨ ä<,p˜ÌðŒX¤ôL¸ð4lÄ\€¬Ø$XŒ°Ü,X è0`ŒØ$ø4°(pŒ¨|,Ü€HÈt  Ä Ü!x!Ü"P"h#T$$Ð%|&4&|&ô' 'l((x)4)¨)ü*h*ì+p+À,,¨--˜-Ø-ð.4.¨//„/Ð00011p220233\3Ø4l4„4ì55`5¼66X6¤7,7d7¼7Ø7ü8H8¤8Ô9 9(:0:L:h:¨:è;;;0;H;`;x;;¨>Ø>ô? ?X?¨@ @œA$A€B BxB¸C0C€CœC´DDhDìE`FF¸G HhI$IÐJxKKÈLXM(M¸N<N¸O0OðPPQQÈRPSHSØT`TØU4UœVV VìWdW¼X<X¼YY ZZtZä[d[ü\\\Ô]D]p]à^^p^à_T_ _Ä_ü`H`Ðbc|c˜d d€e(e¤f$fàhh¬iÈjjkk|ll¨m8mÄnTnèoLoÀoìpLpxpàqhq˜rrprÜs8sdtt´ulvv¤v¼vÔvìww¼wÔxpxÜy8yÌzXzÀ{`{¨|h|ø}X}Ð~t~ü€ø€d€È ˜ü‚ˆƒƒ¨„„h„¼…<…؆T†È‡‡|‡¨‡Ìˆˆdˆ ˆü‰<‰¨ŠŠxЍ‹4‹°ŒŒ¸T Ž,Ž”@Ø0ì‘h‘È’\’¼’ø“l”•p•Ì•ø–H–¼—D—¼˜H˜ð™|šš0šHš`šxšš¨›0›ˆœœxpžž¤ŸPŸ¼ 0 °¡¡€¢¢T¢à£H£Ô¤<¤¥0¥¦¦X¦È§ §Œ¨¨T¨ä©8©¤ª4ªLª´ªÌ««d«¬¬¬L¬Ì­­­D­„­¬­à­ü¯8¯à°<°¸±(±¬²²x³³„³È´ ´Üµ(µø¶ ·¸¸¹¹¨º¬»»¼Œ½t¾h¿ÌÀPÀ°ÁÂÂÄÂäÃàÄxÄäÅœÅÄÆ ÆlÆœÇ ÇÄÈTÈøÉ€ÊpË8Ì(ÌPÌÌðÍÍœÎHÏϤÐlÑlÑ”Ò$ÒŒÓ Ó”ÔÔPÔÄÕ4ÕÄÖdÖÈ×4×ÐØPذÙÙÌÚ<Ú°ÛÛ”ÜܼÝÝÔÞtß,ß„ààˆáá|áøâLâÐãTã¨äpååpåÜæ|ç(çŒèè ééXéÐêlêÜëXëÌìLìÌíTí¸îlï ï¬ðð°ññœòò°òüóˆôô`õ0õÐö˜öô÷X÷ôø€ø”ø¨øÀøØøðùù ù8ùPùhù€ù˜ù°ùÈùàùøúú(ú¨ûDû\ûtû”û¬ûÌûäûüüü,üDü\ütüŒü¤ü¼üÔüìýýý4ýLýdýÔþXþpþˆþ þ¸þØþðÿÿ ÿ8ÿPÿhÿ€ÿ˜ÿ°ÿÈÿàÿø(@Xpˆ ¸Ðè0H`x°Èè 8Xpˆ ¸Ðè0H`x¨ÀØð(H`x¨ÀØð 8Ph€˜°Èà8Ph€˜°Èàø(@Xpˆ ¸Ðè0H`x¨ÀØð   8 P h € ˜ ° Ð è   @ X x  ¨ À à ø  0 P h ˆ   ¸ Ð è   0 H ` € ˜ ¸ Ð ð  ( @ X p ˆ   ¸ Ð è0Phˆ ÀØø(@Xpˆ ¸Ðè0H`x¨ÀØð 8Ph€˜°Èàø(@Xpˆ ¸Ðè0H`x¨ÀØð 8Ph€˜°Èàø(@Xpˆ ¸Ðè0H`x¨ÀØð 8Ph€˜°Èàø(@Xpˆ ¸Ðè0H`x¨ÀØð 8Ph€˜°Èàø(@Xpˆ ¸Ðè0H`x¨ÀØð 8Ph€˜°Èàø(@Xpˆ ¸Ðè0H`x¨ÀØð   8 P h € ˜ ° È à ø!!(!@!X!p!ˆ! !¸!Ð!è"""0"H"`"x"" "Ø"ì"ü##,#D#\#t#Œ#¤#¼#Ô#ì$$$4$L$d$|$”$¬$Ä$Ü$ô% %$%<%T%l%„%œ%´%Ì%ä%ü&&,&D&\&t&Œ&¨&À&ð'''('@'X'p'ˆ' '¸'Ð'è((($($($($($($($($($($($($($($($($($(@(P(`(|(˜(¨(¸(Ì(ø) )H)p)¸)ø*8*x*¤*à++$+4+L+l+|+|+|+|+|+|+|+|+|,H-L-p-¨-ô..P.œ.¼.Ü.ð/”/¬0000`00¸0Ü0ø11t1Ô1ì222L2„2È3 3 3T3¨3À3ä444d5x5˜5À5è6686`66´6Ü6Ü6Ü6Ü6Ü6Ü6Ü77<7p7Ì888d8à9L9x9”9¬9Ü9ð:0:D:X:l:€:”:¨:¼:Ð:ä:ø; ; ;4;H;\;ì4>x??œ@@ðAA¬BBˆCCdC°DHDÐETE¸FTFÈFðGG4GPGˆGœGÀGÜH4H`H”IItI”I¨IÈIìJJHJxJŒJ J¸JÐK LHM˜M°N4OOàOðPQXRpRÀS(TTœU”V$V˜VÀW<WØY\Z ZÀZì[<[L[`\t\ˆ\˜\¨^_P_`_Ô`Øb8bLcxcˆc˜c¨c¸càcüd(d<dPdpd„dÜdðe¼eÐeðff(fHfhfˆf fÀfØføgg8gPg`gxg˜g°gÀgØgøh h8hHh`h€hh h°hÀhÐhèii i0iHihii¨i¸iÐiðjjj j0jhjœjÐkk|kðl4lPldl€lÀmm`mˆm°mØmônn$n8nTnpnˆnÌooTo˜pphqq<q°qàrXr„r¬rôs`s´sÈt@tTt|t tØtôuu@uTupu°uÀuìv°w°wÔwðx x8x|xx´xÈyyPyhyˆz(zxzˆzØ{H{d{È{Ü{ô|d|||ü}€}˜~<~ä~ü<\°à€€P€d$h°‚ ‚h‚ÀƒƒTƒhƒ„ƒ „„`„ „´……h…€…˜††t†Ø‡‡‡0‡L‡h‡|‡Øˆ(ˆˆä‰D‰h‰|‰¤‰È‰ìŠŠHŠpŠŒЍŠÐŠäŠø‹<‹h‹”‹ÐŒDŒ¼|ôŽŽ4ŽPŽpޤŽÜ  Hl ¼ì(Hd„˜¬ÀÜ‘@‘d‘Ì’t“L“È”l•0•¤–t—4—à—ü˜˜4˜P˜„˜¸˜Ô˜ð™0™p™Œ™¨™È™èš š,šHšdš€šœš¸šÔšð› › ›4›H›\›„›¬›Øœœ(œTœ€œ¨œ¼œÐœäœø  4Hd€œ¸Ôðž ž(žDž`ž|ž˜ž´žÐžìŸŸ8ŸhŸ|Ÿ¬ŸÈŸä  4 P l € ° Ä à ü¡,¡T¡p¡œ¡È¢¢¢8¢T¢p¢Œ¢¨¢¼¢Ð¢ä££H£Œ£ £´£È£ä¤¤¤8¤T¤p¤´¤ø¥T¥p¥ˆ¥ ¥¼¥Ø¥ô¦¦,¦H¦d¦€¦œ¦¸¦Ô¦ì§§©0­<­<­P­d­€­”­¨­Ì­ü®®,®@®\®x®”®À®ü¯L¯h¯„¯ ¯Ì¯à°°L°”°è²€²ì³˜³è´„µDµµÀ¶Ø··T·¨¸¸l¸¤¹ ½´½Ì½ä½ü¾¾t¾¨¾Ð¾ð¿¿L¿àÀ@À´ÁÁˆÁ¤ÂÂtÂÜÃ4ÃÄÄ@ÄŒÄÐÅ@Å”ÆÆ€ÆüÇ|ÇôÈŒÈàÉ4ÉìÊtÊÜ˰Ì8ÌÀÍ,Í€ÍÔÎTÎÈÏ$ÏlÏØÐXШÑ8ѸÒ Ò(Ò˜Ó(Ó”ÔÔˆÕÕˆÕøÖÖ|Öü×x×ÈØØtØÀÙxÚ@ÚøÛ¸ÜhÝÝðÞÔߨàˆá4áØâdã0ãèähå夿hççÈè`ééÔêxëëèìŒí@îîÀï\ðññäòÌóüôÌõ´ö¨÷´øÀù¨úÀûtü,ýýÔþÌÿà¤l üøÄlÄ¬Ô < ô ä ôÔèØlP`„¨D|ØÌ¬¬ì  à!ì"°#Œ$\%%Ð&ð'¨(l)*,+ +¼,\--œ.\//À0Œ1D2$2Ü3Œ44Ü5”6477t8@9:<:ä;ˆ<@<ð=ô>Ä?d@X@ØA¤BœClDˆEHE¸FdGG¸HˆIdIðJ”KXKøLàM°NpOOÐP¼QˆRtSPT T UXUøV€W0WäXÐY¬Z [P\\˜]”^Ø`8a b(cd eXf(fÐg¸htiXj„kHlmn4nìoôpÌq`r<ssüu,uðv¸wˆxœy”z`{<|0|ð}ð~ì¼€t„‚Œƒ\„(…†@‡ˆˆÐ‰pŠD‹@ŒT(Ž<‘l’8“4”•@•ü–°—X˜X™ ››ääž ŸŒ d¡¡°¢p£L¤¥8¥ä¦p§§œ¨€©Xª ª¼«4«ä¬Œ­­È®h¯¯Œ°(°À±|²(³ ³˜´pµµ¨¶<¶È·p¸¹¹ôºÌ»È¼°½È¾ÌÀÁ@ÂÂÐÃäÄÜŜƀÇDÈ4ÉÉèÊ”ËËÜÌèÍÔÎìÏìÑÒ8ÓÓìÔÌÕ°Ö˜×dØPÙ(Ú°ÜÜÔÝtÞÄßÀààáèã äDå¸ççøè¸éHê8ëDì8íÀï4ðàòxó˜ô¨õ@õìö”÷$÷Üø€ùdúDúÜûpûøü€ýLýÀþ„ÿXÿää|œ€¨ˆôŒ„”   ( Ô D Ì H ü ŒŒÀH°(  LˆÐT¤ðd̬Ü<Ô`,´„@ØTì\ÌŒü h È!8"##Ô$ $|%%˜&&¬'d((ü)¸*d*¼++¼,@,ü-„..°//”00Ä1l2@2ä3p3ø4¤4Ü5P5°646˜7@7È8@8ð9t:4:x:È;<;´<<<|<Ä==`=Ø>@>€>à?D?à@L@ôA¤BB„BÄC,C¬D0D¸EXEÈFHFðGØHÈIÌJhK4KØL¤M,NN OdOÜP`PðQxR$RøSˆTdULUäVW€XdYY¸YüZ„[[t[Ü\h\ä]„^^€^à_8_ä`x`Àaa¨bb´c\cxcÄdXd˜d¸e e@eeðeðflføg ghg¼gìhDh¨iipièj°kk<kÌlxlÜmXmðnˆooœp\p¨q8qärTsstDtØuLuÈvpwwhw¼xTxÈypyÄz<z´{ {¤||€}T}à~xÌ€P€Ô€ÔD´‚Lƒƒ¬„„ …4…|††¸‡0‡ ˆ(ˆÐ‰p‰øŠ˜‹H‹àŒŒ0ÔŽ˜H´(¤ô‘H‘°’’È“d“È”@”ˆ••x•Ô–$–¬——x—À˜0˜˜™™T™èš8𤛛°›üœXœø\Äž žžôŸlŸð h Ð¡¡t¡ø¢X¢ð£ˆ¤$¤Ü¥¦`¦ä§„¨D¨¼©tª ««ð¬Ô­ ®4®¬¯H°$°¼±T±Ü²Œ³³t´´Œµ<¶¶Ì·x¸$¸È¹$¹„º$ººø»`»Ü¼L¼Ø½X½È¾¾t¾ø¿\ÀÀhÁÁÀÂd€Ã\üÃøÄ@Ä`ÅżÆtÇPÇœÇÜÈdÈüÉDÉÈÊ`ÊìËXËÈÌL̸Í͘ÍôÎdÎÌÏ Ï„ÏÐÐÐXаÐôÑ8Ñ”ÑäÒ<Ò”Ò°ÓÓ ÓÀÔ@ÔèÕxÖ0ÖÔ× ØDÙÙ”Ú$ÚÌÛ`ÛôÜ ÝÝÀÞLÞôßtßôà°á8áÜâLâðãtää¤å$åÐæDæÔçŒèè¬èôéhé´êêpêÌë4ëˆëÌëøìPì¼í í`íÐî8î˜îÄïÀðñ ò,óó ó8óPóhó€ó˜ó°óÈóàóøôô(ô@ôXôpôˆô ô¸ôÐôèõõõ0õ@õXõpöT÷÷Ð÷ðøø0øPøhøˆùtùŒùôú|úÔû$û˜üüPüœýýˆýøþÄÿ€0Ô¨Üô0„¬ì0|¸ì0Tl„¤ÄÜô $<Tl„œ´Ìäü,D\tŒ¤¼Ôì4Ld L´à 8 Ô ( ¬ ü l Ì l Ì < ˆ Ô$|ÜDl°ì$¬tÔpè Ð<À8ÔHÜD¸ ¤4 øx l\´€ôxdô h Ô!$!”" "˜"ð#\#Ð$t%˜&È'X'Ø(h(Ô)l) )È**<*|*Ô+X+¸+ü,H,¬--`-è.x.à/</ 00X11X1˜22 2ì3@3˜3È4$4À5 5\5Ð5üCÔÑ!!!ÔþoNþõ Ñü/ÑCüµ|ÐÙ #'#5Ð'STÙþ®ßßRýhh4Ð1Å 3#'73#'4]' ]'Åo††oo††ÿì¹3#3##7##7#537#537337#3å$]jiu'L&|'L&erly$L$}#0| }¹ÄD®DÓÓÓÓD®DÄÄÄþø®!ÿ‚.4;%#5.=3&'&546753#.'%5>54&'oi;emO $]!Ge`;[gO@243"þí8<¯CC9MÃ`sggna % 3_Ug 66iU7Fù '8±ð>1ZþzJ716ÿì[Å $02"&46"32654&%3#2#"&46"32654&ÇHcdŒedF)<<*)<;oBþuBÚHceEGddF)<<*)<;­dIEdeŒeF;*)<;)+;^ý'VdHEdeŒdF;)*;;(+;4ÿé}Å*3%#"&5467.54626=3#>54&#"'32Ò2 ;D\qE]/"dŽ\?2EljÙp&;Y$]]$Y;&2ÿöÚ ##5#5353ÏFÏÏF FÏÏFÏÏWÿmÀh 73#5>=#Wii#32#"& 3265+.@;!èwqrvvþäŒJFWYˆM0þŒ¯¹»ÓþßþÜ—f[Å#5>73#f>:Xù? .Rý;"ÿÅ632!!>?654&#"2ãe~–dA8uþ(Ro\`P<… Ïöt\„R6#B-Wu?47U9L© ÿéúÅ$"#632#"'332654##5>54&L9XÙesc@8ƒmÚXHHEN“% _OCxSEåh[l'ODexåMJKCK,A8AÅ %!533##5GþÕBAiiXÞª]¾þ4Oªù6þÊ#ÿéÅ!!632#".'332654&#"#ÜþÙ;Hfˆk)E-%XrHSTG):Q5ÅWÆ+ƒipŽ)/wXLO[%‚+ÿéÅ%4>32#.#"632#""32654&+"3G?#Qk X >.LQ:i_zƒeîòARR>=PJC^R3bW38‹‚O~ch‡‚SBD[WCGS.Å #67!5x‹^(|þÅJ þϪ¯ µW%ÿéÅ("&547.5462&"32654"32654‡z…Ò…y6*w¼w*spCC87D9„RQACSu:waz{av:"@1SjjS2@á=32=<24ìM|NM?>&ÿéýÅ##"&'33267"&54632"2654&ý"3G@#Qk X >.LQBÀzƒeïð=PJ€SRk^R3bW38‹‚O~ch‡MXCGSTAE[nÖ 7#5#5Öhhhhhh¤hhnÿm× #53#5>=#×hii#< hhþ\xƒ&&4-ÿ÷Ú75% -éþvŠÆEÏO¡¤O2oa!5!5þäþaFF¬FF2ÿ÷Ú5-5þŠþv EÏO¡¤OMýå#54>54&#"#4632#5ý%45%Z%54%F:I8Uolat³Z%.J1-9 /7%B00=#3?RJswhýëhh"ÿr·å5A332654&#"327#".5467>32#"'#"&546322654&#"™SZ @hÑžëØŸOrpr|ÒyTJB²Y¯ûVLn`BLF]œeT&¾A[6(?b:õþè#ŽX}¶êà C*k¸mb½C54&+ovaþ·(=Z-eF?}’´´/1>D?ãÐ^rÙ$;;p/Tèèþ³+49Eû0ÿé¥å4>32#.#"32673!".00GyLî+_^Wj{€mZ``!þõKwG/d2bjO4îNN¢Œ‰¡ejþß3Ni`Y›Ù3!2#'32654&+Y‹žŸŠ¼¬lppl¬ÙÂþ¬ÃRŠ‹ZeÙ !!!!!·®ýõùþdLúRÙRéRZCÙ #!!!·]éþt\Lþ´ÙRéR,ÿéÅå$326=#5!#'#"&54>32#.#"‰$9^]§Ù&#&=4&+#!2'4&+326 +q:>ð]Pks6+LCááJEh&0* ")8.IAC?þÆÙe^>RƒH6û<0ÿémå0%2>54/&54632#.#"#".'3V8N%†µ‹x~ŒX^WJY6B·JQ(>gA)KN8%X+U;*)S#0%…cswkGMD7*01`C9=. #7\<64QÙ##5!b]ð<‡ýy‡RRUÿé…Ù3#"&533265(]™€‚•]eUXdÙþn‚oþOOTJ…Ù!#33ˆdþúdÖÊcÙý—i¡Ù !# #333èf¨£f»h‰¢d¦†hWý©Ùý°Pý°P‰Ù # #33‡sÇÈqòq»¼ovþŠ0þÐvcþâ •Ù#33ƒ]þçsÖÐoþâ»þcGÙ !!5!5EþL¶ýÕ¶þfÙTýÍRR5R@ÿ,úÙ#3#úggºÙHüãH­ÿøÿìÙ#/í7íÙýíÿ,ÐÙ53#53ggºÔHHüS,I©Å3# #ÅI›EzyEÅþ„,þÔÿêÿPBÿ‚!5Bý¨~22Pçä#'‡`<•ä””*ÿé)4632327#"&'#"&54>7>=4&#"26=AÌad- #()T^O] -<$1&=8:<SEXeJ<6qªIFþÌ)? %(MTG& &(-0þÁI*^  -P,6ÿé Ù3632#"'#"32654&6S9ihx|hk;KåBPPBDUSÙþìV”‚ZCÍo¸ooY^pÿéÝ#.#"3273#"&54632×T@4DMNEkTp^k}j[m\7;ob]j~`k•‚œbÿéïÙ#5#"&54632"32654&ïJ"O6jz{fl5“DTTEBPPÙý'E1+™…}—Qþôp[\on[^o(ÿé%!3273#"&632!654&#"þ~+Sf#TvZn€ƒmJqþ€&T=?RêH(DiV`•›J@7,AYWÜ###5354632&#"WSFFA: : Dþ8ÈDY8?E5Rÿ&é("&5463253#"&'3326="32654&õ\|{db>M0_I\nUqT>#K!CNNDBLK—}€ž[LþJKeV*TJX_a2,ån^_mk^bmFæÙ4&#"#3>32#“C)@NSS%K8LYSk70aPþßÙþë0'MBþtBÿú–Ù#7#5–SSTýô Óiiÿîÿ&™Ù 3#"'53265#5FS  &SS ý‡mG'%ii:öÙ 73##Þk¶Ög±QSÙþUÞµþ©PÌÙD˜Ù#˜TÙý'ÙFú!3>32>32#4&#"#4&#"#FM"K4a,%H4IOT3.3HT3.3HT J/*P,$KGþwi27P9þ·i27P9þ·Fç3>32#4&#"#FM#Q:LZS:2@NT X70NAþtk/8aPþß$ÿéþ 2#"&6"32654&q}np}~oFPPFEQO•ˆ”••Mm¾mm\an6ÿ& 3632#"'"32654&6M;lhy{ea@’BPPBDTSÚæO^š„}—Nþï§o¸ooY^pÿ&ï##"&5463253"32654&ïS9ihx|hk32ATTTM$C( ÃJgþð _;3"ÿéË$732654&/.5462#&#"#"'z5E7C&+N]In¶bXf3<.3PNFucËœ/7-%" C>IWTMT+$# E:LZ³ÿéþœ#327#"&5#5353þV'14GGS Dþ™F+(ŒDAÿéâ !#5#"&5332653âK%P:L[S:2ANSI4,NA”þ/8aP) æ !#33[¸^Œ”^ þW©Ä !# #333*_je^˜\kdfgh^›þe þh˜þh˜Ù #'#373$µaƒ…_¹¯_~~^þñÉÉ ¾¾ÿ&Þ 3#"'5326?3„Zé)^ ±Y† ý†l KSþhÉ !!5!5»þÉEþV9þÜ Jþ‡IKxI+ÿ,Ù!#";#"&=4&'5>=463%$.R%.49",,"94ÙA'µEF&xµ'AE>§E< E ;F§>Edÿ, Ù3#d<<ÙüSÿ,Ù 5326=47&=4&+532#%RR%/4:!++!:4ÔA'µx%&xµ'AE>§E< E EK ü¶"#>3232653#"/&µ/571u5i'*bsNFKE%&?ÿÿÿÿzÿ3Î J À4ÿˆþt673#5.546753#.8`TjW*euue*XcT9XƒEÎþg tZmab “wz˜ ZYcV2<þm–¸UgÿéÙ53#632327#"&#"'>54'#53.54632#&#"“& ˆ3C;?!h(+*9J+†#580E8nQ"‰e5>,X„@M ,> 7+'RD'B8.%B;V.&(791![{ 1W9šFC…é'&%'#"''7&547'76327'"32654&å:5(<5)380 687,5:(;97,>?,+?>¾65391+;9-7575:7)42/É>V==*,> !Å#3##5#535#5333着ªX¬¬¬—ÍU¹³UÉb3M3¯¯3M3cþ¾Bþdÿ, Ù3#3#d<<<<Ùþo‹þo+ÿ+úÙ4?32654/.5467&5462#54&#"#".57654/¢=)+57ª1+27,kœaT5,&3 ’=0mkP.4'o¦II¡' E50&2&u"J12G33E`bO/70%"^'J6s)"4 H`*J0ó{'?=3m-<(d(Ë#5!#5†h hËggggÿóÿêïæ%0#"&54632#.#"327 #"&54$ 32654(!@(VlmXƒ#G -(9DE8Vþò<àᢚßþü¸·…¹8@$fi‚›2+]OHb|®ßž ß✞¢¼„ƒ½»†ƒ%/Mæ#-!5%#"'#"&5467>=4#"#63232'3265@þë"/1808DYC";~zTS.9%6b33_,++4,11 , l^³z /(-j’¶ 757757-˜jj5˜jjãYzSSSSyYzSSSS(V w!#5!(øFþNwþßÛ.ð8#5î8HHÿóÿêïæ#.9#&54574&+#32'3254&+& #"&54$ 32654ïO"†FÎþK#(=<àᢚßþü¸·…¹h/ -#%($ ¹½~"*C# Üßž ß✞¢¼„ƒ½»†ƒw.½!5.þî½FF—Æ® 2#"&46"32654/>YY@=YYfN87&(8®Y>@XZ|Y98&'87('2ÿõo ##5#5353!5ÏFÏÏFÏþ FÏÏFÏÏþ›FFFÅ"#6323!>?654&²$>“@R`?! åþÐ3H:;1 ˜F8R/ #:IL& / +BÅ%"#632#"&5332654&'춮&©.#?@K9GUFHO>,-*0 3@.)-,Ž@8;L=IJD.++&'3# $\P-ä3#¼q•<ä”Aÿ$  %#"'#"'#33265332 !S;h6$SS:1ANS-1? SSßèþ/8aP)þL)0ÿO Ù.546;####ÿan‚^ú9@R@ƒ^e‹@ü¶Jü¶ÿÿWã¿Kyÿäþ'ÿ*32654#"'73632#"'< ! . *& &)B9/NŒ%\8# +2"EæÅ #57>73#¨c6$ +>D.0þW(/Dæ!52"&546"2654&:þùƒDJK†KKC'--N-,b33„ZTOZZRQZ4@78@?79@ÿÿ.j“¶mÀ À=ÿìQÅ #57>73#3#%#533##= c6$ +>ã:þ<:¼Ì.CC>D.0þW©ý'x; þð5d™ªª=ÿìLÅ *#57>73#3#"#6323!>?654& c6$ +>Ë:þ<:$>“@R`?! åþÐ3H:;1D.0þW©ý'ˆ ˜F8R/ #:IL& / +ÿìQÅ%)47"#632#"&5332654&'춮&%3#%#533##=©.#?@K9GUFHO>,-*0 3@.)Á:þ<:¼Ì.CC>-,Ž@8;L=IJD.++&'3# $5ý'x; þð5d™ªªÿÿ`ÿ' "] Àÿÿœ#k¨¸$ÿÿœ#j¶¸$ÿÿŸ#f¬º$ÿÿw#|¯ª$ÿÿp#j®¥$ÿÿ´#z¨Â$ ¶Ù%!#!!!!!!#ÔþóUg+nþ`þ …þdŠÖÖÙRéRúR(_þ¡0ÿ*¥å7%2673!632#"'732654#"'7.'.54>32#.#"zZ_`!þ÷ &)B90M. 8XyÜ!4@Šr!ªª«q3=HFþYkbR"6$ f2zK–Œÿÿ*ÿéØ"ksôDÿÿ*ÿéØ"jsôDÿÿ*ÿéÏ"fpêDÿÿ*ÿé±"|qäDÿÿ*ÿé®"jpãDÿÿ*ÿéò"zlD"ÿéM0<C%3273#"&'&'#"&54>=4#"#632>3226=%!4&#"Ë01e%TvY:^ 8e;L\*FGf$vp TÊ€/\6IpýFZgG86&P@?Rê4K%iUa,':4TG&9$ N]ªR&,J@7p¸Qe  ,('-üGYWÿ*Ý5.54632#.#"3273#632#"'732654#"'á5N&j[mT@4DMNEkTt\ %*B9/N.  8=P,‚œb]7;oc]j^m!# +2!)%ÿÿ(ÿéÚ"kvöHÿÿ(ÿéÚ"jxöHÿÿ(ÿéÏ"f{êHÿÿ(ÿé®"juãHÿÿÑÚ"kêöóÿÿAÚ"jåöóÿÿÿùÏ"fåêóÿÿ ¯"jåäó$ÿéþç*4>32&''7&'77"&"32654&$-<8'';a$U4,%Ja(Z*F+"|â|íFPPFEQO@e<' (1-'(,/-%)#MLs>‡““Rm¾mm\anÿÿFç®"|táQÿÿ$ÿéþÙ"kmõRÿÿ$ÿéþÚ"jnöRÿÿ$ÿéþÐ"fnëRÿÿ$ÿéþ°"|nãRÿÿ$ÿéþ°"jmåR2Ø !5#5#5þ&hhhFF§hhphhÿâ##"''7&54632732654&#"?,}og<= B0~oeA:\î+?FPþéï)EFPÿGIm„•>EJGs„•AA¨þó0m_B· 4m_DÿÿAÿéâÙ"klõXÿÿAÿéâÙ"jlõXÿÿAÿéâÏ"foêXÿÿAÿéâ°"jnåXÿÿÿ&ÞÙ"jQõ\6ÿ& Ê3632#"'"32654&6S8ifz{ea@’BPPBDTSÚ¤ÿPœ‚}—Nþï§o¸ooY^pÿÿÿ&Þ°"jVå\ÿÿL#i¬$ÿÿ*ÿé"inàDÿÿ#x¬±$ÿÿ*ÿé¿"xnãDÿ3´Ù"&5467#'!#3#327 h8L3. KþçMcx7'H%0ÄpxÍ4*$:ÛÛÙý',6 - öLþ´+ÿ3T4?632327327#".5467&'#"&54>763>=4#"26=CËad- LH&*:1%9QaO]%(@5)1%u:;QEXeJ<6qªIFþÌ)?=7 - ,!( CMTG"3" N-0þÁI*^  -P,ÿÿ0ÿé¥#jÙ¹&ÿÿÿéÝÚ"jnöFÿÿ0ÿ饜#fÏ·&ÿÿÿéÝÄ"fcßFÿÿ0ÿé¥q#yÚ¥&ÿÿÿéݯ"y\ãFÿÿ0ÿ饟#gÚº&ÿÿÿéÝÜ"gg÷FÿÿY›ž#g°¹'ÿÿÿé²Ù#òqG›Ù #53!2#!326&+3YEEŠžžŠþæ]­kppk­«SCCÂþ¬ÃSþÿñCÿé-Ù!3##5#"&546325#5353"32654&î??JFbf|{ea@––SåDTTDBPO5ý¨;R‚|—N‹5Lþðn²nlY\mÿÿZeO#i²’(ÿÿ(ÿé"isàHÿÿZe‰#x±­(ÿÿ(ÿé»"xrßHÿÿZeo#y°£(ÿÿ(ÿé¯"yqãHZÿ3ŒÙ"&5467!!!!!!#327@8L3.þ=ùþdþs®7'H%0Í4*$:ÙRéRúR,6 - (ÿ4.6%327#"&54>?#"&632!32?54&#"÷&)(&"&)?L  (pƒmJqþ~01e%T=?RŸ)B,(0 - 0( “›J@6b4K%iAYWIÿÿZe #g¶»(ÿÿ(ÿéÚ"g|õHÿÿ,ÿéŇcfð @7 *ÿÿÿ&éÏ"fuêJÿÿ,ÿéÅŽ#xè²*ÿÿÿ&éÚ"xaþJÿÿ,ÿéÅq#yå¥*ÿÿÿ&é°"yXäJÿÿ,þÕÅå#îÿh*ÿÿÿ&éê#²¥JÿÿS„™#fÈ´+ÿÿFæ—#f2²K'°Ù!5%53!533##!##5°wþ,]w],,]þŠ^,øZZH™™™™FþLþ´úFæÙ4&#"##53533#>32#“C)@NS??S––%K8LYSk70aPþßX5LL5”0'MBþtÿÿÿö0i#|ÿñœ,ÿÿÿë%œ"|æÏóÿÿ R#iÿî•,ÿÿÿÿ"iãàóÿÿÿý*ˆ#xÿî¬,ÿÿÿñ»"xâßóÿ3êÙ"&5467#3327ž8L3.^7(H%0Í4*$:Ùý',6 - ÿîÿ3¾Ù"&54673#327#5r8L-(S 0#H%0TÍ4*!8 ýô*6 - ¦iiÿÿ_Çs#yÿì§,^± #±S ýô ÿÿdÿérÙ#-È,ÿÿBÿ&1Ù#M˜Lÿÿÿé ›#fض-ÿÿÿàÿ&ÿÏ&ïfÌêÿÿOþÔ’Ù#åÿg.ÿÿ:þÔöÙ#ŒÿgN:ö 73 #%#Þkþð0gþþS ÞÞþüþøØØ ÿÿF«#jÿêÇ/ÿÿ@«#jÿäÇOÿÿPþÔÙ#§ÿg/ÿÿ9þÔ¢Ù#ÿâÿgOÿÿPÚ'\µ/ÿÿDZÙ'\šOÿÿPÙ#y/ÿÿDÙ#yÞO(Ù 7!!573­««{þ(PP]–yLz÷R9M8uÔÙ 7#573’BBS??S¥3@3þ›92@2`ÿÿL†#jɹ1ÿÿFçÝ"jzùQÿÿLþÔ†Ù#Þÿg1ÿÿFþÔç#‹ÿgQÿÿL†#gǸ1ÿÿFçÛ"gtöQÿÿ.sÄ&\×QŒLÿ&†Ù%3#"'53232=#3.XMG @þvXe…Tüº58Q;1jý±ÙFÿ&ç#"'532654&#"#3>32ç &:2@NTM#Q:LZŒþmG'·/8aPþß X70Nÿÿ&ÿéæN#ià‘2ÿÿ$ÿéþ"ikàRÿÿ&ÿéæˆ#xà¬2ÿÿ$ÿéþ»"xlßRÿÿ&ÿéæ#}/¹2ÿÿ$ÿéä#}²R+ÿì¿å-4>325!!!!!!5#".7327&#"+(=RM'y>­þ°Hþ¸UþNCu(MR<'])94};;|59'dX‹T6XLRîRõRJ^5QˆZIn?' xex'@n(ÿéƒ*1%3273#"'#"&54632>32$"32654!4&#"01f#TvY„>?ƒq||q‡=e=JqýØŒPPFEQX&P@?Rê4K%iV`gg“‡†’j28J@7päm^`ml^a3GYWÿÿ]§œ#jø5ÿÿEKã"jÿUÿÿ]þÔ§Ù#äÿg5ÿÿ;þÔA#ÿäÿgUÿÿ]§œ#g·5ÿÿ1På"gUÿÿ0ÿémš#j®¶6ÿÿ"ÿéËä"jWVÿÿ0ÿémœ#f¬·6ÿÿ"ÿéËÐ"fVëV0ÿ*måJ%2>54/&54632#.#"632#"'732654#"'7&#'.=3V8N%†µ‹x~ŒX^WJY6B·JQ;wT&)B9/N.  ,YgX+U;*)S#0%…cswkGMD7*01`C(ED+ # +2"(%E€[64"ÿ*Ë@732654&/.5462#&#"632#"'732654#"'7&'z5E7C&+N]In¶bXf3<.3PNF4.&O&)B9/N. ¨œ/7-%" C>IWTMT+$# E:/N # +2"(%G ÿÿ0ÿém#gª¸6ÿÿ"ÿéËÝ"gTøVÿ+QÙ"32654#"'7##5!##632#"'¼ ! . * ð<ï &)B9/N‹%[‡RRýy7# +2"ÿ%œ/32654#"'7.5#53533#327632#"'B ! . &(*GGSVV &)B9/N™%S*$ŒDDþ™F/# +2"ÿÿQž#g‘¹7ÿÿÿéšÆ#Ú^WQÙ535#5!#3##xð<ï]eHÚRRÚHþ›e ÿéþœ#3#327#"&=#535#5353þVOO'14LLGGS DHF+(´HDÿÿUÿé…i#|Ëœ8ÿÿAÿéâœ"|pÏXÿÿUÿé…O#iÈ’8ÿÿAÿéâ"ilàXÿÿUÿé…ˆ#xȬ8ÿÿAÿéâ»"xlßXÿÿUÿé…³#zÆÁ8ÿÿAÿéâò"zjXÿÿUÿé…œ#} ¸8ÿÿAÿéÛ#}¶ÿ÷XUÿ3…Ù#"&5467#"&53326533279L"'9,ƒ–]eUXd]%44%H%0Í4)/ €pþOOTJþ4W9046 - Aÿ4  $327#"&547#5#"&533265â#*$'>J`%P:L[S:2AN ýô; -2+>1I4,NA”þ/8aP)ÿÿ¡›#f8¶:ÿÿÄÑ#fÂÿìZÿÿ •˜#f®³<ÿÿÿ&ÞÏ"fVê\ÿÿ •p#j®¥<ÿÿG#j ¹=ÿÿÉÛ"jZ÷]ÿÿGq#y˜¥=ÿÿɲ"yPæ]ÿÿGž#gœ¹=ÿÿÉÝ"gXø]Ü3##5354632&#"«SFFA: :ÈDY8?E5ÿé-Ù!533#632#"'##5"3264&YS––@ae{|fbFJ?$COPBDTTLL5‹N—|‚R;X5Äm\Yln²n0*Ù 0%2>54&+4+3%"5463!2#!#"3263J1>D?ãF’´´þ{=G~=Z-eF?vaþ·R1 R+49EûMèè!š1N$;;p/TB^r‚:OÿÿPpÙx6ÿé Ù "32654&!!632#"'BPPBDUSþÕ‡þÌ9ihx|hk;Ío¸ooY^pþ3ÙIËV”‚ZCÿÏoÙ732654&+332#!'¬Ô@RQAÔ]]¥–ˆ‚dþÆ€RR=@PhþêxfcËÿÙÿé Ù "32654&3632#"'#'BPPBDUSþÕS9ihx|hk;K]Ío¸ooY^p þìV”‚ZCËÿÿ0ÿé¥å &ÕÎÀ0ÿéíå(4>32632&#"#.#"32673!".00GyLŠHP _^Wj{€mZ``!þõKwG/d2bjO4O;ORNN¢Œ‰¡ejþß3Ni`ÿé.,"632&#"#.#"3273#"&54632”R T@4DMNEkTp^k}jTî>ER7;ob]j~`k•‚œÿÿ›Ù’0LÙ!%32654&+"5463!2#!#"3263g¬lppl¬¼{=Go‹žŸŠþçR1 RŠ‹Çš1NÂþ¬Ã‚:OOoÙ754!35!5!!".6;#"O´þtéþ·=Y-] 8'ãã'8Ú×ÔRý'+EF:.)-,6ÿé Ù "3264&#5#"&546325!5!&FSUDBPP£K;kh|xhi9þ̇Íp^Yoo¸oþ3CZ‚”VËIÿÿ&ÿ;$ A6ÀZeÙ !5!5!5!!5!þsþdùýõ®LRéRý'Rÿÿ/ÿé¥å'0ÿémå/".547&54632#.#";#"32>=3MQv<‚i‹x~ŒX^WJY_?XlC`%N8;U+X6Y\+GG&}1-lcswkGMD7.[RT.)+47Ji5ÿ&CÙ!!!!#"'532Zéþt\þ¤QH DL%RéRþG58Qÿ&Ü##"'53265#5354632&#"W &FFA: : DýËmG'DY8?E5R,ÿéå.326=#5!#'#"&54>32632&#"#.#"‰$9^[»þcþEgI>K57FÿéAÙ+#"&54&#"#3>3232>54&'7/714C)@NSS%K8LYI-F&5Hf1?';d+(/70aPþßÙþë0'MBþÕ/#1=+.t3&}; ªþPv:öÜ34632&#"73#:A: :Þk¶Ög±Qe8?E5þÐÞµþ©PÌMÙ #5333##|||T}}TSCCþ½Cþ­ÿö,â"273267#".' #'527.#76„*:ˆo»0!! z’`ƨ‹%6 !Ü$5_LMþFbþ\tMbR @ÿñÙ !#5#"'#"&533265332653S"K4a,%H4JT_/-3C_[3C_J/*P,$LFVýÕ27O: ýÕiO: ÿôÿ&†Ù33##"'532Le}Xiþ‡MG DL%ý¬Tý'OýD58LFÿ8ç3>32#4&#"#FM#Q:LZS:2@NT X70NAý¬3/8aPþß&ÿéæå #"&632.#"!26æÀ žÂ Á^‹pmýþ ‹ÔŒa¢ÖÓVÓÔ}•–|Fu‹Œ&ÿé ""2654&#"&63232>54'7…tŽèŽëÀ žÂÂ>lB @%k=“¥þò¥¤„Цþ΢ÖÓVÓ$$ 6+8]a$ÿé5w !"32654&7#"&63232654'FPPFEQO¸%\%np}~n8R Îm¾mm\an©+8VEg”••# &ÿéœê #"2654&#"&632632#4&#"…tŽèŽëÀ žÂÂqVT`SI^%&*X“¥þò¥¤„Цþ΢ÖÓVÓ8=gTýÑM5i$ÿ8  #"32654&#4&#"#"&632632FPPFEQOHT"'#4np}~nT8@>F@Îm¾mm\an]ýÇM'*I|”••))I0Ù#3264&++##"3263#"5463!2gÂCKKC±q[å]R1 {=Gƒlu‡DxD„]qþË‚:Oš1No6ÿ& Ü ""32654&'632#"'#4632&#"BPPBDTSÞ;lhy{ea@T>9 :Ío¸ooY^p‘¡^š„}—Nþï?9>E[ÿƒ†Ù3264&+#332#&=4&#¸ÂAIIAÂ]]ÐhxVI+q;=DxDþ®½Ùxqct:+o.IAC?0ÿémå0%2>=3#".546?>54&#"#>32G;U+X%8NK)Ag>(QJ·B6YJW^XŒ~x‹µ†%N;46<\7# .=9C`10*7DMGkwsc…%0#S)*"ÿéË$%3#"&546?>54&#"#>2326sXËcuFNP3.<3fXb¶nI]N+&C7E4œ³ZL:E #$+TMTWI>C "%-7GÙ 5!!!!5÷Ù þfÛÛ¶ýÕmTRþæþåRRÿîÿ&=Ü "2654&#"&4632327#"5i%%2%$2II29B& ž$$$#°IdHD8ýT'Gmÿ&þœ.5#53533#327#"'53265ª),GGSVV &+$ŒDDþ™£mG'QÙ4>7!##+"327#"?2Íï]+R16 {Z4+Rýy‡tOÿéÿÜ3#327#"&5#5354632&#"¨VV'14GGA: :^RDþ™F+(ŒDY8?Eÿ&QÙ#5!#327#"&ð<ïD HQmôRRý-;Q8UÿéX#"&5332653>54'ã%ƒ™€‚•]eUXd]X+8f þSn‚oþOOTJ Aÿéo‹#5#"&5332653>54'J%K%P:L[S:2AN]‹+8kþHI4,NA”þ/8aP) ÿÿÿü¶Ù 6êÙÀUÿé”Ù".5332>=4.'3N7MM(](('GF3 4)+l޳,aJ ýÎ - '=a?8ciDA¾Á¯Âÿô®Ù&'>323#.#"$  A-­Ösþç]³  iN  @þÝcþEþâ"ÿ&$!#"'5326?3632&#"µÀ)^ ±Y†r)^œýöl KU þhAl KGÙ3#!!5#537!5E¹MǶýÕÇW‹»þfÙTïCþÿRRCñRÉ 3#!!57#537!5»{SŠ…EþV„]•}þÜ J•C¡IKŸC–I ÿéEÙ7!5!#"'332654#52>Eþf ´,1›|øX ªQjí ÒµRTè +F,dyå—MAžK  ÿéEÙ3"3273#"&'454>7'5!! íjQª Xø|›1,´ þfÒ KžAM—åyd,F+ èTR ÿqæ '5!!#"32673#"&546ƇþÜ0“NEHHXÚmƒa®JI«K€CKJMåxeXc"ÿ6ã )#"&#"327#"&543232654&+57!5!,·aW=6Wb]Baa`\0aSH0þ܇“Pb &E"LBO40+;K«IJ"ÿÅ632'!!>7'57654&#"2ãe~‚W§(A8uþ(I_S¡'`P<… Ïöt\{O$MD#B-Wo|9"MB7U9L©@ÿëðœ#%#"&5332654.=#53533#ðx]hsO?H?H&66&GGSVV&66&«]c|nD^8:)5=.DD-"&D6ÿ&  !>54&#"#3>32Š#O'? 7*haTT=_NBW%FGa;' hþ²9$A6F"))ýó›æP;%^N1aSDB&ÿÿdÿ, Ù_ÿÿdÿ,Ù"_n_2ÿ,Ù33#3###535#53<ÖÖÖÖ<ÒÒÒÒÙþˆFfFþ½CFfFÿÿ|ÐÙÿÿYž#?¼'ÿÿYÝ#@Ä'ÿÿÿéõÝ#@,GÿÿPÿéÖÙ#-,/ÿÿPÿ&ÅÙ#M,/ÿÿDÿ&wÙ#MÞOÿÿLÿénÙ#-Ä1ÿÿLÿ&kÙ#MÒ1ÿÿFÿ&ÅÙ#M,Qÿÿ£#g®¾$ÿÿ*ÿéÙ"gpôDÿÿ"£#gÿð¾,ÿÿÿùÙ"gæôóÿÿ&ÿ鿣#gâ¾2ÿÿ$ÿéþÙ"gnôRÿÿUÿé…£#gʾ8ÿÿAÿéâÙ"goôXÿÿUÿé…·#jÊ"8qÈúÿÿAÿéâ!"qmd¾ÿÿUÿé…è#jÊ"8vÕÿÿAÿéâ‡#v˜£¾ÿÿUÿé…÷#jÊ"8gÊÿÿAÿéâ‰#gp¤¾ÿÿUÿé…è#jÊ"8CÃÿÿAÿéâ‡#CI£¾ÿÿ(ÿé H)ÀÿÿË#j®"$qªÿÿ*ÿé9"ql|¦ÿÿÂ#yª‹"$q¬ÿÿ*ÿé"qn\âÿÿ ¶g#qȪˆÿÿ"ÿéM½#q¨,ÿéúå-3267#536=#5!3##'#"&54>32#.#"‰$9^M $5kL\nÎn^_mk^bmýöX(4$@2,—}€ž[LþJ[3468TJÿÿ,ÿéÅ£#gè¾*ÿÿÿ&éÙ"gZôJÿÿO’£#g̾.ÿÿ:ös#gfŽN&ÿ#æå&"&5467.54632327"2654&†8L-)‹§Â ÁN–d0#H%0tŽèŽÝ4*"7Ξ«ÓÔ°e¦g*6 - p¥þò¥¤„Ц$ÿ#þ&"&5467.54632327"32654&8L.*\e~nq}qd0#H%0FPPFEQOÝ4*"8‘v„••ˆy“*6 - «m¾mm\anÿÿ&ÿ#æS#qà–ªÿÿ$ÿ#þ‰"qkÌ«ÿÿ ÿéE·#gœÒyÿÿ ÿqæâ"gUý2ÿÿÿßÿ&þÊ&ïgÌåÿÿYÙ#=Ò'ÿÿY›Ù#]Ò'ÿÿÿéõÙ#],Gÿÿ,ÿéÅ¡#v½*ÿÿÿ&é×#v‚ÿóJ[Dç!>54&#"#3>32º#O'? >#)k5__=_NB^#.S8d"+þº9$A6F"!*/þ!„×P;%^N,[EP.BÿÿL†¡#C ½1ÿÿFç×"CNóQÿÿ³#z¨b$@0vÕÏÿÿ*ÿé®#v™Ê§ÿÿ ¶¡#vó½ˆÿÿ"ÿéM×#v=ÿó¨ÿÿÿéè¯#v Ëšÿÿÿâ×#v—ÿóºÿÿ£#¯¿$ÿÿÿéÙ#¯ÑÿõDÿÿ”#±ö¸$ÿÿ*ÿéÊ#±µÿîDÿÿZe£#¯¿(ÿÿÿéÙ#¯ÔÿõHÿÿZe”#±û¸(ÿÿ(ÿéÊ#±¿ÿîHÿÿÿ{ú£#¯>¿,ÿÿÿzùÙ#¯=ÿõóÿÿÿý*”#±;¸,ÿÿÿñÊ#±/ÿîóÿÿ&ÿ鿣#¯=¿2ÿÿÿéþÙ#¯ÉÿõRÿÿ&ÿéæ”#±-¸2ÿÿ$ÿéþÊ#±ºÿîRÿÿ]§£#¯!¿5ÿÿÿ¹AÙ#¯|ÿõUÿÿ]§›#±¿5ÿÿ-ZÊ#±kÿîUÿÿUÿé…£#¯¿8ÿÿÿóÿéâÙ#¯¶ÿõXÿÿUÿé…”#±¸8ÿÿAÿéâÊ#±¹ÿîXÿÿ0þÔmå&6\°ý ÿÿ"þÔË&V\jý ÿÿþÔQÙ&7\§ý ÿÿþÔþœ'\ ý W ÿœëÅ'"#632'>54.''67654&ÿL9XÙes1b‡IÅ>£Š @[{%LCxSEåh[1O1{rJ(>WB\$) "K20<8Aÿ¬z("#4632'>54&''67654À'5VbOL`"F52\:8 #ZE9.Ja,Ð80PfXD(: #]4,$J "5E' )QÿÿS„£#gɾ+ÿÿFæs#g†ŽKÿ(GÙ!#"'5326=!5!5EþL¶ &þ)¶þfÙTýͽmG'JR5Rÿ(É )5!5!!#"'53265uþª9þ܇þÉE &KxIJþ‡´mG'ÿÿu#yª©$ÿÿ*ÿé«"ylßDZÿ1eÙ&32654#"'7#!!!!!#632#"'ä ! . 'ðùþdþs®õ &)B9/N…%UÙRéRúR1# +2"(ÿ/832654#"'7.54632!3273632#"'!654&#"š ! . 'esƒmJqþ~+Sf#TmT &)B9/N&T=?Rœ%V”z›J@7pH(DiR_1# +2"òAYWÿÿ&ÿéæè#qá+˜ÿÿ$ÿéþ9"ql|¸ÿÿ&ÿéææ#qç)—ÿÿ$ÿéþ;"qr~·ÿÿ&ÿéæu#yÞ©2ÿÿ$ÿéþ«"yißRÿÿ&ÿéæã#qà&éÿÿ$ÿéþ"qk\êÿÿ •S#q¬–<ÿÿÿ&Þ‰"qTÌ\ÿîÿ&™ 3#"'53265FS & ý‡mG'ÿÿ*ÿé DAÀÿé$ #4&#"326"&5463253327#"&'OF?HUC@D¤K„plZBS- #(+&JWySQxwÁšvzžPBþL)? %+$"ÿÿÿò# ñ) À6ÿé Ü ""32654&4632&#"632#"'BPPBDUSþÕA: :9ihx|hk;Ío¸ooY^pþ3e8?E5™V”‚ZCÿÿÿéÝ FüÀ ÿÖ× -%265.#"7#"''7&54632#.#"676328D-]ñ[mN800D0j[mT@4DMW)+-6 M,0I)*<6Il‚œb]7;obN0H  7ÿ&LÙ $"32654&#"&546323327#"5 DTTEBPPY"O6jz{fl5S"' ‹Íp[\on[^oþx1+™…}—QüÛ&GmÿéFÜ $"32654&7#5#"&5463254632&#" DTTEBPP£J"O6jz{fl5A: :Íp[\on[^o‘ý¢E1+™…}—Q›8?E(ÿé747>32#"&'332767'.#"(qJmƒ€nZvT#fS+R?=Têp7@J›þþ•`ViD(HDIWYAÿÿ(ÿé H)À(ÿé:5%!326%!&'&#"#>327332>7#"#"&'&¨þÚT=?Rþ…‚+Sf#TvZd?YE '    -*O=E#ƒmJqÖAYWH(DiV`>]ŒT r-EB^›J@7"ÿéË#%3#"&547&5462#&#";#"326sXËcuVAn¶bXf3<10>J+;@6E4œ³ZLV&%KIWTMT+$!5L6%-7ÿÿ$ÿéÍž"ÿéÐ:>732654&+532654&#"#>327332>7#".'&'#"'z5E6@;+J>01<3fXb[`7UE (!  -**">AVucËœ/7-%6L5!$+TMT0OT r-(SE:>K%&VLZ³!ÿéà(>32#"&547"32654&+532654&"az\p",*rcyoßG?GO6=;+5)01?ˆ…WI(5;-LZ„ÂYsm_-%6L5!$+ÿîÿ&æ 33##"'53265#53FSMM &NN ÔHþ£mG'#K1\|{db><9 0_I\nUÎn^_mk^bmýž^b2,—}€ž[S9>EþJKeV*TJXÿ& /"32654&"&54632>2&#"#"&'3326=CNNDBLKT\|{db<$> 0_I\nUqT>#KÎn^_mk^bmþ—}€žY#. H%þ¸KeV*TJX_a2,ÿé !326=#53#'#"&54>32#.#"vMb.`‰á,Lln‰$8^;]vV C?UVÿajUB=þàHVš|#HO;'ZR3,kÿã 254''47&'33".û `4 –ZZ–&47L0“#/(*/‰P^þ²Nþ¢`Š(F<+4 ÿè #/2632#4&#"#"&5467&"#>32>54&¤4:;5>`L2 (+<-.=^8)%.4Lb¡E-! ,??Af@’%6O)Zf)‘?.Y)T}ÃmG?3'1gÿÿFÿ3æ  K, ÀFæÜ4&#"#4632&#">32#“C)@NSA::%K8LYSk70aPþße8?E6š0'MBþtFÿ&æÜ%4&#"#4632&#">32#"'53265“C)@NSA: :%K8LY &k70aPþße8?E5š0'MBþmG'ÿøæÙ#5533##5#5–TSPPSKÙiiþ_ÔÔHððHBÿéë 327#"&5•'14 þUF+(Ð ú 3#3#53# îIIîRR Hþ„HH|ÅÙ"#>32332653#"/#&~/571T 5i'*T"sNFK2þœ %&þÙ]—Ù533##"54>5"«T˜˜T—?*("ÿÚþ‹Mþéq&$™R(Dÿ&ðÙ 3327#"DT& mFüÛ'GDÿqJÙ#"'732654#+57!#3!Yaƒm•5I7)EN“ þÜTT‡ cXexg.KCK«þ=ÙÍJÿÿFÿñú  P@ ÀFÿ8ú !##"'#"&533265332653úM"K4a,%H4IOT3.3HT3.3HTÈ/*P,$KG‰þ—27P9Iþ—27P9IFÿ&ú*3>32>32#"'532654&#"#4&#"#FM"K4a,%H4IO &3.3HT3.3HT J/*P,$KGþ mG'µ27P9þ·i27P9þ·ÿîÿ&ç3>32#4&#"#"'53265FM#Q:LZS:2@N & X70NAþtk/8aPþrmG'Fÿ&@3>32327#"54&#"#FM#Q:LZ& :2@NT X70NAþ('GmØ/8aPþßFñ ##3ñmëSlë ýôþc þc$ÿéþ 2#"&6."!26q}np}~M€N)þØN|N•ˆ”••ùRZ[QFNXX$ÿéä "3275&#3#3!5#"&6325!FPPF_&$nöÔÔúþ²7Np}~nN8JÎm¾mbÔb ŽL›L&••%ÿ÷·/%4.#"326=332>%4>2#"'#"&c-EA*‚x3:7,T/3(4ý¸,G|¢{G,$<=!`0.b^`ë:T1 qsIc9!ßß"85H5)JU=('=SL*Fh4ZZÿÿ9ÿ8¹È`ÿÿEÿñA  U† ÀEÿñAÙ 7>53#5#"'ETTTM$C( IJgÝý'_;3Eÿ&™ 7>53327#"=#"'ETTT&  ‰$C( IJgý¨'GmÌ;3Eÿ8A #3>32ATTTM$C( ÃJgþ(Ô_;3Eÿ&A327#"53>32ATT& M$C( ÃJgþ¤'Gmy_;3Tt 3#4 #4&'¨T T""®mm!%%Ee !4&'#54 ""T %%!mmþR6 #'##3254&+32ÉRCÍgËETø,@![1*‰‰[wHLÝÚÚ 0/#$+›ÿÿ6  ¶ À"ÿ(Ë0332654&/.5462#&#"#"'327#""X5E7C&+N]In¶bXf3<.3PNFucN/& k/7-%" C>IWTMT+$# E:LZL'Gÿ& Ü#"'532654632&#"´ &A: :^ý5mG'±8?Eÿ&Ü##"'53265#534632&#"W &FFA: :8DþŸmG'@D-8?E5þÚÿ& 4#"5632327#"5_: :A& 5E?8þ'Gmÿ&¹Ü &3265&#"4>324632&#"&'#"&S#(0#<"#M/8 31A: :"SGœVLg  *5 e8?E5ý‰ HpIÿÿþ´ W Àÿ&þœ#327#"&5#5353þV'14GGS DýÖF+(ODÿøÿé0 !#5#"&=#53533533#!326=âK%P:L[IISûSNNþ²:2ANI4,NAxHÔÔÔÔHW/8aP "ÿéF *#".5467#5332>54&'53Ö1?';d>Af9& ?1nÔH5%N4,E'5HÔ×&};54&'7Þ714SI-F&5Hf1?';d+(ÐþU/#1=+.t3&};54ßSNH×9þ܇þÉrB4+Ht &"_6)``KxIJþ‡->5    ÿqæ #"'332654+57!5!,YaƒmÚXHHEN“0þ܇ cXexåMJKC€K«IJ4ÿv )4&'#".54>32654+57!5!"3267&,Ya!%nI)</8  '“0þ܇Í##(-G E cX H /2&&*5   €K«IJþM$/åÅ"#632#>54&L9XÙesC8T_OCxSEåh[9fþ¶,A8A/åÅ.#"#&'.54632=H:CO_T8CseÙàJNA8A,þpJf9[håÿÿ/åÅ 4ÅÀ0ÿ+¥å4>32#.#"32673!".500GyLî+_^Wj{€mZ``!þõKwG/d2bjO4îNN¢Œ¿ˆ¡ejþß3Nh`1ÿÿ&ÿéæå&2ûkÿÿFÔ ™"ÿéà$#"&547&54632'";#"32654&ßnzcrVAp\~^ß3?10)5+;=6OG?œZLV&%KIW|/+$!5L6%-_msYÿé[ *326=#53#'#"&54>32632&#"#.#"vMb.`‰á,Lln‰$8^;c;N :V C?UVÿajUB=þàHVš|#HO;'27E533,kÿÿFè ¤ÿ&¹Ù!#54>323&'#"&73265&#"DSë/8 31S"SGœVLM#(0#<"#ÙiiüÄ*5  ýÛ HpI* ÿÿ:ÿ7ö N0ÀF| 333FTâ þ@Lÿ&FŠ $"32654&54632&#"##"&54632 ETTEBPOU<9 S9ihx|hgÍp[\onZ^pI9>EýS”‚/åÅ"#6323##5#535>54&L9XÙesC8mmTii_OCxSEåh[9fHððHX,A8A/åÅ.#"3##5#535&'.54632=H:CO_iiTmm8CseÙàJNA8A,XHððHf9[håÿéÙ #"32654&%!!5#"&546323 DTTEBPP'þÉEþ$"O6jz{fl5S!Íp[\on[^o?Jþ‡IE1+™…}—QÍIþ¥[ÿqžÙ+7#"'732654#+57!#5#"&546323!%"32654&äYaƒm•5I7)EN“ þßJ"O6jz{fl5S„ý–DTTEBPP cXexg.KCK«þ=E1+™…}—QÍJ p[\on[^oÿ ™Ù 7:"32654&"32>54##5!5#"&546323!354632 DTTEBPPÙ &"ISNHþõ"O6jz{fl5S†þÉrB4+HþV#Íp[\on[^oþ»   )6)``E1+™…}—QÍJþ‡->5'þ¢^ÿéœ1732654&/.5462#&#"#!"&5#53533#Öö2H&+N]In¶bXf3<.3PNFvbþõ05GGSVV6.$" C>IWTMT+$# E:LZ+(ŒDDþ ÿ&ïÜ#+#"'5326=#"&5#5353354632&#"#32˜ &s14GGS A: :S ^ý5mG'C+(ŒDY8?Eýª‹þ™ÿèœ7A#327&54632#.#"354632##5"'#"&5#5353"32654þV a.j[mT@4DMNFB4+HSNHP: YM14GGSÌ 7 Dþ™Fi‚œb]7;ob]j->5=6)``*+(ŒDþi   ÿ9àÜ0#"'532654&#"####5354632&#"3>32ßJF &:2@NT“SFFA: :à#Q:LZŒþ58G'¤/8aPþßÈþ8ÈDY8?E5RX70NDÿézÙ(7#332654&/.5462#&#"#"˜TT+ F7C&+N]In¶bXf3<.3PNFucŒ22Ùý¸&5-%! B>IWTMT+$# E:LZD-Ù !!3þÉEþT$ Jþ‡IÙÍIþ¡_ÿÿ-ÿÿ÷Ú/Z*…)™Z*)™wÈh!#5!#!#5!#ªFþâFªFþâFh‰CC߉CCÿ:Ü4&#"563232653##"&5g& C)@NSS%K8LYN'Gmþ(70aP!ý80'MBÿ&^Ü%327#"&=#"&54&#"563232653: :A%K8LY& C)@NS\5E?8¡0'MBØ'Gmþ(70aP!ÿÿ 0hKÿóŽ)™ÿÿ Ž0jÿóŽ)™  }u 3#"'53265#5F6] 66ïþeG. DDÿÿ&“ÊòUÿù“)™ÿÿ“ÂòUïòÖføë>=3327#"=#"'776 Y+Å0C±þz.G„&!ÿÿ(Sæ ¶\åÖfÿÿœßòZ)™ÿÿè;Ì\w)™ÿÿ1¶âÌ ÿÿ1¶²Ì' Ð W÷Àò #5433Àii#<÷xƒ&&4WÉÀÄ 3#5>=#Wii#<Äxƒ&&4WÉÀÄ #"=À<#iÄh4&&ƒxÿÿ•Cíò_<5ÀOC§ò "3"&546§$44ò,,4$#45ý"#>32#5>54&©2%9IEBK,$7>3+Ê6-JKC<%B u¢*%*5ý.#"#5&'.54632ü(/&+3>7$,KBEIg03*%*¢u B%î3#'#–!c&MN&î¯ÿÿ3>ïdM-ÀO3å3#'#t_`?QO@å–``O2å#'373Ò_`?QO@O–``ÿÿ‚LÊ­Qÿÿw.½qÿÿ\P-ävÿÿPçäCdþý¬ÿÂ#53¬HHþýÅÿÿÿt/ÿºqüýÿÿSÿ7$ÿËC=üçÿÿ#ÿ7ôÿËjÿÇüçÿÿgå"/qL"Àqg°å"3g~?"rÿÿzÿÿÒ®_!ñÀÿÿ{Ó±_,ý¿ •B’7533!5„FxþÉÛ··FFÿÿ •B’tM'À nB¦ %##5#53533ByFxyFxçyyFyy çB-!5BþÉ-FFU<Ü 332673#".;T(0; $<4ÜB" ‡@sdÛÌ#5ÛhÌhhOCÿò 2"&546"2654&§%34H44$$ò3%$34$#4,9ÿ3 "&54673327½8L3.F7'H%0Í4*$:,6 - e?Í23273#"&#"#>[X :Jd :-Í%%h&%16ÿÝN\ä3#%3#=q•<q•<ä–––êA:57332>7#"&'JE/# -*-NŒcK›N&r-£_ÿÿU·G™ID0 ÿÿÞ?Êt)™ÿÿ:‹rfOŒ)™ÿÿˆ1÷V˜)™ÿÿ;ã[Ž)™ÿÿ6ë5ÿú)™(Æ #!5ÆHþª üàØH(Æ #!5!5ÆHþªV üà3H¥(Æ #!5!ÆHþªV üànHj(Æ #5!5!ÆHþªV üà¥H3(Æ )5!3ÆþbVHHØHÿÿß^3!HHO_ýéHHßf#3!HHOþïfþôIÿÿÿ86ÿÎgüéÿÿQ. &qcqÚÿÿ1Ý.Å ÿÿ3ÿ7ÿçdM&Àÿÿ.ÿ7ÿçdÿûüùÿÿÿ#.ÿðbÿþýÿÿÿ$/ÿñcÿÿýÿÿLÿ8üÿçzÿýüõÿÿnçkÿÿÿn—'k°ÿkÿÿÿl’'jÿ¶ÿjeÿÿÿ ÿcCÿË|üþÿÿnAÖMA°í3##˜PHíH¥²í#5#5²HPíí¥Hÿÿÿ·°¤šÊ¤Àÿÿÿ¸°¥™È¥À ÿ8Bÿä53!53úHþÉH€d¬¬d ÿ8Bÿä!53BþÉH€H¬dÿ$Mÿí!'&/76?Mþò%33%h +00+!ÿÿþÉPÿšäCþ³ÿÿÿPÿàävþ³ÿÿþÇOÿæåfþ³ÿÿþ¸eÿòÍ|þ³ÿÿþÏwÿá½qþ³þ=us½!5sýʽHHÿÿþÂUÿïÜxþ³ÿÿÿ&dÿŽÌyþ³ÿÿþÑdÿÛËjþ³þä4ÿ}õ#532654&#"'632Û,, %(04F@ 2&$3ÿÿÿCÿ²òzþ³ÿÿþ´O3å}þ×ÿÿþÆOÿåågþ³ÿ1Lÿy#53‡HHLÅÿÿþìLÿÅ&­L­»þ=Nÿ¼ä#'##'¤`<•=`<•ä––––ÿÿþÂUÿï/#yþ³cxþ³ÿÿþÂUÿïÜ xÿþ1Àÿÿÿ)Gÿê ³þ³+Àÿ2AÿŠä 3#5265#ÎX/)-äI+/*ÿ,Aÿ„ä #3"&=|-)/äJ*/+Iÿÿÿ+Aÿƒä³ùÿÿþÉÿ8ÿšÿÌCþ³üèÿÿþþÿ8ÿÏÿÌvþ¢üèþèþßÿµÿÍ3#5#53“HH……3îSHÿÿÿþàÿÎÿθþ¶þ­Àÿ5«G½!#5#ËF̽þîÌÿw¸C‹ #0#53>54'%Ÿ-I‹+8pT ÿÿÿ ÿ&ÿxÿÕsþ¥ÿ$þäÿ8ÿÒÿÓ53533þäSHSÈHSSHþäÿ8ÿÒÿÓ##5#5.SHS-HSSHþäþàÿÒÿÎ ##5#5353.SHSSH…HSSHSSÿÿþXÿdÿÿªwþMþ}ÿUÿ&-'03#"'053265SS &-šmG'ÿ­ÿ&X-50327#"=0& -y'Gmšÿÿþòÿ[ÿZÿÃyþü÷ÿÿþ˜ÿ^ÿ¢ÿÅjþzüúÿÿþÁÿÿqÿÂzþrüÐþîþäÿRÿÄ 3+52505#þîd4.77Ðÿx8|þ9þkÿÿþeèÿw.qþIþqÿÿý9Þÿ‘Òÿ’ŽýCÿóh3#YLýœLhý›ýCÿÃÿóí3#YLýœLíüÖÿÿÿÿÿZÿ²¼þzþØÀÿÿþ–ÿPÿ¨ÿÙÊþwÿÀþ”þÔÿ™ÿÙ!!75#þ”þûÁ}'þûD}}þ‚ÿRÿ´ÿÅ4632632#4&#"#54&#"þ‚3%&'$3,,“%34$þÒ3ÿÓô ''7'7N __ `_ __ _óGHGGHGGÿ!Fÿ‰R5654&547w61%&h%%†", g7 ,  eÿÿý¨MåÓcÿÿþÉQÿšåCþ³ÿÿÿPÿàä¡ÿÿþ¨\ÿâÄ|þ£ÿ÷ÿÿÿ2AÿŠä³ÿÿþXÿäöþ—ÿìÿÿþ¿ÿVÿ[ÿöþ@ÿÿþÏQÿáÚÊÿÿþŒÿ/ÿžÿÙ&Ñü,ÑüÈÿÿþ¸ÿÿÿÖ&ÉHÉ»þòÿÿ‚ÿ£3#5#þò=S]WþSÿÉ#7&#"#>32733273#"ÉC+ :-!%'>1  :J‡4G%16@T%hÿÿþh4ÿ¢‰#yþ0ÿÐ#yþ’½|þcFÿÿþ‘=ÿË,#|þŒ_|þŒÿØÿÿýàÿ ÿÔÿÓG þýÔÿ þ”þÔÿYÿÉ #5'67&'ÿ9 4.8+ A þÔÊ, -19% 5 ÿÿþº!ÿÎîcþžÿÿÿ:Mÿ’ü¼'ÿÿþ¡3ÿÎ #yþ’ÿÏ xÿÝuÀÿÿþPÿÿQÿÛÝÿ~üçÿÿþjÿ#ÿ~ÿð‘þPÿÿþ{ÿ$ÿÿñ’þ`þÿ&ÿãÿ× 57'5%3#'#þýé¼¼K!c&MN&uJ:;¯ÿÿÿ;=ÿ“ì_ÿâ/Àÿÿþ½|ÿ%äyþJþmþäÿRÿ¼37''7'7þÈ/PQ5'./&4QPDT,CFFC,ýüÿÿ¤ÿÐ0Ib2>32#".1#"&54>32>7".#"2654&#"þW   & 2$  $2 &!  *    1   "8   8" \(     &M(&     þ¯"ÿ™ 37#7#þçA%–9?'™ eš_þ³ÿ9NÿÝ267>73"&'.'33232653#"/&²3C+WL**·,"C,317 =A™% *$FKE +); ?ÿÿþ³xNüUÀþÓþû+ÿâ 5!'7'7þÔäE%9YY9%E¨.?3@?3@ÿÿþ¨9ÿdDþ˜BQÿÿþ•:ÿJHþ†CQÿÿþã<ÿULþÊ?Qÿÿþ’:ÿHRþ…CQÿÿþ­:ÿL Xþ•CQÿÿþ´;ÿ^Fþ¨DQÿÿþ£:ÿVXGþšCQÿÿþ¸9ÿXPKþž:Qÿÿþm<ÿu PþS<Qÿÿþá<ÿA UþÇ<QÿÿþÌ:ÿ(AWþÇCQÿÿþ“:ÿIYþ:Qÿÿþ:ÿK[þ—:Qÿÿ1¶âÌYÿ>‹7j B‚ˆ@ˆÿ8ÿØ2>73#"=3å !1JL£*OQO,ÿÿnÿm× ÿÿsPDä¡dlM  3#'#5!#5²Za:SES žUSSSSÿÿå¦V¤¾ #5¾h hhÿÿÿØßä&#zÿeÿÿÿØ ä'%…¡ÉÿÿÿØ5ä&'sÿeÿÿÿêÿé"åÝÿÿÿØDåÒÿÿÿØÙä'¡É6ÿÿÿéÿø0ý"ãóFÿÿÙ$ÿÿOoÙ%R6Ù!#!6þ|`ä…ý{Ù5ÓÙ)3!ÓýbtöŽÐÙý{;ÿÿZeÙ(ÿÿGÙ=ÿÿS„Ù+&ÿéæå!5!#"&632%"2654&)þ°P½À žÂ ÁþŸtŽèŽ@R1¢ÖÓVÓÔ‚¥þò¥¤„ЦÿÿdÂÙ,ÿÿO’Ù.Ù3#3#tcxhÕÙý'uÿÿKùÙ0ÿÿL†Ù1AcÙ !5!!5!!5!Sýî9þg™IýÞ"†SþsSþaSÿÿ&ÿéæå2P€Ù!#!#!€^þŒ^0‡ýyÙÿÿ[iÙ3(^Ù )55!!!^ýÊìÊþtÊòÈU#RRþñþÙÿÿQÜ7ÿÿ •ß<°Ù%"&5463532##4&'>={¥¥|Q}¤¥{SoVWnþèVon_•}yžQQŸx|–_vVk þc r{ lUYqÿÿ‰Ù;4¶Ù%##5#"&5;332657Æ"^"zvZKWVWKZ‚«««laaþÉQAÉþ7AQ7þŸkb4ÙÝ!%>54&#"!53.546323!»;D.Žqm‡iMþø¤OZ»ŽšÂhT°þîL /MwAqš nc´#LH.¬eŠÌÂi®,Hÿÿ ˆ#jÿï½'ÿÿ •ˆ#j³½2ÿÿ0ÿóGä#–>ÿÿ'ÿöÜä"{BÿÿÿJòê#…Dÿÿ8ÿø+è"çFÿÿ2ÿòèý"`óR0ÿóG(4>353327#"&=&5#"4&#"3260 1S4o3H +%#_BäxRBJFŽHN!CJ9%FRþW E  8Nni[Àf2ÿ:øÜ)4>32#"&'#4&#"32654+53262*Q;_ihžo_;F!VH?4;)qAE¢2*?Gê7RE$dXw%ž_w$úè3?)jþªTJDˆJIÿ: #5&#"'4632 ¼V§ $.'v þìì˜F #7þÐ~$ÿðÙ-74632'5!! #".7";27>54&$v_ ÓŽþó¯   y… =A1ôFRPD/ %RòsŽ¢HHŠ%$/‰$8]ùgO[]]5Rb'ÿöÜ$%#"547&546732#.#";#"267Ü mgÖffpf ch LV;@@..?AHrXˆPB’_`Q?CO'%U/(;(/,(%'&ÿ>¸Î".5467#5!'654&&7L=+‰gàdq§­ED&L" .T6ŠÞBH<@ℎ.A7aE!#ÿJò4&#"#4#"'632632'š.>ŠX  $CaR[Xn{ßÿlLHþ¸6SU.v8ÿø 7327#"&53 .,<@XˆQHE‡<ê !##373êl¬>XXÐrÆ <Î ÒÒÆÿôÚ".#76323267#".' #Õ  6 !$¦0!! z’`') R !0:þJFbþ\<ÿ8à"&'#332676=3#5+6XX 8)*=VP; "üÎÚx##*17jÜýú>%%ÿÿ æ Yÿ>¹Î/%2'654&+".54>7.5467#5!#";#"jI'J#&8Ca1'3"6D, dt¦*@LXRnJd^F*C=^V"!78.H) K9+HFFT0+E@RxDÿÿ$ÿéþRÿüR %27#"&5###5!#$ 0.,ì^G(@@ >0FTþ:ÆFFþ®2ÿ8"4>32#"'#2654."20B>!r‚>D+Gc5Xð>\11410/1=_8% wlm&Gþû\l8Q)*RpR*"ÿJ&4632#4&#"'>54&'.'."Œtc|[JB01(H;/H@0Z -(FI2.9vŽu_@F'L4.B%  -<,n P %p"ÿôN4>32!##"&732654&"",KO,ˆ@qsZ[=IOL˜LMo9RRf{•”|k[lZVprÿüØ "&5#5!#3272I1¤ÄÈ! #CQ3IIþÕ+O 2ÿòè 7327>53#".53Š1S<# XjnEZ.XèbHD<$þº~V:H7F.ÿ8¹ #"&5467;32+#54&+3267yZF*3CiNXy›†n X]OK] –nZŠ$D!d;NiŘzn–¾¾Ohþ•f ÿ,<+"&/#.##56323327<$=a¸hê•   B ƒ™`Ã$È 3&ÅþîhN<ôþšû$*ÿ8l %##5"&53332653luVt‚ZGUVUGZÖllÆÆjn6þæYQ²þNQY$ÿ÷À'%2>54'7#"'#"&54673>=3œ.4(4lP*F$<=!`0.b^`<4Pl3:7,T™"55H/”u"­NFh4ZZj<¸)lIc7 ßÿÿÿßÿø¾"jÁóFÿÿ2ÿòè¾"jhóRÿÿ$ÿéþè#Lÿÿ2ÿòèè"qRÿÿ$ÿ÷Àè#îV6ÿô-Ú0"34&47676323##".'33265C#ªâs,! CC 1L24N, P>-AI’GSJ—iþ¸¯C• " 3'@*#HAeX8 &8SG+;^@v–4Éå 052>32&#"#54.'&4Df>! •PK> '&'@2&`.&-…`3ZQ3^³E$. 9\¶x¾¾ETp_+4ÿÿ ƒå"—ÿ]ºÿÿ4É #j„Õ]9ÿ8¹È!463532##5"&73"4&#269ˆŒXzš?nJXzšTa_b^Ø_ae[u™´´—y8^M+¾¾—xSk|oOSkþ„i$ÿ÷À+%2>54'!3>=3%##"'#"&5467#5œ.4(4Nþ§M3:7,T#>#$<=!`0.b^`!>™"55H/€ee€Ic7 ßžF0y6Fh4ZZj(„3Fÿ(  2733#"'5326=&5#7654&# †”™cgjÏ &Æ”h:”ka Tc·}NqºmG'O–³F³c8*ÿï0!>3273327#"&5#7654&#"Z1;O™cgj-#/,6]1=O”h:”%.+º(9_eµ}NF9ÿF.4>32#"'3263"#"&572654."90B>!r‚>D+Gc54)-1'-Dmð>\11410/1=_8% wlm&GR4Rl3[\l8Q)*RpR*ÿÿ&ÿéæåa0ÿô%"4>3"3#ä 1S4CFFBN!CJ9%LVLBJVÿÿP[•&|CرÿÿP[ˆ&|j´½ÿlÎÙ2+53254+##5!#)J[ 54Rc9Bî]ÇêÅÆWEþÖ,? BBK9þŒ‰PPÃÿÿP9”#jаz0ÿé¥å .#"!!32673!".54>327^W^x lþ’gZ``!þõKwG/0GyLî+÷NN‚sR~“ejþß3Ni`12bjO4îÿÿ0ÿémå6ÿÿdÂÙ,ÿÿŒ#jÿêÁ,ÿÿÿéªÙ-SþÙ(!#0#52>=!32#'2>54&+á,F.%“ua 1>M@µ‡{Ch‚_T,^!DNteG¨þÆtY^rR+48FûSÌÙ!!#3!332#'2>54&+áþÐ^]1]Œ|…w` 1>M@¤Lþ´ÙþÅ;þÆuZ\rR+48FûÎÙ2#4+##5!#)J[]Bî]ÇêÅÆWEþÖ;9þŒ‰PPÃÿÿPn”&jª°ÿÿPŠ”#Cé°ÿÿ [ˆ#x¬ŠSÿy…Ù !#5#3!3”Pñ^v^‡‡Ùýy‡ý'ÿÿ‹Ù$þPpÙ%#!!!3 4.+32>p-Y=þ·éþt´] 8'ãã'8Ú$FE+ÙRÔ×.*,þñ-ÿÿPpÙ%P9Ù3#!!­]éþtÙR"ÿy Ù%!!>=!3#5!#5KþúÎE*Â[Pý¸PR5hþÓv ñÙ¥ýqч‡ÑÿÿP[Ù(ö Ù # 333 ##–þânEþåtî]îtþåEvþê]Dþ¼wbþÌ4þÌ4þžþ‰Dþ¼0ÿémå1%2>54&+532654&#"#>32#".'3V8N%`ClX?_YJW^XŒ~x‹i‚(>gA)KN8%X+U;*).TR[.7DMGkwscl-1}9=. #7\<64PŠÙ 33##PX}eXþ‡iÙý¥[ý'VýªÿÿPŠœ#xÆÀPnÙ 3#33 #­]]1oþ§z|þ»ÙþÎ2þ§þ€M!ÿöRÙ!#52>=!#ôþú,F.%Â^‡RDj„aV-^"FPvgG©ý'ÿÿPþÙ0ÿÿPÙ+ýÿÿ.ÿéîå2PÙ!#!##þ‹^1^‡ýyÙý'ÿÿP^Ù3õÿÿ0ÿé¥å&ÿÿQÙ7 [Ù3#733ìqòq¹¸oôåþ…{0-Ù$0<032##5".54>;532>4.#"Þ &CcF3'?6K._.K6?'3FcC& _0H5''5H0_0H5''5H0|7jH6W8( ^^ (8W6Hj7]ý×%JdJ%þ†z%JdJ%ÿÿ‚Ù;ùPÿyÄÙ %33#5!3#^CPýÜ^R‡ýqчÙýy8"Ù#"&53;3#ÅèMX]Lä]]\A)þÅ9tý'PîÙ %33!333ÎÂ^ýb^Â^R‡ý'Ùýy‡Pÿy1Ù)333333#áýo^Â^Â^CPÙýy‡ýy‡ýqÑÙ 3#5!32#'32654&+ûçD¥–ˆ‚dÝÔ@RQAÔ‡RþêxfcRR=@PPÙ %#!33232654&+#p‚dþÆ]¥–ˆþ=Ô@RQAÔm^âcÙþêxf“R=@Phý'ÙPpÙ %#!33232654&+p‚dþÆ]¥–ˆþ=Ô@RQAÔâcÙþêxf“R=@P*ÿéŸå 3267!5!.#"#632# Š`Zgþ‘l x^W^_+îLyG0/GwKþõ! je“~Rs‚MOî4Ojb21`iN3!Pÿé»å#"&'##33>32%"32654&»»Ž•±v^]y«ž¯þ³r|}rq~|ažÚÁ¢þ´ÙþÅ—°Ñ¢þ좡‡£^Ù 463!###"&6;5#">vaI]oþëneqQ7>53"32654&w,oq}np}$F2?)/J1%S(:“FPPFEQOÕF•ˆ”•„L„€U  ( N=m¾mm\anFÔ %4+3265'4&+326'2+y[„„*1.;bb;.DRFE2.TGó¡F›+$Ý,Ž)°P4Q"5!3#5!#573#W0"S@FþnF­Ý¬@÷Ðþ4¸xx¸ t;àÿÿ&ÿéÿHþî 73#'#5#'35£ÀkòjáSájòkÀ ÉÉúþîââââúÉÉ$ÿéÍ#732654&+532654&#"#>2#"'|5E6@;+J>01<3fXb¶nAVucËœ/7-%6L5!$+TMTWIK%&VLZ³Fñ 33##FTëlSëm þcýôþcÿÿFñ»"xvߟFä 73#'#™Ô`ûjáS ÔÔúþîââ ÿö¿ !##0#52>5lST¬ !2  ýôÀb%F$ 33###Fh‡‡hT‚2‚T þºFýôkþ½Cþ•Fè 3353#5##FTúTTúT ××ýôééÿÿ&ÿéRFç !###F¡TùT ýôÀþ@ÿÿFÿ&Sÿÿ&ÿéäF$˜ !###$tT Lþ@Àÿÿÿ&Ï \ñ&ÿ&;¢&2632#"&'##"&5463253"32654&!"32654&Ø-dflmd1>#S?5egke^1Sƒ@CC@CFFþdCBBC@CB½^˜†•#+þï-&ƒ†™^åÕl¾ll\`nm^_lk]amÿÿÍ [ôFÿˆ$ 33333#5FTùT=F þ@Àþ4¸x0¬ 3;53#5#"&50T"šTT—;V Å÷ýôÉB9Fn %33!333„–TýØT–TLÀýô þ@ÀFÿˆª )333333#dýâT–T–T32#"&'33267#53.#"*m[j}k^pTkAMãà I:4@\\cœ‚•k`~^TMIP;7FÿéÑ#4>32#".5##3%"32654&ú 1W7q}n7W2! ^TTJFPPFEQO51D8'•ˆ”&8H>é ×™m¾mm\anÙ 4>;#5##7.7;5#"F!@,øTEËgÍCR[[‰‰*1w/0ýôÚÚÝL=F›+$ÿÿ&ÿéÿä&œCrÿÿ&ÿéÿÌ&œjyÿ]Ù'4&#"##53533#>32#"'5>5²B*BKSTTS«« *;#KZ7PP 5{\70bNþíT@EE@Ÿ!JDþì?k@#(|\ÿÿF|È"jäš&ÿéä%#3273#"&54632#.#"3_âMAkTp^k}j[mT@4:I ßèT^~`k•‚œb]7;PIÿÿ$ÿéÍVÿÿFÿúšÙLÿÿ Ä"jåùóÿÿÿîÿ&™ÙM  72>=!32+##%#32654&SqmkaFö¬'B8||:81P,‹ŒyÖCXEVÀaŒ6êž,+(F1 !#5##335332'#32654&ŠöúTTúTqmkbk||;72éé ××ÖBXEWêž.))Ù4&#"##53533#>32#²B*BKSTTS«« *;#KZS\70bNþíT@EE@Ÿ!JDþ‚ÿÿFäÄ"jAà¡ÿÿFñÉ#CšÿåŸÿÿÿ&Ï»"xDß\ñFÿˆè !#5#333:F®TúTxx þ@ÀýôŸÙ!#&53653653#&'6fKpdFGPRdFGPRd)EB&f[38~‚Ù¹þꉕ´¹þꉕ´oß¾@˜Ó½¤ 3#&3653653#&'ü^ŽRkdRkdR‡^C#"á+ÁïÛÕÁïÛÕþâîjwyÿÿ<¾Ù5ÿÿ*ÿ8l U0ÿéðå #"&632.#"!26ðÀ žÂ Á^‹pmýþ ‹ÔŒa¢ÖÓVÓÔ}•–|Fu‹Œ&ÿé 2#"&6."!26q}np}~M€N)þØN|N•ˆ”••ùRZ[QFNXXÿÿŸë'Õ{§'Ö*Çÿÿ© 'ÕúÿÜ'Ö©7ÈÿÿŸ„' _ÁªÇÿÿ¤Ù' _AÿÿÈÿ$À''#7'57'573Àœ@‰87;ˆœ?ˆœK7MCÉC²ºBÈBëôþ„cÿì 53353#5#þ„HØHHØc’C’BÿÿþþU+ܱ<ÿÿÿ`ÿª¸‡´üÆäÀ@ÿÿÿ fÿ°¿‡³ð4@Àý×Cé"#46323".þ}' @[QJFN (N>~— '$I]!)!; ÿÿýÿ† Y& ]' ]Dÿy' ]þºÿy' ]Íþ3' ]Füî' ]üf' ]þ»üí ]þ3þ3üýÿUk "/<IT_3#5265##5463"37'654''&5477#"'7327''7632&#"#"&5335532#4&#þüX/)-YX/)-É?3 ýà?3 >4"   >4" ýI+/*\I+/*JI+/*\I+/*üø>4" ž>4" ý¡?3 !?3 þX/)-ZX/)-PÿyÍœ 332673#".333#5##Ö;U(0; $<4‡X}eCPKþ‡iœB" ‡@ý¥[ýqчVýªFÿˆ-» 333#5##332673#".FTël7#!#53533#32&]vaþ·YY]\\´öÏ1Mû+4^rFxxF|è %4+3267#!#53533#32[˜˜)2[UFþù>>THHvph™N›* CS~FHHFKLP^Ù 654&+327'7+#!2ÞKCÂÂ62L$0å]-lu<:2°!6a@TM;lhys7U^po¸o@2ƒ?2CNþïæO^š„P993#!53!­]Œ]þtÙ`²Fmu353##FÓTÓT iµþ@ >Ù 3###535!!²jj]KKéþtíFþY§FìR ~ 5!#3###5H6âDDT>HÄLxFþþFPÿR9Ù3#!!32+532654&+­]éþt¬\]]\40+55+¨ÙR²fZþýZfR/-'-/Fÿq« 26=4&#"#!#>32+ì)C$*=3T'ÓA9I>YLF079.[Vd L¹0'IFÏBM ÿyÙ%3#5### 333?@Pþâ]þânEþáxî]îxþáJчDþ¼Dþ¼wbþÌ4þÌ4þžÿˆ* %3#5#%#5# 35373àJF!þþSþþg0þðkÞSÞkþð@¸xØØØØÞÞÞÞþü*ÿ3gå:%#"'53254&'.'332>54&+532654&#"#>32g€v6L80%H!u„X+U;8N%`ClX?_YJW^XŒ~x‹i‚È\x "7*4 - 6% €t64*).TR[.7DMGkwscl-1"ÿ3Ë2732654&+532654&#"#>2#"'53254&'&'z5E6@;+J>01<3fXb¶nAV_S6L80%H!£œ/7-%6L5!$+TMTWIK%&VDX%5*4 - 6&¢PÿynÙ%3#5##33%IP,þ»]]1oþ§JчMþ³ÙþÎ2þ§Fÿˆä %3#5#'#373¤@F$áSSÔ`û@¸xââ ÔÔúP™Ù'#375373#%#Ý0]]0Fõxþ“vtþþF)þ¼ÙþÅ*‰MÕþÆRþ³Þ?F 7'#375373#'#Ê1SS1FgkÒòg‹F¯)Ø Þ1k%gÉqÒt* ¢Ù3#3 ###5353¼``kxþdŸnþˆ]UU]oF‹;þžþ‰Dþ¼)Fjý 533#73 #%##5ASGGÞkþð0gþþS<Þ..FjÞþüþøØØ˜F>Ù #5!3 ##ûçDkxþdŸnþˆ]‡RþÅ;þžþ‰Dþ¼ˆ #5!73 #%#̸ Þkþð0gþþSÀLÞÞþüþøØØPÿyÄÙ%3#5#!#3!3CPQþ‹^]v^JчLþ´ÙþÅ;Fÿˆ$ %3#5#5##3353è32+9)C$*=3TùT¡A9I>YLF079.[VdÀþ@ þû0'IFÏBM0ÿŠ–å%0".54>32#.#"354632##"26=4&kIsC,0GyLî+_^Wj{uiX48UuF^‘1-3Ni`12bjO4îNN¢ŒŠ á-R>9¥:[`à é5£ &ÿ‹Þ("&54632#.#"354632##"2654&ëWnj[mT@4DM;3J6,GWHT+%# •}‚œb]7;ob]kW,;1=>\`#"X2(0ÿ3¥å,#"'53254&'.54>32#.#"32673ÑL80%H!Hm:$ 0GyLî+_^Wj{€mZ`` é5o*4 - 6&CUlL"2bjO4îNN¢Œ‰¡ejþò$&ÿ3ä'#"'53254&'.54632#.#"3273jL80%H#Xfj[mT@4DMNEkT\N7o*4 - 6&‘q‚œb]7;ob]j~Vh $ÿyQÙ %3#5##5!#bCPPð<ïJч‡RRÿˆƒ 73#5##5!#ó32'Y8?R01f#TvZj~PN3*$+: " c0L0# .MSW4K%iV`‰xU>9A-'!%+m€&=0G"*ÿ3mõ9C#"'53254&'.5.54632#4&#";6763 !32673.#"L80%H!6_Y4fgM?7APC0ISŒ,ýè{jW^_(Í5d &C-Vuo*4 - 6&+X luSN];7 4*6BsKUþ›Œ¢MOÝ$ !-9"f[&ÿ3;B#"'53254&'.'.54632#&#";>32!3273!4&#" L80%H#UdPN3*$+: " c0L0# þ~01f#TeL6ì'Y8?Ro*4 - 6'„jU>9A-'!%+m€&=0G"4K%iM_#fMSWP®Ù#®^Ùý'Ùÿÿ ˆ#x¬}ÿÿîº#xÔÿÞPÿRÙ2+5326=4&+#33«\]]\40+55+ú]]kxþdwfZ¥ZfR/-É-/þÛÙþÅ;þžFÿqâ %4&+#37372+5265qC)lSSÞkþðMLYYL)CY70À ÞÞþüMBzBMI07 ÿy˜Ù!#52>=!3#5#óþú,F.%ÂGPU‡RDj„aV-^"FPvgG©ýqчÿˆô !3#5##0#52>5dS=FK¬ !2  þ4¸xÀ0)CXDG.PAAqQDPÿRÙ!!#3!3+5326#þ‹^]v^^\40+5Lþ´ÙþÅ;ý9ZfR/Fÿqè 26=##3353+)*AúTTúTYLF07Èé ××ýôBMPÿyÈÙ!#3!33#5#$þŠ^]w]GPTLþ´ÙþÅ;ýqчFÿˆ% 33533#5#5##FTúT=FKúT ××þ4¸xéé<ÿy&Ù!#535#"&53;3ÖPCÔ\]]5+Ð]‡ÑºfZþÙ-/ƒý'0ÿˆ¬ !#535#"&=3;3aF=AZTDTx¸LC¾»FýôPÿyEÙ!##333#5#ÙbÏXØÔGPOcýÙý…{ýqчcFÿˆa 333#5###Fh‡‡h=FK‚2‚T þºFþ4¸xkþ½Cþ•ÿÿP®Ùÿÿ‹¨#x¬Ìwÿÿ&ÿéÞ"xn—ÿÿ‹ˆ#j®½wÿÿ&ÿé¾"jpó— ¶Ù%!#!!!!!!#ÔþóUg+nþ`þ …þdŠÖÖÙRéRúR(_þ¡"ÿéM.:A%3273#"'&5#"&5467>=4#"#632>3226=%!4&#"Ë01e%TvYˆ88e;L\s‘3$vp TÊ€/\6;W1ýFZgG86&P@?Rê4K%iUak:4TGQN N]ªR&,&9VL0¸Qe  ,('-üGYWÿÿP[¨#x¦Ì|ÿÿ&ÿéÿÞ"xrœ/ÿé¥å #7326?# !654&#"#632› &C-Vui/GwKþÔ{jW^_+îLyG0ü!-9"f[h1`iN3eŒ¢MOî4Ojbÿÿ ÿéùœÀÿÿ/ÿ饈#jµ½'ÿÿ ÿéù¾"jpó(ÿÿ ˆ#j&½}ÿÿî¾#jÜÿóÿÿ0ÿémˆ#j®½~ÿÿ$ÿé;"jJóžÿÿ ÿéEÙyÿÿ ÿqú 2ÿÿPŠg#iǪÿÿFñ"ivàŸÿÿPŠˆ#jɽÿÿFñ¾"jxóŸÿÿ.ÿéîˆ#jì½…ÿÿ&ÿé¾"jwó¥ÿÿ0ÿéðåËÿÿ&ÿéÌÿÿ0ÿéðˆ#jâ½7ÿÿ&ÿé¾"jmó8ÿÿ*ÿ韈#jµ½”ÿÿ$ÿéâ¾"jQó´ÿÿ [g#ižªŠÿÿÿ&Ï"iTàªÿÿ [ˆ#j ½Šÿÿÿ&Ͼ"jVóªÿÿ [·#}áÓŠÿÿÿ&ëí#} ªÿÿ8"ˆ#j¡½Žÿÿ0¬¾"jXó®Pÿy9Ù 73#5#!!­CPPéþtJчÙRFÿˆ| !#3#5#F6â=FK Lþ€¸xÿÿPˆ#j½’ÿÿFl¾#j¶ÿó²0ÿémå1%2>=3#".547&54632#.#";#"G;U+X%8NK)Ag>(‚i‹x~ŒX^WJY_?XlC`%N;46<\7# .=9}1-lcswkGMD7.[RT.)*"ÿéË#%3#"&547&5462#&#";#"326sXËcuVAn¶bXf3<10>J+;@6E4œ³ZLV&%KIWTMT+$!5L6%-7ÿRIÙ!#52>=!+53265ëþú,F.%Â^\40+5‡RDj„aV-^"FPvgG©ý'R\R/-ÿq· !+5265##52>5dSYL47¬ !2  ýôBMI(Àb%ÿÿ&ÿÅæå4ÿÿ$ÿ&ùT ÿÿœÙ:ûÿÿà ZÿPnÙ3#37'373#'#­]]±ru2Ko}hu(§z|þ»Ùþβ](K}U §þ€MFä 7'373#'#'#™qXu.`Z`u ljáS ÔqH.YOlþîââ Fÿ×ÐÌ%2653'#"&53YrO_W;[ ˆ1¡z^&:Ipvý¬]De$$œžžþc#6"(FyÖ2#54.#"!!#4>aRp=_'O=1D&Ñþ/_&>eÖ-XlIRQ:LA)LE8]–œ;ZR4<ÿÿÐÖ&%##5#".54>3234&#";Ðk_×?_1:kLBd9# nË^K5J*»´†‡‡/@U8:MZ5$*:4þàTSq=RR_ #K:rO_ 8mÙ+VmL°^8HC"pvQR/F^<+FÿöyÝ%26=3".53!!YsN_%=dDSr=_Ñþ/ %:LovQQ9XR6!+XlL¬˜]· 6"*2Ûß.32#4&'!#5332>54.#"3!54>32(4+{…S!$þYZZ ;[O:,GF"Y¼þåEƒ]E}YÕ:hH=! ƒ3·7,BvI=Y-siQLud65}F Ñ %#33#@ú`úúOOÑéMþ´FyÙ#54.'"!!4>32y_'O=9I& ÕýÍ&>eDRp=ŸŒ9KBAM9þ¹WŸ;ZR4-WlFÿþØ 3"2=#".546;54&'#"#4>;23#ÎE.4Y™_5pQ8Q-Wx´?U³,1_.KL)¿i„66p8^U8‰›¢%AC''>7$iBAE:-ýþ :U+q\KNAÿö|Î%"&=4673533#2675#"mjƒ€m\c`îEH–AEÃ[po^~\oÀÀKþ~:Où=Qk‰FxÜ4.#"#3>32#%I8Jg ^b y/Ts>^8MA45%:þâÜÖ"-ZlKGF^Ì333F_¹Ìý’^FÿôÓ%2>=3#".=##33$#-+_ðTp9k__Ë %II,`KàáþÆ,YjL‘þ@ÓÃá9KA #ÿüú".3!2.#'#"&54>7'"=4&#"26v\Ÿ^$ A~'‰³Á8fC4Qþkpš£k`FyÝ%".532>=3#5dTr>^$G2.C) _a \Ÿ,XmLÿ)4C'!">.)LýØ×$ÿ¶4Õ2&'"#.'%6õ,%'þñ€ /þ†t-Õg.þ¸°£0" ª¸82ÿÖOØ/8"'54632&'"&54672>=4."327&KD[_otŽeV I/(9OFA:$55?U)2#š5 2*WG=BXЇo?c°< ( "''K*>C+ (¢Y,+D%þ0#9A|Ø23#4&'"#546.jƒaÀ=QCK_‚Øq\þ@K@F3&'7672''"jý¾+;?)/<  ?†BwC,@<+XA‚ 13/ `µy^,G  9=C5/2f€· †(L_><ÿöÙÙ%2>53#".53\8J%Çj>qSRp=_NK BL7©]þµMmV*-XlI¨þXvo-ÿô&Ø4#"&5332>54.+53254&#"#4>32»)B’ny€](2 )##!5-èç…X45G`.[?5T2! ‚cOds{S!35!-= Ms:35,77"&31y ÿ÷×Ù".'#53326=3¦o=šù&9%sN_< 'UmQJ^þX!6")ov••IjY(ÿô,ã467'5'"2>=3#".5(nRŒ¦„ôXK*=)`Žq;_8%Ms”TaSþ[R[ F2@FYŠ%7A3FyÙ#4.'"#4>32y_'O=9I% ^&>eDRp=Ÿþb9KBAL:þcž;ZR4-WlBÿòGØ#%5>=4.'"547632G-JT-—þnƒŒ61!GW_@Ks>c5$ ‚32t_,+'a^&>eDRp=ŸþbBV0 þZ¥æ*+;ZR4-Wl-Êß9674.#" 632#4&'!#5332654.#&'54>32 )*HL+0L, _¢(4+{…S!$þYZZDk>gI)n)>iB2K?:UH?\."3A5]thH=! ƒ4¸793'4Y#GP<(%7FÄÙ3##4.'"#4>32yKN\'O=9I% ^&>eDRp=Ÿ¥Q¨9KBAL:þcž;ZR4-WlFÿôyÌ%2653#"&53YrO_:sT¡z^$GIpvþbFh\0œžžþc(3E)AÎÙ %".=332>=33#5_Tr>^ &:&.C) _Z¼ \Ÿ,XmLed !9)!">.)üý†^×$-ÿôgØ.%4.'4632#.'"#".53326 0M^`O6‘kHl4[VRJZ2Oa`O2˜qFnB+YÆHiÂ(3'O9\i(5D&C>75$0)O7\z 2D> Ÿ?FyÙ#54.'"#4>32y_'O=9I% ^&>eDRp=Ÿyx9KBAL:þcž;ZR4-Wl<ÿô9Ø(34>32#"&5332>54.#"'67&62654.#"O.bFêX)FsqŒ]WI)-"#/$h#jJU[RxP1;!: 9<$¸e% kNb}w`?M6#%95A ž`@79(3FYÓ33##F_´´_ÓøPþu-çÕ'-%.54>7532#3674&'\<^E42D]=^;\L8!9@H4^,=/"Ð^Ëob0,?tIGp>,77 (?vL54.ÚÀ–™¼¼›–¾þ­ =E2"†n)OM0!3C=e¤ÍÏš®ÌÌz '?pI~˜5;5#"#".533'".546;32C/,..--þYm")fl…Ac7# ]§-48#ih_.j~0D þ’?+hG’þG_{$4-mp ;)X=ÙpbÿÿOC§ò_5é›Ó 53'65=^35mfP9G"NL­Î73X7iL‚‚A2Ú>32327#"&#" 6=,0../8%x"0705ÿÿPçäC L14>32#"533254#"# #E/:C4*U7%Hn721?/,3a)7e*=3Ä'?3! TJQÐ=2TP7Aÿö !%2653#5#"'#"5332>53(E;XOT4t=c¡X$8()X*B_ZýõI$0[[®hþµ?@ A.1þ«9<Fÿ8ë%#54.#"!!#3632ëX &ŠKþµXO323##4'"#3” !BLddXNGEXS¼   D>þª>È6\_Kþß AÿõêÑ%2=3#5#".57!!ŠWO:k$9% XQþ¯/A«aþ³JU'!1îBÕDG#ÿ8;7"&54632533#2674&#"ìWrqf7GRc¸1ÖHC:CACEA–muœ+6ýg;LTitKVtrFÿ‡MÑ %'5#33#&L”V±±JÃwÑþBþ¹Aÿ8æ"!!3632#4.#ŠIþ_O323#2=#"aEBHYB=>:(? VNT%B^+)(¦PH $©G^JC>XA79&7.ýùÔA,"$81P<£e@4(I#ÿý9Þ46;533##".2>=#"#mbŒYbb}_1O. à'4 z… h—ÒÒDëfz%9KE¨"FQ;‘½ÆFÿ8ìÌ"#3632#4&'*-XX>]dOX4Ç"H3þ”þÿGhaþ·I?>Fÿ8 #3ºX9ÔýeFÿ8ÚÉ%253#5#".5'##33øŠXO9l1D$–XXï+?«"ýóJV%D7-àý}‘½þ¾BF#ÿøì$#"&54637&'4734.#"32"Óe}~P=U3;^’+ZJBIyÄ\LþêšvuŽ*C=64(2@D»8I1ce[mFÿ8íÑ%2>53#"&'3 *-XX=_fKXG"H3ý, Eia ýô~FìÌ"#3632#4&'*-XX>]dOX4Ç"H3þäÌþÿGhaþ·I?>#ÿòÓà&42#5#"&54>74.'47332>54&#"þŽ  KVM D9dx1HJ>@D)H‚EF*: H9=R™- ƒ_þì?3œv4bH;0 -. þPUs.J8Un}Aÿ8.23#4'"#3>8)=d¹QwXRB*)ýç?2\Šþà W$,ûÛ747'7670!0%4&',¡@1>fh1'•³þ:eb ()#ÖØ1@2{T0'žÆþÿF]×,ITƒ=AÿöÍè-4.54>;#"#5#"&'332>7u+3+-,MT6**T) !!AQX$*,: ´6&@&$D%&+9þO8G6™þ-+2*ÿìÿ8³ 2>53#"'7& X9I*{ !ýâ^X KFÿöÎé%273#5#"&54>;"ÿ_XPWOAQ%M3A_@1?‡FýôS]F4¼9B-=7>#3(3.+53(E;XOT4t=c¡X(()X*B_Zý,$0[[®hþµ%) A.1þ«9<&ÿ7Ï#5;#"54>54.54>">54&ïA].Ÿ7*k‚Æ…%+%!0/!))4 9/%%(9.GB#šŒ," "?H0#2-$+L4.G) JB@!7(*@)79R&ERAè72>4&#"#36323#ý GD:4ŠXOÌ%2>533#"&'3*-XV®=_fKXG"H3Úü¤8 EiaGþ¹~Aÿó8&%253632#4.#"#5#"&53‰U.þ¹&/ ±þäLXpaHþÚSTAÿ8æ"#3632#4.#ŠXO5#"&"32654.#wj\;Q "1J/0<'UA1)89Wiuå5W.-8V-/sœJ?þ:)>*/ ;),.;1-D–?`f;V*ai7R+F 3#›~Ó þ6B Aÿ88Ó)%2673632#4.#"##"&53M;T32'"254&umQ15þËVddQ E;%HG+ä4LE:@g}A¨BLLBFA47kvU_Hf±V^#ÿô %".54>32"32>54.+NL. 1C>!m†"1E; 1/]<2/01 9pM>b;&wDh:$ Û+U9ka-U98S+*ÿ8oÕ#+2"&54>;32##5#".533332654#'35"Ia!=I/>=Yl*:7-W/(9/!N W%DDã5638±PC*; ߆i<_9%ÇÇ7#Jnþ’lS¯–-%!Fÿø Ó".53326=33#5Ø+> V%*GHVO£>-# `ýÈ-+KD’þàBR$Z¾5353Zddd¢eeþ^dd ¦&27"':'0AU+Y  "ÿÿÿUÿÄ&­ƒ­ÿÿkÿÏÿÄ'­ÿ]&­§ƒ&­ê&­zƒ­zÿÿnÿ¬ÿÄ&©W°Ÿÿÿ€ÿ´ÿÄ&±®&­_Š­_ÿ}UÿÄ3#GGÿœ•¼3>Wd üà€ÆÇ3#GGÇGÿÿF€Ç¹ýÇÿÿnÖ ÿÿŠ€Ñǹÿ :FX##5467'36=3>Q;”fä&,WP<”fäcW¿D‚'ÒE %W0H†(Òþ»Je–:6X4&+5323!5!•ao‹‘Qv>Jþ[sCVL(CJ)þÒLL±X%#73'.#52#B¯uÏQ3G36TC82X¬¬Ë§2C L,V9þ…&X#!5!ÌWþ±ù ýô LL?:X #.'#53@{lWAZùWXamþ†tQ: Lý¨wþ‰>•X33>WXý¨'(X##5!ÕWW ýô LL?;X 4&+#!2#äaJ£W\ŸWt=[ýôX}aþ†=:X%26=4&#"5632#"&53?Y Rzdœ[ƒ„ZzþŒ5c:‘X3:WWXþé#&ÿ8ÚX 2#4&+5ài‘WaJ²X…Yý¾7>=!53!!'.2W%,4 þ[W¥¿5V+, *bD?Rn(*@5á•?;X 2!4&+w¬þ¥xT‚X_þ†Xýô+@Uþ@0:X4&+##532!53ãuWA:X:Nç{¨þÖÓwATýô L`þ‰L>ÿ8•X3>WÈ üà3FX 2!534&#GqŽþí¼RVX€^þ†L(>Z=9X  "&5!24&+3265¨Ú‘t‡WWT£WPL[ƒ[zvhœrJNþØ>ZY?$ÿÉX737>737ÍxYs# W +C:þÖCþ  &!Xþ¢5:9'LO9ÿ8 X4&+;#"=32#´N]y,@"(½×~}WtTD1L“Òský¾?X*2+532>=4.+;'.=ôAj=*(GqAµ¯753å [UWÄc¥#W¾Kcþ/ê6þü +“3X!5!3>=3 f<«þ&Fþ²d¥0-W¾@jþóL þý4'“>ÿ8&X#53>7!5!#&l|>7$5#þoèþoWÿlbL)L®ýŽr%ïX 2#4&+5ôu†WO\ÈXuiþ†tNJL<ÐX6753+;2653#.53öbWpFd x>WB†W¦{R}¤W,YÏÓG^8\nLRþ©X¦¤ZWþÔ#{X4+#5265#5!2#$«ityMI<y‚Wt˜þÔukLDM/Lqmþ†>jX!3!3WþÕWXý¨Xý¨<`X3354.'33##:D! U ;«Ü!,‰kÍWHV,,Ÿ54'¾*Œ½ S*IC25^H7Z,‰MuGÿ¸«)5!5!5!ýžþÜ‚ZùXÿ¸ÿa #"&547'!5!73#".5'2632 tþm¦þûM ¯8#&'f ²Z–-þ=Z #}ÿ¸ÿa%#"&547'!537373#""&5'2>33 tþmÔb(˜þûM ¯ 6?'f #²Zšš–-þ=Z#} kÿqÙ­#532!5!4654&#ñyyB\oFþ’(T’Sé 1)þ×Z a Q/kÙ­2!5!4654&#¯\oFþ’(T’­ 1)þ×Z a Q/mÿ»…­".5463##'2654&#"2>+_UdYƒ /\&44*&>9'X<_„þ”,EX!gOI14XY+6Ld« !"&54632"3264@bz|`ay{1bNQ43J~WZ|}Y[zQK/2KHb±ÿV[s.54632'>K"2X ): 3€_2@(ÏHdfˆÿ¸O"!#'#'!53547O$JzþÐøÃÖppssZ½Ã\rÁÿ¸ÿ_ª '!5!73#ª¯_þ´þðJô.¦Dš¡Z–,þ>Z_ÿ¸ÿ_ª '!5!73ª¯_þ´þðJôš¡Z–,þ>ÿ¸À%'!5!5Àjþie£O`Z·Áÿ²ÿSõ #/;U2#"&5462#"&54632#"&546'2#"&5462654&#"".546335'##Þ" ! K" ! Û" ! K" ! h&44*&>9.2>*_Ud†£j¸[ƒ /> ! "² ! " ! "Œ ! "ýNI14XY+6LO)V;_„þ°·Á?ObD”,EX!gaÿ(%Û#654#"%632×Z\@Dt€aþþE\I;@Ø•WHO]qZU´;I@nÿ¸p˜)5!7pýHfþUJ³ZûCýÍkÿv…« )##5!5#…þ‘=S½ØOŸ^ŠÝXþ¯ùùkþ§“?ksµ'þ¿<žeýÈ$7ÿ¸ÿþ±¨%22632#"&'!5!&54254&#"">545):5-AASXDfmþÉ(hj7&$ "&/.(# ¨#xOaI8UZ-_Âþ¨Y+M Y :1 0#`n§ÿ2±¨"6E2632#"&+"''7.'&54676>54&#"3">=4&5):5-AAWT<  "dHš*h "  7&$ "¹&/.(# 1¨#xO_J.†2´ H+".1`þ¨ +M Y :1 0#`(2ÿ¸¤%#"&'!5%277327¤kF3C$þ€&8,ÜA¼(E,71D1Z)m+þÀ>CKÿ¸@ %"&546?!5!'7327SdVF9Å?ýœ >"pA0(F)åOL8F3ýÀZ‘ó!."$ÿ¸@ #"'!!32654'./;Vd%>  ýœ?Åþé)F(0J""€LO‘Z@3*°$"$þ“‚#!5!".54735'#"&'iþ)Œ‚•t6/¢¢i ¬#% W||W þ“Z8V|9_ SI´Â>O] "J?<9!ÿ¸&« 3"&'#53!'5#ó@ÎàŽFý5AdGþUdïïkÙ`#532!5!4654&#{{n\oFþ’(T’R³ 1)þ×Z a Q/ÿ¸…«!#"'!5!'#5!3…Í/þ\° ÈÁ  Ã;;Z÷ZY÷cÿökë%"#"&54>732632&\ n69KN(Gþ¯n*i :((/C9E¢e*þlSˆÀJ*+99&ÎTŒ''7'77''7' &%Y(,$"5'=d+jA!5þϽÿ77''7'77m &$Y(+#"5(>ƒ+jA!5,þ÷Oé3#3#,####s–ò–õ*à/'ÂK7K½ÍÍþü¸ÿÚ/'šK7KqÍã5ø 2#"&54'2#"&546©.! !n! "!¤ ! ~ ! "õ*à '7''7'7Œ8!8 8K K7®^_`‚]_Íþü¸ÿÚ 77'7!9 8 8K K7ª^_`‚]_Üÿ•ÿµ3#'3#r##–##K–––}þöšÿÀ/'|KiK@K©L[Ê 535#53#3©HH²IIL"< <" ÿDÒÿ 535#53#3 HH²II¼"< <"ÿOvÿ¾ 2#"&546>" ! B ! "«6{ 2"&546/537ù$•/ƒ++•U y!;9ýÿÍÿÛ 2#"&467#'7yi.ƒŒ++-$ w";8jvÙ 2#"&546>" ! Ù ! "ÿfqÿÃ#53qbbš]jvÙ 2#"&546>" ! Ù ! "ÿOvÿ¾ 2#"&546>" ! B ! " çx 2#"&5472#"&546).! !7" ! V ! Ì ! "þ±wÿÊ 2#"&54672#"&546?" ! ! "!à ! "ª ! "§Ú #2#"&54632#"&546'2#"&546Þ" ! Û" ! K" ! t ! " ! "Œ ! "§þÉÚÿÊ !4632#"&74632#"&2#"&546§"! Ä"! ," ! n! 0"! 0"E ! "ª€Ø %ªþæ¾N,`¨ÿHÚÿâ%º þâRHf§7Ô!#7777''7''7''7''7'²$"$$#" ï ; ; ;> ? ? @ @ ( D C C C B @ B A ÕV¥  )3533##5#6#"&542#"&2#"7#"432ÕV'SR)UÁ, …, ,  ÌOO%QQg, z- ,þÔJ„'72673#"'&'3&IDI+FIoKM77G*!AICI¬-6N]02I+ÿ>ÿíM'7[TZù\T\ÿÿ?)îð'%ýŒ%þ£ÿÿ¾XQ23275#5354&#"#"&=3326323##"#"'"&'73254&#"'254'"'4>8P9T"/hm! o(8A]5DLGJ)J¤±;.)5PC*,HG5; 3IeS32ß: hVJ,œ/eE.;-)5PC*,7AHI3;7\):Q9W@ ÊIIýã ™A*(ÿÿ<e@23275#5!####"#"'#".'73254&#"'22674'"'4>å32.'"'46322674&5XN4*""&R* XN4"ÂþÓÐZêH39 "0Œd-'D",™,5)NhkM62 ;$F_þvE] `IIªM ; ,R?8"-[ 8+ÿùFe+4&'!5!##".'72654&+'326¶ þ~Fr+7,/hK(N<9'!?*Ed072D0aHDE­EIIC2A(U1OZ';PIL+&d…d3&4LIÿù$e=2'>54&'"#".'72654&+'32654&'!5!!6{325!5!!674'432"ó)::PCJ7(“Jþì,b %’-2š VFþ5™þ|{F7 %,?>:R71C *?îÔŸ;˜oN8DFIïIIæ4 J)!-d$Aÿˆ…e>.54632675!5!#327#"&54>54&#"#54&#"sh2-AuX@Q+Kþ_–89'77'*(;);HFd'77'7%&4J2,)@„@¬SDa73cIIf J20Q4+'!=)M;%;**>& )/"FU >ÿÿÿ{±?'fB2ÿ{±X72674'%#5!54&#"#"&=3326323#'>75##'& þï*J# m$75##'' þï*±%U<1ÏY7 M÷7IIÒF3 Ãþëî( @=ÿ{±Ž#2674'%#5!#'>75##'#'7' þï*±%U<1ÏY7 ‚Kìå;R:3(!/f# r&;A`7DRMGLK(.dF.;%8?Q=2-6BGN/;6\eU:A* ÊI1"!0'M57 TJýæýä ™ûMMHMI(;K:.)6PD*,6AHI3:6[eO@A*&ÊIî:þØJýåýã ™]m #)<'P:3 <7.CI, 0+ÿÿW¥D23275#53%7'73####"#"'#".'73254&#"'22674'"'4>:S9T"/hüþ×1Õd?‰UMGLJ)+`I1;r[SC*,7@HG5;6\eY6A*&ÊI™6„Ñ$þÀJýæýä ™8MN#ÄP;2 <50CI, 0+ÿøíe<7267!5!!632'>74&#"#5#"&54>32."#"Ø%Hþ¥íþ·9I8]yFT.#7IH+@m"L2 % #/>´(  II²P[9XŠ0m1!,/' þþ¦$`D'O:P4)4-ÿø eA%#".573275#5!##4>32&'"3275!#'32675#"&{"•;9eE9" < 2'Û HIþþ#*  =L($D)þª0/$8X2(Š94D:Pq7)@PLD%$."-ŽIIýÜX1F: 7Λ&3::%:(3.Dÿ÷ e#".54735#5!'#Õ E.(; GH¦ :DžIIýÜ$ÿøNe).547#5!##5#".54547"327!;…"6ENIIoW2=*£(2.*Vxþæ*IM*^I0%IIýܼG 9&6-$P'(/LÿÿÿúŠe']‘vDÿøle%2675!5!##5"&547#5!#8e þ$lGIt5@NEªiY&;,º`:ÈIIýÜÝEFb-#ü46 uIIýÜg)9PCHnX%*-g'ÿi´e0C%"#".546;5!5!##5#"'.'"'46322674&7##"3>3232C YN4"ÂþÓ´HI7‹T&-'D",™,5)NέêH 7. '&)ÞE] `IIýÜÄ|-F ?8"-[!8+.ªM ( ÿø¨e(6323275!5!##5#"'"'73254&#"pN*‰)'ýê¨II3%D*Ur0INpK4 –&› óIIýÜå!2&V:Fv95 ÿú8e746;5!5!##"327#"&Ag6—þ‹8zÔ)5+6(_3DV{l™òMmpIIºL()A$V*te&732654'7#".546;5!5!##"s(1'FB96LzX6_<"`HŽþ¡lÞ$ ò%;#197'1*iP`.HS'De}IIÆ#ÿúce/46;5!5!##32>2#".573254#""&½1Áþ>cYû6.>.,"9="4lRB$34P_-q H6yy"!`IIª1= I 4L(6MQ7."FX7p"…ÿúe%.74>;5!5!##"&54632#"&>54#"1A+˜þmØ)2YM>4#5 #:<g¦>(2.ü7@,hII²>.?i'-4B,& *= ”L);31ÿø`e####"&=#5!26=#`GJ€MC@U*`þ[-“ýÜ$Á?YU>ÆIþ¨)1µ¹Vÿø4e4>3!5!5!###"'.*1'þ\4GIð?…%4 !! 84+hIIýÜr;>¡6 !*+04*ÿø”e3%275#53##5".'3254&'"327"54>320rahùHI!&*5eC)(1£5.B; •"3+K^Ç-¼‡ÙIIýÜÛ  0FH {)6.0Cs 0 eE AÿÙôe&46;5!5!##"34'432#&'".*E4¿þžôHð!(ËF&,/b$In?' &?W`IIª+!„C&1*M >B)93(ÿøQe/%2675#53##5#".547.54632#54'"63"e9`òHJ_r$: 7-5G3.CI(1:0S ư89ûIIýÜÍ_ & ;*W*0HG(%0"R ES4ÿø8e463!5!5!####"*JþY8GJà B(%IIýÜOX ÿÿÿç8e']¸6Kÿøße 7"&=#5!##5'275#ßMh*ßIH*I<7Û;¦X@ÞIIýÜÕ'J7õÚ%-ÿøÝe'7"&=#5!!632'>54&#"#5'3275#ßMh*Ýþ¹D1E^{E"S955H2©;-;8Û¦X@ÞIIº?WDVƒ0j2)&&1þöÑ#œ%-0üÿøìe$%67!5!##5".54672&'"327'M þ¥ìHIA=5L#YF G8+'7.#$¥ð IIýÜ®/)<0Eg PN,6vÿøBe&235#53####"&546;54&#"#&546.I¹hùHI¹ b )4N Fc/7°ÏIIýÜ c r!š/0=ÿøe46;5#5!####"&%5# )^HIÏ bgÏ "ÏIIýÜ NpIÏÏÿø,e4'#5!##5#"&'326275#¼9ƒ,HJ=Q`$)5LPD¿)A5¿4)IIýÜÚ5xd ,µQå,30ZLÿó³e#"'.'732=!5!#dK6 :y3 "'0?;J>þå³OŒ3BT“ 6")3D[)-).ŽIIÿó³e$7'7#"'.'732=!5!#~847K6 7b&3 "'0?;J>þå³O5958#3BOx'6")3D[)-).ŽIIÿõe%73".54632675!5!##'47&'"s4F?%NN8cLYCBHþGJ/b B&1./Fø$K3!@-Fe0E^GB|IIýÜ`r*!!(. ,:•e/;>75!5!#"'#"&5463232654&#"'.#"32>P >%þA•Œ,RK^'(`HS\DWR:-"+(( I3)VV' `4kIIn 1;,UfY]gVQh¸'NK0+<  *Amu- ÿÿÿ¯•e']óÿþVÿøìe&'"327!5!##5#"&5467202,.!"B<þ»ì^I@CGfWHFl9'( <!IIýÜ®4j?Dh ÿð†e )&'"327#%72>7#".547#5##7E'(d+yP´2þå./6@,28:.b†MGÎM*!z8EWˆœ4ø5( =(*6&5IGýéÿøße 7"&=#5!##575#327'ßMh*ßIH**Ç:.EÊšXAéIIýÜÉ'¯Óå&,)Öÿó›e#)###'#"'.'732=!5!5#›GK¤&D 2a,3 "'0?;J>þå›’¥ýÜ&%,Iw.6")3D[)-).ŽIÿ¶ÿ¹æe57".547&546;5!5!#!"632'674&#"{§Y=_R;AK#îþ­æKþç&:!99!;,=09X{7K< *I-98K>&`IIª ; 7' .! :þšÿ±þù#53þù__O]ÿð¸K##".'732>54.546;#"…?ZZ?bK)\A+3Z`.)?[[?>3æé ßN +;470Wþ2þö"'632#"33254k@ 6=S&7 rPÂ\G wBxA!.:)'AS`]L5þÃþõ£27#".54632#.#"¿B6Â.9)(@R.SQ4a^(%4þÐþþÿö2>7#".546;#"‰ &)D;='E9aTC9º <*8%8IG6&þÐþA!/46;#"63>767#"32>7#".547&þÐE9aTC.!"&)D <"  ')E=:$C{8IG6$ <* !  ;)6#0#$þÔJ;2673#"&'3q+FIoKLnG*!Ø-6N]_L+þÓcEX'54&#"#"'&=3327632E?# 8 'B96Cc1"-M5 :þ|Kÿ´t#'7LKí=Kî;þLLÿ¸#%7'7H?þÓ1Õc>Lš7…Ò#ÿ¸-H###53'2673#"&'3ÛMHMâj3@HoLLlG1/ýäH6.N\^L%1ÿ!ë\###53/54&#"#"&=332632ëMGMáX? l&:B\5BýéH2 0'M58 ÿMÓ ###53'73ÓMHM=á=ðYýäHâ:þäÿ,Ûš###53%7'73ÛMHMBþñ1Öd>|RýäHŽ7„Ñ#þËÿ^ÿ9ÿç'39!ºWÆ Íÿú8òb#53"&533265232>32#"'732654'"##".5732654'.#'2>54&#"'4>{RR­}´zFR96]þ;P5" C7ECRPB:* %!+Q#(1G( /3(S<29{Q)(.%$>3' 8*Y¦LTqqT6FE7¨ZAF& 2;2o\Ys1G0@/– .- -@!3HK2!Ô/"3 G0 ()  (.2ÿ‡ ÿË6#5D6þÕ*ýàþÿÿ2!5!ýÚ&þÿ3þ,Mÿ2ñ.#"67632Î2(1(! 0!R +1$&;ˆ<Žà>32&#"ˆ!0 !(1(A;&$1+ ÿÿÿ±íe']Ý8ÿÿÿl e']¬ÿ»9ÿÿÿ÷ e']Áx:ÿÿÿ·¿e']m?ÿÿÿ~ce']ÿÿÍDÿÿÿhe&E]Eÿ·ÿÿÿøÝe&N]ÿOÿÿÿã,e'] 2RÿD„eH%"327#"32>7#".547&5467'#5'%&'"'>325!5!!7'432+ML>88O#7( &)B=<& +4)ŽHþñ+b"’+Ç$oþ?„þ…|Bà-&A-=8:% <*7#5$&>/C )=éÏ›9•lM7 S]-èHHá5J* -þÜ¢eZ.54632675!5!#32>7#"32>7#".'47&54>54&#"#54&#"pg0,?rV=O,Jþhr“4="00",1 '*H="'*E*4)";"10"3$%7G,"2=‚>©SE\61`HHd L3*G-'+/ <* " =)1 8$&>$>-+6!$(%DR"0xÿÉ@f77.5463267327#".54>54'"#54&'"®J& /WA.=6,= %.%"$0&'9 '.'K'6%#å.a/>4E*'$ #B(.#, # 9&34"3>'vÿ:SfO7.54632>32327#"32>7#".'47&54>54'"#54&'"®J& 0XA0= /&2'/'$#$$  + !8&.,'.'K'6%#å.a/B(J*."?14 $,  .+*/;'34"3>'sÿ ¶€'¶C;ýeE›ÿÿîÿ®Ž&€P€ÿ{Z]äò #"&546322654&#"äi]^fi[\jÆ:CB;6E@'aigc`kmàG>:DF<>Cq¿e 2##"&'463254&#"M]I#9J\i8!a?"$5egRþX7YFI^£,/\'26Xÿ¼òe>32'#"'472>74&'"X}/Z}#72<‹eB;/0SN?5^#.qU4W7 Í+ÞJ4/q97D/dÿæe3%4&+'3254'"'>32'&545463226œb6A,kpfO-'%66!@&W?P7osB/BÍ1?KMDB  ;(T!"8!HX t0Ÿ>*ENþe#,#"&547.5467>74.'3254Èœk_GE[eZD-?(d,CJX$9X]eDUiWI@OOCHW?L3 B $=]+L ) þÁFKK9eÿüf2#'#"&547327.54Š'%XML-5Og:D E.- â?I*þåôn[_m"f0G=8^eÿ˜äe0;#"3274'432'"#"&'47.54632&#"°V$HZ/@@0 @!'8C8" RjV43_BH!)G(+ÙDIH)(7 V(1'€#ƒ_K`2K(74&#"3L#fPš +! $ ÝWR"+ 2'^/e%7,H_þø *  1BYï%%/Y*#jQ) 2#"&54>32654&#"¯1I49:" (,!))A42F0 #n+",!ÍE#53Íxÿÿÿÿ ;'fÀ(þÌxÿÆ#"&'3274632#".: @#,M0& ƒ!÷8GVN#h " +( 3254&#"'7#"&54632V&/"2 â*à$;(1C9%5DË&)!þ6á*ß_1)@42&C"0åû !-72654&#"7#"&54632'2654&#"7#"&54632… 3%k4&(AA"D_ 3!o,.90@#(8c80$?3;'10¢80FB,$4@ÿåt.%!5!##5'#".'732654&#"'632¿>ýëG3R4C;aA* 3{F(7?()/S<^2 [?33þ\~I:bi:…—=-'N< ekÿå!{6&'##5'#".'732654&#"'632!5!533##¤4-3R4C;aA* 3{F(7?()/S<^>ýë…   3JJ3±:þ\~I:bi:…—=-'N< ek9 [?3 …M3þÿÞÿÎç ?3!5!654.#"#"&54732632'&/32654&#"'>32€nþX $l6J0 42Q9HŽR¤@‘®$M% ;+*9(EAÿçÿö1T&547#"'732754.#"'4>732>3'23!5!4&#&+"&=4673;63636ÆG)..4# :G"3'!=2%3$ /\ J(c>.]ýÍ« !´E1*$M' ‰hkUUkr:d (!%#d1[22 &M*#,ò8=33 ,< %ÿß>#J23!32?67#".'32>54'#"&=#5!6=4&#"5473J-Bgþá' 'fP9^8)32R.(< "  7ò«.>f¥- 7W©6E3¯)2 (/!ZoD_|V'!jwU#3)*%( +-³3 f01ÿé@7B23!327#".'&'32>54'#"&=!5!65654&'"5473h.D]þþ2@S'AA#QˆE3313-$B'2"<>)þçº&Bf¥- 7W­7H3©"p9u2J%‡¶V‘Lˆ^R#/ >*4S:­3!f21X‹092675333##54&'#5&/67.'#"&547^O>393TT3 632¦$eo  L&*'"$ÿpC; #ö8"6#›þÒ'%y\3þj;D+þìt`N8H4 21& G/3$ t5y;2>54.'&547#"'7>54.#"&54>:F55&8,7 ‰F.6R^R6d,* , %* &-#gK>!+;%4 2J.1&6($*R8Mi*1+ %'/!9-#õ;02#.#"#"&547326324&#"327#"&546›(23GG* RR,BI>F,€ #–;3þO9H_5A@1:'+Sz %/9•#LYH#4/&#"#"&547;26324&#"327#"&54632654/&546?LW3b =TQ,2BAD. #›7Z%\­Z $*IhiIùW(þ†uG_A5@1/1+Tx"+'8”k0:&9(D)!*"I>ø2#".'732654''254&#"&54632ö/ "2)(H75%)3 5Q]L#".'732654''2654#"&54632654.'&547QP5,"2)(H75%)3354&+#5.+"7z™þ®wò6H0/")( ^03›@ù %+)()‰C`*.33.&N4#B%'7LþfX/‡X/ó„+33##5./>4'"&54732677W$Ld3TT3¯:3:*4(%1( &'=¦5FaÝV3þR,‡1-45)*%/DJ+ï{,2533##&#"32632'>54#"#"&546Å9M.3CC3V^!F O",E**I '  W15HÇM3þ`›7#)"!E( O  %1^ÿç¿.'27#'47#5!##5./7##"&²& !&')ÞAtOØ=3„JN&H“ $ #a133þAAZ (R8 ¿ :D>32#"'326?#".'732654'#"547&'7&#"325 I4 '.',59(#)ZJ>g@&3"5R0<3% =!o#>(ä5<$U¨E$)  W<P-JcM|ƒB @ykAE.0,"4”!W>&1 5ÿå±.72>54.'&'#5!!2#{#bDLgcÌþÊ"L6: ºG5Yi þŒÔ33=.(LÄÿñÿµ.5@.+532654./#"&=#5!!;26722654'#"'%8/?R/."C`z;GWw\304*þ= "12 NþæC1  ;)3/)$7='3\2?^.á33 @ZK&†ÿçÿýa.E7".547#5!!327&547".'32?#"&'&5332654'é(3 KåzþÀK9<0 #BP2$*%,SAHƒ3'B%"@(ø2.a1337'!>_;HTjN]X !!# B!-"')!3_Žx+F! ?E06'$&ÿç?†"+675!5!33##5'&/.'#5.+"7p¡þºy 63VV33–?÷#q#)ˆCa,+3þÎAÜX3þ= £W2„;V1ë:F\#"&'#4&#&+&547;636;24&#""327#".5463267>32'"2654&#"532654&»0g,[3B^#H}/69 ":, %n  "#! Ÿ*7%!/,=j7_-X83%'/(240gCÈL3šE9 C<9*#S x $ $>Ab!>-4lxE49!,3%ÿÇFš'323!32654#"'632#"&5#5!654'".5473ô6A/þÓ;d&!"-:c4,'d[[š #,!*a°F63þ´6ŒD$"1'6vS?'O3 2 / ) .ÿôªT".3##"&54>7>54'#53&5472654'ƒ/2Ư2@fHFV2 ʬP6&):4I<"G0ß,N73Pr^HZD N=%3]G54#"'62 ,'xØþÓ 35% *>.9d?'’33þq 6Y1&"!=8€[?ö‘$327+"&54>32533##4&#"r, )F>)3& 3__3Y$5@‰?3^+1:('Êc3þW+w=ÿß&U.&*&54>32#"./332654&#"%5!ü, 8&KcfS)E/(3XYBLF57þãva '" '{¾y$?+JV­š\IFa!w33ê†033##5./67654&#"32727+"&54624\%jI3QQ3";,C&,n'B7) ? (V~Q§8P)YïX3þI% 58<"*$3- 2DJÿéÿþ³.'#5!!67&54Mc3OÊþ¸g”,./j´2"33ê†!PO_ Lcb-Í5%"753##5./7&54632&#y…R3GkMp^),*' ŸyU-J1& DJ3þVGK)[F=8Y325!5!##5.#"c4#4,b3þP3B$&3"„&D/F"fÌ33þÃBE--,   s*>32533##4/.''654&#"72767&#" n6…F4UU4 »$%.% # 3#43B£1P‚ÑE3þ:. Á"&!$ 9 ,+2&) ÿçY.*3254&##5./67&'#5!!6;2#"'Ì I<38b($fNrþ3>(69vK Zr7 #1?þZFA_ %M#6@33*8&1,'aNaP'% ÿçž.%.+'675!5!##*š9!~”þ½·A3H''%ˆY.ˆ6b++33þ$X,ÿéGA.,0#".'32654'#"&54632&#"326%5!›%`K9bC:"9%”T,P"5R3O)4! K%3þoX® #!9 @s1Jm_:“¥Q?3Z7?#00:2”33ÿèÐ.!.'5#5!##54&#"#"&5475Å>NBè93`#B2U)D>=79.&!"33þ­C+P,],‰–82Nàÿá½.!670/.+5!##5.')9Y KUÜ?3)“9?Y7;G&4#9C 233þLCR F7""5jÿç¥.#675!5!##5.+"754632#"&€™þ¼¾G3™>09twF&A^6&33þY/†, \'ð"þâÿß .-;27#"&46326325!5!##4&#"4&#"L0&;GG;1.+&þS.N3@'9#.%)90Q€R0+ ‡33þY&0)5ÿí…7#"'73>54&#"56;263533##4&#"327#"¿ 4$I5N3QQ3Q$!, <X&)-1=8k_  $ÀW3þ^s/6 +ÿé¿.&'#5!##5./6&'5¶-~"ÖF3BdE*÷I;0|UÖLŠ—#A33þ@]G:%3(?+7qc{šÿìü.(6325.'5#5!##5.#"#"'7326s@5"'2Ä B_853 :'30A,-û84E®¸K7"33þõN4?4j" EÿçÿËç.#2&/32>54&#"&546'5!Ü6l•¥Y&©Ù_:&: M$B0dÆàëY:o2[p!ºH9!(# $<"%*9+K33þ„ÿ_þôÿÏ 4632#"&þ„"i2"ÿçÿËç.$5!&/32>54&#"&54635)-A•¥Y&©Ù_:&: M$B0d/û3NK+o2[p!ºH9!(# $<"%*9+Kÿ±Ø{&'#53533##L2Rb  3YY3±:3 …M3þÿÚ3###53'>32&#"B_Y3m_* €DX’V#‘ŠBUe3þû3:IdNJ&‹WþwÇ)$23###53.#"'67."&546цž TT3cc—f,[€o -@Hi)Žm3þû3Rv$ *!$%Hÿÿ*iL%'274'7&'#"&5463267&#"š0 *$(0M9< */) ?%(BA9/"9S ÿ@þîš$463'7&#"327'#"&ÀB1. !+1(£ ˆ)3&0b)5?"!#&r/ÿþÛ%)?ê‘+d§sj2QG~8þ·þQ%) 7'?'þ·Ž/‘+d§šZ§ýi!j2QG~8l@~8ÿÑ/.7267#"&5467#5!Ç CL^O<áV[rD3  :ŠfKœ$31›n5qÿ²807467#534&+"&47327273633#3267#".GAÉë-Y)*3,2 XLG>³=0 C0H"êQ‘/342H #4M3j @~  :9TD ÿÜ€{'28>ISYk%#"&5467#5!3267&'#"'72327/&5477'67'67'654/7632&"'&'77&'#53533##BL^O<áVZsD)B!*î  $þ5G!,+ò!,4þü 0 Ã!+s2Rb 3JJ3W:ŠfKœ$31–s6p #,*d3s ²#)þ“,%*u  44ƒ%+):3 …M3þ ÿ×w4%/9?Vw%&'27#"/7'&477'67'677'654/62'&#"&'7267#"&5467#5!26323###5374&#"#"&547."*¦0  44K%,+ó!,34Ó2  º!,þOCM]P<âVYsB&K /?hh4yy2@`S)Ö$+*544¡ < u )þ”+$*Ì ¯4O#+'þ˜ :‰gK#31—s5q~;!,3þù3$63$)7ÿ/ÿZÿóÿý'7+¦¦¦{({ ‘1/"'654.'&54632#".'732654¢+9.'!)Ÿ0 J[g7_G:OC# & /þ8-.$Li 4 ,#H/5.PBTA4(84'  >þìí426323###5374&"#"&547c)B&Gdd3yy3(B`T*±4(,3þù3$63!,7ÿçÿ.1<%"&=#5!!>7#".'32>54' 4632#"& %á.þæ S(4wY=a9'3‘Q)=#   * í6(°33¬[%p"YoIg€]$œÓ$6-2(   þÛ4 ÿéÿa£.+3"&5#5!!>54#"'6324632#".š#4ZºþÕ.M#"(Lj!- /7•33þh]d# "mL³_-!ÿë½.)&+5!##5&/674632#"&±eU ÒI3C°,=,E$Q(/(" !É%&Ÿ]23þLp/8B–*5G# "fþX '&ÿY‹=2675333##54&''75&/67.'#"&547HpC; #þþ0O>393UU37ds4ý™2¦$eo  L&8!$¯/3$ ,8"6#›þÒ'%y\3þi=C+þìGT*8²jU`N8H4 2!$& tþó€yt2>54/&'#"'7>54.#"&54>32>54.'&547#"'732654&#"&546¹5,".]-b ,* , %) &-# :F55&8,7 ‰F.6R^R6BC&C=$ .8(!*4F2!$19"#.*1+ &&0!9-K>!+;%4 2J.1&6($*R83W );" 3 %1   #&$þïþ¬,62654.5467#"'732654&#"&54632R=2GG2 )(0;/D7#!+45,à$/",(  &6#'9 &-  #("2ýÏþ¬ÿö’4j2654.547#"'732654&#"&546322654/&5467#"'732654&#"&54632p>2GH2# Cm/D7!"+45-þþ=].g  ((4/D7! "+/5{#/!,) .Z': &0   "("2eB/"4'#4  0': &/  # *AA£® 4&#"326'2#"&54>pA4>I@4O<8DRè^IXncK*8. Ml,)%#"&546332654.'&547ls=.A?1   19O+$==* 1EE1²Mc09/ M=4/!1 40 +0=b1ÿÅâ#%#'&/&/33254./&'7‡^2aŠ"HC39@!* R'u  H:''*„"6E@~$@;#''=.V  *!&#-?,ô'2#"73>54&#"&54>&/;1!)BD$¯a3+mG$6O>$1: 3 #4X7A^/z CŒ„!*4#Dz%1= &,9ŠC 262654'7>=&#"#"&5467.54>32½\>s(>h%:r"B+%3~aGER'D@=&7/43(J/#C.@ $Þ:O0", *1b8JL?'13M/%8 8&+61·%23&5467."&546?6?&'ø>32#".'732654€ Z #+) .! cI>jF+3=o@1BL2228* #3-(8.!(! A*ZwEo? H“m]E?`Ù0;6363637&54&#"+"./57"#"'463237“5' 89/"NF 6¢ l6(,x&CWLþ),*&v=g 4X:¤7 $  0"32>54&%#"#"'4'76326323;2?Ë*-,;3N#dJ/%,$/-9/'   18#¤@>/#  J†Og3"# ½>4%>5.'.547?654&#"3"&54632H('E6Q &1$&\xšwR:)&:?G;7Kp I4%  - " *#/=pN` 3 0=+!7.258El: ÿçž. '.+'675!5!##*9Vˆ$ %ˆš9!~”þ½·A3@>e X,X.ˆ6b++33þÿçž.!7.'77.+'675!5!##Ò`:,n6š9!~”þ½·A3H''%ˆ&&Q . I7 .ˆ6b++33þ$X,b×a %.#52¤9Õ{M„]M/báë3=a‰‰OÿûIf$ 3#2654'7#"&=#5354'80AA/F-,4_D99VV1$19F3Z/&R*."'<=sJXB3KNbÖa 72673#wÜ63/M]„M•ìàOˆŠa=(K&$ %>75>54.#"&54>32%<… 3ïŒ@" '%*8(1[é,µZ „þî:3+$'$. 4)34P: <1732>73#"&5463232654&#"&54>32#'"@8K}S5 3AR-2BY., " .9(7, ,!L;h7H“# V‘¨]nÑ«"D8#3(#3'(?=8N/…' 73#"54#62i %*L‰9TG&7N#V.(7"&=4#563232>323#"&=4#"l + 2" *š1î&3 Nü?M?)"Ç 34)Î51e+’‡é%72654.#"".=4>32Ø1K)! 2,# 1G$#G/98#`ÅP(#3 $ "3 3 554<)"C.Qdt Ù$326?63"#".'#"546326.,O+&?43473#"&53£%/YHJX 7º,½( RlkS%0 ÿwÏX 4632"&‰00!H $!&000'(m+82#"&54>4&#"3262#"&54>4&#"326¬2GC84F.e2&$ "!)C #+C86D 6k.  )("mD86DD8 ${&"3 (· 6%5CC8 #,| ) #'+ÿùh>26?53###"&54>5&'#"&54>54+532676“6+;džAN/7 '$+$BJ;& G8\>]P "3[9'ÔAýÀi JE>&9)H+‹&WI]7/$;"°A /X8DaÿùPB26?5!#####"&54>5&'#"&54>54+532>“6+;¯ž@AN/7 '$+$BJ;& G8\YWP "3[9'ÔAþºFýÀi JE>&9)H+‹&WI]7/$;"°A /X8 aJÿàt¥05.#"!##"32>2#"&'67&'###535463235Ž98G4׈iëY¤K$>! c6\êœw€@}}kc43 q-{©âL:b…AóŽ!f# (asINagnýÀ@A:ƒg)Q7¢œ³ÿö±¦83567&'#5!4&#"#4>323####"32>2#"&-{©þM“wZÌ2JC*@#B/am¯¯@£_3LcP¤K$>! d/uÎAœ³þ|T[gnAf>H&@;"gƒ:AýÀ@ó>/!f# 'coÿÿÿùÿ@ã™"5Êÿÿÿùþ¯ã™"5¼ÿÿÿö§¡"4‹ÿÿÿùhÎ"íXÿùÿùßµ/@3>7%!2#"!##".5#54&#"#326} xJ[J0þCß]Ž=Z5%biMFu'L54W?2! DY- +Z= '9S26F@Q0NCA41 *H8*AXo#Dk64 +EC]Ic>+Aþ 8[0OG(5ÿÿÿùhÕ"í!ÿø¹%87"&54632>7!5!##&''327.#"ÝPny]cn-ýïÁp! C A3³ .% jZ#  7H7rSXky—EAA!-%3,3M:3"®UDÅ'9 ˜$ Jÿóˆ#%2675!4.'#532!53##5#"'763%Tþð )@E ikY ȇABc›L%³0“@Z=1 A··AýÀ®54'#53232>54&54632Ú'*ʉA$0EA 3:p <>2SDHJ&)4)!¬ AýÀ"Bd#¸'KANE.ÎJ3A'+c 'TZz.}ÿ÷›'074>327654&#!5#5!!32#&'#"&7327&#"<>*>\4+B:þáM¤ýê÷/E"_6,E")Y^D]@;*L;KHY¯+)265-"¶AAv/.NM1mH4SL8(?Lÿú¼!4632!5!5!##".'#"5!32>F3#<þÂ’pZ1MG*9#ØþÄ]O!;1S.?6ÔAAþsOd?zY~~„f3ÿø &.74>3!5!5!#!"632#".54>3&>54&'#;$ 6þ ¨ˆþ-t+™o&tnrn,  "54&#"#"&5467'32>7Â;4=‰q86:;kb 2 ; (K'' &% )3!W- g\'"'(l*";%™=KAAATW2OQ? &8, - 3M  ¶KA!4%ÿúÿý2;5&'#5!#!"3!#327#"&'.'".54¦[ ‹þöK l•‰þÃ>2Oû+†#! ;+)X  @=;xx7AAA·$,@‘ )70  hÿùÿý“%#"&'6%5!5!#"32>32zM>àk<þ1š‹&,SAOK#)¦/#>"! euCç!ƒAAà )G/3Lÿöÿþ¡ )%4&#"32>".54>75!5!!wWPuÈ2K, œ\VT3/[<þÚ«þ»4(5,0A1þ 4$ÿ÷ÿú›".4>32!5!5!#!632#"'&'#"254#"77%þ!¤…þ›(%EaG

    ‘h4:}YK"3# $ u(7A¬AAì!1X-mL37:’K}þä9@(,ÿù›.76325.'#5!!&'#.#"32632#".&Z€<; I3 ¢þQàEG2$i!HG‰U² Bn0 PiW´Ö0W AA#W < È@5–*P7 3-"Nÿú‘*#".4232654&#"#"543232765!5! 69x$2/6•f(»H@;mZ*LM?l"€)þ —@Mq.?e(>% .5?=>8B5/ÌAAÿúŠ"7>54'#5!##5#"!5275!0% `ˆAXeb !²JhþÔ >Ñ,±(,>AAýÀŽ=ïG!.¬þR=…,Qÿø¥"4632!5!5!#!32632#".5#"[+#þ­‡þžSi(~ )Z5Id6H>5RJÛAAþåoz0 .+*QdEÿöˆ7>54'#5!##5#"3270 g’Œ@Y_b >YEhèBŒ-+2AAýÀ¤=Ù3.5fKQ<\ÿôÿþƒ)".54675!5!!5>54&&Ay!3%,.‰PþïþÃRˆ  3 wm]H1=A.B/[—AA—Y+" A=1H]ÿ÷š#732>73##5#".54654&+532vOW75Í@Lb(X@)L%*-óH AýÀ°E(( Ë '7!5!5!#!">3274#"26wE–l1þ#¥‰þÏB2% *)A$?Ta!W+ZQ>90MO%;tAAµ>&!1 &G8;I‚B1)+*ÿ÷}!*!#5#".'>7.'#5!#!352675#÷Az&Q^ %5!I††þŠ?>§§0m ²9_Vv3E32/ (1AA?S-¿þ.;oJÿ÷z.8!".543232>54'#".54>3265!5!#3267&#"*pP6`A(; -hi); $K4^HKþ-ƒp^yþì!)1I,=Ij+!1'=*a-'+,JPaAAƒ]:!WqO!&(<ÿù¡74>54&+532!3##!#"+"[giÊŠ@þé&)5YD?o?WEAÏB)AýÀƒvÿúí"4'#5!####"&'76732=35!f `ó‡?•''D˜'@9g+5Öþsä RAAýÀi$5 m*O|Lq“#K_Žãÿúÿÿx".54;5!5!#'26=#"t;‘e‚íþH~…K7$æLZ]i—=l˜AAþeYM?0&Ó(=bbÿöÿý³&*%2654&##'"3"&5467'#5!##!©BZS>]\?T%/! \}iIN‘½“MGj|_Q|ÿ{;[AGY««^B%; >}][p ’AA’ qZX‚DÿÿÿëÿóÞ 157#"&546322654&##'"3"&5467'#5!##!R3‚BZT>\\?T%/! \~jHMºæ“NHj|_Q{ÿ|*!& [AFZ««^B%; >~\Zq ’AA’ sYX‚Dÿÿÿùÿý‚+!5!5!#!"3!#327#".'.54>­ þ?‰‰þ¼$'+Nú +6%8 ;*)H/"+)=ÈxAA·.0@.= 1*?5 4% #)ÿùª%74>4'#5!##!#"&!54632#"&3/.$s±‰Aþñ  )z$Ú!Z]wpˆAAýÀ“Etvêþ!ÿùª74>4'#5!##!#"&!53/.$s±‰Aþñ  )z$Z]wpˆAAýÀ“Etvêÿöt 325!5!##".54>;#"v!6U.]þI~ˆ01;…^ 7$1(LDG3` AAþc.D"L„F #*@ÿ]ÿdÿÇÿÎ 2#"&54}&2%ÿóú57##5!#—@dBžúFAAÿûè¥.#"3###5354632©98G4œœ@}}kc43 âL:_ˆAýÀ@A:ƒg*P6ÿ"B¥23###534&#"#4>;am¯¯@\\2JC*@#C¥gƒ:AýÀ@Af>H#@<$ýúÿ@ÿhÿ©0#"'5327˜  Y_cUX^˜ (A('ýúþ«ÿhÿ©0#"'5327#".'5327˜  Y_cUX^iY$G%cUX^˜ (A('Ö' A('þ ‹ÿz¡2#".'&#"54þ7=}!h&=!4Z(¡J&x)$*3!#'ýßÿ|Õ&4632.#"&5432.#"ýê+#4hL=Š]j&%T*)%(")("2;#M¬:T\HP &  @2 þ!ÎÿmÓ".1&#"#".5432“  -U $) †1+å+/-#4 9ýÏÇÿ‰Õ)#".54&#"&547232632#"'67&#"þÅ2] $I/a3E& C!+2+ 5/)?4&5$&K,þ®þãÿÅÿÌ 53&þ® #?1&#il8# 10 ±ÿó‹ $.%2675!4.'#532!53##5#"&'76#"546323%\þè*q  ik0' ɈAY"=˜" !32Ê š/^) A[\·AýÀ®33X[þ¨0ÿúÿô  !*7#"&54632746;5!5!####".73275#"_\Hvþ‰@…ƒ7!5!#’<^TA8,h32#"&547#".7"32>54 0W8eh  8M5w-I+ ÝFW#4)29'ö,3%e]'Ü)E8/³aRb?(0$‚?2. ,p+ž#463 #"./&543232>54#"#"ŒiþõŸ C^!†>;h2!^H*l‹{\¶%t¼4;7[5~H2=DJP1+2)[-3?YI.,t9 $ !*))ÿÿ’+532654'5".54>4.5474&#"32SZ]`Uj«"+GGJGG,!©jUNPQNŸžÙ5ZX7Z@"“%? ! 5%.C!!C.#3 "@%“"@þm<..<`ò3273#5#".54654&+532¨*$WOMe@@Lc7nCL%*=/<ä(‘8HFý°E&9Æ'5&'&54632&54632#"&#"yH; ]#<`VJ9pÉ1!éAO5mY%47CHK @ -(/(þ"=$7@0 G/V" ^F#7" q BO D DB )$< G˜,2#"54?>54&#"#"546Qi *"9(E*&u8:Fh–K*kJ66  ,‹—z_!;4,*!$"4-^GN-C`+" 3=YX‚"4632!!32632#".547#"V*³þM-IS%/k4dmQ4@ü2TG@"6`jK1 #=]œc j74632!&'.54632#"&#"#!32632#".5#"V* @KG @ !-.#`þÎ#K‰_%/kc’R1@ü2TG%) 0H (*7 ZxB #>^‰wHþÑÃÿè£!2#"54654'&#"#"&546¤(; $ ()=1M£'%+&C!1#<I 5BþœÃÿà#"&532>7 YHIY 8J7 UilR$1 4ÿö§!&767&'#5!##"32>2#"&35.’wZ±ˆg75F;8«L$>! a0nÖD-{©»VZgnAAó . e# 'boÑœ³ÿùã™ *0<.#"#4>323##"&/47#532674&##326@^v7R/ @ &=kFTv8cbLEt'L4ަOzŒy29Z,kaA±6Fjn+=5%EO9&5ZW2AZn"Dk65 в†$AAÒQþb7[î5 ÿÉîØJbnt2#".#"#.#"!# # &'45#53>32>#"&547#"&54632'2>54#"%3>74.##32È>sI, %4\;@z  #N80$ )  !fTþï,// {yM"‚ý ) +\FMOdhihWÇ,4$†„@²t‰u4.?,^>+ ,;:) $($A! "! EkI]]9¢AŠ™]ELü÷w=3353###"'#'32654+732# (/ kyssyˆiê8ª%I„½9C$A*? 5"÷x¬ýíDPcÃW( BRUD%, uÿÆÿÔ§ç1#32>=3353###"'#'32654+732#§ppý[)/ jyssv‹iê8ª%Iƒ¼9C$A*;,þX 5"÷x¬ýíDPcÃW( BRUD%,  $)ÿúÿÑê*726546;#"#"'47&546;#";#"ë(J8&d)_õFCO£X7!UL/I#,  ?0W þûCU®>1!Y8GS6'X.! /ÿûÿÁ¤246;#"#"'4>3&546;#";3265a4!c*&z^ö;P£X!>UL#  8'-F1>5H2þ/ES¬'S7IS1?F $;ÿþÿ·õ´<"3674&+'32654&+532#".5467.44@F1Z[('d£3B> Šp>_5! •|X42$= Sd B0þ¡AM*'V( !SK7k GX(6)KqŠ,D;ÿìÿ¸µª346 #4&#"32674+'325&+532##"&5½*âp›j'IH+P;8JHXYIHd£3C_‹ol‘¹m„Œeþ ö3l!B-þ°#@-'OSK=SK7$7 eJUfPÿÏÿÉè62#"'732654.'#5'74&'"'4>327537&54¹S.L6fEX29#(<)1¦sþêNÝR#*O?*Y08]+As†ÜP9OAB@OT12. 0%:Oþ÷Ü Md"¦„c @Bdq&"â¹: Iÿÿÿäÿ½ýê'r30:éÿÿÿäÿ½ýè's8:éÿÿÿäÿ½ýü't=:éÿÿÿÓÿ½»ë'rø1; éÿÿÿÔÿ½µé'sÀ9;éÿÿÿÓÿ½´ø'tÖ9; éÿöÿËBó.4>32&#"3%#".'732654&#'7"&G"9; M^ 6?f(  Õ†ô-*)(^b-6KXþñÌb…. P/% 'P8Y  D;/%*G3UH ÿÓŽï232=3353###"&=&+7~!1>Ckkggi8J,Lg:é+2Ÿ=;Êg¡ýä9JV?¤TÿõÿÓJñ)#34.#"5632#"./4'7326Jhhþâ 3#L->vn /Q32"WE'9;-÷)( X ls.9. # AMÿ÷ÿÒ9õ'732673#5#"&547.54632&#";#"n3nYg-,,ŒL~}K˜ 9?ýìl.[JC*9'TNÿõÿÑYí.:747"&54>;#";#"27#"'4672#".32654&#"X#G(! ‰J<)I&(œˆ?žTA44 º~PxRp'"%'}H/D3"4 S4#X.\}“Of0dEŒ£P ;/#&51ÿðÿÏ‹õ346327#"&5467.#"32>5#".WF*U>3¨LÁ $2;49(‰(" .     /:(EOa):>+ÌRà _7NJ=f $–($'0 X #JÿôÿÒSï=653##".'532654&#"#"'532>7.#"763632Æu, 76 ".4*,;;W*@-%6 0*.B$9C‰H3Q=He0ZYD7G(7_JMW')=/BW@X‡*ÿôÿÓaï#353###"&'732654.#"'6–gxjooj $.V5,o )PBG2&L"=ïkQ¶ýì&E/%;[ /LK-? [ÿÆÚð&4&#"7633267#".54>0+:1C-K%C?&0c9wX+NJ->YZ>f c9'.91(XF*]&>)P8*>!#ÿþÿÆõð*2&#"#".5467&5462654&'"$@-)E[>YY>-JM*@b8# X77p?*NGgIVðYCGnO)$4/AR)@Nþ+=,%1;&7CÿþÿÅøô#732654.5472&#"#"&'X j2:N@\]@Õ<4.BdA\\A/LN)b•}G2&"+<.[<#E05N'X!ÿÆâð$ 54>54#"76323274632þý>XY>l2C/Kqh=XW=@-H/{“:Ã)?#!3 gU8);!(-9K9_2EÿóÿÃdî)#3%#"'53674&#"76"&53327dooþ§G]$H1$%(M-# 1%srO;T@h+bN99"Pa+5RýÕ†e:þÃCT%\ ÿüÿÒüè".5463753##"327ò;F5$wRÆqq 9D™ . 1T6QrlýìSF;{XÿøÿÒ4ý0#5#.5467>54&#"#&54>32326734p,z-oŠTZ.1/5-a3 :%1H$TL[BB:‹o.†""bS .%&06 , "13HR 8F+ÿËÎó%7"327#"&547"&54632&#";É)')LJB[€gŠN;t[=Y=+‡,Õ4* TTXgVJ/;+?MUDPÿôÿÌ461#5#".547.547654';#"326734p3$85%N9-b-<€ Z)1).~LG9,˜o4v ?,A,H)L &!RM'G+ÿõÿÔNç "72654#"'463!53###".µ>%—!QK"$HDSqýíO5G>ÿÔèç7".=4+5323673#5÷6O$%[<%"_rrF7%6+´T,/¸ 5ýí… ÿ÷ÿ_Cý64>32&#"3%2#"'#'&'732654.''7&\ 553b!>9>& 6Ìg€fŠkKCWb"KB þ÷ ¶Q‘,  J( 'YU.LQ~„5A"6&   8dÿïÿÓò"726=3353###"&54>32&#"Õ.;osoos'AA"l‡!77,.9I’A/¤T”ýí)7O'sy9S) Lu™ÿðÿш(".54>32353###"&54354&ó'2"-&RN3RT,8@,kooi\:1X)¶$O6+Š-‘BNr: A*:³ýì s@.]<#ÿÓ·ñ4&#"5632353#5##"&543s#%=jppj.$8+bQ, X rjÑýíì&;&`ÿùÿÑ+è'#5#"&546;2654+532"&#"32673+qW\k£"`+EX”7I|*  .& 3uq/t9x_(;UT@€(2:ÿÔØç7265&+7!2#;!"&/#5ú/>làIe3fGÏþâ(Vô-%MT\D7k TšUÿùÿÓé$#5#535327#".54632&#"pÍÎoþí"6*7E9'„t)0"53 51-ìSÕþJW&9a32&#"3654ÏMhs %!"RAV~ ?+ B2(XçVHþŠl#4=[k[=Šl+QO1 R £F_¦óÿýÿÔöç#5#".54672&#32673öpVYB[,jY5-'64‚+Wp,Š>*GC&P`N/9k*'ÿöÿÒKø1#3"27#"&54>32#.'&+532>74&Kpoþh,&1(>P!79f{Ð5$5 fX¨ {%#.%U3!91ÿüÿÔç73267'"&=4&+5353#5²4:QäOUm ,ƒqqVÔ(".·þ´`6¶ Tëëýí™$ÿöÿÔJç&2353###;#"/#532654&+5ã&0#mpp‹S9 ”æ+ &FÀ10•ç 6%-«ýí1a T1ŸU,*%Tÿûÿ§ý3"&547&543.'"32#"'53254&#"327)‹£–­O+?.-?E]2M`5<1%YYBAM$J3~NOYwˆ0&SP"*4$>AQ0%.B;!9(6[(þÄÿ±ÿ+#53ÕggOe ö#46;#"#"&54323254/&=8*Í$ã6e6 :%Mn 0p6g5¬0>$,S3- +$_*#a47W/<ÿÔ­ç#3­qq,ÿ¾^Ù4>3'.#"#,JM)~¬3_ #*FUpÒKl8SZ)  `Nýìÿ,ÿ½Åâ2#4.#"#&56>@{Hp0 Xâd‘Cþí1A5&'*"<…þ’þð#'2#"&'732654#"'6ƒI][KGh<71J7'H'%78YI D$3*þƒþÙÿ÷"327#"&54>;¼)7v2=.CaXx$, ¡6)\-Q*_H%: QþËþ\#+-46;#"27#"'32>7#"&547&þËG:dWD '=*'(O7?!    '(O^XDY9KH7=* .%=+V4/%(þrÔÿú #".'3327=#D&>22`-x)"ã-[=¤þt¥ÿâ°#3`þò•¥ þO¤ÿÜ¿'7#%7¯uh˜]þÐQ›"þå²Gÿ_ÿ¼°ê #".'3327#3°"F&=12a,y) oo.Z=¤ýfÿ)ÿ½Ÿç#3#3•_þó•áooÞ üÖÿÿ»¡ú '7#%7#3 ]P˜\þÐMLoo:ªþã²&ýÿ þú2ÿã#'32g«ŽþúéÿÎÿ²’æ !Js2#"&54#".'33674&#"#"'532?672#".'7326%3274&+73274&#"'63#".'·* %? &5b>-K2*oM4v È*#)5#Z-O)H<9$p]*" +R"4Hý`4a!"db;16b c<ÆD +GE&E}@ æ!)4%  *9'\þ:=X1i;O<3bB  W0x:TK"3VH(Q‚m )/B! CHÿÏÿˈè<2"327#".54>3'#5'74&#"'4>327537&54¸S.QT56* e).6!!-#,§rþëOÝU $U>.E#,O,At…ÜS6Ž<&8F, 8(!6_OþöÝ Md!¨~c +2&I^J !ãº: Iÿü¿¿"&5476;54.#"3265ã_‚B@X`=?# (78+'4_\EB@B\_è&7 P9:JJ:ÿÂÌö*463227#"=.7"3>=4&hSNg+3,t/B ½#,.# #ANgI<þÅ#"d g“ (7+v.*.+]ÿ˱ó&7432654.#"'632327#"&5&XF7c =*=?Q0k’Á ,7H2M^‰ÍT[Q 'OiU  Z[J ÿÇ´ö+#"'7326=4'732>54.#"'6ÏZr""d}]lk6OG-GŒG++51#9 cöR="' lH`FL83(HV   P!ÿõÿËÔó""&547&/7'32654.#àMl}N`7[4$ ›M¡@b•%"!&"L5]E_^Gp+"‰L„j.Gaž-.%8?ÿÔáç!%;#"&=#"&=4+5323273¨ "i!44E[P "$* 4nE TqT:ŠT -"ž#!ÿ.¶47467.54632&'"327'"#'2654. B&.C`v+Y!P Ÿ%o]o]fq-H@\]@‡3HA#ADN   Rb  +?-=NL#8ÿÓâô*%".54632#"54732>"3674&j+JF)`CSf "6W9íO @4+@ 0*#`, +ž)Q9HJiX=c]>%Ä]%7 6)2&!,-3?h,'ÿˤî"&547%327å_€BIþê>0;AI+k5hVY4ØPÚ1%1Qc)"ÿÌÉå%#53'"327#"&54632&Éîî¦>q(>5"#0.nŸ¦s"0'·Q„[M7O&^to™W ÿRÑK B%2#"&5464&#"326%54&+'3254'"'632'&543226e0<.-0=As"%'!#%*þ°g5A.lukU .€3N`B&Y@R:qv7C.*J´@,(5?-0=m342'€/BKPDE4OCU$"8"JY x1¤ A@I?S€> 2654&#"72#"&546ê(43)*43+;[[;<[[F8(*88*,4ø];32#"&"&546324&#"322T42,)3þ=2+)11)+×Y@;[`6+@ü¼$,# 7_a5BV¢7`Y>;[a14)*21+*B*87V57þ¨X46T7b5aY=CV%5."8!W„T`NV@=[\{B#&$þË?QLÃI6FX•h20Tý‰æZm,Y:1-:Ly A*0>þôsâ Y32654#"!3264>3233632!".54;#3254&#"#5##".543!654&#"#"&˜) 6' ýŸ®ai¨þê!0:,d‚…7!5Bþß/UR0<ÂÍ Ãø/"7ž1Ï{%k~WNmgH$.@14=3%&>/þú?QLB%;!•h20TþRK7 *777“"- ˜æZm,Y:1-:Ly 9(3EHÿ±þï[Ü IR_h4&#"26467&54632#4&#"632654.##".54632#"'#"&&#">2654.'%327&'Ž-#+*B*þ#A]CûÀ¿Õ0¼¤«Ö8œŠN9'O43F5%8 wQnŠ"jsNlh‰t9M`0=w<[AuBJ dvLþ7-RvV?~i73%#'þ*5KDv‹µî¾µþ•kœ§Ð©{fV66?I3/>5C /(GUŸt??AƒIa>[N&LX?#xá2B+ŠT&)-"LA[Lÿþ…â 2"&546!2"&546###!#Å(P(d=þ<uþþö¨þXä< ÿþâ)34>32+"3!!"546;2654&#"2#"&7"32654 +EF$VxC=Ns66 ýls;,.]TE6)$*5+-:g/90F#nSK417T(.G,CN6R26[ / 0ÿþœâ'PZc4>32>;####54&#"632#"&%4>32+"3!!"546;2654&#"2#"&2654#"3254#"ê-A55O?#ò‘7%Y7H7&Q/@B2.Eþ+FF$UxNt66/ûÝs;,2YTE6)$*5+-:b.ï!3;2@]+0( 27þ×)e¼¼3@A+=-1=]k0F#pQIg7T(.F-CN6R26 00/8ÿþËÝ%%#"&5463!###"6324&#"326m"3+[t”j¿´<ÏOs,_DT6;(@6(+9š+B ‡`jŽ=þ^¢kKAOM A;&'0/ÿ=ËÝ'%#"&5463!##7#"6324&#"326m"3+[t”j¿´ŒC“ÏOs,_DT6;(@6(+9š+B ‡`jŽ=þdÇÓkKAOM A;&'0/ þôÝT`7".54632632#!"326=332654/463#"&'#"&5463!2654&"#54&#"632'"32654&–&; €`33oWrrcþ¨A]V5Cr7V54O+uN;^8Xs_REYUzN7`B*H :KS:"(-% %*f&6/_|bb`iƒ620AY=)4KA0! 58F]6*]WNMRkJEq]A—‘Df& R;8GÓ)"&.)!%0 þïôâOY74632#"&547;#"#"&54632#&#"32767"&546323254&#"632#"7"2654& Ñ ¬ËVF7F 1G3BB$%H3JU:/)=<\C!1,8UB*%T£‹x´ 0(7@H1˜˜ 0*>*(ÅœŒ‘Pq;3:5M6#11#BB.4-#K4L d:;k5+%„xuj]E82MÁ%:%%( þïôâ ]72654&#"2654&#"4632#"&547;#"#"54632>7"&546323254&#"632#"–#-* *({# 7ÇÑ ¬ËVF7F 1G3BB$%H3ŸH,-<+"6*,8UB*%T£‹x´ 0(7@H1˜;###(þó+ \…œŒ‘Pq;3:5M6#11#„(84+8;B d:;k5+%„xuj]E82M þïÈâ'0€Š%4>32>;####4&#"632#"&73254#"%4632#"&547;#"#"&54632#&#"32767"&546323254&#"632#"7"2654&-A55O?#ò‘7%Y7H7&Q/@B2.E=!3;2ü¹Ñ ¬ËVF7F 1G3BB$%H3JU:/)=<\C!1,8UB*%T£‹x´ 0(7@H1˜˜ 0*>*('@]+0( 27þseþà 3@A+=-1=]/8‰œŒ‘Pq;3:5M6#11#BB.4-#K4L d:;k5+%„xuj]E82MÁ%:%%(ÿþyâ /35"32="&546;5!#32#"'532654+´¢Ùa2wwS|2$®Ÿn5JZ; $#*8`Vb¬‹‹Â+,GsBìgO)DÁ6‹Y9:O=)$[[DMÿþ³â %4&#"###!#63233!53>Á5&,7¤6¢‘",;\7°6þ5…(,±"."\)þRä6…Q8[*­þ7 Fÿþsâ "&546;5!#3#75#"32#3ßS|1%®Ÿççb,Ùa2w¢¢gO+BÁ6‹7[DMªB&,Gw‹ þôÝ ^32654&"4&"326"&54632632#!"32?632#"&'47#"&5463!2654&"#54&#"632T# ,(<*þ’.F*0$ *PAI€`33oWrngþ¨A]S8%P•PY:MK4/?ÆL;Kv_REYUzN7`B*H :KSˆ&#&#Q#,(D*(`SI_|bb`n~6d?3`4L82BE/"1aGMRkJEq]A—‘Df& R;8Gþï¦Ý C%32654&#"'463!#632#"$54?232654&#"##"632#"&6(*9;'@h”l¿µ(8MWóÇÌþèN &CP}”G¤ÓD).&=ÍOt2ZDSU<[t'0/( A;0h=È!oU“³û¸Æam£S‘^5˜},O1Œ¢kKAOB?]‡ÿþÓâ3!!6‰ýAâþS7ÿþ"ä<HR\74632>3263!###"#"&547&#"#"&547&#"632#"&7"3254&32654''32654Ä]L](tAGD:œd‘*0BVPFL^ª!>9+_:%5,'9`aø`5+%<¿|©+))6þR®R‰OrnJŒRR‰OroINTJXBDMp‚-,;`&;17Y_1yAOOKo8Xb.zÿäþôgâ*.80#&546;2654&+#"&546;5!#32+"35##"3254>Iëev><+bKS|1%®Ÿ+Oa„tò6.›¢¢¢Ù[8wÞ.D:\XBP[DMgO+BÁ6‹oRsÏ‹Â&1Bsÿéþôâ&!#632+"#'546;2654&#"###³'!DMvcªa6@F¶QW91- 7µ7â6¤wQg}X. ?7\R;T'¼®þRÿþÑç*4@74632>3!###"#"&547&#"632#"&32654254&#"Æ’YKS';Ÿ<`6*dSCAT^5>d‘*0BVPFL^ü`5+%<þM_:%!>9¿~ª*6þR®R‰OroINTJXBDMp Ko8Xb.zþö`&;-,;ÿþ'â3!3!6¨7ýëâþS­þÿþ…â2#!33464&#"326¤3X7HEþ6ÍOð`J5)°)/â8Xc.UnäþS.>AþÛY–'5þåTÿûƒâ332653!3!5#"56,H457þ`I&Uâþ„F(@þS­þ7"K ÿ1’â !#57## ˆÇ‹6â6þXÓBœþRÿþþô8â/%+"#'546;2654#"#4&#"#4632>328tŸ4,7AF°bq‘#774'-6F9(A@#b_Å™¾"- "- ?8¦uí>$þ´L(:B þ´R>T),¡ ÿþ4â1=%4&#"632#"&5463232654#52#".=7'"32654&ÄmOD~3JCX]BMf‘kgŒ40KW°æp]/E#ù.=8*,97ïDywE9WC@Qz[r–S7>jQ¼6òfŒ 45 7:-(10)(? ÿþ@â&274632>3!###"#4&#"632#"&%4&#"326 ’r3]H57C(17f8Su5LDQY>W^;'$;:*(5×qš:'*76þR®J/þË7ZrP8TE=Ny)>>#'2.þô…â <%4&#"3262+;#"#"&546;#"32>3&5!3346P`J5)°)/¬3X7HE°*8@+Q01:E,sm N4+77þý6ÍO½Y–'5þåTY8Xc.Un01$C$=707 =&-&NäþS.>Aÿþ0â".74632!3!5>54&#"632#"&7"32654&¢udOQN8þ?9FvQCu -'BTUAO[¤(14+)37¿z©FJb€;­þ1cDQqV;]CAPm‹5),73),9 ÿ1>âW%32654+%"32654&%"37674&463232+#7!5>54&#"632#"&5463237"&þÏ&bsýt(14+)37$6O.)3±Q@9P #k9F=4ça=aþÀ9FvQCu -'BTUAO[œ{dOQNë@>]5&C<5),73),9¶K(!(^ %n:jA3PB76CÍÍ1cDQqV;]CAPlU{¨FJb€;‡K ÿþü>J74632>3232654'52#"54654&#"#4&#"632#"&732654&#" ‘kBu M,IPM;P‹Vlf\… 62087hGD~3JCX]BMfT8*,97%.=Ór,$".ZG*$‹…H·7•cnœ¸%E6BB1þÅ/;DwE9WC@Qz(10)(?:þôîâMY%#!"#'5463!2654#"#4&#"!5>54&#"632#"&5463234632>32"32654&îuüÕ107AF6cv‘"775'+þw9FvQCu -'BTUAO[¢udOQNäF9U$>#b`ûÆ(14+)37Åš½#*%- ?8¦uí?#þ´L(:@"þ´1cDQqV;]CAPmTz©FJb€;>TH, L5),73),9 ÿþŒâ !#### ‚Š7‹6â6þR®þRþÿþL4&#"#&54632VSB`%C‚]mq7_rQ<4432#".54>32#4&"32654&/j‚0T@DIT>Uv3=†`y7fu*7-)"9-ÕÔth;JVH=Nn§hm°qˆ{ýø ]mþ!?-*1>"*= ÿþa /;"32654&4632#"&547"3&54632#"'&%"32654&½$;8,+8Cþ(ϨY‚XG>U9UPOVz8\A;cŠb‘nl³)>:*.=Cµ<#)11)$;þƨà`MENX>E/leþ^e8DAX^8Weuu3C*)58,&Aÿþœå/:D2'>54'&#"#"&547&#"632#"&546326"3254&32654'œl”`7*8CBW'$dSDAS`7?c“ (1AVPFL^Æ_GIþf+56*a;Ì4+(:b_â¦y}H#o=V9;R‰PqoIŒRSKYADMoR}©,)ò6+*6`':18X`0sGQ ÿþ¬ (4!####">32#".54>32#4&"32654&*‚Š7‹6þj‚0T@DIT>Uv3=†`y7fu*7-)"9-â6þR®þR×Ôth;JVH=Nn§hm°qˆ{ýø ]mþ!?-*1>"*= ÿþ¬ /;E"32654&4632#"&547"3&54632#"'&%"32654&%!####½$;8,+8Cþ(ϨY‚XG>U9UPOVz8\A;cŠb‘nl³)>:*.=CH‚Š7‹6µ<#)11)$;þƨà`MENX>E/leþ^e8DAX^8Weuu3C*)58,&AÇ6þR®þR ÿþ` &2Q]%4632>3!###"#4&#"632#"&%4&#"326">32#".54>32#4&"32654&*’r3]H57C(17f8Su5LDQY>W^;'$;:*(5üîj‚0T@DIT>Uv3=†`y7fu*7-)"9-×qš:'*76þR®J/þË7ZrP8TE=Ny)>>#'2.qÔth;JVH=Nn§hm°qˆ{ýø ]mþ!?-*1>"*=v¤Õ #"54632Õ//Õ1 ÿþ@â&274632>3!###"#4&#"632#"&%4&#"326 ’r3]H57C(17f8Su5LDQY>W^;'$;:*(5×qš:'*76þR®J/þË7ZrP8TE=Ny)>>#'2.ÿþÇâ "%5#"32#3"&546;5!#!53!VÙa2w¢¢wS|1%®Ÿÿ<þÅb¨B&,Gw‹þÝgO+BÁ6‹Áø[DMþï4â4#>32#"&/54>32327654&#"###¤‹ C"QY{q‘·ë!% ):Æ ydoC6C)7Œ5â6Õ$„`]VÙ© 8iG6 ,žK š²DMsBnK–®þRäÿþ;â&*74>;5!#!##5##5##"&732=#"%#3$®Ÿ¯%<Œ<†aLS|<_4wÙ ¢¢´ 'Á6‹7êêêê[CNgC,GsB&è‹ÿþkÝ$%#"&5463!###"6322654&#"m"3+[t”j_T<ÏOs,_DTš+9;'A5š+B ‡`jŽ=þ^¢kKAO¤.) A:N0ÿûËØ25!####.#"#46O*PðnNäP,-NØ'B9þ\¤þ\V!1þq¤ <Ð(#"&547332>54.5473vuc…PPH-?!0::0P 19?2!x{b0310IZ%BG+4N.%#(C, %+!07Z<0Ð%%#"&5467635#"&=3;4&#"3260”ke=54X P ÃKbPWHJk\KJc×hoqc:`¹N%ùnQGPJGJQM<Fä'3%#"&54>7654.#"#>24&#"326F–miž/(6!-%1,Pd˜N'++P\KQreHPmæj|~g#;*$ &/',T>blfM@,I0Ka^OH^X<óä-9#"'.#"#.#"53.546326324&#"326ópXP8$$ ()&$$v(V47LfWY7=jWlP>:=E@<@>Ys/XNH+"#[¡\á2"  P0‰LY‚NN~T=YZ>=UR<ä"%#"&547332654&#"#&54632Ùo„ P QLJEG;DEPy^Zyùù‚o ))!Nf]LJ:?M@]e^W<ä&%#"&54733254ᒐ&#"#4632*+ˆf„PPH4D<7#"&546326324&#"264&"326ã‚dg{ -@B]oLGg 0CbX{þr9)*=:Z5>P„TSADPâd~zg-<M'YAJ[YF#¥Fl)2:*-6>þÂAGRBAX`P-ä*%#654#"#"&=46326324&"26-1P1\43<322VQW$G01F$1&P$3:dABd9¤³ÝÇÉ-TR11RT-[ÜYVäV>n]77]n<ä%%#"&54733254.#53254'5++‰gƒPQG‘0# \ADMP0!ïRNOpeI88CHW©#32<qr< aFc,\<oäA#654&#"#54#"#54#"#&'&'&!"53&54>32632632o/Q0/0,2AXW@BUóRPQsa^w>£AYeLm€rZþÃ>TZA@V\Pä(%#"&54632327#"&#"6324&#"326„cg€PgT;@ -va?e\PXA?VSD@WÔasyfCeIP[Î>z]AZS?EZVPÆä"%#654#"#54&#"#&5432632Æ1P1\34P43\1P1°X3/d¨ô‚^yb5„I5ÑÑ5I„þËby^‚(ÈLLÈ<ûÐ.%#"&547332654.#52654.5473û{\eƒPSCAH//(`:8QQ8P(=F=(S+(¾Zdkb#BMMA(1<0*"'B, '3?/KTÐ.%#"&547332765#"&547332654'5673sij† P RK5--8b7;J(B_PV"6/¶+Qåi|†k0)!Lh#$b–9)8A? M! 0 < H<ãÐ9%#654&#"#4654'&#"#&5467>7673632632ãASD480"%P.29+$ZE{zŽ PNŠi` -A*J=VWlÞk_Uo;U"#L  ' F!K47t*ml€§64#X(,#K2/+$OnPÐ%#"5332654.'3ŠbáP”DUPÐ`péçþ­VD$8+);<Üä2>J#".547332654&'#"&5467.546322'4&#"3264&#"326Ü&@X`51^W@'OPO”pu‡IB4e=Bc9,)3]EBV!…â&.1'%15Â+75'%/+„ä<%#"&547332654&#"#54#"#"&547332>32632„')†o„ P QLIC -"*P 34;P*%( +Z>LùZNQ‚o ))!Nf^K]15."‡™> A47 $>N><ä7C#".547332654.+532654&#"#"&46326324&#"326A8o›pDvWT hSXi-$<9/>>0&> zU[„~ZeC?3N`IÒ<ðä5#654&#"#4654'&#"#.#"5&54632632ð5I.79/! P%$'9=LCBz|R PLni4sAq€h\b6;dQh,c_aO54&53 æi€PTLJEA^Nd#P#I2')Pïïxh*01N`]Lõ:_MD@AH1:I4 6 =ä"-%#"&5463254#"#4&#"56326324&#"26=‚zgŽ’ibDX?!P1#A6IO&-]ROPbGJ^a`üz‚ldfn=ÑpI^`G/"Z3<OXPoä"-.#"#4&#"632#"&546326324&#"26oB#.P!?XDbi’Žg{OR]-(MI6~^JGb`aW!0G``GpÑ=nfdl‚z2Tb<<3þHPOFGPN<wÐ#.'#"&547332=#"&54632537'5&#"32wpÛn‚ P PMŽOM;YU;E[PpppÀBD%5/!I/Áïxm+*)!Pd®³9@9:E=±±\GHhO4!"PÐ%#"&537324&#"32†^h|PÏ^‘^~PQ?BVT@?Ð\t„häþ®wvœ~XQA@Z<<äI%#"/#"&'332654&#"57'&#"&546327654+53232654'7/eCW5aÀ 8‰t—$'À~ #L'²78DùMQ9MTVH+7>-.? 5{©G.!E$?>AM_¯a+Fl&(cô*) 4<Ð7#"&547332654춮춮.'&53$!?)EJ(Y†PU>9S4]a66ad0;JX4PVVþèò¤/9#"&54>7>4646<54&#"#&546324'326ò„c]+922&'&)C \BF<I2F¸gBD[HaoiZ%B-&  $48')*AK^k%.98Gm5(‹AL[þû–¤0=%#"&547.#"#.#"53&54>326324&#"326–lZMg1 -&BR_XVS C^[-YYk‚#T?ÙZkcM7,-":6C[00%'7-C!FO¡:dGEEtXAY`=QRþ衤"#"&54733254&#"#&54632¡dbQl,F,H7‚4>-9FdFKeKcjaP>=5E7I¨/@A:-4!&.FTUJþ衤2#"&547332>54򂂮&#"#&54632¡ÂRoFF9*:> '.8.5@FiQFg5.>(0ècQ@8==9G&&@0&<(2C)-6;5PUND1J ]Vä$0%#"&547#"&54632632$4&#"324&#"326Vg^QpJ,A>QeIG^:2QLPþÕ9/.13*/ 9@B?D>?9Ú`ziQf¸(T>HZUF=”.{ì^=D0*9þøD]lF?Q^À¤'%#>54&#""&546326324&#"326ÀSF&-:7@(n¶rv_Q=8SQcþ®C=GCCDE>äs])t89P429\wu\_t==nS=RXIFYg£¤%#654&"#&54632£;F;@xA;F;mVWk×pSNv?[\>tPUnWvvþ蟤+#"&547332>54&+53254ȔŸ!*, $L:Us F D<, '((A&C*BC2CUF9NI%cT@55@32632632-.F.,(SF'+(-F"&a‚(^CRþßÿTqN:L!%V#>%TATMUKX+Dbhg4-5)le)<¯»+ ¸”:Q¦8bIII) I`£Ð'%#"&5463254#"#&546324'&#"32£\]Zrm\K5urFiSP]F(&-@>A@xÑ_ruZ\y?´…„ R_]PþµX!!`CB[£Ð*%#"'&54632327#"&#"6324&#"326£k^F:=&%-A@Ó^u01}OIZCnÃ:w[B^V@d##]Œ¤(%#654&#"#4654.#"#&54632632ŒI2K2:&%.3) $>0[%+þè¤.#"&5473325#"&547332654'53273ÂWgSr,F,E9ƒCX4V=;QE($!&,aK<>jp_R@;5E9G”­) 4;>B9$)("/H@ŒÐ1%#654&#"#54&#"#&54>53632632ŒIXW>Q)%W;SR9B.–&53R=@Ï%97)+7:þèQ¤<#".547332654#"#54&#"#"&547332>32632Qqm;mL@cEQWK$$<#:%1=&F&#*(!T89#n‡+[=:/)@CNiSJR4&‹‹--+4+;0-$,%$))#@J9þ蛤.:#"&54733254#52654&#""&54632632%4&#"326›xfhA VIœz9A//[k jmPf53aDMm76þµ>65C?=;5=5E8H¨0$5u:N=Šþü ¤6%#654&#"#4&'&#"#.#"53.54632632 4F446.$ <'<6jT‚%u#VGj]2{[9AfZ(C:dI[ï=QDF8O"3aq9 eAf„ 'b1C ;,‰H[{+$Okþ衤$#"&5473326=#"&5473326753¡a`So,F,H7D>>BJ\3F39/%C=5E8HWGâ2ZJPHEO0F% Ÿä$/%#"&5463254&#"#54&#"56326324&#"32¸dX\mjZQ4$", 1 1?),C='P>9F;@??@A?×Z}v][v:ù"-5-<22:=F)??T@þ?†]^BC]šä*%#654&#"#4632#6324&#">šKFKA9-S |Gi6#E95/þèZ¤6%#"&5467332654&+532654&'&'.5473Z9.05•lŸšE9FAAx~Qk=;?B;<(*!F'77'Ë-< P4jr£XµJ[®e›SOC,y??@;9?B?u=7.2518,#ù:v[]v{\yAS??)þB^]†]\þèÐ%/%'#"&54733265#"&5463237'&#"26wYmQl,F,D9H<3Z=TU@J?=5E9GSKKP=?NP|þ~TonoY6#&78£Ð%#"&537324&#"2£mZRl<’N_]kF>@{7‚ÏZunRþ•£dw¡†`šF`þè¤M#"/"'5326549'.#"&546327>54+53232654'7H/@&c‘+8V„HM0*5.$«P )11J9M#T¨5}Š$=,¼] 33<[.:OÍqB*@F#=.+)#+Iƒª$6779LI¯‚< 5!Ç':$H¼Ð;%#"&547332654&+53254+53264.5473¼pVdtFCM6L $SREDST 6LL6AYI:'$*/&(-RKfcNM.4;'<5=<. 1( &/(+ 1$&/ <ÿüXê=E%#"'&'5767632327654'&'53254'&'532654/54#"6XUC_NC12+V-ËöJ3@3 P4E7E6/XmT/;8Hþ¤)1¡X+"l[ 6lSy-•WþÇ@; 6 :+ 6)7@E5D8#>?*z3^EKDÿûlŠ&'567&5462'4&"6lWPQV1?iXXi=3A6`6ff 56jHZZHj6º3993Z..þî…x!#"&5467327654#"'7#5!632… (rN_$ 'D5NY$!„Ð*‹ …4r/=YL'6)/4A1"W—Ü4èþîˆÇ:#"&54732654&+532654.54632'654#"ˆhXL^*!A1>FT<--%X5LL5NF"#A1g+ W´Ê(3##"&5476;5#"5476323#3'54#"35#"32´OUFN^2/S\\´0/MHSOOO†dr$FNNE$=5dxGUXMO,(H™M(&MEn4H|kaf>þÛu@5;ÿÿþèò¤ÞŒÀÿÿ<ÇD 9FÀÿÿÿÙ#z¨üÒ$ÿÿ*þþ#z³ü»DÿÿOo\#y¸%ÿÿ6ÿé Ù#yÿ÷EÿÿOÿ\oÙ#yŽüø%ÿÿ6ÿE Ù#y€üáEÿÿOÿ~oÙ#qNý%ÿÿ6ÿg Ù#q‚üðEÿÿ0ÿ*¥ž#vº‰ÿÿÿ*Ýë#vŽ©ÿÿY›_#yÓ“'ÿÿÿéïÙ"y^ýGÿÿYÿ\›Ù#y‹üø'ÿÿÿEïÙ#yWüáGÿÿYÿ~›Ù#q™ý'ÿÿÿgïÙ#qYüðGYÿ1›Ù"+32654#"'7#!2+632#"'32654&+© ! . '¶‹žŸŠ= &)B9/N"¬lppl¬…%UÙÂþ¬Ã1# +2"ÿŠ‹ÿïÙ)5#5632#"'732654#"'7.54632"32654&ïJA+ &)B9/N ! . 'gt{fl5“DTTEBPPÙý'E,*1# +2"(%V˜~}—Qþôp[\on[^oÿÿYÿ.›Ù#fŒüß'ÿÿÿïÙ#fZüÈGÿÿZeø#q¼Ž"(Cºÿÿ(ÿé^"C^zÕÿÿZeö#q¼Ž"(vÍÿÿ(ÿéZ#v£vÕÿÿZÿ.eÙ#f¼üß(ÿÿ(ÿ#früÈHÿÿZÿ\eÙ#|¾ü÷(ÿÿ(ÿE#|tüàHÿÿZÿ1e¨#x±Ìãÿÿ(ÿÞ"xräÿÿZC_#y¨“)ÿÿ\#y,Iÿÿ,ÿéÅg#qåª*ÿÿÿ&é"qràJÿÿS„]#yÄ‘+ÿÿFæ#y‹KKÿÿSÿ\„Ù#yÄüø+ÿÿFÿ\æÙ#yoüøKÿÿS„Z#jÈ+ÿÿFæ]#j†’Kÿñÿ1„Ù&32654#"'7#3!3#!#632#"' ! . ']w]]þ‰ &)B9/N…%UÙþÅ;ý'Lþ´1# +2"ÿßÿ1æÙ.4&#"#632#"'732654#"'7#3>32#“C)@N &)B9/N ! . 'S%K8LYSk70aPþß1# +2"(%UÙþë0'MBþtÿÿSÿ=„Ù#xÆüè+ÿÿFÿ=æÙ#xpüèKÿÿÿöÿ\0Ù#|ÿñü÷,ÿÿÿÏÿ\ Ù#|ÿÊü÷LÿÿN#jÿô",v!ÿÿ;”#v°±ÿÿO’™#vƵ.ÿÿ:ö#vVNÿÿOÿ\’Ù#yÊüø.ÿÿ:ÿ\öÙ#yqüøNÿÿOÿ~’Ù#qÌý.ÿÿ:ÿ~öÙ#qsýNÿÿPÿ\Ù#yŒüø/ÿÿ:ÿ\¢Ù#yÿÇüøOÿÿPÿ\g#q’ª:ÿÿÿåÿ\÷[#qÿÉž;ÿÿPÿ~Ù#qŽý/ÿÿÿåÿ~÷Ù#qÿÉýOÿÿPÿ.Ù#füß/ÿÿÿÞÿ.ýÙ#fÿÊüßOÿÿKùš#v(¶0ÿÿFúë#v%PÿÿKù_#y“0ÿÿFú«#y ÿßPÿÿKÿ\ùÙ#yûüø0ÿÿFÿ\ú#yùüøPÿÿL†\#yÂ1ÿÿFç¿"y{óQÿÿLÿ\†Ù#yÂüø1ÿÿFÿ\ç#ypüøQÿÿLÿ~†Ù#qÄý1ÿÿFÿ~ç#qrýQÿÿLÿ.†Ù#fÆüß1ÿÿFÿ.ç#fsüßQÿÿ&ÿéæú#|ë•"2j'ÿÿ$ÿéþƒ#j—Ÿ·ÿÿ&ÿéæè#|ë"2jéÿÿ$ÿéþW#jtŒ·ÿÿ&ÿéæè#qà‰"2Càÿÿ$ÿéþY"Chuÿÿ&ÿéæè#qè‰"2våÿÿ$ÿéþY#v…uÿÿ[iš#v«¶3ÿÿ6ÿ& ë#v°Sÿÿ[i_#y “3ÿÿ6ÿ& ¿#yƒÿóSÿÿ]§_#yÓ5ÿÿEA¿"yóUÿÿ]ÿ\§Ù#yÛüø5ÿÿ;ÿ\A#yÿÈüøUÿÿ]ÿ\§g#qºª^ÿÿ;ÿ\P"i"à_ÿÿ]ÿ~§Ù#qÝý5ÿÿÿæÿ~A#qÿÊýUÿÿ0ÿémm#y¢¡6ÿÿ"ÿéË¿"yQóVÿÿ0ÿEmå#y©üá6ÿÿ"ÿEË#yLüáVÿÿ0ÿémþ#vß©"6y´2ÿÿ"ÿéË^#yM’ÿÿ0ÿémò#g«µ"6y¦&ÿÿ"ÿéËT#yPˆ#ÿÿ0ÿEmx#y¢¬fÿÿ"ÿEË¿"yQógÿÿQ\#yŒ7ÿÿÿéþ@"y×tWÿÿÿ\QÙ#yŒüø7ÿÿÿEþœ#yüáWÿÿÿ~QÙ#qŽý7ÿÿÿgCœ#qüðWÿÿÿ.QÙ#füß7ÿÿÿIœ#füÈWÿÿUÿF…Ù#jÉüâ8ÿÿAÿFâ #jnüâXÿÿUÿE…Ù#|Êüà8ÿÿAÿEâ #|hüàXÿÿUÿ…Ù#fÈüÈ8ÿÿAÿâ #fcüÈXÿÿUÿé…è#|Ð"8vÿÿAÿéâ\#v‘x+ÿÿUÿé…Ë#qÆ|"8jÊÿÿAÿéâ>"jos-ÿÿ…n#|°¡9ÿÿ æ¿"|VòYÿÿÿ\…Ù#y¯üø9ÿÿ ÿ\æ #yHüøYÿÿ¡#C@¹:ÿÿÄë#CœZÿÿ¡£#v9¿:ÿÿÄë#vëZÿÿ¡Z#j8:ÿÿľ#jÂÿóZÿÿ¡m#y4¡:ÿÿÄ¿#y¾ÿóZÿÿÿ\¡Ù#y6üø:ÿÿÿ\Ä #y½üøZÿÿ‰\#yª;ÿÿÙ¿"yPó[ÿÿ‰[#j®;ÿÿÙ¾"jTó[ÿÿ •\#yª<ÿÿÿ&Þ¿"yRó\ÿÿG¡#f›¼=ÿÿÉí"fT]ÿÿÿ\GÙ#yŠüø=ÿÿÿ\É #yMüø]ÿÿÿ~GÙ#qŒý=ÿÿÿ~É #qOý]ÿÿFÿ~æÙ#qqýKÿÿÿé-"jçbWÿÿÄ#z¾Zÿÿÿ&Þñ"zRÿ\ÿÿ*ÿéò#^)Dÿÿ€#y´Aÿÿÿ\Ù#y¨üø$ÿÿ*ÿE#y³üáDÿÿÉ#©#Ô$ÿÿ*ÿé#©ðDÿÿšµ#f¨"$vmÑÿÿ*ÿéc#v6#¤ÿÿ´#f¨"$CÿêÐÿÿÿÇÿé "C±)¤ÿÿ®#f¨"$©¹ÿÿ*ÿé1#©´¤ÿÿí#f¨‘"$|® ÿÿ*ÿéc#|r–¤ÿÿÿ\‡#f®¢ ÿÿ*ÿEí"fp¡ÿÿè#x»"$vÐÿÿ*ÿé|#vŽ˜Åÿÿï#x¶›"$C¯ ÿÿ*ÿé‚#CežÅÿÿ#x»ž"$©@%ÿÿ*ÿé”#©ŸÅÿÿ#x»¢"$|Ã:ÿÿ*ÿéq#|r¤Åÿÿÿ\|#x¬  ÿÿ*ÿEÞ"xn¡ÿÿZÿ\eÙ#y¸üø(ÿÿ(ÿE#yoüáHÿÿZeÐ#©+Û(ÿÿ(ÿé#©îHÿÿZe…#|´¸(ÿÿ(ÿé¿"|vòHÿÿZ«µ#f¨"(v~Ñÿÿ(ÿéh#v;#¬ÿÿeµ#f¨"(CÿñÑÿÿÿÄÿéø"C®¬ÿÿZ}°#f¨"(©»ÿÿ(ÿé:ü#©½¬ÿÿZeí#f¨"(|¶ ÿÿ(ÿéa#||”¬ÿÿZÿ\eˆ#f³£¸ÿÿ(ÿEÛ"ftö¹ÿÿSìÐ#©oÛ,ÿÿNç#©jóÿÿ_ÿ\ÇÙ#yÿìüø,ÿÿ9ÿ\¡Ù#yÿÆüøLÿÿ&ÿEæå#yßüá2ÿÿ$ÿEþ#yjüáRÿÿ&ÿéæÑ#©cÜ2ÿÿ$ÿéþ#©êRÿÿ&ÿéæ´#fà"2v¨Ðÿÿ$ÿévã#vIÿÿ¶ÿÿ&ÿéæ´#fà"2CÐÿÿÿ§ÿéþã"C‘ÿ¶ÿÿ&ÿéæ°#fà"2©2»ÿÿ$ÿé/#©²¶ÿÿ&ÿéæï#fà"2|ä"ÿÿ$ÿéþ`#|p“¶ÿÿ&ÿEæˆ#fâ£Ìÿÿ$ÿEþí"flÍÿÿ&ÿéž#jêºbÿÿ$ÿé5Ý"j}ùcÿÿ&ÿé #kè¼bÿÿ$ÿé5Ø"kVôcÿÿ&ÿéÐ#©gÛbÿÿ$ÿé5#©òcÿÿ&ÿét#|ë§bÿÿ$ÿé5Á"|~ôcÿÿ&ÿE#yßüábÿÿ$ÿE5w#yjüácÿÿUÿE…Ù#yÅüá8ÿÿAÿEâ #yAüáXÿÿUÿé…Ã#©8Î8ÿÿAÿéâï#©õÿúXÿÿUÿéš#j϶qÿÿAÿéoÝ#j†ÿùrÿÿUÿé¢#kǾqÿÿAÿéoÝ"kmùrÿÿUÿé­#©'¸qÿÿAÿéoþ#©Ä rÿÿUÿéq#|̤qÿÿAÿéo²#|‚ÿårÿÿUÿEX#yÅüáqÿÿAÿEo‹#yAüárÿÿ •Ÿ#C »<ÿÿÿ&ÞÛ"C0÷\ÿÿ ÿ\•Ù#y®üø<ÿÿÿ&Þ #yÆý\ÿÿ •µ#©2À<ÿÿÿ&Þí#©×ÿø\ÿÿ •u#|¯¨<ÿÿÿ&Þ°"|Wã\ÿÿ0ÿóGæ"ªw>ÿÿ0ÿóGä"âs>ÿÿ0ÿóGô"·>>ÿÿ0ÿóGô"ÄF>ÿÿ0ÿóGô"¸K>ÿÿ0ÿóGô"Å>>ÿÿ0ÿóGk"¹q>ÿÿ0ÿóGk"Æqÿ>ÿÿå"ªÙÿÿŠå"âÒýÿÿÿòØä&· Kÿÿÿóãë"įVÿÿÿï£å"¸­ÿÿÿíªå"ÅœÿÿÿñT"¹äêÿÿÿåŠW"ÆØëýÿÿ'ÿöÜâ"ªVþBÿÿ'ÿöÜã"â`ÿBÿÿ'ÿöÜô"·,Bÿÿ'ÿöÜô"Ä4Bÿÿ'ÿöÜô"¸8Bÿÿ'ÿöÜô"Å,Bÿÿÿó¤å#ªÿ#?ÿÿÿî“å#âÿx#.ÿÿÿðNå"·ž#éÿÿÿñ<å"Ä­#×ÿÿÿï-å"¸­#Èÿÿÿñ9å"Å #ÔÿÿÿJòñ"ªr DÿÿÿJòô"âtDÿÿÿJòô"·=DÿÿÿJòô"ÄODÿÿÿJòô"¸|DÿÿÿJòô"Å[DÿÿÿJòk"¹fDÿÿÿJòk"ÆxÿDÿÿÿñ¶å#ªÿ}%2ÿÿÿ÷¼å"â%8ÿÿÿòcå"· %ßÿÿÿøeå"Ä´%áÿÿÿôaå"¸²%Ýÿÿÿôdå"Å£%àÿÿÿÝT"¹Ðê%ƒÿÿÿÝU"ÆÐé%ƒÿÿ,ÿøô"ª¸Fÿÿ8ÿøô"âÂFÿÿÿôÿø&ô"·¢Fÿÿÿ÷ÿø&ô"ijFÿÿÿûÿø!ô"¸¹Fÿÿÿùÿø(ô"ŨFÿÿÿËÿøk"¹¾FÿÿÿËÿøk"ƾÿFÿÿÿñîå#ªÿ}',ÿÿÿõíå#âÿ'+ÿÿÿòŽå"· 'Ìÿÿÿñ‘å"Ä­'Ïÿÿÿñ‰å"¸¯'Çÿÿÿóå"Å¢'Îÿÿÿà6V"¹Óì'tÿÿÿÞ2Z"ÆÑî'pÿÿ$ÿéþå"ªgLÿÿ$ÿéþå"ârLÿÿ$ÿéþô"·:Lÿÿ$ÿéþô"ÄBLÿÿ$ÿéþô"¸GLÿÿ$ÿéþô"Å:Lÿÿÿïÿéãè#ªÿ{-ýÿÿÿôÿéìë#âÿ~-ÿÿÿòÿéºå"· þ-Ôÿÿÿóÿé·å"įû-ÑÿÿÿñÿéSå"¸¯þ-mÿÿÿóÿé]å"Å¢-wÿÿ2ÿòèæ"ª`Rÿÿ2ÿòèã"âhÿRÿÿ2ÿòèô"·1Rÿÿ2ÿòèô"Ä:Rÿÿ2ÿòèô"¸@Rÿÿ2ÿòèô"Å4Rÿÿ2ÿòèj"¹bRÿÿ2ÿòèk"ÆbÿRÿÿÿîåå#âÿx2Pÿÿÿïå"Ä«2øÿÿÿôÅå"Å£20ÿÿÿïYW"Æâë2Äÿÿ$ÿ÷Àã#ªÆÿÿVÿÿ$ÿ÷Àâ#âÐÿþVÿÿ$ÿ÷Àô#·œVÿÿ$ÿ÷Àô#ĤVÿÿ$ÿ÷Àô#¸©Vÿÿ$ÿ÷Àô#ÅœVÿÿ$ÿ÷Àj#¹ÌVÿÿ$ÿ÷Àj#ÆÌÿþVÿÿÿóÐâ#ªÿÿþ6÷ÿÿÿñÕå#âÿ{6üÿÿÿñ›è"·Ÿ6Âÿÿÿï™è"Ä«6Àÿÿÿó>â"¸±þ6eÿÿÿïeÝ"ÅžÚ6Œÿÿÿ÷TT"¹êê6{ÿÿÿóTV"Ææê6{ÿÿ0ÿóGë#Ö–>ÿÿ0ÿóGë"áP>ÿÿ'ÿöÜë#ÖƒBÿÿ'ÿöÜë"á=BÿÿÿJòë#Ö¢DÿÿÿJòë"ábDÿÿÿøë"ÖàFÿÿ8ÿøë"áæFÿÿ$ÿéþë#ÖˆLÿÿ$ÿéþë"áVLÿÿ2ÿòèë#Ö„Rÿÿ2ÿòèë"áXRÿÿ$ÿ÷Àë#ÖôVÿÿ$ÿ÷Àë#á®Vÿÿ0ÿ9Gæ"júÿÿ0ÿ9Gä"jûÿÿ0ÿ9Gô"jüÿÿ0ÿ9Gô"jýÿÿ0ÿ9Gô"jþÿÿ0ÿ9Gô"jÿÿÿ0ÿ9Gk"jÿÿ0ÿ9Gk"jÿÿ/å#©|ÿÿ-å#©zÿÿÿò…ä#©Òÿÿÿó…ë#©ÒÿÿÿïFå#©“ÿÿÿíMå#©šÿÿÿñ4T#©ÿÿÿå,W#©y ÿÿÿ8òñ"Ìÿÿÿ8òô"Ëÿÿÿ8òô"Íÿÿÿ8òô"Ðÿÿÿ8òô"Ðÿÿÿ8òô"Ñÿÿÿ8òk"Ðÿÿÿ9òk"Ðÿÿÿñ‘å#©Þÿÿÿ÷”å#©áÿÿÿòAå#©Ž ÿÿÿøFå#©“!ÿÿÿô<å#©‰"ÿÿÿô?å#©Œ#ÿÿÿÝâT#©/$ÿÿÿÝåU#©2%ÿÿ$ÿ9Àã#ÀNÿÿ$ÿ9Àâ#ÀOÿÿ$ÿ9Àô#ÀPÿÿ$ÿ9Àô#ÀQÿÿ$ÿ9Àô#ÀRÿÿ$ÿ9Àô#ÀSÿÿ$ÿ9Àj#ÀTÿÿ$ÿ9Àj#ÀUÿÿÿóÿÿ—â#©äÿÿVÿÿÿñÿÿ—å#©äÿÿWÿÿÿñ[è#©¨XÿÿÿïÿÿYè#©¦ÿÿYÿÿÿóâ#©SZÿÿÿï&Ý#©s[ÿÿÿ÷ÿÿT#©dÿÿ\ÿÿÿóÿÿV#©gÿÿ]ÿÿ0ÿóGÞ"xn>ÿÿ0ÿóG"qoà>ÿÿ0ÿ9Gë"j^ÿÿ0ÿ9G"j>ÿÿ0ÿ9Gë"j_ÿÿ0ÿóG¿"|rò>ÿÿ0ÿ9G¿"j¡ÿÿƒ#xª§ÿÿg#qªªÿÿÿÝå"Ö½ÿÿå"á³ÿÿ1Ù#©~ÿÿtAÌ䪳²72>73#"=3} !1JL %*Oc2( ÿÿtAÌä³Bÿÿ lGÔ|ÿÿ yG„#«°jÿÿÿ8òë"Íbÿÿÿ:ò"ÏDÿÿÿ9òë"cËÿÿÿJòà"|mDÿÿÿ8òà"̰ÿÿÿ÷å"Ö×#ªÿÿÿãÒå"á‘#mÿÿVå"Öð%Òÿÿ0å"á´%¬ÿÿS\Ù#©©%ÿÿRA„ä#Ö“ªÞÿÿBAhä"áEªÎÿÿ 9Gj'«–ª øÿÿÿÍÿøÞ"x¾FÿÿÿÛÿø"q¿àFÿÿÿãÿø*ý"ÔÁóFÿÿÿïÿø6ø"ÕÍîFÿÿÿÇÿø¿"|ÂòFÿÿÿðÿø*l&¬ãèFÿÿÿý*„#xÿî¨'ÿÿ g#iÿîª'ÿÿÿå-å"ÖÅ'kÿÿÿâ$å"á'bÿÿDAsä#Ö‚âÎÿÿQA€ä"á]âÛÿÿ 9Gl'«˜âøÿÿ2ÿòèÞ"x^Rÿÿ2ÿòè"q^àRÿÿ2ÿòèý"Ô>óRÿÿ2ÿòèû"Õ>ñRÿÿ2ÿ8å"ª~Nÿÿ2ÿ8å#âˆNÿÿ2ÿòè¿"|aòRÿÿ2ÿòèk"R¬\çÿÿ •„#x°¨2ÿÿ •g#q±ª2ÿÿÿÚ+å"Öº2–ÿÿÿÉ5å#áÿw2 ÿÿÿó²å#âÿ}/I"li  #'#5!#5¾A:aSES žžISSSSÿÿ"li ÿÿ PñäC ÿÿ$ÿ9Àë#Àjÿÿ$ÿ9À#ÀVÿÿ$ÿ9Àë#Àkÿÿ$ÿ÷À¿#|ÐÿòVÿÿ$ÿ9À¿#ÀÚÿÿÿ¿ÿé"å"ÖŸþ-<ÿÿÿêÿé"å"á˜ø-<ÿÿÿÇÝ"Ö§õ6FÿÿÿÚýÝ"áˆÝ6$ÿÿ4˜Ý#©å6ÿÿRP#ävöÿÿvAÎä´J.ð8#5î8HHÿÿ.ð8óÿÿÿûð18öÿûð18!51ýÊ8HHÿ÷ðé8!5éü8HHÿÿÿ÷ðé8÷ÿÿKÿòí¤ 4ÿÿÿkþêÃÿ‚ÓÄAݞŠ#54673ž]0-00Ýe;D&N@ñÙ 356=#@]]00Ùe{&M@ÿ€žh 7356505#A]^10he{&I @ñÙ #&=00]ÙhM&{e0Ý+Å #54673#54673]0-00ž]0-00Ýe;D&Nhe;D&N1Ý.Å 356=#7356=#1]]00 ]]00Åe{&Mhe{&M/ÿ€,h 7356=#7356=#/]]00 ]]00he{&Mhe{&M1Ý.Å #&=3#&=Ž00]ý00]ÅhM&{ehM&{e&ÿOÅ ###5353ÂXÁÁXöRý«URÏÏ&ÿOÅ#3##5#53#5353ÂÂÂXÁÁÁÁXöRþÍRÐÐR3RÏÏ2Ü,Ö 2#"&4{hIJ34IÖJ52IIhFÜ,Ö0FææÖ|}ÿÿW¿hÿÿs'h'hÿÿsth'µ'hÿÿWã¿Ky ÿêáâ $.9C2#"&46"2654&%3#2#"&46"2654&%2#"&46"2654&ž?WX=>XX=%56J55(BþuB‚?WX=>XX=%55J65B?WX=>XX=%55J65ØX@=XY|X<5%&55%&5Fý +X@=XY|X<5J65%&5XX=%55J65B?WX=>XX=%55J65ûÅ?WX=>XX=%56J55(BþuB‚?WX=>XX=%55J65X@=XY|X<5J65%&5Xé "05>32&K·Y9€UV€9Y—Y@9229@Y#ÿ7“3#'#D>‰š>{y>âûÈÈÿÿ 6Ù' ßþI' ÿâþJ ß5¡[A!5[þÚA  ÿNÿìPÅ3#>þ<>Åý'yÿ,Ù!7;#"&=47.=46;#"Æ%.49R.$94.%",,"V¦'AE>¶x&FE¶>EA'¦F; E <ÿ,ºÙ!74&'5>=4&+532+53265m",,"%.49$.R94.%VE< E ;F¦'AE>¶EF&x¶>EA'ÿÿM)å#","ÿÿMüå',"ÿÿ|å&".ÿôœ #>7!5QJbFaþœJg”cT{‚W0ÿO Ù####532 mb@R@9ú^‚é^ƒþLJü¶J@‹Jú 7".54>3!#33îB`--`B 99ËRJDi>=hF@þª@–þªV Jú %!53#5!2#3+þõ99 B`--`‚RRJ@V@Ci?>iD–þªÿÿ(W" þI?ÿm¨ 3##"=?hhi<#i hþÄh4&&ƒx;XÎ %270#"&'5"5>32&K´Y9€VU€9Y··Y9€UV€9YgY@9229@YY@9229@Yÿÿ(Wå&  þIÿÿ<>Û' 'î'yÿåyÿ%ñ3#"&/&#"#>32326Å+H>/-##5+O854$0 #91  .14 ;ÿ4Xÿß "05>32&K·Y9€UV€9YsY@9229@Y$ÿòï½a'&546276327632#"/#"/#"&54?&'#"&54?&'#"&463267'&546326q "." m! *™» $$ º›* "m "# m  *™» $$º›* m¨º $$¹š* !m "." m"*™º $$¹š* "m "." n  ™ÿÿ<ÇD'yÿ'yùyå ÿÿ1¶GÌ& ' Ì' ™ eÿÿ<–²&yåO'y×O'yÝÿyÝgÿÿ<™Å'yÿåÿ'yÚÿ'yÿåw'yÚzyßTÿÿ<¤'yÿåÿ yÿåÇÿÿ<ÿ9– 'yÝþV'yÝÕ&yåy×ÿÿ<)  'yÿåÀ& 3'yÿåÿH'yaÿHyaÂÿÿ<ÿÿ¤ 'yÿåˆ'yÿåÕyÿåÿÿÿ<¤&yå'yÿåÒ'yÿåÿyÿåýDÅ4 #""3265*LI•ð¶Z/-éÜßin‡­®U[”Ë÷#7#5Ë667nþ«U‰EEQÅ #533##=мÌ.CC>€; þð5d™ªªFÅ#632#".'332654&#"#7.¾&.BRXE%98I/56.1#4"Å4wO?CU, G4./7(èGÅ$4>32#&#"632#"7"32654&!.)5D8?14&C=OTAšœ*45'(30Ý8W1 ;4@SN/L;>Qç1()64(+1GÅ #>7#5G•$=QR÷Å,¹Äh m4HÅ*#"&547.54632&"2654"32654úNVCDUN#M<=LJH++H+$V44*,4û"H:IJ:G"'1@?2&‡$%%.%&..&%FÅ$#"&'33265#"&54632"32654&F!.)5E9?14)?>NTAš›'30(*55õ8V1 ;4@SN/K<>Q.5(+23')7,Mh ##5#5353L†.††.á.††.†† ³Sá!5Sþ¸á..ÿÿ lS & Q¹ Q)o¼ý! 3#.546Ù$YY$199 ¢¢@¥ML¥ÿÿN¼Ü! SKÝÀ'8x3>32#54&#"#(24&1;6& *27n9# 3*þþì$?4¼ÿÿÿ+Dá HþÿÿEÿ8æá{þÿÿÿ8Fátþÿÿÿ*Báuþÿÿÿ8Qá Jþÿÿÿ*Fá Kþÿÿÿ*Gá Lþÿÿÿ8Gá Mþÿÿÿ*Há Nþÿÿÿ*Fá Oþÿÿÿ‚M¾ PþVÿÿ T7 QþVÿÿ ÿÑTo Rþeÿÿoÿýl SþKÿÿLÿÚl SI(Àÿ5T£)47632327#"&'#"&54>7>=4&#"26="…?A7=4< ' ($&'6-9A0'#4o0-È)27. Ï0= 3ÿ9K§#3273#"&46323454&#"Jû5C7 M;GSUG0I ù¿6()5 .-E8?a¨e0*$+:9ÿ9L§ 72#"&46"32654&°JQRHIQRH-44--43§aYSaa¬a2H=>GGxr>RR=°‚‚­§{{ÿ9J§;&'&#"#>32#"&'&7#326û5C7 M;GSUG0I ù¿6()5.-E8?a¨e0*$+:9&ÿ©A $*0#7&'#7.54>?373#&'>73'&''O 7+#7<8&9];7,# 7BTk=C Uüv .t"OiKU@C[|6°Y/_fO8((<\;~- ýù e_þçL;ýÊI~‰ ÿé9å)4>32#&#"3>32673#". (>fAÏ!RZi?8M$C( TT”S ‚q@f<(d2bjO4ÜŠ¢Œf‘O_;3UJgg³€†3Ni`,Ù3###535#53!!3ÎþþSOOOO£þ°þ‹B7þî7B7RÅ7ÿéÙ93#3#632327#"&#"'67#53&'#53.54632#&#"“& ˆ}†Y;?!h(+*9J+†#580e|nQ"‰e5>,X„@M ,> 7(62Z'B8.%BW>6!!791![{ 1W9šFFÿ§úr&*3>32>?3#4&'#5#54&#"#7FM"K4a,#D0<7>58T'#’T•7Ì3.3HT„Y'1 J/*P*$W[ I;þwi+5Õû€Ù*˜27P9þ·K‚ GG“Ù#&)##'##5#535#533333##5##3'##3'“3]ƒ¾N----ZйO33O“3ï˜2fO::þ±@@7FññññF]FÿÿÿÿF]]]]£lUu[ÿéÙÙN3264&+#327&'332654&/.54632#.#"#"'#"&5#+#!2353¸ÂCKKC–VX5E7C$-4Y?YY«X&0'1S6PDucz2> 14CiKå]-jt8LZ>3 +(ŒDOþËÙjcÿÿ]ÿéxÙ'V­525Ù#'+.14!#'##'#53'#53333333#3#'7#!7#;'##%#3'˜W9©7W5iZF78X3KL>;HGÈ6CF1_nn\_2NNKþW.eRSdcRUdÈ?ýØ>,'ŠwqˆIŒ?))ýJ??$ÿékÅ0".'#73&547#73>32.#"!!!#3267¤>g@/S7O?/@l@c^3K,DsEþÉÿxD)E9G-AQ=;;9QA/CI&d_;;\k"Y+’Ù##533333###¬]77]F%xþ×ë¹ùn÷ÿÿgH*þÖ*þ×Hþ™gQÙ#5575575#5!#7ò]““““ð<ï™F]ö¹_F_f_F_ÜRRŸ]F]f"ÿ8'× 3654&#"2654''#>7.54632#b5( (Ghq;'j…C%ZK:P[DG}R§\F(%3ýÙ."t”êssPu@. (! K[J8e¤c¦aM]'šÙ!&-327!%#3#+##535#535!2)&+!654'¸ÂQ%þÈâ42<fFå]4444-Qlþ]3%LÂM‡1¤0 0=Fþ˸0D0}@=+[DZÿ£“ "+3#.'>=#53#'#5.54>7_Blu¿2:xGPOxkÜ 52JÎþ¨4 @;V@7T2 +<753#.'>73'b;þú(6N0;lh_8CL=`oy;YP~hd"=H;;*64`sG9ýÀDaˆnT> ˆ…þñýø.ÿîì!67þ Z^O S$Mpb ýø.ÿîì!&'7!ýø– O_Yþ S bpMÿ6ÿòÿm¤3Ê7²ýNÿÿÿÿY3ã<ýèý§"ÿ÷y !&'67 ýû OAbbAO à$ bM^^Mb ÿÿý§"ÿ÷y ‚ýžœÀÿÿþ)„'yýÒ9'yþ‰9yÿB9ÿÿý´F®#jþØÿâjý–ÿãý2ÿ: 2#"544&#"326ßçþöåäþ÷ôÈÅùõÈÆ÷þòà×þéÖÜþÏîúÃÅøöý1ÿ?!!!ü#Ý.üÁÝüQüý4ÿB ߪþVþW©þííz©©þWþííþý2ÿ:4&#"62#"54 32Ýôȱx€eþDçþöåäþ÷ý‚eõȯ(Ïîgýw þòà×þéÖÜü¸€x®Åøýv*!!.'7'>7!.'>7ýÁô*$!#=##=#!$*þ *$!#>##>#!$ç,+.*#??#*-,,,,-*#??#*.+ýCÿÃÿóí #ýdLýœíüÖ*ÿÿþËÿòÿm¤ 4þ€þPZH~#!5HHþP~ýÜÜHÿÿþ)ÿ_ÿÇ'yýÒþ|'yþ‰þ|yÿBþ|þ0÷¯!#5!#Gþ¿HÐGgp¸¸üBÿÐ" !&'670üå2y#d——d#y2781—#ww#—1ý®ÿJO###Jþ>GÅOþ>GÅOýN²ýN²ÿÿýûÿ ÿñÿÉ ýé÷ÀÿÿýøÿÿîÿÌ ~ýæúÀÿÿý¶þâÿäG ‚ýI@0ÿÿý§þàÿ÷ÿâG ‚ýž{ÀÐþÓ6ÿ˜ò37''7'7ß)E F-!()!-F EòI':==:'sÿìÙ:FJt"#>32327#"&=0#"&546767>?654&3267%3#2#654&#"3273#".546i(C dS?M3    6=#5l.11sN%"5Z­:ý¢:g>MC,&&=!1)Y%C!&8 +>ˆÃ CE1)ñ4   60#=  ¤=7%ñý'ÄE0  "('6C0/7e'"21¨sÿìÞ:FJz"#>32327#"&=0#"&546767>?654&3267%3#4632#654&#""&547332>54/.i(C dS?M3    6=#5l.11sN%"5Z¼:ý¢:ªgS:IC&$-9D=4-lYFOG-*!1 8;>0à CE1)ñ4   60#=  ¤=7%ñý''AZ4* ,  *%GU70  (ÿÿÿéÑå"r‡&,3­%,4>753#.'>733!5.4%G1JC> K K CIØþÞ1G%­/45n$GI3PP QCþµ& Ob ACƒ3GG‚O XFCWTÿì€ë)->P2#654&#"3273#".5463#2#"&5467>2>54&#"H>MC,&&=!1)Y%C!&8 +>ˆ :ý¢:\ET#CsDT$_'>"1-&="1êE0   "('6C0/7e'"21¨%ý'ÂSB5u&\SB3v&-0þ|&6B017'5B008Yÿê³ë-E3#2#654&#"3273#".546#7#"&5473326?3æ:ý¢:Å>MC,&&=!1)Y%C!&8 +>ˆy= #I/3;EC?' 3O 3CÅý'þE0   "('6C0/7e'"21¨ý.".) Cþ× "NAíÿÿ0ÿémåRÿÿ(oÙ"r‘),!ÿêØÍt}326?623>3232676;2#"&54?#"#"&54632#"'32767#.5476?#"&54654#"+"54632%"67654#!'\&™ä€jÃaG14®tIc9#U( <^$:9L@<.yAÃP9K0#!$ ?4d–+HŸ\  VÒJ3.)%4$ i'!&j3–bÜP0@73%•þÕ©@6FI?fE3K8 FD60TkY¨[ˆ)& @"×>YkyW963 kU™…pD+-ÿ‘OÎi27&#"7>32&'654&#"327#"&54>73254&#"#"'63232654&54>7>58A � *-0Me4(,6 # +#$! &#.4   Q`K N (2$ %D0R  +'³ W,!  -"’p)EG,,6 0#"0(9(  Á[n?A1M+ S+$!7)!8Ù3>32#654&#"#·T9/T8?HPTI/&Dd=TÙþò,$C;þˆW &/`RþßVNÙ>32#654&#"#?3U/T8?HPTI/&Dd=TzVWT ÃH“,$C;þˆW &/`Rþß?HR3:ÿï¸ÍM>74632"'326?&547>7632>54'4;2#"&Á>K(DO4_'M*3<þy/#!$( v?ž=^5&xm£5LtG)(Hq Q;Ý\:NU;!y:UE# ,Tþ«?":{VWAL6G,0ieK[xG *W| \‚(ÿ©O»846323254&54673#"&#"46323273#".#"BT569"Z 'YD1Ž``1J(!0TO>&B';"#W?Z4dAJ#+?GaZ€4% Ž{ !?.l#)# !J8 ÿï ÍGQY4>32#"327>3232676;2#".'+"54>;26?#"&"327&"67654%Yƒ:!O¨`O7\gZ#,-ΰd=dnG1x" M|3'O/'fR„ A+EWP:V c€}"0^:H@Æ&çÁU/Í5sK ‘H16Lrm:)$]°ŒU=B/KD2& :Rz@þ¹-mþ¿%xC.3ÿõ°¥%0327#"&54>7'7>324&#">°-S7**F?[8/5\ o%(?%$/=#+#+H%X$LI*‚\&v=W54&#"#"&547&536324'326*L2m2!'8 1B ?,0(,0/+(((2s–JUþ–9!þ.ZR3š.<'BD%IX$-M/$7\30CG.iWDj&@÷zþ’>X8YG!ÿþÿïwÍ ‡‘2>54'%32676;2#"&54?65##"&54632#"'326?46367&#"3267>=4>32#"&547>3272"#"&#"6dDnnp*"0>+ "K]/ ¦" OQ4""J>ÌU;P/#!# >3;Ž=[Ž<{jç@7BF%?&  m1&:8=ûv…J2 $þì m y@'U¶À%E/(+0i(GD…2#qHnX€'$<" wU€ ¾f,wZO4 615 K:D()*H)/?NVˆ/  ßÿø­å!H23273#".5>54&#.54632#"&5332>54&#"[Ž‹),#  P42(9#!&%O[þÀaMLW*L9-YU$&&/ åNF)M+.EP70 16'Ev…`4' š)?PuY‡¼“GD, ?FrbK.J!> U"ªì(5264&/&54632#4&#"#".53##33#4-(lQSHLTC1."0&mX#G185 CFFyC^„ƒ[Cb%6 S;EG@#'! X+* ?,'2>Uþ«µþ–jþKUÿÿ1Ùf7!33@g(×$¯.°G/M$¯.°?$ªÙ##5!##33#Dšw6FyC^„ƒ[C¢þ‚~77þ‚Uþ«µþ–jþKUÿÿ4ÙÝ6ÿÿÿ×¶´ 6ê´ÀÿtèÁj"#".54>32#"&'"654&#"3"&54>3232732>54.#"#4>7.'6732654.ú9D0  1Z9FQ7S[06%*3& !8 .'++' 6!!  +J.S="1)! ;QJg %@j!E-! (2D8(.\=Bl 4Q-*A%!* .!<&%/ S7 / 4D7'n6  2[G %-%ÿÿÿÿæF ÀÿÿO’Ù.ÿÿ´‡"ÿò Ämxƒ74632"'3267>7&#"32>=472#"&547>327632#"&54632#"32>54'#"'#"&>54'632"327&"/"!$( B6;=IR™L?yoã96K:uA ­`5,7<öv†I4  5T78ÀZ /rX'A% !,oL%D5F?ÍU;NÏ(SM€'+   $/><" yVgm¤8'xQL5Any m5#7.54632677'"&464'327632"#".##"&">54&5467&)!!/2 LTs^V*!es!  &L'D1>A   V %P?$85BQJH CT!$N% 5 1²a·E 60!v$'* -$+-?#+A  Y   Aq…k^¨1  +¡.?Q0ÿÿ(ÿéHÿõœ¹&%#"&54>32326'>54&#"f ,n5;IZF%+p 3+ <©6Q+&`m 39L=I”^$ Af()1 &$*cC-ÿøÇÄZc74>7&54>2#"&54632#"32654#"632#"'32>54#"#"5>32#"&4#"326-9WGaŠzRe3&Y* !D-#S|+X<%3$?%3R.N=1Y6 a'N _1##>zJ216o+X P ]+J>TP JND3/.@:9^6 =n+/ "2OF< )ÿêÞØS}„74632#"'32>7+"5467>763267>32#"'"547#"&4>3232#"&#"32654&5463#"&>5&#")0#!$ ”+bV:@z ¦R *&,3?&  $'#C!t 7(/ûgF`Ù~¼TBÄ? CÃ@G…W5A\{ p#4é-;@"@;_K&%!=J;!.&A5,2 537!.n¶(˜>aM'M4MU!5{>"Gz#E !ÿÿ)Ù)lÙÀÿÜ¿Ïn7;>7676332>7>?6332676;2#"&547>7#"=>7#"&5463632#"'B: *Y:s IV<kþŒ "*1© v-“/G-o  Gl'+-?IvFþô-47…B@Ca"Z[è¤4#"+ÿÿÿôgÐ ›¹À/ÿìºÈ @D##3#/2#654#"#"&547332654&/.546763#`«J;ùH<=sc&9 5[3C#g&#*M1DM403>J $g$1[:ý¢:–ƒµþK²ÈÈ  ! B/&  2 !.&=6 )&4&  ,93 ý'ÿÿ(ÿÿ°G)÷GÌÌÿÿEÿì[Å#uþê# 'm{ÿÿÿì[Å#uþê"t 'mÿÿEÿì_Å# Kþê Ùÿÿÿì_Å# Kþê"t 'mÿÿÿì_Å# Kþê"u 'mÿÿÿì_Å# Kþê" J 'mÿÿEÿì`Å# Lþê Ùÿÿÿì`Å# Lþê" K 'mÿÿEÿìaÅ# Nþê ÙÿÿÿìaÅ# Nþê"u 'mÿÿÿìaÅ# Nþê" K 'mÿÿÿìaÅ" M# Nþê 'mÿÿEÿì½Å"{ 'mÿÿdÂÙ,ÿÿdØÙ#,,ÿÿdîÙ#,,#,,ÿÿd›Ù#9,ÿÿ…Ù9ÿÿ]Ù#,›9ÿÿsÙ#,±#,›9ÿÿ‰Ù#,Ç#,±#,›9ÿÿdŸÙ#;,ÿÿ‰Ù;ÿÿ]Ù#,›;ÿÿsÙ#,±#,›;ÿÿPÙ/ÿÿ0ÿé¥å&ÿÿY›Ù'ÿÿKùÙ0ÿÿBÿú–ÙLÿÿBÿútÙ#LÞLÿÿBÿúRÙ#L¼#LÞLÿÿBÿúÄÙ#YÞLÿÿ æ Yÿÿ ÿúŠÙ#LôYÿÿ ÿúhÙ#LÒ#LôYÿÿ ÿúFÙ#L°#LÒ#LôYÿÿBÿú·Ù#[ÞLÿÿÙ [ÿÿÿúŠÙ#Lô[ÿÿÿúhÙ#LÒ#Lô[ÿÿD˜ÙOÿÿÿéÝFÿÿÿéïÙGÿÿFúP ÿñ®ÿ !&'67®üå2y#d——d#y281—#ww#—1-;Ž !#'67&'P81—#ww#—12y#d——d#y21ÿñ¿ÿ 75!&'7'6712y#d——d#y2Ü81—#ww#—1-ÿê;x 367&'781—#ww#—1xüå2y#d——d#y2ÿñÿ!!.'7'>7!.'>7‹A82%6/^66^/6%28AüþA82%6/^66^/6%28DCF @6a00a6@ FCDDCF @6a00a6@ FCÿêŽ!%'>7.'>7.'7òDCF @6a00a6@ FCDDCF @6a00a6@ FC]¾A82%6/^66^/6%28AýBA82%6/^66^/6%28%0#654'327#0#(ýt1 X"q¯S@(ŽS¯q"X 1ÿÿ‡ ÿü&À@ÿÿ "+Àÿÿ‡ &@À0ÿî¿03!&'7'67!#08ä2y#d——d#y2ý8î1—#ww#—1îÿñ®ÿ2#!&'67!254&# NTVIý€2y#d——d#y2}i36æG;DD1—#ww#—1Q#+-ÿñ¿ÿ"3!&'7'67!"&546Ï63i}2y#d——d#y2ý€IVTæ3+#Q1—#ww#—1DD;GÿðZu3!'7!#7þ[¦¦nuýÏTpoT Ü®ÿ!67®ür‰’#y28v­#—1 ÿì®%!&'!®ý2y#’‰Ž×1—#­vÿÿ8ÿb\ñ‡ ÿ\À@ÿÿ#ÿ_Gî‡ 8À@ÿÿ ß® ÎîÀÿÿ-ÿô» ÛóÀÿÿ8ÿ‘\ ‡ Hÿr@Àÿÿ ÿ’D!‡  ÿr@Àÿÿ ÿ•®X& V ©ÿñ«!!!.'>7«ýQQèýHM)B\[[\B)M~5PP5b!QaVVaQ!b'7'>7'#'#H!QaVVaQ!b5PP5m)B\[[\B)MýHèQQý¸-ÿìºü'7!5!7'!5!'7Á)MýHèQQý¸M)B\[[\!b5PP5b!QaVVa,ÿí<z.'7373!QaVVaQ!b5PP5)B\[[\B)M¸ýQQèýHÿìÿþ!'7'7!.'>7!7'!ñ8L(PXRRXP(LýÈL(PXRRXP(x‘TTýoT}_"`^KK^`"__"`^KK^`"þÃVVV'ÿŸ7!'>7'7.'77'7H!QaVVaQ!bb!QaVVaQ!bÕPPPPÿ)B\[[\B)Mþ(M)B\[[\B)MØ0QQýÈQQ ÿø/6%#"#".'#".#"#52>32>3232>;&'7'6¼`w:<=92), (#7A>9;<9D= (#4g2y#d——d#yãgNc bP>I>"854Oc bPcc#1—#ww#—Ù 73#3#ÚKhÿxþücMÿèxþÛý'ÙÛNþ´+ÿéÅ%2#"&54632.#"#>"32654&#@G3!îeƒz_i:QL.> X k]@JP=>RRÅ3R^þ¦‡hc~O‚‹83Wbþ¦SGCW[DBSZTÙ !5!5!5!!5!÷þcþdùþLRéRý'RÿïÍ# 32654 &#"3#"'#7&54632ŠþJVt·ýÙ·Wq·nFi\ט‹fMJrYטˆh*þFJ·uþ÷I·qÎjgŒ˜×[Nsf‰˜×Y ½Ù33 ! &d)þ¦Ô§Ùý'hýê ½Ù!#7! ³þ×d3ÓþYÙý'q7h!".546;#!!;~Es\3³˜”ï”þm-IP4Œ!FyR˜žFÊF;Q)F7ÿ¯!33#3#;#"'#7&54677#?t7}”BÖì76YŒŒ^E7%užˆœ.p }Aº¯GFÑF®F[tM¯Ž þ’b¨Ì²-ùÔ74>;#"!!;#"'&-&5B1íí*6. ”þl -9%ííqJ$ê7W1 6 B/62C 6j2ÿÿ7ÿÿg IgÀ7ÿı&3#7#537#537&'#5323&>7t7%Œ2ZqD7[q>·Î<2D”P?4 >/H@'±tN½QxF"<32&#"32>7#".'#"&54>32.#"32>d+)H!+.#  ! i)   &6$M,#g7"9|±”1Jd2>32#"&#.'#"&54>32>7.#"2654&#" §  !"!'<N9 5*+(*9N;3-1    )1Ô1-1)    ”   !0*5Y& Y5*0 = ! ^dH! !0Ee3V„SZsS BLÿÿdÿ ¶ÿ" : :ðÿÿdÿ Vÿ" :# :È :_ÿ Æÿ 6%654&/7#"'732=.546754632&#";P+%U$- 'ÛN8%<>! ^(: BEdH! !0>H¦ W&<  >/&/ zJYpEe3V„Ž ,6+9?A7.2")Q8‚?J,23 ' A8?::F/;1+#,!ÿÿ%!ÏÒ‡ ?ÿÖ@À3äæ 7#7'&#"#>3273326=3#"/¦E/571*q@590'*âNFKÉæ!%:Eÿÿ*$"t EJáÀÿÿ(m ½& '¨ ?E( æ&7#7#537'&#"#>3273326=3#"'!!¦E;t›T7/571J9@H590#(AþÀiF•$NFK,e‚ !%:EvFÿÿ2$& µ ? 2ÿí,#7#537#5!733#3!"#>32326=3#"/&ÛE!…®=ëCŒµ<ñþåF/571u590'*b7FfF11FfF±NFKE!%:E?2 .7#7#537#537'&#"#>3273326=3#"'3!!!¦E?c5˜¼@N/571`)@6 5902æþ÷4=þ  FfF2NFK8Pk!%:E bFfFÿÿIpüæ& ?¢ ?þnI,ü:7#7&#"#>327'&#"#>3273326=3#"'326=3#"/¼E\ /5715I/571]>@L 5905>590'*=,£NFK_/NFK7oŠ!%:E `$!%:E'3Ò5$"#>7>2#.'.267>73"&'.'3C[Z# Z[Z "µZ[" [ZZ #“ +5  5+ ñ +5  5+ ÿÿ2o &  „u2ÿìØ%!#7#537#53733#þþ6K6—´*Þû3K3ž»*µFƒƒFfFwwFfÿÿ(Y Á& '”& '% '¶(ÿì  %!#7#537#537#5!733#3# þÓ.K.€ ½Ú ú(K(–³ Óð ŸFmmFKFKF__FKFK-ÿõ %!55% þéþvŠ8CC3EÏO¡¤O-ÿõ %!55-5þéþŠþv8CCxEÏO¡¤O-ÿ÷Ú %5% %5% ¦éþvŠüžéþvŠÆEÏO¡¤OÏEÏO¡¤Oÿÿ-ÿ÷Ú S¼ÑÀÿì ?367>73#.'.#"##7#>76?&'.'3323lKE+" %?&U5 "Z-FKC1# (D&Z8 #Z- ¥ +5\5+ §Ÿ +5Z5+ -ÿì 75%737'#?-&@K0hJÙõ0K;/ ÆE|™r,O;°ZOhsŽApA-ÿ¼ð3#75?'57YK@²þݪ]OjÎCCCCéBj>-ÿ²²!!#7#5375?'5737ÿTSþK.KD·>õGKR$y°ElÇCCCC¡=OK”fOt§ÂAT1ÿÒ.".#"'6323275% $YLF%()|!YPG(þéþvŠ.//P„/0b”™EÏO¡¤OÿÒ.".#"'6323275-5$YLF%()|!YPG(þŠþv.//P„/0b”ÞEÏO¡¤O-ÿ÷Ú752$7&$-|mTqgkxIfþøÆEs\OL@DJOZuÿÿ-ÿ÷Ú \CÑÀÿÿ(ÿÿ [' 'ÿ: \ÿÿ(ÿÿ \' 'ÿ: ]‚-ÿÚ752?367&'#7&?-Š—MK651\;!3R3`vGKRo‹ "ÆEK¸€#)OTP<4OU7©Ã)-ÿÚ33"#756?.'567&PK[qeŒ™CK+3.Z8#2Q2^u$ $Ù*EMŸe!'OQS<3OS7]7X!".546;#;~Fr\3±–””þÿ'IX9ŒDwR—•FßB\2Fÿÿ7X bIXÀ7ÿŲ33#;#"'#7&546;Ÿ7XoŽ-<ŒŒE97˜±–Ÿˆï²ZFþ? FJ\DÇ—•þ ­ Ø”7ÿ¾«3##7#53&+532654n7%’°•7_u.@ŒŒI:‡é«vFÖ–BBF¿ FUþUÕÿÿÿêº' 'ÿòÿ% bbÿÿ6ÿë.·' 'ÿ& c_ÿ±î$%!#7#537&546;733#;#"''#þŸKLk,z±–+K>È0BŒŒP?» þÿ0F99FbJ²—•44FþBFF£¡ß„6ÿ±.î"3!!#7#537#53&+532654ÀK@G¢‹^þƒK0Oc‚½=nŒŒyO£ÅîKˆ•/F::F.F¤(F-tþ”ÄV(ÿïÜì !&'67%3 &=33265/þõ!RCffCR!pHÌþäÌH¬fd®K&!fQaaQf!¡´ƒÆÆƒ´¾b—˜a4,ú%!!!!,þøþM³òGþÿÿPHó k|ûÀÿÿB:ˆ' 'ÿ= kŽÿÿB:”' 'ÿ; lÿò¡ÿÿE7ù‡ k=-À@ÿÿE7ù o|úÀ+ÿñÝ£ 33##5#53$264&"6  i6ßß6ÝÝþ÷«ò««òàÊÊÊþâAÜ6ßß6^ò««ò«þMÊÊþâÊ+ÿñÝ£ !5!$264&"6  ~þòýâ«ò««òàÊÊÊþâ/6^ò««ò«þMÊÊþâÊ+ÿïÝ¡ 77''76  264&"Á'œœ'œœ'œœ'œþÎÊÊÊþâ•«ò««òä'œ&œœ&œ'œÊÊþâÊÒò««ò«+ÿñÝ£  '264&"6  Hþ &`þ>«ò««òàÊÊÊþâçþ &`Jò««ò«þMÊÊþâÊ+ÿñÝ£ 2#"&546$264&"6  †&$$&þñ«ò««òàÊÊÊþâŠ%4$%(9ò««ò«þMÊÊþâÊLÿÿq"!!#’Þþ"F"äFø"ÿÿÿÿD" v!ÀÿÊŒl!#!5!ŒþäFþå}&ý¤\FŒ¢%!5!3ŒýƒFFFF\ý¤Lÿÿ"!!#’ˆþxF"äFø"Lÿë$$ !!!!#’’þn’þnF$ FpFœ8>>ü-5%>þHþÕññþ}Š>>ü7->þH+þÕöñ~ˆŠÿÿ>!>Ž' 'ÿ\ |’ÿÿ>%>“' 'ÿ` }—Êœ!##3ÊXüÿXMþ›ÿÿÊœ €èœÀÿÿ=ÿÝ¿ ƒüÊÀ=ÿ®¿í%#".5332653¿M–\^˜MR—YaRèLŽ``ŽLý÷X‹S W.Ó« 2#"&546”&$$&«%4$%(@m–² 373'7@‚))‚j(ii(6||L}MM}>ˆü ?'%%5†ššH%%þÛÝš’okþšöÎÎþ ÎBÚk(ÿÈ ˆ#367&'!!#7#537ȏ7£K53.\:$4S3axV5þ¬KYxbnc‹˜5 !ˆu!'OSP=4OV7ÀF77FÚ(ELx(ÿÈ ˆ$33"!!#7#5375>?.'567&mK`h]ƒUkþvK#B=<75I)9V6f~#ˆ×$ED¿F77Fˆ&.O06C>7OZ8YBÿ¸:î33#!!!!#7#537#!!èK3:^´þÊ']þ%K%,P'wsØ´þöîfGþHNFJJFNòþVcþBÿ¸:î%!#7#537#53!5!733!3:þ~$K$+O.}¡³þ¬y-K-4þÐ.³ÇFFHHF\GcHZZþ\þc'ÿè Ï# 32654 &#"#"''7&54632ŠþJVt·ýÙ·Wq·‚$[\ט‹fa%aYטˆh*þFJ·uþ÷I·qâ#[gŒ˜×[b%bf‰˜×YbÿÿÙ!##bÖFÙFýmHÿÿeÙ##5eF×Ùý'“F_ÿÿ|Ù333_F×ÙýmFIÿÿfÙ)533fþã×FF“æÿ4Æ€ 4632&#"ædH! !1ÌZsS BLü“dÿ6;&#"'7325;%<>! ^&ýEe3V„;žXI %"05>32&K·Y9€UV€9Y÷Y@9229@Yÿÿ;›XF ’“äÀÿ::ê#:ââ;ææêþ(þ(ØØÿ:0ê3#;ææ;âêþ(þ(Ø(ÿ8T #57>7T_{RJ(R:…þÜöó¾b†7(ÿ8z 3#(RR ü(ÿJT #.'&53T.:R(JR{¶7†b¾óöÜþÿÿ,ÿ8X ˜€XÀÿÿÿ8X  —Þÿÿ,ÿKX! –€YÀXÿ8MN#3#0¤Lõ©ÈLXÿ8¤ #0¤L üèXÿ M 03#¤©õ ü5Lÿÿ7ÿ8,O ž„XÀÿÿàÿ8,  ˆÿÿ7ÿ ,  œ„XÀæÿ4;$#;U$üðÿ÷ÿé Ù !"32654&'632#"'#57537BPPBDUSØ9ihx|hk;K??SBÍo¸ooY^p~†V”‚ZC2@2zN3@â¸%53!53›Gþ0HHp¸¸p#ÿóòÂ!3##52672#"&546"32654&ˆ%54&#"#546322#"&546"32654'.þßsG/3)(0=T@BW=Z) W‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+r©4 QK.=.-97- ?ST@9P<Õ’•ÓÓ—”Ñ!l\|‰À¿ˆc'-#ÿóòÂ2>M#67>32#"&54?32654&+532327654&#"72#"&546"32654'.66@&=PDQTC32"32654&2#"&546"32654'.3)19 L;LS>%C!M+en)67*&//‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+rè ^Q DSAE\'9nb<(1Ö=.3C<15?EÕ’•ÓÓ—”Ñ!l\|‰À¿ˆc'-#ÿóò %!#>7#72#"&546"32654'.î8SYDmMþ¢‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+rH*yÇibã\¬Õ’•ÓÓ—”Ñ!l\|‰À¿ˆc'-#ÿóòÂ"-9H"&54767&54632'"32654&"2654&2#"&546"32654'.ÊUU‚S/HN<;I)Q&..%&1.+)46P41&‘ÑÒ•–ÒÕ˜–bT¿ˆ‡¿l+rnX72#"&546"32654'.àŽ-'=9"4*'>T.*RþÊ)ÀÀ   ¡èþŒþŒttýT88þÈ#ÿòõÄ"3264%2#"&546x|±þÙ‘ÒÔ•–Óֹ컵òðÕ”•ÔÕ—•Ñÿ½j "32654.'2#"54$¿•êã–›Þf¬`®üþ³´ýíèþØêä—c±k2ÿ±³þÿ¶³úBÿ?_ Š”654> 54.''#"547&'#"&5475#"&547&'&/.54>75&'67.5467.'>7'>54&'ˆGSRL#q 08"5"( ;N$V&[&-2F >3'  x))[&V# ;,.'&". U_^T%  T`acMUTH)xnABp`L_þÖ P #-(86C# =**rY-{/r2)T"5 ] ]#  04 T*1r0{,4G=:J-Û¢P!‚LJ "   LMpB@n~YT"OÁ$%3!56767#"&54>7#"I(,C$þU,T 4R5K,FJHGKF-K5Rî4P* 8vPJ5-J=BkCBjB>J.5J#ÿò“À:.'.5463267632">54&#"#".'&\Qm<+U>U22F=W6EžÄ1='5?&DJF.84?/ 9K‰ŽOY/?VK,6"8T;8pWÃ/F4%KFR 7(/hX[c/398 /!*J"ÿò0Á &'67>7.(¸8F¡!J¼ÁE;——;8-“Á0ù>PÜ<„äé6jµ¶j1°?0É#åÁ8!5>7#"&54632&5462>32#"’ ".F-þ-F/! O&@\S;""']‚]'  ;S\@n%%9%./$:#,"(_CA\ 82?ZZ?28 \AC_"OÁC%3.'32654.'3263!56767#"&54>7#"=!2ß8"L2.@,740 ??;%@.K((,C$þU,T 4R5K,FJHGKF-K5Rœ?('Ðt?.!7&//O09Z40='.?J4P* 8vPJ5-J=BkCBjB>J.5J#ÿò“À>32.'.54632\Y6=W5QTMQm<+U>w0JFT;6phi†BK‰ŽOY/?V"ÿò0Á &'6(¸8F¡!J¼ÁÁ0ù>PÜ<„äé#åÁ/h%3.32654&#"654&#".#"32>!5>7#"&54632&5462>32#"„!2ß8"c`%G<$vLB44A2.+8!?D(.%  ".F-þ-F/! O&@\S;""']‚]'  ;S\@nœ?('¨H538 l6&DF$e#A37G )(H%9%./$:#,"(_CA\ 82?ZZ?28 \AC_7¶ %#"&46323B,-BB-3"S%..J.-7ò¶"&46323#54'&BZBB-6 ‰T‰&÷þ\%..J.-7mC”88m7™¿#"&4632#"&4632"F0/FF/:#F/0EE0:"kþs&--L-¬“þ'&--L-b7™¿5%#"&46325%#"&4632€þ¢wF/0EE0:"þ¢F0/FF/:#­==þ'&--L-Úþû&--L-¬BÿëpÚ #"577>324&#"326p;W_&(  FNW%'30;b,C|R0Ç þÊ VO7&'32.'>?/&54654'2>2%2367>7632327#"&'&/.'&547#"&'>7&'>;&5477654'4?&54?&472>54'#"&'#"32?632#"'%>7.#"327'&547.'&'6324654.'.#"3263232654&"#"'.'&'&'&'32?6=#"'>7>7&54672>7327"&+"327>32&#"54#"+654.'6767›94OgB/4PB6Ê*'#C  / ˜Fs3IJIž  ý¦  +b] ‚i ),/KImL W!+a>E,'ƒ Y3q2VU U (%# †  (Ø[]DZ ¯A'$04[,  ).P() -2þ >…c`* f…8''j)6 -M01$"" 8 9+ "# vpn #AYI[ o#,ü&g!!jV0D9'0*A   H ! E"   !   Å:## H% þG " # O0•:/B4G/93NF W  >FH ¦   ˆ*{/ ) N !!" %5T ¡Em*a &x18_ Mx'+26LL 32&54>32#53D!$MNHMP$MwR9?!H!57U½B$,8& PP9 $ DYHýéH-3O@*,   +?_;>/%2 ³JþLbm¨#%7'7&54637#'75H?þÓ1Õc>LK&II@7:/Ðmkeš6„Ñ$°;B; AB&eþLm¤!$"3###53%7'7&5463753=I$1MGM3þÛ1Õc>LK&I0mkÐe -).;7HýéH–7„Ò#±;CÚf†>&/173:>2>7#"&5467Y6   CL_˜bN\ÙLD  :‹hjÃ3!ebÿ²)4&#".547323267#".546¾&<(*2,2MS1 O_?/ C/G#^"5  !$ " +=;/“QBx  :8QFY¯ÿ5QM'%Ë  5&ò&þ†ÿì_. $'2'32654&##5.+'676753”VG E`\)H.2'[A!M)ž©?E)#ãRDP(#$*þ¿GN70C¥33Sÿé—{7253#5.#"327#".54>Ü1G33 c$7B &"1(þH$éþ…C%c.5L0 5$,@ þ'(f#2#".'732654&#"&546{ #-Uc‘#k3='I] „<ÿÿˆr4#53533##5./>54#"327"&54>32=>?&&3>>3?[C"/># .!-% !/ -;P¼3DD3ýÐ,HB , :(&,*!þäÿÖ§.#'3##5.'&/753632&=654©©G4;E  µ491,$€r^.3ðþê1*1vZKW(=>E_/**"$*GDýìÿ(ÿ#<%253#5&#".546þV.H$33=_%&+><21_þðP‘ *1(#CþAÿBÿ%m%'673#5.#þò ) J±Ig43Q+0   54'#"&543367B5oXO˜34P- (0" 0!'!C   LE;H_«b@L3 4"668& #ý‰ÿ9ÿ0”.#"#"&5473263253#þýC PYM.9S 6 2833’( W6-( -32 *ãþ¥þiÿðÿÄa%'63253#54&#".#"#"&54632Ì 33**!" .9E%0‡ Ñþ±(  $*(-7,*@ÿíÚé."*2654&##5.#'>75#5!#2#"'7%25"h <"3$4M(/RLýüÌJB5'$þù1@ wB'*Õ&/5('33T.*'; -q7 sl)33##5./>4'#"&5473267Þ>;C3<<3 w/4D 5#'+!-Í$4CU>3þ¥+]2-.6-  &- 6 Ê”.,253#5&#">32'7>54&#"#"&546¡(G.33Iq%E!-8)A&2 J&U-.'…þù$²8, $&%8K!9 1!'2[ÿî >.(2705#'47#5!##5./7#"&„M   ”V 9P3[6 6 4¿(L    Þ 33þ¥./@:&ÿèp€.,547#5!2#"'3267#".573254'#"&72654#y6Ç:1, +":#_5_>%34b6U)2*4š'(+"ZMT3,#2940_yHjv1 :ŒjI,=8”%ÿî¢E.72654'&'"&'#5!#he97GWÝ2JƒÕb+ ú @33"55Œÿç8h.73265&'.5#5!#3}1rrF #c2œ!ƒ?‹$~<]þ¤'m33 9OP¥ÿô`§.1C.#53>54.##"&=#5!!3232'".'32654'CB * $W3:J C$6>³þ¿ !5³  m0;  3+R3< +7’33 -B ÿæ—./467#5!#3"'327#".'732654'#"&l'¼Šf‚ 3 $7=G:'>) 3PE($"("3J 33G* _57T<-ƒ•0+!,ÿî ¸m!675#5!33##5.'#5.#7Psé(3>>3 3l4°] ] ‡D 3Ú /T?3þÍu?"Sc, >£%:<O2#"&'#4.#&5473263254&#"27#"546327>"3254#"532654Ø,!I"?3 4?54'#53&5472654'lF~c :'7G}v4'* 9*13­.Q32*9*2=*S-8' 3?6+2%ýÿM7<=2Q#Qÿ⣡.$"&=#5!#267#"332654'ß$À¿Ì8!$^Cª*3 !:"-?6:!33}6K&4d82R<-G'!ÿá“3.7"&5#5!#32654#"'632r2ERÚ (I  & n“5#33þò |& (0 C %;2.#"37#".54>–#> f$8C .- ;;-*Qk.5M/>.,6&  mm-33##5./654&#"327#"&54632Ü:+33::3 $ 3 ‹!=-,;Î*8R?3þ¥4# 7F 5!$05  W3$"753##5./7.54632&u  Vm:32L8B*"  d(6&4/! 053þ¥=252-"( ? #!ÿèçz.'5#5!#6?#&54C+G1*k`ÁCV? 3 ‹*¾33‹9 (&+/).ÿÓ±1.&#"&546325!5!#þ<6!(E5<þÕ^3 v)2+M’3þƒK.K9#>3253##5&''654&#"72767&#"KK;\PÆ“2 (+8"?Î!J_T3¤:  ( 5 & /ÿî‘».*#"'73254&##5./67&'#5!!532')3l*<&I8Íþ¸/. ,2$%=0g21%þâ11@ /!%033(* #à<ÿî‘7.675#5!##5.#"75WmçI/3 q(0!Q $KxD!33þ–?c :Š "ÿï´œ..24632&#"32>7#".'32654'#"&'5!u '    %4O:-K0* 3h=(1%<)4†­ 1  (>?P#3SC1 jv:-@:‡33ÿéÕ. *4'#32%#5!##".#"327#"&54674\#µ U:þòeìa,)#G7 $*›4,75¢3309)5))30#(ÿê‘L.!##5./67.+35b-3h)!=,V=”.#DZ4.3þ–6/;)8 <*>Aôÿ5QM'%Ë  5&ò&ÿÕò×.%25!5!##5&#".#"&54>326 þ€O3&)+#$$$3 4"*-Æ%Z33©>?$7( "E$)/)ãÈ.0263253##5.'27#".'#"'72654&#''/ #!7j3# % 8- #/IK[3þè‹34 0 +#,1!&30ÿÎ"¬.!327'654.'"47#5!##".x/b1a4«Þrk7 $Ž%Y( MK$33-;X ,ÿ×J.%#".'#"&'6732654'#5!!3254'·:(4 "<6 " $Ø7þò8$=û",6(‚3!'@* 33$H8 (ÿî[\.%)&/32>54&#"&54632%5!) (zš/,"2 5%"H!'.þÏW†([6'†37 ("1 ,X33ÿî2}.(2"&=#5!#>7#".'32654'4632"É"¡» 3 !/!-*0L) 3e7,=$Z$+7~33{CC#$9" 8NbC u’@#!Kã$ÿá:.'7"&5#5!#32654#"'6324632#"&n -@Yæ0A+a_ ƒ7 !33þÝ"g+ '$*@„Eÿñ‘M. #74632#"&&+5!##5&/675O /CA \532{ +/0P>((Ç B33þ–6Q )-m(E(ñÿ5QM'%Ë  5&ò&ÿî‘7.7.'7'675#5!##5.#"75–D++DWmçI/3 q(/!R $Lž9 0 6"±D!33þ–?c ;‹ "þÞÿçÇ,'233##5./32654'#"&4732>54'r=Y3ll33P]+ 4]?? 9/( 0GC=W3ýê&-!?2 JJ3Z0Hÿÿù..'5!4.##5&/7'7632#"'7326Bpk/&3>’(y&)djF4Lf< û33À#þnAW6P!4#>#=>G83, ;ÿ°X.7.#'675#5!##5½ /AT&‚‹Þyg4Ç,~›X:<*6g&+33þ: N6òNÿFÿo.4&#"3"&54632#53## R! *5'72B¸C3[? (&/7ý33ýtÿY©.'463&'7#53##54&#""&§5& 3>wíC3]+ ' )È(3 .>3 333þoZ((ÿáÿåý.47#5!#'>54&N2Ÿ;ACZ+3xK833G@­EE0 )! ®ÿÕÿÿ¾.>B2'65.#"#4&#".547326324#"327#"&54>326%5!M*9!#)/3=TFRD )7=&Q7-%y# +SaU7ý¹éuG' &(0þí9+'{™þ£ñ9F0/#)( Z63›,ƒ/"2)/# L3D0†6`*.33.(L1#B%''5NþþJ Q4ÿ™ÿ„A.#"#"&547326325./>54'"&547326733##wCQLZ/EF<46³86q4)$1( ,(74#"#"&54632533##yCM /E#.DG 6 28V^!F O",&"'*& N  WC9M.3CC3' --$1 *;) *<›7#)"5"% $%1^5HÇM3ý³ÿôÿ—ß.+=.##"&547326325./7#"&547#5!##27#p#l1D.*"† ƒKN &Hcë<3& €  Þ34O:0% L3 2>] (R8,33ýœü $ a0 ÿóÿ+.-5&#"#".547326325#&'#5!!#2654.'o+( t "+.*" ^K§þÊL=7(3¢(¡Lg 9 ;(.' P1ÄeÔ33=() "%+?þƒ £8 ÿôÿ7<.KW.#"#".547326325򂂮./#"&=#5!!32&'#2654'#"'}C J0E#.13þ´6‹E$"1'-4þÿóÿíTEQ.##"&547326325#"&54>7>54'!53&5473##2654'r   g 2C.)#ƒ 33=EV2 þòñQ6& 00ƯE 3r7F<"G/­P90% L3)§:ZD N= 3\H8J",O63o.BA!"þ†x@TV>NAqÿÙÿY.>.#"#"&547326325#"&'332654'#"&=#5!!3267#DPLZ.9S 4 56*3m†3b[;RR%(úFþç^K3r' M@'. *32 +ÔÁ°²[3'&?.É33ÄS2lFþáÿñÿ&ú.:.#"#".547326325#"&5#5!!>54#"'632#p#y "+.)#ƒ ?D 3© þÔ .q,.3¥' :&.' (&3 ²M/7’33þq \&"!<5>þƒÿåÿõ./!!4632#4&#"#"&54732632&#"327"&5ýË͘6 3.*ˆ>L, Vx'&w  >%.3Ù9‹!-þ]B4]I/A*3$"m&$ -ÿßÿVU.GK.#"#".547326325#".'332654&#"&54>32#5!’B Q/D#.DG 7 83%.":,'3  $2BLF57 + 8&Kc33þMvu' ,.), '<) *l0'F+R'*7;X/:\IFa!#'" '}º>þó¥33ÿý†B.#"#"&547326325&'&/67654&#"327#"&546233##xCL LZ.EG<46PB`,p'@7) ? (V~Q]$iJ4QQ4<( M@*+ .;) +BW68;"*$3- 2DJ=7Q(ZïX3ý”ÿïÿþ.+3".5472632&547'#5!!67&'"Ž '0!1-Hh'#* ‚d.žþ¸e•,-.(5*f@*/:!3:gV³2"33ê†!S|^P "ÿ™þ55:.#"#"&547326325./7&54632&#"753##yENYM.EF 6 46FkMq_<+( $y…R3yUwW2) W6), .<) +EFL)[E/(8 DJ3ýž325!5!##{B OYM.DG 7 65"5- "!4>)b3þ|P3m' W6), *<) *ë/:'' , '&D2;(fÌ33ýcÿáÿæ.H7326325.#"&54>323>54'!5!##5."#".5472*"…  9; ))&)H2 $þk>j3 k "*.È'3 æ-" !2% ,,>33-&5þ™4  ;'0%  ÿ™ s1<.#"#"&547326324&''654&#"'>32533##267&#"‚CPLZ.EG 6 462»$%.# n6…F3VV3þÏ # S34 ?2( M@!4 -<) +) WÁ"&!$ $1P‚ÑE3ýž ,+R)!ÿùÿ„.>.#"#"&547326325./67&'#5!!2#"'73254&##xCL LZ.EG<199b($fp”þ3@&69tMƒh," K94F' M@$1 *;) *IA] %M#6@33)9&1,&bNIg2 1 #3=ýÞÿðÿ™á.,3726325.#"'675!5!##5.##".547„ƒ  Ÿ8"z˜þƒñ@4#:/ #*.) “2" H,Š6`-+33ýž5 ;'+* (&3{I`!ÿç!.8<"32>7#.##".547326325#"&54632&%5!ï 9 !1- -!49;$1C1g7aD0;3%þí:œ 3 !þ]#"J5214B "èU>0!+$+_33ÿéÿhA.FJ.#"#"&547326325#".'32654'#"&54632&#"3267#5!œA MLZ-EG 8 38 %9bC:"9%”T,P"5R3O)4! K%3!%33þMXc' M@*+ .;) +w1Jm_:“¥Q?3Z7?#00):2G #!9 D8þê“33ÿöÿ=è.18.#"#"&5473263254&#""&547.'5#5!##5|C H YM.EF :56`#/*U.C‹ AMLò93ì?59.Ž( W6+* *;) +ø‚5+P,`)‰%""33ýB¾73Nàÿøÿ™ì.'5.#"#"&547326325./67.+5!##zENLZ.EG 8 46)“9-9Ye nô>4¶a/:R#-2) M@!4 .<) +;CR 89CG33ýžbN/- /jÿíÿ™…M.#"#"&547326324&#"327#"'#"'732654&#"563263533##ENYM.EF 2 56P%!, <" 4#I5N3QQ32) W6), .<) +Ms/6 +:')01=8k_  $ÀW3ýžÿëÿ™è.*.5.##".547326325./67&'#5!##5&'o#g #*.)"† BdE*g-~IýF3ÖLŠI;0{V2 ;'+* (&3 /]G:%R#A33ýžb{šé(?+7qÿìÿ\ü.6?.#"#"&54732632.#"#"'73267.'5#5!##6325”CPLZ.EF 7 29 :(20A,- B_853þß@5"'2n' M@*+ ';) * N4?4j" EK7"33ýaŸ84E®ÿ×ÿü.FN726325.'#"&'6732654'#5!##5."#"#".5473254'}†   2 "<8 " $Ø7W33   k "*.*¥8$=„ è'‚3!'@* 33"<þ•4 ;'0% &'3w$H8%ÿóÿPó.:>.#"#"&547326325&/32>54&#"&54632'#5!zDNYM.EG<64‰¦_:&9 VB0d/7k•¥Y&4þyà{' W6'. .<) *Uy79!(# )7#$*9,JZ9o2Zq!!œ«33ÿíÿ¾ò.)-4.#"#".547326325.#"'675!5!##'~CP/D#-DG<19š:!~”þoA39Vˆ0 %ˆ& ,-&- /;( *%-‰6b++33ýÃß@>e X,ÿóÿqà.)18.##"&547326325.#"'675!5!##'.'7l$;.2D.)#‰š: !~”þ‡íA3X_:,n6”(†Z%O:1$ (&3 o-‰6b++33ývµ&Q . I7QHY*ÿÕÿ™¼.M`e.#"#"&547326325.#.'474.#"#474'#5!#2#"'73254&#"#25".5#7#3‹FL LZ-EG 8 38Q*  R+&69'jçþ$044"  ,4 3÷8a?  úS3 2( M@%0 .<) +h5F 1#2  Q 33Y.!1&/ &,þ*4\D8¦ ,0)ÿéÿÄU.D%'675765254.#675!5!##"'#7254&'#5./7&',EX.4"kP*Œ-ÎD !4þ¼X¹þ½löGq' %+!O3)"M."M.(û,"±m ?   [X5-33. Q>" 5$,3#3þÇY%( )0" ÿéÿÿÍþV67723##"'73>54'32654#"'632#"&547./675#5!4&#"#"547326c' 'Fy52\Â,0!K  Y8H%%P #'Ks93@<(2 DoïW1 A™/DRkAYø)<3!7!H, F^iH8#Q*&%4[54'32654#"'632#67AC K55 .

     ýóÊH&;$6 .*>,C"<þ®6) 1&,)#.$&<4G:)1050*0! Ÿ33ÿíÿìç.LT2#".'732654&#"&5475.#'>75#5!#2#"'73>5654&#6'25"7!0 "D-7a:#32M*.;!"+ 4Q( PTýúÌ'; 6&$ 5$Ð1@ u!0'*2"B_OGP85)9+/5*33.'*';)#²oq7ÿÙÿO£.SW%.#'67.'32654'#72654&#"&54632632#"'7654&#"#5!w#) JR, 1.(!   *433þbÊ= >!)0%,*@,G"Aþ®4) 1&,)#.$&<4G:)1050*0!&;:#þð¬33ÿíÿç.Ya2#5.#'67.'732654&#"&5475./>75#5!#2#"'732654&#6'25"A K !0 3S+!"+.Q132M*.;!"+!/U( PTýúÌ'; 6&$ 5$Ð1@ u !0';þí2,0#! FVGGP85)9,05*33.'*';)#²oq8ÿÙÿF£._c.#"#"&547326325#".'32654'#72654&#"&54632632#"'7654&#"#5!¤EOLZ.EG 8 46371('   *44þ5Ê…) M@!4 .<) + .*>,C"<þ®6) 1&,)#.$&<4G:)1050*0!&;þ¬µ33ÿíÿç.NV7&54675./>75#5!#2#"'732654&#632#5&#"#"&5473263254#"'25"Ô&+$*W( PTýúÌ'; 6&$ 5$33)1@)L--" 6 '-7z1@ uw ?25*33.'*'; )#²6&þî*#F2$6 / *"µ(<àq8ÿóÿí.ah.#"#"&547326325#".'732654&#"&5475.'"#'675#5!#2#"'73>54&#632#25"zCOLZ.EG<643;5^=%32M*-<%+1I(B‹ýúÌ'< 6&$ 5$ &34þæ=<vÄ' M@$1 *;) *“&>[SGP86(4+-54633.'*';)#²&>&þ¤iq7ÿÝÿzT.7>&#".546325.#"'675!5!##"'72>54&+#0?^&+>,RH›@z™þ®wò9F0/")( \22œ)‰7‘! *3&#Cc-/‡6`*.33.(L1#B%'7Lýà JX/ÿÝÿñM.8@65654&##2#"'74635.#'>75!5!##4&#""&'25"^*/5Y©1[%'&$¨-/W(PEþópV3‚B#''P1@ u3 "8Ï@2“T=8;š$!"15&33ýö@ )&õq8ÿÝÿ¨T.EL726325.#"'675!5!##"'72>54&##4&#.#"#"&546x4& (›@z™þ®wò9F0/")( Z72,'(#-74'#5!##"'73254##5.#.'474.#"725.'#7#3c6 'jçþ1"#4"  ‡3Q*  R+&3)?!? FDúS3 n 33Y)1&/ &EþŽ|5F 1#2 V$878¦L=0)ÿÕÿx¼.HUZ&#"&546325.#.'474&#"#4>74'#5!##"'73254.##25'.5#7#3‹Gg6)KE#3O-Q*  RJ'6'jçþ1"#4"  ,(3÷BV? +">úS3 ?7/G'6:9[5F 15? !33Y)1&/ & þ Um@8¦U)0)ÿÕÿà§. )-d25.'#2654&#"2#632#"/'#3'.'#5!##5.#"327#"&547.'#"&5463.'#"&54 '/"/<3M >) OS¢#C  fR<ùkÒI3m+  "4!&&+'Û!A)'‡*? ¹ Âi™=9)!* 5 Ä< 33ýå8'^ /)0 -)#!&ÿéÿ»….!;A675!5!##5.#"#"&'732>7&'2##"'732>54'6!„†þ¾œS395%,#5*!/ N˜S> ¢BG # V._a]9idR'33ýÀl0#)3@ ˆ,„„R.A/<'þì  <Z'ÿò߇ K4&#"632%4>32533##54&#"632'>54#"#"&5467654#"#"&Zx=UBSB,þ´>*y>3RR3S>`D . %' O$U:)E!?;|eL 5—+1!rÓY3þgPlh"% $)+&9G   .A25!!67&547'5&#">32'>54&"#"54>yPG.¶þ}e•,7ƒd-Iq09"*+ #& ! J8-.'…3çƒ!wCq8Nmx7³2r²<6& $'! $   -D+1ÿÁ8{GQ4632533#632&5474&#"#5&#'675.#">32'654&"&25\GaJ1´²@23Cw2K¡"0!?)+ (  '$fJ 9¤,g-* ¥6Pn¾M3½UQUbCdE) þ¸Am@H< -03-1 (!  #"U' ) Ä:­ÿ%8{MW].#'67&#'675.#">32'654&"&54632533#632&5474&#"#5'=2SU*!9M7X2K¡"0!?)+ (  '$fJ 9\GaJ1´²@23  Jx2,f¨-0:.5@H< -03-1 (!  #"U' ) =6Pn¾M3½OWqFCdE) þÝ   º¬-+9+ÿÊï{L2533##54#.#"#"&546326325&#"32632'7674#"#"&546Å9M.3CC2#- .%$ -0ù›7#)"!E( 6)%1^+ÿ–ï{=2533##5&#""&54632&#"32632'7674#"#"&546Å9M.3CC3=_%"/>,.H$V^!F O",E**8+ N  W15HÇM3ý›<‘ *2(#C210›7#)"!E( 6)%1^+ÿoŽ{:@4&#"3"&547&#"32632'7674#"#"&54632533##'32#R!  *&V^!F O",E**8+ N  WC9M.3âC3l72l[? (&"=›7#)"!E( 6)%1^5HÇM3ýtÆ7ýÿçÿl¿.927#'47#5!##5&#".546325./7##"&²& !&')Þ3fOØ=3=_%&+>,.H$„JN&H“ $ #a0 133ýqP‘ *2'#C21$AZ (R8ÿÕ.>DR#"'#'654&##5. #'76?4#""&5467&'#5!#572>747474+Ñ' ;Wiªœ$:/3  ~#k%3'4 *nHU ³cK:d c 2Õ'i ~x50%"*þì2  3FU&$!33Õ4F“±&ÿóÿ™Y.[am.#"#"&54732?6325. #'76?4#"".546?&'#5!##"'#'654&##572565474+];2QH* ?A  )5  ~$k&3" * -‹fU(:Xi«œ$173hK;d c 22(W6%0 ,<)+!  3F U&  33%i ~x60$0þ…{5H“±%ÿòÿýÛ.jsƒˆ47#5!25!##"'73254&+##5.#&/4>?54&#""&=47#"'3267#".573254'#"&72654#725'.5#7#36Ñ=þ'3 3#  ,4 3Q*  H7$ %7#_5_>%34b6U)2)5š'(- ¬8`B+">€øR3ZMT33Y 1&/ &,þŽ|5F     -;  #2940_yHjv1 ;ŒiI,=9“% ^B8¦U)0)ÿêÿ©Û.KTŸ¤.#"#"&'#".573276754'#"&547#5!25!##"'73254&+##2654#"&=47#"'326732?6325.#&/4>?54&#"725'.5#7#3ªA 6?W 5_>%35b5*2)45ÚFþ'3 3#  ,4 3þ~())$y$ ":$_,C?38Q*  H748`B+">€øR3"'81Hjv1 <Œh(-=9+PQ33Y 1&/ &,þ:%T  #0 940_C++X5F     -;Y^B8¦U)0)ÿû5„NW47#5!2326733##5./>54'"'#"'3267#".573254'#"&72654#Œ6Ç3f *(<44Ld3TT3±87p4(0 %7#_5_>%34b6U)2)5š'(- ZMT3A4?JJ>`ÝV3þR-…1C*5)!#2940_yHjv1 ;ŒiI*=9“%ÿçÿúé1_g7>54&#"327#"&5467&'#5!##"'#67.4&54>7#"&'732654'†)58"%(2 k#@64 ( =MHk-4    $O3="-}$ÒB">' 3!+22 %N!@%2kyHY+    R=.'; -+ ÿíû.:CP47#5!25!##5./7##"'#"'3267#".573254'#"&72654#27#6ÖB¢<4„MNG%7#_5_>%34b6U)2)5š'(- ¿P!M82ÞZMT33þA>] (R@#2940_yHjv1 ;ŒiI,=9“%/ $%4aÿòÿ™û.3<Il.#"#"&'#".57;67654'#"&547#5!25!##2654#27##"'3267326325./7##"‹D)EW5_>%34b6  .)2)56Ñ=¢<4þœ'(- ¿P!M82Þ*%7#_HD? 2 46„MNG2'?6Hjv1 ;Œi& !,=9+MT33ýž)%/ $%4a#2940_U, +0>] (Rÿóø."O2654#7567.'#"'326'47#5!##54&#"#"'#".573254'#"&('(+"˜?4<+þª/"O $. >":#Œ6Ñ84`#$%T3%#O5_>%34b6U)2)5Â%963Màƒ$3 !#0 9MT33þ­‚ .!O,B%Hjv1 ;ŒiI,=9ÿèÿnP.1:V47#5!##54&#""&54>3&'#".573254'#"&72654#7#"'3267y6ÇhC3]+ '+(+5_>%34b6U)2)5š'(+"ˆ,*":#_ ZMT33ýs;Z(* / Hjv1 ;ŒiI,=9“%9 * #2940_7(  ùÿëª.!*07265&'&5#5!!2+&'52654/&/#–2qoJAb¿þÊ!;'9(ºG"`¶&£$,\4À i7k}=]þû$3&0m33=,'+JÆ ‡3C£8 $… 3H ÿçÿµ+.6AIO.+532654./#"'#&5#5!!;26722654'#"'3265&'5#Ÿ_AmS."C`z;GVx _1u?AbDþ=#) NþæC1 ù1rrF¸¸e2]&S)$7='4[2@]Eg&0m33@ZK&†z$~<]<£ /Hÿçÿ +.GRZ`.#'67&+532654./#"'#&5#5!!;2672&'#2654'#"'3265&'5#G  JP, AYlhGVx _1u?AbDþ=#) N_AmS."!/4ÂC1 ù1rrF¸¸e   > *0C0<4[2@]Eg&0m33@D2]&S)$$$ðüK&†z$~<]<£ /Hÿçÿ7+.Q\dj.#"#".547326325&+532654./#"'#&5#5!!;2672&'#2654'#"'3265&'5#xC L55 .32>32#"&'#4&'#&'%4&#"32654&#"5326if0C G™QN5+'W@5o "#!)=b*7%B3"- ,0g*^3=c}o Hà$5a/W2% $-Õb+ ú@33@?%  S x$ )!`QE]A' 4&7-gBÈO-yQÞ xE67"+3%ÿåþ³±.,5.#"&54632+&'#5!!#2>54.': +="6(K=+4K/+n+cÌþÊ=2-* 4¿#bDLgþü*9#7 /G =7<09NÔ33=&(ýÏ‚Yi ÿæÿù$.#u%2654'"#".57"'327467#5!!327327.547#".'327#"'#".'&'73254'#"&ã( #~4 $7/%:þ®)¼>ýæ‚! @l7J 22 7$:@C1cF 8!;& 3/L$&B‰!  1#4`M8>.K 33GQ =Gf%=#`O (!+(Z2Bm#-!@z)2K..M"6ÿæÿ7$.)‚%'2654'"#".57"'327467#5!!327327#5.#'67&547#".'327#"'#".'&'73254'#"&„,J¤( #~4 $7/%:þ®)¼>ýæ‚! @l7. 3Q,!K\2 7$:@C1cF 8!;& 3/L$&B# á!  1#4`M8>.K 33GQ =,J7È3 *0K.`O (!+(Z2Bm#-!@z)2K..M"6ÿéÿG{.OU%47"';2?#5&##5654/67.5332654'#".5467#5!!327³6 @.29 , ‰+20ž1#<9S(1°$;# ,#2æ’þ¯S;?·C.9–ˆUp+' 0, S)’ r+".9þºL7©  e38+CMg9þÝ%*) ,,*7*33!3þ»# )ÿÍT·.1FO2#"&'#".'&'732654'#"5467!5!!63254#"';2654&#"&'32696)'€P S,BQ0L-%)(7 =/e5þ÷êþ}2M<^06@%1'Bš/D61ÀK65k@$2N7> h @#/~&U33)P`šCY5:232537632%32654'#"'732654&#"iF$cF.=",M(æ"PG !"3)32#"'24&#"3254'#"'7;26&'32qzƒ/34+44(#ve A1,?66c- @!<^H&4.1.&0"((.l2&?M5E/Q*  )Ø|- *‘O!@r''' E4 *A!= ,B)2+5;HB=!7)-"?9–LK6m†( (6ëC)$ ÿÇ!0^v327#"./32>4'#"5?>5'.'#"&54632>32&'&=467+"'3254'#"'7332654#"> +!- & :]/2 h; !# ,I!  $8&P;+*8#>"#! H$%" X,#<-* .*)[yV/) N*0Pj9]sŽ *B_>7  9 '.1X'(+%%. /^6?(W)++¥C.  - #8!ÿ1ó- $o%7'72654'#"&5432654&#"2#"'#74'#5&/67&#"#"&5473724&+"&54632>°L7U.h*}1 )9d_80:)/4%!*449?[0<€?> ! DT$,A?iP .m &—;.))&E! Kà*+BM º#< $ˆ t\A-7/>+5þß H/£F\9,/oS&C8M; Bw. '6:Œ>f$ ÿàÂ'G%#"'732654'#".=#5!>74#"&5473723!32654#"'632P#?*Œ\.Lq!?6.)‚y[˜5G!* aš3D/þÓ#;T *")ð)/&-ݾ( (*! õ3 5 <1) $ / E3 3ò7q9-$!B2Hÿôÿ;ê'd.#"#"&54732?6325#"'732654'#".=#5!>74#"&5473723!32654#"'632#g>2RF* 7I $ .3(:\/KrD6.(–\˜5G"* `›4B0þÓ#;T (!")$3‘(V6)+ '30*…ݾ#%* *" õ3 5 <1+ $ / G1 3ò7q9-$!B2L*.þ®ÿÇÿo 'I4&#"3".54632!32654#"'632#"&5#5!654'"&5473723##«Q"    5'73þÂ;d&!"-:c4,'d[[š3G!*a™6AµB3[@ (!/7ýþ´6ŒD$"1'6vS?'O3 2 ?/) . F63ýtÿâ5n{FQ%"&=!5!632533##&#"2632'7674#"#"'#"&'332654'7&547#326!#þýC9M.4BB4T`"DL #,F)+8+ T 0E:qu30M0?32>54''#"=#5!#3267#"&'#".'732>54mþ¿ !730)%&7 #Rú^1à~ú S-6aEH_1W/2MI</5· 0 $ȇ975e;"2)%:(7€#63¡33¬T]4BzH^0IJj þÎ!0)"ÿÙÿo¬.=4&#"3"&54632!32?67#"&'332654'#"&=#5!##6Q"  *5&82þÐ4 K(R6m†3b[;RR%(úÓC3[@ (&07ýÄ-2l7?+ÔÁ°²[3'&?.É33ýt ='L#".54>3253>74#"&5473723!32654&#"'632#"&=4&#"37 % :&#? ÷[—8E!*4”/þÔ@b  "'KˆC/(h[B , 5#,6&.,c 5 ;1)  w 3þ™ŸI %"nO±=(Ös_M ÿh'm.#"#".54732?6325#"&=4&#"37#".54>3253>74#"&5473723!32654&#"'632#æD6/E#.EF56;5/(h[B  % :&#? ÷[—8E!*4”/þÔ@b  "'K(3c',.*+ *;)+›>=(Ös_M- 5#,6&.,c 5 ;1)  w 3þ™ŸI %"n8Fþ© $U4A".546324.5473##"&54747654&#"3732654'y &E3lB99<8Í«wW6c«a*#)ZÅ[c2$ET"* 8%327¯ %N?¿i4#6K&/ %&)*.$ "/(" ='(5h49K­ #`v\ &# XKA>$ /E% 1 )FDZ,!®.=46325!!32?67#".'332>54'#"&=&#"&ž7*.5Lþç4 K .U6RƒL33 >GV80I$S%#40!(Ÿ%7;n3Ä-2l->2$Gd_&a“M/ *<2#*@3;[ÿöÿh¯2f.#"#"&54732?6325#"32654'#"&54632654'.+"27+"&54>327#vC  L[.DG( 46%3¿i4#6K&/ %&)*.$ "/(" ='(5 %3c'LA(- .;)+­ #`v\ &# XKA>$ /E% 1 )FDZ*4þ·1ÿ7².IZ%"&=&#"&546325!!32?67#5.#"#".547.'332>54'#"'32?632¢(4/!(8)02Lþè4 K3C K55 1A3 :FT?/I$SM4FmQ 325!!>54#"'632i 32ZB  &"2(2F`þÔ 36% ,.ƒ/7Ö#6cL0 5",@ H$Ÿ3þq 6X2&"!<Yº?ÿrö‘;327+"&54>32533##5.#"37#"&54>3254&#"r, )F>)3& 3__3f[B L!1)1GY$-H‰>3^+1:('Êc3ýwª!icM/=B+@ H$ê+w4?ÿo{‘=%2#53##54&#"3"&5474&#"327+"&54>32533#—;3…C3Q" *$Y$-H, )F>)3& 3,,46ý33ýt6@ (&"3+w4<>3^+1:('Êc3ÿÝJ.04#"./732654''254&"&54>32%5!ö cM 71=71832%5!‰*"Mm 33R,!(v^7186u) &‰.X*Yÿ?3ýö1™ ZD.++  5 %09&h;$ #1ÿßþçU.=A.#"&546325#"&'&5/332654&#"&54>32#5!p +="6(KE#3M.¿73XYBLF57 + 8&Kc-(3þovÐ*9#7 /I'69:ŸV­š\IFa!#'" '}];cþ£33ÿéÿßE.J"&54632!5!##54&#"3".5463&'#"732654& +0& )1"@B þ\H2} #(/  ‚].  ,!.,»  !1 7%f*33ýä6!U )+ #<*D%8ÿßÿo¬.@4&#"3"&54632!5!##&54>32#"&'&5/332654&#"6Q"  *5&82ý©ÍC3þÆ + 8&KceT¿73XYBLF57[@ (&07ý33ýtò'" '}]\|V­š\IFa!ÿßÿGU.LP!25#"&'&5/332654&#"&54>32#4&#.#"##"&5463265!["#¿73XYBLF57 + 8&KcA2,'(#-ë9+ &*/6-$F1û33ÿÑ{@2533##&#"2?632'7674#"&547'#5!#6746Þ:M-3BB3T`!F  # "-F)*8' !) /ƒd-n\½\xZ17FÇM3þ`›7#  )" F( 6' NkWG LcdY³233è{4[ÿÑÜ.:27#'47#>7&&547'#5!##5./7##"'Ð&  ß3fä2t2ƒd-n <3ƒKN“ $ a0 1èDEþPLcdY³233þA>] (RMrWGÿÓÿõ-..?6?'&547'&547'#5!!>7)'!#2")3!#)2>32TZþ,k(—N!* oZ8`Pc,H#"E (37>7#5&'“R,!EZ  2F?2TZþ,k(   (")3 % J–+0G//1,H   + (37>7'&#"#&'7Ž   8!#2  2hnþ,k( ')-X")3#F"¦W!- *Q 02,H !6- (332632'ç."33 FGµ! 4F0þIf.A;°s3@Š32632&=474754'#567  JQ,!!2µ! 4F0þIf.A;."33s%†   >!)0+wD}*33©'I6* '0 <54'#"&5463367&547'5#5!!>?676ª5qVN™43O- (0" 0!&"%   3%#)¡JþŠ &"y?H8G`«b?M2 4"75& 0#)#¾33‹"!ÿËÿÊ.M%25#"&54632"2?&547'5#5!!>?67#5&#""5473265!'$2&'4##< 3%#)¡JþŠ &"y*38 ¨2:;Kª -1&%# 8)#¾33‹"! þ²5—;,<*ÿåÿ7/.j.#"#".54732?6325#"&'332>54'#"&543367&547'5#5!!>?>?>767#„B K55 .3!"&547.=47##5!##5&#"27d%  2- *þóy%"V$3 ./MQ3U0  80  #z0 $sþH5= MK0G33þAp  ' -ÿYÍ507"753##5&#""&546325./7&54632&#y…R3=`#.>-TFGkMp^),*' ŸyU-J1& DJ3ý^P‘% )3'#CcLGK)[F=8Y4&+#3"&475./7&54632&#"75!###632ñR!  *GkMp^),*' #yC3©yU-J1&©v 72[? (&88GK)[F=8 DJ3ýt:L654'!53&/&5473##"&54>?654&#"7#"&5432654&'è*þñü!F 47! ΰT$4>./U9(-a <-§ .:8&.MC%!%30%16D<)%4*P23sv5S. G4- *%.$/^.$1ùµkFsM20 /7T3;OA8   '+Ã3k33ÀH^HtBq}I 5Pb?,\F!a".: 0%"(ÿçÿEe.[.#"#".547326325#".'732654'#".'&";27#"&546325!5!!327#ÓC  /E#.EF :2965FsM20 /7T3;OA8   '+!:þÉ~þìQL3…',.%0 &;) *©+Bq}I 5Pb?,\F!a".: 0%"(3k33ÀH^-,þ¦ÿÓ^.,%"&=&#"&46325!5!!>54#"'62Q,'<6!(9(5<þÕ‹þÓ 35%*>.ƒ@&£vR3L’33þq 6Y1&"!=Yºÿñ/.I4'!5!##".'732654&#"&5467.#"&546323> $þu>t,+$N71[@43d/&$5I4$)/% )* )-0=!& ¨>33-&3_"142JYG c}@1(7% "&!5  !25ÿðÿ3..W%.#'67.'732654&#"&5467.#"&54>323>54'!5!##„!  JP*!"*6a?(4\=&$7G4$)/% () ))&)H2 $þz>y*>3!  >"(0# MdZ! Oˆ#A0(7% "&"4  !2% ,,>33-&2 >5S,þóÿáÿÆ.L"&5467.#"&54>323>54'!5!##5&#"#"&5473>3254`C$=(+ ))&)H2 $þk>j32: O 9J,8'#<(AH %"$P !2% ,,>33-&0'þ·3*V02: >(1Ø1ÿðÿI).i#5.#"#"&54732?6325#".'732654&#"&5467.#"&54>323>54'!5!#ž"* >3C   LZ.EG  55)33-&2ÿáÿa).F%#&/532654#"'63. #"&54>323>54'!5!#º %@(}¡"wÜ66 `SaG1 ‰   ))&)H2 $þk>j(å +#AŽ#m€3<)H] „    !2% ,,>33-&= 9ÿÓÿþy.$&547'5&#"&46325!5!!67ƒd.<6!(9(5<þÕ¦þ¸e–,.Lcb[³23vR3L’33ê†!PUYÿÓy.5;"#5&#"&46325!5!!632#7. /6754&5Ð'g3<6!(9(5<þÕ¦þ¸MN12 -cRTM>˜}*vR3L’33Ÿoþ   +R#E ä: &ÿðÿþ‡.A3".547;26;2&547'5&#"&46325!5!!67&'#"#þ &/!24 i , ƒd.<6!(9(5<þò—þªe–,./'5P@*81!3:b[³23vR3L’33ê†!PUY ÿëÿñ.06#5&/67.#""&546325!5!#632&545¯5(3=e&=q9"4D$7?".WþÌ4Í6#2þýD&2Nþ½;b!35:%&4)0")55*z33f;8lWq>;&!±ÿëÿK.6<E.#'67&/67.#""&546325!5!#632&547#5'O+!?J3G&=q9"4D$7?".WþÌ4Í6#2 5(3~D&22' J‚#'0?*635:%&4)0")55*z33f;8lWq>7þ‘&!±æ    ÿôÿ™Y.HN&#"#"&547326325&/67.#""&546325!5!#632&547#=Y22#;]* ?A * '6=e&=q9"3C$"1?".Wþ›eÍ9 2 5(32LD&1<DL$3 8=* +b!35:%&4)5)55*z33f;8lSu>7þeÞ±6&ÿØÿpÚ.1.#"&546325.#"&54>325!5!##W +>"5(LD$.J7"5- "!4#4,d1þP3G*8#6/J'60CÎ.9'& , '$E/F"e©33ýuÿØÿov.3:4&+#3"&475.#"&54>325!5!###632R!  *"4'"!4#4,b3þžC3v 72[? (&8£.:& , '&D/F"fÌ33ýtŒþ97ÿñ†.7D%4>3&'".#"&546323>54'!5!##54/&#""&#6'$;E )-07+' $þ¯•C3)" '*Ú.È' ,, !25#>33þo)((U0#,;  ÿð..7"#"'727&#"+"&5463267.'5#5!##.'6325J $": <+,6"K (&0&T1IX`$J01¬O#,€ESEU3:x "&'o)*&"33þ)<{0!B„3'GR#"=74754&''65&#"'>3253>74#"&5473723!>54#"'6267&#"2¹9d4T3 »$% .# o5ŠF÷[š5E!*3”9þË 9f+<-þ/@)9 D $E9Z‰ YÁ"&!? $1P‹½ 5 <0)  w 3þ  ’J&"!<4+E/" ,K~=I#"&/732654&#"&5475&''654&#"'>32533#2767&#"¸!0yAJ¢5$3 E:=)5I1,3e #K;\P0–“þÓ(+8"?=>;J^¦{XVF* A0!C &%NR  ( $!J_¤P3 & /y 5?727&#"63%&'4&#"'67654&#"'632533##5&''27&#"6’)'kA+E!&/03Wß!) L&)PwZW5OQ1Ÿ-&m9)4;ÊBt2HŠ% *)E •'4€ •~ÏK3þ…°˜.'`9G ÿo•s*5:4&#"3"&5474&''654&#"'>32533##267&#"2#R!  *(2»$%.# n6…F3àB4þ2 # S34 ?R82j[? (&# WÁ"&!$ $1P‚ÑE3ýtI ,+R)!þe7ý ÿ“ s0>>32533##5&#".5463254/.''654&#"72767&#&#" n6…F3VV3=_%%,>,OK »$%.% # 3#2$ ?£1P‚ÑE3ý˜O‘ *0($Cd÷. Á"&!$ 9 ,+2&(! ÿ¾ sFT7463263254/.''654&#"'>32533##4'5&#.#"""""&2767&#&#"YC/5% ( »$%.# n6…F3VV2,'(#-< # 3#2$ ?!$F1Ü. Á"&!$ $1P‚ÑE3ýå = &*/6Ä ,+2&(!ÿÜ‚.1;D>3267.'5#5!##.#"#"&'7267&/'654&#"72767&"76325Z.jZLUâ¦J05 (2%$( ”,%#' ")V¢[ X(E{)+&"33þ EIe '$*Œ& 5!+`E!#„ÿîÿ×üàW23!52732#"'73254&#32654#"'632#"&=./67&'#5!654'"5473;{"="þw/. ,2%=0')*G *n71l*<&I8¹Anf-% ›=,3(* #ß(69vK Zr8 #1?þ 8- -407X>0A_ %M#6@33*8&1,'aNaP'% ÿçÿÿ‰.I'675!5!!327&5467+".527#"&'&'332654'#"/.'ö, 2ˆ6Sþð¢þ¿ _%+19/"#  -@«%s$ 20:+.-7'%&¾ .J-* 33., /hx+e s(4  ›31SZPE‰l…."2("2ÿéÿþ.'5675#5!!67&54?67'&'Q\[p@‹ô˜þf–,. 4W59'}h<¥%2;33ê†!4aQNI Qi "Z7I9&Z0ÿéÿï.8>74732632&54?67'&/675#5!!67&#"#"&5S2)0x!0  4W59'}!@‹ô˜þf–,.)9q%>J\[ ,A,9B "Z7I9&Z082;33ê†!4aQNI -[<¥%ÿéÿÅ=.+2%&546?#5&/67./675!5!#636750_I-);¥"Y1Ky0%*"(˜þ¹TÛ` $þº-E^w7ý2+[uo)þ¾;T&? *e#+33º+W#T`l L ÿçÿdž.+.+'675!5!##5&#".5462*H''%ˆš9!~”þ½·A3=_%&+=ZH%$X,X.ˆ6b++33ýiP‘*1($B21ÿõÿ¿.7=%#"&'332>54'#"&547.+"'675!5!##36?6'5ª5oXN™44O- (0" 0!&"9p(\gþÑ%Â, ð S]æD46326325.+'675!5!##4&#.#"""##"J(3' *š9!~”þ½·A2- 1%$.îH''%ˆ0,.ˆ6b++33ý´<)  +60$X,ÿéÿhA.SW%6325#".'32654'#"&54632&#"3267#4&#.#"""&546325!' (9bC:"9%”T,P"5R3O)4! K%3!%(#2,'(".;B05þçXE1Jm_:“¥Q?3Z7?#00):2G #!9 &RÞ:* &*/7,$FÆ33ÿê. P4'#32'4'#5!##".'732654&#"&5467.#";27##"&5467’#µ 6:î š&f %#hQ1[A43'=[06H-#1)0! +%!›4,("&T!-33543VD\1JXI V^A@1!>!&. #3+'ÿé8†O[33##5./67654&#"32727+"'#".#";27""#"&546754'#5!6324'#32\%jI4QQ4";,C&,n'B7) ? D#G7 *& e¨)7?QþÛ#µ '*:§8P)YïX3þI% 58<"*$3J))3+'!-3JI4,#)ÿéÿþ×.1=&547'5#".#";27""#"&546754'#5!!674'#32nƒd.#G7 *& eîþ¸e–,.þ¿#µ '*:Lcb[³2[))3+'!-33ê†!Q~UY”4,#)ÿéÁ.2>#5'.#"&546325"&#";7"&546754'#5!#4'#3224L"3 #QA"+c   && oØM4#«(&:”B þÎE1?7 /G%:B|X,#'4335*5* #,ÿèÿ Ð.-47254&#"#"&547.'5#5!##5&#""&5465Ê.H$`#B2U)D‹>NBè93=_%#.E-=79.!21ïC+P,],‰&!"33ýP‘ *3(+;Ú82Nàÿébs Z2767&#&#"4'#32'4'#5!>32533##4/.''654.#"#".#";27""#"&5467¨0)3#2$ >`#µ '*:î e‹ N$…F3VV3 »$%!/,#G7 *& ¸(82&(84,#)T!-33 '‚ÑE3þ:. Á"%" "9))3+'ÿéÿ™bs^kw.#"#"&54732?6324/.''654.#"#".#";27""#"&546754'#5!>32533##2767&#&#"4'#32ÙC  LZ.EF 46 »$%!/,#G7 *& e‹ N$…F3VV3þÏ0)3#2$ >`#µ '*:2(M@%0 .<)+). Á"%" "9))3+'!-33 '‚ÑE3ýž(82&(84,#)ÿéÿ¾`shv‚%263254/.''654.#"#".#";27""#"&546754'#5!>32533##4'5.#.#"""""&5462767&#&#"4'#32 2) (»$%!/,#G7 *& e‹ L#†F3UU2- .$#.;DM % 3#1% !?\#µ '*:‹1Ü. Á"' "9))3+'!-33&‚ÑE3ýå % -3/7,%E--+2&(!54,#)ÿÙ . J4'#32%467&'#5!!32732#"'73254&##5./7.#";"&5¶/ ;þË*dÇþÄ Zˆ< ^r#%/"(M83'–5!ll *Ú" #33 O6GM^O7-&-=þZC;V -VK ,ÿÙÿ™ .Zg.#"#"&54732?6325./7.#";"&5467&'#5!!32732#"'73254&##4'#232‹F6LZ-EG  38'–5!ln **dÇþÄ Zˆ< ^r#%/"(M83V¶ *';2(M@%0 .<)+2;V -VK , #33 O6GM^O7-&-=ýóAÿé'Õ.NZ#"&'332>54'#"&547.#";27""#"&546754'#5!##"'36?6'4'#32‚5pWN™43O-'9 0!4*0" *& eìa1$ #µ '*:NF9Fb¬bAL2,$ 7$'/ #3+'!-3309-/ " \4,#)ÿéÿØÕ.T`%25#"&54632"32?#".#";27""#"&546754'#5!##5&#""5473264'#32!'#7")2# F#G7 *& eìa/3: ¨2 0DR#µ '*:Yª -2%&# A))3+'!-33098þ²5—;442B4,#)ÿèÿZÕ.kw&#"#"&547326325#"&'332>54'#"&547.#";27""#"&54674'#5!##"'3>7#4'#32\7<QLZ.FG 929/=N™43O-'9    4*0" *& eìa1$ !.5(3#µ '*:q: M@+* +9, +n¬bAL2,$   $'/ #3+'(-3309-/ 5F9;-þóA4,#)ÿé‘.3?J%463&'#".#";27""#"&54674'#5!##54&#""&74'#327#A5&,#G7 *& e¨C3Y/ '*#µ '*:¿§2DÈ(&#))3+'(-33þo] ()ô4,#)¢09 .>8ÿèÿop.4;%#53##54&#"3"&546754&#"#"&547.'5#5!#!5—30* C3Q"  *`#B2U)D‹>NBÏ þá=79.55ý33ýt6@ (&/{C+P,],‰&!"3382NàÿéÿèÕ.JV%25#".#";27""#"&546754'#5!##54&#".#"""&54632674'#32 #G7 *& eìa 3 *-#+& .9A).3l#µ '*:ŸŸ))3+'!-3309*$þÆ(  @-7,$G7 ü4,#)ÿèÿ\Ð.;B%254&#"#"&547.'5#5!##4&#.#"##"&5463265;`#B2U)D‹>NBè92- .#%.;K'2( ™=79.°C+P,],‰&!"33ý„7- ,4",07-,=0æ82Nàÿé(.>JS4'#5!##5.#"#"'73267.'#".#";27""#"&546?#325476325n e?53 :.10A,. 0;1$#G7 *& ˵ '*:D@5"'2­!-33þõN+(Tj# F?9!-/))3+'U#)B4,74E®ÿéÿh(.Yen.#"#"&54732?632.#"#"'73267.'#".#";27""#"&546754'#5!###325476325ÀA 6K\-EG 38 :.10A,. 0;1$#G7 *& e?53þyµ '*:D@5"'2c'LA(- ,;)+N+(Tj# F?9!-/))3+'!-33ým“#)B4,74E®ÿÓÿì[.;C3&54632635!5!#'654.'#5.+'67.#"&#"I!SK'; !þuˆÏ7J 4 :1-'X= !C " +@%"h8-i,L,=!  a33¨ (3"6!)& ) þÊ)K:0O;"_` ;ÿÝÿÀÿ.L46326325!5!##54&#"632'67&#""&5463254&#&#";"&=29- !þ‚"s3ZB!AH"+ '%A & 'bEAH"1@#!  %,a1G5&L33ýÅ“+\;+$'  %$1&!=QL©  ^1,1ÿÒ7Ê,W3723!32654#"'632#"&=4/.#"&#"&546326325!5!>54#"&5473”Cþ =f*2ƒN$, ,<!8QI(8#%"þy{[š5E!*Ù z 3þ¥ šH&"!8#Yº:,š . ^ ++N,=1&3h3 8 <0 (  ÿÒÿUÊ,u.#"#".54732?6325#"&=4/.#"&#"&546326325!5!>54#"&5473723!32654#"'632#@!L'F:.EG 8356$, ,<!8QI(8#%"þy{[š5E!*3”Cþ =f*233v& D4%0 ,<)*œ2:,š . ^ ++N,=1&3h3 8 <0 (   z 3þ¥ šH&"!8#LTþ«ÿÕ6‡.B&54>326325!5!#>7#"&'332>54'#"5&#".#">$$3 4"(/& þ€²ÿ+"OzCRs9>-<)&:M8&)+#$G( " C #*/)$Y33Ñ :<[ rSk$&-#3,$*@i>?$7ÿÕÿY‡.b.#"#"&54732?6325#"&'332>54'#"5&#".#"&54>326325!5!#>7#í@!6K\.9S29+,Rs9>-<)&:M8&)+#$$$3 4"(/& þ€²ÿ+"O33r&LA%0 *32+Sk$&-#3,$*@i>?$7( " C #*/)%Z33Ñ :<[PF8þßÿñÿÖÿ.P32654&#"&5463254&#".#"3254'7#"&546326325!5!##".'N›M8F40)H5 /+3''=. 1-=C0; .þd?gQ326325!5!!67g‚e.&)+#$$$3 4"(/& þ€ûþ¸e–,.R]b[³2|>?$7( " C #*/)%Z33ê†!P`Nÿòÿï‚.HM25!5!#632&=656=4'#5./75.#"'.#"&54>326: þ€Ý: ."332>7&#"Û3d/+3''=. 1-=C0; .þd?3# Z#' # 3'Cü@"Î(D!/&9-%C 1 F33ýõa ' $)E]  ,.Q&'.#"""""&54632632&/#5!!3273#"'73254&##5./67d--*"(:-(69vK ;P$ 5 K:/,: %kB-/6-,=0#%33*8&1,'aN %51 &$ 1 #2>þZFFX %ÿ™.n.#"#"&54732?6325./6?&'.#"""""&54632632&/#5!!3273#"'73254&##E  LZ.EF46,: %@--*"(:-(69xM ;P$ 5 L:32(M@%0 ,<)+5FX %3B-/6-,=0#%33*8&1,'aN %52&$ 1 #2>ýóÿßÿo .I%2#53##54&#"3".54754&#"4&#;27#"&46326325!5!#¿84“B3Q#    '@'." 0&;GG;1.+&þS )57ý33ýt6? (!îY&&3))90Q€R0+ ‡33ÿÕÿø×.I%25&#".#"&54>326325!5!##5&5&#".#"##"&546326*&)+#$$$3 4"(/& þ€O3 */",%/8C(.3¹³>?$7( " C #*/)%Z33ýýW) B.9+$F7!—.?H%"'.'27#".'#"'72654&#'326325!!'2654/&'\ %# % 8- '/ #!7lþÇ/"C  Y{+5—1-S%G34 0 +#,1 &30/IK[3=#$ 0ƒ]3±* ÿôÿµG.[f4.'#"=&'327#"&'#"'7254&+'632>325!!32632.+732>'2654+"'` _0N)&%  - ):(  W&2     þ&N.?b>g6Q"9ÈmCP6çD3*AYwKG% +11 &' ,A* N3< M81^(/K$Aw2<J(ˆÿíÿä!…-]32654&#"&5463254&#"327#"'#"#".'7&'7;>54&#"56;263533#Q&54&#"56;263533##5&#".546324&#"327#"¿ 4#I5N3QQ3=_%&+>,.H$P%!, <X')-1=8k_  $ÀW3ý™P‘ *3&$B21s/6 +ÿíÿo …S%4&#"327#"'#"'7;>54&#"56;263533#2#53##54&#"3".546P%!, <" 4#I5N3&&54B3Q#    )5r/6 +:')-1=8k_  $ÀW3þ:7ý33ýt6? (!"ÿíÿ¾…\726324&#"327#"'#"'7;>54&#"56;263533##4'5&#.#"""&546Ø1) (P%!, <" 4#I5N3QQ2- .$# .;C‹1s/6 +:')-1=8k_  $ÀW3ýå > ,4/7,$FÿÎÿì.8@327'654.'"47#5!#'2654&+"#5.+'767&x1b1a4«JÞPc])/$  2'[A!)7Ç\$ EŽ%Y( MK$33+## P:Q(#;þ¿GN70$0#)#ÿÎÿÞg.JT]"&547#".547#5!!>32'654#"#5&#"#".473263254'326?'654.'"1G$ $4«™þÓ '' !0#"1230< S'-()T 0,Þ ! a1WI # ,K$33+9) 8-##Bõ2* 218#9+01S1':K -A*3F31B 6 5ð +o< .'ÿõFm'<@67'&/&'#5!654'"&5473723!32654#"'632#"&'.'7#')=[›3G"*`š4B0þÓ;c %!".:c4.r=Ũ4tG5/  3 1 ?/). D83þ´6C$"1'6vS %6Vâgÿëÿh'$U]f.#"#"&547326325#"&547"&547#5!4#"#"&547326323#32654'7#4&#"6'327‰CPLZ.DG<46JN*3^B<å¤:NWJ0 zSE5g~M[M8,u#=3!N!” !0"c' M@*+ ,;) +“+3&:K37@+3F31<  4=:35'N6H"#9+/þÎM +o< .'ÿõÿjm'[_.#"#"&547326325#"&'./67'&/&'#5!654'"&5473723!32654#"'632##µB   L[.EF 046*+.r=!)=[›3G"*`š4B0þÓ;c %!".(!3¨¨2va'LA(- 1 <) + %6V.5/  3 1 ?/). D83þ´6C$"1'+b'þÙ‘iÿàT1;G654'#4>7'&5467'#5!&5473##"&7&/62654' … D%,;\P6&+   )ÚÃ>0cGEW™;9)<&7F<&:3|1þ¦ )&N?3]G#ìx@TV6\8!qÿéÃ.$:AE%"&'#5./67&'#5!!>32'4&#"'67654&#"32%&'5(.g3AcG*g-~"Úþ¶# ,<+.1'-P$ D20f".þçH;0{UÕT‚]O$Ð@\H:%R#A33ƒ%  >-5%13gh3. ( FDKGƒ(>+7qc#wšÿÎs IN2767&#&#"327'654.'"47#5!632533##4/.''654&#"#".%67#c # 3#2$ ?ý1b1a4«Þ…F3VV3 »$%-V) $ÿ"¸ ,+2&(!B%Y( MK$3 ‚ÑE3þ:. Á"&!$ (5 ,y ÿÎÿ™#sGT\ej.#"#"&54732?6324/.''654.#"'#".547#5!632533##2767&#&#"327'654.'"767#›F7LZ.EG  38»$%-X* $4«Þ†F3UU3þÎ0)3#1% ?þû1b1  '2(M@!4 .<)+). Á"'  )7 ,K$3‚ÑE3ýž(82&(E%Y(  ÿéÿù.D27'74&#"26"&547#5!!632#"'732654##5&/67'x*\'‡ )> ‡:Ah´þq)diG4Ke$!  †3>’(a8^Nl>.–=&7533#&(4#>">>E:%0 ;PþnAW6=&ÿéÿ™.KS^.#"#"&547326325&/67'#"&547#5!!632#"'732654&#"#27'74&#"26wCNLZ.EG 8 46=’(a8?:Ah´þq)dgH6Ke$!   2( M@!4 .<) +*V6=&=&7533#&(4#> @>E:%0 ;#/þÅNl>.ÿÎ:.4A327'654.'"47#5!##54&#""&5463&'#".7#x1b1a4«lC3]+ '*5&3: $ñ/ŠŽ%Y( MK$33þoZ()!((- ,-<  3+#ÿéÿoR.)04%#53##54&#"3"&54675./67&'#5!#&'5y12“C3Q"  *BdE*g-~"±!3I;0|UÖLŠ44ý33ýt6@ (&# ]G:%R#A33é(?+7qc{šÿ×ÿì}.I3254'"'3'2654&+"#5.+'767&'#"&'6?32654'4'#5!hVG?8&h8$=9)IY]&7  2'[A!)CO?"<8  $ئ?E",l$H8$"5 N7P(&4þ¿GM80$:Q‚3  @*33ÿ×ÿÞ˜.T^%&5467&'#"&'6732654'#5!#>32'654&#"#5&#"#".5473263254#"'3254'"'$1#."<8  ØÁá))!0#"231;V%7 (+2R 1,%C8$=ð # !H?‚3!3.33"5/ 8-#Bõ2* #3*)A"8; Ø/Ií$H8$ÿ×ÿv}.RXb.#"#".547326325.+'767&'#"&'6?32654'4'#5!#'2654&+"#3254'"'h:B/.) >>2,2'ZA!)CO?"<8  $ئÆ)IY]&7  3VG?8&h8$=T' ;(*+ *;) +EN70$:Q‚3  @*33"5 N7P(&4þIÉE",l$H8$ÿçÿåS… L254'#233##5./2654'#"&5473274'"&'#"'7327#5!2'!]  z*?>X3ll1:@g,Hd=A-*-  K10 <"1% $ ™?2)>™'   §,$C=W3ýê&/?')I0&J 3/6::!)n3EdIÿß'KS%2654#"'632#"&'5.#"#"'73267.'5#5!467474#"&5473723!25!6Þ?a*/6a6 +4-!21@,%. B_2¥[—8E!*a™3DCþ² —'1þã`$R–K&"!<9Z!™-?4?4jOCK7%3 4 <1)  / C73þn=E±oÿãIC$Y4&+3223#32654'7#"&54>7.'#"&'6732654'#5!4#"#"&547326¥%V9#=CE5g~3HH38+v#7.'#"&'6732654'#5!4#"#"&547326323#32654'7#4&+32‰EM/E#-EG 8 38@<*3 )/';"<8  #ØÈ:NVK0 zSE5g~3HH38+v#=33 $V9#>c' ,.(- ,;) +…3&!#=*‚3!A) 3F31B  4=:3#B419#9+/&%þæM+$Hÿó9*.>G#".'732654&#"&5467&'#"&'67326=.5#5!!3254&#Ó&#"dT7&'#"&'6732654'4'#5!##3254&#† JO+!%6b?(3-5N*5I41* +"2"<8  #Ø7W&$"43f9#=B  >!)0NdZ ;PA.@1(7!& #,F‚3!A)33"#2 UK+þò§$H8 )ÿ×ÿÊ.JT"&5467&'#"&'6?32654'4'#5!##5&#"#".5473>3254'3254'"'`C$;'6"<8  $Ø7W$30< O $7 ,5*#<(„8$=EH%"#OH‚3  @*33"1 5þ·3*!/) 2:;&3Ø1¶$H8$ÿñÿh(.bk.#"#".54732?6325#".'732654&#"&5467&'#"&'67326=.5#5!##3254&#uD6/E#-EG (38)1[?43\>&%5I3$)2(5"<8  $Ø7W% #">3[9#=c',.(- ,;)+b 2HZG S†"@1(7%! E‚3 @* 33"!4 UO.ó“$H8 *ÿ×ÿq&.7A%#&/532>54#"'67&'#"&'6732654'#5!#'3254'"'·#J1|¢"vÝ54!$0>!`G1z/"<8 #Ø7W.&?·8$=ô+3#B#m3,"I] |?‚3!E# 33"%7#Á$H8$ÿÓ. ?2654'#%3267#5!##5.#"&546325.'&'+"/P ’ 'þÛ 4ÌA¥-5 , /ÿìÿƒü.;6325.'5#5!##5&#""&546325.#"#"'7326s@5"'2Ä B_853=_%#.>,-H% :(20A,-û84E®¸K7"33ýˆO‘ *1)#C21ÂN4?4j" Eÿ× s Y2767&#&#"'3254'"'3#67632533##4/.''654.#"'#".'#"&'6?32654'4'#5!æ0)3#2$ >ú8$=`' B!…F3VV3 »$%-44 "<8  $Ø7¸(82&(($H8$)‚ÑE3þ:. Á"'  )(‚3  @*3ÿ×ÿ™ sZgqv.#"#"&54732?6324/.''654.#"'#".'#"&'6?32654'4'#5!632533##2767&#&#"'3254'"'3#6E  LZ.EF 46 »$%-44 "<8  $Ø7!…F3VV3þÏ0)3#2$ >ú8$=`' 2(M@%0 .<)+). Á"'  )(‚3  @*3‚ÑE3ýž(82&(($H8$ÿ×ÿ¾™scq{€%63254&/&''654&#"'#".'#"&'6?32654'4'#5!632533##4'5.#.#"""&546322767&#&#"'3254'"'3#6´ ( »%&14 "<8  $Ø7ƒH3UU2-1$# -3&'#".'#"&'6?32654'4'#·".  þË8$=þYÕC4\+ ' )(% / 4 "<8  $Øû".0< 3$H8$33þoZ (+" /!(‚3  @*ÿìÿo .C6325#53##54&#"3".54675.#"#"'73267.'5#5!#s@5"'2313/¤B3Q#     :(20A,- B_8ü!û84E®þ:4ý33ýt6? (!, ÁN4?4j" EK7"33ÿ×.LV726325.'#"&'6?32654'4'#5!##54&#".#"""##"&5463254'"'¨10!2 "<8  $Ø7W33** $.9B€8$=ë6 ž'‚3  @*33"<þÙ(  %*(-7,$F$H8$ÿìÿ²ü.N6325.'5#5!##4&#.#"""##"&546326325.#"#"'7326s@5"'2Ä B_852- 1#!-.#""&546325&/32>54&#"&54632&'#5!K '7!&"/>,-H%z’_:&: M$B0d/6l•¥Y&&3þœà|"8 *2)#C21Tc09!(# $<#$*9+KZ9o2[p!*ÚÆ33ÿÓÿÈI..22'654&#"&/32654&#"&546326%5!Û0:.;&A|¤Z&¥Ý[,CXK&1++ Q?0a 5þ'v¥;1$:*.#a!Yr!»G9!@3$=4 %4EF*-V33ÿéÿú§./=B4'#5!#2?&547#5.#&'>354&#"/46725'.5#7#3f%X¾ê9 0D3O+$1J5-+B?YG+DûR1!Å#33]*/‹O…n=þŽ|6E!+;( h9 ;¦M52*ÿçÿË=.O;27#"&'&/32>54&#"&546326326325!5!##4&#"4&#|/'-@ %C¥Y&©Ù_:&: M$B0d/'V":0/+&ý+VN3@'." %*801+"[p!ºH9!(# $<#$*9+K4''0+ ‡33þY&&3)ÿçÿJç.FJ%25&/32>54&#"&54632&'#4&#.#"##"&5463265!"z’_:&: M$B0d/6l•¥Y&&2-+"#! .;J(2( þíàOc09!(# $<#$*9+KZ9o2[p!*¢7-  B"07,+?0ø33ÿçÿ“W~P[g2533##&#"32?632'#".'32654&'#"&=#5!#26754>4632#"654#"+1;K-2AB3S^*= # ,&D(#p[=b7'/Z4(-CP4 %á« Œ Y&7,þÉ "åb,!/0HÇP3þ `›:  7(>'WjIe[&†©$[H4 7!5+­33©" b (< ýƒ2i^ 7ÿÝÿhT.,39.#'67.+"'675!5!##"'72>54&+#/P+!AU(w2z™þ®wò9F0/")( \23œ)‰L Kf!*0D,4U6`*.33.(L1#B%'7LýÎ2JX/W)  +ÿÉï{1.#'675&#"32632'7674#"#"&54632533##yQ,!LeV^!F O",E**8+ N  WC9M.3CC3 *0L2o›7#)"!E( 6)%1^5HÇM3ýÎÿçÿN¿.,5.#'67./7##"&547#5!##27#OQ,!ES"q=N&HOØ=3& !&')Þ3Å  J *0E-0B (R8,33ýSE $ #a0 þ©   ÿåÿU±.#,%.#'7&'#5!!#'2>54.'$  JP,! cÌþÊ=2-* 33–#bDLgC   >!)0Ô33=&(4Gþ¾àYi ÿñþò.EP&'#5.#'67&+532654./#"&=#5!!;26722654'#"'\# J3%80?R/."3O+!B]€}GVx _104*þ= "12 NþæC1     ¼ <(3/)$î3#'0F/U4[2@].á33 @ZK&†ÿçÿ7a.M.#'67&547#".'32?#"&'&5332654'#".547#5!!32?#ÜQ,!DY #0C( $*%*`4Hƒ3m9"@(1'2KåzþÀK9# 3–!)0F../]X ! B!-"$,!@RŽx+F! c…6'$&1/a1337'!>_;HTÕÿÇÿZš'@7523!32654#"'632#5./7.5#5!654'"&5473G$B>.I/þÓ;d&!"-33  !&d[[š3G!*a!#/š%l32533##dQ,!MdY$-H, )F>)3& 3__3 *0L2c+w4<>3^+1:('Êc3ýÎÿßÿ.U.6:%.#'67&'&'&/332654&#"&54>32#5!`JQ,!-3–03XYBLF57 + 8&Kc503þv  >!)0."ðV­š\IFa!#'" '}]AiþôÍ33ÿ[ë†3833##5.#'67./67654&#"32727+"&54624\%jI4QQ4P,  (V~Q2JL§8P)YïX3ý`3 *0@*=@ 8<"*$3- 2DJþe&ÿè«.&,"##5!!632#7. /6754&5'g3HÃþ·LP12  .cRUK>˜}* 33 pþ   +R#E ä9 &-ó5 .5:5%"75!##5.'#5./7&54632&7675#’0{&]þò#y«g3†C3GkMp^),*' ŸyU-J1&3gwÞ: O4ò  2½ DJ3þX/{ þõVGK)[F=8Y323>üD'@s$þk>j3  !$z 94 ))&)H2 Ò#/š"°>33-&5þ¾"*!L, !2% ,,ÿØÿ˜Ú.$,767.#"&54>325!5!##5.#7¦JfA&'"!4#4,b3þP3Q,# KEN0?C , '&D/F"fÌ33ý3 *q   ÿÉ s%3.#'6754/.''654&#"'>32533##2767&#&#"‚P*!Md »$%.# n6…F3VV3þÏ # 3#2$ ?"(0N0F. Á"&!$ $1P‚ÑE3ýÎï ,+2&(!ÿçÔ. ).5.+'675!5!##5.'#675s.{%]Uš9!~”þ½íf4…D3H''%ˆ3on: M6ò  1í.ˆ6b++33þX/z þõ$X,J”L+ÿéÿYA.=A%4632&#"3267#5.#'67.'32654'#"&'5!…  Já)4! K%3!%(#2M,!'*:_B*9%”T,P"5R3O»XG   ®#00:2G #!9 &Rþñ3!)0) LukD“¥Q?3Z7Â33ÿéÿðÕ.<7574'#32%#5!##5./67.#"327#"&54674¾G$Ex#µ '*:þòeìa3  !'l$c +& ·#/š&Â4,#)¢3309;þ¼"*#CG3*'(ÿèÿc .BGR.#".547326325./67.#";27"#"&54674'#5!##574'#32^;V%B6+@D7.4  !:Y$c  ,+ ›"a33kH#H{#µ  V:g' D5'/ /:, +1!*/7G3*#(-3309Bþ.T"0š)Å4, K 9ÿèÿhÐ.',5.#'6754&#".547.'5#5!##'5x=79.S+!Jg`#B2U=4‹>NBè93hO/û82NàýŸ +0L1C+P,L/‰&!"33ým¬+}ÿôþ÷à. J%55>754&#".547.'5#5!##5.#"#".54732?6325.#O/½=79.±0O2`#B2TB.Š ALGì83B!6/E#-DH (47R,+}·73Nàþ27 €C+O,G1ˆ$$"33üü5',.%0 .<)*+,ÿßÿ˜ .6.#'6754&#"4&#;27#"&46326325!5!##ŒQ+!Md@'." 0&;GG;1.+&þS.N35 *0O/QY&&3))90Q€R0+ ‡33ýÿíÿ˜…;76754&#"327#"'#"'732654&#"5263533##5.#ÞIhP%!, <" 4#I5¸N3QQ3Q,EM1›s/6 +:')01=8i_  $ÀW3ý3 *ÿ×&.*2757#5./67&'#"&'673265#5!!3254'ûD'@‘33  !(kK$"<8 " Ø7þò8$=í#/š#é"<þ¿"*$B]‚3!'O/33$H8"ÿìÿ˜ü.&/7675.#"#"'73267.'5#5!##5.#6325ãIh :(20A,- B_853Q,‘@5"'2EM12N4?4j" EK7"33ý3 *æ84E®ÿçÿËö. 75%5!##5.#&/32>54&#"&54632675•.{%]þHf4H"^¥Y&©Ù_:&: M$B0d/3gnq: M6ò 1·33þX66 [p!ºH9!(# $<#$*9+KQ5L+ÿçÿ'ç.26%.#'67&/32>54&#"&54632&'#5!KJR+!EZu…_:&: M$B0d/6l•¥Y&&3þœà  >!)0F/X,9!(# $<#$*9+KZ9o2[p!*èÔ33ÿ™›„_#".'#5.#"#"&547326325./>54'"&547326733#3274#"3"54632ƒK+( 4CQLZ.EG 7 46³86q4)$1( ,(54'"&547326733#67O/_4CQLZ.EG 7 46³86q4)$1( ,(?>54#"&546Î#0%s/O;5SKI/ &@b8M 6$,E-/()"9$ &[OY…Y6#80B:[¬o ;$YkGO *"%Q[%`;+1># 3 .Fÿ®{`"&'#5.#"#"&54732?632&#"32632'7674#"#"&54632533#3274#"3"54632„KT)3CYM.DG28V^!F O",E**8+ N  WC9M.3ññ  6 *>0#$,96G##þ¬6'W6), *;)*<›7#)"!E( 6)%1^5HÇM3‰G,X'$;(<ÿ®{{W%&=47#5.#"#"&54732?632&#"32632'7674#"#"&54632533#67=/^3CYM.DG28V^!F O",E**8+ N  WC9M.3ÏÏ@7ˆCB _¥! þ†6'W6), *;)*<›7#)"!E( 6)%1^5HÇM3#`%+ÿ¾{j"&'#4'5.#.#"""&54632632&#"32632'7674#"#"&54632533#3274#"3"54632„KT)2- .$# .;C/1) (V^!F O",E**8+ N  WC9M.3ññ  6 *>0#$,96G##þÞ   ,4/7,$F1›7#)"!E( 6)%1^5HÇM3‰G,X'$;(<+ÿ¾{{a%&=47#4'5.#.#"""&54632632&#"32632'7674#"#"&54632533#67=/^2- .$# .;C/1) (V^!F O",E**8+ N  WC9M.3ÏÏ@7ˆCB _¥! þ¸   ,4/7,$F1›7#)"!E( 6)%1^5HÇM3#`%ÿçÿº.|.#"#"&=7332632'&547#".'32?#"&'&5332654'#".547#5!!32?3274#"3"54632#".'ïA t"?O2)/!y '$#0C( $*%*`4Hƒ3m9"@(1'2Kå(þK9#  )7 *>0#$,A4   --4XA ,F4 2H']X ! B!-"$,!@RŽx+F! c…6'$&1/a1337'!#3X'$;(<-,Q ,M6A…ÿçÿºÕ.q.#"#"&=7332632'&547#".'32?#"&'&5332654'#".547#5!!32?67&/&=47ïA t"?O2)/!y '$#0C( $*%*`4Hƒ3m9"@(1'2KåîþLK9#  ,8/ ]--4XA ,F4 2H']X ! B!-"$,!@RŽx+F! c…6'$&1/a1337'! #`% 1T .KE/! K5A…ÿåÿõÂ.IM#"/#4#"#"&547372&#"327#"&546323274#"3"546327!5!©L*: .\Š =K, V²'&w !)•7.  5* >0#$,ý#Ý97F/þõr]I4<*3$#m'$#*8Œ. ) 4X'$;(9’3ÿåÿõ¡.<@%&/&=47#4#"#"&547372&#"327#"&5463267!5!b/ ^.\Š =K, V²'&w !)•7. @7?ýD¼ˆ>G .KE/! þÍr]I4<*3$#m'$#*8Œ. :¡L3ÿœ†h#"/#5.#"#"&54732?6325'./67654&#"32727+"&546233#3274#"3"54632„K+9 4CLZ.EG (46A1]A,p'@7) ? (V~Q]$iJ4ðð )6 *  >0#%,94I/þ5(M@*+ .;)+BF11 8;"*$3- 2DJ=7Q(ZïX3Š 3X'$;(<ÿ{†[%&=47#5.#"#"&54732?6325'./67654&#"32727+"&546233#67=/^4CLZ.EG (46A1]A,p'@7) ? (V~Q]$iJ4ÏÏ@7ˆCB _¥! þg5(M@*+ .;)+BF11 8;"*$3- 2DJ=7Q(ZïX3#`%ÿûÿ·.B%&#"3262&'#"&4632654#"#".5467#5!!32>F$ $%3@-   (0M9<("/24:3;-,9 †!þ +0&0\LD4WE BA9908?JV!?-:#&K22O&7(/(ÿîÿþÓ.T#"./4&5&'#"+".547;26;2&547'#5!!673274#"3"54632°A4)  .(5 P '0!1-$ i#* ƒd.žåýìe•,  6 *>0#%+9,Q1C^P @*/:!3:jS³2"33ê†!F+X'$;(<ÿïÿù›.E%&=47&'#"+".547;26;2&547'#5!!6767S/[ .(5 P '0!1-$ i#* ‚d.ž¬þ%e•, +8ˆCB b¢! 1C^P @*/:!3:gV³2"33ê†! #`%ÿ™5W%"&547326325./7&54632&#"75!#3274#"3"54632"&'#5.#"yyUDU™F`.EF 3 :FkMq_<+( $y$ñ  6 *>0#$,KT)3D =œ ×$#& Â$þk>j ,-)=52$.6&6 o& )6')H2 §þ>33,'2 (!4/&QE'+H,' " Q !2!+,,ÿáÿä.=74632'.#"&54>323>54'!5!#&#"327'#"&Þ;,  :1 ))&)H2 $þk>j(#%" …'o"*E¼(39- !2% ,,>33-&> SªŠ'ÿá(.+4'!5!#'7".#"&54>323>š$þk>jd3bý:D  ))&)H2 ¨>33-&1,G (J8²g,, !2% ,,ÿáÿü.G7467&#"&54>323>54'!5!##"73254'#5>54&#"3&Å80?' ))&)H2 $þk>j!D"4ZIÝj0(˜Wp2 89,O*51]ý$? . !2% ,,>33-&($0426BG‹—C) 1(%'4 ÿëÿþQ.c#"./&'&'#"+".547;26;2&547'5&#"&46325!5!!673274#"3"5462$K*)  /'5P &/!24 i , ƒd.<6!(9(5<þífýàe–, -7 *>0F-96G5AUY @*81!3:b[³23vR3L’33ê†! 3X'$;(:ÿëÿù .T%&=47'&'#"+".547;26;2&547'5&#"&46325!5!!6767Ä/\ /*2 P(. 24l$) ƒd.<6!(9(5<þí!þ%e–, +8ˆK: d ! 4@UY @*81!3:b[³23vR3L’33ê†! Œ ÿ™¦sXf#"&'#5.#"#"&54732?6324/.''654&#"'>32533#3274#"3"54632%2767&#&#"A4*)3C  LZ.EG 46 »$%.# n6…F3ññ )7 * >0#$,ýÄ # 3#2$ ?9,Q##þ—5(M@!4 -<)+). Á"&!$ $1P‚ÑE3‰3X'$;);Q ,+2&(! ÿ™}sM[%&=47#5.#"#"&54732?6324/.''654&#"'>32533#672767&#&#"?/W3C  LZ.EG 46 »$%.# n6…F3ÈÈC-þ # 3#2$ ?ˆCB _¥! þo5(M@!4 -<)+). Á"&!$ $1P‚ÑE3œ#`%# ,+2&(! ÿ¾¦scq#"&'#4'5&#.#"""""&5463263254/.''654&#"'>32533#3274#"3"54632%2767&#&#"A4*)2,'(#-0#$,ýÄ # 3#2$ ?9,Q##þÞ = &*/6-$F1Ü. Á"&!$ $1P‚ÑE3‰3X'$;);Q ,+2&(! ÿ¾‚sXf%&=47#4'5&#.#"""""&5463263254/.''654&#"'>32533#672767&#&#"D/\2,'(#-0#$,A4))4#:/ #*.) H''2" H,Š6`-+33Š3X'$;(;.,Q"!þš5 ;'+* (&3{$`!ÿúÿ™k.?H726325.+1'675!5!#67&=47#5.##".547„ƒ  Ÿ8"z˜þqÊA1/Y4#:/ #*.) H''2" H,Š6`-+33œ #`% 1T d ! þp5 ;'+* (&3{$`!ÿçÿN.Q5#"&'#4&#.#"#"&46326325.#'675!5!#3274#"3"54632g~E0oªA4*)2- 1%$ .;J(3' *š9!~”þ½gñ  !6 *>0#$,:$eì8,Q##þ­<)  +607X>0,.ˆ6b++33‰G-X'$;(<ÿçÿ+.GP%&=47#4&#.#"""##"&46326325.+'675!5!#67í/]2- 1%$.;J(3' *š9!~”þ½DÎ"TÂH''%ˆˆ1T d ! þ‡<)  +607X>0,.ˆ6b++33 #`%$X,ÿçÉ.RV#"/#.#"##".547;725#"&54632&#"32?3274#"3"54632%5!°A49- -!  9;$1C1*m7aD0;3% 9/:81 )6 *  >0#%+ý7â9,Q/ù#"J5214B "èU>0!+$+ 38883X'$;(:“33ÿçÿù¬.EI%&=47#.#"##".547;725#"&54632&#"32?675!n/^- -!  9;$1C1*m7aD0;3% 9/:81A6ýzň1T d ! þØ#"J5214B "èU>0!+$+ 388E-Y"f33ÿöÿ= .PW#"&'#5.#"#"&5473263254&#"#"&547.'5#5!#3274#"3"54632%5‡L)(*3C YM.EF :56`#/*U)D‹ AMLªñ  !6 *>0#$,þ ?59.97F##þ;5(W6+* *;) +ø‚5+P,],‰%""33‰G-X'$;(<•73Nàÿöÿ={.FM%&=47#5.#"#"&5473263254&#"#"&547.'5#5!#675=/[3C YM.EF :56`#/*U)D‹ AML…Ì?5þT?59.ˆCB _¥! þ5(W6+* *;) +ø‚5+P,],‰%""33#`%f73Nàÿéÿ™úsx‡“"&'#5.#"#"&54732?6324/.''654&#"#".#";27""#"&546754'#5!>32533#3274#"3"54632%2767&#&#"4'#32áKT)3E)LZ.EF46 »$%!/,#G7 *& e‹M#…F3ññ  -7 *>0#$,ýÄ3#2$ ?[#µ '*:96G##þ—5(M@%0 ,<)+). Á"' $":))3+'!-33 %‚ÑE3‰ 3X'$;(9O)!2&( 64,#)ÿéÿ™Ñsl{‡%&=47#5.#"#"&547326324/.''654&#"#".#";27""#"&546754'#5!>32533#672767&#&#"4'#32“/W3F6YM-DH :38 »$% /,#G7 *& e‹K#†F3ÈÈE+þ3#1% !?Z#µ '*:ˆ1T d ! þo5)W6%0 ,<) +) * Á"' $":))3+'!-33 %‚ÑE3œŒ#)!2&(!54,#)ÿçO..4@#"&'#5.+"'675!5!#3274#"3"5463254632#"&6A4*)3™>$€™þ¼hñ )7 *>0#$,þ09twF&9,Q##þþY/†4^6&33‰3X'$;(<- \'ð"þâÿçÿù'.#)5%&=47#5.+"'675!5!#67%54632#"&é/X3™>$€™þ¼@ÉB/þ~9twF&ˆCB _¥! þ×Y/†4^6&33œ#`%¤ \'ð"þâÿñÿyÿ.%#".'732654'#"'732>54&'.#"632'>54##"&54632754&#".#"3254'7#"&546326325!5!#ñ P+@uL.3Sz7%  #;%!, 4B  H"%!/+3''=. 1-=C0; .þd?1d'  ):X}r% E—f$ - @I'D/   "C  "IDF(D!/&9-%C 1 F33þëDÿñaäJ[#"'732654+563632>76?67#"&'732654'#"'673264'.'32>7#"&É(  `   M%%- )E$M9mÆ%2€Q!?"  '1"     1 G,A#=! ~"Y/Tà²jÆ&/ *,d%P   ( + ÿíÿ™³…o#"&'#5.#"#"&547326324&#"327#"'#"'7;>54&#"56;263533#3274#"3"54632šA4*)3E  YM.EF 2 56P%!, <" 4#I5N3ññ  !6 *>0#$,9,Q##þ—5)W6), .<) +Ms/6 +:')-1=8k_  $ÀW3‰G-X'$;(<ÿíÿ™‰…c%&=47#5.#"#"&547326324&#"327#"'#"'7;>54&#"56;263533#67J/V3E  YM.EF 2 56P%!, <" 4#I5N3ÇÇC,ˆ>G ^¦! þo5)W6), .<) +Ms/6 +:')-1=8k_  $ÀW3œ¡ÿíÿ¾³…x#"&'#4'5&#.#"""&546326324&#"327#"'#"'7;>54&#"56;263533#3274#"3"54632šA4*)2- .$# .;C/1) (P%!, <" 4#I5N3ññ  !6 *>0#$,9,Q##þÞ > ,4/7,$F1s/6 +:')-1=8k_  $ÀW3‰G-X'$;(<ÿíÿ¾…n%&=47#4'5&#.#"""&546326324&#"327#"'#"'7;>54&#"56;263533#67R/]2- .$# .;C/1) (P%!, <" 4#I5N3ÎÎA5ˆCB _¥! þ¸ > ,4/7,$F1s/6 +:')-1=8k_  $ÀW3#`%ÿÎÿ™Áserzƒˆ#".'#5.#"#"&54732?6324/.''654.#"'#".547#5!632533#3274#"3"54632%2767&#&#"327'654.'"767#¨K*) 3F7LZ.EG  38»$%-X* $4«Þ†F3óó  6 *>0#$,ýÁ0)3#1% ?þû1b1  '96Gþ“5(M@!4 .<)+). Á"'  )7 ,K$3‚ÑE3‡ 1'X'$;(þ0)3#1% ?þû1b1  'ˆCB b¢! þr5(M@!4 .<)+). Á"'  )7 ,K$3‚ÑE3ž#`%#(82&(E%Y(  ÿ×ÿÿ. FP73267&#"&'#"&54632765'&5&'#"&'6?32654'4'#5!!3254'"'Ï(#è 8-$A71%-7'9X)"<6  $Ø7þò8$=¼  ""1 7);(&HM'-"$-' "! j‚3  @*33$H8$ÿ×ÿû1.9C74632'.'#"&'6732654'#5!#&#"327'#"&3254'"'Ý:. #7"<8 #ØZz%##" …'o:3#8$=Ô&42.'‚3!E# 33" 4 XªŠ6G$H8$ÿ×6.%/?&'#"&'6?32654'4'#5!#3254'"'Í‘Y)"<8  $Ø7W)!d§Ê8$=èj k‚3  @*33D6,G~8Å$H8$ÿ×.MW#".'73254'#5>54&#"3&5467&'#"&'6?32654'4'#5!!3254'"'·#."4ZI.PDM0)—Wp278-F )2]17/"<8  $Ø7þò8$=û"/ ,527B%A‚YŒ—D) 1%'4NG >‚3  @*33$H8$ÿìÿ\¸.Yb#"&'#5.#"#"&54732?632.#"#"'73267.'5#5!#3274#"3"54632%6325ŸA4*)3C  LZ.EF29 :(20A,- B_8Ìñ )7 *>0#$,ýÔ@5"'29,Q##þZ6'M@*+ ';)* N4?4j" EK7"33‰3X'$;(<•84E®ÿìÿ\“.NW%&=47#5.#"#"&54732?632.#"#"'73267.'5#5!#676325U/[3C  LZ.EF29 :(20A,- B_8§Ìcþ@5"'2ˆ1T _¥! þ36'M@*+ ';)* N4?4j" EK7"33#`%f84E®ÿ×ÿ™;su‚Œ‘"&'#5.#"#"&54732?6324/.''654.#"'#".'#"&'6?32654'4'#5!632533#3274#"3"54632%2767&#&#"'3254'"'3#6"KT)3E  LZ.EF 46 »$%-44 "<8  $Ø7!…F3ññ  6 *>0#$,ýÄ0)3#2$ >ú8$=`' 96G##þ—5(M@%0 .<)+). Á"'  )(‚3  @*3‚ÑE3‰G,X'$;(ú8$=`' ˆ>G ^¦! þp5(M@%0 .<)+). Á"'  )(‚3  @*3‚ÑE3¡ (82&(($H8$ÿ×ÿ¾6s‚šŸ#"/#4'5.#.#"""&5463263254&/&''654&#"'#".'#"&'6?32654'4'#5!632533#32>74#"3"54632%2767&#&#"'3254'"'3#6K*; 2-1$# -0#$,ý # 3#2$ !?ñ8$=Z! 96G/þÜ % +5/6-$F1Ü'Á"),%(‚3  @*3 ‚ÑE3‰F,'#'$;(9O ,+2&(!+$H8$ ÿ×ÿ¾ sx†•%&/&=47#4'5.#.#"""&5463263254&/&''654&#"'#".'#"&'6?32654'4'#5!632533#672767&#&#"'3254'"'3#6Î/ W2-1$# -0#$,ýÔ@5"'29,Q##þÓ:*  +6"06-+?0¢N4?4j" EK7"33‰3X'$;(<•84E®ÿìÿ²–.Zc%&/&=47#4&#.#"""##"&546326325.#"#"'73267.'5#5!#676325X/ ^2- 1#!-54''4&#"3&546327%5!žw=3+!*W "h¹~G29S&+H$+#!&A[G6H&B22þ5üGDi&R $j|"F"!0&8%`'2-$02T5FKV!_’33ÿÓÿÈ!.6:%47""./32>54&#"&54>32632'&5!¨  o¢\&Dý?[>&: L%/,#<(6k :þ+NÀ@/L$Xs!U¢?!(# $=4!3 "*W6 39OW ,33ÿçN.,08#"&'#5.+'675!5!#3274#"3"54632%'5A4*)3š9!~”þ½gñ  !6 *>0#$,þõ9Vˆ$ %ˆ9,Q##þþY.ˆ6b++33‰G-X'$;(<7@>e X,ÿçÿù&.!%-%&=47#5.+'675!5!#67''ç/X3š9!~”þ½?ÉB/½9Vˆ$ %ˆˆ>G _¥! þ×Y.ˆ6b++33œ#`%î@>e X,ÿçN.,4=#"&'#5.+'675!5!#3274#"3"54632.'75A4*)3š9!~”þ½gñ  !6 *>0#$,þ`:,n6H''%ˆ9,Q##þþY.ˆ6b++33‰G-X'$;(<þÀ&Q . I7Q$X,ÿçÿù)."*3%&=47#5.+'675!5!#67.'7ë/[3š9!~”þ½BÌ?5þè`:,n6H''%ˆˆCB _¥! þ×Y.ˆ6b++33#`%o&Q . I7Q$X,ÿíÿ¾¢.MQ#"&'#5.#"#".54732?6325.+'675!5!#3274#"3"54632%‰A4*)3C  /D#-DG 19š:!~”þoµñ 6 *>0#$,þõ9V9,Q##þ¼4&,-&- /;(*%-‰6b++33‰X'$;(<7@ÿíÿ¾.AEM%&=47#5.#"#".54732?6325.+'675!5!#67'A/]3C  /D#-DG 19š:!~”þo’Î6@Â9Vˆ$ %ˆˆ1T d ! þ–4&,-&- /;(*%-‰6b++33 #`%@>e X,ÿÝÿ,T.*1'7675!5!##"'72>54&+#5.+"7¦¦ýïz™þ®wò9F0/")( \23›@ùœ)‰Ô{({ï`*.33.(L1#B%'7LþfX/‡JX/ÿ,w„/'733##5./>4'"&5473267Z¦¦þÀW$Ld3TT3¯:3:*4(%1( &'=Ô{({R5FaÝV3þR,‡1-45)*%/DJ+ÿ,t{.'72533##&#"32632'7674#"#"&546W¦¦þQ9M.3CC3V^!F O",E**8+ N  WÔ{({Ý5HÇM3þ`›7#)"!E( 6)%1^ÿçÿ,Q.*'727#'47#5!##5./7##"&3¦¦þa& !&')Þ3fOØ=3„JN&HÔ{({? $ #a0 133þAAZ (R8 ÿ,2 <F'7>32#"'326?#".'732654'#"547&'7&#"325¦¦þk I4M.',59(#)\H>g@&3"5R0<3% =!o#>(ä5<$UÔ{({TE)+) W<P-JcM|ƒB @ykAE.0,"4”!W>&1 5ÿåÿ,ê. "'7%2>54.'&'#5!!#̦¦þ‘#bDLgcÌþÊ=2-* W{/Ô{({áYi þŒÔ33=&(0‚^ÿñÿ,.9D'7.+532654./#"&=#5!!;26722654'#"'|¦¦ %80?R/."C`z;GVx _104*þ= "12 NþæC1 Ô{({Ë <(3/)$7='4[2@].á33 @ZK&†ÿçÿ,˜.I'7".547#5!!32?&547#".'32?#"&'&5332654'z¦¦þQ'2KåzþÀK9# 0 #0C( $*%*`4Hƒ3m9"@(Ô{({¤1/a1337'!>_;HTjN]X ! B!-"$,!@RŽx+F! c…6'$&ÿçÿ,†"+'7675!5!33##5'&'#5.+"7q¦¦ýp¡þºz63VV364–?÷#q#)ˆÔ{({ïa,+3þÎ@ÜX3þ=$£W2„;V1ÿ,ë:H^'7#"&'#4&#&+&547;636;24&#""327#".546327>32'4&#"2654&#"5326¡¦¦0g*\3B^#H}/69 ":, %n  "#! Ÿ*5'2*,=35a.W83%'/Ô{({Þ40gBÈL3šE9 C<9*#S x $ $>Ba1>-44'xE67!,3%ÿÇÿ,š'5'723!32654#"'632#"&5#5!654'"&5473|¦¦¦6A/þÓ;d&!"-:c4,'d[[š3G!*aÔ{({\F63þ´6ŒD$"1'6vS?'O3 2 ?/) .ÿôÿ,ªT(4'73##"&54>7>54'#53&5472654'|¦¦þé/2Ư2@fHFV2 ʬP6&(:4I<"G0Ô{({‹,N73Pr^HZD N=%3]G54#"'62|¦¦ú,'xØþÓ 35% *>.9dÔ{({¯?'’33þq 6Y1&"!=8€[?ÿ,]‘('7327+"&54>32533##4&#"@¦¦þ, )F>)3& 3__3Y$-HÔ{({5>3^+1:('Êc3þW+w4ÿßÿ,U.)-'7&54>32#"&'&5/332654&#"%5!¦¦þÏ + 8&KceT¿73XYBLF57þãvÔ{({ '" '}]\|V­š\IFa!w33ÿ,]†4'733##5./67654&#"32727+"&5462@¦¦þ×\%jI4QQ4";,C&,n'B7)!> (V~QÔ{({S8P)YïX3þI% 58<"*$3- 2DJÿéÿ,-.'7'&547'#5!!67¦¦ãƒd.OÊþ¸e–,.Ô{({ªLcb[³2"33ê†!Q~UY-ÿ,:5")'7"753##5./7&54632&¦¦þU#y…R3GkMp^),*' ŸyU-J1&Ô{({® DJ3þVGK)[F=8Y325!5!##5.#"0¦¦þ4#4,b3þP3"4'"Ô{({0&D/F"fÌ33þÃ.:& ,  ÿ,{s"0'7>32533##4/.''654&#"72767&#&#"]¦¦ýŽ n6…F3VV3 »$%.% # 3#2$ ?Ô{({O1P‚ÑE3þ:. Á"&!$ 9 ,+2&(!ÿçÿ,Y..'73254&##5./67&'#5!!6;2#"'¦¦q I<38b($fNrþ3>(69vK Zr8Ô{({È #1?þZFA_ %M#6@33*8&1,'aNaP'% ÿçÿ, .'7.+'675!5!##¦¦öš9!~”þ½·A3H''%ˆÔ{({.ˆ6b++33þ$X,ÿéÿ,A./3'74632&#"3267#".'32654'#"&'5!¦¦þ„)4! K%3!%`K9bC:"9%”T,P"5R3O»XÔ{({$#00):2G #!9 @s1Jm_:“¥Q?3Z7Â33ÿèÿ].%'7.'5#5!##54&#"#"&5475@¦¦þh>NBè93`#B2U)D>=79.á{({:&!"33þ­C+P,],‰–82Nàÿáÿ,J.%'7670/.+5!##5.'-¦¦ýß9Y KUÜ?3)“9?Y7;G&4Ô{({Ï9C 233þLCR F7""5jÿçÿ, .''7675!5!##5.+"754632#"&¦¦ýò€™þ¼¾G3™>09twF&Ô{({í^6&33þY/†, \'ð"þâÿßÿ,.3'7;27#"&46326325!5!##4&#"4&#c¦¦ýË0&;GG;1.+&þS.N3@'." Ô{({Ñ)90Q€R0+ ‡33þY&&3)ÿíÿ,Ž…<'7#"'7;>54&#"56;263533##4&#"327#"q§¦þ1 4#I5N3QQ3P%!, <Ô{({')-1=8k_  $ÀW3þ^s/6 +ÿéÿ,D.'7&'#5!##5./6&'5&¦¦þr-~"ÖF3BdE*÷I;0|UÖLŠÔ{({C#A33þ@]G:%3(?+7qc{šÿìÿ,Ž. ,'76325.'5#5!##5.#"#"'7326q§¦ýå@5"'2Ä B_853 :(20A,-Ô{({§84E®¸K7"33þõN4?4j" Eÿçÿ,ç.#''72&/32>54&#"&546'5!|¦¦¾6l•¥Y&©Ù_:&: M$B0dÆàÔ{({—Z9o2[p!ºH9!(# $<#$*9+K33ÿçÿ,J.3>'7"&=#5!!>7#".'32>54'4632#"&-¦¦þÂ%á.þæ R(4wY=a9'3.EN#)=#(0 Ô{({™6(°33¬X(p"YoIg€]$TY2$6-2(+þÛ4 ÿéÿ,Ú.!/'7%"&5#5!!>54#"'6324632#".¼¦¦þÀ#4ZºþÕ.M#"(Lj!- Ô{({¬/7•33þh]d# "mL³_-!ÿëÿ,9.!-'7&+5!##5&/674632#"&¦¦þxeU ÒI3C°,=,E$Q(/(" !É%&Ô{({K]23þLp/8B–*5G# "fþX '&ÿçÿ,#. '7'.+'675!5!##¦¦ù9Vˆ$ %ˆš9!~”þ½·A3Ô{({I@>e X,X.ˆ6b++33þÿçÿ, . %'7%.'77.+'675!5!##¦¦þ²`:,n6š9!~”þ½·A3H''%ˆÔ{({Ò&Q . I7 .ˆ6b++33þ$X,þWÿÞ.=A'&54632>32'654&#"#5&#"#".5473263254#"753Û$i.$. +"0$"531;V$6 ()R 3)%CÍ«ð #3g;- 9+#Bõ2* "2+)A(2  Ø/Hì33þÿóg/2#".'73254'#5>54&#"3&54>¦5e"4YJ.PDM0(˜Wp2 88-F )2]$5)g9)327B%A‚Y‹—C) 1%'4N!1 þaÿþ,"2#".'732654&#"&546s0A\G+N8,3 2L*+>*+3,M9AM*?L?DN64*!.Bþaÿäÿ¹R*%&54632#5&#"#"&5473263254#"þ÷]*34'2  )M.,#1',7š)^6&þî)# C4$6 3+"µ(= þÿÞÿ Œ*%&54632#5&#"#"&5473763254#"þÍf1<31; :I,8'/='$C¹ 2f14þ·2*W.2: ;(1Ù0I ÿá<.#4'!5!##".#"&54>323>š$þk>j6:D  ))&)H2 ¨>33-&"E,, !2% ,,þ‘ÿRÿÚ„&#"&546323#YId6(KE#3M.33e7 /J'69:ŒýÎþíÿ~ÿÑÌ'.#'673#bF(B,D<Md33” ) 2L/0/N0þ²þÔ!ÿ²Š'56753#5.'ìI"5v0{33  !è&,š )L!þ—!þnÿßÿÏ?.'25#"&54632"2?#5&#""547326¬!'# '4##>U$-- ]_sX'. 0',/#šþFÿkÿáî'.##"&54732?6323#R    %,1D.*"$ B 33`   O90% %(1  þ}ýÎÿ‡ÿ*Œ"463263253#4&#."##"ýÎK'3' (32-+F% .BX=0eã7- C",/ÿÉÊP#".'732654'""""'732654&'.#"632'>54##"&54632&25F43aF83 ©T$   #7$%%*+3 < G#&Ê5Y2 !#@:WfXqÐ# -(>IL. ".B  !Jÿíÿ™Ð)cr23####5.#"#"&547326324&#"327#"'#"'7;>54&#"56;26354&#"&5463.#"B4]XGJJ3‘3E  YM.EF 2 56P%!, <" 4#I5N6?HHiÏ‘•f,[TMG )7eE3ýžbýž5)W6), .<) +Ms/6 +:')-1=8k_  $z"$%HûSu$#!ÿÿÍ®.'26=33265#5!##"'67¡%30" C3‰X 64YA &)+""*2 FHm33þ“:Q'P w.5%25!32>3247#5!##"'6732>54#"#".MŸþ»,/'04?šü;mwXbpYB2 &@28K %'3Ž:P%7(/(D4«=?S633þÆ]dP$CJV?@ ;ÿÓ.$/726=&#"&46325!5!##"'>73265¿(<6!(8)5<þÕ;X65YB %…0"B3\(evR3L™33þÆ:Q'PŸþ¤*2 GG:ÿßÿÍœ.>I%26=4&#"4&#;27#"&46326325!5!##"'7673265M%@'." 0&;GG;1.+&þS½W 64YB & {0"C2)+¨Y&&3))90Q€R0+ ‡33þ“:Q'P  Òþq*2 GGmÿíÿÍŸ…EP%26=4&#"327#"'#"'7;>54&#"56;263533##"'673265P%P%!, <" 4#I5N3ÝX 64YB &…0"C2)+òs/6 +:')-1=8k_  $ÀW3þ“:Q'P Òþq*2 GGmÿïÿï. (,7%5./67'&'#5!##"'?3265&'533265 ,$<!!E7.(X 74YA '(90`G¨8p3/#C30.,8(33þ¶;Q'P 'Å 3$  \g|þ”+2FHJÿש.1;H%26=#".'#"&'6?32654'4'#5!##"'>?3254'"'33265Z%4 "<8  $ØÒW 65YB G8$=90"C2\+È (‚3  @*33þÆ:Q'PŸ$H8$þÖ*4DJ:ÿìÿͤ.-6A%26=.#"#"'73267.'5#5!##"'?632533265U% :(20A,- B_8¸X 64YA  Ï@5"'230"C3*,ˆN4?4j" EK7"33þ”;Q'P Ñ84E®þq*2 GHlÿçÿË^.4#"'&/32>54&#"&54632326=!5!# 65.#¥Y&©Ù_:&: M$B0d/6l8 C3þwWt;Q' [p!ºH9!(# $<#$*9+KZ9D-GH‡33K.+%>54#"#".547#5!!32>327028K %';mþ -/'04?  KAhV?@ ;)T622S%7(/(D4+'#ÿÝIÕ$923#32654'7#"&54>54#!5!4#"#"&547326ôE5g~2HH28,u#<—J(5L\LBþóV:NWJ0zS¥=:31 >218#9+01S1'$T>CL3F31B 6 5þcÿÿÇ"274'7&'#"&5463267&#"þÄ5 2  "(0M9<("/"& " $-"BA99:Qÿ•¼¹. $#"./&'73274#"3"5462%5! K*) "  -6 *>0F-þõ$96G 4 3X'$;(:“33ÿ³ÿù‘.7&=47'6753S/c F@m¬ˆ1T d ! 3¡f33ÿï¾°.'6325#.'5#5!##5.#"#"'7326Û!)ç*03U/Á+4/"*)6% &“9‰i;(33þÃbA,4,Z 9ÿò a.$6325.'5#5!##5.#"#"'7326`# #‰$I'o3)!("+ û0/gn+33ï<699I *ÿïìQ.#632.#"#"'73267.'5#5!#Û!)/"*)6% &3U/bç*0“9RA,4,Z 9;(33ÿò8e #53'46;5!5!##"327#"'&eSS$g6—þ‹8zÔ)5,@7_3DV{jMNO±MmpIIºL(/I#V*tGGÿèe'#5373264'7#"'&546;5!5!##"_SS);5EC96LxSkEI]JŽþ¡lÞ$ O»)C$3n'1*iR^FI\Ie}IIÆ#„„F%"3267#"&5467'#5'%&'"'>325!5!'&54>32'"!!7'432+M(!'88OCF5(ŽHþñ+b"’+ÆSGþ?Â*.,8)D $Q‰þ…|Bà-&#=8N50C )=éÏ›9•lM7 SDFèH9H5$2 ; % JWHá5J* -ÿD„„_%"3267#"32>7#".547&5467'#5'%&'"'>325!5!'&54>32'"!!7'432+M  "88O#7( &)B=<& +5(ŽHþñ+b"’+ÆRHþ?Â*.+8)D $Q‰þ…|Bà-& =8% <*7#5$%>0C )=éÏ›9•lM7 SCGèH9H5$2 ; % JWHá5J* -ÿiЉL#53&54632'""#"&546;5!5!##"32632.'"'46322674&ÃaaŽXN4*D!$R*O -s ÂþÓÐZêG i"0Œd-'D",™,  )NÁZ³kM62 ;# F_þv4`IIªP; ,R?8"-[  8+þ|KZt#532653#"&53#'7DD%!'/D31E, $Kí=Ar$2??2 Šî;ÿUG#532653"&53###53'73õCC%-/FbE-4 MHM=á=ðYð@r$3?A1%¡ýäHâ:þäþLÒ£,043###53%7'7&54>212653"&537#533'=R7LMGM3þÛ1Õc>L!&!-/FbE-3;CCå'e%>BUHýéH–7„Ò#±*â$3?A1%2@>5þLJÒ'+'"#&'#%7'7&54>322653#"&537#53=D $R:- ?þÓ1Õc>O,7+,/D31E-*DCC$ %IY>Jš7…Ò#·%1 ¹$2??2&2@ÿ&K‰k%#532653#"&53&54>32&'"7DD%!'/E21F- $wY 1#*4 #*(×@r$2?@1 ZsI, : & #T*þÙæe9'3'#"'&547&546;5!5!#!"632'674&#"~ »W§Y &f›AK#îþ­æKþç&:;8" ;,=0&`IIª ; 6&  .! >ÿ „e *@#53'3.547#5!##"&54654&#"&5475!"327"2USS€ »WÂ*8#P„€ @cs6Ua‹."MVþñ#C"$!?Q|Z)Oü ÍR_5<IIp5(DwM-iOMOaEptKO%tQ&37#"32>7#".'47&543254&#".54oF:þˆ KþÀ?18Ä4H&#1! #3;=8( &)D<9%:•/\"8p'@43F>7^HH¥8v#  L2' <*7#+=h=.Ma;"R"0'>ÿóaW<D23275#53###"'3274'4632.'#".547&54632'4#"6ý*SFeòFGKNF>&)b  *&2@,61/eAH5=DG:587x%zHHýéO /O"* )-.4!@*HC1C3;C/59'1&"ÿµ¡W8<463!5#53##!"32?2'#"54632327654#""&%!5!+/žMãMIþ{@D!'5$a5{w&'; 0!7kŽþE»y]HHýér63, $X,tB .# rÏH¡g%.547#5!5#!5!53###"=[P…âMþB¾ãMIÑ)6T8 M84HoHGýèa4($w.Xg!5!53##5'%&'"'>325#vþŠvâNGþï+b"’+Æ,ˆMHGýáÕœ9•lM7 Sîÿþ´e2;463273267#5!##5#"&547'7''67.74#"6dA58GF\S*‚#: ^(ˆFG"`/6A©)ëP"U&-„­8.$1ý0880D4J'?9;8,X5EHHýäm38B6&"UAx7'9 D* ++(xe"+4>3275#53##5'7''67&74#"6w*27GE‡32&#"4#"6v AMÜFI   .9'M= B -‰=*27GEd'-#*,1*9- 1Z"HHýäC  >*Z.+  9F;7&29/E3EF1"%2˜++ * ÿì¯e-#53'-32654.'5!5!5!####".5 >>õ-"þC „=  ý߯GGŽ# :(:i<#D¹¡8ºëY´!$%# qHHýäc(6./XrX ÿáÌe13275#"&'5#5!!632'>54&#"#5'%p;,78ÖjKe)ÌþÁE@(C 8>E!S3   Gõ,!;I"//öþ”U@×HH¶A5E "pB.k.'&  þ÷€ 7»"ÿÅÿáÌe153275#"&'5#5!!632'>54&#"#5'%#53p;,78ÖjKe)ÌþÁE@(C vE!S1   Gõ,!",êIII"//öþ”U@×HH¶A5E U.k.(%  þö 7»HEÿáÔe7275#"&'5#5!##5'%5×;4Ö;/Ke)ÔGGõ-")ø7îÔ"/GU@×HHýã 7º&ÿóe&.##'7&#"#"'.'732=!5!25!6FGÁ2·ZI% A2 4_%11 @_9 G<þßþCl7þäýä¡5’M $/Ju&58%X!ˆ',(.ŠH¦24Äeÿõoe,!632'654&#"#"'.'732=!5!oþí#)<\8/7X1 ,+ ?- Š41%,8M9 G<þìoqS84X/1K=&',¿+5(6!N$p',(.•HÛe=#"'.'732=!5!!3632'>74&#".547B; /[,11 @_9 G<þìÛþz$:\B=.!)2IBq158%X!ˆ',(.ŠHHmUbk' !,'N$0>Z*ÿìÛe;7267!5!!632'>54&#"#5#"&54?.54672'&#"Ó"Hþ­Ûþ¿8H6ZwC!Q/4FG£% q@/.XEJ',06¼*HH­NX<]|/g0 ,tþþM? A )M+Ab N 4$'<ÿóÿe"L"&54?&'&5732=#5!##5#"'32675#"&54>32&'"32675^pRœ\; .-äMGþß  O% 5W4%+7C;L"2*6K( Aq?*$!ú< ","-ŠHHýäx‡ Ž˜+ 4='A#31D8&8 E4 "Áÿ¹?e #7"&'47%.547#5!##5#".547"327!;p£%µ<D?FG=K:0G Ÿ8,)Sxþì'#K)G>)OM? ªA5&HHýã¼ # 0%: '#NIÿÉ]e,0747#5!#32675!5!##5#"&'4?#"&75ŒC¦aW%;(3f#þ0]FG¡ py3N5úC;GGQW@ÃHHýãzM !>*:A Ue.7267!5!#632&#"#5#"'&5467672'&#"Ó"Hþ­àF7D")4FGI*?36-DJ')?¼*HH­MX tþþ©#-1B$B1 N  #&9*qe<#"&54>32&'"3267#".'&57326=#5!!#3267q7C;L"2*6K2 A—?7^@7#; .×þÿJ65W4&œ+1D8&8 E3#"Ú<#4QJ0; ","ŠHH˜224='@$Ýe##"'&54735#5!L!45'9‰þô456šHy¶e'"32767#".547.547#5!#;ê 8+'6J8yM0G 6,*DdÆ'#K)B'%%TF 0%:- R!&HHIzÕe!5!47#5!#32767#"'&ƒþ}ƒ÷C¦aW%;&039$ ~>4'&Hþ•C;GGQ*.I{Q"!ÿ²¯e-32654/5!5!5!##5#"&'47%5##"'&5c „= **ý߯GG¢&p Ž# 9(†`ÉY´!0>7 qHHýé]N?=*³(6//Ú@t&e!5!32654.'5!##"'&5Ôþ,Ôþ „=   “#C4†`HœY´!$%# H(6"=3Ú?ÿze=72654#"#"&546;5!5!##"263227*"'&'"'4632å)M#K,p#½þÚÉ\å@(W%4 &‡`+Mh—!)'S6+3Š.^HH¥J'Qz+N?-oX"Pe,!5!632327#".'#"'&'7232654&#"¾þB¾þ°G+FU!"#   bG47'2/V(469/3HÊ$IMLF[&9/=,/H (e'463!5!5!###"&'4?5#""'&).8 þf(GG]& rÇë!M?1L\>1HfHHýé,@ ?)_@^O4^s)ÿË…e@%2>75#53##57#"&'4?#".'3254&#"37".54632)+8=eóGG32£#ry3bA(*-Ÿ7)B:-= U9HZÂ-Å 8(ÓHHýãÝ*OM= ?) :.CG x*5-/C&#0=`DAÿ€èe/46;5!5!##"34'432#'#"&'4?".)B4»þ¦èGê)ÈB+ N_ƒ rÓFl>& -=U^HH¥+ B001c9>6?) e(92'ÿ¹CgG"&'4?#".547.54632#4.#"6;"3275#53##57pœ+.,@ 5,3K)-EH  #(6"Â9.Cs`íFG&&I¤ G=)J.% 21T)1GI& ',$DRoôHHýäÍ##OMÍje ##"&=#5!26=#j#PþÂ>þëHà iHþ÷&GV s.¢e7#53!5!463!##"&ÓeekþÂ>þëHà i.cŒHþ÷&GV sÿóÔJe27#"&=#5!#×>5*FKf6œ;;X*U@´HH±"/1e 7"&=#5!#632&#"#5'3275#ÚKf)ÔGD/43G.¨;,78ÖÔU@´HH’>L &/þÙð"˜"//ÓuXe%!5!0#"&54632&#">7'27'þúR EgYCJ9! ­ è8+&¡HþDZGEc N},4s)ŸÏe$#534&'46323##"&546;54#"Š11þ« J2#$ºº_ (+0H£' 38 *¬Ga o !—2. "qe46;5#5!#3##"'& (\|ÎÎ/0% ÊHHÊGO7:¨•e327#"&'22654'#5!#þ=6 <'RI>Q^~)57€Cl'Á/W!)Ud7v`,"6$HH+ÿÙÔe 7275#"&'5#5!##5#"&'4?×;4Ö;/Jf)ÔGG£%r¾ø7îÔ"/GU@×HHýé…N?@)[ÿËÌe43275#"&'5#5!!632'>54&"#5#"&'47%5p;,78ÖjJf)ÌþÁE@(C vE T7.GG£ r .I"//öþ”U@×HH¶A5E U.h1)$>þüvM6?) "øe !5!".54632>7"'67&'"¦þZ¦þÊ4$JN9aJX@%<+)g A 1*+HHþœ:=(Ad2E]F%Gj4!+.+Fbe.:!5!>32#"'#"&5463232>54&#"#.#"32>ýêÎN'ER ?,\&'^ESXEVO:* #0  G3(SS( Hÿ"/aR;:$W\gSJi²'L% <:  )@js+ÿ½be2>#53!5!>32#"'#"&5463232>54&#"#.#"32>#bbóýêÎN'ER?,\&'^ESXEVO:* "1  G3(SS( CYHÿ"/aR;:$W\gSKh²'L% =9  )@js+uXe!5!267#"&54632'&#"þú3'R (+0EgYCJ')?HþW/UZGEc N  #&9ÿÿže)#%72>7#".5467#5!&#"32>V+wN°0þë,.'N>27+)_žnB&' 6DT†˜2ñ4'B,) /* HHLL&0  ¥Je 7"&=#53#'327'ÚKf)øuÇ*°;,<$Ç¥U@ãHHÓ{*˜"/)Ñe "'&/732=!5!#3#B#D"D1V[‚9 F<þìô˜­¥J*0S& 5Uƒ¹',(.ŠHHGÿ Qe-3!!3. 54>7.543!5!5!#!"w+§þzC0E<5#%" 'Q<þJþpJI0!.F#1   "-5 WA^HH¥Ïe)!5!4>32"&'46?&/"'"#".#&}þƒ}þ«]\#9,06Î p%×?$ */$Hé 9@;l8/oI D!21 ÿ»àe-%'32##5#"&'4?#"&54632&#"?!5!¡7+"ìFG„&r•EcZB G9! ­ þ­àÚs*7Uýé]E?>) Kf=Ec M} Hÿè2e<4&'463235#53##5#"&'47%5##"&546;54#" J20"µeòFG”  pÿµ_ (,1 Â' 390¬ÊHHýéŽI   >( ~(a o —2.ÿÍúe $"&'47%46;5#5!####"&%5#Õr £&â (\úFHÉ_^É3@)NN?X ÊHHýéOnFÊÊÿ»àe+##5#"&'4?#"&54632'&#"327!5!àFG…&r•EcYC G'& :,C;þ­àýé]E??) Jf=Fb M  +6;Hÿøbh 94#">"&'47%.''7&547>325#53##59.5 8q Â4u.œC$ 11"%:d\MÚFG£&ø(#'    þ?*Q H9c4B3 +7>.ÝHHýé£M@ ÿ´Ûe8ES2675!5!!632'>54&#"#5#"&547&54672&#"%654.#"6322675"'Ó#Gþ­Ûþ¿9G9W54vC"P-!5EG1MFg87XD 7+6&370"! 5E7Cþ¯#G-N2$ÏHHoGP58C):Xm+[,&h¹i0W9:>*A:[ F.$'/8' h}Gç$- ,"0ÿ9yeZ#533254#"#"&546;5!5!##3262632#'2674'"#5#"&54632&#"3275.'7xOOýá`Ž1o 7"4v%¼þIyzö'<U8&W=%<3HP:.49CG40;J^&" 21200aP41MKV NISd+ ^HHšK5?Q R%=*] T,# (  7K'SHHš$%þeP!/AYW$3X24F# ]þ‘&c6:'" 9 ÿnxe48%#"'#"&54735&'73274&#"#"'&546;5!5!#!2632##53×G@+'j&:f(0i­g J*/41»þGkiþþ6T :#H¡OOq ¯6lU.;6{.#-19+ZHH¡IsþšÂKÿmxe5H#53%46;5!5!#!2632#5#"'&'47.547&'73254'"#"&"3275#"';xOOþ=1»þGkiþþ6 U ;"H|>E4$%/40i­h!J-`o<O~ÿ‰£e:%4'5%5#"'#"'732654#"'6323275!5!##5#"'732FP("^B_e/`036e-0U%3 O[JPQ5+7-u7"GH ´HHýéi+*4D°8188ÿ9ƒe1H"34'432#'#"&547#"&546?&546;5!5!#32?3267'"'A(ÇC#+J`%wDG< ,L6'5B4ºþsGþ>E-BGS" "7\-ÅB Ex*!B)0o%JhJ0!G1,T=U^HH¥þì< %*1 + dS0f&ÿµ®e0747&54;5!5!##"632&#"327432'#"M"FdŽþå®K½( # ##+?K A %;?F¥º('(<\THH› ' J)IJ31g#yÿ)}eQ"34'432#'#".547".54632'&#"3>33267'".546;5!5!#O(ÇB+ ')Ta†&' %P:A-< > l ;†.;^. Xz:A6ºþu<x*!B/0"TY7¼ 0!%H*.@#&;  +L@,eo &A>#327'".546;5!5!# (ÇB+ 13Z&¢.:r";",A  /'8F§Xz;A6ºþ=KAx*!B00"TXQ_N +# a' "3 1ua%&@>$f7* !>^HHýéiç f¥…e.7"&547&546;5!5!##57##"672'"327úFZLMLVþè…GGMe²—Ì -EFd/)G\#F95O6(^HHýéŒ=2Å5¥# HD$;ÿ‰ôe'3"34'432#'#"&547&546;5!5!#'&#"326·)ÈB+ 11S H<;F/™B4»þ¦èG"$'$&/%<x+ B00[\3T.A(,=U^HH¥þ{N#%.ÿ8,e0##"327#"327#".546;5&'&5476;5!5!,xÏ(5´]1A).Ï+2´]1AVu=uN`9“,jIM315“þ”,¥#Y:3'”!Z;3N(L/3Q:./D7(&^Hÿ9,eA4>;5#".546;5!5!##"327#"32674.'7#"&)'91Š ;oFa8“þ”,xÏ(5´]1A MÙUUPJ;9 EV2Y“%#5 A+L+5P^HH¥#Y:3š9*. + +8Yÿ9eP4>;5!5!##"32674.'7#"32674.'7#"&54>;5"".)(;/ŠþªhÙ!&¥P5 9$%DÙU¥J;9 CY1Y“'91ŠDU:B%5 ^HH¥X ,%%;!ª9X + )8YI#5 M Fÿnke4%#"'#"&54735&'73254&#"#"'&546;5!5!#!2632#×G@+'j&:f(0i­h J*/41»þGkiþþ6T :#Hq ¯6lU.;6{.#-19+ZHH¡Isþšÿ9VeT3254#""&546;5!5!##3262#"'323762#"'732654#""&547&'7Y`Ž1o=4v%¼þIVWö'<U8&iO7:IM8& 'C)£¬1`Ž1/@=4vaC1B NISd+ ^HHšK5>]A5'1(Æ NI4, f-8Y ÿ9VeNW46;5!5!##32?62#"&54632#"&546;5#"&'732654#""&>54#"º.¼þIVWö M8&1ÒYb@G(1JfL\«SB•#\¡R1`Ž1:5=5u*1-ŒXHH”   5:'‰A2? $*.<'/BqR6D'j\  NI#Nþ)#!ÿÇüe7!3##"&'4?35#3.54>7&43!5!5!###!"w( ¹¹ \#™B>Y5+A"DQ<þJüMHiþp=oH7l&/"EH2%-9%5 B‚^HHýé¥ÿ¼Ùe(=7".5467&54;5!5!##5#"'2254+"27#!"32pW\ ,JR=#<:çþ¶ÙGG^5qCQ/Xb6VO¹þí "Š98  ” M0 0$8S)*1 6@:^HHýé}#+^<ss3¥ +9'  ÿ¬e4W#!"632'654.#"3#"'&547&546;5!5!".54632>7"'4?&#"Iþì,6!5J#9,4)8U=XK  $d˜AJçýzý(y)=B0S:J5  "U 6 2%¥ > )(&- ?#56#5j5:J;)^Hþ)4s8$:Y-@P? ?_.0ÿ´ÿiÛeIR#!"632'654&#"#"&'#"&54>7467.546;5!5!&'26ÛIþí,6!cL :-0:8U;XI  ^%A#7T  $çþ¶ÛþÉFW+A?¥ > L5  - #> $6 6"$!#PH! ?!#;)^Hý— /6!:9ÿóe.7##5'7&'"'67&#""#"'&/732=!5!!632FG£5¥DZCJ[  A2 "D!1V[‚9 G<þßþãDlý鱉)‰ J N$/0S& 5Uƒ¹',(.ŠHþŸeVTþõ+e=2>7#".5467&'&'&'".546;5!5!##"34'432#"« '*E*Q=D7 Xz:B4»þ¦èGê)ÈB+GTD6 <*?+:E $ &A>#=U^HH¥+ B008U;6$  8e#5327#"'&'5ìáá15%1D!A<HþîH Eÿóyîe+!5!47#5!#3267#"&'#"&%#327>ýcýüC¦zW&:&6j |>+B ZK1O\µ%;&03()Hþ•C;GG R`@{R*E@¾Q*"Q‹e-5#%##5#"&54?#''&/732=!5!þ¢5FGB%t¬ #D4_%1U\‚9 G<þì‹l±±ýéÑ @ ?) S%*Iu'5Uƒ¹',(.ŠHÿ4ÛZ"#&54>323###53654'.#"\H' / )R=*MMHMOJ#!$f#A,0/FN!HýéH &/D5":þ\ÛE$.#"#.54>323###5H8»K 0 !H"E/A”nIMMHMeDi"!,  32:MIHýéHÿIƒ13###53654'.#"#.547632&54632&#"}MMHMPJ# 3J,$2j P7$0 6-ÉA HýéH &.E.:&<#J&F 67 ;Pþjƒ+.#"#&54>32&54632'"3###5W8Ye+7E"I 55[Ï>4[: D $QMHMg0A)>,.!$+? l=E558 ; $F\GýèGÿ4R6#5357#"'&'76#&54676323###53654'.#"éAA>(M P#323###5¼BBN(M :%#8»K 0 !H"E/?•nJMMHM"W¢dxE"3(&YDi"!, 32;MHHýéHÿù9^%&#"3###53&54>32ì“r!/ SMHMK &@)-%+*((aÂ((-HýéH//2% '/2ÿùµh#4'&#3###53&5467632µO8¬FFSMHMKA7,06s^Y:f/O3(HýéH#(7^':J<ÿù”f#'&#"3###53&5467632”`tÞN=DSMHMK9>DS“CfI "I'HýéH)1X)óX5=2327#"'3274'4632.'#"&547&54632'4#"6*TIONF>bc  &2A- 9@UeBD9 '/;597…(O >+O"',. /UEIC1C.@+7N&1" ÿà e1!5!463!!"32?2'#"5463232>54#"".»þE»þp& þy>D!'ˆa5{w&B 3/ .!0O$HÝG5 4+j!X+tC )#FL e!5!.547#5!#"¾þB¾[P…åÔ)6T8Hý¦M84HH4(#x.:Èe!5!'%&'"'>32vþŠvRþê+bOJ+ÆSLHþtŸ9•m&'7 SCO#ÿÿLa(14632732?#"&547'7''6?&74#"6‰J-8FF\S*‚!:)D9"_/4Dª(êOEU.7V<®9,!1ù809/C4J'@96<-JCj38B4&%VAy6")9-:,,, +ÿÿK×e"46327'7''6?.74#"6eA57HF‡<þÓ(Ù€HU.6U­8. 1ý0880D4j QŸ7^HH¥ #v# L / h>-þ=ÿ²ÿ„½''%|þæ-Gm»8ÓÿKÿþk#53/"#'&54>32QQE #*(:+.)*+ I< & #T*;I4* ÿ“úe37".547.543!5!5!#!"632'674''7&#"pw%1:<-@,:þŠú=þÂ9*@!>?&R9A<‰:-4€;0(@c3;7M <^HH¥ 9!B-WO+::(‹,€"ÿ&Kÿîk&54>32&'"Y 1#*4 #*(KsI, : & #T*þ!ÿ.ÿå#'#73^{ŠaËCÒ””Øÿã Q ###53'#532673#"&53êMGNâ8YY1+5=]BC[<+(ýéH–V™.*CTVA!, ÿùÛM '7###53À[TZpMHMâù\T\þÐýäHÿòÛ‡&547632&'"###53KX($9%0 $SVMHMâfpI1 ; % JXIýéHÿïà„'?'"#'&54>32###53àC32&'"3###53654&#"#&úeOJ= I/&4AMMHMOR= / /N)Ð0W,(( ; I>%HýéH >N+;4ÿ {1#534>32>32&'"3###53654&#"#& QQýî%K2J= H.&0AOOGMPR= / /M)¯J)(0 ,)' ; I B%HýéH@L+;4þ|Kÿút#53#'7``FKí=Ï[ßî;þ|K(t'"#'&54>32#'7(D $R9,-,7)tKí=% % IY;H5$2 þìî;þ|K*t#53/"#'&547632#'7*QQC!%S9+*%$8%qKí=³K+ $G\:B=2 þèî;þLL #53#%7'7``Z?þÓ1Õc>Ï[Þš7…Ò#þLL='"#&'#%7'7&547632=DD3:+ !?þÓ1Õc>W %%8%$ Io5Lš7…Ò#È"2 þLL=Ž#53#%7'7&54637"#/=bb…?þÓ1Õc>MK&II2 ) :+Â[Ñš7…Ò#²:B: Ca2 ÿUñˆ&54>32'"###53'73‚Y 0$,C!%TMHM=á=ðYhsH + ;$H]KýéHâ:þäÿ,š!###53%7'7&547632&'"#&'ÛMHMBþñ1Öd>F '$:$5 $R9*(ýéHŽ7„Ñ#®1 ; % IY5.cþLP£"%#53'"3###53%7'7&54>7633'PRPI4 LMGM3þÛ1Õc>L$%@‡'¬Lm CAVHýéH–7„Ò#±1þÅ5ÿ7æeI##"327#'#7.547#'"'.'732=!5!#3>;5!5!æxÏ)4+?8^/BGb³^{‹`È4=.¢#D/[,13"BZ9 G<þì±U­N2”þ“,¶J'-E#S)bÓ““Õ&2P1%*Bq15;)Y#‚',(.ŠHH=5LmHÿDòˆ #53/"3###53'73'&54>32òPPD $P%MHM3è=÷+-,8(ÉI, $ HZHýéHé:þÝ9I4%1 (·3!%!!(þ™?þÁüá(Ð_g14>325#!5!53##5"&'46?&/"'"#".#&(]\#9,01Mþƒ}âNGÉ p%×?$ */$| 9:óHGýèái8/oI D!21 ÿ Še<'3#5346;5!5!##3>32#".573254#""&È»WESSþ31Áþ>Š€û !& +'+#9=!4lRB$3=Wk'q H6y¿!ÍBO# `IIª.3 I 4M'6MQ7.OS@p"…ÿ#8e '346;5!5!##"327#"'&p ºV«g6—þ‹8zÔ)5,@7_3DV{jMN¼!ÍMmpIIºL(0I#V*tGGÿe*'33254'7#"'.5476;5!5!##"M ºVV(2&ˆ96LxSkE102FŽþ¡lÞ$ À!Í%;#j7'1*iR^F]4B52}IIÆ#ÿce5'346;5!5!##32?2#".573254#""&» ºW{1Áþ>cYû+R5+#9=!3mQC$3?Wj&q H6yÀ!Í"!`IIª;5I 4M'6MQ7.PS@p"…ÿe*3'34>;5!5!##"&'4632#"'&>74#"Ÿ ºVêA+˜þmØ)2YM>4#5 #:<hSR>&2.Â"Î7@,hII²>.?i%/5A-% )B)93ÿðÛe37267!5!!632'>54&#"#5'7.547672'&#"Ó"Hþ­Ûþ¿8H6ZwC!Q/4FGþò-…5?+-DJ')?¼*HH­NX<]|/h0!+tþþ¤´9TY6@01 N  #&9ÿzúe(E%5#"&54>32&'"32675!#'326#".5732=#5!##5'l4A;L"3(6K)<þ²'! 6V4&Œ+n,8bD7" ; .-×úGGþõ,Ò1,D8(9 E4 ɘ* 4=':H"(?NKB$","-ŠHHýé'³9ÿe##5'%##"'&54735#5!ÿGGè, !45'9‰ÿý韓8¬'þô456šHÿÉ?e2"327!0;'.547#5!##5'%#".54ê8,)Sxþì+JK)Ë,*D?FGõ-"""" /<)B'#N&#-I! R!&HHýéc 8»  8&:ÿ4{e>#53#'#7.'73254#""&546;5!5!##327>32{PPL/1 µ^{‹_É-]E91ˆW@oK6t%¼þI{|ö' *%*6MÇ0E&Ö““Ø :GG0.&zLm"ƒ8'^HH¥;2 Hÿá]e!%747#5!#327675!5!##5'7#"&!75ŒC¦aW%;&88-þ0]FGõ,Ä603N $ úC;GGQ4+8ÃHHýé{ 7~A ÿ7te(G"327.54>75!"327654&#"%.547#5!##'#7.54-(1"xW6þø"C !Ï,6þç)8"Mt| fK`³^{‰aÃ@Y* .o3+('* pO7¬a9A@]49HHm (|ZAÔ““Ð`LJÿì¯e$%'-32654/5!5!5!####"'&5 õ-"þC „= **ý߯GGŽ# :(†`¡8ºëY´!0>7 qHHýãd(6./Ú?ÿz»e.@72674#"#"&546;5!5!##5'7/"'46327675##"3237632å)L#K,p#½þÚ»FG-½] ‡`+.9N—!)'Ü`>ÁåE:'%S6+3Š.^HHý鎦9Î !z+N?.PX"‚ 0Û¥K ÿÍ—e0%'-6323275!5!##5#"'#"'&'7232654&#"õ,!þhG+FU!$ý÷—FH 2 bG56'2/V(469/3n¡9¹Ü$IMíHHýéßIX&9/=,/H ÿ7,e%##"327#'#7&'.5476;5!5!,xÏ"-,@6^0AFb²^{Š`ÆN=4,/?“þ”,¶1/.G!S)aÓ““Ô 8]6A8>mHÿ9e*#'#73"3254'7#"'.5476;5!5!#ì^{Š`ÉEr%0':2†75ItQgF000EŠþªhÇ““ØK?",C!f6'0(hO]E^1A12yHHÁÿ-Ve<#'#737#".'73254'"#"&546;5!5!##32>72K^{Š`ÊCš'3.2hOA#1ˆW@oB6t%¼þIVWö'>,Ó””ر(?& 5JO6.&zLmƒ8%^HH¥% Dÿ- e+4#'#734>;5!5!##".547632#"'&>74#" ]{ŠaÊDþÚ?*•þ¥ kÑ(2UM)$1ObPgPQ6(1-Ó””Øÿ5@-fHH­=,=g 17E5CNJKM#:31Re%'%####"&=#5!26=#Âõ-"GG}P325#!5!3XNGþï+bOJ+Æ,ˆMþŠvâýéМ9•m&'7 SëH)ÿä…e36%2>75#53##7'7#".'3254&#"37".5463275)+8=eóGGô,Â894cA(*-Ÿ6*B:-= U9G[Â-þ+Å 8(ÓHHýé}Ÿ8|.DF x*5-/C&#0=aCA ÿ…èe'46;5!5!##"34'432#''%".)B4»þ¦èGê)ÈB+2_ õ,Xz:-=U^HH¥+ B00V< 9§&A>ÿÜg=%5#"&54>7.54632#54'"#"6;"3275#53##5' d//GM   -3K)-EH&9*5"ÁB$Fo^ìFHñ-Ê ?N3   U(2FI&#"P DRoôHHýés8ÿÿ,e%'-463!5!5!####"&šõ,!þDþb,GGÜhŸ 8¹l&‰HHýéGV sÿÀàe%%'32##5'%#"&54632&#"?!5!¡7+"ìFGñ-V,EcZB G9! ­ þ­àÚs*7UýéXž8¹1f=Ga M} H ÿÕ<e+4&'463235#53##5'%5##"&546;54&#" J20"´eóFHò+´ ^ '0Â,380¬ÊHHýél8¶Ia o —.,ÿîúe$5#46;5#5!##5'%5##"&lÉ• (\úFHñ-É_SÊÊ. ÊHHý醞9¶/OnÿÉe-32>75#22654'#5!##5'%5#"&þ=6 >) ¹'Õ)57€FIô-!:P^~Á/W+   à+t,"6$HHýéc 8º 3vÿçÿþ¨e#"'&''7&'732=!5!#\I6 %†18<Ç,Ë–9 G<þì¨L1A8¢58Mˆ8„Õ',(.ŠHHe(".54632675!5!##5'75'4?&'"p4$JN9`KX@CDþ GG”-Á/^ A 1*+H:=(Ac3E]FAxHHýéµc9{Rp)!.+ÿþ’eG4#"6&'&547''6?.54632632'>54&#"'67&'"8.$1mL.=HV-6UA58GF] 57#4 )% 6),Y84(+ò++(þ}3PS?+ $)9,*089/D4G )% ; " #+R ' ;&= $i%.327'"&'5#535!##"327#"'&'#>;5p<+>"ÇjJf)ø,wÐ*165G^1ARzgL6' uÇG,”>#-)Ðþ¿U@äGG¶A/I.1T)rF2B!|Ó-;ng+2327'"&'5#5%!##"32654'7#"'&'6;5p;,<$ÇjJf) hÙ%0';2DA75JuQiD)' †Á1`Š="/)Ñþ¿U@ãHGÁ@",C!258$1)hP[D(@{ÍVzÿ7$h6#>;5327'"&'5#535!##"327##'#7.'øuÇG,”þ ;,<$ÇjJf)ø,wÐ(4,@4]2A!S) µ^{Š`ÉPv(!Ó-( b@^O4^s`1HGO-? ÿ‰Ee/574>7&43!5!5!#!"!###"&=.5#2)DQ<þJEGþ( xGH=)+7B%4/53H #::Œ5 B‚^HH¥=þrG*04)‹0"-P11FT?‡…"ÿh9eB&54763!5!5!#!"632#5'47&#"&547632635&#".54mEHþT9Fþ -AA]†G;@4K3{%%+0.""BZU/;$/).*jE;^HH¥/!þvîX#.D+OS0' =1FY0¾V=ÿ‰Ee<74>7&43!5!5!#!"!#5#"&5432&#"32675#.)DQ<þJEGþ( UH"93m=1”/"-P01FT?.le #'".547&=#5'lÊ  (:FM; .jç VL   * 5:f,D‹ON‹ ÿ‰Ee1"&'4?!3.54>7&43!5!5!#!"!#5\rõþñBr%53H DQ<þJEGþ( xGŒ& ?( u/"Uw1FT?5 B‚^HH¥=þr÷B? ÿee5!3##"&'4>?5#3.54>7&43!5!5!#!"w( ¹¹ \  $™Bl+52H!DQ<þJþp=oH7l &/"Pu1CP>5 B‚^HH¥ÿóNe277'7#"&=#5!#×>5ü.Ï Kf6œ;;WO’TbU@´HH±"/ÿòŠe:#53%#5346;5!5!##32>32#".573254#""&³SS×SSþ31Áþ>Š€û+=,+":=!4lRB$3?Xj%q H6yOîO# `IIª;5 I 4L(6MQ7.PS@p"…ÿžæe7#537#".547&546;5!5!#!"632'674&#"mSS§Y 9ZQ:AK#îþ­æKþç&: :9!;,=09XbOŽ7K6 *I-98K>&`IIª ; 8&).! >ÿÙôe*#53'46;5!5!##"34'432#/".¿SS•E4¿þžôHð!(ËF',: b!In?' Oà?W`IIª+!„C&1e>B)93ÿ#8e$#53'346;5!5!##"327#"'&eSS ºV«g6—þ‹8zÔ)5,@7_3DV{jMNOý!ÍMmpIIºL(/I#V*tGGÿe.#53'33264'7#"'.5476;5!5!##"USSø ºVV(2&FB96LxSkE102FŽþ¡lÞ$ Oþÿ!Í%;#3n'1*iR^F]4B52}IIÆ#ÿce:#53'346;5!5!##32>72#".57254#""&³SS ºW{2Áþ>cYû+?,+"9="4lRB$3>Wj'q H6yOþÿ!Í"!`IIª;5I 4M'6MQ7.NS@p"…ÿe.7#53'34>;5!5!##"&'4632#"'&>74#"”SS ºVêA+˜þmØ)2YM>4$6 #9=hSR>&2.2Oß"Î7@,hII²>.?i%/5A-% (= LLP);31ÿ%ôe.#53'346;5!5!##"34'432#&'".ÂSSºWþÌE4¿þžôHð!(ËF',: b$In?' Oü Í4?W`IIª+!„C&1e>B)93þÙæe7#53'3'#"'&547&5476;5!5!#!"632'674&#"‡SS÷ »W§Y &f›AKîþ­æKþç&:´;,=0;VlOê ÍÕ7K6#6m98K>`IIª ;…).! ?ÿ Še >#53'3#5346;5!5!##32>72#".573254#""&³SSú ºW`SSþ31Áþ>Š€û+=.+":=!4lRB$3@Xi%q H6yOÿ!ÍBO# `IIª;5I 3L(6MQ7.PS@p"…ÿ$i )2327''3%"&'5#535!##"327#"'&'#>;5p<+>"Ç@ ºWþ­Jf)ø,wÐ*165G^1ARzgL6' uÇG,”>#-)ÐýY!ͺU@äGG¶A/I.1T)rF2B!|Ó-;nÿg /8327''3%"&'5#5%!##"32654'7#"'&'676;5p;,<$Ç@ ºWþ­Jf) hÙ%0';2DA75JuQiD)' †Á .GŠ="/)ÑýZ!͹U@ãHGÁ@",C!258$1)hP[D(@{Í1zþèEe39'3%4>7&5463!5!5!#!"!###"&=3.5#2÷ »Wþ¶D'*<þJEGþ( xGH=)+7Br%53H #::ø Í×5 BA"^HH¥=þrG*04)‹/"Vv1FT?‡…"þèEe7'3'"&'4?!3.54>7&5463!5!5!#!"!#5÷ »WrõþñBr%53H D'*<þJEGþ( xGŒ& ø Í3?( u/"Uw1FT?5 BA#^HH¥=þr÷B? þè9eE'3&5463!5!5!#!"632#5'47&#"&547632635&#".54÷ »WþúE HþT9Fþ -AA]†G;@4N3{%%+0.""BZU/;$/).*jø ÍNE;$^HH¥/!þvîX#.K+OS0' =1FY0¾V=þèEe?'3%4>7&43!5!5!#!"!#5#"&54;#"'"32675#3.÷ »Wþ¶DQ<þJEGþ( UH"93m=1”/"Uw1FT?1e$7#537"&=#5!#632&#"#5'3275#ÓeeKf)ÔGD/43G.¨;,78Ö.cCU@´HH’>L &/þÙð"˜"//Ó&e%7#53!5!32654.'5!##"&'&5»eeþ,Ôþ „=   “# :(Eq0cœHœY´!$%# H(6./ln?ÿôÿÌLç)4>32&#"3!##"'73274&#'7&E!89!m5ÿ÷Èå#73267#"&547.54632&#";#"u2:!8{‚7p‰S7#".'#732654+732k 69 j.wv21M* 8³!*K–Å9NO,?!eDh1&>!S'%+"'>74.'32>5"#".54632632&#"ï51k?Y"'    .8&UD(Q:/3l(1 -PF5ƒ(@XY'"%._"I1M^*:<(QPEÿöÿÓ7ã5"&/73>54&#"#"'532>7'&#"7637632—&   3*,937#"327.!/:*ž7B}$pp¼-H(UD9$UUkÂì)7"&54637654&#"#&54632&#7>7ôiŠ-C8^)3-_2W?ZPTI%"F2*3q SaQ  G$/3*1A\=EQ4>`BÿýÿøÄ%'7267'.547&547654';#"ó-•ŠR:Df`g~Z!H4|{JGMGoC KAB(5OK  ! )QJ&ÿþGÝm'463!##".%&#"7>^E;™ ]J >;$BXL&ÚARR.5C7'&''7&{>Jb&8\%¤U%;<Ž|Y%OF L)*- NמI_$7= : 7G(#3 gl:6$ %+-Fÿø4Þ726=33#'&54>32&'"Ø.9lrqoY<±!56+-6G†>/¡STC^Ë7P* It ‡ÿúö&74354.'.54>323#"&ìV(#-,%PK"4FA!@uih6L@Ç_<" /9--+‰C>a;&TB:U++0 HIÛ4&#"56323##"&543x '5"|ih;+5-`>*!V qeU#(:%_¹Ø%%267#"&=46;265&+732"&#"4w UXq— ]!(AW‘8Dx(  "(\2d8{Y';RT=~ ÿà­Ý %#574632&#"32>7#"'&­ÉÉþV†j)0$31315(]GGºQ)h’ O $G16K$ U JMÿúÿßà$"&54>32&#>546;&#"Ûa€.0  e2PMY2KU!—tFf3 K )<*¶X^ƒkj$³)}]†£74632&+3267#".nY+, 53(W UU4=,òPaM.9i+`= -OÿÓ’ì/#.'&+'32>7'&'767+.54>32’m`5f~638.– '1#P 1%(:I;G)%HE*6Tb g5(U S 9'#A (? >2.:'K,ŸÔ%"&5754+73'3267'Nn-€T|-%9Oà,^5®Ræ‹#›"'-²ÿÿÿÕØÜ&23##;#"/#73265.+5å%0"j‡6bà- %D»/,Ü 5%+NH_R0›R.!!(Rÿúÿµë&632&#";#"&".5467767€»70&:[/$ÙçIc«W~@$i;nU+/3Cb‰ Q@$GPþ*DF$%DK=H \ÿîÿqìù34323#32?672'#"54>7654&#"#&¼dW†ÍtIFB ,?GLEÕ6Fn",>;\#xG.K&)!K%;( 3 ]0}‹2>%&!#$ÿØÊ‹".547#'!#"327<$DD2 v³ÊK@L\( +G.i1SSL4 2KVÿý²ß27'75.''4>¶)C& GþÛMÖ 5= );ß,>I3#Z±KuCq +5&U -+ÿüÿ¥ðç7265'.54323265'.5467%&'&#"\5+4 B"+53§n¦88/1(:'Lo+#,1/ WqK>c?,$ D.–3 y     1<+f8$%= CE\ÿíÿË"õ4632'%''7"&7"3654@cOPn[Îþ¹N4ÅÍBµQ²$> Iy5GLç4&#"5632#"'7326 '%'9BG 18D_-Ý~BS&F<7þœ; 0H V $><#¼n3N8®wRcÿŒÀï$7"767'63.547.54>32&#";¿I‚+MPþr*œ ^MS<%>>!d-*,‡H|Ù?9 DeºU:C2A)8%$5 S6?Nÿÿÿ´Òß +3267'7.'#732>54+732k 69 p‡þ¦)t+X 8³% K–Å9NV,?!`4 S”S) D>S :SLÿìÿèŸß'46327#"'767''74&#"327#"H9A…wÁ4Ò;(\ 6qPx-$ld5FYS ªF´'-6Ls,>/ì/ÝP*? ÿ‘Âø+77>7'7&'4637654&##&54632&#sE3*4o þŽ)•¹-C8^)3-_2W?75 SJ%"±4>T×FMŒ  G#03 )1A!?,EPÿ•Ç/';#"3267'7&=47.547654'y8|{JG5,—þ…4sƒ`+<~Z(0(s$QJ&Hf¼E5)aA)H(J %ÿþÿ²Ý'463!##"& '%'.#"76[H;™ ^JdXÞþ9¹Ð%!X'&6ñ@PM-5BX}‹Jo,"H#ÿæ”Û27'7'7654&+7h9gvþ±5É“ +Û,/ŠO2Už[Hgy Rÿùÿ˜ì326=33##"'4632&#"'%il/8lnmm]ß\I+-+N¬þX8á(z5)–ISQYÖTf Jþ™P‹ÿúÿ»ü'+74354&'.54>323##"&'%ìV4',.OC1PR+6?+ih7'&>+ë;%Î_;' .:->z ,“?Lp9?*:U),/ewEp ÿ°Jè23##"&54354&#"56'%fE6ih;-5,` #1 ß9è88fU#'9&^9)!V þ-eF]ÿîÿÕ‹Ü87265&+532632'74.#"+;#"./#5œ$1V¾2H 3",>>BÝ;Á.I2dQ n¼ (5ð( RR/-HO>š]i<; ;J]R ™RÿúÿÈ 72#"&54626546;#"#"'47&546;#";#" !'H9$a( {^ðEBNŸW85”*(Õ.&`)%t^ð:IŸW);&#"3674&+'32654&+5322­%,#'§9[2! .LK( ,D?D~'XZ&%bŸ1B> †›%!)#ý+5&DEa/Z;Lþ©@L$+T' QJ5h !GUÿèÿ´ÝÐ @2#"&5464+532#"&54632#4'&#"3267'&+'32ž!!#þáG`Ÿ0A9^ˆÖ¸’”ÙnLS^&HF*9%7H 3XVGÐ,&,$-þg?QJ59FcFVdPCj€¼`þG¹:EM!?,þ¸ #,& ,RÿÞÿÌ?çH&5432&"72#"&'73265&'#"&'73254''7&54>32.#"K”R?&r&<Ü ~W½1n8$@$0bþß[fi=r Mc*^Sñ˜E @0f B`3,@aM "Ge&Œ&R+#M. E=R9;*=BW16I33#'P=,ÿøÿÌ.ç+%2654&''7'7"&54>32&#"%2#"&'71>2RAbþúÀZ74.#"326?#"&UC,X?3êchº  i) *B`'"  * FX>M^(:=*Âý÷¡ž  „*%ZYY2)&  _dÿìÿ0®óF265#"&'>74.#"327"&54>3273#".53OgˆŸ ! .7?X8ZL A.H91Ëq*O‹VO{J/hzˆpXJ™ b   F:0DUU@ I @F+-(9;)¾þ>'SM1)?TQ*aŽÿìÿèŸß'46327#"'767''74&#"327#"H9A…wÁ4Ò;(\ 6qPx-$ld5FYS ªF´'-6Ls,>/ì/ÝP*? ÿïÿÓ„ã@%2>54''7&#"#"'532>7'.#"763>32653#"'5µ"-HŸ*"K9;T*=."3 5-.<'„$6;'&-t'F!B-%,%4="†9Š"6]HKV'&;.@BRW„ H 8 Cy#CA( R ÿþÿFì<"&5467654'#"&54>7654&#"763"267#"3267ñzkbfg &Šy'{m3PIB765.#"76;#3272>54.##l+e#HYA=1?(µXk"A?[8M3H2:@%Uk:-"b5šNn5/3' †97! *D=2D@A1(5 8%i! Q8 'P:1''3JO  Æ   "!ÿòÿGçÿ4BO4>32&#"#"'#".5463&'67&5463&2654.'3254&'&'"I 74a>6SiˆÀ2gJ$ lÅ1PP*Fh4]&  uH! ¢HK.)^"6Qd\C0U>).¢'I)g**  c(; ,,,< 2F)9»" 4%ç!,@  #ÿüÿFôP".5467&'73767'.'"#&'7632&#"#"'+.'732654#"ô*L@ 211o2MU .=?$†n?€+51=4cJ3-#"H3 ' bUO  :"%  #BQ1J#,ÿüÿFòJ4#"#"'7>72.#"32#"32?&5432#"&54325&'&'7326…S 5¢ (M2s ^hnhZ& OQIHL=9KGöi…ÕdGf0n4[D0_  L* ?() #,,!(  RAyPC{  BH1ÿùÿLÜè37&54>367'.#3327&54;'&'#'˜™,*=#6&f)TD 4ÿJÃó6%'+.5467"&54>32&+;#"7674&5472¡ NZ<'$ ^y((=*S:m08 ƒ,˜’ *B$ I#'A7y'ˆ gTK:*-* S; I=#"D S)ÿçÿHÚèO73267".54?654;7632#'&/#"&5467#".467327"Ê&+*i .4'ˆQ%# k'rL:J N-%5B W' >Co1YV +5%<.;*O ,, =#1I(G) )*(' Q(9,N2"+>1d+HNGN7< 8LI <54-<>ÿóÿ@\é4%&'#"&547327.54?65&/33274632NB')Q1\ŽaˆN?2L>w *HG*…g6e(A€Qp &2U›,4~T) Ñ„yYn5645=JS!C.q( (:D;27ÿ÷ÿc5ñ0"3%2#"'#'&'732>7'&''7'7&54632&5l% /Çbzb›‡iHCT[219 )]Sjö ±NKX.`ŸE 'XT2GL{3@* ,$s0W3b@*BJÿéÿÕÅÜ0%4#";!"/#53265&+7!2632#"'532kp(!/gK Êþè- (Uõ/;jÚ7Y/4 97!K>#?«…++[R0—R,$LR:?!1`BNU O ÿÛÿÕeÜ=3632&'#327#".'#;!"&/#53265&+7ü2;(@$tJr/PK@!  !)(2&N3iN Êþé(Tô/<kÚÜ?)Nu/Ð  E 8&([  R—R,$LRÿ2œý,%2#73267'.+532654&+5>;8GDPšNþÐSZV-"ž¡".1:g.u cp 6ûI4)CzG9[;(U%&V H?! 2ÿ²…­77>7'7.5467&+€9E&9 þ¯,¢3 iV043ò41 Z¨S= $C*Q]M.ÿêÿÂ[(4%2>5#"&'7>7''7"&54>32#76732654#"’(c>xiFT <XÖ.°W?M-WtlR70-Ð(ŽGP#/<9@{`=6#$> 9fZ;D'*5H<$C1K+O--:",ÿøÿb#ÿ+"327#"&547&54672.#"#5'7.¸¢?.2v•ƒ4^n=WTD39Bôhµ7å <ªÊLz™>*65N ‡ë«b\Q ÿðÿs†õA%#"&546354#"327#"&54>7"&56732&#";233#5#>61'0-˜%;= A"$C‚ª!B.8¬ 17)@[%E' ‡oo‡$!7")2$”4L'Wv6++ ,`J*$! J&ýù–$ ÿòÿkoO472&#"#32327653#'#"&546;254+27#".54>3.jªd 68 '#$TV,83#@;.mm]1Mb3L_FRg`= "0X[C*+;3®UJ G*& !2( (ýùi$]I#,*YG^oH'=fA7]4*ÿíÿI" <2654&#"'&/#67#"&54?''7&54>32E% =!B= Hp]Î’15L?ARpƨÍBµd%M36P%c$%2.!'Ö -6$1K#4P6I!,B U>_+M6YT.9@ $)!0&ÿëÿÂ3 &84'37>'2#%'7"&54>327#"&''%oP :1YZq  ¿þí×.°WAMfIKc{iD,%BUŽ"D9+ $“I<  ^BfZ;D'*5þƒ&-ŠnL<7PT¡ÿþÿGÙ÷>2#"'54>7"'4>54'76323463236gr˜Kò)@.<ø=WW=jP"P'0ZJ;UU;F,I.u=7654.#"#&½eUƒmmËtHFA!+?HLEÖ XG$ÐýøÞ±Ju+ˆ*!;U U'ÿóÿ¥Uç8265'.543253#53265'.5467%&'&#"R5+4 A"+53¦q¥6oo:G+5 9'Ll,!-1/ YqJ@a=,$ D.–3 Ëýùà  1;+f 9&%= CG\ÿåÿË„õ !"365446323#5'%''7"&é%> IÿdMQlZÎllþºN3ÄÍA³M¯+!6.H69CLç4&#"5632#"'7326#5'%3'9BG 18D_-Ý~BS&F<7n÷;2m0H V $><#¼n3N8þßOSRIqÿøÿŒ#ï)7"7673#5'63&'&547.54>32&#";·J‚+KQmmþr*œ ]''S<&=?!c,*,ˆJ|Ù?: C7ýùlºU: !2A)8%$5 S6?Nÿöÿ´5ß%#5'7.'#732654+532+326735nþ§)u"0%7²")K”Æ9N!69q…m(p”S)7$S&8SM@+>`2 Eÿ÷ÿ‘'ø/77>73#5'7&'4637654&##&54632&#jE3*&z ooþŽ)•º-D8^)4-`1W@66 TJ##±5;&ýù×FM G#03*1A!?,FOÿ÷ÿ•+/+;#"32673#5'7&=47.547654'o5|{JG5+•npþ‡3q‚_+;} X(0(s*QJ&F%ýù~¼E5)aA)F*I  %ÿõÿª@ß #%&#"7>%463!53#5'%5##"&FW&& þñ[H:nnþ‚:¸™!]LcYâNH# APfýú[ŠI¹!33CUÿûÿÕûÜ273#5'7'54+7^8fxooþ°6Ê,Ü,.‹N1ýù±žZIfzRÿ˜ì!326=3353#5'%5##"'4632&#"ƒ/32353#5'%5#"&äT3&)3 0PC1PS+5?.immë;%h8L=Éd;' M>?z ,’>Lo9?+:°ýø_xEpg),-ÿ°°è"2353#5'%5##"&54354&#"56]E6iooÞ:i;-4,_ #2è88fÍýø>eF]j#&8'^9* V ÿæÿÕíÜ=7265&+5326323#7'7.#"+;#"/#5’%1U¾3!"K;9lnÛ; % 2cQ n½/ (4ð'!RR ,ID ýù¿˜]i 0  ;J] R0™Rÿþÿ­èß77>73#5'7.467&+w:C'9 mmþ°-£SKiU134í41 0ýù~©S>Vž_ M+ÿàÿ¿ 932654#"#5#"&'7>7''7"&54>32#76732673ÜGP#/<ðn;d,DU BXÖ/±W?M-WthR7 +,Ï(< nC-:",þP&'>5#(<9fZ;D'*5H^,M6YT.;?/F!( H$4 ý·$%3/!'.6%'.ÿãÿ–+8%3275%'7"&54632#53#5#"&''%74'37>IIJc|þìÖ-¯XfTXs  ¿mm›bDUŽ!C@Q :6‰%-ŠBfZ;E&3=J;  Âýøaq=6PT¡§9+%þmÿ¨ÿ´µ''%Lþæ-Gd¼9Ôÿ÷þÊîôN7&5467>7'.#3327&54;#"&'73>545'&#"'67&'#'–™lHC3g) $+ '=yMUP #'[HBk86S4&'! (#52L)ç281wEU  $' 8,AWU3) G.;H9<7])(7+(G 0&À9 " %$"5 & "ÿ*Ñÿðò432&#"#.Ö $&3:((zx : "(e&4Eÿ5Ñð#53'"#.54>32QQY*R9;-A&II+6gP:+)  :þLÿ@#'#73^{‹`ÊDÀ““ÖÿßÿÇ3ä?73267'3265'.'"&5754+7367&'>72&#"#"'’&,8Oß$S@)LMA-ÛRi-)05nZA*(DX\ƒ '1`AÝ!7Ð-.³é6A;+#†^5­Ræ%(@K XC!")8 =;$ˆÿãÿÇä873267'"&5754+73>54&#"76323267#"&'•-%8PàLRi- {F)92@*M#A?&54&#"763232767'Í72&32>5'.'%32767'eX;O\')77¥]{‹`»™89Pj-'24nZ?,'ôRA11FH-þÚ2 ;.Ò¦D "(:'@( Ä““Èo^5®Rå "(AKXþú6A2%(#§ÿúÿ·À#.5432.#"#3Q9€.*%O"onND.a ; 0=`ýµÿ,Ñÿòò4>32&#"#.Ô <-'(R:((z$' : -@]4EÿÏõ-4&#"76323267#'#7.54>)*92?-I$@?%;TT;h0d8[B©^{Š`º$?:!=WX=o a :'-70':G%Z7 É““È*G.*= "ÿóÿ[Tç3#.''#"&563232>7'.'&543253To$¢*@D5EW*»\L] 0LT6  * Dk"=ö* $n S$$ 9‡Z3…,2I4    @…Tÿòÿ¾ÅÕ4.'&#"#%3Å8GšU¦”½n07 N#B$;)½ýù~%ÿþÿø,73265'.'&=472&#"#'#7&'&'X k1:N Kz(=Õ<4.Bd^Š#/ 8>$§]{‹`¸OD:H1' "'7[< +!)4,E)Ç““Æ ,&ÿþÿõ 3%2654&'"4672&#"#'#7.5467&5)OFhITlp^@-(FWFSS7":@%§^{Ša¹2N, [47*:.#4;'6CFCL[C G5/H*Æ““Å$0+AS%ÿâ1#'#7.54>54#"7633274>32Ý^{Ša¹3M- >XY>l4A/Kvc=XW=>/ 2${fEí““Å&2..@ !2gS90:)$.9)+`-<  ÿÀËË !2#"&4"#4>32'.s4$#þÌ1E n6jIGvJ+ ifË" "67 85ýú.SO/$94(. ÿ¾±Ø%"#4>32632&#"#4.—n !6^>.)#! w(*S&=`p«ýù!>H4#  y O .&Y79* ÿ¾ÄØ-2#"44>32632&#".#"#–.-ý¢ !5^>XLC w( ) S%4W2-C nT *T!?G4#/5y O 0$[!30#*>2ýùÿéÿ¾%Õ 2#".5464.'&#"#%3ä"-+7F›U¦•¼n.; MÕ+! ²B$;)½ýù~$ÿïÿ¾ÝØ ".#"#4>3 632&®FN+\w¯]Èo '?oIØv$ŒT"O"30#¬ýù!?G4#yŽ O ÿíÿ¾ñØ*2"47".#"#4>3 632&Â\GM+\w°]8S*o '?oIÑv$T*T8T"O!31# 59ýù!?G4#yŽ O ÿ4ÿ¾åÝ4.#"#&=632632&#"#N 4": UŽW)g ?54'"þæ XRƒB–V¬8T<;JC4IV)96(› iŠ=xÐ)' 'L; ' þ<þÖÿ¤ÿ³2654+'767+&'7þÚ1E= 9&%/,-BhM`A,0å)8 ;0-8=95þ1þÁÿ·4>324.'#;65'.þ1CQ-=mF*L+_80/; B# [/+0Ì1>.E94JN/ > 4þTþÕÿçÿÕ267#".5432#"þ­2>#q ,v6=Y-™D¦™*N ,-t(þqš#¤ 4632#"&#3Y'"!#2^þö‘e#)%±þ`š¬"#324&5432&!05QþÚ‘[ƒ*a'0"D m j Pþ^š!¬"#324&5432&2"4!!05PþÙ’Yƒ*Za'0"D m j P8 *TþV™=° 2#"&546'7#%7#')1—qe•[þØNš0&&%¥˜#þé¯Eþ[˜¹"#%7'7>;)!<[þØN­rd/"Gm1p¯E˜˜#6&LþX˜!¹ 4632#"&7"#%7'7>;="..""*W#A&<01^-u&"°-+*"Ø-Y<¨þK”®&'#".533275432&#"{4 524^\—$#?$%”*!-^D}‡ 6b2*#þK”®&'#".533275432&#"{4 524^\—$#?$%”*!-^D}‡ 6b2*#ÿЩÔ%!5!Ôûü©^ÿòíÆ72#".5464&#"326„.;& . @p %()2Æ>+- & /;j2)<'"©Ã%!5!Ãþ=©^ÿöÿ5B 62#"&5464>32&#"3%#"/732654&#'7"&'"#'$,#9;#n 9Ckkggi"I0Lg:&*32'"É+2Ÿ>;Êg¢ýä)1"V>ŒUÿõÿkJû <2#"&546#34&#"5632#".54'7326h&,($*hhþã9CL->u9  .Q22" WB'9<*'1+ø1N X 9  :)<.! " ?Lÿ÷ÿJ9 32#"&546'32673#5#"&547.54632&#";#"‡)1)"62;"<}pqz;qU=nYe/*/‹L~}K')%"3'!Ì ;@ýìk-[JA*:':HV8@Qÿöÿ!F ?2#"&5462#"&5463265'.'&=472&#"#"&' ( 5,ƒ"%-$þj j2:N My'>Ö:6/Bc=Pb/.LN*<¥)P( # "%)ê.)!+þòG2& #'7\<')45N';<ÿöÿlBñ 82#"&54#"';2673#5#".'#73267'&/#732I>' &$L#:7k .upqx6$>)$8· *¦Ë9P)" 1—0D fC9ýìq1*3 U#  TNÿõÿ4Yü <J2#"&546'47"&54>;#";#"27#"'4672#".32654.#"ƒ( '$5fX#G'! ‰J<#I&)œˆ?žTAM).S\‰PyQp!#!(=*" 1(!ÉG/D3"5 T5#X.Y~’Og;=v pV]Q@3'0ÿðÿ´‹ø 972#"&54627+.5467'."32>5#".546ˆ(')",$1gE-¨LÁ #>*49*#y<(, /:(WB*)1*¶7'.#"763632„1 '$5Xu%' C 66% ".4*+ ;;W*@.&6 6.-A%6AB"'" 1'"ÙG#?6jHf0YWE8F&7_JMW&(>-@FSX‡*ÿôÿFaü +2#"&546353###"&'7327'.#"'6Ž&1($**gyjopi{M*r )P‚ N-L"=+*&!2+'lQ·ýì#_S:[ /—&0;[ÿÚ 12#"&5464&#"7633267#".54>œ)205ª+:2B-Ko^.c9wX*NK->YZ>R+&!(&#È dQ8-:2'XE*\&>)Q7+>""ÿþÿõ -:2#"&5464672&#"#".5467&52>54&'"©' %,,4o_@-(FV FSR7-KM)@b8# X77¯24HfJTW)2))ÇAMZD F57O($4/AR'þ»3:'7Cÿþÿ ø 22#"&546'3265'.'&=472&#"#"'&'³'0'$*: j2:N Lz'=Õ<4/Ad^Š#/.LN*jU9Q)$#2+ÝG2&!"'7‘\=+!)45N'7$ÿâ 52#"&5467 54>54#"7633274>32¤(!$)"5xþú>XY>l2C/Kvc,BMB,>/'%{Hcb*31'!9Á.@ !3 gS8)7(.9(7 `#8ÿóÿdÿ (82#"&54%#3%#"'53674&#""76"&533267c>& '$-poþ§E_$H1#&(M,$ %%j“sM=(Xt`*" 1n`P 99!Oc*7RýÔ…e<þÃAW \ ÿüÿ:üö (2#"&5467".54763753##"327Œ" "#($%;F5$=:RÆpq¡8E™ 7  115 1T5S7:‹ýìSG:{Xÿ÷ÿd4 92#"&546#3267#.546367654&#"#&54632'"v)"$'$-Üpoþº; +{.qˆ.EO235-a3YA]PVJ6%D *11 )þuGb##aR! 7,)5 +2C_?GR:ÿ#Î 22#"&546";27#"&547"&54632&#";’11!+6M#,$ LJB[€gŠN=&ž!QK"$ˆ*11 )ÏESqýíO+5G>ÿþÿ˜èí *72#".546#3".=4+7323767W')  +°rpõ+E&&[<%# (CI&)>' " (MþO$,! ´T-0¶!  Y ÿ÷ÿ4C ?2#"&5464>32&#"3%2#"'#'&'7;>7'&''7&d&')"* 553b!>9>& 6Ìg|fŠkKCWb" ._þ÷ ¶Q>*)1*Ó,  J( 'ZU.HO~„5A"'59eÿïÿ•ø 172#"&546726=3353##'&54>32&#"|&()"*z/:osopr +M0<·!77,.9I#)(1)tB/¤T”ýì* $0(Ð9S) Lu‹ÿðÿ¡ˆ 9%2#"&5462373##+&56354.'".54>311'$5(8@,joqh(dU'%8().%R M#6GC1"'%"2(!Ù A*:³ýì   k\=" 48K/ˆ,”A?c<'ÿ“·÷ (72#"&5464&#"5632353#5##"&543O' )",B"&=kpqj;.8+b!)" 1*6, X rjÑýíì$ &;&`ÿøÿ‹+î 972#"&546#3267#".=46;2654+532"&#"N& )"*þqpþÓ4wW\:PA. `+EX”9G|& ",)" 1)Aþ}3f9 ,P3';TU>€ ÿôÿWÙó +2#"&546265&+7!2;!"./#5>)'/4Ô.>làIeV;KÏþã'W*-'(!-%NT\D&H!] U šTÿùÿNõ 12#"&546%#3#572>7#".54632&#"[(,54ÛpopÎΣ6*7E9'„s*1"5342#)>(#$'!þ×Rà W&9a32&'3654r)"$'$6rNgs %! 2QV~ ?+" )2(X*11'" VHþŠm"45V]_8Šl+QO1 R ^6E`¥òÿýÿköñ (2#"&546#3267#".54672&#}& )"*špoþÿ([ VYA\,kX4.*55)" 1)þœ+b?+GD%Q_N,;lÿõÿwK :72#"&546#3"27+.54>32#.'&+'32>74&R2165poþh+'1(;L5/<fX§ z%0< V <*91ÿúÿŸì%73267'2#"&5467"&5754+7353#5²4:QäJ()'$5¯Un.ƒ pqVÙ(".·þ§*<)2&" `6²Tëëýí™$ÿÒÿpMñ 332#"&54>2353###;#"/#7326=4&+5''!* %å&1#mop‹ S=•ç. 'F¿1, ”*..  ñ 7&-¬ýì5a T1ŸU,!*Uÿûÿ# A2#"&5467"&547&54;.'"".=7654&#";27s& "$65Ì‹£–¤ O+@-.Oy#=WV8(C$5YB?L cIxMON34"%&"w†3$SP %@H6Q  !%.B;)8R7\(ÿúþæ ÷)'%"5632#"'53254"&533267 þ¶>ˆþè$!0NS#G0"&%NShpK<(YqþôWùvQgH88#Md^þ,ƒc3þË@T Y ÿöþå5þ)1"&533267"5632#"'53254.#5'%3ópqK;(Zf1"!0LU %>'!&%N #*pþù=Do(…`3þÌ?V YÓQiG+0$Md "þÞWÌöþ¿þâÿùÿö#"&##"&5463267 +W t5#//  E<Y]=&%( fþ`þÿwÿá'27#".'./&54676;53#";þñ(  ()  % œ,³5#¯ú   "! *( 4`' ,þTþÂÿ‚ÿé326=3#"&5432#þ…V-!;-6BkR$<Ÿ$K4)š™5Di/EÿöZ#".'6532=35!5!## D*#.)ÌþgdŠA›V  B %M¥ãAAýÀþ1þÿ|ÿà".'#"54632353'32=û!/  <¯1Bœ (Gþ2*)3xã.@ª*H4þ@þ‘ÿxÿß#"&'>753"&#"32>72ˆF.&4qN-(ZA;%\+þä?J)&9-8\T!1þ>þÿuÿá$#".54232>54&#"#"5432327‹ LL?.S(d$).H3+)0C@,-=,<$% 2!: $ kþ[þ‰ÿ“ÿë5654&#"&54>353ò&8 i<=20=32Ñ=O >"$  5þÉnY)!RR$6Oþ³þêÿ¹ÿÙ #".'3s,VjHµ.2tIvþ¿þŠÿûÿö#"&##"&54632675! f r5"0- ƒ8 4/H N9$ ( Gþ”;;þBþeÿ°ÿé #&'5327%326=3#"&5432#PcSVbfRZ\þÕW,#;O2CjR&þŒ%$2)(·(B4)‚†LAi/D  þgþdÿÕÿé #".'5327'"&547332>2+iY$G%fQZ]«3P 2$! þ‹' 8)(Wf+)MP0/'&þ˜þzÿäÿã#"&'35!q?’#9-.òL©-˜X&9Ý66þ¿þ5ÿûÿö$5!5!2#"&##"&5463267þÃ8þÄ8v  q5"0- þ¡11l00Á13 N9$ ( GþRþ2ÿ»ÿü!5!5!326=3#"&5432#þVeþ—eþÎM6!;P1HeR&þ¢11p11nJ2+dhLBo$E  Ë@ "#".54632#"54654'&§/A! "HQRG'!!#6' J:/TR1/*G$1ϺX 4632#"&10% !$%% 1(00ÿôþ晣 *3Y327#"'#"54?654'&#"#".54632327"'7&'&54675!5!!5>54&#"ˆcOT]cQP_>  (_ @JKAþÂXZT]^«ZM>>|^þÙ¥þÂ_|2%,(zBMl**=! 9""£3 # L.3,KJûê" 8##ö1aN’’AA’‘O0G) @45Jfq?45ÿóú5X 4632"&#+5;+,00!H k@``‰YYE$!&00ýûFAAÿùÿ@ý™ =G[#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&547332>53@kL[]cVX^8Z,kaA±6Fþ€zajJ"þ &=kFTv8Bþ¿LEt'L4ަOG^v7R/ ÞBUI-$3 V˜((A('ú7[î5ËÒ!WYA%EO9&5ZW2AZn"Dk65 в†$Ajn+=5KX=I<.' BWÿùþ«ý™ &GQe#"'53275#"'5327'4&##3263>7%4>32!!#"&/47#5!.#"%"&5473326534iYP\cUX^lLY]cUX^,Z,kaA±6Fþ€zajJ"þ &=kFTv8Bþ¿LEt'L4ަOG^v7R/ ÞBU&%)MVþÒ''A('V((A('ú7[î5ËÒ!WYA%EO9&5ZW2AZn"Dk65 в†$Ajn+=5KX=&8 ?F BWÿùµ AL"&5473326534&#"#326!2"'"!!#"#53267{BUI-+KWþBY- +Z=v_6Fþ@Cßq\=Z5%Wþ¢MFu'L5µ“D„ ##$Žz0ÌX=I<@E CVýÕ8[g‡5 41*H8*AXo#Dk64 !AA;8:QÿÿÿøÿŹ'§a÷ÿÿÿùÿÊü&úªfÿÿÿ÷ÿÇ›'­cûÿÿÿúÿï¼'‹üÿÿÿøÿ 'Ÿ+ýÿÿÿùÿÍ‚'±iÿÿÿÿúÿý'ħÿÿÿòÿÓ“'•oÿÿÿöÿÀ¡' \ÿÿÿ÷ÿú›'Á–ÿÿÿùÿЛ'£lÿÿÿúÿ¿‘'­[ÿÿÿúÿðŠ'¦Œÿÿÿøÿë¥'ª‡ÿÿÿöˆ'º¢ ÿÿÿôÿ¾ƒ'Z ÿÿÿ÷š'§¡ ÿÿÿ÷ÿÞ}'¨z ÿÿÿ÷ÿ©z'¤Eÿÿÿù¡'²ÜÿÿÿúÿØí'¢tÿÿÿúÿ÷x'§“ÿÿÿùÿý‚'¬©ÿÿÿùªÿÿÿöÿ¼t'ÇXÿÿÿùh'/ íÿù# T62#"&5426?5;#####"&54>=&'#"&54>54'4&+532676·&6+;@‡»ž@cAN/7 '$+$BJ;&  &8\>]p%ú "3[9'ÔAþºFýÀi JE>&:*C$ ‹&WI]7/$;" 2#"&'67&'###535463235#&œ98F5̈^(8U?C¤K$>! c/nÖ“wu@}}kc52 |-{© %òL:c„Aó8'!f# 'bpLT[gnýÀ@A:ƒg*P5¢œ³ÿöÿÁ«¥ B62#"&543567&'#5!4&#"#4>323####"32>2#"&8&}-{©þM“wZÆ2JC*@"C.am¯¯@_|˜:¤K$>! X:pÔ+%/œ³þ|T[gnAf>H$?<$gƒ:AýÀ@ó8V!f# *_pÿÿÿùÿ@ã™'É&5¾zÿÿÿùþ«ã™'¶&5¾zÿÿÿöÿÁ§¡'Š&4µ]ÿÿÿùÿúhÕ'M&í,–ÿÿÿùÿÞßµ'¾zõÿÿÿùÿähÕ'!&í,€ÿùSX X4632"&26?5;+#+##"&54>=&'#"&54>54'4&+532676O00!H þD6+;pW‰TTJ@ W/AN/7 '$+$BJ;&  &8\>]$!&00¯ "3[9'ÔAþºFýÀi JE>&:*C$ ‹&WI]7/$;" %1 %œ,³5% ¯þŽ''Z''W  ", %(E#(þ¿þKÿ÷ÿ÷#"&##"&5463267'7 D< r53/!¬4£5 @./1P4& Vþk‚þ_þBÿþÿû32=3#"&5432'7þŒN3?:O3>gJ'Dr4¯5p?M|{D9X-= þµ‹þaþ60ÿü('7'3270#".'.546;53#";03‘5°?  *  1#,"œ,³5"¯þLuW    +"J#)ÛÜ%#####5354632&#"354632&#"ÛWS†SFFA: :†A: : Dþ8Èþ8ÈDY8?E5RY8?E5R „Ü####53546;0#.#";„SŒSFFA:³EK:Œ ýôÈþ8ÈDY8?f5R‹Ü####53546325&#"3‹SSFFA:M@:Ùý'Èþ8ÈDY8?G5RDÜ+#5&#"3######5354632&#"3546323DS*:ÍSzSySFFA: :yA: OÙi"5RýôÈþ8Èþ8ÈDY8?E5RY8??Ü")######5354632&#"35463235&#"?SuSySFFA: :yA:.):Ùý'Èþ8Èþ8ÈDY8?E5RY8?͆5RÿéðÜ&#327#"&5#5353##5354632&#"ðV'14GGSïSFFA: : Dþ™F+(ŒDýôÈDY8?E5Aÿö«èO3273#5#"&5##5#"&5332>75#".=3;.54>;#"{10_XPWOAQVT) !!ARX$*,: w9B-=3!!!32=3#5#".5#"#5#"&'332>7u+3+-,Qþ¯/=ŠWO:k$9% µ6**T) !!AQX$*,: ´6&@&$þûBÕDG«aþ³JU'!1Ü%&+9þO8G6™þ-+2*Aÿ8Ñè@4.54>3!632#4&'"##"#5#"&'332>7u+3+-,>]dOX49*-X¶6**T) !!AQX$*,: ´6&@&$þãGhaþ·I?>"H3þl%&+9þO8G6™þ-+2*Aÿ8ÌÌ4<3273#5#"&5#3#".=332>=#"&54>;%;5#"œ10_XPWOAQ\V®=_6I%Xn*-’eX%O;êþ–C=’’€ þˆ0%‡FýôS]F4Dý¼8 E;C.¸¸~"H3ÂO;,-À2hAÿ8§èF4.54>;3253#5#".5'###"#5#"&'332>7u+3+-,ïï+@ŠXO9l1D$–Xž6**T) !!AQX$*,: ´6&@&$Üþ¾BF«"ýóJV%D7-àý}l%&+9þO8G6™þ-+2*ÿÿ:“‘X&Æ­ÿ5”2- 273#"&'3–J GRC@OG*ÛRIPPI%-ÿÿ8•XX'°ÿÚ%X%>53+533"4fW,?L:ꥋZNT<vþŠ3R0! L :@X##=47'3>7538¹Á}þrAZW¸ÀzFVW¿“{±p"zGžx±þ)qA––&X#!5!ÆWý·ó ýô LL?4X #.'!53:{lWAZþ WXamþ†tQ: Lý¨wþ‰9ÿÿþX4&#!5!2#!5!265§|Tþb¤x©¨yþ\žWysBWL…Yœ[ƒLVC%í!#467>=!53!öW$C;6 ýaWŸ>MWS`12!/ Há•™1P+7.H?5X 2!4&#!‹˜ý Ÿo]þ„Xƒ[þ†Xýô+7^þ@%éX #.'!5î{mWAZþ>Xamþ†tQ: L#uX4&#!#525#5!2#[Pþux–<ýoŒWtESþ¿gdLzFL}aþ†2ÅÚ!5353þÏF FFÏÏÿÿ<ÐÇ&¹Öÿÿ<ÐÇ&ºÖÿÿ<ÐÇ'´Ôÿ&¹Öÿÿ<ÐÇ&º&Ö´Ôÿÿÿ:ÿ}FX&°½ÿÿ:ÿFX&±½ÿÿ:FX'´ÿôÿm½ÿÿ:6X&¾´õÿÿ±X&¿´µÿÿ&X&À´ÿÿ?:X&Á´1ÿÿÈX&Â3´ÿ-ÿÿ(X&ôÿ)ÿÿ=:X&Å´5ÿÿ ×X&ÆF´ÿ'@ÿÿ&ÿ8ÚX&Ç´ùÿÿ9X&È´ùÿÿ%!í&É´ýHÿÿ0:X&Ë´Cÿÿ3FX&Í´ÿuÿÿ=9X&δ/ÿÿ9ÿ8 X&дMEÿÿ?X&Ñ´ZFÿÿ3X&Ó´žÀÿÿ>ÿ8&X&Ô´)ÿÿ%ïX&´Õÿÿ<ÐX'´ÔÿžÖÿÿ#{X&×´‘ÿÿ>•Û&²Âÿÿ:6Û&·0¾ÿÿ9Û&È·ÿÿ?Û&Ñ·8HFí#53>=3>Q;”fþhWå):W¿D‚'ÒD©•þ»Z9–#ÿòòÁ"35467>54&#"34632#3 Ø!!8 #H=‰5"/$,888þ˜hgÄ')# 17A’-4'þÊA{hgþ™ o¨°7#3353!!#5#3&$uâ$ tmþ“&âoA}…}/ ÿf€  !#5##3&'5!3#'353€þëi Lkg%QpÀæpB-'d#www m~%E!fþlC)þpkÿþ 5!# F(ê ? þÿþæH5&'535&'5333#5'5e#Be Eæ]`;`]!e¤#8¢!;W¢7¤X¡¡\ÿf\ '2!#5##5##3&'5%3#&'353'353\þòlaV!K1: g&P d—¾P'j f¼pB,& b#ww[w3D m~'C\þ‚~O aþpllC)þpjÿe ƒ#3!!!!!‹OA~þ‚"L`~þ‚#Il~#YC("T b&'Ip%{|*##5##33533!#3!!{Ñ   !yJ  dyZÑý‰þ£e%%h]þ£|]1  uH  kq fÊp|t-…'.'5!3#&'53w   fq g(S!tœ  !]¼[þ©WQ!ÿeSž"673#&'!!567!#3!5'5!È&F aþð&Nþôbþú&E[u b/'Nþôiþç&EV&N eækXæ´ 35##335&'5!3673#&'#Ë=k 6=X ;8)B\8øu 8nN6p)Lþóaúÿdò­:75&'535&'5333#5&'5!5&'535&'5333#5'5e#Be Eæ]`]`]! Eq'>e!Dæ]`[`]!e{¤#8¢!;V¢ R¤X   <¤&5¢":W¢ R¤X  \Ý %!#3!!!#3!!Ýþ¬#H\TüFWhþ˜[ ahþ˜õ#S cU &`g&ÿí?÷5!#'7"%7"''4™ i'þ¾þð/å¾;`þñÙ aþ€€d¾<_þð¿¿þð- #&'#'#&'5o(O&i%pp%#T eþQ bþllþ"GÿþÔ #'5!#3!!Ô 8&u ýM K€þ€ê 1þkþö R&Ô>7%37"''4¬9þþ)-—¼¾6eþïê@ªòXŒ$>¾þñ/ Jñ%##5##533533533##4¤ ;£0*X£X¤Z¡¡ ;p Dd22å^`_`^!!C O…&'3!#3!!¸UX©'.—Ýþ54#%%hÌþ4‚Ë7éN¤ÿP“%¡4)|r-…†€7&'5!.'5!.'5!–g/Wˆ•$"!W†þì4W‰Ïd%(% % (& Ë3 ((‚ Cý7%3¬Vþþ)-—õéòÿXŒ$t|3!!!#$hËþ5ƒÊþ6% &|t-…†.%!#'#&'5o%oq(S!hþƒ}kkþƒ}S  ¨%73#&'!#3k _þn&E `§tþôj&N hÿepK'#3%#3#3#3#3µl(& €»j '& Ù9P(& ~â[/(& âf#(&|p'W‡™l*Wˆþ;\W‡\W@X †2j-X …ÿd—Å%.:%'.'5!>7'67'67&'7"&#!567i>Ü þ)2#W …þD.ƒô‘ 0ÇtRü”ó‰,¶-"þ© ¶Ð1  (&}Ãó›,› é þwTñÂ.'%v› ''7237'"#'677›{z|W£UWX \— X|„}z|W^!¢TX— ^V}   7#3!!! `€þ€&  h'&ÿd !7#3!!!!!#5&'53‹N^~þ‚X d~þ‚#Il~OW"$@åaUg'Xj'&Iq%5Mmm$6ÿff8"!#3.'5%&''foý£X!k %   RŸer)x&P iþ?X%r— %   ýÕ—b iþi˜s'Lþhÿdò{:A%#5'535&'535&'5333#5&'535&'535&'5333'5!ò]!ee'>e!Dæ]`[`þô]! Ee#Be Eæ]`]`—X‡cX  \¤&5¢":W¢ R¤X   <¤#8¢!;W¢ R¤O‰(&|,ÿþ9 #&'5!9S'Y êDþtŒC##&'#'#&'57#3%!o(O&i%pp%#T! Z‘ýo eþQ bþllþ"G  a(c,,#'#&'5%##5##33533o%oq(S!`Ñ !y ! ! byZÑhþƒ}kkþƒ}S Žu    iq f`, &'5%#'##3!!%3ÂS!Y%or'U bþþòVþþ(.—}S Sþƒ}kkþƒ i'þßêòÿUŽ$ÿþ—|5!#73!!!# ^(¯$mËþ5ƒÊþ6L#&êSþýx-…†.N&ÿþ< 7%3'5!#¬Vþþ)-—^'õéòÿXŒ$õQþ  #'#&'5%3#33'co%pq'VœUþþ),–[dûû)iþƒ}kkþƒ}T þíéòÿX‹%„l)) Ø,&.##5#!!!!#333533%3ØÒR!z& W€þ€lZ€þ€&E`z\ÒüÝVþþ'/—”R#u%  _&uc'&N iq hþËêóÿQ“$„%'#%3737&'5%#'#ÙUë—Vþþ)-—ë),–xT!n%or'óéëéòÿXŒâX‹%ŠT fþƒ}kkþƒ˜,"#'#&'57#3!!#33'o%oq(S! `€þ€!ÆZúú&hþƒ}kkþƒ}S  h' ýûa)%^!'#5##335&'5!373ÈUó8'=k 6=X ;8ó),–éäúøu 8nN6péX‹% C,'!!!!!#3!#3373#/Bþ‚;.W€þ€l'C€þ€&E d~ûàZPï*,––VíR&”:9_&u'J'&N kþM aë[‰$êß&õ|",33#7##5!#&#5'5'#&'5$lááƒßßP!&ç ;4(V9l'p$L$'Q|w.…†.S%í=/þVUføøk‡%Hþ‚~%DÁ #&'#'#&'5#33' O(O&i%pp%#TZdúú! %GþQ bþllþ"Gþfl( .#'#&'57#3!!o%oq(S! `€þ€"hþƒ}kkþƒ}S  h'!ÿgÆ…'#'#&'5#33#3#3Æo&oq'VþÛN_úúZ_úú#Ilúiþƒ}kkþƒ}T ýØN)h'\h&&Iq%ÿBò†#+5!#3#'#'33##33%3å c'þH c  l<^úúRkúýáVþþ(.—êWþj&o(ég'ýÉT#}%:éòÿUŽ%#ÿþ™ 5!#%3%5!#Œ ^'þëVþý%1–ý¡^'êSþŒéòÿL—%÷Qþ.!.#/#'&'57!!#7#'73#'53!!p%oq(R"l~þ‚V ¦ bôô%ï a~þ‚!, xjííllííSÑL< GH¶F" ¶€ 5!#&%3!!!#¨_'&ý $hËþ5ƒÊþ6L!&ðTþ%×r-„†/N#ÿþì %'#-373%5!#UVè9Vþþ(.9è%1—ý ^(ñéééóþUŽãL—%ùSþ¯|%33#7##Vþþ%1–ýT$iááƒßß50&4êóÿN–$Hs.…†.73€!'#%373337##zVè9Vþþ'/9è++–,%jààƒÞÞ . &1êêêòÿQ“äZŠ#Or/„†0 . Y %75337&'5!#5#%5!#&#5'5# ^ö#T $L%ö¾ o(O@l&p¡ê ef"G%Hþ‚ðúeþQPføøkÿ϶L(3'7##%3%#'5!0$háá yßß !  &ºVþþ(.ºþá]'u Lr/… |/ !  $éòÿUŽÖOþkÿCé‡#,%#5#/'73533'33###'33#„”VöJ#I cJö(.”]úú)ý>jùùQ ^ùùvvéß&IkìUŽs e()f}%R%[ég(³ %#5#%3533'#'5!N¹Vþþ(.¹]úú&þ~]'u }véòÿUŽr e(&#OþkÿAÏ…$-#5'#375'5!3#'#'33#33##]'ö!J Zöt ‰f  l:_úú‰iúúQîOþá Uawk”l&p(éh'þk}%T#0&#7#5'#5&'57'##335&'5! äíp%oq(R"þtM]tX bM(®jííllííS®W fZNXZÿgÀ…!#33#3#35!#N_úúZ_úú#Ilú* c'"N)h'\h&&Iq% WþG87#37373#'#/# `’ð*,9è'/––Vè9Vð’!µ hé[‰äQ“#êêêá ÿŠ  "7#333'5!#5#'%3'# `÷%nÞu ^'ÜO!&÷8 yÜÞC h(vkSþQ$,0 | ÿAÄ…##'5!7#'#'33##33]'u ‰f  l;_úúNjúîOþk”l'p(éh'ýÉN)}%ÿþû &/5!#5##5##335335%5!#î ^'Ñ% !z  !\z ^Ñü  ^(êSþÍ$   t   frjkSþà%'#-373%#3!!wVè9Vþþ(.9è%1—þ `€þ€!ñéééóþUŽãL—%â h' û #5'#5&'53!!!!#p%oq(R"_þ 7l~þ‚V xjííllííS…G (L<ÿǪB 3#7##%3%3>$láá yßßO!&’Vþþ)-’ÖUþþ),–Bu.… |/Q$.éòÿXŒ&éòÿX‹%ÿþ»}#,4333##'##333#%5!#%3ô$AÙÙ‚ƒÙÚc&J% &$hL̓JLõ ^'Vþý%1–}C-…‡.e(%!|t´† #SþŒéòÿL—%ÿù&Ò,1:@KT]c5!#5##5##7##33533533&7#35#35#35&'#35#'35#35# ^'§TLV!Ú %   &%nÝ]I]_üøƒÚÝÏ^¥¦Jl§¥76l¦{!- Þ^JKJlKI!- lLJ7°Rý¸M<Q=º &   |w¸DKDþÍ… †F5¶L(DLu# ¹F5·Lœ# þ‘L( ÿùÒ',5;FMS[c5!#5##5##5##33733733&7#35#37#3'&'#35#'35#35#%%3 ^(¦TLV Ú"M&%nÝ^I^_üøƒÚÝÏ^¥¦Jl¦¥76l¦ {!- Þ@.JKI#lKIZlLJ 1%ÕVþþ%1—°Rý¸M<Q=º"[|w¸EKEþÍ… †F5¶L(DLu# ¹)"4™Lœ=þ€L ¡éòÿL—%ÿÍçI*%%3'5!#%33#7#aVþý%1– ,E(úVþþ%1–û$ 6ááƒßßg&õéòÿN–$õ.=þŒéòÿL—%V;.„†/i$ÿÿÿþžW&7'#'7373'#'737375!#ô8—%8¨¨%—cd8–&8¨¨#&–c; Q!&‹ƒƒƒˆ6K6K7ƒƒƒ‰'Y€0P(Nþÿÿÿþ’W,7'#'7373'#'7373%#'#&'5ô8—%8¨¨%—cd8–&8¨¨#&–c<o%oq'=8‹ƒƒƒˆ6K6K7ƒƒƒ‰'Y€0PD hþƒ}kkþƒ}<0Gñ8!7537373#'#/#5##3J `’ð+*8è'/——Vè8Uð’!JJO Qp hé]‡äQ“#êêêá UuY Jí27-37373#'#'##5##533533533##ïVþþ)-Gè),8è%1——Vç9Uèþ¤?£&4 T£W¤]¡¡ ;ñêóþTäX‹ãL—%éééézJe&?çZa]aa!!DàÞ '7"¾þð/ ¾ b.þðÿþ 5!# _(êTþ'.'5!3#&'53w$  fq g(M'tœ$!]¼[þ©WM! Cý7%3¬Vþþ)-—õéòÿXŒ$ÿþ â 7'73'73y<¶¶il>¶¶ kuy€*Hty€,Fÿþ«ô5!#673#&'!#3Ñ _'Û&EYþnO[êTþ&Nþó gY b7°i#(7"&547'767>7&'7'6_ I0B[R S_'N5'"FmŒB.3,=ˆp$dJ¥Dž†yT>,>[N@+  0'Wqˆyu€`Hd97šP%'>54'#"54632'&'32š©J >‹@eqÃ%=!Zg$Væ<5|P0$¿¹¨•T>e'7ÿµR'6?&CD5ª5-TÃ6¢‡þºS Yœ_fþT‚ yj7йP 4632&'#"%&'327•$¡5 (VE~/%E,-8pÃþÕI 1SKX3JP7 mP>32&''67''67&'7>Ž 2î*4H =* %;–;yV%'°,JugT•þT~AI0 (7³k‡O)#ºF5›7³R.547#"&54732>7M-9/=1CC':L#9 (H+% 1,RTyX_‡\5'(/#2=*,  '3OW7U“P267#"."'>32Â*Y1cn!A'%1N .'Š(2%0‹o<É‘>I>6ÿþP'#"&'7632.'&'&'67'>\=][…Y3 CÀ<+ #4'p&?¦'Xî3_'ªEaBÙŽ öþ#b0S65 Ì?$Öee_¥m) «7ÿ=ao-%&''7#52672>54'7#"&547¶ -&82/&0".#Æ@ƒ[:0 (L`}>GTΉ|Ä4î6tb725#-þ€ÃÇ=7$1E;¦±˜aZM«‚^-Uþ–Ÿ5;7 Ke "&54632654'7'67&''7&0Qr6“fua 3S7+.Eq2n lN  fŠh$$.(¨>=[=ýö7ÿ8½©"&54732>767'67¬2CF%5?,G;3IÛ*1º8JÔ.)>@(/' ,!*ÙýÖT:Ó›%7ÿ»¡ 7"&54>732632'>54#"Ÿ-;Xmf 5›‰c?G$%#3mB4)¢ºÕ= bþÐà 0#_!( F 7ÿ8ð¦.547376?'>'´3JN'?CJ3?:B74ë‡.3_‡:?&3©0&NP&@8´š "“ýÜSÖK^7ÿ8JÅ2'54#"#"54326æ,8é*Ü-&BŒ1$@&ˆ7-Ëþß"¸.7$EŠM7ÿä dB2>7.'#"54>7#"5467'632>’S.‘”@`• 9#5%"84 ~0" !"  $4:A({>3 *")»$˜'/;¤_W_(bV\…$%4H &! *# %I$‹%„ ,$ 7R?P 2#"&543254&#"€pOK;5M6-O."-PD57#".'&'76--%5 ] (/<"l/Ï'5 1LPKK19WDQ [JþÓ/g -ed7ÿ8 ¥",52.'#"&54632>4#"%"327&Ì$³V_M+*1>TiE#+Y,=RX/M07& %þê híýèA7]C¥/!=þÞuÄc";V38¸(-$ 5•š -' PŽ 3ßLXu 'x7ÿåP 462&#"6"3277–>B‚M/ApC1~!±—þÈ€m É} 7kÏ^>53#"&54747.1:6#1@,Ly6W37©W?:X.kH$ /KsID7ÿ8]'654#"'67632]1-(_DÇ3ÏÔ,Q•r-D64=EþP<ÖÜ2Ç7#ê¬ 7>77%)!5!+&7WËL HþýØ[7ŽP2'67654'"#"'732<.$    v XTP+# 0 - 6 7©…P9>32'>7#"54>7&#"#"'732632” LL6fŒ* &0 O8, & Y " Y V$.™ $ go 5  ,  $   5 0 7öÜZ>3267.#"7z$+)"h4WN,?‡98!!$&)“M*g(P+7#‹¬ 7>7'>7Ø&(!5"*%Ô%)!5!+&7XËL GþýØ\WËL HþýØ[7#,¬ %>7'>7'>7y%)!5$($Ô&(!5"*%Ô%)!5!+&7TÍ K QþòÆYXËL GþýØ\WËL HþýØ[7Í­ 2#"&546}!/*#-)­,".,! .+ ?€Òé$: sµãô +P F $›,= Í€Û ¿ ~ À  Û Hð _ 6} Ñ ì Vø Œ| HQ XÀ  O x]  ] \k ³É^Ý•t$×$ †ç$Ho$T¹*GCopyleft 2002, 2003, 2005, 2008, 2009 Free Software Foundation.Copyleft 2002, 2003, 2005, 2008, 2009 Free Software Foundation.FreeSansFreeSansMediumMediumFontForge 2.0 : Free Sans : 9-5-2010FontForge 2.0 : Free Sans : 9-5-2010Free SansFree SansVersion $Revision: 1.256 $ Version $Revision: 1.256 $ FreeSansFreeSansGNUGNUhttps://savannah.gnu.org/projects/freefont/https://savannah.gnu.org/projects/freefont/The use of this font is granted subject to GNU General Public License.The use of this font is granted subject to GNU General Public License.http://www.gnu.org/copyleft/gpl.htmlhttp://www.gnu.org/copyleft/gpl.htmlThe quick brown fox jumps over the lazy dog.The quick brown fox jumps over the lazy dog.VëaNormalJovencillo emponzoñado de whisky, qué mala figurota exhibes.navadnoDovoljena je uporaba v skladu z licenco GNU General Public License.http://www.gnu.org/copyleft/gpl.html`erif bo za vajo spet kuhal doma e ~gance.1KG=K9 G0I0E N30 68;-1K; F8B@CA... 40, => D0;LH82K9 M:75<?;O@J!odmiana zwykBaMedioµµÃ±¯±MittelZwölf Boxkämpfer jagen Victor quer über den großen Sylter Deich.NormalPortez ce vieux whisky au juge blond qui fume.GemiddeldZweedse ex-VIP, behoorl3k gek op quantumfysica.oby ejnéÿP2¡  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹©¤ŠÚƒ“òóˆÞñžªõôö¢­ÉÇ®bcdËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€ìîº  ýþ   ÿøù !"#$%&'()*+,-ú×./0123456789:;<âã=>?@ABCDEFGHIJK°±LMNOPQRSTUûüäåVWXYZ[\]^_`abcdefghijk»lmnoæçpqrstuvwxyz{|}~€‚¦ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“Øá”•–—˜™š›œžŸ ¡¢£ÛÜÝàÙߤ¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[Ÿ\]^_`abcdefghijklmnopq›rstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                    ²³   ¶·Ä ´µÅ ‚‡  !« " # $ % & ' ( ) *Æ + , - . / 0 1 2¾¿ 3 4 5 6 7 8 9 : ;¼ < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ÷ € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À ÁŒ Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) *˜ + , - . / 0 1 2 3 4š 5™ï 6 7 8 9 : ;¥ <’ = > ? @ A B C D Eœ F G H I J K L M N O P Q R S T§ U V W X Y”• Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H¹ I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀÁ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤ softhyphenmicromiddotAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexTcedillatcedillaTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019EObarOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6Yoghuni01B8uni01B9uni01BAuni01BBuni01BEwynnuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5Wynnuni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0224uni0225 A_dotaccent a_dotaccentuni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233dotlessjuni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291yoghuni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8primemod dblprimemod quoteleftmod apostrophe apostropherevuni02BE ringhalfleftuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5verticallinemodmacronmodifier acutemodifier gravemodifierverticallinelowmod macronlowmodgravesubacutesubcolontriangularmodcolontriangularhalfmodringhalfrightcenteredringhalfleftcentered tackupmid tackdownmidplusmodminusmoduni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4 toneextrahightonehightonemidtonelow toneextralowuni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307 diaeresiscomb hookabovecombuni030Auni030Buni030Cverticallineabovecmbdblverticallineabovecmb gravedblnospuni0310breveinvertedcmbcommaturnedabovecmb psilicomb dasiacombcommaaboverightcmbuni0316uni0317uni0318uni0319uni031Ahorncmbringlefthalfsubnospuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327 ogonekcmblinevertsubnospuni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337 slashlongnospringrighthalfsubnospuni033Auni033Bseagullbelowcmbuni033Duni033Euni033Funi0340uni0341uni0342uni0343diaeresistonosnospuni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni034Funi0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0374uni0375 ypogegrammeniuni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonostheta1 UpsilonhookUpsilonhooktonosUpsilonhookdiaeresisphi1 pisymbolgreekuni03D7uni03F0rhosymbolgreekuni03f4uni03F5Iecyrillic_grave Iocyrillic Djecyrillic Gjecyrillic Ecyrillic Dzecyrillic Icyrillic Yicyrillic Jecyrillic Ljecyrillic Njecyrillic Tshecyrillic KjecyrillicIicyrillic_graveUshortcyrillic Dzhecyrillic Acyrillic Becyrillic Vecyrillic Gecyrillic Decyrillic Iecyrillic Zhecyrillic Zecyrillic IicyrillicIishortcyrillic Kacyrillic Elcyrillic Emcyrillic Encyrillic Ocyrillic Pecyrillic Ercyrillic Escyrillic Tecyrillic Ucyrillic Efcyrillic Khacyrillic Tsecyrillic Checyrillic Shacyrillic ShchacyrillicHardsigncyrillic YericyrillicSoftsigncyrillicEreversedcyrillic IUcyrillic IAcyrillic acyrillic becyrillic vecyrillic gecyrillic decyrillic iecyrillic zhecyrillic zecyrillic iicyrilliciishortcyrillic kacyrillic elcyrillic emcyrillic encyrillic ocyrillic pecyrillic ercyrillic escyrillic tecyrillic ucyrillic efcyrillic khacyrillic tsecyrillic checyrillic shacyrillic shchacyrillichardsigncyrillic yericyrillicsoftsigncyrillicereversedcyrillic iucyrillic iacyrilliciecyrillic_grave iocyrillic djecyrillic gjecyrillic ecyrillic dzecyrillic icyrillic yicyrillic jecyrillic ljecyrillic njecyrillic tshecyrillic kjecyrilliciicyrillic_graveushortcyrillic dzhecyrillic Omegacyrillic omegacyrillicuni0470uni0471 Fitacyrillic fitacyrillicOmegatitlocyrillicomegatitlocyrillic Otcyrillic otcyrillicthousandcyrillictitlocyrilliccmbpalatalizationcyrilliccmbdasiapneumatacyrilliccmbpsilipneumatacyrilliccmbuni0487uni0488uni0489uni048auni048buni048Cuni048Duni048Euni048F afii10050 afii10098uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7Haabkhasiancyrillichaabkhasiancyrillicuni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8 afii10846uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFDzeabkhasiancyrillicuni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04f6uni04f7uni04F8uni04F9uni0510uni0511uni0512uni0513uni051auni051buni051cuni051duni051euni051funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564 echarmenianuni0566uni0567uni0568uni0569uni056A iniarmenianuni056C xeharmenianuni056Euni056Funi0570uni0571uni0572uni0573 menarmenianuni0575 nowarmenianuni0577uni0578uni0579uni057Auni057Buni057Cuni057D vewarmenianuni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058A afii57799 afii57801 afii57800 afii57802 hiriqhebrew afii57794 afii57795 patahhebrew qamatshebrew holamhebrew afii57796 dageshhebrew afii57839 afii57645 rafehebrew afii57842 shindothebrew sindothebrewsofpasuqhebrewupperdothebrew alefhebrew bethebrew gimelhebrew dalethebrewhehebrew vavhebrew zayinhebrew hethebrew tethebrew yodhebrewfinalkafhebrew kafhebrew lamedhebrewfinalmemhebrew memhebrewfinalnunhebrew nunhebrew samekhhebrew ayinhebrew finalpehebrewpehebrew tsadifinal tsadihebrew qofhebrew reshhebrew shinhebrew tavhebrew vavvavhebrew vavyodhebrew yodyodhebrew gereshhebrewgershayimhebrewuni0700uni0701uni0702uni0703uni0704uni0705uni0706uni0707uni0708uni0709uni070Auni070Buni070Cuni070Duni070Funi0710uni0711uni0712uni0713uni0714uni0715uni0716uni0717uni0718uni0719uni071Auni071Buni071Cuni071Duni071Euni071Funi0720uni0721uni0722uni0723uni0724uni0725uni0726uni0727uni0728uni0729uni072Auni072Buni072Cuni0730uni0731uni0732uni0733uni0734uni0735uni0736uni0737uni0738uni0739uni073Auni073Buni073Cuni073Duni073Euni073Funi0740uni0741uni0742uni0743uni0744uni0745uni0746uni0747uni0748uni0749uni074Auni0901 anusvaradevauni0903uni0904uni0905uni0906uni0907uni0908uni0909uni090Auni090Buni090Cuni090Duni090Euni090Funi0910uni0911uni0912uni0913uni0914uni0915uni0916uni0917uni0918uni0919uni091Auni091Buni091Cuni091Duni091Euni091Funi0920uni0921uni0922uni0923uni0924uni0925uni0926uni0927uni0928uni0929uni092Auni092Buni092Cuni092Duni092Euni092Funi0930uni0931uni0932uni0933uni0934uni0935uni0936uni0937uni0938uni0939 nuktadevauni093Duni093Euni093Funi0940uni0941uni0942uni0943uni0944ecandravowelsigndevauni0946uni0947uni0948uni0949uni094Auni094Buni094Cuni094Duni0950uni0951uni0952uni0953uni0954uni0958uni0959uni095Auni095Buni095Cuni095Duni095Euni095Funi0960uni0961uni0962uni0963uni0964uni0965uni0966uni0967uni0968uni0969uni096Auni096Buni096Cuni096Duni096Euni096Funi0970uni0971uni0972bn_candrabindu bn_anusvara bn_visargabn_abn_aabn_ibn_iibn_ubn_uubn_ribn_libn_ebn_aibn_obn_aubn_kabn_khabn_gabn_ghabn_ngabn_cabn_chabn_jabn_jhabn_nyabn_ttabn_tthabn_ddabn_ddhabn_nnabn_tabn_thabn_dabn_dhabn_nabn_pabn_phabn_babn_bhabn_mabn_yabn_rabn_labn_shabn_ssabn_sabn_habn_nukta bn_avagraha bn_aakaarbn_ikaar bn_iikaarbn_ukaar bn_uukaar bn_rikaar bn_rrikaarbn_ekaar bn_aikaarbn_okaar bn_aukaar bn_hasanta bn_half_ta bn_aumarkbn_rrabn_rhabn_yyabn_rribn_lli bn_likaar bn_llikaarbn_zerobn_onebn_twobn_threebn_fourbn_fivebn_sixbn_sevenbn_eightbn_nine bn_asamira bn_asamiba bn_rupeemark bn_rupeesign bn_currency1 bn_currency2 bn_currency3 bn_currency4bn_currencyless bn_currency16 bn_issharuni0A01uni0A02uni0A03uni0A05uni0A06uni0A07uni0A08uni0A09uni0A0Auni0A0Funi0A10uni0A13uni0A14uni0A15uni0A16uni0A17uni0A18uni0A19uni0A1Auni0A1Buni0A1Cuni0A1Duni0A1Euni0A1Funi0A20uni0A21uni0A22uni0A23uni0A24uni0A25uni0A26uni0A27uni0A28uni0A2Auni0A2Buni0A2Cuni0A2Duni0A2Euni0A2Funi0A30uni0A32uni0A33uni0A35uni0A36uni0A38uni0A39uni0A3Cuni0A3Euni0A3Funi0A40uni0A41uni0A42uni0A47uni0A48uni0A4Buni0A4Cuni0A4Duni0A59uni0A5Auni0A5Buni0A5Cuni0A5Euni0A66uni0A67uni0A68uni0A69uni0A6Auni0A6Buni0A6Cuni0A6Duni0A6Euni0A6Funi0A70uni0A71uni0A72uni0A73uni0A74uni0A81uni0A82uni0A83uni0A85uni0A86uni0A87uni0A88uni0A89uni0A8Auni0A8Buni0A8Duni0A8Funi0A90uni0A91uni0A93uni0A94uni0A95uni0A96uni0A97uni0A98uni0A99uni0A9Auni0A9Buni0A9Cuni0A9Duni0A9Euni0A9Funi0AA0uni0AA1uni0AA2uni0AA3uni0AA4uni0AA5uni0AA6uni0AA7uni0AA8uni0AAAuni0AABuni0AACuni0AADuni0AAEuni0AAFuni0AB0uni0AB2uni0AB3uni0AB5uni0AB6uni0AB7uni0AB8uni0AB9uni0ABCuni0ABDuni0ABEuni0ABFuni0AC0uni0AC1uni0AC2uni0AC3uni0AC4uni0AC5uni0AC7uni0AC8uni0AC9uni0ACBuni0ACCuni0ACDuni0AD0uni0AE0uni0AE6uni0AE7uni0AE8uni0AE9uni0AEAuni0AEBuni0AECuni0AEDuni0AEEuni0AEFuni0AF1uni0B82uni0B83uni0B85uni0B86uni0B87uni0B88uni0B89uni0B8Auni0B8Euni0B8Funi0B90uni0B92uni0B93uni0B94uni0B95uni0B99uni0B9Auni0B9Cuni0B9Euni0B9Funi0BA3uni0BA4uni0BA8uni0BA9uni0BAAuni0BAEuni0BAFuni0BB0uni0BB1uni0BB2uni0BB3uni0BB4uni0BB5uni0BB7uni0BB8uni0BB9uni0BBEuni0BBFuni0BC0uni0BC1uni0BC6uni0BC7uni0BC8uni0BCAuni0BCBuni0BCCuni0BCDuni0BD7uni0beauni0bebuni0becuni0beduni0bf1uni10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10f9uni10fbuni1E00uni1E01 Bdotaccent bdotaccentuni1E04uni1E05uni1E06uni1E07uni1E08uni1E09 Ddotaccent ddotaccentuni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1D Fdotaccent fdotaccentuni1E20uni1E21 Hdotaccent hdotaccentuni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3F Mdotaccent mdotaccentuni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55 Pdotaccent pdotaccent Rdotaccent rdotaccentuni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5F Sdotaccent sdotaccent Sdotbelow sdotbelowuni1E64uni1E65uni1E66uni1E67uni1E68uni1E69 Tdotaccent tdotaccent Tdotbelow tdotbelowuni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8D Ydotaccent ydotaccentuni1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1e9auni1E9Buni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBEtildeuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBClenisprosgegrammenipsili perispomenidialytikaperispomeniuni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCC psilivaria psilioxiapsiliperispomeniuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDB dasiavaria dasiaoxiadasiaperispomeniuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECdialytikavaria dialytikaoxiavariauni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCoxiadasiaenquademquadenspaceemspacethreeperemspacefourperemspace sixperemspace figurespacepunctuationspace thinspace hairspacezerowidthspacezerowidthnonjoinerzerojoinuni200Euni200Funi2010uni2011 figuredash afii00208uni2016 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleader hyphendot lineseparatorparagraphseparatorlrerlepdflrorlouni202Funi2031minuteseconduni2034uni2035uni2036uni2037caretuni203B exclamdbluni203Doverlineuni203Ftieuni2041asterismuni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Fclosureuni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2060uni2061uni2062uni2063uni2064 zerosuperioruni2071 foursuperior fivesuperior sixsuperior sevensuperior eightsuperior ninesuperioruni207Auni207Buni207Cuni207Duni207Euni207F zeroinferior oneinferior twoinferior threeinferior fourinferior fiveinferior sixinferior seveninferior eightinferior nineinferioruni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094 colonmonetarycruzeiroliramilluni20A6pesetauni20A8won afii57636dongEurouni20ADuni20AEuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5leftharpoonaccentrightharpoonaccentuni20D2uni20D3uni20D6uni20D7uni20DBuni20DCuni20DDuni20DEuni20DFuni20E0uni20E1uni20E5uni20E6uni20E7uni20E8uni20E9uni20EAuni20EBuni20ECuni20EDuni20EEuni20EFuni20F0uni2100uni2101uni2103uni2104uni2105uni2106uni2107uni2109uni210Buni210Cuni210euni210funi2110Ifrakturuni2112 afii61289uni2114 afii61352uni2117 weierstrassuni211BRfrakturuni2120uni2121uni2126uni2127uni2128uni2129uni212Aangstromuni212Cuni212Duni212eescriptuni2130uni2131uni2132uni2133uni2135uni2136uni2137uni2138uni2139uni213auni213buni2141uni2142uni2143uni2144uni214auni214buni214duni214eonethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217F arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupleft arrowuprightarrowdownright arrowdownleft arrowbarright arrowhookleftarrowhookrightcarriagereturnharpoonleftbarbuparrowleftbothalfharpoonupright harpoonupleftharpoonrightbarbuparrowrightbothalfharpoondownrightharpoondownleftharpoonrightleft arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblboth arrowdblbothvarrowsquiggleright universal existentialemptyset Delta.mathgradientelement notelementuni220Asuchthat notcontains ownersmalluni2210uni2213dotplus slashmath backslashmath asteriskmathuni2219 proportionalangledividesnotbarparallel notparallel logicaland logicalor intersectionunionuni222Cuni222Duni222E thereforesimilar reversedtildelazysinv wreathproduct notsimilaruni2242 asymptequalnotasymptequal congruentapproxnotequalnotapproxequaluni2249equivasymptotic approaches equivalence notidenticalmuchless muchgreaternotequivasymptoticnotless notgreater notlessequalnotgreaterequaluni2272uni2273precedesfollows precedesequal followsequal notprecedes notsucceedssubsetsuperset notsubset notsuperset reflexsubsetreflexsuperset notsubseteqlnotsuperseteqluni228C squareimagesquareoriginal subsetsqequalsupersetsqequalintersectionsqunionsq circleplusuni2296circlemultiply circledivide circledot turnstilelefttacklefttackdown perpendicular assertion truestate triangleright trianglelefttriangleftequaltriangrightequalnarylogicaland narylogicalornaryintersection naryuniondotmathuni22C6bowtiepreceedsnotequalfollowsnotequalnotsubsetsqequalnotsupersetsqequaluni2300 ceilingleft ceilingright floorleft floorright integraltp integralbtfrown slurbelow angleleft anglerightuni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23AEblankbblankuni2460uni2461uni2462uni2463uni2464uni2465uni2466uni2467uni2468uni2469SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254BSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A3uni25A4uni25A5H18543 filledrecttriangle triangleinv whitediamondcircle largecircleuni262Cspade heartopen diamondopenclubspadesuitwhiteheartdiamond clubsuitwhiteuni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2740uni2A00uni2A01uni2A02uni2A03uni2A04uni2A09uni2E17cresc_cyrillic dot_cyrillictitlo_cyrillic NameMe.E968 NameMe.E969 NameMe.96A bn_initekaar bn_initaikaarbn_reph bn_kaphala bn_nnaphala bn_taphala bn_thaphala bn_thaphala1 bn_dhaphala bn_naphala bn_below_ba bn_bhaphala bn_raphala bn_laphala bn_half_ka bn_half_kha bn_half_ga bn_half_gha bn_half_nga bn_half_ca bn_half_ca1 bn_half_cha bn_half_ja bn_half_jha bn_half_nya bn_half_tta bn_half_ttha bn_half_dda bn_half_ddha bn_half_nna bn_half_tha bn_half_dha bn_half_da bn_half_na bn_half_pa bn_half_pha bn_half_ba bn_half_bha bn_half_ma bn_half_ya bn_half_ra bn_half_la bn_half_sha bn_half_ssa bn_half_sa bn_half_ha bn_half_rra bn_half_rha bn_half_yyabn_half_asamirabn_half_asamiba bn_khaphala bn_phaphala bn_baphala1 bn_maphala bn_maphala1 bn_yaphalabn_k_rabn_k_ra1bn_kh_rabn_g_rabn_gh_rabn_c_rabn_ch_rabn_j_rabn_tt_ra bn_tth_rabn_dd_ra bn_ddh_rabn_t_rabn_t_ra1bn_th_rabn_d_rabn_dh_rabn_n_rabn_n_ra1bn_p_rabn_ph_rabn_b_rabn_bh_ra bn_bh_ra1bn_m_rabn_y_rabn_sh_rabn_ss_rabn_s_rabn_s_ra1bn_h_ra bn_asamir_ra bn_asamib_ra bn_k_ss_rabn_k_kabn_k_tta bn_k_tt_rabn_k_tabn_k_ta1 bn_k_t_ba bn_k_t_ba1 bn_k_t_ra bn_k_t_ra1 bn_k_t_ra2bn_k_nabn_k_mabn_k_labn_k_ssa bn_k_ss_nna bn_k_ss_mabn_k_sabn_g_gabn_g_dabn_g_dha bn_g_dh_babn_g_labn_g_nabn_g_mabn_gh_nabn_ng_ka bn_ng_k_ra bn_ng_k_ssa bn_ng_k_ss_ra bn_ng_khabn_ng_ga bn_ng_gha bn_ng_gh_rabn_ng_ma bn_ng_ma1bn_c_cabn_c_cha bn_c_ch_ba bn_c_ch_rabn_c_nyabn_c_nabn_j_ja bn_j_j_babn_j_jhabn_j_nyabn_ny_ca bn_ny_chabn_ny_ja bn_ny_jha bn_tt_tta bn_tt_tt_rabn_tt_mabn_dd_ga bn_dd_ddabn_dd_ma bn_nn_tta bn_nn_tt_ra bn_nn_ttha bn_nn_dda bn_nn_dda1 bn_nn_dd_ra bn_nn_dd_ra1 bn_nn_ddha bn_nn_nnabn_nn_mabn_t_ta bn_t_t_babn_t_thabn_t_nabn_t_mabn_t_ma1bn_t_labn_d_gabn_d_ghabn_d_da bn_d_d_ba bn_d_d_rabn_d_dha bn_d_dh_babn_d_nabn_d_bha bn_d_bh_ra bn_d_bh_ra1bn_d_mabn_dh_nabn_dh_mabn_n_tta bn_n_tt_ra bn_n_tthabn_n_dda bn_n_dd_ra bn_n_ddhabn_n_ta bn_n_t_ba bn_n_t_ra bn_n_t_ra1bn_n_thabn_n_da bn_n_d_ba bn_n_d_rabn_n_dha bn_n_dh_ba bn_n_dh_rabn_n_nabn_n_mabn_n_ma1bn_n_sabn_p_ttabn_p_tabn_p_pabn_p_mabn_p_nabn_p_labn_p_sa bn_ph_ttabn_ph_labn_b_jabn_b_da bn_b_d_rabn_b_dhabn_b_nabn_b_bhabn_b_labn_bh_labn_m_tabn_m_thabn_m_dabn_m_nabn_m_na1bn_m_pa bn_m_p_ra bn_m_p_labn_m_pha bn_m_ph_rabn_m_bha bn_m_bh_ra bn_m_bh_ra1bn_m_mabn_m_ma1bn_m_labn_m_la1bn_m_sa bn_m_s_rabn_l_kabn_l_gabn_l_tta bn_l_tt_rabn_l_dda bn_l_dd_rabn_l_tabn_l_dabn_l_dhabn_l_pabn_l_pha bn_l_ph_rabn_l_mabn_l_labn_sh_ca bn_sh_chabn_sh_tabn_sh_nabn_sh_mabn_sh_labn_ss_ka bn_ss_k_ra bn_ss_k_ra1 bn_ss_tta bn_ss_tta1 bn_ss_tt_ra bn_ss_tt_ra1 bn_ss_ttha bn_ss_nnabn_ss_pa bn_ss_p_ra bn_ss_pha bn_ss_ph_rabn_ss_ma bn_ss_ma1bn_s_ka bn_s_k_ra bn_s_k_ra1bn_s_khabn_s_tta bn_s_tta1 bn_s_tt_ra bn_s_tt_ra1bn_s_ta bn_s_t_ba bn_s_t_ra bn_s_t_ra1bn_s_thabn_s_nabn_s_na1bn_s_pa bn_s_p_ra bn_s_p_labn_s_pha bn_s_ph_rabn_s_mabn_s_ma1bn_s_labn_s_la1bn_h_nnabn_h_nabn_h_mabn_h_labn_h_la1bn_rr_gabn_k_babn_g_babn_gh_babn_c_babn_ch_babn_j_babn_tt_babn_dd_babn_nn_babn_t_babn_th_babn_d_babn_dh_ba bn_dh_ba1bn_n_babn_n_ba1bn_p_babn_b_babn_bh_babn_m_ba bn_m_b_rabn_m_ba1 bn_m_b_ra1bn_l_babn_sh_babn_s_babn_s_ba1bn_h_babn_h_ba1 bn_kh_r_ukaarbn_kh_r_uukaar bn_g_ukaar bn_g_r_ukaar bn_g_r_uukaar bn_g_l_ukaar bn_g_l_uukaar bn_j_r_ukaar bn_j_r_uukaar bn_t_r_ukaar bn_t_r_uukaar bn_th_r_ukaarbn_th_r_uukaar bn_d_ukaar bn_d_r_ukaar bn_d_r_uukaar bn_dh_r_ukaarbn_dh_r_uukaar bn_n_ukaar bn_n_uukaar bn_n_rikaar bn_n_t_ukaarbn_n_d_r_ukaarbn_n_d_r_uukaar bn_p_r_ukaar bn_p_r_uukaar bn_p_l_ukaar bn_p_l_uukaar bn_b_r_ukaar bn_b_r_uukaar bn_b_l_ukaar bn_b_l_uukaar bn_bh_r_ukaarbn_bh_r_uukaar bn_m_r_ukaar bn_m_r_uukaarbn_m_p_r_ukaarbn_m_p_r_uukaar bn_r_ukaar bn_r_uukaar bn_l_g_ukaar bn_sh_ukaar bn_sh_r_ukaarbn_sh_r_uukaar bn_sh_l_ukaarbn_sh_l_uukaarbn_ss_p_r_ukaarbn_ss_p_r_uukaar bn_s_ukaar bn_s_uukaar bn_s_rikaar bn_s_t_ukaar bn_s_r_ukaar bn_s_r_uukaarbn_s_p_r_ukaarbn_s_p_r_uukaarbn_s_p_l_ukaarbn_s_p_l_uukaar bn_s_l_ukaar bn_s_l_uukaar bn_h_ukaar bn_h_rikaarbn_asamir_ukaarbn_asamir_uukaarbn_asamib_ukaarbn_asamib_uukaarbn_asamib_r_ukaarbn_asamib_r_uukaar bn_k_hasanta bn_kh_hasanta bn_g_hasanta bn_gh_hasanta bn_ng_hasanta bn_c_hasanta bn_ch_hasanta bn_j_hasanta bn_jh_hasanta bn_ny_hasanta bn_tt_hasantabn_tth_hasanta bn_dd_hasantabn_ddh_hasanta bn_nn_hasanta bn_t_hasanta bn_th_hasanta bn_d_hasanta bn_dh_hasanta bn_n_hasanta bn_p_hasanta bn_ph_hasanta bn_b_hasanta bn_bh_hasanta bn_m_hasanta bn_y_hasanta bn_r_hasanta bn_l_hasanta bn_sh_hasanta bn_ss_hasanta bn_s_hasanta bn_h_hasanta bn_rr_hasanta bn_rh_hasanta bn_yy_hasantabn_asamir_hasantabn_asamib_hasanta bn_post_k_raglyph569glyph570glyph571glyph572glyph57487 bn_baphala bn_below_ba2glyph578glyph579glyph580glyph581glyph582glyph583 bn_sh_ra.001bn_yaphala.002bn_d_yabn_n_ya bn_la.001bn_sh_yabn_ss_yabn_s_yaglyph593bn_h_yaglyph595 bn_ss_tta.002glyph597glyph598 bn_uukaar.1glyph600A.002A.003uni091F_nuktadeva.nuktuni0920_nuktadeva.nuktglyph240glyph241uni0908_anusvaradeva.abvsuni0947_uni0901.abvsuni094B_uni0901.abvsglyph245glyph246glyph247uni0939_uni094D.halnglyph249uni091B_uni094D.halnuni0939_uni0944.blwsuni0915_uni094D_uni0937.akhnuni091C_uni094D_uni091E.akhnuni924_94D.half_924.presuni924_930_94D.blwf.vatuuni936_94D.half_91A.presuni936_930_94D.blwf.vatuuni936_94D.half_935.presuni95B_930_94D.blwf.vatuuni92B_930_94D.blwf.vatuuni95E_930_94D.blwf.vatuuni92A_930_94D.blwf.vatuuni938_930_94D.blwf.vatuuni0930_uni0941.blwsuni0930_uni0942.blwsuni915_94D.half_928.presuni0916_094D.half_0928.presuni0918_094D.half_0928.presglyph269uni0915_uni094D.halfuni0916_uni094D.halfuni0917_uni094D.halfuni0918_uni094D.halfuni091A_uni094D.halfglyph275uni091C_uni094D.halfuni091D_uni094D.halfuni091E_uni094D.halfuni0924_094D.half_0928.presuni0925_094D.half_0928.presuni0926_094D.half_0928.presuni0927_094D.half_0928.presuni0923_uni094D.halfuni0924_uni094D.halfuni0925_uni094D.halfuni926_94D.hlf2_926_94D.presuni0927_uni094D.halfuni0928_uni094D.halfglyph289uni092A_uni094D.halfuni092B_uni094D.halfuni092C_uni094D.halfuni092D_uni094D.halfuni092E_uni094D.halfuni092F_uni094D.halfuni092A_094D.half_0928.presglyph297uni0932_uni094D.halfuni0933_uni094D.halfuni0934_uni094D.halfuni0935_uni094D.halfuni0936_uni094D.halfuni0937_uni094D.halfuni0938_uni094D.halfuni0939_uni094D.halfglyph306uni092C_094D.half_0928.presglyph308uni092E_094D.half_0928.presuni0935_094D.half_0928.presuni0936_094D.half_0928.presuni0915_094D.half_0915.presuni0919_094D.half_0915.presuni0919_094D.half_0916.presuni0919_094D.half_0917.presuni0919_094D.half_0918.presuni091E_094D.half_091C.presuni0926_094D.half_0918.presuni0926_094D.half_0926.presuni0926_094D.half_0927.presuni0926_094D.half_092C.presuni0926_094D.half_092D.presuni0926_094D.half_092E.presuni0926_094D.half_092F.presuni0926_094D.half_0935.presuni091F_094D.half_091F.presuni091F_094D.half_0920.presuni0920_094D.half_0920.presglyph329glyph330glyph331uni0939_094D.half_092E.presuni0939_094D.half_092F.presuni0932_094D.half_0939.presglyph335u9_38_4D.hlf_24_4D_30prespresglyph337uni0930_uni094D_afii301.halfu91A_94D.hlf2_91A_94D.halfuni0938_0928_094D.half.presglyph341glyph342glyph343glyph344glyph345glyph346glyph347glyph348glyph349uni915_94D_937.akhn_94D.halfu91C_94D_91E.akhn_94D.halfglyph352u924_94D.half_930_94D.blwf.vatuglyph354glyph355glyph356glyph357glyph358glyph359uni939_930_94D.blwf.blwsuni0930_uni094D.rphfuni0930_uni094D.blwfuni093E_uni0901.abvsuni093E_anusvaradeva.abvsglyph365glyph366glyph367glyph368glyph369uni0947_anusvaradeva.abvsglyph371glyph372uni0948_anusvaradeva.abvsglyph374glyph375glyph376glyph377glyph378u9_38_4Dhalf1F_30_4Dblwfvtu2glyph380glyph381uni0928_094D.half_0928.presuni0919_uni094D.halfuni091F_uni094D.halfuni0920_uni094D.halfuni0921_uni094D.halfuni0922_uni094D.halfuni0926_uni094D.halfuni915_930_94D.blwf.vatuuni916_930_94D.blwf.presuni917_930_94D.blwf.presuni918_930_94D.blwf.vatuuni919_930_94D.blwf.vatuuni91A_930_94D.blwf.vatuuni91B_930_94D.blwf.vatuuni91C_930_94D.blwf.vatuuni91D_930_94D.blwf.vatuuni91E_930_94D.blwf.vatuuni91F_930_94D.blwf.vatuuni920_930_94D.blwf.vatuuni921_930_94D.blwf.vatuglyph402uni923_930_94D.blwf.vatuuni0924_uni094D_uni0930.presuni925_930_94D.blwf.vatuuni926_930_94D.blwf.vatuuni927_930_94D.blwf.vatuuni928_930_94D.blwf.vatuuni92C_930_94D.blwf.vatuuni92D_930_94D.blwf.vatuuni92E_930_94D.blwf.vatuuni92F_930_94D.blwf.vatuuni930_930_94D.blwf.vatuuni932_930_94D.blwf.vatuuni936_94D.hlf2_932_94D.presuni937_94D.half_91F.presuni937_94D.half_920.presglyph418glyph419glyph420uni936_94D.hlf2_928_94D.presu938_4D.hlff24_4D.30_4Dbfvtuprsu926_94D.half_92E_94D.half.presuni924_94D.hlf2_928_94D.presuni939_94D.half_923.presuni939_94D.half_932.presuni939_94D.half_935.presu92A_94D.half_924_94D.half.presuni939_94D.half_928.presu939_94D.half_92E_94D.half.presu92A_94D.half_930_94D.blwf.vatuuni0919_nuktadeva.nuktuni0939_nuktadeva.nuktglyph434uni91F_93C.nukt_94D.halnuni920_93C.nukt_94D.halnuni095C_uni094D.halnuni095D_uni094D.halnglyph439uni939_93C.nukt_94D.halnuni919_93C.nukt_94D.halnu937_94D.half_91F.pres_94D.halnu937_94D.half_920.pres_94D.halnu939_94D.half_923.pres_94D.halnu939_94D.half_928.pres_94D.halnu939_94D.half_932.pres_94D.halnu939_94D.half_935.pres_94D.halnuni092B_nuktadeva_uni094D.nuktuni091C_nuktadeva_uni094D.nuktuni0A95_uni0ACD.halfuni0A96_uni0ACD.halfuni0A97_uni0ACD.halfuni0A98_uni0ACD.halfuni0A9A_uni0ACD.halfuni0A9C_uni0ACD.halfuni0A9D_uni0ACD.halfuni0A9E_uni0ACD.halfuni0AA3_uni0ACD.halfuni0AA4_uni0ACD.halfuni0AA5_uni0ACD.halfuni0AA7_uni0ACD.halfuni0AA8_uni0ACD.halfuni0AAA_uni0ACD.halfuni0AAB_uni0ACD.halfuni0AAC_uni0ACD.halfuni0AAD_uni0ACD.halfuni0AAE_uni0ACD.halfuni0AAF_uni0ACD.halfuni0AB2_uni0ACD.halfuni0AB3_uni0ACD.halfuni0AB5_uni0ACD.halfuni0AB6_uni0ACD.halfuni0AB7_uni0ACD.halfuni0AB8_uni0ACD.halfuni0AB9_uni0ACD.halfuniA95_ACD_AB7.akhn_ACD.halfuAA4_ACD.half_AA4_ACD.half.presuniAA4_ACD.half_AB0_ACD.vatuuAA8_ACD.half_AA8.pres_ACD.presuAB6_ACD.half_AB0_ACD.blwf.vatuuA96_ACD.half_AB0_ACD.blwf.vatuuA97_ACD.half_AB0_ACD.blwf.vatuuA98_ACD.half_AB0_ACD.blwf.vatuuA9A_ACD.half_AB0_ACD.blwf.vatuuA9C_ACD.half_AB0_ACD.blwf.vatuuAA5_ACD.half_AB0_ACD.blwf.vatuuAA7_ACD.half_AB0_ACD.blwf.vatuuAA8_ACD.half_AB0_ACD.blwf.vatuuAAA_ACD.half_AB0_ACD.blwf.vatuuAAC_ACD.half_AB0_ACD.blwf.vatuuAAD_ACD.half_AB0_ACD.blwf.vatuuAAE_ACD.half_AB0_ACD.blwf.vatuuAB8_ACD.half_AB0_ACD.blwf.vatuuni0A87_uni0A82.abvsuni0A88_uni0A82.abvsuni0A89_uni0A82.abvsuni0A8A_uni0A82.abvsuniA95_ACD.half_A95.presuniA95_AB0_ACD.blwf.vatuuni0A9C_uni0ABE.pstsuni0A9C_uni0AC0.pstsuniA9C_AB0_ACD.blwf.vatuuniA9D_AB0_ACD.blwf.vatuuni0A9F_uni0ACD_uni0A9F.presuni0A9F_uni0ACD_uni0AA0.presuni0AA0_uni0ACD_uni0AA0.presuni0AA1_uni0ACD_uni0AA1.presuni0AA1_uni0ACD_uni0AA2.presuniAA6_AB0_ACD.blwf.vatuuni0AA6_uni0ACD_uni0AAE.presuni0AA6_uni0ACD_uni0AA6.presuni0AA6_uni0ACD_uni0AA7.presuni0AA6_uni0ACD_uni0AB5.presuniAAB_AB0_ACD.blwf.vatuuni0AB0_uni0AC1.blwsuni0AB0_uni0AC2.blwsnounicode_3_1_cduAB5_ACD.half_AB0_ACD.blwf.vatuuniAB6_ACD.half_AB5_ACD.presuniAB9_AB0_ACD.blwf.vatuuniAB9_ACD.half_AAE.presuniAB9_ACD.half_AAF.presuAB6_ACD.half_AA8.pres_ACD.presuniAB6_ACD.half_A9A_ACD.presuni0AA2_uni0ACD_uni0AA2.presuni0A95_uni0ACD_uni0AB7.akhnuniAA4_ACD.half_AA4.presuniAA4_AB0_ACD.blwf.vatuuniAA8_ACD.half_AA8.presuniAB6_AB0_ACD.blwf.vatuuniA96_AB0_ACD.blwf.vatuuniA97_AB0_ACD.blwf.vatuuniA98_AB0_ACD.blwf.vatuuniA9A_AB0_ACD.blwf.vatuuniAA5_AB0_ACD.blwf.vatuuniAA7_AB0_ACD.blwf.vatuuniAA8_AB0_ACD.blwf.vatuuniAAA_AB0_ACD.blwf.vatuuniAAC_AB0_ACD.blwf.vatuuniAAD_AB0_ACD.blwf.vatuuniAAE_AB0_ACD.blwf.vatuuniAB8_AB0_ACD.blwf.vatuuniAB5_AB0_ACD.blwf.vatuuniAB6_ACD.half_AB5.presuniAB6_ACD.half_AA8.presuniAB6_ACD.half_A9A.presglyph407glyph408glyph409uni0AB0_uni0ACD.rphfglyph411uni0AB0_uni0ACD.blwfuniAB7_ACD.half_AA0.presuniAB7_ACD.half_A9F.presuA_B7_CD.half_9F_B0_CD.blwfvatuuA_B7_CD.half_A0_B0_CDblwfvatuglyph417glyph421uniA9F_AB0_ACD.blwf.vatuuni0A9C_uni0ACD_uni0A9E.akhnglyph424uniAA1_AB0_ACD.blwf.vatuuniAA0_AB0_ACD.blwf.vatuuniAA2_AB0_ACD.blwf.vatuglyph428glyph429glyph430glyph431glyph432glyph433glyph435glyph436glyph437glyph438glyph440glyph441uni0AC7_uni0A82.abvsglyph443glyph444glyph445glyph446glyph447glyph448glyph449glyph450glyph451glyph452glyph453uni0A95_uni0ABC.nuktuni0A96_uni0ABC.nuktuni0A97_uni0ABC.nuktuni0A98_uni0ABC.nuktuni0A99_uni0ABC.nuktuni0A9A_uni0ABC.nuktuni0A9B_uni0ABC.nuktuni0A9C_uni0ABC.nuktuni0A9D_uni0ABC.nuktuni0A9E_uni0ABC.nuktuni0A9F_uni0ABC.nuktuni0AA0_uni0ABC.nuktuni0AA1_uni0ABC.nuktuni0AA2_uni0ABC.nuktuni0AA3_uni0ABC.nuktuni0AA4_uni0ABC.nuktuni0AA5_uni0ABC.nuktuni0AA6_uni0ABC.nuktuni0AA7_uni0ABC.nuktuni0AA8_uni0ABC.nuktuni0AAA_uni0ABC.nuktuni0AAB_uni0ABC.nuktuni0AAC_uni0ABC.nuktuni0AAD_uni0ABC.nuktuni0AAE_uni0ABC.nuktuni0AAF_uni0ABC.nuktuni0AB0_uni0ABC.nuktuni0AB2_uni0ABC.nuktuni0AB3_uni0ABC.nuktuni0AB5_uni0ABC.nuktuni0AB6_uni0ABC.nuktuni0AB7_uni0ABC.nuktuni0AB8_uni0ABC.nuktuni0AB9_uni0ABC.nuktuniAA3_ACD.half_AB0_ACD.vatuuni0AA3_uni0AB0_uni0ACD.vatuuni0A30_uni0A4D.blwfuni0A35_uni0A4D.blwfuni0A39_uni0A4D.blwfuni0A2F_uni0A4D.pstfglyph152glyph153glyph154glyph155glyph156glyph157uniA30_A4D.blwf_A41.blwsuniA39_A4D.blwf_A41.blwsnounicode_3_1_3glyph161uni0A30_A4D.blwf_A42.blwsuniA39_A4D.blwf_A42.blwsnounicode_3_1_2fnounicode_3_1_30uni0A28_uni0A42_uni0A70.abvsuni0A3E_uni0A02.abvsuni0A09_uni0A71.pstsuni0A0A_uni0A71.pstsuni0A13_uni0A71.pstsuni0A15_uni0A3C.nuktuni0A18_uni0A3C.nuktuni0A19_uni0A3C.nuktuni0A1A_uni0A3C.nuktuni0A1B_uni0A3C.nuktuni0A1D_uni0A3C.nuktuni0A1E_uni0A3C.nuktuni0A1F_uni0A3C.nuktuni0A20_uni0A3C.nuktuni0A22_uni0A3C.nuktuni0A23_uni0A3C.nuktuni0A24_uni0A3C.nuktuni0A25_uni0A3C.nuktuni0A26_uni0A3C.nuktuni0A27_uni0A3C.nuktuni0A28_uni0A3C.nuktuni0A2A_uni0A3C.nuktuni0A2C_uni0A3C.nuktuni0A2D_uni0A3C.nuktuni0A2E_uni0A3C.nuktuni0A2F_uni0A3C.nuktuni0A30_uni0A3C.nuktuni0A35_uni0A3C.nuktglyph194uni0A39_uni0A3C.nuktuni0A05_uni0A3C.nuktuni0A06_uni0A3C.nuktuni0A07_uni0A3C.nuktuni0A08_uni0A3C.nuktuni0A09_uni0A3C.nuktuni0A0A_uni0A3C.nuktuni0A0F_uni0A3C.nuktuni0A10_uni0A3C.nuktuni0A13_uni0A3C.nuktuni0A14_uni0A3C.nuktuni0A06_uni0A02.abvsglyph207uniA35_A4D.blwf_A41.blwsuniA35_A4D.blwf_A42.blwsuniA30_A4D.blwf_A4D.blwsuniA39_A4D.blwf_A4D.blwsuniA35_A4D.blwf_A4D.blwsffffiffluniFB05 m_n_armenian m_e_armenian m_i_armenian v_n_armenian m_x_armenianuniFB1DuniFB1EyodyodpatahhebrewayinaltonehebrewuniFB21uniFB22uniFB23uniFB24uniFB25uniFB26uniFB27uniFB28uniFB29shinshindothebrewshinsindothebrewshindageshshindothebrewshindageshsindothebrewalefpatahhebrewalefqamatshebrewalefdageshhebrewbetdageshhebrewgimeldageshhebrewdaletdageshhebrewhedageshhebrewvavdageshhebrewzayindageshhebrewtetdageshhebrewyoddageshhebrewfinalkafdageshhebrewkafdageshhebrewlameddageshhebrewmemdageshhebrewnundageshhebrewsamekhdageshhebrewpefinaldageshhebrewpedageshhebrewtsadidageshhebrewqofdageshhebrewreshdageshhebrewshindageshhebrewtavdageshhebrewvavholamhebrew betrafehebrew kafrafehebrew perafehebrewaleflamedhebrewuniFFFDuni10380uni10381uni10382uni10383uni10384uni10385uni10386uni10387uni10388uni10389uni1038auni1038buni1038cuni1038duni1038euni1038funi10390uni10391uni10392uni10393uni10394uni10395uni10396uni10397uni10398uni10399uni1039auni1039buni1039cuni1039duni1039funi103a0uni103a1uni103a2uni103a3uni103a4uni103a5uni103a6uni103a7uni103a8uni103a9uni103aauni103abuni103acuni103aduni103aeuni103afuni103b0uni103b1uni103b2uni103b3uni103b4uni103b5uni103b6uni103b7uni103b8uni103b9uni103bauni103bbuni103bcuni103bduni103beuni103bfuni103c0uni103c1uni103c2uni103c3uni103c8uni103c9uni103cauni103cbuni103ccuni103cduni103ceuni103cfuni103d0uni103d1uni103d2uni103d3uni103d4uni103d5uni10900uni10901uni10902uni10903uni10904uni10905uni10906uni10907uni10908uni10909uni1090auni1090buni1090cuni1090duni1090euni1090funi10910uni10911uni10912uni10913uni10914uni10915uni10916uni10917uni10918uni10919uni1091auni1091buni1091fÿÿBƒ„„…‹ŒŒ‘•––—œž£¤¤¥«¬¬­¯°°±µ¶¶·¼½½¾ÃÄÅÆÕÖרíîïð-./0^__`Ÿ ¹ºº»ÀÁÂÃîïïðÑÒØÙ¥¦¦§$%%&&''(efghhiijmnnoopst}~€ŒŽËÌÌÍéêëì"#%&&''(12346789mntuwxxy } ~ – — Ï Ð Ò Ó Ó Ô Ô Õ Õ Ö Ø Ù ^ _ _ ` ` a b c d e i j j k l m m n v w w x — ˜ š › œ  ž ¨ © © ª ­ ® ® ¯ ² ³ ³ ´ ¸ ¹ ¹ º º » » ¼ Á  Â à Ã Ä Ä Å Å Æ Ç È Ñ Ò Ò Ó Ý Þ Þ ß ß à à á ä å å æ ø ù ù ú ú û û ü                " # # $ & ' ' ( 5 6 6 7 = > > ? E F F G G H H I I J J K b c c d d e e f f g g h n o o p q r r s t u u v v w w x z { { | } ~ ~  „ … … † † ‡ ‡ ˆ ‹ Œ Œ — ˜ ˜ ™ š › › œ œ  ž ¡ ¢ ¤ ¥ § ¨ ¨ © © ª ª « ¼ ½ ¿ À Ú Û Ý Þ       $ % & ' ' ( * + + , , - 4 5 S T T U Y Z Z [ o p p q z { { | • – – — — ˜ ˜ ™ › œ ¤ ¥ « ¬ ­ ® µ ¶ ¶ · · ¸ ¸ ¹ Ã Ä Ä Å ê ë ë ì ø ù ù úKLLMijjkkllmmnnostuvwxxy{|‡ˆŠ‹“”»¼ÁÂÃÄÅÆÇÈÉÊåææçòóóôýþþÿ0112 , $ÿþ ÿþ 5 W ¾ ñ ö4DFLTzarmn†beng”bng2¶cyrlØdev2âdevageor"gjr2,grekJgujrTgur2rguruˆhebržlatn®phnxºsyrcÄtml2ÎugarØxpeoâÿÿÿÿÿÿ  #%),ÿÿ  #%),ÿÿÿÿ   (*-ÿÿ   (*-ÿÿÿÿ  !&+.ÿÿÿÿ  "&+.ÿÿ $'ÿÿ $'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/aaltabvs"abvs(abvs.akhn4akhn:akhn@blwfFblwfLblwfRblwfXblws^blwsdblwsjblwspccmpvdlig|dlig‚fracˆhalfŽhalf”halfšhaln haln¦hlig¬init²liga¸liga¾nuktÄnuktÊnuktÐpresÖpresÜpresäpresìpstfòpstføpstsþpstspsts rephrphfrphfrphf"vatu(vatu.vatu60)('&%$#  .-" ! ,+*/   1dlt|„Œ”œ¤¬´¼ÄÌÔÜäìôü $,4<DLT\dlt|„Œ”œ¤¬´¼ÄÌÔÜ䈎. ,N`–¦¶ÆäîþBn~Ž * š Ìœ¬Ø„°ìüÌHZxè²  4 b$ $Î%(&*&V&n&Ð'²)‚)®œÇÈž"JT^hr|†š¤®¸ÂÌÖàêôþ&0:DNXblv€Š””i•i–i—i˜i™iši›iœiižiŸi i¡i¢i£i¤i¥i¦i§i¨i©iªi«i¬i­i®i¯i°i±i²i³i´iµiGhÂ",6@J^hr|†š¤®¸t]u]v] ÷]]nw] 5] 6]x]y]]nz]{] ø] @] h]89:<?BCDENR\ A gî(V`jt~ˆ’œ¦°ºÌÖàêôþ&0:DNXblv€Š”ž¨²¼ÆÐÚäèéêëìíîïðñ ÏÏ#$ÐÑÒÓ%ÔÕÖרÙÚÛÜÝÞß'àáâãäåçí%&" UxfwxPGN"  CnZ DnA8? ËË»ž6 , ŒŠ„ÿ••“¦¡„mxa °nS  eË e˸ßöBHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðдֹֺ+¹+º½´¾´¿´À´Á´Â´Ã´Å´Æ´Ç´È´É´Ë´Í´Î´Ñ´Ó´Ô´Õ´Ö´×´Â²¾·È·Ñ·ÐÐ%'01ɽ°Ú6 "(ýIOüILûOúLùII*  ¸"¹"º"oxa ±nSŠ &0:DNXblv€ fË gË hË iË kË lË Ë nË oË pË oË ž¬­®°±´µ¸¹ßJ<FPZdnx‚Œ– ª´¾ÈÒÜæðú",6@ x x x x xxxxxxxxxxxxxxxxxxx x!x"x#xGJLLNPUWY` bhUU +\fpz„Ž˜¢¬¶ÀÊÔÞèòü$.8BLVblv€Š”ž¨²¼ÆÐÚäîø Un Vn Wn Xn Æn Yn [n \n ]n Çn Èn Én Ên bn cn dn Ën fn gn in jn kn ln mn nn ™nð ™n qn rn sn tn un vn wn xn ¥n ¦n §n ©n ªn «n š Y yn8=?KM\ C E# G I& Y Y) Å Å*Â%PZdnx‚Œ– ª´¾ÈÒÜæðú",6@JT^hr|†š¤®¸ qË rË sË tË uË vË xË yË zË {Ë |Ë }Ë ~Ë Ë €ËÌË Ë ƒË ‚Ë „Ë …Ë †Ë ‡Ë ˆË ‰Ë ŠË ‹Ë ŒË Ë ŽË Ë Ë ‘Ë ’Ë “Ë ”Ë •Ëž½ÎÐ ßà#»"*   –Ë —Ë ›ËŸ³·¦&Pf Ð ' Ð " Ö ' Ö Ñ ' Ñ Ò ' Ò " × ' × Ô ' Ô Ø ' Ø*  foOo,odh)Xblv€Š”ž¨²¼ÆÒÜæðú",6@JT^hr~Š”ž¨²¼ÆÐÚäú:oZo[o\o]o=o>ovozoyo{o·axWo^oDo_o`oaoIobocodoYoeo(o)o*o+o¶ax%ax-o.o/o0o1o2o3oMo'osRorQo4o GJLLNOQ_eegg  "!% ã ±R’!HR\fpz„Ž˜¢¬¶ÀÊÔÞèòü$.8BLV`jt~ˆ Ì ± Ï ± Ð ± Ñ ± Ò ± Ó ± Ô ± Õ ± Ö ± × ± Ø ± Ú ± F ± Ü ± Ý ± Þ ± ß ± M ± K ± à ± á ± â ± ä ± å ± H ± N ± J ± L ± ¨ ± ö ± Â Ö é ä ê ä!8;<=>?@ABCDFGHIJKMNOPQSUY[wz c i w ç èV>HR\fpz„Ž˜¢¬¶ÀÊÔÞèòü$.8BL œ o ž o Ÿ o   o ¡ o ¢ o £ o ¤ o ¥ o ¦ o § o ¨ o ª o « o ¬ o ­ o ¯ o ° o ± o ² o ´ o µ o ¶ o · o ¸ o º o ¼ o ½ ož¡£¥¨«­· º½àà Ë Ëþ 4@VbŒ– ªØêô@xR?xQAxRCxTBxSTxT "HxdGxYFxXEx_9G$XZ "(SLxNdxgdiLhZ qQpR&xRx QRSTX  Xh $.@ZŒž¨òü Í ± Î ± 8 QK ’E ‘D : &, ôK òX ñU ðF ”R “Q ŽC B C  &,28>D î m ŒX ‹R ŠQ ‰P ˆO ‡J †I …;VV Q`P_ 9: U e x Ç È Ë"@:DNZdv€Š”®¸ÒÜæø  J\n¨ÊÜæ Í ± Î ± ÛnS › g 8 QK RK SK „? ï g ^K EG _K ’E ‘D : aK ÅK ó c oK zK |K •\ }K $ ì g æ q ~K IX G= èC çB í ¨ — Û"(.4 õ m ôK òX ñU ðF ”R “Q  ƒ; ‚: 9 €8 ŽC B C $*06<BHNT î m ŒX ‹R ŠQ ‰P ˆO ‡J †I …; e Ë `K9:G[ U V X ] c d e f g i k m q t u v w x Æ Ç È Ëš:d®àê,NhФ¾TÖ"T^ØJ|ÖXz„ $ ¹ ¶ ± ® ÿ­  &,28>D μ ʹ ɶ ȱ Å ¨ Á­ À ¤ ¿¨ ¾ž &, Õ¶ Ô± Ó¹ Ѱ Я Ï  Ö±$*06< ß¶ Ý¡ Ü  ÛŸ Ú ½ Ù Ë Ø œ מ  æ± ä ¢ â¤ á£ ê§ é¦ ç¥  î¦ í¥ ì¤ ë£ ñ¶ ð ¤ ï¨ ô¶ óª ò $*06< þ¶ ý¬ ü« ú ¦ øª ÷© ö ¤ õ¨ ¶ ±$*06< ¶  ² µ °  « ¯ ¡  "(.4:@FLRX^djpv| (¼ &¶ %± $ ¬ "° ! « ¯ ®  ¨ ­ «  ¦ ª ©  ¤ ¨"(.4 /¼ .¹ -± ,¶ +² *­ )¨ 1¹ 0¨ &, 8¹ 7µ 5° 4 « 3¯ 2¥ 9¹ &,28>DJPV\bhnt L ¸ K¼ I¹ G¶ E ² Dµ C ° B³ A . @ ¯ ?² =± <¯ ;® :­$*06<BHNTZ`fl Z¹ Y¶ X ° W³ V² U° T¯ S­ R ¦ Qª P ¤ O¨ N  Mž &, `¹ _¶ ^± ]­ \¤ [£ $*06<BHNT n¶ m ° l³ k ¯ j² i¬ h© f ¤ d¨ b œ až"(.4:@FLRX^djpv| †¹ „¶ ƒ ° ‚³  . € ¯ ² }± |® z ¨ x­ v ¤ t¨ sŸ q œ pž  ‹¹ ж ‰± ˆ¬   Í˶ ÌË¬Ì q s t u v y { | ~ € ‚ ƒ „ … † ‡ ˆ ‰ Œ Ž ‘ ËZ &@ö"ÆÂø"õô÷"Çø¹º&  KoJnknaD.  Pc Ob ¯ ± BeS\Î:z„– ª´¾ÈÒÜæø  *4FPbl†˜ª¼Îàò(:L^p‚”¦°ÂÌÖàêô"4FXbt†˜ª¼ Ž  ­à     ‘  ’  “  ”  •  –  —  ¸à ™  š  œ  ž  Ÿ     ¡  ÒÄ Ñà ¥  Ôà ¦  §  èÅ çà ©  êÄ éà ìÄ ëà ¬Ä «Ã ¯Ä ®Ã ³Ä ²Ã µÄ ´Ã ·Ä ¶Ã ºÄ ¹Ã ¼Ä »Ã ÄÄ Ãà ÈÄ Çà ÌÄ Ëà ÎÄ Íà ÖÄ Õà àÄ ßà îÄ íà à  ±Ä °Ã ã  è        Àà     ÂÄ Áà ÆÄ Åà ÊÄ Éà ÐÄ Ïà Óà ØÄ ×à ÚÄ Ùà Þà y  âÄ áà äÄ ãà æÄ åÃ:ž ¡£¤¥¨ª¬­¯°±²´µ¶¸¹º¼½ßà ž Ÿ £ ¨ ª « ¬ ¯ ± ² ´ ¶ ¸ ¼ Á Ó â ç ÿ    ! . 8 @ N ` k x € †, "òëÊ2Ëëî T$.858687888Šm8‰mˆ8<=>?sô "FPrœ¾àê 9%  µ °% ´ ° ³% ²$ · °  » ® º ° ¹% :$ $ ¾ ® ½ ° ¼% = > a ®  à ® ¿ ° ;$Ž%  À ° < >% b ® >$ Á% +_ahilm ° À*  Ì3Í3Î3ñòõ <m;kNZ*6BN %ð › &ð › (ð › )ð › *ð › ,𠛯±º»¼½Æ&0:DNXblv€Š”ž¨²¼ An ?n ün ýn ún ûn Ù ±nnnnnnn ÿn þn>\xy 5 6 ’ ç è ð ñ ò ô ÷ ø ùÂ%PZdnx‚Œ– ª´¾ÈÒÜæðú",6@JT^hr|†š¤®¸ ïË ðË ñË òË óË ôË õË öË ÷Ë øË ùË úË ûË üË ýË þË ÿË Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ë Ëž½ÎÐ ßà#*   7 ° 8 ° ®%.| °œÇÈ ”:DFLTzarmnˆbeng”bng2 cyrl¬dev2¼devaÐgeorägjr2ðgrekgujr gur2guru(hebr2latn>phnxNsyrcZtml2fugarrxpeo~ÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ abvmPabvmVblwm\blwmbkernhkernnlfbdtmarkzmark€markˆmkmk”mkmkšrtbd       (0:BJRZbjrz„’š‚Ø ¬ >2¦êÈ6*  &\&¨'À/44R9†=8=>ÈŽä P¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLRX^djpv|uØ}ØHØ“ÙÁØuØuØQØTØ6ØCØÆØTؾØSØØCØrظØnØØ`Ø=ØyØ6Ø6Ø«ØLØTØ<ØŸØ™ØÒØ»ØnØYØiØuØ!ðô!è!Q!!|!ó!!ü!!A!!!!6!!Ý!å!¯£ô!!ÿ!X!W!„!o!!ü!!;!!ø!väÏT!P!!ר]}ÚGú iikmpqvŸ¡¶/»¾EÀÁIÆÊK  ¡¦¨ÞàáÒÓÔÕ _ 28>DJPV\bhntÿ].ÿL7ÿW.ÿT+ÿZ.ÿ^=ÿ@.ÿ<#ÿ:%ÿ_8ÿc8ÿ 0&6 ÿXèÿX·ÿW¾¢ÔÕÖþÑ{Pž® ræìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†ŒX:|bXX“k’ÜX.¤ÿþW†:†lP1mXÛMW;ÿÿ†ÿ8nXÿ8lœÿþÿ8ÿ8nòœ÷ñaôiïj:´;ÚS€`xZNÆX¤ÿð††ÿ8mcƒlXÿ8úÿ8úú pÿ8úÿ8úÿ8†lœÿ8ÿ8ÿ8©ÿ8W÷©ÿ8$=D]ˆˆ4¡¡5¨¨67899HH;PR<WW?ZZ@^^AbeBggFqqGttH‘”IïùMûüXþZ  _`a&&g//h44i:;j==lAEm¶¹¼ÀÃÇ ÉÓÙÜååçéíî!óö#ùú'üü)ÿÿ*+ Ž Ž, ’ •-1ÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæÿKÿ]ÿÿÿXÿbÿþÿTÿ\ÿ\ÿ[þòÿ(ÿ ÿÿ#ÿ ÿ"ÿZÿXÿYÿVÿWÿZÿÿþÑþÒÿ ÿ ÿþÿÿþìÿZÿ"ÿFþÝÿýþöÿÿþÐÿÿþöÿÿþòÿÿþòÿÿþàÿÿþÏÿÿþÏÿÿþÏÿÿþÏÿÿÿÿÿÿÿŠn  &,28>DJPV\Xÿü=ÿÿ’ÃÿüÄaÿÿàDo6¿xÿþ $(,28<DHLRX\ÈÿjÿÿÆ–Ò ²¸ÊÐâèú$6<NTfl~¢¨®ÀÒäþ"4N`r„ž°ÂÔî$>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.HZlrx~„Á'ê$ ––ÐJ– ––°Á'ð# ––€X– ––Ð' –– + ––À–3 ––€ñ ––€…–A ––€Ì ––   ––€q– w] ––`´^ ––ÐÀ ––@Ý ––°––0„] ––@º^ ––Ð À ––@Ý ––À–– ÿî] ––@^ ––ÀŒÀ –– F ––À––@v] ––@¬^ ––ÐÀ –– Ý ––°–– v] ––P­^ ––ÀÀ –– Ý ––À–– ƒN NS“PKB~Ü|À|ƒN NSˆPKB~Ü|ÀzÍNgN’‡™K¸~W|‰µ†zºNZN}„…JB~Ü|ºzŸN@NlƒjKL~Ü|¸zþÄO ––0––0ÿìO ––@ÿXË –– Oÿ‰›ÿ%›ÿUßÿUœ„Œ–¤¬°¶½ÄÅÖ×îï./¢¦ ¡£©$ÿŽ4ÿ3ÿLRÿ h†Ò oàæìòøþ "(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntOÙ3Ù}Ù[ÙXÙXÙ“ÙkÙŽÙ{ÙXÙŒá¤×pá†Ù3Ù†ÙeÙOÙ4ÙmÙXÙÛÙMÙWÛ?Ù únÌoçnçfÌoç ¿ödøújá†Ù3Ù´‡;ÙÚ`æxæ^èNäWÛÂÌXٟ݆نÙ9ÐmÙmÙ?Ù&Ùøú?Ùmú úúýeú‡oç WÛúú.#ç}Ùýççç²”´o$%&'()*+,-./0123456789:;<=DFHJKLMNOPQRSTUVXZ\]ˆš¡¨óHPQRVWZ^bcdegqrtvyz{|ßïðñòôõøùûüþ /12347:;=ABCDE__ µÝäææêì ðò#÷ø&ûû(ýþ)+- ~ : ‚ …< Š Š@ A B – –CD$*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤¢ÿ^ÿOÿUÿR>ÿX>ÿRAÿUÿUÿUÿÿUÿ/ÿUÿU#ÿU ÿ:ÿU,ÿX,ÿSÿ[ÿXÿUÿRÿUþÐÿBÿBÿ=ÿXÿ&ÿUÿ0ÿÿ3ÿ>ÿsÿ=ÿ[þîÿþÒþÒþÒþÖTþþþñþóþíþúÿ þþÿþòþÿþþþëþ÷þöþöþöþÍÿÉþÛþ¸ÿÿÌÿ2:.@  åÙYÙh ¹ 28RX»ÿy þ: >~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìSSS l SSSmb SS/<yvh^h^hbh‚hlp’hãhMŒ/h¤hjhƒhAh‚hjhKl5hkoU­ÝhQvUÇ3h‚MÐkBkBÚRnR û¹ò0ö0böùåî$= D]$ÔÕÖרר € † ‡ ˆ ‰ ‹ Œ ‘FLRX^djpv|‚ˆŽ”š ¦þâÿþó þ^÷þ¤Aþ¤dþûnÿ1;ÿQ(ÿ<ÿ(ÿ(ÿ(ÿ(þ–dÿ(þ\ÿ4B "FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú ¨ÿ»ÿ±[ÿºÿ³üÿµ ÿ±ÿ»ÿ±Úÿ®œÿ®$ÿ¼äÿ©ÿŸÿ¤8ÿ«+ÿµ¾ÿ¶úÿ¹úÿ®øÿ¦ÿ¸¨ÿ³ÿ‘Tÿ®Kÿ¸tÿ³ðÿÀÛÿ¸ ÿª¼ÿ½ÿ¾Îÿ¿ ÿ»2ÿ::G`bhnopqx"(.ÿ|ÿ`ÿCÿ]%ÿfÿðº.È DŠ–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ |ÿû„ÿûyÿó†fÿøDÿûÿ÷†ÿÛmÿùJÿõUÿéÑÃÿ‘Uÿ¶€ÿûkÿù™ÿþMÿõ_wÿÿq‚ÿ“©ÿç)bg”.à&O LÿÉ|ÿÄQÿ­Îÿ§6ÿ®Çÿ§?ÿ.'ÿ30ÿ3÷ÿhˆÿ0šÿ0†mÿÿ”ÿ¶_ÿ¶–ìÿ‡ÿƒÖäÿÿwÿÿÝ«ÿåeR; Ëÿ¦ÿ‘÷ÿ‹Úÿšÿ”äÿŽiÿ­·ÿÔ—dbD8<>BCDEINSTVW\tz N O P Q U \ ` e j p r s u … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ¬ ­ ¯ ± Ì Û Ý ä ç è ë ð ñ ò ô õ ø ù ÿbcden"(.ÿXÿtÿpÿƒÿáÿkÿé<&J #HNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöüªT !  *Oç;$Ð&#0+í). Ãúà-ø ¬#9TMx òâà*¹ Õ  +:;G`bh78rst"(.ÿzŸÿŽÿa ÿ«‡ÿ¥w^^r Š"(.4:@FLRX^djpv|‚ˆŽ”𠦬²¸¾ÄÊÐÖÜâèîôú $*06<BHNTZ`flrx~„Š–œ¢¨®´ºÀÆÌÒØÞäêðöü &,28>DJPV\bhntz€†Œ’˜ž¤ª°¶¼ÂÈÎÔÚàæìòøþ "(.4:@FLxaej„gdêi9j—j†ešd¥cûe _ÿeqehaXa»e d c¥iâe«cgêfífŠeg a÷gâgaeac d hœc”e©a e§g–e–i½g£aÿº>ÿ·>ÿÉ5|7‰@^^ºa¹g[i_d˜išdie¡eYg‹aŒe…a—gWi#aeg4cžge.e:cœc«^±d ^ýgýdúd§iŽgÌcg¶gš^½gÿº;·eÿÀ>ÿº>ÿ·Aÿº;ÿºDÿÀ>ÿ·>kjdº^^g¨d«a˜e÷d÷a«agúd¥a a£eWcªh›gªažjã^9dúdôa÷dýd÷d c”e©e·c¢g d¢d¨g|7‰@j©i¥gùe÷aòda‹a**+-388 ;< >E GGIPRTVX \\#tt$xz%( 5 6) : :+ = B, N Q2 U U6 \ \7 ` `8 e e9 j j: p p; r s< u u> … ˜? ¬ ¬S ® °T ¹ ¾W  Â] Æ Ì^ Ð Ðe Ò Òf Ö Ùg Û Ûk Ý Ýl ä äm ç ën î îs ð òt ô õw ÷y$%fghip~"(.4:@FLÿ•kÿ‘UÿŽgXdÿÀGÿÀLÿ¬é’i@8ÿØÿìšš©©ªªÅÅ›š©ªÅüX¶ÿâÿìÿâÿìÿâÿâÿØÿâÿìÿöÿâÿöÿìÿìÿìÿØÿìÿìjjkkssuuzz~~……‡‡ˆˆ‰‰ŠŠ‹‹‘‘“• kkww~~……ˆˆ‰‰‹‹””––——™Æjksuz~…‡ˆ‰Š‹‘“”•ÀJ ÿÄÿØÿìÿìÿâÿØÿâÿìÿâÿöÿâÿâÿìÿçÿâÿÎÿâÿöÿâÿÎÿìÿâÿâÿöÿöÿÎÿìÿìÿöÿìÿØÿÎÿìÿìÿöÿØÿâÿâÿâÿìÿìÿØÿöÿìÿìÿâÿâÿÎÿØÿâÿâÿØÿìÿìÿâÿâÿØÿìÿâÿâÿÎÿâÿìÿÓÿØÿìÿâÿâÿâÿöÿâÿìÿØÿÎÿØÿìÿâÿØÿØÿâÿÎÿâÿÎÿâÿìÿâÿâÿìÿÎÿØÿìÿÎÿâÿâÿìÿØÿÄÿØÿâÿìÿØÿØÿöÿØÿìÿâÿØÿâÿØÿÄÿØÿìÿØÿÎÿâÿØÿØÿØÿâÿÄÿâÿâÿìÿØÿâÿØÿìÿØÿìÿÎÿìÿìÿöÿñÿöÿÎÿöÿöÿöÿöÿìÿöÿöÿöÿìÿìÿìÿöÿØÿâÿÎÿìÿìÿØÿöÿØÿìÿöÿÎÿöÿìÿöÿçÿÎÿöÿØÿØÿØÿìÿØÿâÿØÿØÿìÿØÿØÿØÿâÿØÿÄÿÎÿÎÿÎÿâÿâÿÄÿØÿìÿâÿÎÿÄÿØÿÎÿÎÿØÿâÿâÿöÿìÿØÿìÿâÿÎÿØÿâÿØJ$$%%&'(())**--..//22 3344 55 66 77 9: ;;<< ==‚‡ˆˆ‰‰Š’’”˜ šš ŸŸ   ÂÂÄÄÆÆÈÈÊÊÌÌÎÎÐÐÒÒÔÔÚÚÜÜÞÞààââääøøûûýýÿÿ       "" $$ && 88 :: ??yy¶¶""ZZdd ff nn pp ¼¼òò s$$&&**--224466779:;;<<==DDFHII JJMM PQ RRSSTTUUVV WW XXYZ[[ \\]] ‚ˆ‰‰”˜ššŸŸ¢¨©­²²³³ ´¸ºº»¾¿¿ÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÊÊËËÌÌÎÎÏÏÑÑÕÕ××ÛÛÞÞààááââããääåå       !! ""## $$%% &&++--//11338899::;;<< ==>> ??@@ EE [[ddee ffgg nnoo ppqq òòóóùú üý X$%&'()*-./2345679:;<=‚ƒ„…†‡ˆ‰Š‹Œ’”•–—˜šŸ ÂÄÆÈÊÌÎÐÒÔÚÜÞàâäøûýÿ "$&8:?y¶"Zdfnp¼òb0Þ ÿöÿìÿöÿöÿöÿöÿöÿöÿöÿìÿöÿöÿöÿöÿûÿìÿìÿìÿöÿìÿöÿûÿìÿìÿìÿìÿØÿìÿöÿçÿâÿâÿöÿìÿìÿìÿçÿìÿìÿöÿìÿìÿöÿìÿìÿöÿìÿöÿìÿìÿìÿöÿöÿöÿûÿöÿìÿìÿØÿìÿöÿìÿìÿöÿñÿöÿöÿìÿöÿöÿñÿöÿìÿìÿìÿöÿìÿâÿìÿöÿâÿìÿÝGDDEFHHIIJJKKNNPQRSUUVV WW XXYZ[[\\]] ¢§¨­³³´¸ºº»¾¿¿ÁÁÃÃÅÅÇÇÉÉËËÍÍÏÏÕÕ××ÙÙÛÛÝÝááããååùù   !! ## %% ++--//113399<< >> @@ ''EE[[ee gg oo qq óóùù@DDFHIIJJMMPQRRSS TTUU VVWWXX YZ[[\\]]¢¨©­³³´¸»¾ ¿¿ÁÁÃÃÅÅÇÇËËÏÏÑÑÕÕ××ááããåå   !!##%%++ -- // 11 33 99<<>>@@22[[ eeggooqqóóùý\DEFHIJKNPQRSUVWXYZ[\]¢£¤¥¦§¨©ª«¬­³´µ¶·¸º»¼½¾¿ÁÃÅÇÉËÍÏÕ×ÙÛÝáãåù !#%+-/139<>@'E[egoqóùìÆÿìÿÄÿÄÿØÿÄÿìÿÄÿìÿâÿØÿìÿÄÿâÿÎÿìÿÄÿÄÿØÿœÿ°ÿìÿÄÿÄÿâÿºÿâÿÄÿÄÿØÿÄÿÄÿ°ÿØÿÄÿâÿØÿìÿÄÿÄÿØÿìÿØÿìÿÄÿÄÿìÿâÿìÿìÿØÿâÿÄÿÄÿâÿØÿÄÿØÿâÿØÿÄÿÄÿÄÿÄÿÄÿâÿØÿØÿ°ÿâÿØÿØÿºÿØÿÄy$$%%&'))**.. //22334466779: ;; << == DD EF HH II JJKKNNPQRS UUVVWWXXYZ[[\\]]‚‡‰‰”˜ššŸŸ ¢§ ©­ ³³´¸ »¾¿¿ÁÁÂÂÃà ÄÄÅÅ ÈÈÊÊËË ÌÌÎÎÏÏ ÕÕ ×× ÞÞààááââããääååøø ùùûûýýÿÿ       !!""##$$%%--//3388 99:: ;; <<== >>?? @@¶¶22 ""## ''EEZZ[[ ddeeffggnnooppqqòò óóùù  mm}}üüÿ     ˜$%&')*./234679:;<=DEFHIJKNPQRSUVWXYZ[\]‚ƒ„…†‡‰”•–—˜šŸ¢£¤¥¦§©ª«¬­³´µ¶·¸»¼½¾¿ÁÂÃÄÅÈÊËÌÎÏÕ×Þàáâãäåøùûýÿ  !"#$%-/389:;<=>?@¶2"#'EZ[defgnopqòóù¨Ðÿ¦ÿöÿÄÿÎÿÄÿìÿØÿÄÿÄÿÄÿÄÿÄÿìÿØÿÄÿÎÿìÿâÿÄÿØÿÎÿÎÿÄÿÄÿØÿÄÿâÿìÿâÿØÿÎÿöÿØÿâÿìÿÎÿâÿÄÿâÿØÿâÿâÿìÿìÿâÿâÿÎÿâÿöÿöÿâÿâÿìÿâÿìÿØÿâÿØ mm}}ûûüüýýÿÿ      n$$&&**--224466779:;;<<==DDFHII JJMM PQ RRSS TTUU VV WW XX YZ[[ \\]] ‚†ˆˆ‰‰”˜ššŸŸ¢¨©­³³ ´¸»¾ ¿¿ÁÁÂÂÃÃÅÅÈÈÊÊËËÌÌÎÎÏÏÑÑÕÕ××ÞÞààááââããääåå        !! ""## $$%% &&++ -- // 33 8899::;;<< ==>> ??@@ 22 ## EE [[ ddee ffgg nnoo ppqq òòóóùý  m}ûüýÿ    ž žÆÔ.™ÃÞYïņŽsleepyhead-0.9.8/sleepyhead/version.h0000644000175000017500000000236212412506713017202 0ustar sergiosergio/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * * Version * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef VERSION_H #define VERSION_H #include #include "build_number.h" const int major_version = 0; // incompatible API changes const int minor_version = 9; // new features that don't break things const int revision_number = 8; // bugfixes, revisions #ifdef TEST_BUILD const QString ReleaseStatus = "testing"; #else const QString ReleaseStatus = "beta"; #endif const QString VersionString = QString().sprintf("%i.%i.%i-%i", major_version, minor_version, revision_number, build_number); const QString FullVersionString = QString().sprintf("%i.%i.%i-%i", major_version, minor_version, revision_number, build_number)+"-"+ReleaseStatus; #ifdef Q_OS_MAC const QString PlatformString = "MacOSX"; #elif defined(Q_OS_WIN32) const QString PlatformString = "Win32"; #elif defined(Q_OS_LINUX) const QString PlatformString = "Linux"; #endif #endif // VERSION_H sleepyhead-0.9.8/sleepyhead/win_icon.rc0000644000175000017500000000006312412506713017473 0ustar sergiosergioIDI_ICON1 ICON DISCARDABLE "./icons/bob-v3.0.ico" sleepyhead-0.9.8/sleepyhead/sleepyhead.pro0000644000175000017500000002064712412506713020217 0ustar sergiosergio#------------------------------------------------- # # Project created by QtCreator 2011-06-20T22:05:30 # #------------------------------------------------- QT += core gui network xml printsupport greaterThan(QT_MAJOR_VERSION,4) { QT += widgets webkitwidgets } else { # qt4 QT += webkit } #SleepyHead requires OpenGL 2.0 support to run smoothly #On platforms where it's not available, it can still be built to work #provided the BrokenGL file resides in the SleepyHead source root directory contains(DEFINES, BrokenGL) { message("Building with QWidget gGraphView") DEFINES += BROKEN_OPENGL_BUILD } else { message("Building with QGLWidget gGraphView") QT += opengl } #The following forces ResMed session locking.. it *may* not be necessary.. I'm still trying to assess this properly. DEFINES += LOCK_RESMED_SESSIONS #CONFIG += c++11 CONFIG += rtti #static { # CONFIG += static # QTPLUGIN += qsvg qgif qpng # DEFINES += STATIC // Equivalent to "#define STATIC" in source code # message("Static build.") #} TARGET = SleepyHead unix:!macx { TARGET.path=/usr/bin } TEMPLATE = app # GIT_VERSION = $$system(git describe --tags --long --abbrev=6 --dirty="*") exists(../.git):{ GIT_BRANCH=$$system(git rev-parse --abbrev-ref HEAD) DEFINES += GIT_BRANCH=\\\"$$GIT_BRANCH\\\" DEFINES += GIT_REVISION=\\\"$$system(git rev-parse --short HEAD)\\\" # contains(GIT_BRANCH,"testing"): } else { DEFINES += GIT_BRANCH=\\\"UNKNOWN\\\" DEFINES += GIT_REVISION=\\\"UNKNOWN\\\" } #Comment out for official builds DEFINES += TEST_BUILD unix:!macx { LIBS += -lX11 -lz -lGLU DEFINES += _TTY_POSIX_ } macx { QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6.8 LIBS += -lz ICON = icons/iconfile.icns } win32 { DEFINES += WINVER=0x0501 # needed for mingw to pull in appropriate dbt business...probably a better way to do this RC_FILE += win_icon.rc LIBS += -lsetupapi INCLUDEPATH += $$PWD INCLUDEPATH += $$[QT_INSTALL_PREFIX]/../src/qtbase/src/3rdparty/zlib if (*-msvc*):!equals(TEMPLATE_PREFIX, "vc") { LIBS += -ladvapi32 DEFINES += BUILD_WITH_MSVC=1 } else { # MingW needs this LIBS += -lz } } #include(3rdparty/quazip-0.5.1/quazip/quazip.pri) #include(SleepLib2/sleeplib.pri) SOURCES += \ common_gui.cpp \ daily.cpp \ exportcsv.cpp \ main.cpp \ mainwindow.cpp \ newprofile.cpp \ overview.cpp \ preferencesdialog.cpp \ profileselect.cpp \ reports.cpp \ sessionbar.cpp \ updateparser.cpp \ UpdaterWindow.cpp \ Graphs/gFlagsLine.cpp \ Graphs/gFooBar.cpp \ Graphs/gGraph.cpp \ Graphs/gGraphView.cpp \ Graphs/glcommon.cpp \ Graphs/gLineChart.cpp \ Graphs/gLineOverlay.cpp \ Graphs/gSegmentChart.cpp \ Graphs/gspacer.cpp \ Graphs/gStatsLine.cpp \ Graphs/gSummaryChart.cpp \ Graphs/gXAxis.cpp \ Graphs/gYAxis.cpp \ Graphs/layer.cpp \ SleepLib/calcs.cpp \ SleepLib/common.cpp \ SleepLib/day.cpp \ SleepLib/event.cpp \ SleepLib/machine.cpp \ SleepLib/machine_loader.cpp \ SleepLib/preferences.cpp \ SleepLib/profiles.cpp \ SleepLib/schema.cpp \ SleepLib/session.cpp \ SleepLib/loader_plugins/cms50_loader.cpp \ SleepLib/loader_plugins/icon_loader.cpp \ SleepLib/loader_plugins/intellipap_loader.cpp \ SleepLib/loader_plugins/mseries_loader.cpp \ SleepLib/loader_plugins/prs1_loader.cpp \ SleepLib/loader_plugins/resmed_loader.cpp \ SleepLib/loader_plugins/somnopose_loader.cpp \ SleepLib/loader_plugins/zeo_loader.cpp \ translation.cpp \ statistics.cpp \ oximeterimport.cpp \ SleepLib/serialoximeter.cpp \ SleepLib/loader_plugins/md300w1_loader.cpp \ Graphs/gSessionTimesChart.cpp \ logger.cpp \ welcome.cpp \ SleepLib/machine_common.cpp \ SleepLib/loader_plugins/weinmann_loader.cpp \ Graphs/gdailysummary.cpp \ Graphs/MinutesAtPressure.cpp \ SleepLib/journal.cpp \ SleepLib/progressdialog.cpp \ SleepLib/loader_plugins/cms50f37_loader.cpp HEADERS += \ common_gui.h \ daily.h \ exportcsv.h \ mainwindow.h \ newprofile.h \ overview.h \ preferencesdialog.h \ profileselect.h \ reports.h \ sessionbar.h \ updateparser.h \ UpdaterWindow.h \ version.h \ Graphs/gFlagsLine.h \ Graphs/gFooBar.h \ Graphs/gGraph.h \ Graphs/gGraphView.h \ Graphs/glcommon.h \ Graphs/gLineChart.h \ Graphs/gLineOverlay.h \ Graphs/gSegmentChart.h\ Graphs/gspacer.h \ Graphs/gStatsLine.h \ Graphs/gSummaryChart.h \ Graphs/gXAxis.h \ Graphs/gYAxis.h \ Graphs/layer.h \ SleepLib/calcs.h \ SleepLib/common.h \ SleepLib/day.h \ SleepLib/event.h \ SleepLib/machine.h \ SleepLib/machine_common.h \ SleepLib/machine_loader.h \ SleepLib/preferences.h \ SleepLib/profiles.h \ SleepLib/schema.h \ SleepLib/session.h \ SleepLib/loader_plugins/cms50_loader.h \ SleepLib/loader_plugins/icon_loader.h \ SleepLib/loader_plugins/intellipap_loader.h \ SleepLib/loader_plugins/mseries_loader.h \ SleepLib/loader_plugins/prs1_loader.h \ SleepLib/loader_plugins/resmed_loader.h \ SleepLib/loader_plugins/somnopose_loader.h \ SleepLib/loader_plugins/zeo_loader.h \ translation.h \ statistics.h \ oximeterimport.h \ SleepLib/serialoximeter.h \ SleepLib/loader_plugins/md300w1_loader.h \ Graphs/gSessionTimesChart.h \ logger.h \ SleepLib/loader_plugins/weinmann_loader.h \ Graphs/gdailysummary.h \ Graphs/MinutesAtPressure.h \ SleepLib/journal.h \ SleepLib/progressdialog.h \ SleepLib/loader_plugins/cms50f37_loader.h \ build_number.h FORMS += \ daily.ui \ overview.ui \ mainwindow.ui \ oximetry.ui \ preferencesdialog.ui \ report.ui \ profileselect.ui \ newprofile.ui \ exportcsv.ui \ UpdaterWindow.ui \ oximeterimport.ui RESOURCES += \ Resources.qrc OTHER_FILES += \ docs/index.html \ docs/usage.html \ docs/schema.xml \ docs/graphs.xml \ docs/channels.xml \ docs/release_notes.html \ docs/startup_tips.txt \ docs/countries.txt \ docs/tz.txt \ ../LICENSE.txt \ docs/tooltips.css \ docs/script.js \ ../update.xml \ docs/changelog.txt \ docs/intro.html \ docs/statistics.xml win32 { CONFIG(debug, debug|release) { DDIR = $$OUT_PWD/debug/Translations } CONFIG(release, debug|release) { DDIR = $$OUT_PWD/release/Translations } DDIR ~= s,/,\\,g TRANS_FILES += $$PWD/../Translations/*.qm TRANS_FILES_WIN = $${TRANS_FILES} TRANS_FILES_WIN ~= s,/,\\,g system(mkdir $$quote($$DDIR)) for(FILE,TRANS_FILES_WIN){ system(xcopy /y $$quote($$FILE) $$quote($$DDIR)) } } mac { TransFiles.files = $$files(../Translations/*.qm) TransFiles.path = Contents/Resources/Translations QMAKE_BUNDLE_DATA += TransFiles } #!win32 { # include(../3rdparty/qtserialport/src/serialport/serialport-lib.pri) # INCLUDEPATH += $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort # DEPENDPATH += $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort #} else { QT += serialport #} include(../3rdparty/quazip/quazip/quazip.pri) INCLUDEPATH += $$PWD/../3rdparty/quazip DEPENDPATH += $$PWD/../3rdparty/quazip #bundlelibs = $$cat($$PWD/../Bundle3rdParty) #contains(bundlelibs, true) { # include(../3rdparty/quazip/quazip/quazip.pri) # INCLUDEPATH += $$PWD/../3rdparty/quazip # DEPENDPATH += $$PWD/../3rdparty/quazip # !win32 { # include(../3rdparty/qtserialport/src/serialport/serialport-lib.pri) # INCLUDEPATH += $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort # DEPENDPATH += $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort # # DEPENDPATH += $$PWD/../3rdparty/qtserialport/src/serialport/include/QtSerialPort/5.3.1 # } #} else { # unix { # message("Attempting to build with system quazip."); # QMAKE_LFLAGS += -L/usr/lib -L/usr/local/lib # INCLUDEPATH += /usr/local/include # INCLUDEPATH += /usr/include # DEPENDPATH += /usr/local/include/quazip # DEPENDPATH += /usr/include/quazip # } else { # #Configure it if you need it... # warning("Building with externally linked quazip is unsupported on this platform"); # } # LIBS += -lquazip #} sleepyhead-0.9.8/sleepyhead/oximeterimport.h0000644000175000017500000000513612412506713020606 0ustar sergiosergio/* Oximeter Import Wizard Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef OXIMETERIMPORT_H #define OXIMETERIMPORT_H #include #include "Graphs/gGraphView.h" #include "Graphs/gLineChart.h" #include "SleepLib/serialoximeter.h" #include "sessionbar.h" namespace Ui { class OximeterImport; } enum OximeterImportMode { IM_UNDEFINED = 0, IM_LIVE, IM_RECORDING, IM_FILE }; class OximeterImport : public QDialog { Q_OBJECT public: explicit OximeterImport(QWidget *parent = 0); ~OximeterImport(); private slots: void on_nextButton_clicked(); void on_directImportButton_clicked(); void doUpdateProgress(int, int); void on_fileImportButton_clicked(); void on_liveImportButton_clicked(); void on_retryButton_clicked(); void on_stopButton_clicked(); void on_calendarWidget_clicked(const QDate &date); void on_calendarWidget_selectionChanged(); void onSessionSelected(Session * session); void on_sessionBackButton_clicked(); void on_sessionForwardButton_clicked(); void on_radioSyncCPAP_clicked(); void on_radioSyncOximeter_clicked(); void on_cancelButton_clicked(); void on_showLiveGraphs_clicked(bool checked); void on_skipWelcomeCheckbox_clicked(bool checked); void on_informationButton_clicked(); void on_syncButton_clicked(); void on_saveButton_clicked(); void chooseSession(); void on_chooseSessionButton_clicked(); void on_oximeterType_currentIndexChanged(int index); void on_cms50CheckName_clicked(bool checked); void on_cms50SyncTime_clicked(bool checked); void on_cms50DeviceName_textEdited(const QString &arg1); protected slots: void on_updatePlethy(QByteArray plethy); void finishedRecording(); void finishedImport(SerialOximeter*); void updateLiveDisplay(); protected: SerialOximeter * detectOximeter(); void updateStatus(QString msg); void doImport(); void setInformation(); private: Ui::OximeterImport *ui; SerialOximeter * oximodule; gGraphView * liveView; gGraph * plethyGraph; Session * session; Day * dummyday; gLineChart * plethyChart; SessionBar * sessbar; EventList * ELplethy; qint64 start_ti, ti; QTimer updateTimer; OximeterImportMode importMode; int pulse; int spo2; bool selecting_session; QList chosen_sessions; }; #endif // OXIMETERIMPORT_H sleepyhead-0.9.8/sleepyhead/statistics.h0000644000175000017500000001176412412506713017715 0ustar sergiosergio/* Statistics Report Generator Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef SUMMARY_H #define SUMMARY_H #include #include #include #include "SleepLib/schema.h" #include "SleepLib/machine.h" enum StatCalcType { SC_UNDEFINED=0, SC_COLUMNHEADERS, SC_HEADING, SC_SUBHEADING, SC_MEDIAN, SC_AVG, SC_WAVG, SC_90P, SC_MIN, SC_MAX, SC_CPH, SC_SPH, SC_AHI, SC_HOURS, SC_COMPLIANCE, SC_DAYS, SC_ABOVE, SC_BELOW }; struct StatisticsRow { StatisticsRow() { calc=SC_UNDEFINED; } StatisticsRow(QString src, QString calc, QString type) { this->src = src; this->calc = lookupCalc(calc); this->type = lookupType(type); } StatisticsRow(QString src, StatCalcType calc, MachineType type) { this->src = src; this->calc = calc; this->type = type; } StatisticsRow(const StatisticsRow ©) { src=copy.src; calc=copy.calc; type=copy.type; } QString src; StatCalcType calc; MachineType type; StatCalcType lookupCalc(QString calc) { if (calc.compare("avg",Qt::CaseInsensitive)==0) { return SC_AVG; } else if (calc.compare("w-avg",Qt::CaseInsensitive)==0) { return SC_WAVG; } else if (calc.compare("median",Qt::CaseInsensitive)==0) { return SC_MEDIAN; } else if (calc.compare("90%",Qt::CaseInsensitive)==0) { return SC_90P; } else if (calc.compare("min", Qt::CaseInsensitive)==0) { return SC_MIN; } else if (calc.compare("max", Qt::CaseInsensitive)==0) { return SC_MAX; } else if (calc.compare("cph", Qt::CaseInsensitive)==0) { return SC_CPH; } else if (calc.compare("sph", Qt::CaseInsensitive)==0) { return SC_SPH; } else if (calc.compare("ahi", Qt::CaseInsensitive)==0) { return SC_AHI; } else if (calc.compare("hours", Qt::CaseInsensitive)==0) { return SC_HOURS; } else if (calc.compare("compliance", Qt::CaseInsensitive)==0) { return SC_COMPLIANCE; } else if (calc.compare("days", Qt::CaseInsensitive)==0) { return SC_DAYS; } else if (calc.compare("heading", Qt::CaseInsensitive)==0) { return SC_HEADING; } else if (calc.compare("subheading", Qt::CaseInsensitive)==0) { return SC_SUBHEADING; } return SC_UNDEFINED; } MachineType lookupType(QString type) { if (type.compare("cpap", Qt::CaseInsensitive)==0) { return MT_CPAP; } else if (type.compare("oximeter", Qt::CaseInsensitive)==0) { return MT_OXIMETER; } else if (type.compare("sleepstage", Qt::CaseInsensitive)==0) { return MT_SLEEPSTAGE; } return MT_UNKNOWN; } ChannelID channel() { return schema::channel[src].id(); } QString value(QDate start, QDate end); }; class RXItem { public: RXItem() { machine = nullptr; ahi = rdi = 0; highlight = 0; hours = 0; } RXItem(const RXItem & copy) { start = copy.start; end = copy.end; days = copy.days; s_count = copy.s_count; s_sum = copy.s_sum; ahi = copy.ahi; rdi = copy.rdi; hours = copy.hours; machine = copy.machine; relief = copy.relief; mode = copy.mode; pressure = copy.pressure; dates = copy.dates; highlight = copy.highlight; } inline quint64 count(ChannelID id) const { QHash::const_iterator it = s_count.find(id); if (it == s_count.end()) return 0; return it.value(); } inline double sum(ChannelID id) const{ QHash::const_iterator it = s_sum.find(id); if (it == s_sum.end()) return 0; return it.value(); } QDate start; QDate end; int days; QHash s_count; QHash s_sum; quint64 ahi; quint64 rdi; double hours; Machine * machine; QString relief; QString mode; QString pressure; QMap dates; short highlight; }; class Statistics : public QObject { Q_OBJECT public: explicit Statistics(QObject *parent = 0); void loadRXChanges(); void saveRXChanges(); void updateRXChanges(); QString GenerateHTML(); QString GenerateMachineList(); QString GenerateRXChanges(); void UpdateRecordsBox(); protected: // Using a map to maintain order QList rows; QMap calcnames; QMap machinenames; QMap rxitems; QList record_best_ahi; QList record_worst_ahi; signals: public slots: }; #endif // SUMMARY_H sleepyhead-0.9.8/sleepyhead/newprofile.cpp0000644000175000017500000003504712412506713020230 0ustar sergiosergio/* Create New Profile Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include "SleepLib/profiles.h" #include "newprofile.h" #include "ui_newprofile.h" #include "mainwindow.h" extern MainWindow *mainwin; NewProfile::NewProfile(QWidget *parent) : QDialog(parent), ui(new Ui::NewProfile) { ui->setupUi(this); // ui->userNameEdit->setText(getUserName()); QLocale locale = QLocale::system(); QString shortformat = locale.dateFormat(QLocale::ShortFormat); if (!shortformat.toLower().contains("yyyy")) { shortformat.replace("yy", "yyyy"); } ui->dobEdit->setDisplayFormat(shortformat); ui->dateDiagnosedEdit->setDisplayFormat(shortformat); m_firstPage = 0; ui->backButton->setEnabled(false); ui->nextButton->setEnabled(false); ui->stackedWidget->setCurrentIndex(0); on_cpapModeCombo_activated(0); m_passwordHashed = false; ui->heightEdit2->setVisible(false); ui->heightEdit->setDecimals(2); ui->heightEdit->setSuffix(STR_UNIT_CM); { // process countries list QFile f(":/docs/countries.txt"); f.open(QFile::ReadOnly); QTextStream cnt(&f); QString a; ui->countryCombo->clear(); ui->countryCombo->addItem(tr("Select Country")); do { a = cnt.readLine(); if (a.isEmpty()) { break; } ui->countryCombo->addItem(a); } while (1); f.close(); } { // timezone list QFile f(":/docs/tz.txt"); f.open(QFile::ReadOnly); QTextStream cnt(&f); QString a; ui->timezoneCombo->clear(); //ui->countryCombo->addItem("Select TimeZone"); do { a = cnt.readLine(); if (a.isEmpty()) { break; } QStringList l; l = a.split("="); ui->timezoneCombo->addItem(l[1], l[0]); } while (1); f.close(); } ui->AppTitle->setText("SleepyHead v" + VersionString); ui->releaseStatus->setText(ReleaseStatus); ui->textBrowser->setHtml(getIntroHTML()); } NewProfile::~NewProfile() { delete ui; } QString NewProfile::getIntroHTML() { return "" "" "

    " + tr("Welcome to SleepyHead") + "

    " "

    " + tr("This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.") + "

    " "

    " + tr("SleepyHead has been released freely under the GNU Public License, and comes with no warranty, and without ANY claims to fitness for any purpose.") + "

    " "

    " + tr("PLEASE READ CAREFULLY") + "

    " "

    " + tr("SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.") + "

    " "

    " + tr("Accuracy of any data displayed is not and can not be guaranteed.") + "

    " "

    " + tr("Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.") + "

    " "

    " + tr("The author will not be held liable for anything related to the use or misuse of this software.") + "

    " "
    " "

    " + tr("Use of this software is entirely at your own risk.") + "

    " "

    " + tr("SleepyHead is copyright ©2011-2014 Mark Watkins") + "

    " "
    " "" ""; } void NewProfile::on_nextButton_clicked() { const QString xmlext = ".xml"; QSettings settings(getDeveloperName(), getAppName()); int index = ui->stackedWidget->currentIndex(); switch (index) { case 0: if (!ui->agreeCheckbox->isChecked()) { return; } // Reload Preferences object break; case 1: if (ui->userNameEdit->text().isEmpty()) { QMessageBox::information(this, STR_MessageBox_Error, tr("Please provide a username for this profile"), QMessageBox::Ok); return; } if (ui->genderCombo->currentIndex() == 0) { //QMessageBox::information(this,tr("Notice"),tr("You did not specify Gender."),QMessageBox::Ok); } if (ui->passwordGroupBox->isChecked()) { if (ui->passwordEdit1->text() != ui->passwordEdit2->text()) { QMessageBox::information(this, STR_MessageBox_Error, tr("Passwords don't match"), QMessageBox::Ok); return; } if (ui->passwordEdit1->text().isEmpty()) { ui->passwordGroupBox->setChecked(false); } } break; case 2: break; case 3: break; default: break; } int max_pages = ui->stackedWidget->count() - 1; if (index < max_pages) { index++; ui->stackedWidget->setCurrentIndex(index); } else { // Finish button clicked. QString username = ui->userNameEdit->text(); if (QMessageBox::question(this, tr("Profile Changes"), tr("Accept and save this information?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { Profile *profile = Profiles::Get(username); if (!profile) { // No profile, create one. profile = Profiles::Create(username); } Profile &prof = *profile; profile->user->setFirstName(ui->firstNameEdit->text()); profile->user->setLastName(ui->lastNameEdit->text()); profile->user->setDOB(ui->dobEdit->date()); profile->user->setEmail(ui->emailEdit->text()); profile->user->setPhone(ui->phoneEdit->text()); profile->user->setAddress(ui->addressEdit->toPlainText()); if (ui->passwordGroupBox->isChecked()) { if (!m_passwordHashed) { profile->user->setPassword(ui->passwordEdit1->text().toUtf8()); } } else { prof.Erase(STR_UI_Password); } profile->user->setGender((Gender)ui->genderCombo->currentIndex()); profile->cpap->setDateDiagnosed(ui->dateDiagnosedEdit->date()); profile->cpap->setUntreatedAHI(ui->untreatedAHIEdit->value()); profile->cpap->setMode((CPAPMode)ui->cpapModeCombo->currentIndex()); profile->cpap->setMinPressure(ui->minPressureEdit->value()); profile->cpap->setMaxPressure(ui->maxPressureEdit->value()); profile->cpap->setNotes(ui->cpapNotes->toPlainText()); profile->doctor->setName(ui->doctorNameEdit->text()); profile->doctor->setPracticeName(ui->doctorPracticeEdit->text()); profile->doctor->setAddress(ui->doctorAddressEdit->toPlainText()); profile->doctor->setPhone(ui->doctorPhoneEdit->text()); profile->doctor->setEmail(ui->doctorEmailEdit->text()); profile->doctor->setPatientID(ui->doctorPatientIDEdit->text()); profile->user->setTimeZone(ui->timezoneCombo->itemData( ui->timezoneCombo->currentIndex()).toString()); profile->user->setCountry(ui->countryCombo->currentText()); profile->user->setDaylightSaving(ui->DSTcheckbox->isChecked()); UnitSystem us; if (ui->heightCombo->currentIndex() == 0) { us = US_Metric; } else if (ui->heightCombo->currentIndex() == 1) { us = US_Archiac; } else { us = US_Metric; } if (profile->general->unitSystem() != us) { profile->general->setUnitSystem(us); if (mainwin && mainwin->getDaily()) { mainwin->getDaily()->UnitsChanged(); } } double v = 0; if (us == US_Archiac) { // convert to metric v = (ui->heightEdit->value() * 30.48); v += ui->heightEdit2->value() * 2.54; } else { v = ui->heightEdit->value(); } profile->user->setHeight(v); //profile->user->setUserName(username); PREF[STR_GEN_Profile] = username; this->accept(); } } if (index >= max_pages) { ui->nextButton->setText(tr("&Finish")); } else { ui->nextButton->setText(tr("&Next")); } ui->backButton->setEnabled(true); } void NewProfile::on_backButton_clicked() { ui->nextButton->setText(tr("&Next")); if (ui->stackedWidget->currentIndex() > m_firstPage) { ui->stackedWidget->setCurrentIndex(ui->stackedWidget->currentIndex() - 1); } if (ui->stackedWidget->currentIndex() == m_firstPage) { ui->backButton->setEnabled(false); } else { ui->backButton->setEnabled(true); } } void NewProfile::on_cpapModeCombo_activated(int index) { if (index == 0) { ui->maxPressureEdit->setVisible(false); } else { ui->maxPressureEdit->setVisible(true); } } void NewProfile::on_agreeCheckbox_clicked(bool checked) { ui->nextButton->setEnabled(checked); } void NewProfile::skipWelcomeScreen() { ui->agreeCheckbox->setChecked(true); ui->stackedWidget->setCurrentIndex(m_firstPage = 1); ui->backButton->setEnabled(false); ui->nextButton->setEnabled(true); } void NewProfile::edit(const QString name) { skipWelcomeScreen(); Profile *profile = Profiles::Get(name); if (!profile) { profile = Profiles::Create(name); } ui->userNameEdit->setText(name); ui->userNameEdit->setReadOnly(true); ui->firstNameEdit->setText(profile->user->firstName()); ui->lastNameEdit->setText(profile->user->lastName()); if (profile->contains(STR_UI_Password) && !profile->p_preferences[STR_UI_Password].toString().isEmpty()) { // leave the password box blank.. QString a = "******"; ui->passwordEdit1->setText(a); ui->passwordEdit2->setText(a); ui->passwordGroupBox->setChecked(true); m_passwordHashed = true; } ui->dobEdit->setDate(profile->user->DOB()); if (profile->user->gender() == Male) { ui->genderCombo->setCurrentIndex(1); } else if (profile->user->gender() == Female) { ui->genderCombo->setCurrentIndex(2); } else { ui->genderCombo->setCurrentIndex(0); } ui->heightEdit->setValue(profile->user->height()); ui->addressEdit->setText(profile->user->address()); ui->emailEdit->setText(profile->user->email()); ui->phoneEdit->setText(profile->user->phone()); ui->dateDiagnosedEdit->setDate(profile->cpap->dateDiagnosed()); ui->cpapNotes->clear(); ui->cpapNotes->appendPlainText(profile->cpap->notes()); ui->minPressureEdit->setValue(profile->cpap->minPressure()); ui->maxPressureEdit->setValue(profile->cpap->maxPressure()); ui->untreatedAHIEdit->setValue(profile->cpap->untreatedAHI()); ui->cpapModeCombo->setCurrentIndex((int)profile->cpap->mode()); ui->doctorNameEdit->setText(profile->doctor->name()); ui->doctorPracticeEdit->setText(profile->doctor->practiceName()); ui->doctorPhoneEdit->setText(profile->doctor->phone()); ui->doctorEmailEdit->setText(profile->doctor->email()); ui->doctorAddressEdit->setText(profile->doctor->address()); ui->doctorPatientIDEdit->setText(profile->doctor->patientID()); ui->DSTcheckbox->setChecked(profile->user->daylightSaving()); int i = ui->timezoneCombo->findData(profile->user->timeZone()); ui->timezoneCombo->setCurrentIndex(i); i = ui->countryCombo->findText(profile->user->country()); ui->countryCombo->setCurrentIndex(i); UnitSystem us = profile->general->unitSystem(); i = (int)us - 1; if (i < 0) { i = 0; } ui->heightCombo->setCurrentIndex(i); double v = profile->user->height(); if (us == US_Archiac) { // evil non-metric int ti = v / 2.54; int feet = ti / 12; int inches = ti % 12; ui->heightEdit->setValue(feet); ui->heightEdit2->setValue(inches); ui->heightEdit2->setVisible(true); ui->heightEdit->setDecimals(0); ui->heightEdit2->setDecimals(0); ui->heightEdit->setSuffix(STR_UNIT_FOOT); // foot ui->heightEdit2->setSuffix(STR_UNIT_INCH); // inches } else { // good wholesome metric ui->heightEdit->setValue(v); ui->heightEdit2->setVisible(false); ui->heightEdit->setDecimals(2); ui->heightEdit->setSuffix(STR_UNIT_CM); } } void NewProfile::on_passwordEdit1_editingFinished() { m_passwordHashed = false; } void NewProfile::on_passwordEdit2_editingFinished() { m_passwordHashed = false; } void NewProfile::on_heightCombo_currentIndexChanged(int index) { if (index == 0) { //metric ui->heightEdit2->setVisible(false); ui->heightEdit->setDecimals(2); ui->heightEdit->setSuffix(STR_UNIT_CM); double v = ui->heightEdit->value() * 30.48; v += ui->heightEdit2->value() * 2.54; ui->heightEdit->setValue(v); } else { //evil ui->heightEdit->setDecimals(0); ui->heightEdit2->setDecimals(0); ui->heightEdit->setSuffix(STR_UNIT_FOOT); ui->heightEdit2->setVisible(true); ui->heightEdit2->setSuffix(STR_UNIT_INCH); int v = ui->heightEdit->value() / 2.54; int feet = v / 12; int inches = v % 12; ui->heightEdit->setValue(feet); ui->heightEdit2->setValue(inches); } } void NewProfile::on_textBrowser_anchorClicked(const QUrl &arg1) { QDialog *dlg = new QDialog(this); dlg->setMinimumWidth(600); dlg->setMinimumHeight(500); QVBoxLayout *layout = new QVBoxLayout(); dlg->setLayout(layout); QTextBrowser *browser = new QTextBrowser(this); dlg->layout()->addWidget(browser); QPushButton *button = new QPushButton(tr("&Close this window"), browser); QFile f(arg1.toString().replace("qrc:", ":")); f.open(QIODevice::ReadOnly); QTextStream ts(&f); QString text = ts.readAll(); connect(button, SIGNAL(clicked()), dlg, SLOT(close())); dlg->layout()->addWidget(button); browser->setPlainText(text); dlg->exec(); delete dlg; } sleepyhead-0.9.8/sleepyhead/oximeterimport.cpp0000644000175000017500000011455712412506713021151 0ustar sergiosergio/* Oximeter Import Wizard Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include "Graphs/gYAxis.h" #include "Graphs/gXAxis.h" #include "oximeterimport.h" #include "ui_oximeterimport.h" #include "SleepLib/calcs.h" #include "mainwindow.h" extern MainWindow * mainwin; #include "SleepLib/loader_plugins/cms50_loader.h" #include "SleepLib/loader_plugins/cms50f37_loader.h" #include "SleepLib/loader_plugins/md300w1_loader.h" Qt::DayOfWeek firstDayOfWeekFromLocale(); QList GetOxiLoaders(); OximeterImport::OximeterImport(QWidget *parent) : QDialog(parent), ui(new Ui::OximeterImport) { ui->setupUi(this); setWindowTitle(tr("Oximeter Import Wizard")); ui->stackedWidget->setCurrentIndex(0); oximodule = nullptr; liveView = new gGraphView(this); liveView->setVisible(false); liveView->setShowAuthorMessage(false); ui->retryButton->setVisible(false); ui->stopButton->setVisible(false); ui->saveButton->setVisible(false); ui->syncButton->setVisible(false); ui->chooseSessionButton->setVisible(false); importMode = IM_UNDEFINED; QVBoxLayout * lvlayout = new QVBoxLayout; lvlayout->setMargin(0); ui->liveViewFrame->setLayout(lvlayout); lvlayout->addWidget(liveView); plethyGraph = new gGraph("Plethy", liveView, STR_TR_Plethy, STR_UNIT_Hz); plethyGraph->AddLayer(new gYAxis(), LayerLeft, gYAxis::Margin); plethyGraph->AddLayer(new gXAxis(), LayerBottom, 0, 20); plethyGraph->AddLayer(plethyChart = new gLineChart(OXI_Plethy)); plethyGraph->setVisible(true); plethyGraph->setRecMinY(0); plethyGraph->setRecMaxY(128); ui->calendarWidget->setFirstDayOfWeek(Qt::Sunday); QTextCharFormat format = ui->calendarWidget->weekdayTextFormat(Qt::Saturday); format.setForeground(QBrush(Qt::black, Qt::SolidPattern)); ui->calendarWidget->setWeekdayTextFormat(Qt::Saturday, format); ui->calendarWidget->setWeekdayTextFormat(Qt::Sunday, format); ui->calendarWidget->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader); Qt::DayOfWeek dow=firstDayOfWeekFromLocale(); ui->calendarWidget->setFirstDayOfWeek(dow); ui->dateTimeEdit->setMinimumHeight(ui->dateTimeEdit->height() + 10); ui->syncCPAPGroup->setVisible(false); QVBoxLayout * layout = new QVBoxLayout; layout->setMargin(0); ui->sessBarFrame->setLayout(layout); sessbar = new SessionBar(this); sessbar->setSelectMode(true); sessbar->setMouseTracking(true); sessbar->setMinimumHeight(40); connect(sessbar, SIGNAL(sessionClicked(Session*)), this, SLOT(onSessionSelected(Session*))); layout->addWidget(sessbar, 1); dummyday = nullptr; session = nullptr; ELplethy = nullptr; pulse = spo2 = -1; ui->skipWelcomeCheckbox->setChecked(p_profile->oxi->skipOxiIntroScreen()); if (p_profile->oxi->skipOxiIntroScreen()) { ui->stackedWidget->setCurrentWidget(ui->importSelectionPage); ui->nextButton->setVisible(false); ui->informationButton->setVisible(true); } else { ui->stackedWidget->setCurrentWidget(ui->welcomePage); ui->nextButton->setVisible(true); ui->informationButton->setVisible(false); } ui->dateTimeEdit->setMinimumHeight(ui->dateTimeEdit->height()+10); setInformation(); ui->cms50DeviceName->setText(p_profile->oxi->defaultDevice()); int oxitype = p_profile->oxi->oximeterType(); ui->oximeterType->setCurrentIndex(oxitype); on_oximeterType_currentIndexChanged(oxitype); ui->cms50DeviceName->setEnabled(false); ui->cms50SyncTime->setChecked(p_profile->oxi->syncOximeterClock()); } OximeterImport::~OximeterImport() { if (!dummyday) { delete dummyday; } if (!session) { delete session; } disconnect(sessbar, SIGNAL(sessionClicked(Session*)), this, SLOT(onSessionSelected(Session*))); delete ui; } void OximeterImport::on_nextButton_clicked() { int i = ui->stackedWidget->currentIndex(); i++; if (i >= ui->stackedWidget->count()) i = 0; switch (i) { case 0: ui->nextButton->setVisible(true); ui->nextButton->setText("&Start"); break; case 1: ui->nextButton->setVisible(false); ui->informationButton->setVisible(true); break; default: ui->informationButton->setVisible(true); ui->nextButton->setVisible(true); } ui->stackedWidget->setCurrentIndex(i); } void OximeterImport::updateStatus(QString msg) { ui->logBox->appendPlainText(msg); ui->directImportStatus->setText(msg); ui->liveStatusLabel->setText(msg); } SerialOximeter * OximeterImport::detectOximeter() { const int PORTSCAN_TIMEOUT=30000; const int delay=100; ui->retryButton->setVisible(false); QList loaders; //= GetOxiLoaders(); if (ui->oximeterType->currentIndex() == 0) { // CMS50F3.7 SerialOximeter * oxi = qobject_cast(lookupLoader(cms50f37_class_name)); loaders.push_back(oxi); } else if (ui->oximeterType->currentIndex() == 1) { // CMS50D+/E/F SerialOximeter * oxi = qobject_cast(lookupLoader(cms50_class_name)); loaders.push_back(oxi); } else if (ui->oximeterType->currentIndex() == 2) { // ChoiceMed SerialOximeter * oxi = qobject_cast(lookupLoader(md300w1_class_name)); loaders.push_back(oxi); } else return nullptr; updateStatus(tr("Scanning for compatible oximeters")); ui->progressBar->setMaximum(PORTSCAN_TIMEOUT); QTime time; time.start(); oximodule = nullptr; int elapsed=0; do { for (int i=0; i < loaders.size(); ++i) { SerialOximeter * oxi = loaders[i]; if (oxi->openDevice()) { oximodule = oxi; break; } } if (oximodule) break; QThread::msleep(delay); elapsed = time.elapsed(); ui->progressBar->setValue(elapsed); QApplication::processEvents(); if (!isVisible()) { return oximodule = nullptr; } } while (elapsed < PORTSCAN_TIMEOUT); if (!oximodule) { updateStatus(tr("Could not detect any connected oximeter devices.")); ui->retryButton->setVisible(true); return nullptr; } QString devicename = oximodule->getDeviceString(); if (devicename.isEmpty()) oximodule->loaderName(); updateStatus(tr("Connecting to %1 Oximeter").arg(devicename)); return oximodule; } void OximeterImport::on_directImportButton_clicked() { ui->informationButton->setVisible(false); ui->stackedWidget->setCurrentWidget(ui->directImportPage); oximodule = detectOximeter(); if (!oximodule) return; if (p_profile->oxi->syncOximeterClock()) { oximodule->syncClock(); } QString model = oximodule->getModel(); QString user = oximodule->getUser(); QString devid = oximodule->getDeviceID(); if (oximodule->commandDriven()) { if (devid != ui->cms50DeviceName->text()) { if (ui->cms50CheckName->isChecked()) { mainwin->Notify(STR_MessageBox_Information, tr("Renaming this oximeter from '%1' to '%2'").arg(devid).arg(ui->cms50DeviceName->text())); oximodule->setDeviceID(ui->cms50DeviceName->text()); } else { QMessageBox::information(this, STR_MessageBox_Information, tr("Oximeter name is different.. If you only have one and are sharing it between profiles, set the name to the same on both profiles."), QMessageBox::Ok); } } } oximodule->resetDevice(); int session_count = oximodule->getSessionCount(); if (session_count > 1) { ui->stackedWidget->setCurrentWidget(ui->chooseSessionPage); ui->syncButton->setVisible(false); ui->chooseSessionButton->setVisible(true); ui->tableOxiSessions->clearContents(); QTableWidgetItem * item; ui->tableOxiSessions->setRowCount(session_count); ui->tableOxiSessions->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableOxiSessions->setColumnWidth(0,150); int h, m, s; for (int i=0; i< session_count; ++i) { int duration = oximodule->getDuration(i); QDateTime datetime = oximodule->getDateTime(i); h = duration / 3600; m = (duration / 60) % 60; s = duration % 60; item = new QTableWidgetItem(datetime.date().toString(Qt::SystemLocaleShortDate)+" "+datetime.time().toString("HH:mm:ss")); ui->tableOxiSessions->setItem(i, 0, item); item->setData(Qt::UserRole+1, datetime); item->setData(Qt::UserRole, i); item->setData(Qt::UserRole+2, duration); item->setFlags(item->flags() & ~Qt::ItemIsEditable); item = new QTableWidgetItem(QString(). sprintf("%02i:%02i:%02i", h,m,s)); ui->tableOxiSessions->setItem(i, 1, item); item->setFlags(item->flags() & ~Qt::ItemIsEditable); item = new QTableWidgetItem(tr("\"%1\", session %2").arg(user).arg(i+1, 0)); ui->tableOxiSessions->setItem(i, 2, item); item->setFlags(item->flags() & ~Qt::ItemIsEditable); } selecting_session = true; ui->tableOxiSessions->selectRow(0); return; } else if (session_count > 0) { chosen_sessions.push_back(0); oximodule->getDuration(0); oximodule->setStartTime(oximodule->getDateTime(0)); } doImport(); } void OximeterImport::doImport() { if (oximodule->commandDriven()) { if (chosen_sessions.size() == 0) { ui->connectLabel->setText("

    "+tr("Nothing to import")+"

    "); updateStatus(tr("Your oximeter did not have any valid sessions.")); ui->cancelButton->setText(tr("Close")); return; } ui->connectLabel->setText("

    "+tr("Waiting for %1 to start").arg(oximodule->getModel())+"

    "); updateStatus(tr("Waiting for the device to start the upload process...")); } else { ui->connectLabel->setText("

    "+tr("Select upload option on %1").arg(oximodule->loaderName())+"

    "); ui->logBox->appendPlainText(tr("You need to tell your oximeter to begin sending data to the computer.")); updateStatus(tr("Please connect your oximeter, enter it's menu and select upload to commence data transfer...")); } connect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int))); oximodule->Open("import"); if (oximodule->commandDriven()) { int chosen = chosen_sessions.at(0); oximodule->getSessionData(chosen); } // Wait to start import streaming.. while (!oximodule->isImporting() && !oximodule->isAborted()) { // QThread::msleep(10); QApplication::processEvents(); if (!isVisible()) { disconnect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int))); oximodule->abort(); break; } } if (!oximodule->isStreaming()) { disconnect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int))); ui->retryButton->setVisible(true); ui->progressBar->setValue(0); oximodule->abort(); return; } ui->connectLabel->setText("

    "+tr("%1 device is uploading data...").arg(oximodule->loaderName())+"

    "); updateStatus(tr("Please wait until oximeter upload process completes. Do not unplug your oximeter.")); importMode = IM_RECORDING; // Can't abort this bit or the oximeter will get confused... ui->cancelButton->setVisible(false); connect(oximodule, SIGNAL(importComplete(SerialOximeter*)), this, SLOT(finishedImport(SerialOximeter*))); } void OximeterImport::finishedImport(SerialOximeter * oxi) { Q_UNUSED(oxi); connect(oximodule, SIGNAL(importComplete(SerialOximeter*)), this, SLOT(finishedImport(SerialOximeter*))); ui->cancelButton->setVisible(true); disconnect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int))); updateStatus(tr("Oximeter import completed..")); if (oximodule->oxisessions.size() > 1) { chooseSession(); } else { on_syncButton_clicked(); } } void OximeterImport::doUpdateProgress(int v, int t) { ui->progressBar->setMaximum(t); ui->progressBar->setValue(v); QApplication::processEvents(); } void OximeterImport::on_fileImportButton_clicked() { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) const QString documentsFolder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); #else const QString documentsFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #endif QString filename = QFileDialog::getOpenFileName(nullptr , tr("Select a valid oximetry data file"), documentsFolder, tr("Oximetry Files (*.spo *.spor *.spo2 *.dat)")); if (filename.isEmpty()) return; // Make sure filename dialog had time to close properly.. QApplication::processEvents(); QList loaders = GetOxiLoaders(); bool success = false; oximodule = nullptr; Q_FOREACH(SerialOximeter * loader, loaders) { if (loader->Open(filename)) { success = true; oximodule = loader; break; } } if (!success) { QMessageBox::warning(this, STR_MessageBox_Warning, tr("No Oximetery module could parse the given file:")+QString("\n\n%1").arg(filename), QMessageBox::Ok); return; } ui->informationButton->setVisible(false); importMode = IM_FILE; if (oximodule->oxisessions.size() > 1) { chooseSession(); } else { on_syncButton_clicked(); } } void OximeterImport::on_liveImportButton_clicked() { ui->informationButton->setVisible(false); ui->stackedWidget->setCurrentWidget(ui->liveImportPage); ui->liveImportPage->layout()->addWidget(ui->progressBar); QApplication::processEvents(); liveView->setEmptyText(tr("Oximeter not detected")); liveView->setVisible(true); QApplication::processEvents(); SerialOximeter * oximodule = detectOximeter(); if (!oximodule) { updateStatus(tr("Couldn't access oximeter")); ui->retryButton->setVisible(true); ui->progressBar->setValue(0); return; } MachineInfo info = oximodule->newInfo(); Machine *mach = oximodule->CreateMachine(info); connect(oximodule, SIGNAL(updatePlethy(QByteArray)), this, SLOT(on_updatePlethy(QByteArray))); ui->liveConnectLabel->setText(tr("Live Oximetery Mode")); liveView->setEmptyText(tr("Starting up...")); updateStatus(tr("If you can still read this after a few seconds, cancel and try again")); ui->progressBar->hide(); liveView->update(); oximodule->Open("live"); ui->stopButton->setVisible(true); dummyday = new Day(); quint32 starttime = oximodule->startTime().toTime_t(); ti = qint64(starttime) * 1000L; start_ti = ti; session = new Session(mach, starttime); ELplethy = session->AddEventList(OXI_Plethy, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, 20); ELplethy->setFirst(start_ti); session->really_set_first(start_ti); session->setOpened(true); dummyday->addSession(session); plethyChart->setMinX(start_ti); plethyGraph->SetMinX(start_ti); liveView->setDay(dummyday); updateTimer.setParent(this); updateTimer.setInterval(50); updateTimer.start(); connect(&updateTimer, SIGNAL(timeout()), this, SLOT(updateLiveDisplay())); connect(ui->stopButton, SIGNAL(clicked()), this, SLOT(finishedRecording())); importMode = IM_LIVE; } void OximeterImport::finishedRecording() { updateTimer.stop(); oximodule->closeDevice(); disconnect(&updateTimer, SIGNAL(timeout()), this, SLOT(updateLiveDisplay())); disconnect(ui->stopButton, SIGNAL(clicked()), this, SLOT(finishedRecording())); ui->stopButton->setVisible(false); ui->liveConnectLabel->setText(tr("Live Import Stopped")); liveView->setEmptyText(tr("Live Oximetery Stopped")); updateStatus(tr("Live Oximetery import has been stopped")); disconnect(oximodule, SIGNAL(updatePlethy(QByteArray)), this, SLOT(on_updatePlethy(QByteArray))); ui->syncButton->setVisible(true); plethyGraph->SetMinX(start_ti); liveView->SetXBounds(start_ti, ti, 0, true); plethyGraph->setBlockZoom(false); } void OximeterImport::on_retryButton_clicked() { if (ui->stackedWidget->currentWidget() == ui->directImportPage) { on_directImportButton_clicked(); } else if (ui->stackedWidget->currentWidget() == ui->liveImportPage) { on_liveImportButton_clicked(); } } void OximeterImport::on_stopButton_clicked() { if (oximodule) { oximodule->abort(); } } void OximeterImport::on_calendarWidget_clicked(const QDate &date) { if (ui->radioSyncCPAP->isChecked()) { Day * day = p_profile->GetGoodDay(date, MT_CPAP); sessbar->clear(); if (day) { QDateTime time=QDateTime::fromMSecsSinceEpoch(day->first()); sessbar->clear(); QList colors; colors.push_back("#ffffe0"); colors.push_back("#ffe0ff"); colors.push_back("#e0ffff"); QList::iterator i; int j=0; for (i=day->begin(); i != day->end(); ++i) { sessbar->add((*i),colors.at(j++ % colors.size())); } sessbar->setVisible(true); ui->sessbarLabel->setText(tr("%1 session(s) on %2, starting at %3").arg(day->size()).arg(time.date().toString(Qt::SystemLocaleLongDate)).arg(time.time().toString("hh:mm:ssap"))); sessbar->setSelected(0); ui->dateTimeEdit->setDateTime(time); } else { ui->sessbarLabel->setText(tr("No CPAP data available on %1").arg(date.toString(Qt::SystemLocaleLongDate))); ui->dateTimeEdit->setDateTime(QDateTime(date,oximodule->startTime().time())); } sessbar->update(); } else if (ui->radioSyncOximeter) { ui->sessbarLabel->setText(tr("%1").arg(date.toString(Qt::SystemLocaleLongDate))); ui->dateTimeEdit->setDateTime(QDateTime(date, ui->dateTimeEdit->dateTime().time())); } } void OximeterImport::on_calendarWidget_selectionChanged() { on_calendarWidget_clicked(ui->calendarWidget->selectedDate()); } void OximeterImport::onSessionSelected(Session * session) { QDateTime time=QDateTime::fromMSecsSinceEpoch(session->first()); ui->dateTimeEdit->setDateTime(time); } void OximeterImport::on_sessionBackButton_clicked() { int idx = (sessbar->selected()-1); if (idx >= 0) { sessbar->setSelected(idx); QDateTime datetime = QDateTime::fromMSecsSinceEpoch(sessbar->session(idx)->first()); ui->dateTimeEdit->setDateTime(datetime); sessbar->update(); } } void OximeterImport::on_sessionForwardButton_clicked() { int idx = (sessbar->selected()+1); if (idx < sessbar->count()) { sessbar->setSelected(idx); QDateTime datetime = QDateTime::fromMSecsSinceEpoch(sessbar->session(idx)->first()); ui->dateTimeEdit->setDateTime(datetime); sessbar->update(); } } void OximeterImport::on_radioSyncCPAP_clicked() { on_calendarWidget_clicked(oximodule->startTime().date()); ui->syncCPAPGroup->setVisible(true); } void OximeterImport::on_radioSyncOximeter_clicked() { ui->syncCPAPGroup->setVisible(false); if (oximodule && oximodule->isStartTimeValid()) { ui->calendarWidget->setSelectedDate(oximodule->startTime().date()); ui->dateTimeEdit->setDateTime(oximodule->startTime()); } } void OximeterImport::on_updatePlethy(QByteArray plethy) { if (!session) { return; } int size = plethy.size(); quint64 dur = qint64(size) * 20L; ELplethy->AddWaveform(ti, plethy.data(), size, dur); ti += dur; } void OximeterImport::updateLiveDisplay() { if (!session) { return; } if (ui->showLiveGraphs->isChecked()) { qint64 sti = ti - 20000; plethyChart->setMinY(ELplethy->Min()); plethyChart->setMaxY(ELplethy->Max()); plethyGraph->SetMinY(ELplethy->Min()); plethyGraph->SetMaxY(ELplethy->Max()); plethyGraph->SetMinX(sti); plethyGraph->SetMaxX(ti); plethyGraph->setBlockZoom(true); ELplethy->setLast(ti); session->really_set_last(ti); //liveView->SetXBounds(sti, ti, 0, true); session->setMin(OXI_Plethy, ELplethy->Min()); session->setMax(OXI_Plethy, ELplethy->Max()); session->setLast(OXI_Plethy, ti); session->setCount(OXI_Plethy, ELplethy->count()); for (int i = 0; i < liveView->size(); i++) { (*liveView)[i]->SetXBounds(sti, ti); } liveView->updateScale(); liveView->redraw(); } if (!oximodule->oxirec) return; int size = oximodule->oxirec->size(); if (size > 0) { int i = oximodule->startTime().secsTo(QDateTime::currentDateTime()); int seconds = i % 60; int minutes = (i / 60) % 60; int hours = i / 3600; size--; bool datagood = (*(oximodule->oxirec))[size].pulse > 0; if (datagood & (pulse <= 0)) { QString STR_recording = tr("Recording..."); updateStatus(STR_recording); liveView->setEmptyText(STR_recording); if (!ui->showLiveGraphs->isChecked()) { liveView->redraw(); } } else if (!datagood & (pulse != 0)) { QString STR_nofinger = tr("Finger not detected"); updateStatus(STR_nofinger); liveView->setEmptyText(STR_nofinger); if (!ui->showLiveGraphs->isChecked()) { liveView->redraw(); } } pulse = (*(oximodule->oxirec))[size].pulse; spo2 = (*(oximodule->oxirec))[size].spo2; if (pulse > 0) { ui->pulseDisplay->display(QString().sprintf("%3i", pulse)); } else { ui->pulseDisplay->display("---"); } if (spo2 > 0) { ui->spo2Display->display(QString().sprintf("%2i", spo2)); } else { ui->spo2Display->display("--"); } ui->lcdDuration->display(QString().sprintf("%02i:%02i:%02i",hours, minutes, seconds)); } } void OximeterImport::on_cancelButton_clicked() { if (oximodule && oximodule->isStreaming()) { oximodule->closeDevice(); oximodule->trashRecords(); } reject(); } void OximeterImport::on_showLiveGraphs_clicked(bool checked) { if (checked) { updateTimer.setInterval(50); } else { // Don't need to call the timer so often.. Save a little CPU.. updateTimer.setInterval(500); } plethyGraph->setVisible(checked); liveView->redraw(); } void OximeterImport::on_skipWelcomeCheckbox_clicked(bool checked) { p_profile->oxi->setSkipOxiIntroScreen(checked); } void OximeterImport::on_informationButton_clicked() { ui->stackedWidget->setCurrentWidget(ui->welcomePage); ui->nextButton->setVisible(true); ui->informationButton->setVisible(false); } void OximeterImport::on_syncButton_clicked() { Q_ASSERT(oximodule != nullptr); ui->stackedWidget->setCurrentWidget(ui->syncPage); ui->syncButton->setVisible(false); ui->saveButton->setVisible(true); QDate first = p_profile->FirstDay(); QDate last = p_profile->LastDay(); QDate oxidate = oximodule->startTime().date(); if ((oxidate >= first) && (oxidate <= last)) { // TODO: think this through better.. do I need to pick the day before? ui->calendarWidget->setMinimumDate(first); ui->calendarWidget->setMaximumDate(last); ui->calendarWidget->setCurrentPage(oxidate.year(), oxidate.month()); ui->calendarWidget->setSelectedDate(oxidate); on_calendarWidget_clicked(oximodule->startTime().date()); } else { // No CPAP sessions to sync it to.. kill the CPAP sync option on_calendarWidget_clicked(last); ui->calendarWidget->setCurrentPage(oxidate.year(), oxidate.month()); ui->calendarWidget->setSelectedDate(oxidate); } ui->radioSyncOximeter->setChecked(true); on_radioSyncOximeter_clicked(); if (importMode == IM_LIVE) { // Live Recording ui->labelSyncOximeter->setText(tr("I want to use the time my computer recorded for this live oximetry session.")); } else if (!oximodule->isStartTimeValid()) { // Oximeter doesn't provide a clock ui->labelSyncOximeter->setText(tr("I need to set the time manually, because my oximeter doesn't have an internal clock.")); } } void OximeterImport::on_saveButton_clicked() { if (!oximodule) return; QVector * oxirec = nullptr; if (!oximodule->oxisessions.contains(oximodule->startTime())) { QMessageBox::warning(this, STR_MessageBox_Error, tr("Something went wrong getting session data"), QMessageBox::Ok); reject(); return; } oxirec = oximodule->oxisessions[oximodule->startTime()]; if (oxirec->size() < 10) return; // this can move to SerialOximeter class process function... MachineInfo info = oximodule->newInfo(); Machine * mach = oximodule->CreateMachine(info); SessionID sid = ui->dateTimeEdit->dateTime().toUTC().toTime_t(); quint64 start = quint64(sid) * 1000L; if (!session) { session = new Session(mach, sid); session->really_set_first(start); } else { // Live recording... if (dummyday) { dummyday->removeSession(session); delete dummyday; dummyday = nullptr; } session->SetSessionID(sid); session->really_set_first(start); ELplethy->setFirst(start); session->setFirst(OXI_Plethy, start); quint64 duration = start + (ELplethy->count() * ELplethy->rate()); quint64 end = start + duration; session->setLast(OXI_Plethy, end); session->count(OXI_Plethy); session->Min(OXI_Plethy); session->Max(OXI_Plethy); } EventList * ELpulse = nullptr; EventList * ELspo2 = nullptr; EventList * ELperf = nullptr; quint16 lastpulse = 0; quint16 lastspo2 = 0; quint16 lastperf = 0; quint16 lastgoodpulse = 0; quint16 lastgoodspo2 = 0; quint16 lastgoodperf = 0; bool haveperf = oximodule->havePerfIndex(); quint64 ti = start; qint64 step = (importMode == IM_LIVE) ? oximodule->liveResolution() : oximodule->importResolution(); int size = oxirec->size(); // why was I skipping the first sample? not priming it anymore.. for (int i=0; i < size; ++i) { OxiRecord * rec = &(*oxirec)[i]; if (rec->pulse > 0) { if (lastpulse == 0) { ELpulse = session->AddEventList(OXI_Pulse, EVL_Event); } if (lastpulse != rec->pulse) { if (lastpulse > 0) { ELpulse->AddEvent(ti, lastpulse); } ELpulse->AddEvent(ti, rec->pulse); } lastgoodpulse = rec->pulse; } else { // end section properly if (lastgoodpulse > 0) { ELpulse->AddEvent(ti, lastpulse); session->setLast(OXI_Pulse, ti); lastgoodpulse = 0; } } lastpulse = rec->pulse; if (rec->spo2 > 0) { if (lastspo2 == 0) { ELspo2 = session->AddEventList(OXI_SPO2, EVL_Event); } if (lastspo2 != rec->spo2) { if (lastspo2 > 0) { ELspo2->AddEvent(ti, lastspo2); } ELspo2->AddEvent(ti, rec->spo2); } lastgoodspo2 = rec->spo2; } else { // end section properly if (lastgoodspo2 > 0) { ELspo2->AddEvent(ti, lastspo2); session->setLast(OXI_SPO2, ti); lastgoodspo2 = 0; } } lastspo2 = rec->spo2; if (haveperf) { // Perfusion Index if (rec->perf > 0) { if (lastperf == 0) { ELperf = session->AddEventList(OXI_Perf, EVL_Event, 0.01); } if (lastperf != rec->perf) { if (lastperf > 0) { ELperf->AddEvent(ti, lastperf); } ELperf->AddEvent(ti, rec->perf); } lastgoodperf = rec->perf; } else { // end section properly if (lastgoodperf > 0) { ELperf->AddEvent(ti, lastperf); session->setLast(OXI_Perf, ti); lastgoodperf = 0; } } lastperf = rec->perf; } ti += step; } ti -= step; if (ELpulse && (lastpulse > 0)) { ELpulse->AddEvent(ti, lastpulse); session->setLast(OXI_Pulse, ti); } if (ELspo2 && (lastspo2 > 0)) { ELspo2->AddEvent(ti, lastspo2); session->setLast(OXI_SPO2, ti); } if (haveperf && ELperf && lastperf > 0) { ELperf->AddEvent(ti, lastperf); session->setLast(OXI_Perf, ti); } if (haveperf) { session->first(OXI_Perf); session->last(OXI_Perf); session->count(OXI_Perf); session->Min(OXI_Perf); session->Max(OXI_Perf); } calcSPO2Drop(session); calcPulseChange(session); mach->setModel(oximodule->getModel()); mach->setBrand(oximodule->getVendor()); session->first(OXI_Pulse); session->first(OXI_SPO2); session->last(OXI_Pulse); session->last(OXI_SPO2); session->first(OXI_PulseChange); session->first(OXI_SPO2Drop); session->last(OXI_PulseChange); session->last(OXI_SPO2Drop); session->cph(OXI_PulseChange); session->sph(OXI_PulseChange); session->cph(OXI_SPO2Drop); session->sph(OXI_SPO2Drop); session->count(OXI_Pulse); session->count(OXI_SPO2); session->count(OXI_PulseChange); session->count(OXI_SPO2Drop); session->Min(OXI_Pulse); session->Min(OXI_SPO2); session->Max(OXI_Pulse); session->Max(OXI_SPO2); session->really_set_last(ti); session->SetChanged(true); session->setOpened(true); mach->AddSession(session); mach->Save(); mach->SaveSummary(); p_profile->StoreMachines(); mainwin->getDaily()->LoadDate(mainwin->getDaily()->getDate()); mainwin->getOverview()->ReloadGraphs(); ELplethy = nullptr; session = nullptr; oximodule->trashRecords(); accept(); } void OximeterImport::chooseSession() { selecting_session = false; ui->stackedWidget->setCurrentWidget(ui->chooseSessionPage); ui->syncButton->setVisible(false); ui->chooseSessionButton->setVisible(true); QMap *>::iterator it; ui->tableOxiSessions->clearContents(); int row = 0; QTableWidgetItem * item; QVector * oxirec; ui->tableOxiSessions->setRowCount(oximodule->oxisessions.size()); ui->tableOxiSessions->setSelectionBehavior(QAbstractItemView::SelectRows); for (it = oximodule->oxisessions.begin(); it != oximodule->oxisessions.end(); ++it) { const QDateTime & key = it.key(); oxirec = it.value(); item = new QTableWidgetItem(key.toString(Qt::ISODate)); ui->tableOxiSessions->setItem(row, 0, item); item->setFlags(item->flags() & ~Qt::ItemIsEditable); item = new QTableWidgetItem(QString(). sprintf("%lli", oxirec->size() * oximodule->importResolution() / 1000L)); ui->tableOxiSessions->setItem(row, 1, item); item->setFlags(item->flags() & ~Qt::ItemIsEditable); item = new QTableWidgetItem(tr("CMS50 Session %1").arg(row+1, 0)); ui->tableOxiSessions->setItem(row, 2, item); item->setFlags(item->flags() & ~Qt::ItemIsEditable); row++; } ui->tableOxiSessions->selectRow(0); } void OximeterImport::on_chooseSessionButton_clicked() { ui->chooseSessionButton->setVisible(false); QTableWidgetItem * item = ui->tableOxiSessions->item(ui->tableOxiSessions->currentRow(),0); if (!item) return; QDateTime datetime = item->data(Qt::UserRole+1).toDateTime(); oximodule->setStartTime(datetime); oximodule->setDuration(item->data(Qt::UserRole+2).toInt()); if (selecting_session) { ui->stackedWidget->setCurrentWidget(ui->directImportPage); chosen_sessions.push_back(item->data(Qt::UserRole).toInt()); // go back and start import doImport(); } else { on_syncButton_clicked(); } } void OximeterImport::setInformation() { QString html="" "" "

    " +tr("Welcome to the Oximeter Import Wizard")+"

    " "

    " +tr("Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.")+"

    " "

    " +tr("SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.")+"

    " "

    " +tr("SleepyHead is currently compatible with Contec CMS50D+, CMS50E, CMS50F and CMS50I serial oximeters.
    (Note: Direct importing from bluetooth models is probaby not possible yet)")+"

    " "

    " +tr("You may wish to note, other companies, such as Pulox, simply rebadge Contec CMS50's under new names, such as the Pulox PO-200, PO-300, PO-400. These should also work.")+"

    " "

    " +tr("It also can read from ChoiceMMed MD300W1 oximeter .dat files.")+"

    " "

    " ""+tr("Please remember:")+" " "" +tr("If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!")+"

    " "

    " ""+tr("Important Notes:")+" " +tr("For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, %1click here%2.").arg("").arg("")+"

    " "

    " +tr("Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.")+"

    " "

    " +tr("Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.")+"

    "; ui->textBrowser->setHtml(html); ui->textBrowser->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); } void OximeterImport::on_oximeterType_currentIndexChanged(int index) { switch (index) { case 0: //New CMS50's ui->directImportButton->setEnabled(true); ui->liveImportButton->setEnabled(false); ui->fileImportButton->setEnabled(true); ui->oldCMS50specific->setVisible(false); ui->newCMS50settingsPanel->setVisible(true); break; case 1: ui->directImportButton->setEnabled(true); ui->liveImportButton->setEnabled(true); ui->fileImportButton->setEnabled(true); ui->oldCMS50specific->setVisible(true); ui->newCMS50settingsPanel->setVisible(false); break; default: ui->directImportButton->setEnabled(false); ui->liveImportButton->setEnabled(false); ui->fileImportButton->setEnabled(true); ui->oldCMS50specific->setVisible(false); ui->newCMS50settingsPanel->setVisible(false); } p_profile->oxi->setOximeterType(index); } void OximeterImport::on_cms50CheckName_clicked(bool checked) { ui->cms50DeviceName->setEnabled(checked); if (checked) { ui->cms50DeviceName->setFocus(); ui->cms50DeviceName->setCursorPosition(0); } } void OximeterImport::on_cms50SyncTime_clicked(bool checked) { p_profile->oxi->setSyncOximeterClock(checked); } void OximeterImport::on_cms50DeviceName_textEdited(const QString &arg1) { p_profile->oxi->setDefaultDevice(arg1); } sleepyhead-0.9.8/sleepyhead/common_gui.h0000644000175000017500000000524412412506713017653 0ustar sergiosergio/* Common GUI Functions Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef COMMON_GUI_H #define COMMON_GUI_H #include #include "Graphs/glcommon.h" //! \brief Gets the first day of week from the system locale, to show in the calendars. Qt::DayOfWeek firstDayOfWeekFromLocale(); const QString CSTR_GFX_ANGLE = "ANGLE"; const QString CSTR_GFX_OpenGL = "OpenGL"; const QString CSTR_GFX_BrokenGL = "BrokenGL"; const QString STR_GRAPH_EventBreakdown = "EventBreakdown"; const QString STR_GRAPH_SleepFlags = "SF"; const QString STR_GRAPH_Weight = "Weight"; const QString STR_GRAPH_BMI = "BMI"; const QString STR_GRAPH_Zombie = "Zombie"; const QString STR_GRAPH_Sessions = "Sessions"; const QString STR_GRAPH_SessionTimes = "SessionTimes"; const QString STR_GRAPH_Usage = "Usage"; const QString STR_GRAPH_AHI = "AHI"; const QString STR_GRAPH_PeakAHI = "PeakAHI"; //! \brief Returns a text string naming the current graphics engine QString getGraphicsEngine(); QString getOpenGLVersionString(); float getOpenGLVersion(); // Flag Colors extern QColor COLOR_Hypopnea; extern QColor COLOR_Obstructive; extern QColor COLOR_Apnea; extern QColor COLOR_CSR; extern QColor COLOR_LargeLeak; extern QColor COLOR_Ramp; extern QColor COLOR_ClearAirway; extern QColor COLOR_RERA; extern QColor COLOR_VibratorySnore; extern QColor COLOR_FlowLimit; extern QColor COLOR_SensAwake; extern QColor COLOR_LeakFlag; extern QColor COLOR_NRI; extern QColor COLOR_ExP; extern QColor COLOR_PressurePulse; extern QColor COLOR_PulseChange; extern QColor COLOR_SPO2Drop; extern QColor COLOR_UserFlag1; extern QColor COLOR_UserFlag2; // Chart Colors extern QColor COLOR_EPAP; extern QColor COLOR_IPAP; extern QColor COLOR_IPAPLo; extern QColor COLOR_IPAPHi; extern QColor COLOR_Plethy; extern QColor COLOR_Pulse; extern QColor COLOR_SPO2; extern QColor COLOR_FlowRate; extern QColor COLOR_Pressure; extern QColor COLOR_RDI; extern QColor COLOR_AHI; extern QColor COLOR_Leak; extern QColor COLOR_LeakTotal; extern QColor COLOR_MaxLeak; extern QColor COLOR_Snore; extern QColor COLOR_RespRate; extern QColor COLOR_MaskPressure; extern QColor COLOR_PTB; // Patient Triggered Breathing extern QColor COLOR_MinuteVent; extern QColor COLOR_TgMV; extern QColor COLOR_TidalVolume; extern QColor COLOR_FLG; // Flow Limitation Graph extern QColor COLOR_IE; // Inspiratory Expiratory Ratio extern QColor COLOR_Te; extern QColor COLOR_Ti; extern QColor COLOR_SleepStage; #endif // COMMON_GUI_H sleepyhead-0.9.8/sleepyhead/UpdaterWindow.ui0000644000175000017500000002650012412506713020477 0ustar sergiosergio UpdaterWindow 0 0 589 416 SleepyHead Updater :/images/sheep.png:/images/sheep.png 0 0 0 0 0 14 75 true A new version of $APP is available 100 100 :/docs/sheep.png true Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop Qt::Vertical 20 40 Version Information 0 Release Notes 0 0 about:blank Build Notes 0 0 0 0 QFrame::NoFrame QFrame::Plain true QFrame::Box QFrame::Sunken Maybe &Later Qt::Horizontal 40 20 &Upgrade Now 4 4 75 true Please wait while updates are downloaded and installed... 0 Updates 0 0 QAbstractItemView::NoEditTriggers true QAbstractItemView::NoSelection QAbstractItemView::SelectRows true false Component Version Size Progress Log 0 0 0 0 Downloading & Installing Updates Qt::Horizontal 40 20 &Finished QWebView QWidget
    QtWebKit/QWebView
    sleepyhead-0.9.8/sleepyhead/updateparser.cpp0000644000175000017500000001354112412506713020550 0ustar sergiosergio/* UpdateParser Implementation (Autoupdater component) * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include "updateparser.h" #ifndef nullptr #define nullptr NULL #endif Update::Update() { size = 0; } Update::Update(const Update ©) { type = copy.type; version = copy.version; platform = copy.platform; date = copy.date; filename = copy.filename; url = copy.url; hash = copy.hash; size = copy.size; notes = copy.notes; unzipped_path = copy.unzipped_path; } Update::Update(QString _type, QString _version, QString _platform, QDate _date) { type = _type; version = _version; platform = _platform; date = _date; size = 0; } bool UpdateParser::startDocument() { inRelease = false; inUpdate = false; inNotes = false; inUpdateNotes = false; release = nullptr; update = nullptr; return true; } bool UpdateParser::endElement(const QString &namespaceURI, const QString &localName, const QString &qName) { Q_UNUSED(namespaceURI) Q_UNUSED(localName) QString name = qName.toLower(); if (name == "release") { inRelease = false; release = nullptr; } else if (inRelease && name == "update") { inUpdate = false; update = nullptr; } else if (inUpdate && name == "notes") { inUpdateNotes = false; } else if (inRelease && name == "notes") { inNotes = false; } return true; } bool UpdateParser::characters(const QString &ch) { if (inUpdateNotes) { update->notes = ch; } else if (inNotes) { release->notes[platform] = ch; } return true; } UpdateStatus lookupUpdateStatus(QString stat) { UpdateStatus status = UPDATE_TESTING; if (stat == "testing") { status = UPDATE_TESTING; } else if (stat == "beta") { status = UPDATE_BETA; } else if (stat == "stable") { status = UPDATE_STABLE; } else if (stat == "critical") { status = UPDATE_CRITICAL; } return status; } bool UpdateParser::startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts) { Q_UNUSED(namespaceURI) Q_UNUSED(localName) QString name = qName.toLower(); if (inRelease && name == "update") { QString ver, type; UpdateStatus updatestatus = UPDATE_TESTING; for (int i = 0; i < atts.count(); i++) { if (atts.localName(i) == "type") { type = atts.value(i).toLower(); } if (atts.localName(i) == "version") { ver = atts.value(i).toLower(); } if (atts.localName(i) == "platform") { platform = atts.value(i).toLower(); } if (atts.localName(i) == "release_date") { release_date = atts.value(i); } if (atts.localName(i) == "status") { updatestatus = lookupUpdateStatus(atts.value(i).toLower()); } } QDate date = QDate::fromString(release_date, "yyyy-MM-dd"); if (!date.isValid()) { date = QDate::currentDate(); } release->updates[platform].push_back(Update(type, ver, platform, date)); update = &release->updates[platform][release->updates[platform].size() - 1]; update->status = updatestatus; inUpdate = true; } else if (inRelease && name == "info") { QString tmp = atts.value("url"); if (tmp.isEmpty()) { return false; } release->info_url = tmp; } else if (inUpdate && name == "file") { for (int i = 0; i < atts.count(); i++) { if (atts.localName(i) == "name") { update->filename = atts.value(i); } if (atts.localName(i) == "size") { bool ok; update->size = atts.value(i).toLongLong(&ok); //if (!ok) return false; } if (atts.localName(i) == "url") { update->url = atts.value(i); } if (atts.localName(i) == "hash") { update->hash = atts.value(i).toLower(); } } } else if (inUpdate && name == "notes") { inUpdateNotes = true; } else if (inRelease && name == "notes") { platform = ""; if (atts.count() >= 1) { if (atts.localName(0) == "platform") { platform = atts.value(0); } } inNotes = true; } else if (name == "release") { inRelease = true; QString codename; UpdateStatus status = UPDATE_TESTING; for (int i = 0; i < atts.count(); i++) { if (atts.localName(i) == "version") { version = atts.value(i).toLower(); } if (atts.localName(i) == "codename") { codename = atts.value(i); } if (atts.localName(i) == "status") { status = lookupUpdateStatus(atts.value(i).toLower()); } } releases[version] = Release(version, codename, status); release = &releases[version]; if (version > latest_version) { latest_version = version; } } return true; } bool UpdateParser::endDocument() { /*for (QHash::iterator r=releases.begin();r!=releases.end();r++) { Release & rel=r.value(); qDebug() << "New Version" << r.key() << rel.codename << rel.notes; for (QHash::iterator u=rel.files.begin();u!=rel.files.end();u++) { Update & up=u.value(); qDebug() << "Platform:" << u.key() << up.filename << up.date; } }*/ return true; } sleepyhead-0.9.8/sleepyhead/exportcsv.cpp0000644000175000017500000003510212412506713020103 0ustar sergiosergio/* ExportCSV module implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include "SleepLib/profiles.h" #include "SleepLib/day.h" #include "common_gui.h" #include "exportcsv.h" #include "ui_exportcsv.h" #include "mainwindow.h" extern MainWindow *mainwin; ExportCSV::ExportCSV(QWidget *parent) : QDialog(parent), ui(new Ui::ExportCSV) { ui->setupUi(this); ui->rb1_Summary->setChecked(true); ui->quickRangeCombo->setCurrentIndex(0); // Set Date controls locale to 4 digit years QLocale locale = QLocale::system(); QString shortformat = locale.dateFormat(QLocale::ShortFormat); if (!shortformat.toLower().contains("yyyy")) { shortformat.replace("yy", "yyyy"); } ui->startDate->setDisplayFormat(shortformat); ui->endDate->setDisplayFormat(shortformat); // Stop both calendar drop downs highlighting weekends in red QTextCharFormat format = ui->startDate->calendarWidget()->weekdayTextFormat(Qt::Saturday); format.setForeground(QBrush(Qt::black, Qt::SolidPattern)); ui->startDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format); ui->startDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format); ui->endDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format); ui->endDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format); Qt::DayOfWeek dow = firstDayOfWeekFromLocale(); ui->startDate->calendarWidget()->setFirstDayOfWeek(dow); ui->endDate->calendarWidget()->setFirstDayOfWeek(dow); // Connect the signals to update which days have CPAP data when the month is changed connect(ui->startDate->calendarWidget(), SIGNAL(currentPageChanged(int, int)), SLOT(startDate_currentPageChanged(int, int))); connect(ui->endDate->calendarWidget(), SIGNAL(currentPageChanged(int, int)), SLOT(endDate_currentPageChanged(int, int))); on_quickRangeCombo_activated(tr("Most Recent Day")); ui->rb1_details->clearFocus(); ui->quickRangeCombo->setFocus(); ui->exportButton->setEnabled(false); } ExportCSV::~ExportCSV() { delete ui; } void ExportCSV::on_filenameBrowseButton_clicked() { QString timestamp = tr("SleepyHead_"); timestamp += p_profile->Get("Username") + "_"; if (ui->rb1_details->isChecked()) { timestamp += tr("Details_"); } if (ui->rb1_Sessions->isChecked()) { timestamp += tr("Sessions_"); } if (ui->rb1_Summary->isChecked()) { timestamp += tr("Summary_"); } timestamp += ui->startDate->date().toString(Qt::ISODate); if (ui->startDate->date() != ui->endDate->date()) { timestamp += "_" + ui->endDate->date().toString(Qt::ISODate); } timestamp += ".csv"; QString name = QFileDialog::getSaveFileName(this, tr("Select file to export to"), PREF.Get("{home}/") + timestamp, tr("CSV Files (*.csv)")); if (name.isEmpty()) { ui->exportButton->setEnabled(false); return; } if (!name.toLower().endsWith(".csv")) { name += ".csv"; } ui->filenameEdit->setText(name); ui->exportButton->setEnabled(true); } void ExportCSV::on_quickRangeCombo_activated(const QString &arg1) { QDate first = p_profile->FirstDay(); QDate last = p_profile->LastDay(); if (arg1 == tr("Custom")) { ui->startDate->setEnabled(true); ui->endDate->setEnabled(true); ui->startLabel->setEnabled(true); ui->endLabel->setEnabled(true); } else { ui->startDate->setEnabled(false); ui->endDate->setEnabled(false); ui->startLabel->setEnabled(false); ui->endLabel->setEnabled(false); if (arg1 == tr("Everything")) { ui->startDate->setDate(first); ui->endDate->setDate(last); } else if (arg1 == tr("Most Recent Day")) { ui->startDate->setDate(last); ui->endDate->setDate(last); } else if (arg1 == tr("Last Week")) { ui->startDate->setDate(last.addDays(-7)); ui->endDate->setDate(last); } else if (arg1 == tr("Last Fortnight")) { ui->startDate->setDate(last.addDays(-14)); ui->endDate->setDate(last); } else if (arg1 == tr("Last Month")) { ui->startDate->setDate(last.addMonths(-1)); ui->endDate->setDate(last); } else if (arg1 == tr("Last 6 Months")) { ui->startDate->setDate(last.addMonths(-6)); ui->endDate->setDate(last); } else if (arg1 == tr("Last Year")) { ui->startDate->setDate(last.addYears(-1)); ui->endDate->setDate(last); } } } void ExportCSV::on_exportButton_clicked() { QFile file(ui->filenameEdit->text()); file.open(QFile::WriteOnly); QString header; const QString sep = ","; const QString newline = "\n"; // if (ui->rb1_details->isChecked()) { // fields.append(DumpField(NoChannel,MT_CPAP,ST_DATE)); // } else { // header=tr("DateTime")+sep+tr("Session")+sep+tr("Event")+sep+tr("Data/Duration"); // } else { // if (ui->rb1_Summary->isChecked()) { // header=tr("Date")+sep+tr("Session Count")+sep+tr("Start")+sep+tr("End")+sep+tr("Total Time")+sep+tr("AHI"); // } else if (ui->rb1_Sessions->isChecked()) { // header=tr("Date")+sep+tr("Session")+sep+tr("Start")+sep+tr("End")+sep+tr("Total Time")+sep+tr("AHI"); // } // } // fields.append(DumpField(NoChannel,MT_CPAP,ST_SESSIONS)); QList countlist, avglist, p90list; countlist.append(CPAP_Hypopnea); countlist.append(CPAP_Obstructive); countlist.append(CPAP_Apnea); countlist.append(CPAP_ClearAirway); countlist.append(CPAP_VSnore); countlist.append(CPAP_VSnore2); countlist.append(CPAP_RERA); countlist.append(CPAP_FlowLimit); countlist.append(CPAP_SensAwake); countlist.append(CPAP_NRI); countlist.append(CPAP_ExP); countlist.append(CPAP_LeakFlag); countlist.append(CPAP_UserFlag1); countlist.append(CPAP_UserFlag2); countlist.append(CPAP_PressurePulse); avglist.append(CPAP_Pressure); avglist.append(CPAP_IPAP); avglist.append(CPAP_EPAP); p90list.append(CPAP_Pressure); p90list.append(CPAP_IPAP); p90list.append(CPAP_EPAP); EventDataType percent = 0.90F; // Not sure this section should be translateable.. :-/ if (ui->rb1_details->isChecked()) { header = tr("DateTime") + sep + tr("Session") + sep + tr("Event") + sep + tr("Data/Duration"); } else { if (ui->rb1_Summary->isChecked()) { header = tr("Date") + sep + tr("Session Count") + sep + tr("Start") + sep + tr("End") + sep + tr("Total Time") + sep + tr("AHI"); } else if (ui->rb1_Sessions->isChecked()) { header = tr("Date") + sep + tr("Session") + sep + tr("Start") + sep + tr("End") + sep + tr("Total Time") + sep + tr("AHI"); } for (int i = 0; i < countlist.size(); i++) { header += sep + schema::channel[countlist[i]].label() + tr(" Count"); } for (int i = 0; i < avglist.size(); i++) { header += sep + schema::channel[avglist[i]].label() + " " + tr(" Avg"); } for (int i = 0; i < p90list.size(); i++) { header += sep + schema::channel[p90list[i]].label() + tr(" %1%").arg(percent, 0, 'f', 0); } } header += newline; file.write(header.toLatin1()); QDate date = ui->startDate->date(); Daily *daily = mainwin->getDaily(); QDate daily_date = daily->getDate(); ui->progressBar->setValue(0); ui->progressBar->setMaximum(p_profile->daylist.count()); do { ui->progressBar->setValue(ui->progressBar->value() + 1); QApplication::processEvents(); Day *day = p_profile->GetDay(date, MT_CPAP); if (day) { QString data; if (ui->rb1_Summary->isChecked()) { QDateTime start = QDateTime::fromTime_t(day->first() / 1000L); QDateTime end = QDateTime::fromTime_t(day->last() / 1000L); data = date.toString(Qt::ISODate); data += sep + QString::number(day->size(), 10); data += sep + start.toString(Qt::ISODate); data += sep + end.toString(Qt::ISODate); int time = day->total_time() / 1000L; int h = time / 3600; int m = int(time / 60) % 60; int s = int(time) % 60; data += sep + QString().sprintf("%02i:%02i:%02i", h, m, s); float ahi = day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count( CPAP_Apnea) + day->count(CPAP_ClearAirway); ahi /= day->hours(); data += sep + QString::number(ahi, 'f', 3); for (int i = 0; i < countlist.size(); i++) { data += sep + QString::number(day->count(countlist.at(i))); } for (int i = 0; i < avglist.size(); i++) { data += sep + QString::number(day->wavg(avglist.at(i))); } for (int i = 0; i < p90list.size(); i++) { data += sep + QString::number(day->p90(p90list.at(i))); } data += newline; file.write(data.toLatin1()); } else if (ui->rb1_Sessions->isChecked()) { for (int i = 0; i < day->size(); i++) { Session *sess = (*day)[i]; QDateTime start = QDateTime::fromTime_t(sess->first() / 1000L); QDateTime end = QDateTime::fromTime_t(sess->last() / 1000L); data = date.toString(Qt::ISODate); data += sep + QString::number(sess->session(), 10); data += sep + start.toString(Qt::ISODate); data += sep + end.toString(Qt::ISODate); int time = sess->length() / 1000L; int h = time / 3600; int m = int(time / 60) % 60; int s = int(time) % 60; data += sep + QString().sprintf("%02i:%02i:%02i", h, m, s); float ahi = sess->count(CPAP_Obstructive) + sess->count(CPAP_Hypopnea) + sess->count( CPAP_Apnea) + sess->count(CPAP_ClearAirway); ahi /= sess->hours(); data += sep + QString::number(ahi, 'f', 3); for (int j = 0; j < countlist.size(); j++) { data += sep + QString::number(sess->count(countlist.at(j))); } for (int j = 0; j < avglist.size(); j++) { data += sep + QString::number(day->wavg(avglist.at(j))); } for (int j = 0; j < p90list.size(); j++) { data += sep + QString::number(day->p90(p90list.at(j))); } data += newline; file.write(data.toLatin1()); } } else if (ui->rb1_details->isChecked()) { QList all = countlist; all.append(avglist); for (int i = 0; i < day->size(); i++) { Session *sess = (*day)[i]; sess->OpenEvents(); QHash >::iterator fnd; for (int j = 0; j < all.size(); j++) { ChannelID key = all.at(j); fnd = sess->eventlist.find(key); if (fnd != sess->eventlist.end()) { //header="DateTime"+sep+"Session"+sep+"Event"+sep+"Data/Duration"; for (int e = 0; e < fnd.value().size(); e++) { EventList *ev = fnd.value()[e]; for (quint32 q = 0; q < ev->count(); q++) { data = QDateTime::fromTime_t(ev->time(q) / 1000L).toString(Qt::ISODate); data += sep + QString::number(sess->session()); data += sep + schema::channel[key].code(); data += sep + QString::number(ev->data(q), 'f', 2); data += newline; file.write(data.toLatin1()); } } } } if (daily_date != date) { sess->TrashEvents(); } } } } date = date.addDays(1); } while (date <= ui->endDate->date()); file.close(); ExportCSV::accept(); } void ExportCSV::UpdateCalendarDay(QDateEdit *dateedit, QDate date) { QCalendarWidget *calendar = dateedit->calendarWidget(); QTextCharFormat bold; QTextCharFormat cpapcol; QTextCharFormat normal; QTextCharFormat oxiday; bold.setFontWeight(QFont::Bold); cpapcol.setForeground(QBrush(Qt::blue, Qt::SolidPattern)); cpapcol.setFontWeight(QFont::Bold); oxiday.setForeground(QBrush(Qt::red, Qt::SolidPattern)); oxiday.setFontWeight(QFont::Bold); bool hascpap = p_profile->GetDay(date, MT_CPAP) != nullptr; bool hasoxi = p_profile->GetDay(date, MT_OXIMETER) != nullptr; //bool hasjournal=p_profile->GetDay(date,MT_JOURNAL)!=nullptr; if (hascpap) { if (hasoxi) { calendar->setDateTextFormat(date, oxiday); } else { calendar->setDateTextFormat(date, cpapcol); } } else if (p_profile->GetDay(date)) { calendar->setDateTextFormat(date, bold); } else { calendar->setDateTextFormat(date, normal); } calendar->setHorizontalHeaderFormat(QCalendarWidget::ShortDayNames); } void ExportCSV::startDate_currentPageChanged(int year, int month) { QDate d(year, month, 1); int dom = d.daysInMonth(); for (int i = 1; i <= dom; i++) { d = QDate(year, month, i); UpdateCalendarDay(ui->startDate, d); } } void ExportCSV::endDate_currentPageChanged(int year, int month) { QDate d(year, month, 1); int dom = d.daysInMonth(); for (int i = 1; i <= dom; i++) { d = QDate(year, month, i); UpdateCalendarDay(ui->endDate, d); } } sleepyhead-0.9.8/sleepyhead/logger.cpp0000644000175000017500000000631712412506713017333 0ustar sergiosergio/* SleepyHead Logger module implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "logger.h" QThreadPool * otherThreadPool = NULL; #if QT_VERSION < QT_VERSION_CHECK(5,0,0) void MyOutputHandler(QtMsgType type, const char *msgtxt) { #else void MyOutputHandler(QtMsgType type, const QMessageLogContext &context, const QString &msgtxt) { Q_UNUSED(context) #endif if (!logger) { #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) fprintf(stderr, "Pre/Post: %s\n", msgtxt.toLocal8Bit().constData()); #else fprintf(stderr, "Pre/Post: %s\n", msgtxt); #endif return; } QString msg, typestr; switch (type) { case QtWarningMsg: typestr = QString("Warning: "); break; case QtFatalMsg: typestr = QString("Fatal: "); break; case QtCriticalMsg: typestr = QString("Critical: "); break; default: typestr = QString("Debug: "); break; } #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) msg = typestr + msgtxt; //+QString(" (%1:%2, %3)").arg(context.file).arg(context.line).arg(context.function); #else msg = typestr + msgtxt; #endif if (logger && logger->isRunning()) { logger->append(msg); } else { fprintf(stderr, "%s\n", msg.toLocal8Bit().data()); } if (type == QtFatalMsg) { abort(); } } void initializeLogger() { logger = new LogThread(); otherThreadPool = new QThreadPool(); bool b = otherThreadPool->tryStart(logger); #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) qInstallMessageHandler(MyOutputHandler); #else qInstallMsgHandler(MyOutputHandler); #endif if (b) { qWarning() << "Started logging thread"; } else { qWarning() << "Logging thread did not start correctly"; } } void shutdownLogger() { if (logger) { logger->quit(); otherThreadPool->waitForDone(-1); logger = NULL; } delete otherThreadPool; } LogThread * logger = NULL; void LogThread::append(QString msg) { QString tmp = QString("%1: %2").arg(logtime.elapsed(), 5, 10, QChar('0')).arg(msg); //QStringList appears not to be threadsafe strlock.lock(); buffer.append(tmp); strlock.unlock(); } void LogThread::appendClean(QString msg) { strlock.lock(); buffer.append(msg); strlock.unlock(); } void LogThread::quit() { qDebug() << "Shutting down logging thread"; running = false; strlock.lock(); while (!buffer.isEmpty()) { QString msg = buffer.takeFirst(); fprintf(stderr, "%s\n", msg.toLocal8Bit().constData()); } strlock.unlock(); } void LogThread::run() { running = true; do { strlock.lock(); //int r = receivers(SIGNAL(outputLog(QString()))); while (!buffer.isEmpty()) { QString msg = buffer.takeFirst(); fprintf(stderr, "%s\n", msg.toLocal8Bit().data()); emit outputLog(msg); } strlock.unlock(); QThread::msleep(1000); } while (running); } sleepyhead-0.9.8/sleepyhead/mainwindow.h0000644000175000017500000002625312412506713017676 0ustar sergiosergio/* SleepyHead MainWindow Headers * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include #include #include "daily.h" #include "overview.h" #include "preferencesdialog.h" extern Profile *profile; QString getCPAPPixmap(QString mach_class); namespace Ui { class MainWindow; } /*! \mainpage SleepyHead \section intro_sec Introduction SleepyHead is Cross-Platform Open-Source software for reviewing data from %CPAP machines, which are used in the treatment of Sleep Disorders. SleepyHead has been created by Mark Watkins (JediMark), an Australian software developer. This document is an attempt to provide a little technical insight into SleepyHead's program internals. \section project_info Further Information The project is hosted on sourceforge, and it's project page can be reached at http://sourceforge.net/projects/sleepyhead. There is also the SleepyHead Wiki containing further information \section structure Program Structure SleepyHead is written in C++ using Qt Toolkit library, and comprises of 3 main components \list \li The SleepLib Database, a specialized database for working with multiple sources of Sleep machine data. \li A custom designed, high performance and interactive OpenGL Graphing Library. \li and the main Application user interface. \endlist This document is still a work in progress, right now all the classes and sections are jumbled together. */ // * \section install_sec Installation extern QStatusBar *qstatusbar; //QString getCPAPPixmap(QString mach_class); class Daily; class Report; class Overview; /*! \class MainWindow \author Mark Watkins \brief The Main Application window for SleepyHead */ class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); //! \brief Update the list of Favourites (Bookmarks) in the right sidebar. void updateFavourites(); //! \brief Update statistics report void GenerateStatistics(); //! \brief Create a new menu object in the main menubar. QMenu *CreateMenu(QString title); //! \brief Start the automatic update checker process void CheckForUpdates(); /*! \fn Notify(QString s,int ms=5000, QString title="SleepyHead v"+VersionString()); \brief Pops up a message box near the system tray \param QString string \param title \param int ms Title is shown in bold string is the main message content to show ms = millisecond delay of how long to show popup Mac needs Growl notification system for this to work */ void Notify(QString s, QString title = "", int ms = 5000); // /*! \fn gGraphView *snapshotGraph() // \brief Returns the current snapshotGraph object used by the report printing system */ // gGraphView *snapshotGraph() { return SnapshotGraph; } //! \brief Returns the Daily Tab object Daily *getDaily() { return daily; } //! \brief Returns the Overview Tab object Overview *getOverview() { return overview; } /*! \fn void RestartApplication(bool force_login=false); \brief Closes down SleepyHead and restarts it \param bool force_login If force_login is set, it will return to the login menu even if it's set to skip */ static void RestartApplication(bool force_login = false, bool change_datafolder = false); void JumpDaily(); void sendStatsUrl(QString msg) { on_recordsBox_linkClicked(QUrl(msg)); } //! \brief Sets up recalculation of all event summaries and flags void reprocessEvents(bool restart = false); //! \brief Internal function to set Records Box html from statistics module void setRecBoxHTML(QString html); int importCPAP(ImportPath import, const QString &message); void startImportDialog() { on_action_Import_Data_triggered(); } void log(QString text); public slots: //! \brief Recalculate all event summaries and flags void doReprocessEvents(); void MachineUnsupported(Machine * m); protected: virtual void closeEvent(QCloseEvent *); virtual void keyPressEvent(QKeyEvent *event); private slots: /*! \fn void on_action_Import_Data_triggered(); \brief Provide the file dialog for selecting import location, and start the import process This is called when the Import button is clicked */ void on_action_Import_Data_triggered(); //! \brief Toggle Fullscreen (currently F11) void on_action_Fullscreen_triggered(); //! \brief Loads the default page in the Welcome screens web browser void on_homeButton_clicked(); //! \brief Go back in the welcome browsers history void on_backButton_clicked(); //! \brief Go forward in the welcome browsers history void on_forwardButton_clicked(); //! \brief Updates the URL bar to show changes to the URL void on_webView_urlChanged(const QUrl &arg1); //! \brief Loads a web page when enter is pressed in the URL bar void on_urlBar_activated(const QString &arg1); //! \brief Selects the Daily page and redraws the graphs void on_dailyButton_clicked(); //! \brief Selects the Overview page and redraws the graphs void on_overviewButton_clicked(); //! \brief called when webpage has finished loading in welcome browser void on_webView_loadFinished(bool arg1); //! \brief called when webpage has starts loading in welcome browser void on_webView_loadStarted(); //! \brief Updates the progress bar in the statusbar while a page is loading void on_webView_loadProgress(int progress); //! \brief Display About Dialog void on_action_About_triggered(); //! \brief Called after a timeout to initiate loading of all summary data for this profile void Startup(); //! \brief Toggle the Debug pane on and off void on_actionDebug_toggled(bool arg1); //! \brief passes the ResetGraphLayout menu click to the Daily & Overview views void on_action_Reset_Graph_Layout_triggered(); //! \brief Opens the Preferences Dialog, and saving changes if OK is pressed void on_action_Preferences_triggered(); //! \brief Opens and/or shows the Oximetry page void on_oximetryButton_clicked(); //! \brief Creates the UpdaterWindow object that actually does the real check for updates void on_actionCheck_for_Updates_triggered(); //! \brief Attempts to do a screenshot of the application window //! \note This is currently broken on Macs void on_action_Screenshot_triggered(); //! \brief This is the actual screenshot code.. It's delayed with a QTimer to give the menu time to close. void DelayedScreenshot(); //! \brief a slot that calls the real Oximetry tab selector void on_actionView_Oximetry_triggered(); //! \brief Updates the Statusbar message with the QString message contained in Text void updatestatusBarMessage(const QString &text); //! \brief Passes the Daily, Overview & Oximetry object to Print Report, based on current tab void on_actionPrint_Report_triggered(); //! \brief Opens the Profile Editor void on_action_Edit_Profile_triggered(); //! \brief Selects the next view tab void on_action_CycleTabs_triggered(); //! \brief Opens the CSV Export window void on_actionExp_ort_triggered(); //! \brief Opens the User Guide at the wiki in the welcome browser. void on_actionOnline_Users_Guide_triggered(); //! \brief Opens the Frequently Asked Questions at the wiki in the welcome browser. void on_action_Frequently_Asked_Questions_triggered(); /*! \fn void on_action_Rebuild_Oximetry_Index_triggered(); \brief This function scans over all oximetry data and reindexes and tries to fix any inconsistencies. */ void on_action_Rebuild_Oximetry_Index_triggered(); //! \brief Log out, by effectively forcing a restart void on_actionChange_User_triggered(); //! \brief Destroy the CPAP data for the currently selected day, so it can be freshly imported again void on_actionPurge_Current_Day_triggered(); void on_action_Sidebar_Toggle_toggled(bool arg1); void on_recordsBox_linkClicked(const QUrl &arg1); void on_helpButton_clicked(); void on_actionView_Statistics_triggered(); void on_webView_linkClicked(const QUrl &arg1); //void on_favouritesList_itemSelectionChanged(); //void on_favouritesList_itemClicked(QListWidgetItem *item); void on_webView_statusBarMessage(const QString &text); //! \brief Display Help WebView Link in statusbar. void LinkHovered(const QString &link, const QString &title, const QString &textContent); void on_tabWidget_currentChanged(int index); void on_bookmarkView_linkClicked(const QUrl &arg1); void on_filterBookmarks_editingFinished(); void on_filterBookmarksButton_clicked(); void on_actionImport_ZEO_Data_triggered(); void on_actionImport_RemStar_MSeries_Data_triggered(); void on_actionSleep_Disorder_Terms_Glossary_triggered(); void on_actionHelp_Support_SleepyHead_Development_triggered(); void aboutBoxLinkClicked(const QUrl &url); void on_actionChange_Language_triggered(); void on_actionChange_Data_Folder_triggered(); void on_actionImport_Somnopose_Data_triggered(); //! \brief Populates the statistics with information. void on_statisticsButton_clicked(); void on_statisticsView_linkClicked(const QUrl &arg1); void on_reportModeMonthly_clicked(); void on_reportModeStandard_clicked(); void on_actionRebuildCPAP(QAction *action); void on_actionPurgeMachine(QAction *action); void on_reportModeRange_clicked(); void on_actionPurgeCurrentDaysOximetry_triggered(); void logMessage(QString msg); void on_importButton_clicked(); void on_changeWarningMessage(); void on_actionToggle_Line_Cursor_toggled(bool arg1); void on_actionLeft_Daily_Sidebar_toggled(bool arg1); void on_actionDaily_Calendar_toggled(bool arg1); void on_actionExport_Journal_triggered(); void on_actionShow_Performance_Counters_toggled(bool arg1); void on_aboutToQuit(); private: void importCPAPBackups(); void finishCPAPImport(); QList detectCPAPCards(); QString getWelcomeHTML(); void FreeSessions(); Ui::MainWindow *ui; Daily *daily; Overview *overview; bool first_load; PreferencesDialog *prefdialog; QTime logtime; QSystemTrayIcon *systray; QMenu *systraymenu; // gGraphView *SnapshotGraph; QString bookmarkFilter; bool m_restartRequired; volatile bool m_inRecalculation; void PopulatePurgeMenu(); //! \brief Destroy ALL the CPAP data for the selected machine void purgeMachine(Machine *); int warnidx; QStringList warnmsg; QTimer wtimer; }; #endif // MAINWINDOW_H sleepyhead-0.9.8/sleepyhead/overview.ui0000644000175000017500000001605112412506713017551 0ustar sergiosergio Overview 0 0 760 392 Form 0 0 0 0 0 16777215 45 QFrame::StyledPanel QFrame::Raised 4 4 0 4 0 Range: 0 0 Last Week Last Two Weeks Last Month Last Two Months Last Three Months Last 6 Months Last Year Everything Custom Start: 0 0 true Qt::UTC End: 0 0 true Qt::UTC Reset view to selected date range QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } ... :/icons/refresh.png:/icons/refresh.png Qt::Horizontal QSizePolicy::Fixed 4 20 Toggle Graph Visibility QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } ... true true Qt::DownArrow Drop down to see list of graphs to switch on/off. Graphs sleepyhead-0.9.8/sleepyhead/exportcsv.ui0000644000175000017500000001661412412506713017745 0ustar sergiosergio ExportCSV 0 0 521 254 Export as CSV :/icons/save.png:/icons/save.png Dates: 0 0 Resolution: Details Sessions Daily true Qt::Horizontal 40 20 Filename: Qt::Horizontal 40 20 Cancel Export 0 0 Start: QDateTimeEdit::DaySection true 0 0 End: QDateTimeEdit::DaySection true Qt::Horizontal 40 20 0 0 Quick Range: Most Recent Day Last Week Last Fortnight Last Month Last 6 Months Last Year Everything Custom ... Qt::Vertical 20 40 0 cancelButton clicked() ExportCSV reject() 377 230 260 126 sleepyhead-0.9.8/sleepyhead/mainwindow.cpp0000644000175000017500000026056012412506713020232 0ustar sergiosergio/* SleepyHead MainWindow Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "common_gui.h" #include "version.h" #include // Custom loaders that don't autoscan.. #include #include #ifndef REMSTAR_M_SUPPORT #include #endif #include "logger.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "newprofile.h" #include "exportcsv.h" #include "SleepLib/schema.h" #include "Graphs/glcommon.h" #include "UpdaterWindow.h" #include "SleepLib/calcs.h" #include "SleepLib/progressdialog.h" #include "version.h" #include "reports.h" #include "statistics.h" QProgressBar *qprogress; QLabel *qstatus; QStatusBar *qstatusbar; extern Profile *profile; QString getOpenGLVersionString() { static QString glversion; if (glversion.isEmpty()) { QGLWidget w; w.makeCurrent(); glversion = QString(QLatin1String(reinterpret_cast(glGetString(GL_VERSION)))); qDebug() << "OpenGL Version:" << glversion; } return glversion; } float getOpenGLVersion() { QString glversion = getOpenGLVersionString(); glversion = glversion.section(" ",0,0); bool ok; float v = glversion.toFloat(&ok); if (!ok) { QString tmp = glversion.section(".",0,1); v = tmp.toFloat(&ok); if (!ok) { // just look at major, we are only interested in whether we have OpenGL 2.0 anyway tmp = glversion.section(".",0,0); v = tmp.toFloat(&ok); } } return v; } QString getGraphicsEngine() { QString gfxEngine = QString(); #ifdef BROKEN_OPENGL_BUILD gfxEngine = CSTR_GFX_BrokenGL; #else QString glversion = getOpenGLVersionString(); if (glversion.contains(CSTR_GFX_ANGLE)) { gfxEngine = CSTR_GFX_ANGLE; } else { gfxEngine = CSTR_GFX_OpenGL; } #endif return gfxEngine; } void MainWindow::logMessage(QString msg) { ui->logText->appendPlainText(msg); } void loadChannels(); void saveChannels(); MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { Q_ASSERT(p_profile != nullptr); ui->setupUi(this); if (logger) { connect(logger, SIGNAL(outputLog(QString)), this, SLOT(logMessage(QString))); } QString version = VersionString; #ifdef TEST_BUILD version += QString(STR_TestBuild); #else ui->warningLabel->hide(); #endif version += " "+getGraphicsEngine(); if (QString(GIT_BRANCH) != "master") { version += " [" + QString(GIT_BRANCH)+" branch]"; } this->setWindowTitle(STR_TR_SleepyHead + QString(" v%1 (" + tr("Profile") + ": %2)").arg(version).arg(PREF[STR_GEN_Profile].toString())); qDebug() << STR_TR_SleepyHead << VersionString << "built with Qt" << QT_VERSION_STR << "on" << __DATE__ << __TIME__; #ifdef BROKEN_OPENGL_BUILD qDebug() << "This build has been created especially for computers with older graphics hardware.\n"; #endif //ui->tabWidget->setCurrentIndex(1); #ifdef Q_OS_MAC ui->action_About->setMenuRole(QAction::ApplicationSpecificRole); ui->action_Preferences->setMenuRole(QAction::ApplicationSpecificRole); ui->action_Exit->setMenuRole(QAction::ApplicationSpecificRole); #if(QT_VERSIONaction_Screenshot->setEnabled(false); #endif #endif //#ifdef LOCK_RESMED_SESSIONS // QList machines = p_profile->GetMachines(MT_CPAP); // for (QList::iterator it = machines.begin(); it != machines.end(); ++it) { // QString mclass=(*it)->loaderName(); // if (mclass == STR_MACH_ResMed) { // qDebug() << "ResMed machine found.. locking Session splitting capabilities"; // // Have to sacrifice these features to get access to summary data. // p_profile->session->setCombineCloseSessions(0); // p_profile->session->setDaySplitTime(QTime(12,0,0)); // p_profile->session->setIgnoreShortSessions(false); // break; // } // } //#endif ui->actionToggle_Line_Cursor->setChecked(p_profile->appearance->lineCursorMode()); overview = nullptr; daily = nullptr; prefdialog = nullptr; m_inRecalculation = false; m_restartRequired = false; // Initialize Status Bar objects qstatusbar = ui->statusbar; qprogress = new QProgressBar(this); qprogress->setMaximum(100); qstatus = new QLabel("", this); qprogress->hide(); ui->statusbar->setMinimumWidth(200); ui->statusbar->addPermanentWidget(qstatus, 0); ui->statusbar->addPermanentWidget(qprogress, 1); ui->actionDebug->setChecked(p_profile->general->showDebug()); QTextCharFormat format = ui->statStartDate->calendarWidget()->weekdayTextFormat(Qt::Saturday); format.setForeground(QBrush(Qt::black, Qt::SolidPattern)); Qt::DayOfWeek dow=firstDayOfWeekFromLocale(); ui->statStartDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format); ui->statStartDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format); ui->statStartDate->calendarWidget()->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader); ui->statStartDate->calendarWidget()->setFirstDayOfWeek(dow); ui->statEndDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format); ui->statEndDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format); ui->statEndDate->calendarWidget()->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader); ui->statEndDate->calendarWidget()->setFirstDayOfWeek(dow); ui->statEndDate->setVisible(false); ui->statStartDate->setVisible(false); ui->reportModeRange->setVisible(false); switch(p_profile->general->statReportMode()) { case 0: ui->reportModeStandard->setChecked(true); break; case 1: ui->reportModeMonthly->setChecked(true); break; case 2: ui->reportModeRange->setChecked(true); ui->statEndDate->setVisible(true); ui->statStartDate->setVisible(true); break; default: p_profile->general->setStatReportMode(0); } if (!p_profile->general->showDebug()) { ui->logText->hide(); } ui->actionShow_Performance_Counters->setChecked(p_profile->general->showPerformance()); #ifdef Q_OS_MAC p_profile->appearance->setAntiAliasing(false); #endif //ui->action_Link_Graph_Groups->setChecked(p_profile->general->linkGroups()); first_load = true; // Using the dirty registry here. :( QSettings settings(getDeveloperName(), getAppName()); // Load previous Window geometry (this is currently broken on Mac as of Qt5.2.1) restoreGeometry(settings.value("MainWindow/geometry").toByteArray()); daily = new Daily(ui->tabWidget, nullptr); ui->tabWidget->insertTab(2, daily, STR_TR_Daily); // Start with the Summary Tab ui->tabWidget->setCurrentWidget(ui->statisticsTab); // setting this to daily shows the cube during loading.. // Nifty Notification popups in System Tray (uses Growl on Mac) if (QSystemTrayIcon::isSystemTrayAvailable() && QSystemTrayIcon::supportsMessages()) { systray = new QSystemTrayIcon(QIcon(":/icons/bob-v3.0.png"), this); systray->show(); systraymenu = new QMenu(this); systray->setContextMenu(systraymenu); QAction *a = systraymenu->addAction(STR_TR_SleepyHead + " v" + VersionString); a->setEnabled(false); systraymenu->addSeparator(); systraymenu->addAction(tr("&About"), this, SLOT(on_action_About_triggered())); systraymenu->addAction(tr("Check for &Updates"), this, SLOT(on_actionCheck_for_Updates_triggered())); systraymenu->addSeparator(); systraymenu->addAction(tr("E&xit"), this, SLOT(close())); } else { // if not available, the messages will popup in the taskbar systray = nullptr; systraymenu = nullptr; } ui->toolBox->setCurrentIndex(0); bool b = p_profile->appearance->rightSidebarVisible(); ui->action_Sidebar_Toggle->setChecked(b); ui->toolBox->setVisible(b); daily->graphView()->redraw(); if (p_profile->cpap->AHIWindow() < 30.0) { p_profile->cpap->setAHIWindow(60.0); } ui->recordsBox->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); ui->statisticsView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks); ui->bookmarkView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); QString loadingtxt = "

    " + tr("Loading...") + "

    "; ui->statisticsView->setHtml(loadingtxt); on_tabWidget_currentChanged(0); #ifndef REMSTAR_M_SUPPORT ui->actionImport_RemStar_MSeries_Data->setVisible(false); #endif on_homeButton_clicked(); qsrand(QDateTime::currentDateTime().toTime_t()); // Translators, these are only temporary messages, don't bother unless you really want to.. warnmsg.push_back(tr("Warning: This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.")); warnmsg.push_back(tr("If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.")); warnmsg.push_back(tr("Make sure your keep your SleepyHead data folder backed up when trying testing versions.")); warnmsg.push_back(tr("Please ensure you are running the latest version before reporting any bugs.")); warnmsg.push_back(tr("When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.")); warnmsg.push_back(tr("Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.")); warnmsg.push_back(tr("Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!")); warnmsg.push_back(tr("This red message line is intentional, and will not be a feature in the final version...")); warnmsg.push_back(tr("")); wtimer.setParent(this); warnidx = 0; wtimer.singleShot(0, this, SLOT(on_changeWarningMessage())); loadChannels(); connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(on_aboutToQuit())); } void MainWindow::on_changeWarningMessage() { int i=warnidx++ % warnmsg.size(); QString warning = "

    "+warnmsg[i]+"

    "; ui->warningLabel->setText(warning); wtimer.singleShot(10000, this, SLOT(on_changeWarningMessage())); } quint16 chandata_version = 1; void saveChannels() { QString filename = p_profile->Get("{DataFolder}/") + "channels.dat"; QFile f(filename); qDebug() << "Saving Channel States"; f.open(QFile::WriteOnly); QDataStream out(&f); out.setVersion(QDataStream::Qt_4_6); out.setByteOrder(QDataStream::LittleEndian); out << (quint32)magic; out << (quint16)chandata_version; quint16 size = schema::channel.channels.size(); out << size; QHash::iterator it; QHash::iterator it_end = schema::channel.channels.end(); for (it = schema::channel.channels.begin(); it != it_end; ++it) { schema::Channel * chan = it.value(); out << it.key(); out << chan->code(); out << chan->enabled(); out << chan->defaultColor(); out << chan->fullname(); out << chan->label(); out << chan->description(); out << chan->lowerThreshold(); out << chan->lowerThresholdColor(); out << chan->upperThreshold(); out << chan->upperThresholdColor(); out << chan->showInOverview(); } f.close(); } void loadChannels() { QString filename = p_profile->Get("{DataFolder}/") + "channels.dat"; QFile f(filename); if (!f.open(QFile::ReadOnly)) { return; } qDebug() << "Loading Channel States"; QDataStream in(&f); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); quint32 mag; in >> mag; if (magic != mag) { qDebug() << "LoadChannels: Faulty data"; return; } quint16 version; in >> version; if (version < chandata_version) { return; //upgrade here.. } quint16 size; in >> size; QString name; ChannelID code; bool enabled; QColor color; EventDataType lowerThreshold; QColor lowerThresholdColor; EventDataType upperThreshold; QColor upperThresholdColor; QString fullname; QString label; QString description; bool showOverview = false; for (int i=0; i < size; i++) { in >> code; schema::Channel * chan = &schema::channel[code]; in >> name; if (chan->code() != name) { qDebug() << "Looking up channel" << name << "by name, as it's ChannedID must have changed"; chan = &schema::channel[name]; } in >> enabled; in >> color; in >> fullname; in >> label; in >> description; in >> lowerThreshold; in >> lowerThresholdColor; in >> upperThreshold; in >> upperThresholdColor; if (version >= 1) { in >> showOverview; } if (chan->isNull()) { qDebug() << "loadChannels has no idea about channel" << name; if (in.atEnd()) return; continue; } chan->setEnabled(enabled); chan->setDefaultColor(color); chan->setFullname(fullname); chan->setLabel(label); chan->setDescription(description); chan->setLowerThreshold(lowerThreshold); chan->setLowerThresholdColor(lowerThresholdColor); chan->setUpperThreshold(upperThreshold); chan->setUpperThresholdColor(upperThresholdColor); chan->setShowInOverview(showOverview); if (in.atEnd()) return; } f.close(); } void MainWindow::on_aboutToQuit() { Notify(QObject::tr("Don't forget to place your datacard back in your CPAP machine"), QObject::tr("SleepyHead Reminder")); QThread::msleep(1000); QApplication::processEvents(); } void MainWindow::closeEvent(QCloseEvent * event) { saveChannels(); schema::channel.Save(); if (daily) { daily->close(); daily->deleteLater(); } if (overview) { overview->close(); overview->deleteLater(); } // Shutdown and Save the current User profile Profiles::Done(); // Save current window position QSettings settings(getDeveloperName(), getAppName()); settings.setValue("MainWindow/geometry", saveGeometry()); QMainWindow::closeEvent(event); } extern MainWindow *mainwin; MainWindow::~MainWindow() { // if (systraymenu) { delete systraymenu; } // if (systray) { delete systray; } // Trash anything allocated by the Graph objects DestroyGraphGlobals(); disconnect(logger, SIGNAL(outputLog(QString)), this, SLOT(logMessage(QString))); shutdownLogger(); mainwin = nullptr; delete ui; } void MainWindow::log(QString text) { logger->appendClean(text); } void MainWindow::Notify(QString s, QString title, int ms) { if (title.isEmpty()) { title = "SleepyHead v" + VersionString; } if (systray) { // GNOME3's systray hides the last line of the displayed Qt message. // As a workaround, add an extra line to bump the message back // into the visible area. QString msg = s; #ifdef Q_OS_UNIX char *desktop = getenv("DESKTOP_SESSION"); if (desktop && !strncmp(desktop, "gnome", 5)) { msg += "\n"; } #endif systray->showMessage(title, msg, QSystemTrayIcon::Information, ms); } else { ui->statusbar->showMessage(s, ms); } } class MyStatsPage: public QWebPage { public: MyStatsPage(QObject *parent); virtual ~MyStatsPage(); protected: //virtual void javaScriptConsoleMessage(const QString & message, int lineNumber, const QString & sourceID); virtual void javaScriptAlert(QWebFrame *frame, const QString &msg); }; MyStatsPage::MyStatsPage(QObject *parent) : QWebPage(parent) { } MyStatsPage::~MyStatsPage() { } void MyStatsPage::javaScriptAlert(QWebFrame *frame, const QString &msg) { Q_UNUSED(frame); mainwin->sendStatsUrl(msg); } QString getCPAPPixmap(QString mach_class) { QString cpapimage; if (mach_class == STR_MACH_ResMed) cpapimage = ":/icons/rms9.png"; else if (mach_class == STR_MACH_PRS1) cpapimage = ":/icons/prs1.png"; else if (mach_class == STR_MACH_Intellipap) cpapimage = ":/icons/intellipap.png"; return cpapimage; } //QIcon getCPAPIcon(QString mach_class) //{ // QString cpapimage = getCPAPPixmap(mach_class); // return QIcon(cpapimage); //} void MainWindow::PopulatePurgeMenu() { ui->menu_Rebuild_CPAP_Data->disconnect(ui->menu_Rebuild_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionRebuildCPAP(QAction *))); ui->menu_Rebuild_CPAP_Data->clear(); ui->menuPurge_CPAP_Data->disconnect(ui->menuPurge_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionPurgeMachine(QAction *))); ui->menuPurge_CPAP_Data->clear(); QList machines = p_profile->GetMachines(MT_CPAP); for (int i=0; i < machines.size(); ++i) { Machine *mach = machines.at(i); QString name = mach->brand() + " "+ mach->model() + " "+ mach->serial(); QAction * action = new QAction(name.replace("&","&&"), ui->menu_Rebuild_CPAP_Data); action->setIconVisibleInMenu(true); action->setIcon(mach->getPixmap()); action->setData(mach->loaderName()+":"+mach->serial()); ui->menu_Rebuild_CPAP_Data->addAction(action); action = new QAction(name.replace("&","&&"), ui->menuPurge_CPAP_Data); action->setIconVisibleInMenu(true); action->setIcon(mach->getPixmap()); //getCPAPIcon(mach->loaderName())); action->setData(mach->loaderName()+":"+mach->serial()); ui->menuPurge_CPAP_Data->addAction(action); } ui->menu_Rebuild_CPAP_Data->connect(ui->menu_Rebuild_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionRebuildCPAP(QAction*))); ui->menuPurge_CPAP_Data->connect(ui->menuPurge_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionPurgeMachine(QAction*))); } QString GenerateWelcomeHTML(); void MainWindow::Startup() { qstatus->setText(tr("Loading Data")); qprogress->show(); //qstatusbar->showMessage(tr("Loading Data"),0); // profile is a global variable set in main after login p_profile->LoadMachineData(); QList loaders = GetLoaders(); for (int i=0; igraphView()); // // Snapshot graphs mess up with pixmap cache // SnapshotGraph->setUsePixmapCache(false); // // SnapshotGraph->setFormat(daily->graphView()->format()); // //SnapshotGraph->setMaximumSize(1024,512); // //SnapshotGraph->setMinimumSize(1024,512); // SnapshotGraph->hide(); overview = new Overview(ui->tabWidget, daily->graphView()); ui->tabWidget->insertTab(3, overview, STR_TR_Overview); // GenerateStatistics(); ui->statStartDate->setDate(p_profile->FirstDay()); ui->statEndDate->setDate(p_profile->LastDay()); if (overview) { overview->ReloadGraphs(); } qprogress->hide(); qstatus->setText(""); if (p_profile->p_preferences[STR_PREF_ReimportBackup].toBool()) { importCPAPBackups(); p_profile->p_preferences[STR_PREF_ReimportBackup]=false; } ui->tabWidget->setCurrentWidget(ui->welcomeTab); if (daily) { daily->ReloadGraphs(); // daily->populateSessionWidget(); } } int MainWindow::importCPAP(ImportPath import, const QString &message) { if (!import.loader) { return 0; } QDialog * popup = new QDialog(this); QLabel * waitmsg = new QLabel(message); QHBoxLayout *hlayout = new QHBoxLayout; QLabel * imglabel = new QLabel(popup); QPixmap image = import.loader->getPixmap(import.loader->PeekInfo(import.path).series); // QPixmap image(getCPAPPixmap(import.loader->loaderName())); image = image.scaled(64,64); imglabel->setPixmap(image); QVBoxLayout * vlayout = new QVBoxLayout; popup->setLayout(vlayout); vlayout->addLayout(hlayout); hlayout->addWidget(imglabel); hlayout->addWidget(waitmsg,1,Qt::AlignCenter); vlayout->addWidget(qprogress,1); qprogress->setVisible(true); popup->show(); int c = import.loader->Open(import.path); if (c > 0) { Notify(tr("Imported %1 CPAP session(s) from\n\n%2").arg(c).arg(import.path), tr("Import Success")); } else if (c == 0) { Notify(tr("Already up to date with CPAP data at\n\n%1").arg(import.path), tr("Up to date")); } else { Notify(tr("Couldn't find any valid Machine Data at\n\n%1").arg(import.path),tr("Import Problem")); } popup->hide(); vlayout->removeWidget(qprogress); ui->statusbar->insertWidget(1,qprogress,1); qprogress->setVisible(false); delete popup; disconnect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(on_aboutToQuit())); connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(on_aboutToQuit())); return c; } void MainWindow::finishCPAPImport() { p_profile->StoreMachines(); GenerateStatistics(); if (overview) { overview->ReloadGraphs(); } if (daily) { // daily->populateSessionWidget(); daily->ReloadGraphs(); } } void MainWindow::importCPAPBackups() { // Get BackupPaths for all CPAP machines QList machlist = p_profile->GetMachines(MT_CPAP); QList paths; Q_FOREACH(Machine *m, machlist) { paths.append(ImportPath(m->getBackupPath(), lookupLoader(m))); } if (paths.size() > 0) { int c=0; Q_FOREACH(ImportPath path, paths) { c+=importCPAP(path, tr("Please wait, importing from backup folder(s)...")); } if (c>0) { finishCPAPImport(); } } } #ifdef Q_OS_UNIX # include # include # if defined(Q_OS_MAC) || defined(Q_OS_BSD4) # include # else # include # include # endif // Q_OS_MAC/BSD #endif // Q_OS_UNIX //! \brief Returns a list of drive mountpoints QStringList getDriveList() { QStringList drivelist; #if defined(Q_OS_MAC) || defined(Q_OS_BSD4) struct statfs *mounts; int num_mounts = getmntinfo(&mounts, MNT_WAIT); if (num_mounts >= 0) { for (int i = 0; i < num_mounts; i++) { QString name = mounts[i].f_mntonname; // Only interested in drives mounted under /Volumes if (name.toLower().startsWith("/volumes/")) { drivelist.push_back(name); // qDebug() << QString("Disk type '%1' mounted at: %2").arg(mounts[i].f_fstypename).arg(mounts[i].f_mntonname); } } } #elif defined(Q_OS_UNIX) // Unix / Linux (except BSD) FILE *mtab = setmntent("/etc/mtab", "r"); struct mntent *m; struct mntent mnt; char strings[4096]; // NOTE: getmntent_r is a GNU extension, requiring glibc. while ((m = getmntent_r(mtab, &mnt, strings, sizeof(strings)))) { struct statfs fs; if ((mnt.mnt_dir != NULL) && (statfs(mnt.mnt_dir, &fs) == 0)) { QString name = mnt.mnt_dir; quint64 size = fs.f_blocks * fs.f_bsize; if (size > 0) { // this should theoretically ignore /dev, /proc, /sys etc.. drivelist.push_back(name); } // quint64 free = fs.f_bfree * fs.f_bsize; // quint64 avail = fs.f_bavail * fs.f_bsize; } } endmntent(mtab); #elif defined(Q_OS_WIN) QFileInfoList list = QDir::drives(); for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString name = fileInfo.filePath(); if (name.at(0).toUpper() != QChar('C')) { // Ignore the C drive drivelist.push_back(name); } } #endif return drivelist; } QList MainWindow::detectCPAPCards() { const int timeout = 20000; QList detectedCards; QListloaders = GetLoaders(MT_CPAP); QTime time; time.start(); // Create dialog QDialog popup(this, Qt::SplashScreen); QLabel waitmsg(tr("Please insert your CPAP data card...")); QProgressBar progress; QVBoxLayout waitlayout; popup.setLayout(&waitlayout); QHBoxLayout layout2; QIcon icon("://icons/sdcard.png"); QPushButton skipbtn(icon, tr("Choose a folder")); skipbtn.setMinimumHeight(40); waitlayout.addWidget(&waitmsg,1,Qt::AlignCenter); waitlayout.addWidget(&progress,1); waitlayout.addLayout(&layout2,1); layout2.addWidget(&skipbtn); popup.connect(&skipbtn, SIGNAL(clicked()), &popup, SLOT(hide())); progress.setValue(0); progress.setMaximum(timeout); progress.setVisible(true); popup.show(); QApplication::processEvents(); QString lastpath = (*p_profile)[STR_PREF_LastCPAPPath].toString(); do { // Rescan in case card inserted QStringList AutoScannerPaths = getDriveList(); //AutoScannerPaths.push_back(lastpath); if (!AutoScannerPaths.contains(lastpath)) { AutoScannerPaths.append(lastpath); } Q_FOREACH(const QString &path, AutoScannerPaths) { // Scan through available machine loaders and test if this folder contains valid folder structure Q_FOREACH(MachineLoader * loader, loaders) { if (loader->Detect(path)) { detectedCards.append(ImportPath(path, loader)); qDebug() << "Found" << loader->loaderName() << "datacard at" << path; } } } int el=time.elapsed(); progress.setValue(el); QApplication::processEvents(); if (el > timeout) break; if (!popup.isVisible()) break; // needs a slight delay here QThread::msleep(200); } while (detectedCards.size() == 0); popup.hide(); popup.disconnect(&skipbtn, SIGNAL(clicked()), &popup, SLOT(hide())); return detectedCards; } void MainWindow::on_action_Import_Data_triggered() { if (m_inRecalculation) { Notify(tr("Access to Import has been blocked while recalculations are in progress."),STR_MessageBox_Busy); return; } QList datacards = detectCPAPCards(); QListloaders = GetLoaders(MT_CPAP); QTime time; time.start(); QDialog popup(this, Qt::FramelessWindowHint); popup.setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); QLabel * waitmsg = new QLabel(tr("Please wait, scanning for CPAP data cards...")); QVBoxLayout *waitlayout = new QVBoxLayout(); waitlayout->addWidget(waitmsg,1,Qt::AlignCenter); waitlayout->addWidget(qprogress,1); popup.setLayout(waitlayout); bool asknew = false; qprogress->setVisible(false); if (datacards.size() > 0) { MachineInfo info = datacards[0].loader->PeekInfo(datacards[0].path); QString infostr; if (!info.model.isEmpty()) { QString infostr2 = info.model+" ("+info.serial+")"; infostr = tr("A %1 file structure for a %2 was located at:").arg(info.brand).arg(infostr2); } else { infostr = tr("A %1 file structure was located at:").arg(datacards[0].loader->loaderName()); } if (!p_profile->cpap->autoImport()) { QMessageBox mbox(QMessageBox::NoIcon, tr("CPAP Data Located"), infostr+"\n\n"+QDir::toNativeSeparators(datacards[0].path)+"\n\n"+ tr("Would you like to import from this location?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, this); mbox.setDefaultButton(QMessageBox::Yes); mbox.setButtonText(QMessageBox::No, tr("Specify")); QPixmap pixmap = datacards[0].loader->getPixmap(datacards[0].loader->PeekInfo(datacards[0].path).series).scaled(64,64); //QPixmap pixmap = QPixmap(getCPAPPixmap(datacards[0].loader->loaderName())).scaled(64,64); mbox.setIconPixmap(pixmap); int res = mbox.exec(); if (res == QMessageBox::Cancel) { // Give the communal progress bar back ui->statusbar->insertWidget(1,qprogress,1); return; } else if (res == QMessageBox::No) { waitmsg->setText(tr("Please wait, launching file dialog...")); datacards.clear(); asknew = true; } } } else { waitmsg->setText(tr("No CPAP data card detected, launching file dialog...")); asknew = true; } if (asknew) { popup.show(); mainwin->Notify(tr("Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder."), tr("Import Reminder"),8000); QFileDialog w(this); QString folder; if (p_profile->contains(STR_PREF_LastCPAPPath)) { folder = (*p_profile)[STR_PREF_LastCPAPPath].toString(); } else { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) folder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); #else folder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #endif } w.setDirectory(folder); w.setFileMode(QFileDialog::Directory); w.setOption(QFileDialog::ShowDirsOnly, true); // This doesn't work on WinXP #if defined(Q_OS_MAC) #if (QT_VERSION < QT_VERSION_CHECK(4,8,0)) // Fix for tetragon, 10.6 barfs up Qt's custom dialog w.setOption(QFileDialog::DontUseNativeDialog, true); #else w.setOption(QFileDialog::DontUseNativeDialog,false); #endif // version check #elif defined(Q_OS_UNIX) w.setOption(QFileDialog::DontUseNativeDialog,false); #elif defined(Q_OS_WIN) // check the Os version.. winxp chokes w.setOption(QFileDialog::DontUseNativeDialog, true); #endif //#else // w.setOption(QFileDialog::DontUseNativeDialog, false); // QListView *l = w.findChild("listView"); // if (l) { // l->setSelectionMode(QAbstractItemView::MultiSelection); // } // QTreeView *t = w.findChild(); // if (t) { // t->setSelectionMode(QAbstractItemView::MultiSelection); // } //#endif if (w.exec() != QDialog::Accepted) { popup.hide(); ui->statusbar->insertWidget(1,qprogress,1); return; } popup.hide(); for (int i = 0; i < w.selectedFiles().size(); i++) { Q_FOREACH(MachineLoader * loader, loaders) { if (loader->Detect(w.selectedFiles().at(i))) { datacards.append(ImportPath(w.selectedFiles().at(i), loader)); break; } } } } bool newdata = false; // QStringList goodlocations; // waitmsg.setText(tr("Please wait, SleepyHead is importing data...")); // qprogress->setVisible(true); // popup.show(); int c = -1; for (int i = 0; i < datacards.size(); i++) { QString dir = datacards[i].path; MachineLoader * loader = datacards[i].loader; if (!loader) continue; if (!dir.isEmpty()) { // qprogress->setValue(0); // qprogress->show(); // qstatus->setText(tr("Importing Data")); c = importCPAP(datacards[i], tr("Importing Data")); qDebug() << "Finished Importing data" << c; if (c >= 0) { // goodlocations.push_back(dir); QDir d(dir.section("/",0,-1)); (*p_profile)[STR_PREF_LastCPAPPath] = d.absolutePath(); } if (c > 0) { newdata = true; } // qstatus->setText(""); // qprogress->hide(); } } // popup.hide(); // ui->statusbar->insertWidget(1, qprogress,1); if (newdata) { finishCPAPImport(); PopulatePurgeMenu(); } } QMenu *MainWindow::CreateMenu(QString title) { QMenu *menu = new QMenu(title, ui->menubar); ui->menubar->insertMenu(ui->menu_Help->menuAction(), menu); return menu; } void MainWindow::on_action_Fullscreen_triggered() { if (ui->action_Fullscreen->isChecked()) { this->showFullScreen(); } else { this->showNormal(); } } void MainWindow::setRecBoxHTML(QString html) { ui->recordsBox->setHtml(html); } QString MainWindow::getWelcomeHTML() { // This is messy, but allows it to be translated easier return "\n" " \n" "" "" "" "" "" "" "" "" "" "" "
    " + tr("Welcome to SleepyHead") + "
    " "

    " + tr("About SleepyHead") + "

    " "

    " + tr("This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.") + "

    " "

    " + tr("SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.") + "

    " "

    " + tr("This is a beta release, some features may not yet behave as expected.") + "
    " + tr("Please report any bugs you find to SleepyHead's SourceForge page.") + "

    " "

    " + tr("Currenly supported machines:") + "

    " "" + tr("CPAP") + "" "
  • " + tr("Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)") + "
  • " "
  • " + tr("ResMed S9 models (CPAP, Auto, VPAP)") + "
  • " "
  • " + tr("DeVilbiss Intellipap (Auto)") + "
  • " "
  • " + tr("Fisher & Paykel ICON (CPAP, Auto)") + "
  • " "" + tr("Oximetry") + "" "
  • " + tr("Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters") + "
  • " "
  • " + tr("ResMed S9 Oximeter Attachment") + "
  • " "

    " + tr("Online Help Resources") + "

    " "

    " + tr("Note:") + "" + tr("I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.") + tr("(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)") + "

    " + tr("SleepyHead's Online Users Guide
    ") + tr("Frequently Asked Questions
    ") + tr("Glossary of Sleep Disorder Terms
    ") + tr("SleepyHead Wiki
    ") + tr("SleepyHead's Project Website on SourceForge
    ") + "

    " + tr("Further Information") + "

    " "

    " + tr("Here are the release notes for this version.") + "
    " + tr("Plus a few usage notes, and some important information for Mac users.") + "
    " + "

    " + tr("About Sleep Apnea on Wikipedia") + "

    " "

    " + tr("Friendly forums to talk and learn about Sleep Apnea:") + "
    " + tr("CPAPTalk Forum,") + tr("Apnea Board") + "

    " "

    " "
    " "
    " "

    " + tr("Copyright:") + " " + tr("©2011-2014") + " Mark Watkins (jedimark)

    " "

    " + tr("License:") + " " + tr("This software is released freely under the GNU Public License.") + "

    " "
    " "

    " + tr("DISCLAIMER:") + "

    " "

    " + tr("This is NOT medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.") + "

    " "

    " + tr("The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.") + "

    " "

    " + tr("Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.") + "

    " "

    " + tr("*** Use at your own risk ***") + "

    " "
    " "
    " "" "" ; } void MainWindow::on_homeButton_clicked() { ui->webView->setHtml(getWelcomeHTML()); //QString infourl="qrc:/docs/index.html"; // use this as a fallback //ui->webView->setUrl(QUrl(infourl)); } void MainWindow::updateFavourites() { QDate date = p_profile->LastDay(MT_JOURNAL); if (!date.isValid()) { return; } QString html = "" ""; do { Day *journal = p_profile->GetDay(date, MT_JOURNAL); if (journal) { if (journal->size() > 0) { Session *sess = journal->firstSession(MT_JOURNAL); QString tmp; bool filtered = !bookmarkFilter.isEmpty(); bool found = !filtered; if (sess->settings.contains(Bookmark_Start)) { //QVariantList start=sess->settings[Bookmark_Start].toList(); //QVariantList end=sess->settings[Bookmark_End].toList(); QStringList notes = sess->settings[Bookmark_Notes].toStringList(); if (notes.size() > 0) { tmp += QString(""; } } if (found) { html += tmp; } } } date = date.addDays(-1); } while (date >= p_profile->FirstDay(MT_JOURNAL)); html += "
    %2
    ") .arg(date.toString(Qt::ISODate)) .arg(date.toString()); tmp += ""; for (int i = 0; i < notes.size(); i++) { //QDate d=start[i].toDate(); QString note = notes[i]; if (filtered && note.contains(bookmarkFilter, Qt::CaseInsensitive)) { found = true; } tmp += "
  • " + note + "
  • "; } tmp += "
    "; ui->bookmarkView->setHtml(html); } void MainWindow::on_backButton_clicked() { ui->webView->back(); } void MainWindow::on_forwardButton_clicked() { ui->webView->forward(); } void MainWindow::on_webView_urlChanged(const QUrl &arg1) { ui->urlBar->setEditText(arg1.toString()); } void MainWindow::on_urlBar_activated(const QString &arg1) { QUrl url(arg1); ui->webView->setUrl(url); } void MainWindow::on_dailyButton_clicked() { ui->tabWidget->setCurrentWidget(daily); daily->RedrawGraphs(); } void MainWindow::JumpDaily() { on_dailyButton_clicked(); } void MainWindow::on_overviewButton_clicked() { ui->tabWidget->setCurrentWidget(overview); } void MainWindow::on_webView_loadFinished(bool arg1) { Q_UNUSED(arg1); qprogress->hide(); if (first_load) { QTimer::singleShot(0, this, SLOT(Startup())); first_load = false; } else { qstatus->setText(""); } ui->backButton->setEnabled(ui->webView->history()->canGoBack()); ui->forwardButton->setEnabled(ui->webView->history()->canGoForward()); connect(ui->webView->page(), SIGNAL(linkHovered(QString, QString, QString)), this, SLOT(LinkHovered(QString, QString, QString))); } void MainWindow::on_webView_loadStarted() { disconnect(ui->webView->page(), SIGNAL(linkHovered(QString, QString, QString)), this, SLOT(LinkHovered(QString, QString, QString))); if (!first_load) { qstatus->setText(tr("Loading")); qprogress->reset(); qprogress->show(); } } void MainWindow::on_webView_loadProgress(int progress) { qprogress->setValue(progress); } void MainWindow::aboutBoxLinkClicked(const QUrl &url) { QDesktopServices::openUrl(url); } void MainWindow::on_action_About_triggered() { QString gitrev = QString(GIT_REVISION); if (!gitrev.isEmpty()) { gitrev = tr("Revision:")+" " + gitrev + " (" + QString(GIT_BRANCH) + " " + tr("branch") + ")"; } // "
    " QString msg = QString( "" "" "" "" "
    " "

    " + STR_TR_SleepyHead + QString(" v%1 (%2)

    ").arg(VersionString).arg(ReleaseStatus) + tr("Build Date: %1 %2").arg(__DATE__).arg(__TIME__) + QString("
    %1
    ").arg(gitrev) + tr("Graphics Engine: %1").arg(getGraphicsEngine())+ "
    " + (tr("Data Folder Location: %2").arg(GetAppRoot()).arg(QDir::toNativeSeparators(GetAppRoot())) + "


    "+tr("Copyright") + " ©2011-2014 Mark Watkins (jedimark)
    \n" + tr("This software is released under the GNU Public License v3.0
    ") + "
    " // Project links "

    " +tr("SleepyHead Project Page") + ": http://sourceforge.net/projects/sleepyhead
    " + tr("SleepyHead Wiki") + ": http://sleepyhead.sourceforge.net/wiki

    " + // Social media links.. (Dear Translators, if one of these isn't available in your country, it's ok to leave it out.) tr("Don't forget to Like/+1 SleepyHead on Facebook or Google+") + "

    " + // Image "


    " +tr("SleepyHead, brought to you by Jedimark") + "
    " + // Credits section "

    " +tr("Kudos & Credits") + "

    " + tr("Bugfixes, Patches and Platform Help:") + " " + tr("James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.") + "

    " "

    " + tr("Translators:") + " " + tr("Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.") + "

    " "

    " + tr("3rd Party Libaries:") + " " + tr("SleepyHead is built using the Qt Application Framework.") + " " + tr("In the updater code, SleepyHead uses QuaZip by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.") + "
    " "

    " + tr("Special thanks to Pugsy and Robysue from CPAPTalk for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.") + "

    " // Donations "

    " + tr("Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.") + "" "


    Disclaimer
    " + tr("This software comes with absolutely no warranty, either express of implied.") + " " + tr("It comes with no guarantee of fitness for any particular purpose.") + " " + tr("No guarantees are made regarding the accuracy of any data this program displays.") + "

    " "

    " + tr("This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.") + " " + tr("This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.") + "

    " "

    " + tr("The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.") + "

    " + tr("Use this software entirely at your own risk.") + "

    " "
    " )); //"
    " QDialog aboutbox; aboutbox.setWindowTitle(QObject::tr("About SleepyHead")); QVBoxLayout layout; aboutbox.setLayout(&layout); QWebView webview(&aboutbox); webview.setHtml(msg); webview.page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); connect(&webview, SIGNAL(linkClicked(const QUrl &)), SLOT(aboutBoxLinkClicked(const QUrl &))); layout.insertWidget(0, &webview, 1); QHBoxLayout layout2; layout.insertLayout(1, &layout2, 1); QPushButton okbtn(QObject::tr("&Close"), &aboutbox); aboutbox.connect(&okbtn, SIGNAL(clicked()), SLOT(reject())); layout2.insertWidget(1, &okbtn, 1); QPushButton donatebtn(QObject::tr("&Donate"), &aboutbox); aboutbox.connect(&donatebtn, SIGNAL(clicked()), SLOT(accept())); //hack this button to use the accepted slot, so clicking x closes like it shouldß layout2.insertWidget(1, &donatebtn, 1); QApplication::processEvents(); // MW: Needed on Mac, as the html has to finish loading if (aboutbox.exec() == QDialog::Accepted) { QDesktopServices::openUrl(QUrl("http://sourceforge.net/p/sleepyhead/donate")); //spawn browser with paypal site. } disconnect(&webview, SIGNAL(linkClicked(const QUrl &)), this, SLOT(aboutBoxLinkClicked(const QUrl &))); } void MainWindow::on_actionDebug_toggled(bool checked) { p_profile->general->setShowDebug(checked); logger->strlock.lock(); if (checked) { ui->logText->show(); } else { ui->logText->hide(); } // QApplication::processEvents(); logger->strlock.unlock(); } void MainWindow::on_action_Reset_Graph_Layout_triggered() { if (daily && (ui->tabWidget->currentWidget() == daily)) { daily->ResetGraphLayout(); } if (overview && (ui->tabWidget->currentWidget() == overview)) { overview->ResetGraphLayout(); } } void MainWindow::on_action_Preferences_triggered() { //MW: TODO: This will crash if attempted to enter while still loading.. if (m_inRecalculation) { mainwin->Notify(tr("Access to Preferences has been blocked until recalculation completes.")); return; } PreferencesDialog pd(this, p_profile); prefdialog = &pd; if (pd.exec() == PreferencesDialog::Accepted) { qDebug() << "Preferences Accepted"; //pd.Save(); if (daily) { //daily->ReloadGraphs(); daily->RedrawGraphs(); } if (overview) { overview->RebuildGraphs(true); //overview->RedrawGraphs(); } } prefdialog = nullptr; } #include "oximeterimport.h" QDateTime datetimeDialog(QDateTime datetime, QString message); void MainWindow::on_oximetryButton_clicked() { OximeterImport oxiimp(this); oxiimp.exec(); } void MainWindow::CheckForUpdates() { on_actionCheck_for_Updates_triggered(); } void MainWindow::on_actionCheck_for_Updates_triggered() { UpdaterWindow *w = new UpdaterWindow(this); w->checkForUpdates(); } bool toolbox_visible = false; void MainWindow::on_action_Screenshot_triggered() { daily->hideSpaceHogs(); toolbox_visible = ui->toolBox->isVisible(); ui->toolBox->hide(); QTimer::singleShot(250, this, SLOT(DelayedScreenshot())); } void MainWindow::DelayedScreenshot() { int w = width(); int h = height(); // Scale for high resolution displays (like Retina) #if(QT_VERSION>=QT_VERSION_CHECK(5,0,0)) qreal pr = devicePixelRatio(); w /= pr; h /= pr; #endif #if defined(Q_OS_WIN32) || defined(Q_OS_LINUX) QRect rec = QApplication::desktop()->screenGeometry(); // grab the whole screen QPixmap desktop = QPixmap::grabWindow(QApplication::desktop()->winId()); QPixmap pixmap = desktop.copy(x() * devicePixelRatio(), y() * devicePixelRatio(), (width()+6) * devicePixelRatio(), (height()+22) * devicePixelRatio()); #elif defined(Q_OS_MAC) QPixmap pixmap = QPixmap::grabWindow(this->winId(), x(), y(), w, h+10); #endif QString a = PREF.Get("{home}/Screenshots"); QDir dir(a); if (!dir.exists()) { dir.mkdir(a); } a += "/screenshot-" + QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss") + ".png"; qDebug() << "Saving screenshot to" << a; if (!pixmap.save(a)) { Notify(tr("There was an error saving screenshot to file \"%1\"").arg(QDir::toNativeSeparators(a))); } else { Notify(tr("Screenshot saved to file \"%1\"").arg(QDir::toNativeSeparators(a))); } daily->showSpaceHogs(); ui->toolBox->setVisible(toolbox_visible); } void MainWindow::on_actionView_Oximetry_triggered() { on_oximetryButton_clicked(); } void MainWindow::updatestatusBarMessage(const QString &text) { ui->statusbar->showMessage(text, 1000); } void MainWindow::on_actionPrint_Report_triggered() { #ifdef Q_WS_MAC #if ((QT_VERSION <= QT_VERSION_CHECK(4, 8, 4))) QMessageBox::information(this, tr("Printing Disabled"), tr("Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt"), QMessageBox::Ok); return; #endif #endif Report report; if (ui->tabWidget->currentWidget() == overview) { Report::PrintReport(overview->graphView(), STR_TR_Overview); } else if (ui->tabWidget->currentWidget() == daily) { Report::PrintReport(daily->graphView(), STR_TR_Daily, daily->getDate()); } else { QPrinter printer(QPrinter::HighResolution); #ifdef Q_WS_X11 printer.setPrinterName("Print to File (PDF)"); printer.setOutputFormat(QPrinter::PdfFormat); QString name; QString datestr; if (ui->tabWidget->currentWidget() == ui->statisticsTab) { name = "Statistics"; datestr = QDate::currentDate().toString(Qt::ISODate); } else if (ui->tabWidget->currentWidget() == ui->helpTab) { name = "Help"; datestr = QDateTime::currentDateTime().toString(Qt::ISODate); } else { name = "Unknown"; } QString filename = PREF.Get("{home}/" + name + "_" + p_profile->user->userName() + "_" + datestr + ".pdf"); printer.setOutputFileName(filename); #endif printer.setPrintRange(QPrinter::AllPages); printer.setOrientation(QPrinter::Portrait); printer.setFullPage(false); // This has nothing to do with scaling printer.setNumCopies(1); printer.setPageMargins(5, 5, 5, 5, QPrinter::Millimeter); QPrintDialog pdlg(&printer, this); if (pdlg.exec() == QPrintDialog::Accepted) { if (ui->tabWidget->currentWidget() == ui->statisticsTab) { ui->statisticsView->print(&printer); } else if (ui->tabWidget->currentWidget() == ui->helpTab) { ui->webView->print(&printer); } } //QMessageBox::information(this,tr("Not supported Yet"),tr("Sorry, printing from this page is not supported yet"),QMessageBox::Ok); } } void MainWindow::on_action_Edit_Profile_triggered() { NewProfile *newprof = new NewProfile(this); QString name =PREF[STR_GEN_Profile].toString(); newprof->edit(name); newprof->setWindowModality(Qt::ApplicationModal); newprof->setModal(true); newprof->exec(); qDebug() << newprof; delete newprof; } void MainWindow::on_action_CycleTabs_triggered() { int i; qDebug() << "Switching Tabs"; i = ui->tabWidget->currentIndex() + 1; if (i >= ui->tabWidget->count()) { i = 0; } ui->tabWidget->setCurrentIndex(i); } void MainWindow::on_actionExp_ort_triggered() { ExportCSV ex(this); if (ex.exec() == ExportCSV::Accepted) { } } void MainWindow::on_actionOnline_Users_Guide_triggered() { ui->webView->load( QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide")); ui->tabWidget->setCurrentWidget(ui->helpTab); } void MainWindow::on_action_Frequently_Asked_Questions_triggered() { ui->webView->load( QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions")); ui->tabWidget->setCurrentWidget(ui->helpTab); } void packEventList(EventList *el, EventDataType minval = 0) { if (el->count() < 2) { return; } EventList nel(EVL_Waveform); EventDataType t = 0, lastt = 0; //el->data(0); qint64 ti = 0; //=el->time(0); //nel.AddEvent(ti,lastt); bool f = false; qint64 lasttime = 0; EventDataType min = 999, max = 0; for (quint32 i = 0; i < el->count(); i++) { t = el->data(i); ti = el->time(i); f = false; if (t > minval) { if (t != lastt) { if (!lasttime) { nel.setFirst(ti); } nel.AddEvent(ti, t); if (t < min) { min = t; } if (t > max) { max = t; } lasttime = ti; f = true; } } else { if (lastt > minval) { nel.AddEvent(ti, lastt); lasttime = ti; f = true; } } lastt = t; } if (!f) { if (t > minval) { nel.AddEvent(ti, t); lasttime = ti; } } el->setFirst(nel.first()); el->setLast(nel.last()); el->setMin(min); el->setMax(max); el->getData().clear(); el->getTime().clear(); el->setCount(nel.count()); el->getData() = nel.getData(); el->getTime() = nel.getTime(); } void MainWindow::on_action_Rebuild_Oximetry_Index_triggered() { QVector valid; valid.push_back(OXI_Pulse); valid.push_back(OXI_SPO2); valid.push_back(OXI_Plethy); //valid.push_back(OXI_PulseChange); // Delete these and recalculate.. //valid.push_back(OXI_SPO2Drop); QVector invalid; QList machines = p_profile->GetMachines(MT_OXIMETER); qint64 f = 0, l = 0; int discard_threshold = p_profile->oxi->oxiDiscardThreshold(); Machine *m; for (int z = 0; z < machines.size(); z++) { m = machines.at(z); //m->sessionlist.erase(m->sessionlist.find(0)); // For each Session for (QHash::iterator s = m->sessionlist.begin(); s != m->sessionlist.end(); s++) { Session *sess = s.value(); if (!sess) { continue; } sess->OpenEvents(); // For each EventList contained in session invalid.clear(); f = 0; l = 0; for (QHash >::iterator e = sess->eventlist.begin(); e != sess->eventlist.end(); e++) { // Discard any non data events. if (!valid.contains(e.key())) { // delete and push aside for later to clean up for (int i = 0; i < e.value().size(); i++) { delete e.value()[i]; } e.value().clear(); invalid.push_back(e.key()); } else { // Valid event // // Clean up outliers at start of eventlist chunks // EventDataType baseline=sess->wavg(OXI_SPO2); // if (e.key()==OXI_SPO2) { // const int o2start_threshold=10000; // seconds since start of event // EventDataType zz; // int ii; // // Trash suspect outliers in the first o2start_threshold milliseconds // for (int j=0;jcount() <= (unsigned)discard_threshold)) // continue; // qint64 ti=ev->time(0); // zz=-1; // // Peek o2start_threshold ms ahead and grab the value // for (ii=0;iicount();ii++) { // if (((ev->time(ii)-ti) > o2start_threshold)) { // zz=ev->data(ii); // break; // } // } // if (zz<0) // continue; // // Trash any suspect outliers // for (int i=0;idata(i) < baseline) { //(zz-10)) { // ev->getData()[i]=0; // } // } // } // } QVector newlist; for (int i = 0; i < e.value().size(); i++) { if (e.value()[i]->count() > (unsigned)discard_threshold) { newlist.push_back(e.value()[i]); } else { delete e.value()[i]; } } for (int i = 0; i < newlist.size(); i++) { packEventList(newlist[i], 8); EventList *el = newlist[i]; if (!f || f > el->first()) { f = el->first(); } if (!l || l < el->last()) { l = el->last(); } } e.value() = newlist; } } for (int i = 0; i < invalid.size(); i++) { sess->eventlist.erase(sess->eventlist.find(invalid[i])); } if (f) { sess->really_set_first(f); } if (l) { sess->really_set_last(l); } sess->m_cnt.clear(); sess->m_sum.clear(); sess->m_min.clear(); sess->m_max.clear(); sess->m_cph.clear(); sess->m_sph.clear(); sess->m_avg.clear(); sess->m_wavg.clear(); sess->m_valuesummary.clear(); sess->m_timesummary.clear(); sess->m_firstchan.clear(); sess->m_lastchan.clear(); sess->SetChanged(true); } } for (int i = 0; i < machines.size(); i++) { Machine *m = machines[i]; m->Save(); m->SaveSummary(); } daily->LoadDate(getDaily()->getDate()); overview->ReloadGraphs(); } void MainWindow::RestartApplication(bool force_login, bool change_datafolder) { QString apppath; #ifdef Q_OS_MAC // In Mac OS the full path of aplication binary is: // /myApp.app/Contents/MacOS/myApp // prune the extra bits to just get the app bundle path apppath = QApplication::instance()->applicationDirPath().section("/", 0, -3); QStringList args; args << "-n"; // -n option is important, as it opens a new process args << apppath; args << "--args"; // SleepyHead binary options after this args << "-p"; // -p starts with 1 second delay, to give this process time to save.. if (force_login) { args << "-l"; } if (change_datafolder) { args << "-d"; } if (QProcess::startDetached("/usr/bin/open", args)) { QApplication::instance()->exit(); } else { QMessageBox::warning(nullptr, tr("Gah!"), tr("If you can read this, the restart command didn't work. Your going to have to do it yourself manually."), QMessageBox::Ok); } #else apppath = QApplication::instance()->applicationFilePath(); // If this doesn't work on windoze, try uncommenting this method // Technically should be the same thing.. //if (QDesktopServices::openUrl(apppath)) { // QApplication::instance()->exit(); //} else QStringList args; args << "-p"; if (force_login) { args << "-l"; } if (change_datafolder) { args << "-d"; } if (QProcess::startDetached(apppath, args)) { ::exit(0); //QApplication::instance()->exit(); } else { QMessageBox::warning(nullptr, tr("Gah!"), tr("If you can read this, the restart command didn't work. Your going to have to do it yourself manually."), QMessageBox::Ok); } #endif } void MainWindow::on_actionChange_User_triggered() { p_profile->Save(); PREF.Save(); p_profile->removeLock(); RestartApplication(true); } void MainWindow::on_actionPurge_Current_Day_triggered() { QDate date = getDaily()->getDate(); getDaily()->Unload(date); Day *day = p_profile->GetDay(date, MT_CPAP); Machine *cpap = nullptr; if (day) cpap = day->machine(MT_CPAP); if (cpap) { QList::iterator s; QList list; QList sidlist; for (s = day->begin(); s != day->end(); ++s) { list.push_back(*s); sidlist.push_back((*s)->session()); } QHash skipfiles; // Read the already imported file list QFile impfile(cpap->getDataPath()+"/imported_files.csv"); if (impfile.exists()) { if (impfile.open(QFile::ReadOnly)) { QTextStream impstream(&impfile); QString serial; impstream >> serial; if (cpap->serial() == serial) { QString line, file, str; SessionID sid; bool ok; do { line = impstream.readLine(); file = line.section(',',0,0); str = line.section(',',1); sid = str.toInt(&ok); if (!sidlist.contains(sid)) { skipfiles[file] = sid; } } while (!impstream.atEnd()); } } impfile.close(); // Delete the file impfile.remove(); // Rewrite the file without the sessions being removed. if (impfile.open(QFile::WriteOnly)) { QTextStream out(&impfile); out << cpap->serial(); QHash::iterator skit; QHash::iterator skit_end = skipfiles.end(); for (skit = skipfiles.begin(); skit != skit_end; ++skit) { QString a = QString("%1,%2\n").arg(skit.key()).arg(skit.value());; out << a; } out.flush(); } impfile.close(); } // m->day.erase(m->day.find(date)); for (int i = 0; i < list.size(); i++) { Session *sess = list.at(i); sess->Destroy(); delete sess; } } day = p_profile->GetDay(date, MT_CPAP); if (day != nullptr) { int i = 5; } getDaily()->clearLastDay(); getDaily()->LoadDate(date); } void MainWindow::on_actionRebuildCPAP(QAction *action) { QString data = action->data().toString(); QString cls = data.section(":",0,0); QString serial = data.section(":", 1); QList machines = p_profile->GetMachines(MT_CPAP); Machine * mach = nullptr; for (int i=0; i < machines.size(); ++i) { Machine * m = machines.at(i); if ((m->loaderName() == cls) && (m->serial() == serial)) { mach = m; break; } } if (!mach) return; QString bpath = mach->getBackupPath(); bool backups = (dirCount(bpath) > 0) ? true : false; if (backups) { if (QMessageBox::question(this, STR_MessageBox_Question, tr("Are you sure you want to rebuild all CPAP data for the following machine:")+ "\n\n" + mach->brand() + " " + mach->model() + " " + mach->modelnumber() + " (" + mach->serial() + ")" + "\n\n"+ tr("Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way."), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) { return; } } else { if (QMessageBox::question(this, STR_MessageBox_Warning, "

    "+STR_MessageBox_Warning+": "+tr("For some reason, SleepyHead does not have internal backups for the following machine:")+ "

    " + "

    "+mach->brand() + " " + mach->model() + " " + mach->modelnumber() + " (" + mach->serial() + ")" + "

    "+ "

    "+tr("Provided you have made your own backups for ALL of your CPAP data, you can still complete this operation, but you will have to restore from your backups manually.")+"

    " "

    "+tr("Are you really sure you want to do this?")+"

    ", QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) { return; } } purgeMachine(mach); if (backups) { importCPAP(ImportPath(mach->getBackupPath(), lookupLoader(mach)), tr("Please wait, importing from backup folder(s)...")); } else { if (QMessageBox::information(this, STR_MessageBox_Warning, tr("Because there are no internal backups to rebuild from, you will have to restore from your own.")+"\n\n"+ tr("Would you like to import from your own backups now? (you will have no data visible for this machine until you do)"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { on_action_Import_Data_triggered(); } else { } } if (overview) overview->ReloadGraphs(); if (daily) { daily->Unload(); daily->clearLastDay(); // otherwise Daily will crash daily->ReloadGraphs(); } GenerateStatistics(); p_profile->StoreMachines(); } void MainWindow::on_actionPurgeMachine(QAction *action) { QString data = action->data().toString(); QString cls = data.section(":",0,0); QString serial = data.section(":", 1); QList machines = p_profile->GetMachines(MT_CPAP); Machine * mach = nullptr; for (int i=0; i < machines.size(); ++i) { Machine * m = machines.at(i); if ((m->loaderName() == cls) && (m->serial() == serial)) { mach = m; break; } } if (!mach) return; if (QMessageBox::question(this, STR_MessageBox_Warning, "

    "+STR_MessageBox_Warning+": "+tr("You are about to obliterate SleepyHead's machine database for the following machine:")+"

    "+ "

    "+mach->brand() + " " + mach->model() + " " + mach->modelnumber() + " (" + mach->serial() + ")" + "

    "+ "

    "+tr("Note as a precaution, the backup folder will be left in place.")+"

    "+ "

    "+tr("Are you absolutely sure you want to proceed?")+"

    ", QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { purgeMachine(mach); p_profile->DelMachine(mach); delete mach; PopulatePurgeMenu(); } } void MainWindow::purgeMachine(Machine * mach) { // detect backups daily->Unload(daily->getDate()); // Technicially the above won't sessions under short session limit.. Using Purge to clean up the rest. if (mach->Purge(3478216)) { mach->sessionlist.clear(); mach->day.clear(); } else { QMessageBox::warning(this, STR_MessageBox_Error, tr("A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:") +"\n\n"+ QDir::toNativeSeparators(mach->getDataPath()), QMessageBox::Ok, QMessageBox::Ok); if (overview) overview->ReloadGraphs(); if (daily) { daily->clearLastDay(); // otherwise Daily will crash daily->ReloadGraphs(); } //GenerateStatistics(); return; } if (overview) overview->ReloadGraphs(); QFile rxcache(p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" )); rxcache.remove(); if (daily) { daily->clearLastDay(); // otherwise Daily will crash daily->ReloadGraphs(); } QApplication::processEvents(); // GenerateStatistics(); } void MainWindow::keyPressEvent(QKeyEvent *event) { Q_UNUSED(event) //qDebug() << "Keypress:" << event->key(); } void MainWindow::on_action_Sidebar_Toggle_toggled(bool visible) { ui->toolBox->setVisible(visible); p_profile->appearance->setRightSidebarVisible(visible); } void MainWindow::on_recordsBox_linkClicked(const QUrl &linkurl) { QString link = linkurl.toString().section("=", 0, 0).toLower(); QString data = linkurl.toString().section("=", 1).toLower(); qDebug() << linkurl.toString() << link << data; if (link == "daily") { QDate date = QDate::fromString(data, Qt::ISODate); ui->tabWidget->setCurrentWidget(daily); QApplication::processEvents(); daily->LoadDate(date); } else if (link == "overview") { QString date1 = data.section(",", 0, 0); QString date2 = data.section(",", 1); QDate d1 = QDate::fromString(date1, Qt::ISODate); QDate d2 = QDate::fromString(date2, Qt::ISODate); overview->setRange(d1, d2); ui->tabWidget->setCurrentWidget(overview); } else if (link == "import") { if (data == "cpap") on_importButton_clicked(); if (data == "oximeter") on_oximetryButton_clicked(); } else if (link == "statistics") { ui->tabWidget->setCurrentWidget(ui->statisticsTab); } } void MainWindow::on_helpButton_clicked() { ui->tabWidget->setCurrentWidget(ui->helpTab); } void MainWindow::on_actionView_Statistics_triggered() { ui->tabWidget->setCurrentWidget(ui->statisticsTab); } void MainWindow::on_webView_linkClicked(const QUrl &url) { QString s = url.toString(); qDebug() << "Link Clicked" << url; if (s.toLower().startsWith("https:")) { QDesktopServices().openUrl(url); } else { ui->webView->setUrl(url); } } void MainWindow::on_webView_statusBarMessage(const QString &text) { ui->statusbar->showMessage(text); } void MainWindow::LinkHovered(const QString &link, const QString &title, const QString &textContent) { Q_UNUSED(title); Q_UNUSED(textContent); ui->statusbar->showMessage(link); } void MainWindow::on_tabWidget_currentChanged(int index) { Q_UNUSED(index); // QWidget *widget = ui->tabWidget->currentWidget(); } void MainWindow::on_bookmarkView_linkClicked(const QUrl &arg1) { on_recordsBox_linkClicked(arg1); } void MainWindow::on_filterBookmarks_editingFinished() { bookmarkFilter = ui->filterBookmarks->text(); updateFavourites(); } void MainWindow::on_filterBookmarksButton_clicked() { if (!bookmarkFilter.isEmpty()) { ui->filterBookmarks->setText(""); bookmarkFilter = ""; updateFavourites(); } } void MainWindow::reprocessEvents(bool restart) { m_restartRequired = restart; QTimer::singleShot(0, this, SLOT(doReprocessEvents())); } void MainWindow::FreeSessions() { QDate first = p_profile->FirstDay(); QDate date = p_profile->LastDay(); Day *day; QDate current = daily->getDate(); do { day = p_profile->GetDay(date, MT_CPAP); if (day) { if (date != current) { day->CloseEvents(); } } date = date.addDays(-1); } while (date >= first); } void MainWindow::MachineUnsupported(Machine * m) { Q_ASSERT(m != nullptr); QMessageBox::information(this, STR_MessageBox_Error, QObject::tr("Sorry, your %1 %2 machine is not currently supported.").arg(m->brand()).arg(m->model()), QMessageBox::Ok); } void MainWindow::doReprocessEvents() { if (p_profile->countDays(MT_CPAP, p_profile->FirstDay(), p_profile->LastDay()) == 0) { return; } m_inRecalculation = true; QDate first = p_profile->FirstDay(); QDate date = p_profile->LastDay(); Session *sess; Day *day; //FlowParser flowparser; mainwin->Notify(tr("Performance will be degraded during these recalculations."), tr("Recalculating Indices")); // For each day in history int daycount = first.daysTo(date); int idx = 0; QList machines = p_profile->GetMachines(MT_CPAP); // Disabling multithreaded save as it appears it's causing problems bool cache_sessions = false; //p_profile->session->cacheSessions(); if (cache_sessions) { // Use multithreaded save to handle reindexing.. (hogs memory like hell) qstatus->setText(tr("Loading Event Data")); } else { qstatus->setText(tr("Recalculating Summaries")); } if (qprogress) { qprogress->setValue(0); qprogress->setVisible(true); } bool isopen; do { day = p_profile->GetDay(date, MT_CPAP); if (day) { for (int i = 0; i < day->size(); i++) { sess = (*day)[i]; isopen = sess->eventsLoaded(); // Load the events if they aren't loaded already sess->OpenEvents(); //if (!sess->channelDataExists(CPAP_FlowRate)) continue; //QVector & flowlist=sess->eventlist[CPAP_FlowRate]; // Destroy any current user flags.. sess->destroyEvent(CPAP_UserFlag1); sess->destroyEvent(CPAP_UserFlag2); sess->destroyEvent(CPAP_UserFlag3); // AHI flags sess->destroyEvent(CPAP_AHI); sess->destroyEvent(CPAP_RDI); if (sess->machine()->loaderName() != STR_MACH_PRS1) { sess->destroyEvent(CPAP_LargeLeak); } sess->SetChanged(true); if (!cache_sessions) { sess->UpdateSummaries(); sess->machine()->SaveSession(sess); if (!isopen) { sess->TrashEvents(); } } } } date = date.addDays(-1); // if (qprogress && (++idx % 10) ==0) { qprogress->setValue(0 + (float(++idx) / float(daycount) * 100.0)); QApplication::processEvents(); // } } while (date >= first); if (cache_sessions) { qstatus->setText(tr("Recalculating Summaries")); for (int i = 0; i < machines.size(); i++) { machines.at(i)->Save(); } } qstatus->setText(tr("")); qprogress->setVisible(false); m_inRecalculation = false; if (m_restartRequired) { QMessageBox::information(this, tr("Restart Required"), tr("Recalculations are complete, the application now needs to restart to display the changes."), QMessageBox::Ok); RestartApplication(); return; } else { Notify(tr("Recalculations are now complete."), tr("Task Completed")); FreeSessions(); QDate current = daily->getDate(); daily->LoadDate(current); if (overview) { overview->ReloadGraphs(); } } } void MainWindow::on_actionImport_ZEO_Data_triggered() { QFileDialog w; w.setFileMode(QFileDialog::ExistingFiles); w.setOption(QFileDialog::ShowDirsOnly, false); w.setOption(QFileDialog::DontUseNativeDialog, true); w.setNameFilters(QStringList("Zeo CSV File (*.csv)")); ZEOLoader zeo; if (w.exec() == QFileDialog::Accepted) { QString filename = w.selectedFiles()[0]; if (!zeo.OpenFile(filename)) { Notify(tr("There was a problem opening ZEO File: ") + filename); return; } Notify(tr("Zeo CSV Import complete")); daily->LoadDate(daily->getDate()); } } void MainWindow::on_actionImport_RemStar_MSeries_Data_triggered() { #ifdef REMSTAR_M_SUPPORT QFileDialog w; w.setFileMode(QFileDialog::ExistingFiles); w.setOption(QFileDialog::ShowDirsOnly, false); w.setOption(QFileDialog::DontUseNativeDialog, true); w.setNameFilters(QStringList("M-Series data file (*.bin)")); MSeriesLoader mseries; if (w.exec() == QFileDialog::Accepted) { QString filename = w.selectedFiles()[0]; if (!mseries.Open(filename, p_profile)) { Notify(tr("There was a problem opening MSeries block File: ") + filename); return; } Notify(tr("MSeries Import complete")); daily->LoadDate(daily->getDate()); } #endif } void MainWindow::on_actionSleep_Disorder_Terms_Glossary_triggered() { ui->webView->load( QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary")); ui->tabWidget->setCurrentWidget(ui->helpTab); } void MainWindow::on_actionHelp_Support_SleepyHead_Development_triggered() { QUrl url = QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=Support_SleepyHead_Development"); QDesktopServices().openUrl(url); // ui->webView->load(url); // ui->tabWidget->setCurrentWidget(ui->helpTab); } void MainWindow::on_actionChange_Language_triggered() { QSettings *settings = new QSettings(getDeveloperName(), getAppName()); settings->remove("Settings/Language"); delete settings; p_profile->Save(); PREF.Save(); p_profile->removeLock(); RestartApplication(true); } void MainWindow::on_actionChange_Data_Folder_triggered() { p_profile->Save(); PREF.Save(); p_profile->removeLock(); RestartApplication(false, true); } void MainWindow::on_actionImport_Somnopose_Data_triggered() { QFileDialog w; w.setFileMode(QFileDialog::ExistingFiles); w.setOption(QFileDialog::ShowDirsOnly, false); w.setOption(QFileDialog::DontUseNativeDialog, true); w.setNameFilters(QStringList("Somnopause CSV File (*.csv)")); SomnoposeLoader somno; if (w.exec() == QFileDialog::Accepted) { QString filename = w.selectedFiles()[0]; if (!somno.OpenFile(filename)) { Notify(tr("There was a problem opening Somnopose Data File: ") + filename); return; } Notify(tr("Somnopause Data Import complete")); daily->LoadDate(daily->getDate()); } } void MainWindow::GenerateStatistics() { QDate first = p_profile->FirstDay(); QDate last = p_profile->LastDay(); ui->statStartDate->setMinimumDate(first); ui->statStartDate->setMaximumDate(last); ui->statEndDate->setMinimumDate(first); ui->statEndDate->setMaximumDate(last); Statistics stats; QString html = stats.GenerateHTML(); updateFavourites(); //QWebFrame *frame=ui->statisticsView->page()->currentFrame(); //frame->addToJavaScriptWindowObject("mainwin",this); //ui->statisticsView->setHtml(html); MyStatsPage *page = new MyStatsPage(this); page->currentFrame()->setHtml(html); ui->statisticsView->setPage(page); MyStatsPage *page2 = new MyStatsPage(this); page2->currentFrame()->setHtml(GenerateWelcomeHTML()); ui->welcomeView->setPage(page2); // connect(ui->statisticsView->page()->currentFrame(),SIGNAL(javaScriptWindowObjectCleared()) // QString file="qrc:/docs/index.html"; // QUrl url(file); // ui->webView->setUrl(url); } void MainWindow::on_statisticsButton_clicked() { ui->tabWidget->setCurrentWidget(ui->statisticsTab); } void MainWindow::on_statisticsView_linkClicked(const QUrl &arg1) { //qDebug() << arg1; on_recordsBox_linkClicked(arg1); } void MainWindow::on_reportModeMonthly_clicked() { ui->statStartDate->setVisible(false); ui->statEndDate->setVisible(false); if (p_profile->general->statReportMode() != 1) { p_profile->general->setStatReportMode(1); GenerateStatistics(); } } void MainWindow::on_reportModeStandard_clicked() { ui->statStartDate->setVisible(false); ui->statEndDate->setVisible(false); if (p_profile->general->statReportMode() != 0) { p_profile->general->setStatReportMode(0); GenerateStatistics(); } } void MainWindow::on_reportModeRange_clicked() { ui->statStartDate->setVisible(true); ui->statEndDate->setVisible(true); if (p_profile->general->statReportMode() != 2) { p_profile->general->setStatReportMode(2); GenerateStatistics(); } } void MainWindow::on_actionPurgeCurrentDaysOximetry_triggered() { if (!getDaily()) return; QDate date = getDaily()->getDate(); Day * day = p_profile->GetDay(date, MT_OXIMETER); if (day) { if (QMessageBox::question(this, STR_MessageBox_Warning, tr("Are you sure you want to delete oximetry data for %1"). arg(getDaily()->getDate().toString(Qt::DefaultLocaleLongDate))+"

    "+ tr("Please be aware you can not undo this operation!"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) { return; } QList sessionlist; sessionlist.append(day->sessions); for (int i=0; i < sessionlist.size(); ++i) { Session * sess = sessionlist.at(i); sess->Destroy(); delete sess; } daily->clearLastDay(); // otherwise Daily will crash getDaily()->ReloadGraphs(); } else { QMessageBox::information(this, STR_MessageBox_Information, tr("Select the day with valid oximetry data in daily view first."),QMessageBox::Ok); } } void MainWindow::on_importButton_clicked() { on_action_Import_Data_triggered(); } void MainWindow::on_actionToggle_Line_Cursor_toggled(bool b) { p_profile->appearance->setLineCursorMode(b); if (ui->tabWidget->currentWidget() == getDaily()) { getDaily()->graphView()->timedRedraw(0); } else if (ui->tabWidget->currentWidget() == getOverview()) { getOverview()->graphView()->timedRedraw(0); } } void MainWindow::on_actionLeft_Daily_Sidebar_toggled(bool visible) { getDaily()->setSidebarVisible(visible); } void MainWindow::on_actionDaily_Calendar_toggled(bool visible) { getDaily()->setCalendarVisible(visible); } #include "SleepLib/journal.h" void MainWindow::on_actionExport_Journal_triggered() { QString folder; #if QT_VERSION < QT_VERSION_CHECK(5,0,0) folder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); #else folder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #endif folder += QDir::separator() + tr("%1's Journal").arg(p_profile->user->userName()) + ".xml"; QString filename = QFileDialog::getSaveFileName(this, tr("Choose where to save journal"), folder, tr("XML Files (*.xml)")); BackupJournal(filename); } void MainWindow::on_actionShow_Performance_Counters_toggled(bool arg1) { p_profile->general->setShowPerformance(arg1); } sleepyhead-0.9.8/sleepyhead/oximeterimport.ui0000644000175000017500000023011312412506713020767 0ustar sergiosergio OximeterImport 0 0 1312 638 Dialog 12 12 12 12 0 0 Qt::Horizontal QSizePolicy::Fixed 200 20 24 Oximeter Import Wizard Qt::AlignCenter 4 0 0 0 255 255 255 120 154 188 153 174 255 103 132 243 27 45 116 36 60 155 0 0 0 255 255 255 0 0 0 255 255 255 120 154 188 255 255 255 120 154 188 0 0 0 154 172 243 255 255 220 0 0 0 0 0 0 255 255 255 120 154 188 153 174 255 103 132 243 27 45 116 36 60 155 0 0 0 255 255 255 0 0 0 255 255 255 120 154 188 255 255 255 120 154 188 0 0 0 154 172 243 255 255 220 0 0 0 27 45 116 255 255 255 120 154 188 153 174 255 103 132 243 27 45 116 36 60 155 27 45 116 255 255 255 27 45 116 255 255 255 120 154 188 255 255 255 120 154 188 0 0 0 54 90 232 255 255 220 0 0 0 QFrame { background: qlineargradient( x1:0 y1:0, x2:1 y2:0, stop:0 white, stop:1 #789abc); border: 1px solid gray; border-radius: 15px; } QFrame::StyledPanel QFrame::Raised 0 0 0 0 Qt::Vertical QSizePolicy::Preferred 20 10 border: 0px solid gray; border-radius: 0px; :/icons/oximeter.png false Qt::AlignHCenter|Qt::AlignTop Qt::Vertical 20 40 1 4 4 4 4 background: white; border: 1px solid gray; border-radius: 15px; QFrame::StyledPanel QFrame::Raised border: 0px; border-radius: 0px; QFrame::NoFrame 0 Qt::ScrollBarAlwaysOn QAbstractScrollArea::AdjustToContents QTextEdit::AutoAll QTextEdit::WidgetWidth 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> true false Qt::Horizontal 40 20 Skip this page next time. QPushButton { background: qlineargradient( x1:0 y1:0, x2:1 y2:0, stop:0 white, stop:1 #eeeeee); border: 1px solid gray; border-radius: 10px; } QPushButton:hover { border: 2px solid #56789a; border-radius: 10px; background: white; } QPushButton:pressed { border: 2px solid #56789a; border-radius: 10px; background: qlineargradient( x1:0 y1:0, x2:1 y2:0, stop:0 white, stop:1 #cccccc); } 4 12 4 12 4 0 0 14 <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Please note: </span><span style=" font-style:italic;">Make sure your correct oximeter type is selected otherwise import will fail.</span></p></body></html> Qt::AlignHCenter|Qt::AlignTop true Qt::Vertical QSizePolicy::Fixed 0 10 0 0 18 QFrame::NoFrame Where would you like to import from? Qt::AlignCenter Qt::Vertical QSizePolicy::Fixed 20 10 0 Qt::Horizontal 40 20 Select Oximeter Type: QComboBox::AdjustToContents CMS50Fv3.7+/H/I, Pulox PO-400/500 CMS50D+/E/F, Pulox PO-200/300 ChoiceMMed MD300W1 Qt::Horizontal 40 20 0 0 75 true true CMS50E/F users, when importing directly, please don't select upload on your device until SleepyHead prompts you to. Qt::AlignCenter 0 0 true 4 4 4 4 <html><head/><body><p>If enabled, SleepyHead will automatically reset your CMS50's internal clock using your computers current time.</p></body></html> Set device date/time <html><head/><body><p>Check to enable updating the device identifier next import, which is useful for those who have multiple oximeters lying around.</p></body></html> Set device identifier 0 0 100 16777215 <html><head/><body><p>Here you can enter a 7 character pet name for this oximeter.</p></body></html> nnnnnnn true 0 Qt::LogicalMoveStyle false Qt::Horizontal 40 20 <html><head/><body><p>This option will erase the imported session from your oximeter after import has completed. </p><p>Use with caution, becauseif something goes wrong before SleepyHead saves your session, you won't get it back.</p></body></html> Erase session after successful upload Qt::Vertical QSizePolicy::Fixed 20 10 <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> Import directly from a recording on a device :/icons/oximeter.png:/icons/oximeter.png 64 64 false Qt::Vertical QSizePolicy::Fixed 20 10 <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> Record attached to computer overnight (provides plethysomogram) :/icons/cms50f.png:/icons/cms50f.png 64 64 Qt::Vertical QSizePolicy::Fixed 20 10 <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review :/icons/save.png:/icons/save.png 64 64 false false Qt::Vertical QSizePolicy::Expanding 20 20 14 <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?<br/></span>If you forget, you won't have a valid time to sync this oximetry session to.<br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> Qt::AlignHCenter|Qt::AlignTop true Qt::Vertical 20 40 21 Please connect your oximeter device Qt::AlignCenter 15 If you can read this, you likely have your oximeter type set wrong in preferences. Qt::AlignCenter 0 0 21 Please connect your oximeter device Qt::AlignCenter 0 0 QFrame::StyledPanel QFrame::Raised Press Start to commence recording Qt::AlignCenter 0 0 QFrame::StyledPanel QFrame::Raised 6 6 6 6 6 75 true Show Live Graphs true Qt::Horizontal 40 20 75 true Duration Qt::AlignHCenter|Qt::AlignTop 200 50 QFrame::StyledPanel 8 75 true SpO2 % Qt::AlignHCenter|Qt::AlignTop 0 0 60 50 0 106 255 0 106 255 127 127 127 Qt::LeftToRight QFrame::StyledPanel 2 75 true Pulse Rate Qt::AlignHCenter|Qt::AlignTop 0 0 80 50 255 0 0 255 0 0 159 0 85 QFrame::StyledPanel false 3 0 0 21 Multiple Sessions Detected Qt::AlignCenter 0 0 Please choose which one you want to import into SleepyHead Qt::AlignCenter true QAbstractItemView::SingleSelection QAbstractItemView::SelectRows true Start Time Duration Details 21 Import Completed. When did the recording start? Qt::AlignCenter 0 0 0 200 Day recording (normally would of) started -1 0 2 0 0 0 0 1 0 0 200 Oximeter Starting time 0 0 I want to use the time reported by my oximeter's built in clock. true 0 0 I started this oximeter recording at (or near) the same time as a session on my CPAP machine. true 0 0 0 0 <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 0 0 0 <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> true 0 0 Choose CPAP session to sync to: 6 6 6 6 Qt::AlignCenter 0 0 0 ... :/icons/back.png:/icons/back.png 0 40 16777215 40 QFrame::StyledPanel QFrame::Raised 0 0 ... :/icons/forward.png:/icons/forward.png Qt::Horizontal 40 20 0 0 14 You can manually adjust the time here if required: 0 0 40 QAbstractSpinBox::UpDownArrows HH:mm:ssap Qt::Horizontal 40 20 Qt::Vertical QSizePolicy::Expanding 20 40 QFrame::NoFrame QFrame::Raised Qt::Horizontal 40 20 0 0 160 0 &Information Page 0 0 160 0 &Cancel 0 0 160 0 &Retry 0 0 160 0 &Choose Session 0 0 160 0 &End Recording 0 0 160 0 &Sync and Save 0 0 160 0 &Save and Finish 0 0 160 0 &Start sleepyhead-0.9.8/sleepyhead/profileselect.h0000644000175000017500000000262012412506713020352 0ustar sergiosergio/* Profile Select Header (Login Screen) * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef PROFILESELECT_H #define PROFILESELECT_H #include #include #include #include #include namespace Ui { class ProfileSelect; } /*! \class ProfileSelect \brief Simple Login Window providing a list of all profiles to select from */ class ProfileSelect : public QDialog { Q_OBJECT public: explicit ProfileSelect(QWidget *parent = 0); ~ProfileSelect(); QString selectedProfile(); void QuickLogin(); private slots: void on_selectButton_clicked(); void on_newProfileButton_clicked(); void on_listView_activated(const QModelIndex &index); void earlyExit(); void openProfile(); void editProfile(); void deleteProfile(); void on_listView_customContextMenuRequested(const QPoint &pos); void on_pushButton_clicked(); void on_filter_textChanged(const QString &arg1); private: Ui::ProfileSelect *ui; QString m_selectedProfile; int m_tries; QMenu *popupMenu; QStandardItemModel *model; QSortFilterProxyModel *proxy; }; #endif // PROFILESELECT_H sleepyhead-0.9.8/sleepyhead/reports.cpp0000644000175000017500000006563112412506713017556 0ustar sergiosergio/* Reports/Printing Module * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include // #include //#include #include #include #include #include #include "reports.h" #include "mainwindow.h" #include "common_gui.h" extern QProgressBar *qprogress; extern MainWindow *mainwin; Report::Report() { } void Report::PrintReport(gGraphView *gv, QString name, QDate date) { if (!gv) { return; } Session *journal = nullptr; //QDate d=QDate::currentDate(); int visgraphs = gv->visibleGraphs(); if (visgraphs == 0) { mainwin->Notify(QObject::tr("There are no graphs visible to print")); return; } QString username = p_profile->Get(QString("_{") + QString(STR_UI_UserName) + "}_"); bool print_bookmarks = false; if (name == STR_TR_Daily) { QVariantList book_start; journal = mainwin->getDaily()->GetJournalSession(mainwin->getDaily()->getDate()); if (journal && journal->settings.contains(Bookmark_Start)) { book_start = journal->settings[Bookmark_Start].toList(); if (book_start.size() > 0) { if (QMessageBox::question(mainwin, STR_TR_Bookmarks, QObject::tr("Would you like to show bookmarked areas in this report?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { print_bookmarks = true; } } } } QPrinter *printer; bool aa_setting = p_profile->appearance->antiAliasing(); bool force_antialiasing = aa_setting; printer = new QPrinter(QPrinter::HighResolution); #ifdef Q_WS_X11 printer->setPrinterName("Print to File (PDF)"); printer->setOutputFormat(QPrinter::PdfFormat); QString filename = PREF.Get("{home}/" + name + username + date.toString(Qt::ISODate) + ".pdf"); printer->setOutputFileName(filename); #endif printer->setPrintRange(QPrinter::AllPages); printer->setOrientation(QPrinter::Portrait); printer->setFullPage(false); // This has nothing to do with scaling printer->setNumCopies(1); printer->setPageMargins(10, 10, 10, 10, QPrinter::Millimeter); QPrintDialog dialog(printer); #ifdef Q_OS_MAC // QTBUG-17913 QApplication::processEvents(); #endif if (dialog.exec() != QDialog::Accepted) { delete printer; return; } mainwin->Notify( QObject::tr("This make take some time to complete..\nPlease don't touch anything until it's done."), QObject::tr("Printing %1 Report").arg(name), 20000); QPainter painter; painter.begin(printer); GLint gw; gw = 2048; // Rough guess.. No GL_MAX_RENDERBUFFER_SIZE in mingw.. :( //QSizeF pxres=printer->paperSize(QPrinter::DevicePixel); QRect prect = printer->pageRect(); float ratio = float(prect.height()) / float(prect.width()); float virt_width = gw; float virt_height = virt_width * ratio; painter.setWindow(0, 0, virt_width, virt_height); painter.setViewport(0, 0, prect.width(), prect.height()); painter.setViewTransformEnabled(true); QFont report_font = *defaultfont; QFont medium_font = *mediumfont; QFont title_font = *bigfont; float normal_height = 30; //fm2.ascent(); report_font.setPixelSize(normal_height); medium_font.setPixelSize(40); title_font.setPixelSize(90); painter.setFont(report_font); //QFontMetrics fm2(*defaultfont); qDebug() << "Printer Resolution is" << virt_width << "x" << virt_height; const int graphs_per_page = 6; float full_graph_height = (virt_height - (normal_height * graphs_per_page)) / float( graphs_per_page); QString title = QObject::tr("%1 Report").arg(name); painter.setFont(title_font); int top = 0; QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), title, QTextOption(Qt::AlignHCenter | Qt::AlignTop)); painter.drawText(bounds, title, QTextOption(Qt::AlignHCenter | Qt::AlignTop)); top += bounds.height() + normal_height / 2.0; painter.setFont(report_font); int maxy = 0; if (!p_profile->user->firstName().isEmpty()) { QString userinfo = STR_TR_Name + QString(":\t %1, %2\n").arg(p_profile->user->lastName()).arg( p_profile->user->firstName()); userinfo += STR_TR_DOB + QString(":\t%1\n").arg(p_profile->user->DOB().toString( Qt::SystemLocaleShortDate)); if (!p_profile->doctor->patientID().isEmpty()) { userinfo += STR_TR_PatientID + QString(":\t%1\n").arg(p_profile->doctor->patientID()); } userinfo += STR_TR_Phone + QString(":\t%1\n").arg(p_profile->user->phone()); userinfo += STR_TR_Email + QString(":\t%1\n").arg(p_profile->user->email()); if (!p_profile->user->address().isEmpty()) { userinfo += "\n" + STR_TR_Address + QString(":\n%1").arg(p_profile->user->address()); } QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), userinfo, QTextOption(Qt::AlignLeft | Qt::AlignTop)); painter.drawText(bounds, userinfo, QTextOption(Qt::AlignLeft | Qt::AlignTop)); if (bounds.height() > maxy) { maxy = bounds.height(); } } Machine *cpap = nullptr, *oxi = nullptr; int graph_slots = 0; Day * day = p_profile->GetGoodDay(mainwin->getDaily()->getDate(), MT_CPAP); if (day) cpap = day->machine(MT_CPAP); if (name == STR_TR_Daily) { QString cpapinfo = date.toString(Qt::SystemLocaleLongDate) + "\n\n"; if (cpap) { time_t f = day->first(MT_CPAP) / 1000L; time_t l = day->last(MT_CPAP) / 1000L; int tt = qint64(day->total_time(MT_CPAP)) / 1000L; int h = tt / 3600; int m = (tt / 60) % 60; int s = tt % 60; cpapinfo += STR_TR_MaskTime + QObject::tr(": %1 hours, %2 minutes, %3 seconds\n").arg(h).arg( m).arg(s); cpapinfo += STR_TR_BedTime + ": " + QDateTime::fromTime_t(f).time().toString("HH:mm:ss") + " "; cpapinfo += STR_TR_WakeUp + ": " + QDateTime::fromTime_t(l).time().toString("HH:mm:ss") + "\n\n"; QString submodel; cpapinfo += STR_TR_Machine + ": "; // if (cpap->machine->properties.find(STR_PROP_SubModel) != cpap->machine->properties.end()) { // submodel = "\n" + cpap->machine->info.modeproperties[STR_PROP_SubModel]; // } cpapinfo += cpap->brand() + " " + cpap->model() + submodel; CPAPMode mode = (CPAPMode)(int)day->settings_max(CPAP_Mode); cpapinfo += "\n" + STR_TR_Mode + ": "; if (mode == MODE_CPAP) { EventDataType min = round(day->settings_wavg(CPAP_Pressure) * 2) / 2.0; cpapinfo += STR_TR_CPAP + " " + QString::number(min) + STR_UNIT_CMH2O; } else if (mode == MODE_APAP) { EventDataType min = day->settings_min(CPAP_PressureMin); EventDataType max = day->settings_max(CPAP_PressureMax); cpapinfo += STR_TR_APAP + " " + QString::number(min) + "-" + QString::number(max) + STR_UNIT_CMH2O; } else if (mode == MODE_BILEVEL_FIXED) { EventDataType epap = day->settings_min(CPAP_EPAP); EventDataType ipap = day->settings_max(CPAP_IPAP); EventDataType ps = day->settings_max(CPAP_PS); cpapinfo += STR_TR_BiLevel + QString("\n" + STR_TR_EPAP + ": %1 " + STR_TR_IPAP + ": %2 %3\n" + STR_TR_PS + ": %4") .arg(epap, 0, 'f', 1).arg(ipap, 0, 'f', 1).arg(STR_UNIT_CMH2O).arg(ps, 0, 'f', 1); } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { EventDataType epap = day->settings_min(CPAP_EPAP); EventDataType ipap = day->settings_max(CPAP_IPAP); EventDataType ps = day->settings_max(CPAP_PS); cpapinfo += STR_TR_BiLevel + QString("\n" + QObject::tr("Range")+ ": %1-%2 %3 " + QObject::tr("Fixed %1").arg(STR_TR_PS) + ": %4") .arg(epap, 0, 'f', 1).arg(ipap, 0, 'f', 1).arg(STR_UNIT_CMH2O).arg(ps, 0, 'f', 1); } /*else if (mode == MODE_BILEVEL_AUTO_FIXED_EPAP_VARIABLE_PS) { EventDataType epap = cpap->settings_min(CPAP_EPAP); EventDataType ipap = cpap->settings_max(CPAP_IPAPHi); EventDataType psl = cpap->settings_max(CPAP_PSMin); EventDataType psh = cpap->settings_max(CPAP_PSMax); cpapinfo += STR_TR_BiLevel + QString("\n" + QObject::tr("Fixed %1").arg(STR_TR_EPAP) + ": %1 %3" + QObject::tr("Max %1").arg(STR_TR_IPAP) + ": %2 %3\n" + QObject::tr("Variable %1").arg(STR_TR_PS) + ": %4-%5") .arg(epap, 0, 'f', 1).arg(ipap, 0, 'f', 1).arg(STR_UNIT_CMH2O).arg(psl,0,'f',1).arg(psh,0,'f',1); } */else if (mode == MODE_ASV) { EventDataType epap = day->settings_min(CPAP_EPAP); EventDataType low = day->settings_min(CPAP_IPAPLo); EventDataType high = day->settings_max(CPAP_IPAPHi); EventDataType psl = day->settings_min(CPAP_PSMin); EventDataType psh = day->settings_max(CPAP_PSMax); cpapinfo += STR_TR_ASV + QString("\n" + STR_TR_EPAP + ": %1 " + STR_TR_IPAP + ": %2 - %3 %4\n" + STR_TR_PS + ": %5 / %6") .arg(epap, 0, 'f', 1) .arg(low, 0, 'f', 1) .arg(high, 0, 'f', 1) .arg(STR_UNIT_CMH2O) .arg(psl, 0, 'f', 1) .arg(psh, 0, 'f', 1); } else { cpapinfo += STR_TR_Unknown; } float ahi = (day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count(CPAP_ClearAirway) + day->count(CPAP_Apnea)); if (p_profile->general->calculateRDI()) { ahi += day->count(CPAP_RERA); } float hours = day->hours(MT_CPAP); ahi /= hours; float csr = (100.0 / hours) * (day->sum(CPAP_CSR) / 3600.0); float uai = day->count(CPAP_Apnea) / hours; float oai = day->count(CPAP_Obstructive) / hours; float hi = (day->count(CPAP_ExP) + day->count(CPAP_Hypopnea)) / hours; float cai = day->count(CPAP_ClearAirway) / hours; float rei = day->count(CPAP_RERA) / hours; float vsi = day->count(CPAP_VSnore) / hours; float fli = day->count(CPAP_FlowLimit) / hours; // float sai = day->count(CPAP_SensAwake) / hours; float nri = day->count(CPAP_NRI) / hours; float lki = day->count(CPAP_LeakFlag) / hours; float exp = day->count(CPAP_ExP) / hours; int piesize = (2048.0 / 8.0) * 1.3; // 1.5" in size //float fscale=font_scale; //if (!highres) // fscale=1; QString stats; painter.setFont(medium_font); if (p_profile->general->calculateRDI()) { stats = QObject::tr("RDI\t%1\n").arg(ahi, 0, 'f', 2); } else { stats = QObject::tr("AHI\t%1\n").arg(ahi, 0, 'f', 2); } QRectF bounds = painter.boundingRect(QRectF(0, 0, virt_width, 0), stats, QTextOption(Qt::AlignRight)); painter.drawText(bounds, stats, QTextOption(Qt::AlignRight)); mainwin->getDaily()->eventBreakdownPie()->setShowTitle(false); mainwin->getDaily()->eventBreakdownPie()->setMargins(0, 0, 0, 0); QPixmap ebp; if (ahi > 0) { ebp = mainwin->getDaily()->eventBreakdownPie()->renderPixmap(piesize, piesize, true); } else { ebp = QPixmap(":/icons/smileyface.png"); } if (!ebp.isNull()) { painter.drawPixmap(virt_width - piesize, bounds.height(), piesize, piesize, ebp); } mainwin->getDaily()->eventBreakdownPie()->setShowTitle(true); cpapinfo += "\n\n"; painter.setFont(report_font); //bounds=painter.boundingRect(QRectF((virt_width/2)-(virt_width/6),top,virt_width/2,0),cpapinfo,QTextOption(Qt::AlignLeft)); bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), cpapinfo, QTextOption(Qt::AlignHCenter)); painter.drawText(bounds, cpapinfo, QTextOption(Qt::AlignHCenter)); int ttop = bounds.height(); stats = QObject::tr("AI=%1 HI=%2 CAI=%3 ").arg(oai, 0, 'f', 2).arg(hi, 0, 'f', 2).arg(cai, 0, 'f', 2); if (cpap->loaderName() == STR_MACH_PRS1) { stats += QObject::tr("REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%") .arg(rei, 0, 'f', 2).arg(vsi, 0, 'f', 2) .arg(fli, 0, 'f', 2).arg(csr, 0, 'f', 2); } else if (cpap->loaderName() == STR_MACH_ResMed) { stats += QObject::tr("UAI=%1 ").arg(uai, 0, 'f', 2); } else if (cpap->loaderName() == STR_MACH_Intellipap) { stats += QObject::tr("NRI=%1 LKI=%2 EPI=%3").arg(nri, 0, 'f', 2).arg(lki, 0, 'f', 2).arg(exp, 0, 'f', 2); } bounds = painter.boundingRect(QRectF(0, top + ttop, virt_width, 0), stats, QTextOption(Qt::AlignHCenter)); painter.drawText(bounds, stats, QTextOption(Qt::AlignHCenter)); ttop += bounds.height(); if (journal) { stats = ""; if (journal->settings.contains(Journal_Weight)) { stats += STR_TR_Weight + QString(" %1 ").arg(weightString( journal->settings[Journal_Weight].toDouble())); } if (journal->settings.contains(Journal_BMI)) { stats += STR_TR_BMI + QString(" %1 ").arg(journal->settings[Journal_BMI].toDouble(), 0, 'f', 2); } if (journal->settings.contains(Journal_ZombieMeter)) { stats += STR_TR_Zombie + QString(" %1/10 ").arg(journal->settings[Journal_ZombieMeter].toDouble(), 0, 'f', 0); } if (!stats.isEmpty()) { bounds = painter.boundingRect(QRectF(0, top + ttop, virt_width, 0), stats, QTextOption(Qt::AlignHCenter)); painter.drawText(bounds, stats, QTextOption(Qt::AlignHCenter)); ttop += bounds.height(); } ttop += normal_height; if (journal->settings.contains(Journal_Notes)) { QTextDocument doc; doc.setHtml(journal->settings[Journal_Notes].toString()); stats = doc.toPlainText(); //doc.drawContents(&painter); // doesn't work as intended.. bounds = painter.boundingRect(QRectF(0, top + ttop, virt_width, 0), stats, QTextOption(Qt::AlignHCenter)); painter.drawText(bounds, stats, QTextOption(Qt::AlignHCenter)); bounds.setLeft(virt_width / 4); bounds.setRight(virt_width - (virt_width / 4)); QPen pen(Qt::black); pen.setWidth(4); painter.setPen(pen); painter.drawRect(bounds); ttop += bounds.height() + normal_height; } } if (ttop > maxy) { maxy = ttop; } } else { bounds = painter.boundingRect(QRectF(0, top + maxy, virt_width, 0), cpapinfo, QTextOption(Qt::AlignCenter)); painter.drawText(bounds, cpapinfo, QTextOption(Qt::AlignCenter)); if (maxy + bounds.height() > maxy) { maxy = maxy + bounds.height(); } } } else if (name == STR_TR_Overview) { QDateTime first = QDateTime::fromTime_t((*gv)[0]->min_x / 1000L); QDateTime last = QDateTime::fromTime_t((*gv)[0]->max_x / 1000L); QString ovinfo = QObject::tr("Reporting from %1 to %2").arg(first.date().toString( Qt::SystemLocaleShortDate)).arg(last.date().toString(Qt::SystemLocaleShortDate)); QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), ovinfo, QTextOption(Qt::AlignHCenter)); painter.drawText(bounds, ovinfo, QTextOption(Qt::AlignHCenter)); if (bounds.height() > maxy) { maxy = bounds.height(); } } /*else if (name == STR_TR_Oximetry) { QString ovinfo = QObject::tr("Reporting data goes here"); QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), ovinfo, QTextOption(Qt::AlignHCenter)); painter.drawText(bounds, ovinfo, QTextOption(Qt::AlignHCenter)); if (bounds.height() > maxy) { maxy = bounds.height(); } }*/ top += maxy; graph_slots = graphs_per_page - ((virt_height - top) / (full_graph_height + normal_height)); bool first = true; QStringList labels; QVector graphs; QVector start, end; qint64 savest, saveet; gGraph *g; gv->GetXBounds(savest, saveet); for (int i=0;i < gv->size(); i++) { g = (*gv)[i]; if (g->isEmpty() || !g->visible()) continue; if (g->group() == 0) { savest = g->min_x; saveet = g->max_x; break; } } qint64 st = savest, et = saveet; bool lineCursorMode = p_profile->appearance->lineCursorMode(); p_profile->appearance->setLineCursorMode(false); if (name == STR_TR_Daily) { if (!print_bookmarks) { for (int i = 0; i < gv->size(); i++) { g = (*gv)[i]; if (g->isEmpty()) { continue; } if (!g->visible()) { continue; } if (cpap && oxi) { st = qMin(day->first(MT_CPAP), day->first(MT_OXIMETER)); et = qMax(day->last(MT_CPAP), day->last(MT_OXIMETER)); } else if (cpap) { st = day->first(MT_CPAP); et = day->last(MT_CPAP); } else if (oxi) { st = day->first(MT_OXIMETER); et = day->last(MT_OXIMETER); } if (!g->isSnapshot() && (g->name() == schema::channel[CPAP_FlowRate].code())) { if (!((qAbs(g->min_x - st) < 5000) && (qAbs(g->max_x - et) < 60000))) { qDebug() << "Current Selection difference" << (g->min_x - st) << " bleh " << (g->max_x - et); start.push_back(st); end.push_back(et); graphs.push_back(g); labels.push_back(QObject::tr("Entire Day's Flow Waveform")); } start.push_back(g->min_x); end.push_back(g->max_x); graphs.push_back(g); labels.push_back(QObject::tr("Current Selection")); } else { start.push_back(g->min_x); end.push_back(g->max_x); graphs.push_back(g); labels.push_back(""); } } } else { const QString EntireDay = QObject::tr("Entire Day"); if (journal) { if (journal->settings.contains(Bookmark_Start)) { QVariantList st1 = journal->settings[Bookmark_Start].toList(); QVariantList et1 = journal->settings[Bookmark_End].toList(); QStringList notes = journal->settings[Bookmark_Notes].toStringList(); gGraph *flow = (*gv)[schema::channel[CPAP_FlowRate].code()], *spo2 = (*gv)[schema::channel[OXI_SPO2].code()], *pulse = (*gv)[schema::channel[OXI_Pulse].code()]; if (cpap && flow && !flow->isEmpty() && flow->visible()) { labels.push_back(EntireDay); start.push_back(day->first(MT_CPAP)); end.push_back(day->last(MT_CPAP)); graphs.push_back(flow); } if (oxi && spo2 && !spo2->isEmpty() && spo2->visible()) { labels.push_back(EntireDay); start.push_back(day->first(MT_OXIMETER)); end.push_back(day->last(MT_OXIMETER)); graphs.push_back(spo2); } if (oxi && pulse && !pulse->isEmpty() && pulse->visible()) { labels.push_back(EntireDay); start.push_back(day->first(MT_OXIMETER)); end.push_back(day->last(MT_OXIMETER)); graphs.push_back(pulse); } for (int i = 0; i < notes.size(); i++) { if (flow && !flow->isEmpty() && flow->visible()) { labels.push_back(notes.at(i)); start.push_back(st1.at(i).toLongLong()); end.push_back(et1.at(i).toLongLong()); graphs.push_back(flow); } if (spo2 && !spo2->isEmpty() && spo2->visible()) { labels.push_back(notes.at(i)); start.push_back(st1.at(i).toLongLong()); end.push_back(et1.at(i).toLongLong()); graphs.push_back(spo2); } if (pulse && !pulse->isEmpty() && pulse->visible()) { labels.push_back(notes.at(i)); start.push_back(st1.at(i).toLongLong()); end.push_back(et1.at(i).toLongLong()); graphs.push_back(pulse); } } } } for (int i = 0; i < gv->size(); i++) { gGraph *g = (*gv)[i]; if (g->isEmpty()) { continue; } if (!g->visible()) { continue; } if ((g->name() != schema::channel[CPAP_FlowRate].code()) && (g->name() != schema::channel[OXI_SPO2].code()) && (g->name() != schema::channel[OXI_Pulse].code())) { start.push_back(st); end.push_back(et); graphs.push_back(g); labels.push_back(""); } } } } else { for (int i = 0; i < gv->size(); i++) { gGraph *g = (*gv)[i]; if (g->isEmpty()) { continue; } if (!g->visible()) { continue; } start.push_back(st); end.push_back(et); graphs.push_back(g); labels.push_back(""); // date range? } } int pages = ceil(float(graphs.size() + graph_slots) / float(graphs_per_page)); if (qprogress) { qprogress->setValue(0); qprogress->setMaximum(graphs.size()); qprogress->show(); } int page = 1; int gcnt = 0; for (int i = 0; i < graphs.size(); i++) { if ((top + full_graph_height + normal_height) > virt_height) { top = 0; gcnt = 0; first = true; if (page > pages) { break; } if (!printer->newPage()) { qWarning("failed in flushing page to disk, disk full?"); break; } } if (first) { QString footer = QObject::tr("SleepyHead v%1 - http://sleepyhead.sourceforge.net").arg(VersionString); QRectF bounds = painter.boundingRect(QRectF(0, virt_height, virt_width, normal_height), footer, QTextOption(Qt::AlignHCenter)); painter.drawText(bounds, footer, QTextOption(Qt::AlignHCenter)); QString pagestr = QObject::tr("Page %1 of %2").arg(page).arg(pages); QRectF pagebnds = painter.boundingRect(QRectF(0, virt_height, virt_width, normal_height), pagestr, QTextOption(Qt::AlignRight)); painter.drawText(pagebnds, pagestr, QTextOption(Qt::AlignRight)); first = false; page++; } gGraph *g = graphs[i]; if (!g->isSnapshot()) { g->SetXBounds(start[i], end[i]); } g->deselect(); QString label = labels[i]; if (!label.isEmpty()) { //label+=":"; top += normal_height / 3; QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), label, QTextOption(Qt::AlignHCenter)); //QRectF pagebnds=QRectF(0,top,virt_width,normal_height); painter.drawText(bounds, label, QTextOption(Qt::AlignHCenter)); top += bounds.height(); } else { top += normal_height / 2; } p_profile->appearance->setAntiAliasing(force_antialiasing); int tmb = g->m_marginbottom; g->m_marginbottom = 0; //painter.beginNativePainting(); //g->showTitle(false); int hhh = full_graph_height - normal_height; QPixmap pm2 = g->renderPixmap(virt_width, hhh, 1); QImage pm = pm2.toImage(); //fscale); pm2.detach(); //g->showTitle(true); //painter.endNativePainting(); g->m_marginbottom = tmb; p_profile->appearance->setAntiAliasing(aa_setting); if (!pm.isNull()) { #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) painter.drawImage(QRect(0, top, pm.width(), pm.height()), pm); #else painter.drawImage(0, top, pm); #endif //painter.drawImage(0,top,virt_width,full_graph_height-normal_height,pm); } top += full_graph_height; gcnt++; if (qprogress) { qprogress->setValue(i); QApplication::processEvents(); } } gv->SetXBounds(savest, saveet); qprogress->hide(); painter.end(); delete printer; mainwin->Notify(QObject::tr("SleepyHead has finished sending the job to the printer.")); p_profile->appearance->setLineCursorMode(lineCursorMode); } sleepyhead-0.9.8/sleepyhead/newprofile.h0000644000175000017500000000304612412506713017667 0ustar sergiosergio/* Create New Profile Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef NEWPROFILE_H #define NEWPROFILE_H #include #include namespace Ui { class NewProfile; } /*! \class NewProfile \author Mark Watkins \brief Profile creation/editing wizard */ class NewProfile : public QDialog { Q_OBJECT public: explicit NewProfile(QWidget *parent = 0); ~NewProfile(); //! \brief When used in edit mode, this skips the first page void skipWelcomeScreen(); //! \brief Open profile named 'name' for editing, loading all it's content void edit(const QString name); private slots: //! \brief Validate each step and move to the next page, saving at the end if requested. void on_nextButton_clicked(); //! \brief Go back to the previous wizard page void on_backButton_clicked(); void on_cpapModeCombo_activated(int index); void on_agreeCheckbox_clicked(bool checked); void on_passwordEdit1_editingFinished(); void on_passwordEdit2_editingFinished(); void on_heightCombo_currentIndexChanged(int index); void on_textBrowser_anchorClicked(const QUrl &arg1); private: QString getIntroHTML(); Ui::NewProfile *ui; bool m_editMode; int m_firstPage; bool m_passwordHashed; }; #endif // NEWPROFILE_H sleepyhead-0.9.8/sleepyhead/scripts/0000755000175000017500000000000012412506713017030 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/scripts/build_number0000644000175000017500000000000212412506713021412 0ustar sergiosergio0 sleepyhead-0.9.8/sleepyhead/scripts/inc_build.sh0000755000175000017500000000121512412506713021316 0ustar sergiosergio#!/bin/bash MY_PATH="`dirname \"$0\"`" if [ -f "$MY_PATH/build_number" ] then number=`cat $MY_PATH/build_number` else number=0 fi if [ ! -f $MY_PATH/../build_number.h ] then # This is needed to build, so make sure it's available echo "const int build_number = ""$number;" | tee $MY_PATH/../build_number.h fi if [ ! -f "$MY_PATH/ReleaseManager" ] then # Script only needs running by Release Managers exit; fi if [ "$1" == "release" ] then echo "Updating build number" let number++ echo "$number" > $MY_PATH/build_number echo "const int build_number = ""$number;" | tee $MY_PATH/../build_number.h else echo "Skipping build number update" fi sleepyhead-0.9.8/sleepyhead/sessionbar.cpp0000644000175000017500000001463512412506713020226 0ustar sergiosergio/* SessionBar Graph Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include "sessionbar.h" SBSeg::SBSeg() { session = nullptr; color = QColor(); highlight = false; } SBSeg::SBSeg(Session *sess, QColor col) { session = sess; color = col; highlight = false; } //SBSeg::SBSeg(const SBSeg & a) //{ // session=(Session *)a.session; // color=a.color; // highlight=a.highlight; //} SessionBar::SessionBar(QWidget *parent) : QWidget(parent) { timer.setParent(this); m_selectIDX = -1; m_selectColor = Qt::red; m_selectMode = false; } //SessionBar::SessionBar(const SessionBar & copy) // :QWidget(this) //{ // timer.setParent(this); // QVector::const_iterator i; // for (i=copy.segments.begin();i!=copy.segments.end();++i) { // segments.push_back(*i); // } //} SessionBar::~SessionBar() { } void SessionBar::updateTimer() { if (!underMouse()) { QVector::iterator i; for (i = segments.begin(); i != segments.end(); ++i) { (*i).highlight = false; } } else { timer.singleShot(50, this, SLOT(updateTimer())); } update(); } SegType SessionBar::min() { if (segments.isEmpty()) { return 0; } QVector::iterator i = segments.begin(); SegType min = (*i).session->first(); i++; qint64 val; for (; i != segments.end(); ++i) { val = (*i).session->first(); if (min > val) { min = val; } } return min; } SegType SessionBar::max() { if (segments.isEmpty()) { return 0; } QVector::iterator i = segments.begin(); SegType max = (*i).session->last(); i++; qint64 val; for (; i != segments.end(); ++i) { val = (*i).session->last(); if (max < val) { max = val; } } return max; } QColor brighten(QColor, float f=2.0); void SessionBar::mousePressEvent(QMouseEvent *ev) { SegType mn = min(); SegType mx = max(); if (mx < mn) { return; } SegType total = mx - mn; double px = double(width() ) / double(total); double sx, ex; QVector::iterator i; int cnt = 0; for (i = segments.begin(); i != segments.end(); ++i) { Session *sess = (*i).session; sx = double(sess->first() - mn) * px; ex = double(sess->last() - mn) * px; if (ex > width()) { ex = width(); } //ex-=sx; if ((ev->x() >= sx) && (ev->x() < ex) && (ev->y() > 0) && (ev->y() < height())) { m_selectIDX = cnt; emit sessionClicked((*i).session); break; } cnt++; } if (timer.isActive()) { timer.stop(); } timer.singleShot(50, this, SLOT(updateTimer())); } void SessionBar::mouseMoveEvent(QMouseEvent *ev) { SegType mn = min(); SegType mx = max(); if (mx < mn) { return; } SegType total = mx - mn; double px = double(width() - 5) / double(total); double sx, ex; QVector::iterator i; for (i = segments.begin(); i != segments.end(); ++i) { SBSeg &seg = *i; sx = double(seg.session->first() - mn) * px; ex = double(seg.session->last() - mn) * px; if (ex > width() - 5) { ex = width() - 5; } //ex-=sx; if ((ev->x() > sx) && (ev->x() < ex) && (ev->y() > 0) && (ev->y() < height())) { seg.highlight = true; } else { seg.highlight = false; } } if (timer.isActive()) { timer.stop(); } timer.singleShot(50, this, SLOT(updateTimer())); } void SessionBar::paintEvent(QPaintEvent *) { QPainter painter(this); QRect rect(1, 1, width() - 2, height() - 2); painter.drawRect(rect); SegType mn = min(); SegType mx = max(); if (mx < mn) { return; } SegType total = mx - mn; double px = double(width() - 5) / double(total); double sx, ex; QVector::iterator i; QRect selectRect; int cnt = 0; for (i = segments.begin(); i != segments.end(); ++i) { SBSeg &seg = *i; qint64 mm = seg.session->first(), MM = seg.session->last(), L = MM - mm; sx = double(mm - mn) * px; ex = double(MM - mn) * px; if (ex > width() - 5) { ex = width() - 5; } ex -= sx; int len = L / 1000L; int h = len / 3600; int m = (len / 60) % 60; //int s=len % 60; QString msg = QString("%1h %2m").arg((short)h, 1, 10, QChar('0')).arg((short)m, 1, 10, QChar('0')); //.arg((short)s,2,10,QChar('0')); //painter.setBrush(QBrush((*i).color); QRect segrect(3 + sx, 3, ex, height() - 6); if (seg.session->enabled()) { QLinearGradient linearGrad(QPointF(0, 0), QPointF(0, height() / 2)); linearGrad.setSpread(QGradient::ReflectSpread); QColor col = seg.color; if (m_selectMode && (cnt == m_selectIDX)) { // col = m_selectColor; } else if (seg.highlight) { col = brighten(col); } linearGrad.setColorAt(0, col); linearGrad.setColorAt(1, brighten(col)); QBrush brush(linearGrad); painter.fillRect(segrect, brush); } else { if (seg.highlight) { QColor col = QColor("#f0f0f0"); painter.fillRect(segrect, col); } //msg="Off"; } QRect rect = painter.boundingRect(segrect, Qt::AlignCenter, msg); if (rect.width() < segrect.width()) { painter.setPen(Qt::black); painter.drawText(segrect, Qt::AlignCenter, msg); } if (m_selectMode && (cnt == m_selectIDX)) { painter.setPen(QPen(m_selectColor, 3)); } else { painter.setPen(QPen(Qt::black, 1)); } painter.drawRect(segrect); cnt++; } if (!cnt) { QString msg = tr("No Sessions Present"); QRect rct = painter.boundingRect(this->rect(), Qt::AlignCenter, msg); painter.setPen(Qt::black); painter.drawText(rct, Qt::AlignCenter, msg); } } sleepyhead-0.9.8/sleepyhead/common_gui.cpp0000644000175000017500000001104312412506713020200 0ustar sergiosergio/* Common GUI Functions Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "common_gui.h" #ifndef BUILD_WITH_MSVC # include #endif #if (QT_VERSION >= QT_VERSION_CHECK(4,8,0)) // Qt 4.8 makes this a whole lot easier Qt::DayOfWeek firstDayOfWeekFromLocale() { return QLocale::system().firstDayOfWeek(); } #elif defined(__GLIBC__) # include Qt::DayOfWeek firstDayOfWeekFromLocale() { const unsigned char *const s = nl_langinfo(_NL_TIME_FIRST_WEEKDAY); if (s && *s >= 1 && *s <= 7) { // Map between nl_langinfo and Qt: // Sun Mon Tue Wed Thu Fri Sat // nl_langinfo: 1 2 3 4 5 6 7 // DayOfWeek: 7 1 2 3 4 5 6 return (Qt::DayOfWeek)((*s + 5) % 7 + 1); } return Qt::Monday; } #elif defined(Q_OS_WIN) # include "windows.h" Qt::DayOfWeek firstDayOfWeekFromLocale() { Qt::DayOfWeek firstDay = Qt::Monday; // Fallback, acknowledging the awesome concept of weekends. WCHAR wsDay[4]; # if defined(_WIN32_WINNT_VISTA) && WINVER >= _WIN32_WINNT_VISTA && defined(LOCALE_NAME_USER_DEFAULT) if (GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, wsDay, 4)) { # else if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, wsDay, 4)) { # endif bool ok; int wfd = QString::fromWCharArray(wsDay).toInt(&ok) + 1; if (ok) { return (Qt::DayOfWeek)(unsigned char)wfd; } } return firstDay; } #endif // QT_VERSION // Flag Colors QColor COLOR_Hypopnea = Qt::blue; QColor COLOR_Obstructive = COLOR_Aqua; QColor COLOR_Apnea = Qt::darkGreen; QColor COLOR_CSR = COLOR_LightGreen; QColor COLOR_LargeLeak = COLOR_LightGray; QColor COLOR_Ramp = COLOR_LightBlue; QColor COLOR_ClearAirway = QColor("#b254cd"); QColor COLOR_RERA = COLOR_Gold; QColor COLOR_VibratorySnore = QColor("#ff4040"); QColor COLOR_FlowLimit = QColor("#404040"); QColor COLOR_SensAwake = COLOR_Gold; QColor COLOR_LeakFlag = QColor("#40c0c0"); // Qt::darkBlue; QColor COLOR_NRI = QColor("orange"); //COLOR_ClearAirway; QColor COLOR_ExP = Qt::darkCyan; QColor COLOR_PressurePulse = Qt::red; QColor COLOR_PulseChange = COLOR_LightGray; QColor COLOR_SPO2Drop = COLOR_LightBlue; QColor COLOR_UserFlag1 = QColor("#e0e0e0"); QColor COLOR_UserFlag2 = QColor("#c0c0e0"); // Chart Colors QColor COLOR_EPAP = Qt::blue; QColor COLOR_IPAP = Qt::red; QColor COLOR_IPAPLo = Qt::darkRed; QColor COLOR_IPAPHi = Qt::darkRed; QColor COLOR_Plethy = Qt::darkBlue; QColor COLOR_Pulse = Qt::red; QColor COLOR_SPO2 = Qt::blue; QColor COLOR_FlowRate = Qt::black; QColor COLOR_Pressure = Qt::darkGreen; QColor COLOR_RDI = COLOR_LightGreen; QColor COLOR_AHI = COLOR_LightGreen; QColor COLOR_Leak = COLOR_DarkMagenta; QColor COLOR_LeakTotal = COLOR_DarkYellow; QColor COLOR_MaxLeak = COLOR_DarkRed; QColor COLOR_Snore = COLOR_DarkGray; QColor COLOR_RespRate = COLOR_DarkBlue; QColor COLOR_MaskPressure = COLOR_Blue; QColor COLOR_PTB = COLOR_Gray; // Patient-Triggered Breathing QColor COLOR_MinuteVent = COLOR_Cyan; QColor COLOR_TgMV = COLOR_DarkCyan; QColor COLOR_TidalVolume = COLOR_Magenta; QColor COLOR_FLG = COLOR_DarkBlue; // Flow Limitation Graph QColor COLOR_IE = COLOR_DarkRed; // Inspiratory Expiratory Ratio QColor COLOR_Te = COLOR_DarkGreen; QColor COLOR_Ti = COLOR_DarkBlue; QColor COLOR_SleepStage = COLOR_Gray; //#include //#include //typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); //LPFN_ISWOW64PROCESS fnIsWow64Process; //BOOL IsWow64() //{ // BOOL bIsWow64 = FALSE; // //IsWow64Process is not available on all supported versions of Windows. // //Use GetModuleHandle to get a handle to the DLL that contains the function // //and GetProcAddress to get a pointer to the function if available. // fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress( // GetModuleHandle(TEXT("kernel32")),"IsWow64Process"); // if(NULL != fnIsWow64Process) // { // if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) // { // //handle error // } // } // return bIsWow64; //} sleepyhead-0.9.8/sleepyhead/icons/0000755000175000017500000000000012412506713016454 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/icons/forward.png0000644000175000017500000000564712412506713020642 0ustar sergiosergio‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ )ª 3- 'IDATxÚíZypUÕÿ}çÝG0,(ЊPQŒp©8MqC¥ÒE-mÑ*µ` 3í8Smgêt¦jÇN§2cgt:,.Õ‚,‚ˆ" K !‹!ËKòö{Î×?ιïÝw³’:ð>æäÜ{ßݾß÷û~ßwî¤-miK[ÚÒ–¶´ Íz 9ÿOïãȇÍù=r VCA1]:¹„߯Üu¾ù°¸Âü= Ze7-Åð‹ Ç~6o1òs/óûö]·tÐåcò&bÙÂgýS fŒ>õIñrëæ‹ fFVF6ßùgkÎU%CÀ(+.õ?rñ…–P=ƒÕ¸÷†GÅÂ[òxEq©ïxj`ßé<1@AA¢ºå0N6¢Ëçáở€ßŸ±xv›µ¦ð) ¾àS€•‚b…†ö*i؃Écg`É¿ˆ¡CroÍZ»o(EÁΆd ¥$ZÂ_ãËÚ>t$–,|Ú7bâeRXs–ù /H+(–PʆdJIã|Q»Œ_ßõGkê·fæ)âíÅË}ó/H0K K(BL†q°nZ" xॾ oÍÓšâåÖSßÔ»X==±èñŒ)BÈ dôúi2Y+HeƒÍ?°Ùb…£gÊÑ„’ŸЈœÑX³ùßO•ZÃ.­²—¿õ–s—$'0q÷ÜEÈ”"ÌoÂÙ2Çœã®Ë]ÇFæŒEÔC±4N3€$ÌŒÓÈÚ!Ìœr=†decÕ/ü¶f¦Þô¨}ï–hxŒM-¸#&#IÌì8Od\&êbME0Ö É¶qÞð‚•‚õv}Û c\>¦/xB¼üÎósÛ¸iÿœR«dûsÑ#ýõ8J­¹DØø‡_<ª–ƒ¨o;"‚H¡÷Ç)%ò^0ÇœpÚÍ Å ƒ|˜6z¯mXaW׸ããgí­.‚ ¥Ë˜)aŠí„˜I£êRé¡Xj•OÌ6ô`’z†„r†s×=KDì öžÞ€P¼‹~Xj]uÙ¬l6/ó=0ð°©ß :©l­ö°µƒ¤´‡™ÉLJƒÒá>qÃþš-¨Æs‰›¿w»ÐËÅ¥Ö_Ï…É}Ö‡¦RIM}&âdþs2÷I”G ØùÍé01Å CAïKeRÃ#C᫆=h6£hz ò†ŽÂšÍ¯ünör|[IûþGx@ÀpG^Aš(9) )®À†ê®6Ø•Î>C¤çèY&ŸežÁ¬PÝr§ÞǤqÓqÿm‹EVVöÂgm›µù€‚T›å¤E"§íÄ6 µv‚JÌ.`œaöçyîãN‹3Ájì¬\‹aÙ¹XtÛkÄðü>ËWqý²AÓ¾‘o‚Eb~^tå-hÕ¢5ÚØQ½‰!HÏ „QxR¹fCq˜  K÷бV¢õhŽÔ¡1tp=‘z"F[±ƒ*†˜Œ ®í8FåŒGáe7úÎê†4,˜MŸU}Ì_}3Àœ ¿Sî!tTæˆA¤5€ÉÑÀ©’N)´UÁh ‚ñf„bmÒ³I7gV€RŒ˜wEPøq¦ý4®?óoxÀ·yïÛ™Ÿܹ~örÿ’ÏÄÿÙÿ ˜1¡" ÈuŽ6 èµ@(Þ„ÆH5ç²[WQ£¦{põ)Ý$§¦dL†QÙô9Œk§Ì¥Œ ?ª=~ëø"!ªvª-ýÊwùÓ±W q-) AÂõî FÄ!*CˆØmˆ¨ ˜ÀÐÀ¼˜É¤A°N•¸‘©6†^;ÙtG\ñ£§`pÖ.;n» À“ý³f|L†ŒÐm‚ ~Ë‚€Rù k•·9 ›c°9ªó^wκ„ˆIV1ù¢¡y0i¶ €=K¢qþƒYï@MC%>ضζe¬Ì²Ü_àSqøD³#h6£9T¯ñ„„@‚@ZÜÛdH@Î:ÁÅl&Ód"ÏîÈ+6 ‘N/aÖ˜>æzL=Ž•c{ù°R/Œ«’÷dåhõ°R%Yx.&š‚ÎupÞq\8)í!É.í<“~„bN䯉S@¬©TXP‚ ¹W`ûÞ÷Ôç‡?ƒ²é±Ož—/¦*Eïfø\‰ˆ¤>g›íçÇÌì\WUpœgƒ†æ„‘=#´lÀº›Ìôgáºñw#gÐ(üwû›vUÍñh¼ï+ÿ—]æêoøl@XgY):¥?*Cå‰üWN}w‰]†•‰k.¹ Y”‡uWÙ'«Gšñ£_®U÷ä]û@‡òa‡Åi€í ;Ö[è£-¸gòò³!„Ñ<•Z߉€œÌ|ŽšH0‚Wß[iš›ëkÊéÁÊmò˜GäÜïÚÕñ^à uàõø—8‘™}ž}á9&<Ûbö2k3+Ê ¡»HÓã&ê;cô)˜‘7§ëNbí»«e8Ûuh\8…Vç}:¬§»¥W)À®‡‘g›<Ûé…·9%!ŽBåg“&`L^ŒÉÙ×aï—»±qËûˆ´«7ö¿$ŸŽÅ3Ï”.ºìªW¨.œëÌiîÆi‘ÒS8ŸUÄD„ïæÍŘÌiش뮨¨àà×øÓ¾WäëçdÛ]>‰ ò8JˆŽ×iŸ¹®£óæzGôõ¢ðÓ \1òvdS>Ö~𚉩Nò[tB÷î`00Ù¨øl'6m-C,ÄÏíYa?ãŠ\gxË_Ÿïõ7Á.€è©ó:Ÿâ¶½­>ÝWaÇüHùJ¹¦aí î«ã}À õÄygÞ¸e‡#Á`´•Z±R~Ô‰ó=áüüÿ€4MèF<i?iõÝVñbìH'ÝZ¯ÛÚó ÀY×JÒ÷UÜ>Yñ¢lê¯MÚÒ–¶´¥-miK[oì¼÷r°“£!IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/cubeoximeter.png0000644000175000017500000012332112412506713021657 0ustar sergiosergio‰PNG  IHDRÈÈ­X®žsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛ .jp IDATxÚì½w˜]g}ïûyWݽL/šª‘F½K–Ü-ÙŒ‰mŒ'N€8H ’ 1©$À='07˜@ ÄØ`š)¶±Ü-ËE–%Y½kFšÞwß«¾ïýc¸¹'ObàÜs †ìõçì=Ÿç™ßïû]³Þò}—?çR?÷ó—¿Ø÷j¼ï×…§ÕŠWãÕx¯ÎÓjÅ«ñj¼WçiµâÕx5Þ«ó´Zñj¼ïÕyZ­x5^÷ê<­V¼¯Æ{õÏ´Zñj¼ïç¤V¼¯Æ{ƒÔŠWãÕx¿À#V­x5^÷yZ­x5^÷ê<­V¼¯Æ{užV+^Wã½:O«¯Æ«ñ^§ÕŠWãÕx¯ÎÓjÅ«ñj¼WÿL«¯Æ«ñ~ŽAjÅ«ñj¼Wañ DnkÅ«ñþ«ò´Zñj¼ïÕyµLzWãý ^-“^ãÕx?ƒWˤ×x5ÞÏàÕ2é5^÷3xµLzWãQˤ×x5Þÿ'^-“^ãÕxüƒÔŠWãÕx¯bZñj¼ïxĪ¯Æ«ñþ#O(õ³÷bÕŠ÷ëÏSX â("ør9RÕáøk‘¡àßl¡T.‘L&q=Ã4QRbé³m|ß#rË['Ñq'Ià0àþÆ×ïg¤&¾_^GG\uÍ5¤¸é6U7 ïjŒÏÌM'‹3Zµ)—L*e‰T&aà)è ˜†À0u ’ƒˆ©HØ’†LŒT"Bc¶Js¢“Ô%C¢Öº8ŽÆN2™ EÔÏùƒ~úñª©‰ïõË3th,Jßâ~–®ZͲ-1K’’ÖN5H3;Varb”P*’ñ,V´À)¢;“"‹&"hºfðxX˜º44 \]xà»è„ ¥„"aÛÔ%-²ŠöVÎÖ:Z›êhID ?Çà©ãü÷ÿþiv>û•jõ׺ÿ©Ajb~}ò9ï‚ ØxÑ•4-èãpµ£ƒ% gÇhÏØt·+ÂÊ §ŽS(”87^b¬œ aáEt/Þ‚‰âú9„î„! MÄAhšB€ QJ"4…."h4%J ¤"ÀÈhTÊA|Û€z–¬Ig‹ÉÒÞM)ƒXqŽG¾ÿMþå+ÿÂÔÔò×°ÿÁ 51¿þx™L†¥kÖ²ú²k¡k#ûåž,Òì—YÒ–eEo3i-GXÀ-LP”!žSF>''9vü,“n©¾«YÔ¿-š¥J\-$¢,1 BI4B4R % ]ÓÑÐÑ4Hš ?cÆõ0â° «Ž…Í)Zâ”)U@±ê㸎TÄMI£˜æ-“Ñ>ƒR/!DøkÓgš˜_?3Dà”È&46.nàâµKéÊZHg’©™Af§ D¬ñ˜I¥ZæÐ‰Ó<ÿò>N?Šç8Dì†E ° !]£³·‰EËZÉ6&QIK{;¥R‰™¹Iš[šÈD#ݽ‡á‰iŽ N1YѰÛú©ïÝJS{Mí­H;Ž'ABH¢z…å½i®ÚÔÁªV›´)ˆ Êé£dˆ&H Œål>r׆FZ%¤§*Rä‹%,–v&¹te”É3/ó?>ñ— ¾.úûs R3Çÿ?¼@vqrü<ðÜ¥<¿o‚SyF‡†0‚‹Úœ·¢‹õ+[©Oä¨Ì˜žœ ä¸hÉ3EeªÂÁý¯°g÷KùW<ýÄ¿òþþLƒÔÌñ¿Ï dš‘¹õ|ïÉyôÙNŸfrz˜«¶rɆ.V,ÌbQ&—›af6WõˆÅXñCƒ¼¼ïeöíy…ñ¡Q„Ó´Ñ,2‰QüÀÆ4£Ê’lÚcÛ5«V“ŸÓùæ}uLŽtÍäéìI±~}ñ¸N1_bzº€J,®ç‰%©º>3çN36•c¢bc5ôSß±†hcÉþ^Z:°ô4…B²WÂ0ѸE*%ÕID4b¶„Ìù’Ùb‘Âxa”˜3B5È€iEô0 ¦tP&]C 4˜ô5äùÀ­÷‘´ïù•ö÷U R3ÇÿÏ 2ŒÏõðýÛØþ|=Gy8…u Xµ´—‹W/¡¿+ЬŒ164B9p‘@Ô®ÃÑ$#çؽã9öÞÏL©€ $14ãKaÆ‚8ÅŠA6-‰F —«ò{caö—\ÓÄ+¯L+™Ä½|úã ¥(aXD积“Ö-覇ãçAhÄ¢ ªA)çùxa‰Ññ†Çóx^œd¶ ÙÞO}sí½ë¨ëè¤j¸Jü‚ÂD  …/=<À4tÝЉQ¤`J¥(…(¤ô!¢°ˆ‚ï‘°Ö,KñÖ«vÒ½Cìÿ•ô÷?5HÍÿë<˶H¥2¬Ürïù³Åüàé©R)¢û%:ÚÒl^»µË»iÌD©TÏ01<U‹x¬eKŠþ$G ³kçK>º›RÁ€ ZËÒœv$e4‘ÆT6·þÑ[¯˜L |ŸµT§aûƒ6-‹c|÷›%&Î4£P(§0H8 ,ŸT½Ak‹F2)&=¤0[¤µ¹ËJR©H§m&'&8ql€¹¼CAF1âmD[–Qß³š†Þ>²--„¢Z(¢)R ”@i!†6¯°À hh†…!BÄOë)¥œ7‹&QH%¶¦354ÐÔìò[W¦9¿÷sØÆ7éýý©™ã×Û×ÇÅW¼‰®ó~‹S:#§™¢43…±¥?ÃEk:éïï!ª;ägÏ15>Œ/3¤²I”ô™™õØ{x7/ïy’#GOM@‹ê\¼%B¦¡ÌÑSIöï•,ÙhÓÛc±g‡ÉÚU>·pÃñQRcÕ¦$¿w“CsïBæÊ<äÑÔЂ_ñ±üEÝG˜>‰¸®4ܲ¤Ì`']Ú:²¤ëuª*ÏÒU‹1]›¹é³ù6mÜÈî=»mGãÔ”Ï'þ,Ëì”MҪÎ, æ0*8i\ÏÄCGÇÂ¥D‡E¤L¦Ý)̰HC›N´! ’ô¶´` Q©¸hšÁñãÇñ=[˜xa•b¥ÄÔ¬ƒòm´ìbDóJÚöÒ¶lɺfÊ'WÄ­T0tÛ´ñ½M„¡æg·„!æ&4tÝFIPÄ0aèÓTg࣑÷%ùÎ)Îï}ó/U/ÿfš9~1ž‰°í­¿K}ÿœÊpvh”™¹Dµ‹›ê¸bÓ.\ÙMc]„\¡Ààè9ª^;’$•ªÃó|Ž9ÆîçŸá…];˜žÌ`³t¡ÆÅ—)Ê~•k®¶¸þÚ€W^4ùÁÝù‹Z³àc¶8vÈå-ovX¸ÆÀŠìyÖä>S&ÝÜÉÌœ…H,=‚_X‚•v©ø6e·‰Ìê>–mZŒ°u†ŽžctÏ8Áä M6Ù˜ÉäðQ”™#Û!›õˆ˜®ëS(°­šf¢„ÀÔ¤ªR,(Í™-„„V3vº™hëbÚ–n¢£oF"K©T¡R,¦ib¨]ÓæÇ"RbZ&R*ü0$bÇ }…REÒ,Ò˜­ã\>©ÏpîÁ?åÀîçizðs·ï×ÌÄâq6]y#Aj)e{-ÃcgpJçh°Î[¸ËÎ_ÏâE ¤¬Nq”ѱqŠž >ž!‰0WÈsàð!ž|rû^ÙG¥\,LScí:¸ö‹/°Ð=d´B4çÉçBºûL®¼ªÌЛÇw8 :Éú4ûv•Ùÿ’ÇÐPœ„i¡ü8Ä\ìˆM˜×0ÂzŒt#¥ÒZÎûã›YþÞ&§rßgÙ’Å”çò<ÿ™'8yÿìªKsR'Ôg¨ªFt†xÊ'–’HU¥\ôÑD„xÊdvjÇuinmÅŠÆ)ä&˜:K¾l"õV´t ý¤—¯§sérâvœññq<ÇGÓ¥0 )%¾ïc&†>¿ÑQ×£ š.ð±<Ÿz-@Ö'*iDó{yìsðKÓ‹®U3ÇÎ[´x7üö{XsÝ»°]Å´êehÄefìYxÓ…ý¼ûÆ‹yÓÖe´d]ŠsÃLŒæ™™+“ŒEiIÕ33]à‘'vðÕ¯ßÅü#ΞÅ=4KC×4"Bð®Ûáã7)ÏÄùèŸÙôo‚u—Z<ô|ì£UrÓ6lèõYîø°Çƒš?¥ñò® “ãq"ô0¢‰P-ÂÌBì–F*³ãK£ýØ|åbÆ^*óÐ'~ÂÈ3‡éÚÒË’÷l ãü%LŸÍ35VÀ uRv#~9C>Ÿ@Š€hDbh6¡òÉU<¢i›Þ¾¥´·öá•æÈ¤¢ÄSõ؆Nèæ CS‡(S˜É!1H6¶’L¦ÐÂ*Žà† eÚÍD>2ð MÐÂКÀS ;b3}l['/c¨¹ä'G~)zù¹‘ÛÿŠæ¸ðÒKxë{þ˜±œ}'Æ8=0Ìäè1UeYw#[7upÞú•¤£n~Œâì(ÕÀE™QÛ&gNްsÇž}éQ†Ï6‚HL€Òq¤‹&ÒÉ’´\¶m yßû£œQ•Ñ™ÿöG¶?jà)Wµ›¦éZžâùG¢ÌLXDd2ZƲv$ç ¼@É4»îZλá*"i›¾ðUÆ¿ûf×2¶üéõ\zÛ¥fà±ÿñ(Ç·Ÿbå5˸ðŽKÐ#1Nüë!^ùÜNrgÏÒÝ`!$”«ƒ˜bœTNªYRœ'ݤ³ ·—‰I‡R©ŠÂ¡>“FhÆ©x®KÅøf=F}/õ‹7ѹtÍ­øn•rÅÁõ%†ØÌ¯¼z]וDÓ44CG…ÖqÍÁ5-J¡`êÔ.výC¿½Ô2éÿÓU .ã3ßø3²]ûÇ9Kqv‚Î_ÞÎå[³ji31m–\.ÏÔä8†f’ˆEzš|Q²ÿàK<µó vïzÙ™9ÀĈ(4MGU-|U•z€I~P¥£±Ä‡?á­¿cñÊ>þi•ý§ l3_*#QÀ" Ó1‚,ÕÀ# u]ôÞ|¿µ‘˜¯3>0Çò+ºpK<ô®O2³óEHdÈ^µ™kþô–nèçè³#ìüÇíLè»}37þÎf¦ž:ÁÝ¿û¯t ñ‘²DP†¡¼Â¯óØxE'©ò &_ÙE*Ymud“”Ç'87Dµä ÐšŽïVp'ŒRÕ‰¶¯ {ÙÚûWMe(»’R±Œ­ lCÇ <  ¦i $RšÄ…$k”ñ´2ža.7ËÀ?ÌÀ‘=¯¹^j™t ä]ógÞ˃Oöðüž1Î h>kF¸bã2.\¿ŽÞÖ$zXdlâ³ÅB·H¥ëÑ5‹áÑIö¾´›§žÜÎî—_" %ñx Ë–äç¤XÄè_î°v‹`èt”—w—©86Rè–OàXl½<à†·G¹ç‹>{^ÖÐbè14¤“@iª^˜$ðQÄ®æš|€¹‰öÿÓ·™ž.±þ¯ÿ€+þì*ŸãÉ÷|šÜîçш£2qV¿ûF.ýã[©kŒ°ã³è©.Þº†Éç'øú»¾Fº\Ä.†Ç SDWö±â¶eý=ôZF·—³ÛCŸ>K©8Éd±€©ëDì(§‚ C4Ã%¡¢\–”‚"ÞŒÑu‹Ön¡cárB#J±ìá;U ábh–ib ¡Â„…-ÒjŽÀˆâZYªAH0±‹'îúÀk®—ÿÒ™ô’w1Oü ßy¼›WŽŒ1:qä§³YÉ€‹.Ô¸æMK{ »Ê×¾fß¡ùÁ™ã­©ç¯þ?y¢ñªã£›]7ñÊ6PHiI³Œ§¢X8€†'WQ·æbz/nèK1qd˜©{)æ0Í,-„‹eïÝÆ²ÝÄôî!v}ü‹8O?B “<M˗аu5ÉÕÝ,Ì´2¶#Çà#ƒå"†ÎL¥DÄŠQ.¦Pç×óÁo½½*(IWsœ‘ÃÓ<ÿwR:ú¦LcÈ$U­‹ ïÿ(ë>¸‘s“%¼‘.¼`1Ò©rÿ]1xß³„ƒÇIÚMÏ g…,û‹wòÎ]ÃÀþ<÷~äN*;'JéMá*^BZÑ ›–ŒNk]†jQ§êH*¼kãÔ¼ë{·óß.iåDµÂÃbÇ{˜xæzšÝͳù9ŽáºtCQõƒù„bàchj~¦* 1«:%_QÒˆl=k¶²tóˆÆ6JÅ N>‡%CLÝB7£Èò(äNmìÀvR•yßçýoÜÃÍ›þà5Õ‹þWõïg±~SÍ¡”ÆTù&îzáÓüõ=ëy`{™¡ãgèIxÜzÍ2ÞûŽÍ¼é²~: šÏ124G)pH×ÙÔgë©äóløû|ñλ¹ÿ;_cß+{)J@d>êÎ勒~…ÎVź ]â)ƒï/ä+w<³=ŶÍU.½T£$ÌzBÙìÜQfÿa‡ŠÁ´RhAˆ* B)±„À²t|TCFã¬yûÅ4^ÖÏäÎsìûØ¿pöÇ/Ñ¿u%—¾} ÙuK™+(&_A„¢ºÍøó§Ð½K®]Èšwn%?ì0¾û ‘˜aÛØ‹´1¿e½X Ÿ­PrL¼X3©µ«é»f¿õþ-¼áÂnvîØÇ]/ö¦÷BTÆ(ÎM‘Ÿ)±|åRtÃgðÜ CtR)„0ð‰Ð-|#†iKâV¿0ÊÔÙSŒŸ=C¦­ƒ®¥+™š¿Œ™HaŠÒè|­H"Õ‚Ti¤aâTÒv–M‹öc㯙þŒßts(¥s6ÿN¾ýôoóð›S§Gˆ‹ [º¼ñ†‹9E‰„MůRÅqòÈR  iœ9ÍO¼—'}Ž“§÷Êù0eÄhnO¢Ùeªry~P™i0­D¹ï«’7¾vðùÒ—L¾õ¯Nœ–\³Z0:\åŸïrˆÃa~¼bøyl"jãšn‚¯žÀut!+žüÒ½ô½Wo¦óûwðÂgÀ§¯û'®ºå|nûË+¹ú{äû÷nàÑÏÞOeï1Ò`ûß~™Aw˜ —mŸÃ2¢AÇ›rÑ0# âK»èÙ¼–Þ-«©ï­gͦfÒ8ùâq>õ‘OsìñC8síÉV ˰„HÍáÙçF×R©žP©T°m°, )%º®#TˆN ¥ “4‘jйÓrè*‰t-–Bi¢ÂäI ³ghlë@7S”¥Ä7C0,<Ïg&w+ š÷½fúûͤ+eqjúVî~â:Ù©15æÐh .]•äÒó³¾?ƒ¥òKSTŠ>¯!Ìd&MÙ xeßa¶oÇÛÁäOçÜuoÜ*xûí:N5Êç5þúŽ9Ö^ª¸óË3IeÒˆ0¸¯ÊÂ6^ÒçÀcßùºÉÉñ©5Ûh\ºŽ–þn„æ3sn’éÓǙڽJb¦M–ð„‡aFуZhªž•€†27ÜÄøF.ìÏR|ìß»ã'82Æ wlä²7­ãÐÞ1þîæR=7Š¡ Ç(cWªhvœ²§}Ñr} ;c4¬lgõšnz[’¤cÀÉGxôK?äȃIx6Ùôº)1Œ]÷Ð4iyT½arù9|ßÅ÷ÉDüÁðÕ¯}…ÁA²Ù,aΛėèš1kP!Ý¡\ö˜ôúè½á騴•¨—GŽ25¸ %çèYrzªƒ|2j J‚Ë–x¼ã’QzÚÞòšéÏøM3‡R6§Çnáó_Ï/ê83] ׿¹+7u°¼%MP-“›9ÃxÉEZ)RÉ4)á1/ðàƒðàCó /Q.—aéèBÇóþðOêøû¿pøÑàËŸpééNÓÖ›çSÿW”Ù‘8g+Ò—Ž“í«òí.Ÿø{ÄD'B@ôzo¸kÿîwÑêS³"HQÁr»ŠóÜ ìþÂÝÌíy …§I]‚R(á¢ü¨Òˆ”K˜_ÝÎS;§˜ûÐuüÞÛ—p÷®%|ûî<=â°Ø—´õ¤¨oîdôÌYâfé)¤eâ%-ÖÿÁ­´^¼’JKZS’Ë ‡¤nèrhÇAv~åAÿxv.G_c‚ P2˜ÊÁJ¸XQ¹ÜÅÉ9"šŽ1inn¢.ÛD¥râÄ ¶]u»v½Ä‰'°m›0 1tO9#‚+m¦œ-ÒAÏÆ›éêYO¤*Qӣ̞ÜG¹2F{ß"ìx¥PGi!"„ÐÍ“ŒXè2|Mõgü¦˜#”&‡G®çó?|?ÙaRgÃú.›+¯éââµmÔ¥tŠÕÓCàê"EsKi„œúNôÎ(/|v;»þîóà•É^u-ëþúvßx9 ¦™Ø½(š”H¿B çBGh:::*4ÉF\2‡9øÑ>uß:Ölë¥g}– J<õ]ùö“Øû'éH×1$ÎÚ3XÕ,NUPMĨ;¿mb˜¬æÓoDÎVÚš?ØÎÙnÇ›&‰ªP•e"f„†Ó„aÂì4zàÓß³“§†1 ÷¼ûvñã£s<þä#Ì妩ÏÖ#¥$ %BhxJÇ2%sùi<£ÆUï gÃUÔwuƒgQ<}€òÀsª#4t. ©u)¡Èàú†í"B A…¶Æ–€0È¢s¯‰þŒ_wsÄI¶ï½[>³½{gIG]®½t7®k`UoŠDÌ#?=ÉÄÀC#ÑhC3Ø»7?þñýüä‘'™ú7¦¦ëó+»žÇü J±d©i >õçbãñð IDAT#üëçlV®6Y{žÎÌ+9*sM—™L–|x¦Ä¿¬óÅ/[Ä­f,]Ûlʤ29&œ c~mó"½í&¼‰)ŒÕËð,“™¼Cã/auÓ°seìªË|‹üÁ'!n¡„Ä)—ñ”A>2^ȵÛ.à­oé៿úO<üèì]¿žB®È’å+øêW¿Šã¦©¡C“˜¡O±¤1QNbô^Κ‹n¤wáfT(˜9{’Ù‘C¸Ó‡<ÙÖ>Z:ÖõT5G8Ä…‰ª„4YEº›ãúUÜÊjb©§k™ôÿùJ¦Ò\ô†·Órá ì:Í6¼es W­©§­>‚ÐBæòE*NB ë ßõHÄ:rˆO}ò“ì?pJ¥J"Çó]ªU˲H$⸞O)ŸgËe ²í™DŠ|s˜–n…Ú\{ÇÆ *s“ƒŸÿ‚ÇËG3d{®¤sýåĶ“îÐ)ÎL0ôÒ~¦^x”êì Mk®fÅí·Ð|ÅZ;ƒî™è¦`lz–èì4T«”# Z×/$0aêàiF¾ô÷ß.ÇÑ5Eè ëQؘ¶…e›hÂ$P:aX@:k2ÄZÛÈ,Y†Þ‘fë çqÙ•Ëpg+<²ýev=ðãO<ƒ¬N“° 0CP&1Û¤}A±˜ êæ¨TóxÕ A’ɤiim%[—Á)9”òeVmXM®PàÙž£R,Ï;$b6 3@…>%G‘¯‚Õ°ŒÞ‹o }ý›0#iœ¡ãN <7€ãE¤—ÐÜ~ÑT…ÐÁ5B„nÐL¦Ï qŪßÛ¥äÇOÐÛsñ䯉þŒ_7s¤R.¼îwq/eÈÉpvÈ ›ê¸ýÍ=4d$¾+ÈOçq¤Dh`™az!®ë£(“ÉdéîéåØñ´¶¶ÐÒÚÊÔä¹\ŽX,@àûXf”dƒÏ%Û2ìzf¯âsãïÅihv9µ¿‰ÏþŸã„A…R©B¡$°»ÞÌŠ½æmç³èÂUr(’¶·»,xújŽßu“{žáù"Û·‚\,Bï-o¡ÿú˱5Áá¿ù†w>E4ÖOýÖËYòÁ·\ÚÁ²¾Ò¹cL?ý}ôˆ B£„†ƒáE \ƒê¿ÝïZÑIëk¦yíJ:.Ø@´«®óÚim4Ѧü§‡xöÞÝL܃†IÆSŒ’/N`˜]mIš›êB—©™qÀ§R-1£x^… ¸õïD 874ÄÑ£Çùî·HGkþ¬St©¯‹ ã!Ý€©\Hí§÷Ò7Ó½åJ’ñ$…‘sŒ Å™Å-Ž$2mÔ·/#ÞÐŒ6PÔ$¡°°MSù”ÆÎ4r¬Yy–nà¹:Wm«¼fú3~]ÌQ_ßÈEo¾ /½‰I·dÝ ¹Slêl¤­Ñ`bàE­ËNa…E<Ï' RIB)1 §Z%óñœ­[·rÏ=÷pìèQ2™ étšJ¥2¿[)"Q‹¯ðòÓ“äæ\V®-Ktp×ß{(m„Ù9 "•¦~Õ[¸üÿœÈÚ^Ê¥þí]Œüh‹nºŠÆë·‘K%°®¸„‹V­æø}sìk_cüÐK(R¸o¼ ÍèÒ£ý ×ÎO)2|dˆ¥~ò‘¤ŽÖ˜@!=¥Å Ê*0S$öѰhZËr2=Í,¹¤—L{œŽæ©ˆÉÀ©aÿç§9ðí—È9ŒCÌV '˜CP¥»§™††4B”Ÿ< Û6™œš¢»«›mW¾‰jµÂñcǸ÷Þ{Y¹bÇ¡ê•qJÓœ8<†l´ ªfŠàÆÓzéµôoº‚Ls³S#Œ|žpò4ª8BÌM&É´]B¶©=µ€²ÅÕ| +Ž­iÇFqgY»º“å½Í^„àðá#¯™þ^÷™ôd*Ãù—ß„Þ~5“ªŒ#b!œáJŠU—Ý:xÓbV÷¥ñr.N>Ä7Bþ´r¥¾ï†!¾ï#¥$‰P(øáÈý÷ßïûó/’q]Â0Äñ*ha#ÅÒ,ºU @(Çó‰¦%Ñâ.Aq«ßöIÖ}þ&ŒÏé—Žóìß~™ÜðqZ7o¡÷ƒïGõÕ!ñIÅë(ßËÀ?~“Ùg^!²¤›7|òˆ ýœ2Mº >îH'–$Ñe!•Ïéï?Í¡?ÿÑÜ® )0Iã¦ÚYò¶›É\|!~G'‘æ u¦G]Ü"%$õ¦Aer‚¿ÿ»¾ñ}ªG‰j:¶¥SÑÀÓ«¦G&§£©¸)(ÎN#…C4e|t×õ¸ýö÷’L¦(W*:xl]åR‰G~ò0èžë·ñh„b ˜*VAKѼôR–^x+éŽUäfF™ÜãÇñ “(¿D4#ÝÚHºm vr ®°¨†  …i+"ºÂô&ÏàÏ ³¢'ÍÖ Vò†K–S-Íqà஽ö ¯™þtø÷+é¯s44µpùM¦õ‚0YFI‹c[ºE u”T(%‰X:ãn„§MáW}–÷fˆÇ} å A¨Ð„@ñÿšC ðCŸ0”8N]×Y·n=«V­bhhˆãÇ#åüâ] *@p=ÀK¢a ›!JèHBd ƒ²™?GÖÈеq)3QŸho3}×]ƒ Žïì¢{m7žá`êÑ®4mÝ‚Š§˜Üñ<‡îûj¶Dud??…kzÌŒ%ÿÜF¿ý=ÎÜõEDî,J M¤V¥’h©f6¼ûV:¶m`Îñ¨·º“:1Í¢0<ή{âGùOœüæÃèS“ØÉ-U¦$ò„aÀ‚æ:–ô´² ¾Ž°Zdvnœbµ€R!=]½¬Zµ%u¡Ô8rd? õìÙó2/¿¼‡T&ãd2uè¡ÇÜl‘¹J‚–® X~ýŸ°ìÒ·Q†ì¢0ð<ÁÔ!DqÍðIµwѸdñŽÍÑNJfˆo)+Ä24¢ÒÀÏå8†ŸcQ[Œ +zèëj§»%I¹8Ë“O?Ëã?þš=¹¼î2é­ ºXsõâD2[2Ðb)ŒXCÁ«¢ ©t„¦PÊG…ROPvÀr&XÓ©sÛ ë9¿Wgll†Ù²ƒn ¼P <н€PB(CÜÐE) ˆÅ’Ï~ðî»ï>ÆÇDZ"º0ñß €Bi`" ¤‰2c_aš-t¿émlþð»É·¦©FMÓ&S9…dCÉéGžãÔ'Y{Ýe°¡…ŠÒP9uçç{äÛ@3¥£,EP  â94=Ĥ‘0¡[f•TØKÞéÏïsã'~‡<¶¡pp‚]<ÄчîÇ?u #E‹„T ¡riii¡§£‹tÂd|t€¹¹š.H¤æ_Ŷ´ gÏžCÓt¶]µƒ‡37;MgSš'w>–5ÿ¸Díra‚b9B¼u-}¼•–µWaz‚‰‡(Oœ"( RuÎéÍ®!³`1±–|+ƒ%©Z.I3N\Z¸³ÓäFÇp §IZU4vÑßÕ¢îzú5³la Cgùä§>Í=÷Üóš ^7™ôÖÝ,¿ô”«q݆mO¥ðü?PógΪ!ÔOO0ÿR‰Ô4üP`(7=LS®¿ro¹ª‹h8Á¹Ó#¸z #jA©„„H¡’„BR©T1M“X,ƱcÇøÆ7¾ÁÓO?ƒRÓ´ðýíÿYƒÐBMã§/@„ó‡6K=^„ô¢,zóÕ° 0ãÑ”ˆ#'BNüä'œ}|8>©þ‹Yú…јlÀjI2prGoþ}Âü9|å"p1…N¨›è"Š’ éR)|7üiÛ‘^÷Þø¹÷°èÂö6ŒIôRµ@(™lšž®ÔÕgñ=b1O©X`ýšµ,]²„‰É :::˜››ãþoßOoO/ï~÷»yêÉ'Ù³w/gNŸ&ÉâItwKyŒNW‘všW_Cß%o'žifxx wä jüÕÊ(¡¨`%-Ò­‹ihß‚ï#0=|¾œÏ¥Û¶‰…Âcvr§4AÊòéjM‘®K¡ “¦Tš–†-Yƒ 7/'“ŒrèàA.¾äÇyÍÆÐ¿Päöµ0Gßâe,¼èVÊ‘eTªQŒHšH\Gª*žë#„†B¢ó¢0Lc~ñÓs”„ˆPGh‚ÐTx¡¦ÛˆP!¼2ÕR@ ‡·^ÝË ç· ¹9ŽŽÑ†®¨V|´0‚T!¿Œ¡ø¾Gµ:ÿßĶmÆÆÆøÎw¾ÃO~ǬZµŠÉÉI‚ÀÇ4#èšÂЪg‹LWm2‹®dée¿O¼£R~€â™ƒ8cGPÞå „i&hj飾s $Û‘f_ÓpµIÂŒb ÉôÌ(s£g1sS˜†¤1#›Šck , ;¥5§©.Êše¬[µˆJ©È£=ÆÛn~Ûk:ÁôKϤ5Üòߢ¢/¡¬5âkFÄé¡ùÃÐt Ä|„T膚†”á|VX„¦!Ðæß&$èºa`IAh WÌα¾/ä·¯[MO6ÍððqJ¥Iâv”ÐÑq}L…ï?Ýf¢áy.Ab†aòÜs/òÝï~‹ÁÁaŒôVâç­bÉ­o¢9eñÒ?ÜɸއÑ5•PÈp, ¡“T‚ºoz/MoZ…hn¢®±Üð3§÷sæ{à¾püI0°-¤çüK‰¶õb54Ó¹~!ý›μ|†]ßy”ÑïÜCuüt4„Cľ̃£c'è^ÐMg[;FXejj Ð4˜™¡·§k~­Ç2Ùzå6:wŽuk×Q,ùÖ7¿I$%”óùp%%ÕbrE¡u¬§ûâ[èZrÅñ9¦áO"+çq„•$^×Mºm-ÑLfº‰ªÒñ¥ƒaI´H +•+0{î …¹! áQµÈÖÇIÆ T¨°´(¦e“LY$¬€¾®:®¾ì<šêRŒq×]wñ7ó7¯éÓ/-“îxx绸óÞr2E¬®Í-ãá˜_IL"Ê@ Eúè(„Rhš@7 B5Ÿ1˜?‘O ë:¾,Ï?j:B ƒfiÿ7uïdÙ}Ýù}~ᆗûušî™žœg 2À0à0€Hˆ’ÈÕʲ̕׻[[^[Þu­]Þ —˲-­íÒj­•Ë^i%‘YT ER B")$ˆ49ô {:çî—nøÿq_@”v%,uÕ«î÷ºß{ýî=çžs¾ç{¾‡Üƒ$F¸­sÖZâd“O<°“w¿ç.6—/±83…ò2ˆèåiAÅð“TlgÆæ¤iF¥Ú`}q‰O~þË,žù;œü±Y •Þ"ßýÕǵÿûÓлF¬ ÅãUV½ a•Z³´º›¸ö"M[ÅTS~àܾÔ&N²wÿ8ƒM*{šdeŽMX{æSŸû®õ÷ðs/bˆ .#ËrÀSª*öÜÞ‰+ØÚÚÀ«¢‘¶±ÒCJøØÇ~ï=ó³³Tëu¾þÍoRŽcš fææ¸rm’r¹L Á{K’Ö6ÛPfìÿŠ#wÞGjaqò<Ý©óèt‰4Y&p’ñ‰”v!kì 4p€ÔAO¶ b‹˜NÒaíÆ ½¹Di‡fC244@¤ãBýQ$’r_2Iå&v ðèûïcÏŽ†ù¹%þËôøÌg>óC˜~è3é¹9Í—¾û÷ùÕ?h0?¿IX# ""¥i™nÿÍ Ò‹¢(|½í/œCàqRc½@8K$]ÿ»$U#ÂE:Dg»HJ€Âä§$aÑêft7×¹wŸâgÞœ‰ZÆË—_`½ç¥Ænaóe"—äÎà…'Ë2’$!Ž"„Rœmu¸<¼—õc÷ÑQeš¶Ãîá!n|óY^úŸ~‘åç¾ ´‘º„oº()QB’™â€‡8”$«ÜÊ¡ù ŒÏq¾MìšØÅÁ{)•cVW—Ñ:`eek §O¿<7¼ôÒ‹¼óïb` É׿þužøèóµ'¿Âç?÷9jõ^„åÂ&ØÞ[[ZáCw=ÁÞû#.רœ¼Jgò<¢u›-“‹ Jƒ NÜMeÇ-ˆÊ(a¹BϦ$Îâ”ã2q®X»1Gçå—°f“( Õ(—+„BÙO /bÂ(ÀHKI®rëÁ&ï{èAìlâ¬A ÃÕ+×ùð‡Ÿàüùó3gÒ={87ý/ø×ŸåÒLŠÕDT%5—g(<^é›APèÑZc‹ ´¾è1B „Ç{Y„<)ª¸² ,Q¹†"daq‘ÜeìÛ=ŽHs²Ê-ÿøŸrð'Î`[Ë”e 1‚Î ç˜üÃ?æÚïÿ>éLÑ-.EHO/OÀ´.³oßì¡RÙÚZ§ÝÞÝN‡|ä#xïùíßþmÞò–·pøðž|ò«XkùÄ'>A§½Á¿ù·¿J§kÐ(JÒ“·7XYm±ìkÔŽŸæÈ;ž 1t”ù5Z3OÓÙ˜!ÙšAø„j=fdüõ]w#«Uò°J&aãS‰–Bæ´—çY™¾Nge™¡ÈÓ(Óh” Cô)N(ðž8ÐX³…umÎÜ‚ÇÞ÷V†êEJ¨‹¦ä¹óç¹÷¾ûÉsóC˜ôÇ9ʈ֚/|á lmmqæÌ>õ©OñßüüÍw?@žT Í*Rö˜__/zG»ÞÂ-oý(;½‹Õõ„+ß~·r…¸{‰<]#ª•¨dÇÄ)JÍctÃQ|`è¹ k-ÞT‰dm¥¹+l-]GÛ{›†Ð$Ðor´8A!]—­­)vE¼ï½ðÀ·Q‰Ƥh)ðòžåÂù‹?tçxÝòF¤U¦~ž¿õß"o§2®ˆTÆ@mHòÌ’µ .õ$i ©‹ÕÃy–!¤$й1ˆB ©‰ð¶¨?T@©\¤.+kk§Y[ZÆØŒƒ‡Ò¨7™›[$É·h•£"I‡4^JŒxæŽtµC#[äÑ3Ü~b˜å©ç™yy­GQªM’¶±¼w8g0F›!6¢E›€|Sòre‚ÅÛîecuƒ©¯}…µ¯|‰ðÊ3Ø0¥§%*XS§+F)¿çQ>ö¿þCª»KL?õ<ó“\ùÓ¯‘¯\C’*pÊâ½%7 DÀèø.Ž9ÁðPLžwÙÚØÂºë,Æä,/,ò±}ŒøÃüÄOþ$ív›Gy„#GŽòå/‰ .066Fk«MÛfT*bsƒ¹Õ”làvßýA†î?ƒK%‹3ds—éEzíI`p÷~{oE7CpQ®Ñ•-Ò,§TÒÄ@ÞMi;Ìúì.Ùb¤2X¨V”*Žr9@z‰É é¸.qqÏ©½<ôÎ{84±gÓ"SoÍ)å%ZkK¬LM’­ÏRÕ)fL½Z¥¤J:Dh¼+ƒ3„¥×Y¥T xËÇøÐ;ï`×xç ôœÀ«"q÷x,09y½QŠ'èèëº'ýÜõÿŒŸýg‡hµÇ°.ãð8 M¹R¨ D 6ÐqN»ÅÖÖÝ­›k”ŒpÂm`Â"•èsЦ Æy^p±Bö B³º¼Êâ̹IÙ}p'#ãƒÈ2ÄAˆÊ5IàI¥C9OUEä½ L ð¥!Òn|öwíäÇOÒÛºÁ¹³Ï“örJQ¹àn¥]ŒQ8rÖõÈ­!3‚9±8}™³n0ñŸ$¾ûn*G2¸Â׿ò$ÿýçxþ‹_‚lžH†!p*@û¢Y †æàGŽaïîà2zIJš¥AHÒK±6ãÌ; Ûëñ¥/~‘G{œ»ïº“§¾öU>Â~áK\º|‘J¨ •C 5çX]^ãFK£÷ÝÊÎûgxï]tV·X¾~ZWÝëøî&T4wŒSßw;z_ÛIèl‘ÎÙŒ(ªà)Ó]Ý =?Igeš0Yc¨Ò¬Õp•…hÊa2$Yªâ¬ÁöÖ9´g$b°†µ¥%*¹á±·ïâ­{,¿ýu®ÌÎ!jUÊH: Pd&-Ò'©H3ƒ¶)Îdø¨LêC̉[Èß~'Y!¿qžïü›ÿ‡¾öE0ëDa0`2<9”hŽ qâØQ<Þ³±±Š3–<ϰְ¾¾Î®]üÜÏ}‚§žzŠæ##£üÎoÿiš3zà0““×謯S¯DJcóu¶ÚóÌ,x|ó{ÞöQ'Þ‚ok¶._¢»ú%;éÍâìÕý”Ço¡:qQÅaQÊÓ’!!ebL»ÍæÒksS¸öÍZ‰j@¥D1ÆŠ,Ò( •ÄÚµ©•áô铼÷÷²c Œ±Rè¢,^eo¾°Rï=RJºÝ.ssŸäСŸ}sèP¼{Òý-üùóÿ#ÿù?{D ¹ñ¨H‘ú„(/!]„‹Üw AcŒ(¦ç4=kð'ˆBtjÉ×ÖX™¼@º>M=Ò4keêå8q2$šP ”Ò ¾Z'iƒÈ¸ë`•‡ßóVNÝzéS¼õ©‹ZÓ}¯Cllß_[[£×û&&þÕ›Â|CfÒ=u~þŸÿ"ŸÿN‡¸4L’8!™18JD`5"ÒX)0Ò££˜x@•z™‰;É3ÃôËs@€Ö%ÈbØIHZõÃo¡þm­¥D8ë¸|u’á‘Qì?ŒÐ’­uVW×™¼v­6ûöàÄ­Çèù6—Î^$K»Äµ2û¢Ü¨ÓíöP6CŠb©¤GEëaenëy⾎íèðíç.2yõZÞ’¥9*ФYc,R@–%8á)åÝNºé2»0Ç3Ï|›öÚ¢\Ë2ÃÀàGäðþ=ÔªšõõU6Öר4èö:lmn²g÷>>ðpöì‹Ôk âR̾ðEöïßÏ‘£Gú»þ_ýÊŸ0ã2Õr…­­3«†åÍ„á[bçÿ)cõ«S“lÎ^ŦëäíK-"ƒ˜Js‚úØ”OŒ£•#èõpÎãÃ>ŒñksL_»Bwi†ªê2\q4ªU]#Ô©$^†ø¨ yJIç±µ¹Èà`‰w¿ó>>}‚f½ŠsÎz´Š Kœùý Zï=B¦§§©Õ~ŽÁÁ/¿),ó7lOúOþ½ÿ—ÊTt—^blLnB)¬¤€V½è+~ktáãˆR%` QgYœ_¢R­”PB!(]ä£R_¼Ÿ”Å‚é%¥ fua•ëW®H[­î¼çʵ VÀÈÎV6Û\}yŽ‘Úƒõ:‹ëËlºû÷ìd°Rf­ÝA…Z ¬12o ¢ˆöê&Ýå î=4ÎÇNyf§xú[†÷ž²ª`mJNJÁø ²a–adxåÑ––ùîwŸçòµ«è°Æm'ïàð‘Ä5Oš¶X_\':PØ€¸qåÊÖV7ù»ÿÅßeii™O~ò“œ~à4ÖX~÷SŸflÇ»vqmjŠ$M¨„,Ì/2·šíº—oÿ8õ‰Ûðëm–_>lÏ zStzSDtˆ«ƒ;OQÛs¥ÚŒ ñaNª%©“„2@¶[tægéL]&Ï6)Å–áF•F¥„Ê c²>$«pAˆÒ$9¤-î=µ—÷?x'Ç#pdT?²8ï‡êU6%p}ØvBpñâEx(š}S擾o¢ð¯úb'ïx‰k¨“»bSô€Åà°ˆBÎÞI¤(„Ø‚0ïÉ’„¤×%ˆ$f/ ˆSú&š%”J)¤ÖQQ)¬³xC…3(‹a×þì9|nb¨5£€¥åELf8~òµf™‘‘!^ž%7=ª£e¬uXgqÎ#HQ“ç:ô”¹¾’ò­K³ìÙu÷Üq+­ù—¹±2‡(•P"À:‹µwhkqÖá­%ëvIÛ]ê•{÷ï£V+S¯F9¼—F-bc}™­Í Ž9ÁûÞ÷/OMsáÂ%Ê¥ =þJkþßûkìÝÁÉcÇø½ßý ËK›”†Ù²9skË”¤@u{œ½±ÅZ|‰~†ƒ§ ³>uÎä3˜îyLz‘´3Ã@PÛq;•}ï ²çV|m†8í0X¢0FAkvŠ+ÏÓ™»D [ VhR*G Aª)À"´F*1º+ì ùð#oå#zãƒx› -‹=ú¬ ߯?dœßE¼÷cX]½ÌØØÿñÊþožô'ŽóîGÿ.ç盤©§Ómã„"w`'· k5Rk „B!*Ö¨XG!q9 ®† !÷ÝG¬´*šý^zU²Ïâ•ýS½(è*R´’°Zba~‰å…%Ž;D­*I{“稗ŸeceƒWfÝ·ƒÊH ‘xëñÞ"EAµ÷~›jZ8t±Öñ˜™IÞ¾§Ê£oÙÇÂäWùÆÓÏš:28Ÿâ2y€Ã`l†³®vÊó~çü0Ë |ö³ŸedtkLA¥ñ9r´{9Sóº®ÆÐ}±óèÛÑ.VggÈæ¯¢{ äíi¼_E9a}‚æøíDÇ F0: u!%Z€Ï ÛÜ`}î:Ý•—)‰ZD©ÈQXBJ‡’9A 16DSBxȲu‚8åwå¡wßËÁ½cX“"(úXÈ~]Ù§mâ¯-Ê_ûÕétXXøw:ô÷ß4M„7d&½Ñà̃±¼áQŒ3P°3Š­¨^C‡SBMT/Sm”©ÖÊTj1a¢¤DJðJ µÆ{5Z7¯4ÛŽ¡”*ˆŒÂ©–,®8ÎZ”äα¸¸Ds Á{PÊP)ÕXœíÐÉz ï%É£ƒ4jUjªBk-a}¹E­Z—‘f:Ð…ž,!u19HF0¸—æS¾õüyî9y’»Nfmm…™eJaï5‰/¸[XÛç‚yðg]AÉ2Œ±(U̹k¨Vk¼ë]ïÂZÃÓO?R’$Éxá…sÜXX ¬Ôè¦-¼Ï)Ç಄¹©%®Ìd”޼—cø{4öÞG¯íX¾|³xº/“m^Aç›ÄÕjwPÙ÷v±;‘ƒ£äJEÄ„Nµ6H®Ý`sú*Ik–zlh6"ª¥R\/‹Å›R }qqRAˆéæØ¤ÅÁ‰˜?ñVyø4#ƒõ¡’%ƒÂ.n¿â{ Üí4Ê{³(uªµ±±”Ÿ¦^ÿΛ¦¦£ßˆ‹ã˜=£\œ^Ć|F'µøÌc­ÃxqÔšU¢:åZ…@ŶP/û{é¤WT‡7_ õv{µvÿæûÄFVEþj¬%ËšaƒCû9÷Â%žººN½Vfmc••­·Ýw+yn £˜PGØvÎ —α¼¾ÅÁ‡€õ/yn‹iFçÐZ’çgr»Fs°IwÃðO?wÜ:ćßù!öLœå›O}‘P‡4K 6Û)N뎱8WŒËƒ_¥U1¥E|ë[ßâÒÅË|è‘Gˆãår™v»M©TFŠ”<ÝB9K3ðØ<áÆäSë½ï Gÿ(ƒƒ»I[=æÎ]ÀmÎuo@gÌA¥¹“¡ñC”‡öã¢A¼ èæ9NjâÑí°²0ÍÒÜuJëkÄ*£QÔk¢¨ (¤r„A„É]¿/qF’uz”ãïz÷I}ð4cÃ8×ú”@F}SóýèQÔ£ Uô£‰(Šô›ãÔ|_ŠÕn·<ÿ7oOú©Ûnã—ÿõoò‡_{™<ñ¬¬·XO,­ÄÒI-‰(TšÔë%‚j1VëñQ„g¥Ej$úôvk]E(öûÂÞÄêµ0¯sŽË—/sæÌ–——ßç¸Aþº/¶gïœË¨•ŒÖdÖbµÅJÒ«Í}»Ø1Ô`³ÓÂcÑJ)’”xú™(©ÐºÆ´*RœW ·W"Îc½ëþýÎ9œwttBϯ4#öݳ )Ç Ã­Jt»m¦ç™¹4GÝ×±fÏ©ìÜ3ÌZw‘8¨°Ùʹrñ2;FFh¦)P°IÓ ŒW8)‘éõc»¸¼5Èÿò™ë|äîÃ<üãÿ„ç¿ûiþüϾÝj­Jš¥XçúWNèõzxïú¬eètڔˆýû÷óÝ羃T¥¸„“P,,,15×bÅ3zÇcºïA°ÎÖôíÙkˆdß›G¬Î¡D‹ÊXµc?~ônÂÁCTö´­AkM(#D¯ËÆô¹Yd²A=èUüŽ'ø[Çùêç?ǵ—"ó†Ô§V"ñdÂtz@‰É»dÎQm ¼BX‰í¬rmê*S­Aš·}˜Sw¿5¸“|uŽÕëWÉ–—ÑÝ9¤™Á¤‹ˆFL}Ç-D#'(Ÿ ¨Ó˺>Á©€P(Dnèl´IfÎcVo E­׆ðÚ‰¢Ü†)(È|ˆ“U¤Ð˜¼ ù2o=µ‡Ç?øNŽÞ‡˜!UP ñýsóU/BÄÍ:Dü…Îñê+IΞ=û¦:¼Î ¶¿Ê‹mnn266ÆGì ®^Ÿ¦›¥„¥Þ j5êõ•åf§7 T“Á¡&:* _´ÂK(±ÇaA ”’Ì+D_üMô»êâæA,"‡*"‹+Èl‚*p­ HXZB±•§Äõ ‡n9Bܨ’kÁÎýû DÄÒµY®?žµµUšûÆ9ph?•J1—m­%M‹9u'*Ô¥ø@#¤Çä]t9¤ºc€™•Už½8E½¾—·>C©žqõò· sTõÞÑP¸k%ÞJŒƒ¶4S¦†©—xnr•|ÇŽàï0xۻɭdíú5²ÉiXŸÂtÏ’$×ðÒQiî§¶ë^»OQÝG…äZX©WH«±[]:³S´¦ÏBg‰J,¨Æ!Õj‰¨"…°…ܑޢo%E˜5v †|äCïàãy»Ç†p&Eôσè õ !¾¯<³Mé?V|/Šô׳­mÇxmþ©O}Šçž{îMsŽ7t&ÝÚSHù<ßyá ô'/æƒtRP‘@–õõ”éY¸<·I}ÏžÚ H“¡—„Zâ­+ô„º™6QŒßzñÊAÛî¦;<®¯¿ûê†ÒvaU<» ÷›ã4(‘¤QT&"V—Ö™»zƒ|u•ÑáÆOì#k„ˆ¶Å%ÙMT íõpˆ#t¨ƒ¥%¹w`3‚Ä{<Šr²¹ºÎænßÛà‘· ·.óÇŸþK³kÍ:ÎzlâOf{X2,AºÎÂÒ¯E¶»æÛµÀää$?õS?ÅÓO?ý¦9Ç:“î½$Ë/†û9{q?üüwØèIâzc%«K« ³k=ÎÍt‰†ö²ÿî1ª26Íñ⸿ÎÉõ 5%$Nz<)|A}ð¾m°®¸¿]ÜY[|ÕÏ}ôl,Þäø<Ã:¨Äuðгg/²¾°Âèè͉QF›HéHÚ›8#*ÀZƒ1ý­B K1JI¤–8NX¤Ð†8‘còŒ’Žˆ YÎ{¬,/1î¸{?·ííñ§~ƒ§þü9”UÔM–f¨RŒ5–ÖÜ"—§æXƒì¸ûQïø^ÕHçgè,- [³èî4¶=‹˨8¦Ú<@þnößýª¹‹™•üÜÕy¶XÄõnà·Vt1º5rhôÁð~‚jïr”O0F‘%ÛéÐ^Z¦³2Kh–‰Tjì)U«8#¥'Vå’b.\FVhÒÖ*¸ÇCgnç¡w¿•‰ƒx[0 …ªŒëo¹þC ç?ÂaZ­O>ù$=öØ›êoøLºÏÿ-yþËÜ~j?¹üῈR9žÿîî=ÁøØ8:t,Ît¸òçh;À¾SÈÖ¡È‘APÌI–õ@WóWà\K—lG‡”º˜ñEçÚ#ðÖ¡=äÖӣкê¦)¥FÌîÆžvž¢rˆ½&3£¬ËȺ=ðå¿ÝìsGß @ uyAïÖ!xbÃfˆž!"*ã1Y{„§¯orufŠ3wçð[꜓ƹ—Îqõú2ÁðyëO2°óë­.›—.lÌ ;‹ô’y¢lhãkMôØAJƒ÷PÞ±7X#g{ô>Ævs²õMZË70›3ª‡®Jêa•²Ô(4V °N"e€Rš^’b³UNç‰GîçžSÐŒé¡(ÓÕŠºOã_Õ|£#H§ÓyÝýÍPÕo4eXÊ_GˆÍKÜsÇAB×áO¿;ÃZI3sãi¶æ®qÛ½î=ʉp‘«“-.=w c`ß©}Ôj!‘ÍÈ<!qœôÅ Ñ Œ-j$ ÑÚ"pä¶}ðœ+hñ¹±X/)žî‰…D[‰W/… ŠÀ¥†PE@–eXíð.çñ¶`G*,:úˆB Îo§vaÖ{¤Š@JrkÀ{¤÷¤¾˜·•¦T qÁ­6¿ñEªµ*¢ù Çïaç‰2£;v“ X¿>ÃÖÜa: ½)z½9¤íP‰$µÑÈ¡“È· Ê^8djÑ©Å%ž¤K¶< ‹“„ù:•Ð!ªUD\AK´ÄZƒR¯5yn tB‘&ë4ë!=|„¾÷ ÕÆ ÎZŒñ}}–B"Å6´?Ä!ÞXñÞÓív¹xñâ›îßç oT‡Ò¹§‘ê1œ³Ü~×mµQZÿß·™ãòKO£¿³Áó~ô®cL ‰æ:\;{ƒ7Ú¹wã#5Á[(…5Œ°d>E*UL’å“çdANB¡qyFÖÉÈ×6I,¸0"ˆC(‡Ä. ÜÉ›]Ò‚R_Pç Z½D W¾oDêæÁñÛ²”}‡WnBÊ~WÜâ •¤””¤(z36Ç Œ$µ¨FÔ¨‘ç9ÒvŽí$ïÀêì­Õ)h-PîÎã“%zÝet © Ž30¼—òøaDcYÙAJš$¤Yˆ3’<µt6ÖÙ\˜D§mʾK©–K  !’g J´ñÊ…TßõPy{OLðáGßÉmÇ÷"ð¤iZpÜDñ™éÓê‹´×#nòFü_9½Úvˆ×»Û# išrîܹ7Ý9¾ÇAÞÈö½sß!Çš}:´ˆ½;h Q)¥dk/ðòÓ9kW8|ôc;jäÂp}n«O%˜»°c÷ :6X¤µø,/ú!¡úô”'É5¹QH½­”Íåuº›mâ^Ljš¥Èsƒ TŸUìûôë  XûÊJac ¸þ{õ;ºÛ'®¸²½‚ãöápYŽÖŠ@©>ßÊ PÞ‘{0Âà=ë±¹"’¬›Ò[Û ³Ù"mmtf½ièMcMfs„ÊÐTý ñðlu'¢“û”,õ¸<Àus\»Cgmžöú<%·A9ð”ËŠ( !ŒÁ甼Fù¦_ÇJ!}†k¯±c¨ÂÃï>Í{Þq7õzˆsE=„¯8‡”êæUýÕNò rXÀì¯gì¯u‚Ô|íãI’Ðn·¹pá›î7äæ¶<úès|æ³BÄ éŒ'®îÀlÍwo0ýÝßg v ½á ÅPm„+—:\úæò“{Øqhˆ°*HlD€A±- Yµ3È,Bv,Éæ:ó‹l-¯xå0ˆQa !C°“T܇#EÑ'^|O¨·ýC R雲¿Yëp3PJ᥼ ØÜö!ç"‚xïÉlK ¹µcÈÚ^B¶¾†ÙZÂ&kˆÎ¶=5ë”Ëšúø*#û©#j$Q2¼K±Ù©)c“ ³2K²4ƒHÖ=åX†’ R(-°"G¢‘N‘M”Ðʶ֩Ä)÷ßwŒ¾ÿ ‡Œ‚ͰY†Ð1Z«›Ë‡”ÒEé_Ù·ýÕ;W;Çë <½6¥úA¿õßt»]®]»F’$?’?”=éããÏ“ôº,A¢TÈp³ÉÈÞ} ­¥7qé³×¾B©dª¨4÷²÷p;½ÎÔ‹çIìF÷ï@WBà2_¬CðŽ,3´ºfc‹­ÅU¶–fÉ×—’-*Õ²y ó¤1ë< áC¼’}"Zrooáι"•s¼N^ìÀÉ›WKÛïìo7&Ý6­Â9¤8­Ü’ô i/Á¶ºôÖ×±eToZ/#’%âÀŒŒì'Úq’pèi\#“–Ü¥à\fÉzš|µEwyߤ$Ú„MT*Èx¬°xé …D8‹Rhz½-´ʼn½M>ø¾÷ð¶·Ÿ"YÖA«/Ë…úWúMàÿÂÈðêæí«ïÿ zã/ã^m?Þëõ¸páÂlÍeOúüü<ëë› ðHt)f QeGm€ñ‰[™Ÿž$7k¸È!XeúůÒóW9òÖ‡‰G8z°ÎõÙ ÏÞ€4 ¹ÝBÙ„å$½µuÚ«kt—fh¯Þ€l ™·Ñ2¤ZÞGU0^"rS8‚ ñÎÓËDfÑq€’š\€Çö¹`}'¢H+p}Ĭ€0½-fÈ_jH!pø~CL€X_½ùTÈ©riçØ¦½Eº1‹ïl¢ÒUòÖu‹Têqó8¥ûˆF îÅ•ª¤I¤×Åúafm“dm ³>Ì׉#C9ŽQˆ bBá½Ak‰÷'rd ñB‘õVhÆ‚÷¾í6yèíŒã½Á˜Œ@‡8¡þfYñ=Ì…íȱEþ"jÈ6Áðf¤Ù.ì_}~Pcpûï·ëð.üHœCˆÿù«zîÙ³ç9sætÚ…LÍH³FÝå Ö‰d …t¨PeÂÀóòËß%ÿ¶çðmïapô wW¸z}“…s³$­‰2V„¤I¼Õ¡77ƒY[Än͸¤ZÃ!ˇP¥ ŒQ¤i¥$A)"³ µD† Ÿ:¹2VQж… ?MXD' !;¡úHZ^ÑWÅÊ(qÅ‘J‘y‹uïd+ŠZ$íÌF ¿2Ý\„dۛǞ^’* IDATç+¡ >¼òè|óvªÃã¨ê Ý<Åt–F ’€,³$›[ØåëD­eâh USDA ¡T!n´PV¡‰2$“äHÓåþ[öñøC÷r×G¬É*(ÓDöÑg/¼žü gx55dÛØ_ýók£ÍkŸ÷êçnÿ1†^¯ÇîÝ~$Îñ—F¿NX{î¹ïòÁ~€ÍÍMV—Öá®;1¹üÍzƒ¥•&Òe¬.·Øsü0Ö^¼øik‰ã§>ÂÎC‡Øwd„+7Yžj!óÝ„q‹îÆ ›+Ó˜Ö,䛄y†’=zY›¸6D¹Ù¤eRº‰•‹Cå9a¤ d€àðäÞã¥@ÈÂ(\?]RýºCôÕüœ±}5’ª¨'úӆžO1 i±}h#è™™T0]ºëSˆö¢;Ý5L²Ž£E©30~ˆÊÀíèê>¨¡+eïè%ç4Ò*Ú-Ú+7píyÂl“(ò訌‹N¸”ªøÂã”/VÄ1$9¾°k8ä¡oç¡÷žfp „5i‘&ö?«÷®ù¾!¦×C›^ýó«Á‹×:ÇkŸ³Í­ú‹R¯íŸ{½ÆtˆãË?çø 䯛ó=ûì³)©7êlä›lmmrÿ}‡Yj'¼ðâ7Y0A$Y^^¢^ 8¾¯ÁõéoòB¶FÒùÛìº@l„ud}hV‡* ß7Q}QˆíHÐd2Öb_ô; ¥…±¶€ÅïûP®I &ó8+Ád$Mòå6nk•ÝÀõ¦ÈÚ³H›—#êÔ†á«ûƒ¨Ú-×e³Ó-àTfËn,Ò]{Ñ[£¤DU…”ÐÅØ@¿±]4+;€P'[Äôx×;NðøûOsààR:¬é „аo”þæ\†¸éâæèëöTìêW¼:z¼ÚÀ·áõžóÚëµõÇvÇ—"ÿ‘8Çt7¢ zöÙg‹>ƒ”ô¶6P6áýÞÁâ»øƒôZ †‡‡(—5 sÓTk1cã#<ûÒ%^zþ×ÉýÙµï~öŽ×1Ù4‹³ËnÀo€ïàdA–s&§  eLÚKq>ËB¶“@5¼!3l„¶‚bC•Wà´@‰Âè·?¾–/úè”+”xÕàMÁ;r^àǃO-ä‘öȶ–é¬Lã·–é2Ö.`³MœTvÒÛCyè º~ã´¢ëºÿ?{ï%ÙUßû~v:çTè4Ó“GšÅQ! „B1Dt¼ö{˾ cû²|ƒ¹¾öµýžÍ3¶ï»6~ÏãÆp-Éd”ÀE„ H£™Ñ¤ÎU]UçœÞûTu÷L$Û#½´ÖôtNï:µgÿÂ7`½#8pÝyz“SäS”sH™f¨n¨% +A¥h!Á¼§OÏ×R‘ Aљร›¼mÛ\tÞ«¨¥š¢,1B Q]EP¨¯¦à²¿©Å‚TÁ`#W™×áÒ¬þjÁyмJq>’ÐŒV‡ÝM!„Á„g1T¯_´¼™ûÁ±¸ž88[®Ž9øYü÷²,™ŸŸgåʇXp /t+mÝÚ»mdJ‘tLiµ„s/xGoy†§wïbzf–±c¬á¶[n¡×épÑyÛøÖw²÷ñϳró)dCDz¢^c¢¥) ‡–J¼°h™„¦S:\è ! žEÁ@pxã#àÑVO:¯°6"µU"+º#q¤·)^€N"cEä%2M)\´dö]‡ïÒ™ Ÿ>€híEÏïC–Óx¿HÒ±¨¯:ŽúŠãPuPk2Má-¥Yj|;'ß·“vk7®³—LæÔ2CšfèTƒðxRDÛ€9:ÍH]Škw‘¾ÅÙǯæÝo9‡×ž÷š8 ·J*„°™ ¤a¶Õâ‡á‘ï?Ao¶‡p N>åDÎ<ýtŒŠþJJ‚”gg«D,mé–eI1ý\|J.0– Žƒ¡%ýaY–Ôjß=bÁ±$@^œ>ó=ø° @ê„Ò–4´Ã0¾vI­Æää$Œ4›4.½œ;½û'8ïœóøæ]_£7ó}V®ƒh·Ð¦G=ƒÔd$¢txeщÄ;M^:CM¼ðØ™F3Å+Ï9šw\})gœ´ðäÖ¡¥B†$*áÆ›oᣟ¼ï>ú8#«7’ž„w’ÂyÒ$ell™Â½ïãøc¦8õ¤MXbzY©‘ âÜ<Ïsœsc0ÆÒÞ}.hɳ ûßw»]šÍÇ–(¸ÿ ƒ^ NúaÉ&lïWvqêì¢Bˆ1&B4‚CJÉÈÈH¥ƒå™™ž¦Ómqþù¯cÝÈ(÷~û+ ©œP7ÔjML’bsUÑjA˜ŒP¥X +*g@„h-|"°N$DˆC@gñVVÈ`â4Ü„1%#ÌÄEü—¨ tÑ+èÌÍQ´§p³{ í=„|YNâ{{&ŽS?‰¡ñÓad5¶–RVù¿Ã"•'uC´§;Ìx’0³›ÄÏ0RS•™¨&<10D†-‰ªSO®ÛÁ‡œÓŽ]Á¶K_ͯ;›áF†s]@£”g‘:åÀä,÷‘ó_úgf“UŒo<‘ÒŠ– KšŒGµ’N×SKFØ=[rçÓlÚ´f¦p.`” ˆ¨åÕ÷ŠìÇÁSðåˆÏ†Þ]üÿöÓé02òÐ Žç=Iÿ×/î`B¬܈~®ÚüyoBR¯7ذq#ZÆô$L÷$§y6Y=ðð“%ÝÒ‘5ê¨DSv£¼’LŠ 0q"îÜ`Ž!¼Ã‰(ƒJ°ñßxÊ‚”H2 KÖAY"´B¤á¸(öf Kw¾EoöÅì’b e'év\›4MÉVCcýi¨‘-„d-.q”¢O&ò’¢×¡˜xŠÎÄ^üüC™%k„ ¤²¶p„Ê‚ |0-!o1b:\ú†³xëUç³qÃ*‚/)Ê.F§ $½¼ –&<õäS¼ÿ·ÿˆo=¼‡¡õÇÒÐ)Ý"P3’Ff¨gŠŒg-iÖÄú6í^àžžâ¬ãWpæiñés`¢L"ËÒ˜&WÚ^ËMÇŸ ½»\õS±¢((Ë’fóá#!<ù·/n;B\5(ä?u"dAUß{jY µr‰,ɧºôPœzæ«)ÒYîx K¢S´H°Þc„D)I&žAAP±° ‡'x‹7%û-Jk£06ˆ Ú`‹<ÎGÒ42ã*`!½HßÅylQОk373A(v#»s¸Þ$E9…“-††Ç^y*ríɰr ¹ÊºÂcÙk®Û£;Ó¦39‰éô> $(ÝÆ9ƒ"Åèl·Ù0V㊷_À[¯¼€‘á1|épe”iuèØ-{d&cû·ïåý¿û?Ù1—­ÞŒëæ¬h@ÚÈP „/P^F¼™pXÀx‰ ÑÑzxb2Ðs‚'$21PMÚãGÆYâaÚ¹ÏEŠz¶×;ZÏ’$;hpDcl=Is¨aœÓä¥]°LÏîAMN {s(?GfbÇTœ\õocGϘF6®Kkj7'nYÉÛÞò.yý«iÖ5yÑŽ¢ÝÊTæ’€E¹€Ò†=;÷ðßëƒ<¶§ËŠ [˜lu[¹“f,JT¤1 RÄ´S•' ©$çK‘)\õ`£’Z ~!Pž£ ?ü "–@èûEA¯×ãÑG=âÁ±l€¼Ð9Ÿ”{ؽ{ëÖ­;ììO©C´¬ R)êYÆÆ£×sÌÑ«xìéÝ`iš!¼ÆÒB B„’h­È² á=ÁåHç"¬"Ø ÀFö_°ˆ ‘h‚CJ`»¯J¦÷í¦è´I•Û¦èÍ \#-I­N64†®‚¬ãJ4™’´[-æ[t[ûÉÚ³ ¥Ð¬Å”7‚^Y ¤ U å-"(\kŽÄtxÛ›Îå'Þy Go\ ¾a"õÕû "E´k‚Î|Îÿùÿ‡{ÝOmýVfÚŽÑÑR%ÀGç,%«´²Ò¦d 1…‹'…‹l-Sh ¡â K!+Ñ·€ðâYb1³J˜:„E?cÁþ¡¯Êá¯Ê²|NÅ—5'ýàëmß¾«®ºjYìÍÖgQÚEL…‚‡#­Õ¹ì¢­<³g7·nŸ"˜&¥[AYHŒLq(´LÑ&ÈV@zC^”””Ä«Tæ8¡¯!¢|5A‚÷%^xœ8›Ój ì´©g á ò|çz(Ò’F‘d‘ÀUz9N¶(ò6­ÈÛ¨‹yÒf@g5‡FÕ#…‰CGèJçp½y^±¹É»Þý\xÁih-qeghC ¸³­ýWáÓ_½æ†“hå°zå™’(Ê`”QSL„8V¨R'ô¥ªÓ$H†F‡ILt¦…©tL½ ȰÀÊ\îsG,rè# ŹÑ(Å,+˜J¤@—Þ3;;[Ñ%¾{ăcI€¼˜Ý‚ûî»mÛ¶–W ªGš¨¤OZœ·³y?óŽ Ðæ^æn~’}û'I”$õó8ÑÁvsD-AÕë RE%E¡DJG(»x[!FƒGU 8x,Nh‚·Å,óí)Ò4Á‹+:,ZÇn›JjUƒâ¬Ä–¥ÝbßÌ,º± LÞQÓ÷˜Ï»X!ÑBUE8È ÞG­pH¡)ò.Ý|–z¢ÆâŠíÁ–æI2E@S䣄6tƒEöÚÌMLQ´PË$YR#IšHc ¡$ !#E׺=3 ‡ó³œwƱüä[/âìsNF˜¨ä!¥^ê.h D<¹”àé{øÓ¿ý$s !¬¡Ñ¨3ÒL¡DêÅ÷Ua®!61Xxº/¢ „R|€Zæ9nM %%…Ó˜Š^úC_¹2-»Oª“*Tt|EAF‚ ±}íJ´’”6ðÀ÷vÓÉ{½" ÝrË-/‰à€‰“~ð×=÷ÜsXœÎâƒy±`HO¥>XV®^ÍÛú§°yŽ&„˜›Ï¹ÿ»Oð•/ßÁwÜAÇoÆ4št]‰& D”–²t‘j+T%Bî)Êk $ •„PÙ§ù^•·'8/°A"8ë¶Àwív‡Nk“(ÒZTk"IOà0”Ú ‚"xA€ÞkVÖ¹òÊKxë›.`õÊ:ÎçovÞW©PˆbÏ>,Â,9‡P‚ÿíG¹ûþGi®9OÍ&RqûïQ* *SPj)r–È¿O¢D(Y9ÚdÝÆ£„•¹fð Áñ¬]«ÐW8éϸB…(RÁY”É80_pÏýßå©{8ù¸-Q­_¾þõ¯¿$‚ãyOÒÿ­‹{æ™gسçÐBýÐ,ú.Þæx&WÀCåPH¢spÀ‹ÈÒ\|Þ©l=zœÏ}îf®¿óIææ†É8i2Œ`œ¢MBè|QA',AÄ¡¢s–àKŒ)#žK¸œàzHáðBá¼Aûku?ÊÝ¢Ç\»‡–Ñ'<­Téwh!«´BDÁ¶VTJ.<çXÞþŽK9ã•[¾ˆª…Ò  9ÏP Ý¥¢(HÓ”;¿y×~þFšã›éºŒu«VÑHbÊd¤ˆ¼PBTÈ\õóØØ ¥*þz´TóE“N8žñ#¸ÒV êq%Å!Ðôe÷Aˆ,MïbcÀ G $6ÏÚ¤<¶û_ýöƒ<½{/›Ö¯¢ÞHhwfh·ÛÜ}÷Ý/‰àxQ9éÝ}÷݃:$<ß‹ö‡RD‘èø<n'Ú=ûJœÅ•9ë6®ágîml<î›üÓîã©ÝSdë0IXÔc÷IYôð¡ÄyÑE@i‰ÑB7ò.B‰ @È€@ƒÈpd±`vž²×¥—wÐ@­–‘e¥£,‘’Ñ!+So{ØV‹­G¯á]o½ŒË.y%µ¡[FàŸ6)¤ 0RÈ­©Áý¨Dêz½ýñÏ0Ý1diƒZÚD©@%ZªJB=^CIâæý´'ž(BD<\^U'”%££†“߀, âm‡y«µ…¥œ‘%u}IR‡u) ÎK¶ßÿ87Ýú-vMµX»j%cõ QvqÞs×]w¤lrä‚ã9Orq÷ÜsÏ “µ@mqêÕMÈ dí£û”'NÆ}šiDšŠTQÙ°Þlò¦Ë/fËÆõ\÷¹oð­Å›µèd"´Ô£l¦ ”"DQº ê<±{ä@zG) ‚R¤¨AˆžRIònrêµa’,‹îXÁð((…$Ï- Wrå%¯å'ßy1[NXk‘²ŒÜÆ!fˆ¸´~ãgáAqkRJJkIÒ”[nÿ:_¿ãAÒ¡M¸B°f|©r‚)4Á!‚ÇT˜µ@l¡ËÊÂWf«J+’D“š‘KŽ9êhŽß´ë ”2ƒÁnÿ³:Ø·<ô›+‹Ç,²ªÑn.Õu&ær¾öûøÚ·¤Õ˪S’ Í&‰ÍqF/©?ŽtpNZÒ†åôS7ÓLj”E0bpbü¹ N¢ìQÀEñxUËx Šíœà†îäþ{ŸÀª”FC“….kGVe‚ÂzL¦õÇK!8 /ÆâBؾ¤ƒµ\‘wpúåûÔÏA÷¤¯`Ø7ŸgPØ÷™Xaðï%¥-X½z=?ñŽ7qÔøÝÜpóv¾³w¦1άKp2ÝEWaBÄC9çÁ(¤JñNSâã&U)B§H£>`Ë!R&¨T#´CŠ&*Hò¹iV7 ÞúŽ‹yë[ÎgÃæq¼Ïq^ eVÁ>ÚžU›*¾gÑ·ý‰…uEåÃÛI’qïÃrÛ·%k®#Q‰"(‹ôåUF O½7¹W …¾©R6£$ÞEánëæ9æÄ-¼òÇE5|mUŠÅA„§ÁgÔ€ö?cü V)Ë€QÐ-߸ë¾xó7Ù¿­k¤DÙfÕºQ6®Hju¾óûhµZ/™àX6@^4§±‡ž!„Ïzrü!¨ÄÙ‘#÷¾fè¾¼ˆ–Ò”Š‚ÖԚ׿ñ|Ž=öh>}͸é¾nbxt åœ#ˆ BZ`Ëè¦+U†9©O‘Ô@J%é…:J7©Q‰T‡è›˜Ö õf“D$Øž×áìÓ×ñÓï:Ÿó^sÆH ÛEP2­F "ÅWZõ>,õ9Y8I‰µ‰((KÅ×¾~'{§-éÚaŒJ0F!C¨ÌOYVJìÚÄ®”¨pqib ”ÔÅëÎ} Í,Á9Ú$ƒ³›ƒ8èƒÏ­_^„G³Ž$IÙ3Õá 7ÞÊ-·?HÏÆTÒù.C£¦X¿n5C#CÔÓ”[¾qËK*8 qÛ aÀ?ðl:®k)-šTò6ñÏøÓøBlEŠåÀG¯C,à8ö¤ üâ{ßΦ¿Í§¯ßήÉY?™tþ$EQŠH‚´=D1,»XaQ¦F=KI†°QÎ A½Ñ Ëȶ,s¼óÍçrõU³f¼wgC[¦ò+‰Mß'¼riêKî è !jviÓdf¶Í×o½—¬Fˆ&5£I´@R¢”© !¾òdãˆæ§bÐLW2TòF‚2osñùçrú‰[(Š£ Õ}àc?£¾ËpXø0ª“\H‰óTþ,š{|„Ï^?¾›Ü9t"( ‹ –ìñ½q5µL‘(M’¥üù_üóK*8–È"r…¸®ZZ<8¯íƒ}nÀb¦ÚÒН¦Àƒ]Û¡>²c‡‚HUXïZ5Î;ßu!'nãÿ»ö¾ùø.´%j¤©Fbq½i mÖoH9ýÔ3hÔRxè ¾÷ý8§ðõÕØ<'‘.Z´r¤²¼æ¬ãùùw¯~Õ H¶©/ -â à£Ý@á0øø{vï™â/þúZÛ“Œ­AéZ „(PÂEq† ûÍñÊiV,¨ÑW'—¬&ã:Q”EΦ£ÖqÉù¯!•¢²Q ¡Û‹Ê_°—[Àýµ(m‰Ñ syÉM_½…›nº…ÉiHR%EoŠDFëuÎ<íN;ãxj©@+OšjV­þ]”zü%ƒùAkB܃s ›ýà4«¾r•µÖ’¦éMØxý ¶^•‡};HB•¦ø€Ò!DP?d%¾´8m8ãÂsøÏ›Žá‹Ÿþ:ÿôÕ‡Ù?§p®C¢JŽÝ8Æë_s—¿á™{Ez IDAT,N9ùXRmØñý}Ütý-|þ¦orßtNéJœ/Ȭã•ÇžÆO¾ã5\ùÆ­¬^µŸ;¼ÈTÇaŸ£jËÊtÇUïiP^ÄMì®´¨ÄD¶$ÑrÚù.5=Ä'®¹™}ôzVl<§4F§H¡Õ!‰V˯ÚàýVoß§\Šxri­ðÞÓ¬×yó•—³aÍÎu1&¡ ]¾2@]2ZÔ]ó|°­Ù±wÿøÙøæ]âÅ8&+è®Ö²juÆE¯=…ãŽÙB’(˜mqâñ?Ö÷½ä‚^dNú¡×¸{ ùà4kñŸÆ¬µÌÏÏ“fY”úôQŒ ?…J!º BQBYåüš„¨·ëI±Ö³aÓz~þß_Íñ'×oº•ý“{8ùä­œáÙœzúÉ4š |È ArüÉ[9jófÎ8ç4¾pÃí<üàã$f%^p.—_~[·ŽC¥|¢ú<°à"26nº>}Uà‚ÄpB`¤$IòN—™Ö CuÃÞÝO!’”£Ž9}SÈf™¦¨R`j%A9$Þ ¬²èJNˆXƒ¨ @8¼Œp©Ô¸¢ä’ó^ÉY§ƒs!6‚@‡ƒœ‚ŸKÀÚ¨c,•$ÏK²Äà1Ü~ÿ£\ûéxüñgЦŽ=ÊÜ£\ßæ¤ãÖsѯ`íê!”(iøÚW¿Î{ÞóëÑ~IÇ󞤿P‹bBì6.™‡,'¯T,$»Ý.ùyÍ&RI|q:ëlì¢èu; ^¯£µÄWvlÀÙ»‘ ä°H!Ñ:öøM=ãõ—¿†ó^}2íN‡‘±!t½†u%ÖÕ,FbË‚¤–rÁ…¯á§ËÔD‹zm„UëÆAZв‹VRËAûS@E\Rß® I„`ôå CTE4B1;5Á·ÜÉ7o¿…SN>«®º‚Ù™ 𣫠!Pod …Í1²”Ò<¡’I™Z £ÛUÄo õ¬†íµ8ÿµgrÕ ”¨œ…c½ÑÀzï´ÚL=¢)Ê‚,­1Ýιákwð¹›þ™ölAZ!ïå˜T`»shQrΫNãÂs_Åè†P¢µáüßÿ“¿ù›<¯½õCÎI_úuýõ÷²mÛ†çTÝë·7›Í&ív›v»ÍP³‰”QõBVC¨éÉ)fg¦R±z|e $)¤àÞ¹2’rÐfvý>%¥ èÑaVŽ c.jÁj‹~ÈÊVÚOst”¡Ñq PØ.Â{ôb誘"ž J"EšyP"Êå(¶Ûfrr/_¹ù+üÑŸü¯=÷lš#¯bÇÎ]ìÚ}€•¥`ËÖ(æœ&Id"úØE•Oc•=Å`”PÆK†ÑÆ0y{†sÎ>‰w¿ë2êuµ1HCD8D>4½Jm2¾·s7×|ök|óÛ÷#µAêŒN·‹V0ßcÕ°ãÂמͧA"RæÛ]~åWÿ7¾õ­»^rùr×Ó?èÅý÷ÿ¾mÛ¶-+X|(d:~HCCCLOO155ÁÊ•+«×3ìÞµ›¼ˆ>z"DÎGsx¥t,6½Åú(Õ)¤DkUaÜðAD„.v¾UçKÅ–eèó)t%<¡b*ã,AbjøÊ8Gë0àµô;TôS*çªö³ÀȨ¶Òiw˜Ü¿‡‰};™›™ Ë ïù•÷PÏ2„ìxúiž|rwoßÎ+Ϲ€4Mh·f¨lÀh”ýÀ¨$ða€ìÉE6Jj#éµ§8å¤M¼óê72Ö¬U~'É•ÞW*‹‚£ÿ98'ýN$Üþíûù‡k¿À“OOS«S9"D&gÑk±éèu\ùú³8zÃ8FC¢ ÷n¿—ÿð~•‰‰É—Ep/iÖ3Þpáùœ}ÖV’4G"q~õ?¾/ùæ—Üðy&ÂAPÌÄâvìØÁ† – ÄkÍUáy nðtÜùÔ<üðCH)1:ŇÀÊ•+B)ÅÈÈ#+F‚¥3T ¹à"ψ:]iB/@í+ XÔ  x%L¥Žó…xäèøt®æ„ ”Wͤ¨Ì>} è´hÍN3==M¯Û­üG$Þ«êDòøýؽŒ>%ûì!ذ~CÅ©wزÀõù·×qÇCÐë^*Û e±ÎÐXŒ$Zau@ËŒšiÒš`Õê1Þñ–×qå…g’eYIöí­©ìâ„©Ð 1KTA@è¡´¤pŠ/}ãn>ý¹¯r`÷.ŒÂyƒ %G™OpÜQ+xã—sâ–£peN=5<òèc¼÷—…Ý»w¿,ƒã䵸{ï½—õëסË@X) Ö"•äè-Ç‘ÍOEQ¼lƒcI€ü wÏ=÷ð¦7½ésÇÅ)ÖBšUu|@*]Õ%žuGm&«7رãiJçPIÂèŠ1†GG#P¯*¢Cå錋|’ªAPùPë@••! <ÄRº2ú¥‡@kn–¢×¡14„LkýsK\èôèÌÏ3ßnSôº1…R ‘ÆÔÏy±^B ³Ø›oÏÓB)ÉŽOcwü‰V*f)õáaÍaÊ¢äœs_ÅÕWœÇõ7}••Çœ‡/5Â÷È»Ž¢È©g+G%Çt,—\pœs†‰âwÆziÁ¡eŸWœt|ÔǒɉüÂ/ü?þøEpô±á½¸uëÖ±cÇŽøt=ÈøàS¤¯äúóˆ>%5ÄôI E«Ý¢ÓéШ7©7j§"D™šŠWsmÅú$ bÑî+þH¨œ’D¨XŒ¾ /zH¥H“„²,)­Åvzh­IÒ„²(ã@³´cJ" ±ÃU§ A.‚|D*náišP”%»ví"MS6lÜHZ« (µÃÃÃh£QœÂËØ3Z!p´Z3JG%zi™ÄÏË•Ø#¥!`bG/øÔ‹¸&9JÖØ±†k®¹™oÜöíØqòññTPâBœÓO?–«Þø:Ö­E9E½^ã¦/ßÀ¯¿ÿ7h·Û?4Áñ¼äÅXœs;qnõÀ|å`"Π±Ö:„%TäLTÐ_µ„gff˜œœ`ll”+VVýü¾¸Z‚ŽF0*BÀôý°pç“çÖ+Dºi¬Y,‰ëåƒáaß'£°Ž= qH<Þ œ‹uT-«!”¤×íaê eYðàƒ1>¾Š·n¥×Ë*A A½^§–Õ@\éÚDÀõe±(1*€jCÖyŒeˆ" "ŠFDÈI€ß„ÜXlÏ’ƒS’í<Æß|ì:yì²z²““ @Xz¡Ñ7œûj.¼ð54ë'1u>ðû¿Ï?üÃ'Žüf~9sÒ¾žR÷aí¥E$†Ô;NÏ-2„ŠOû>BW--£££ø`Ù½{yÑcÍê5U·JV5Œ¨è¬ü[Jkc—SÄMìú³˜j çÊ@ÅÄ×}ˆ"k!Iñ¼8)ñ&!„ª(c-%eŠs+R+ʲ$w¶g©Õk¸²ÇSO~Ÿ‘á&[6mÂå©I&£–e$IRÁÔÒTj ÷™.õŒc{FÆ¢!±U+[Š>­%´º–¾t ×þÓMLÎÌѬ§t]aÖ+zómÖ¯npååpÖi'"•Ƙ„ÉÉI~åWþwî»ï¾ÊàxÎIú‹¹¸î&IÞÄüü|%u_?Lº'Òiš`mI«­Èšf…¯ŠìBï=c£+I’„ö³ÿ~Ö®]WÑocâ«)ñÖ7œ¬°_}º«Q‘CŠŠ«@ƒsï]•æÅß¼ÇEäÍKƒÜ J£”¨èÐéufvv–½ûv3>¾† 6F¥¥1IŠ2Ù’–wj@Nbä{\ÁMúÝûäÝEü¤Ô.ÎE‚ƘŒ§vàã×}Ž;nÝN4ªV§“÷¢¢{­I^qÊ1¼åqÔ†Uxï©×Üyç¼ï}ïcjjê‡68ž5Åz±Â6àó”eI§Ó‰æ3Yvеû)VÄÀ:gÞµZ ­ ý23êH9tõ´Þµó)¤Ò¬_¿­ οDT…´_0€Yôû¨Ò®¢(¦>Üb±/Ÿâu|5¯‰z·}ñêç"úí))i Ñš›cç®]¬Ý°–f¾=O½ÞˆO+“¢u²lË{¹ï—Žê›°àsÞÿ¼·8Z×Ù~ßc|øãÿ‹ï>ö8µtEÑCiA^tÁ\tÞ«xë/f4SxWPkŽò'ú§üùŸÿùKn3¿×[6@~‹ a!ìBJI§Ó!ÏsšÍæ€$µtÊÞߤñÿ-Ë2Â=”ª‚ga‡„à‘RamÁýûèå9kÖ¬¡ÑhÆ4­z*{kŽ~À„ ¹Ú‡ºôz=ŒŠmQkÝ -êª×û\òES+ÅRn‹µ–^‘£ald„ÝÏ<Ãôô4›·ladd„^YШ70ÚT2£†Åœ‹Å–Ê‹ÑË11ûðtA…a`QЈ.m¬—ºEà‹7ÝÊÿúÇ/°jš¤žâʪ‘ óÝYÖŒ4xã¯çìWBª¢r~Ù+øÕ_ûÜvÛm?ÁQ%©üî‘Xœí굋ÐZŒã•Rc £bIüsaÓÄÍ¢§T*ªÍ$¦, fgfPZ“$Iœ€³X‹ý"*¯¨*õ•@ë\¬W*¢“6:â¤$/ŠÈqÐ&fZJ!¤¤Ûé"”ddtŒ}ûö395ɦ͛ÃzGbÒÊATð{1\by‘©¨²0ïYx ¬s$ưkÿù‘âºÏ~™¹Â“¤ ®(ZYeÞâÄã7ñÛ.ãœ3ŽC©‚Ä(vïÝÏÏüìÏñï|çG&89AŽÄâ¼ÿ¬ý[¤”´Ûm¼÷ /‚[WÝZĽ~*ÿB_Ç)nöÄZ­SÓSÔëMÆÇWÄ¡^ÕÉ¡ý).T”ÝÓ5çû®®½Á/Ò™Ž@éˆÝ*­­Ú¸oBÅb¾×Ëiðôާh͵9ñ„­¤iŠž¬Ñ@)S­Wæ; yR8¬žñÁfƒ@ð´èm,{„(°Î£¤AHÍí÷>Êß}ìùÞS¤µ&eÿä|9 9¯>ët®¼âõ¬kbmN’¥\{íuüÞï}€¢(~¤‚cI€ÉŽå-oáSŸúZëA,8ß”F }ª­è – e©YO·ÛejbcÖ¬[ƒ³e|Ò*ÎEݨêv8çpÖ¡“”¢,Éó|Á|”ìŸ4ªâ_aK‹úÊ V¯óÄ÷cnv–OØJ³9DÁ9”@>•?Zx‡ãÊ,æi¨ WúÓñ ‘ÊQ–=’¤A§c¹îó_擟¿Öl—$iTÅ¿EKA{n–á†fÛå¯ã¼WŸIšTuŸTüîïüŸþô§_›ùŸÞR¿#¸¸‹/¾˜Ï|æ3ÔëuZ­B†††é×áô`ûºY!„Ãöú±²(9PÉê¯Z³ ¥$Η ¶mTø­¨ó®ª Ýn£õ€/.¥ŒP•J!T ©¢ÿß#öY¾vëíˆT¢u¼[P¯¥t‹yÊùiŽÛ²ž«¯ÚÆI'ƒ·ê©æé§wóž_z/O<ñÄlpÀ2hÞ#¹¸³Ï>›ë¯¿ž‘‘¦¦¦0Æ0:::x}9/îå~ÿB"—X¿Éjóíß·^ožµë×ÅöqY¢•®¹]UTêíÕµæççôS£T´B“kmåo-¤”$iÊC>HÑërê+Î$I’j ˜õ)óÑ¡wôò¡÷éPEüÙ¬VÆàˆðzç-Zz)_¹å>ò±ÏðÈ“ÏÐj¢UÀ“xò^‹Òv9÷Ì“xÛ¶ËYµj%Þ ÕSn¼ñf~ý׃ùùùéàxÞòƒ\ÜÉ'ŸÌ7ÞÈêÕ«™™™¡^¯Ól6sÃ;ªü}_5DÈXÛLOMÐjͲråJšCC”e10²ì×1"DõDßçyW¬2¯l£µˆ×9kÑÆ`mÉß¹ŸÆð0'|je?çž¾”§¤bÏæ1¾6m¹`é7  µaßlë>{#ŸýüW˜kç4‡‡év[Fiºí9 É%½†Ë.~-ÍšÁº€–’?øƒ?âŸøÄËr3¿×{Î9‹Û¼y3O>ùez½ÌÍÍ‘eCCC‡0Ÿ-ý88õŠ‹`D¥%­¹Y&'Ðaåøª¸yé×Ê‚,ÞEþõý{xâ‰'X»v-›6mÂ[;h 8ëP‰¢Óéðø£2<:Æ1ǃ-ò8øSi½¯Ä#ü6ì!'ÃáÜcËíPMÇû‚ ¥ ‰G{œ?ùø—¸ë®È’zd‘»Y²TÊ@¯ÛaÃøo»ú N?õX‚í¡afzŽ_þå_áþƒºT?ÊÁñœ'È‘\\káFz½˜ŸŸ'Ë2Ʋ'Çá:<‡¿~¤lÝn}{w“hÅšu‘BÇ¢AP¥4û÷pÿ½÷²zÝZµíö ÚÄŠñUaõsí6OíØÉб16nÜ\á¶@*3èÂõ%AŸ-°®1ú_,žç}Ô·Ê¥@øå-Z7¸åÛð?þòïÙûÌNjiïEÕŒz?ËÉ'žÀÛÞ|%G­_ƒ³9zÛ+÷½ï}LOOÿ88ºÞa䥰¸F á‹t:gÐëõ¨×ëdY¶DH`ñSw¹ŽÏr)W¨„° kyfçNºy›Ž¢^¯}¢Ïìzš§Ÿ|Šu7²iË1gÙ¹óIöîy†Uã«©5›tÚ-ºyÎêµëY5¾:¢`+æà¤ÿðuųr¿[µX‚'ð§,{dIƒ¿r'òWŸ`6££àœÆà]O#K.¾àÞxùe4RCpÃÍý»ñÁþáÀäÇÁñÀ¦cÆxëU—rÖ©¯@+Ep–¼×á×~í}ÜvÛí?4›ùŸÞá¤ÿK¯‚!„O07w½^‘‘²,[’*=×[¼ÉwÄâ»VR öí}šý{¨×S´j²zõzjµ:¶ì!eT&ñÞWêçƒþ ¬ÍÄ@r'T> ‚ð¬M…g;Aú§ï?áEDøÆé»â _º•þÅÇè9C–¦¸¼‹Ô‚¼×!”]N;ùÞ~õ¥l:j-²$<ú½‡yï{ßË3Ï<óãàxŽë- —ò› Aò‘üoûÛ)Š‚‘‘jµÚa㹺ZKƒ'NΣ Â‚Véïí’àŠíÕ¾IOÄ}•eV ¥û ‡bPoô‹þà°Ÿ€ø…¹Hð•xE¨`*Š›oùø§M§°=͵t:]ŒÉ¹øüÓÙvùM‡p¥§±¢ÎG?ú1þàƒô‘ϳgß,õFŠ/zQHan–“O8–«ßx'œpB€&5ž|úi~é—~iÙ©øƒã9äåøfÿøÿ˜¹¹9>ð077‡÷~Ð~6…”å!§ˆv¨<#íVˆ>‰IVYr¹YEå µpíCA–Ïë½WÎYŠ€ôeEš2|쓟áîû¿K:Zãª7\ÊEçžI¢¢©æèhÂù/¿Éµ×^û#³™_Œë=§hÃKýÍz%SS¦Û…±±1jµÚ2fáYë‘eV¹`n3€sôµ­’Eæ¢bQ ýë¾ ´¬”Pœí ¥fÇžyþÓû»ö@%†ù™½l=~3oË6¶·‰`»4k)‘9.»ì=<ðÀ?ŽãõôËÿÍ^ÏŠ?ÅÌÌÇ™››ÌIž-Õz®GwŸ§O ßÿiÕ¡ªcƒ™Ä¿åka=Ëá±B¬|êÚÏóäŽý˜DQÌÍpùy¯àª+/clåJÊ¢G}¸ÉèŠ[8fË܋ǿízú‡áÍ q+££ocfæS´Û1(úéֲĢçq‚Ä×Ý€È$^}®R$êò‰Ù·TŽàF) Û|¯ývBÞc¨‘rÙåçsɅ璥ϊ•£Œÿ Íæÿû#»™_Œëé–7+ĽŒŽ¾™VëŸhµÂ’“dyÀÏ •CŸ€ª x?°5Cˆ(.÷H_¹eÀšŒjnX_¢ðtäK_¾…=»wpêÖ“Øö¦×qúéGã¬B˜Œ±‘yV­úY’äŽÇ |=ýÃôf…x”¡¡ËáZZ­c#«¯V;ìSûÿoï|BäÈê8þy¯ª»ª«úßtg&1b °9¬Q‚zÈAXV#‚sPY "AaE¼ï݃ æ „Œ‡(ÂâE„DÝ$(aטÕÅ™íô8™IæÿŸ®ª÷ž‡zUÓ“™Þq2äõmèá3U?~¿y¿÷Þï÷ûŽ^EÄž¹\¥&¢4_&–ßÿ‡«ce„m56™Á«FÜýë[\ÿýøôg>Á>÷'&»dIJGLL¼M§ó ž7ï‚ãxòY{Y!æ9}úóܹs‡µµ5666L­†W”Ç;ôvS¬âh×>ãÐ(cÇü”ýÊÕèï¿8Qª{–ó«vƒ£x†L%H) ¶¸}ó6ŸüØÇùÚW¿ÌT7—†F£Ã‰?§Ûý’ ŽCäEOúaðâ8æÊ•+œ={–F£AÇ{‚cTYÊ^/ωÑ6Å’Z§ˆ| 'BJŒ…²e^·S܈ÏÆaÍÇ3IDATv¿0V´ÆŽè±òä£l5°Æ÷fçÞá/·ïrê#/ ý„ ô‰bÍñÉW ‚ß:g>dÞØô¤¯Z­rùòeÎ;G½^§^¯ï“[8¨,Å^îˆ)nÇJgãç‰x… Bþ{vÕÈŒË Ÿ]‘ŒÈ¥„Ìû<”JË®Çù~Ÿ÷zsT¼*qØDHMkb–É©‹x޻ΙŸÏ3fï\¬gée•R\»vÓ§O3==RŠ0 ÷ˆS>^¼wE±¥(ö–B^­8+BÄÐrlÄþýN¡F…4…­"6vI0&oÐR*cvnŽû÷ûHéÇu‚Z•ãú î7rÉ9óâùÏúËj­¹xñ"kkk\¸p¡œ–R|wPíV1Ù½(c§Ø¤ß•§Fv6p~©(Ë£ÙýÏ7\ÿ•oÊV¹¨6h2›² ¶¶7™åÑ£¢ZL£Ñ$ 5“S? ^uÎü„ycÙ“~X¼Áà;<|ø=Â0¤Õj¨I²[å;dä«ÂÎóU éùiµ?ìsh²Ü“°‚h Åj‘ÏË•Vzye™¾û/v¶w˜˜èØàè39ù ¾Ç9óðƶ'ý°xiúM––~H¥Ðn·ñ}¿L·ß0N&ÿO/­~ašÚ©Ø’t‰º| 2ÄŠ ¬E4tÚ¥u‚Ñ¿R!$ôz=,.ÙÉõ ÂZD»ý;:ï"ĺsæ#âuOúañ”ú ¯áû!N§ìõÞ;oKÛû ÊéíE-–É2|ÏGˆ ZRÓù –Ô¶¡ÐîÇóÓÛ"]ËO«ŒÑ¤'ÙXßdn®ÇúÚ&µ°F‡Ô¢ ÝÎkDÑOn/qÎüäycß“~X<­_faáGx^\Éã)Q)¿ ƒÑ •¤x2º¤[ÌîOöÈ×X œ«J’„¥¥%Þ›»O–jõ6a­F-~ıcߦZ½áœy xOEOúañ”ú,½ÞO‚€F£QÖo³;)>wxƒAÙUE“©\û£êöïäå”ɆtЭ”²PvÆV>KJÁ I˜›gqqß÷h4šA@½þÇŽ} ){ΙDŽ'Ÿgãùþœ?žååeVWWÙÚÚ*|‡7êÚìê‡+Õ`ÏûØKE[·%†ú¤ ZçýîXù¶GË«üýî=†5&&:Äq©©39ùEcÆ+WçÙxgΜaff†v»M£Ñ Ùl–©VÎÓHi(D=Ó4c{{@P ¨Eq9·JJQÊNÛv«2eçþÂâƒî÷ïçbAq›f³IlÑí^"ÞpÎ<† @œñÏñFˆ3žã9Þ‘b9ã9žãíçIg<Çs¼Ñ<éŒçxŽ7š'ñÏñFó¤3žã9ÞhžtÆs<Çs=éŽçxÿO:ã9žã}@€8ã9žã`ázÒÏñF~þrêߨ*aûIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/save.png0000644000175000017500000000703412412506713020124 0ustar sergiosergio‰PNG  IHDR€€Ã>aËtEXtSoftwareAdobe ImageReadyqÉe< ¾IDATxÚì]KŒG½Õýæ}æcì±­6‰Q"¡DÄAá'A>;› ëðYÉ,‘À˜ÏžHÙ²·¬Ì $Ñ"b9É$YqÄX ‰ño<¿OWQÝ]Uýºú[Ý=]=ã{¥7wÞÌë~Ý·n{î­OÆ <¼BÐÐÐ è(è(è(è(è(è(è(è(è(è(è(èÉ ³ß<¹0¾Êßs‚¿;Žþß!ò“1¥ËS^ ô`0ôÂB/vÇq´ïmÖòö¥t}Ž%î?ý|áç(¥ö¼Y Çã |´t€¿V3.$þ £¾Í¿Àõ¹~åéµüû`í:ÀÙ‹—Nru;@ð^9€ëÆ TÐbOþ÷½@÷û}á ±†—š4Ýò gjXy}úyf³Ð&“IÐø7––òHyO?›Œßæêô™?¿Ö øùÚÛïû=¸²6àp:BO:‚è¹Ä‰€ÖŸþ×¥@/-/z8 ª×ë¥:ÂN5¼ÞpÔóBADêõ'®K|n&ŽŸŒÇÞÚÚ‚Û‡ŽÂ­ƒGÒ\{¯d: Ï7~èí{w_þñמ9ß”ôªŽ;&¿ø €}£AzMôÜøû댪þÔÑ£0Z¥ž‡è1¤. Èv~‰½gZó¬»P×Gr&ðþö6¬¯¯sG¢pdè“«£,ì½½7Á•[ÛÊ©øî§koÁOž?~¾‰PÙ\7ìé½ÁÞ[£žïj¡?«¥Â¿;!|è÷ÝÇ»’K(Å%šrÙód2­iåý¨ë’ ÿ Ï'Þ»üžzÜ6„ß§OÒNI—Ò†¸0Xr¡§BÀ@bŽÿãÜÙ×ß‚³/Öw‚ê o”ÿrùÃMè/†ë‰XNTvrcæ ¹Ôƒõëë0-¦r¢z‡b¿ŒÙR+‡Ÿ“߯‡¦(ˆ0 CÀ6G€ zðÁ6ïÌ ;Fù÷kZ]/;wæOWàg'ž=oÅTƒˆX­H ðð² ¥Ì ¹‚ײ‡±š±®ìu¨Ø-b¯'Þ+ýP •Ì^å Òaiì>ÔÑ%™( %íáŠë%Ðç~tñòµ_|ý¹µÖ@çFº.$’léº%ö¯®C'šÖ qýZÃêçc\û3µO‘¹öÓðã­;€ ‚ÂUYÅžš•ëéØNËTôx Ù>kŸúýÈ%¯s4Yë¦ß×òUÅÎi…à^¼ýgμþÎóü×µ–€•* ”îyªpâµÚó¥ÈïýÏÁGaZ•Κh( ¨á”¥jÓKÒ¡¿ €Qs _*àÝ•ÕF€,»[Ëâä„TL©å]‡yªFø1z‹ŠD^¬ÀDʨ¦;“š²OÅ`mø´í4pnâ‡ù€K ‰úß2ìHh+  ,]“º•@aHb±hŠª$…èN=ZéÜYÙ­VyßX¨64›¥¯Øi×A« €Ÿ9Èã='fÅ hÖ AM¥žžåPiÀÆOµP–¨0zM¥q{[#ÐT!¨#ƒAÊ ŒU˜¶9¼¦ÝŸt¬¦ƒ˜õÁ M“ª3‚´9xÐ2Ð¥`B€8Þuâ±z.Ëhb0H/Áwn0È´áä,\©]¡–­ÎiT R1ŸjÓÌÕýÉáà=2Du]1 HÔZæÉ‚M¦N“s“c ‚ì•ÐXÀ“ 2ähšP)©ðÝ$­°”$·lO 7Ä c>´äT´;7À™+ìÍ öÓU²ù¿Äu'¹MXf{¦HãiIݱ€ˆˆÉ•̵‚‹ï]Ö ;i˜\ ²P-Í¿—Sƒ›@Ûi eé•)SÀPIm€’/}ñ9XYY‰¥…ù@`ssÞ¼t9Õ±£B ѱáJ ½ÑÀ¦8€˜KçÍÄ:x­gµ½@$ÌRV%§p…ùÏëcjš»¸/_þg¯N «ÊæGËæß«Õà-;À_ßx#×Ðú*eýúôÊâ¼vüßã`™4T œMÅ*ãIì<}¯!hÖ1 —i³â¬!n‡8ÈCþ}ºAÀ40~žý‡ÞÜP=ßцSËß_`ç Üÿõ½£‹sƒA½Ãî¡BPCi ûÄ0Ùø·ZW/ §@Ûj¦­Í¢ê6ŒÊä†ý%<òØ^šÒLX8þŒßÿЭ›"íÒöÜQû䓲] MeÖ~˜v\4::W×è¡ÿÕo6’Ù0íºì…€††ƒƒÜûÔ÷a|å0y÷ 8[wcyv´ÙTNù­É†¯Ù0ª$ %äèg`ðì p~²öPp (³ì q)ýã'‚×^•¦JÛÝ ªYB©z©½ù餄àÞí íÊ`PS!e—…¦ÕÊ«¡Ttë Ct.ÐR’öÐ;@†Ýí!E°Š˜<œY€ý…!únU$ðËKÛðÔhs)¶(—;žÿÜîÃß¶FH e0 rxøÖê=øø€ÁþýÔîš»¬noÃÛ·àñÁ~{säìüÕ¡4ŒÓÀöÝÿÈ‘£j“e”p›Ù¥¥%€ëëðÂÊ}øýÅÖÒÀÊ ð‚ém¯‡ÂÓ‹S8tè06~Šø6ñmãÛÈ·UiÛ²z< öŒ ²ð‡7€ÇŸo‡O*Kß67n|ØêïÓ~Ç A†`@(ôûØó‹Ä·Ñ€x™ãür€xÚ_4û¼Y±'«];»8” @øg†ð_&¸2(D€Ä­öêe³lx3'èxȪ’"èÂÖ-^ién›Ìä%ŸtšcÃA@Ö0ogƒT 膺ëBJÃ! +i ¥aí¡\㦶†TÚ¶œ!0µkáÿmÏ N‚€!l„ä“eèZ!(Ë€!( 9ÓÎ-•K¤&ù¥`„‚ÍÏ {Kº¸0äX 4âe9@g*´ˆ.1 Å «+ƒ6B³9t¥×òÂH>ra(™ Ò‚`aHÖ%Rr&J.d> ¬3ûjš<ÈͽPò{?ËÍï»òàȬç×@РY€õçfNÍ!X .™æìXÞ¹§†A¹,@B6¿™}39@wV•ƒx¬TvC!ˆš†LM\ t!ÈÚ`‚€áÖ¦< èÝipôA ’?‘C@¹ø_4íÏh+ 0„v æµ€6ìÙØƒ#¡°aM¢ky°œÐ’›3‘0â¬à2½WŒjZÆ"§³PJ’À"òm9TšŽ•Àr» DõiàEÀpN QP¶Àº2¤ï`ˆ!  t}0Hí‡/¯@²Q'¯ˆû”i}Ð}Ã]°áÍB@Y`½Ú*U‚[Ä4’ f¦÷´kÃÁekÓ¸:Ø0 ìz ‹ÐBùøtˆ?åk>²….ܶ¨¾’^’sÅ£uµg[@­Ã—ØÂ'Žãñ[¹€\çÍèÎ.aòâÙ¸„¸qDpäÓ¿£+úÞ;žL°•sÓkÖ´ÇÑ+¨÷B{3ñ©`‹Î ƒ€A„„g$!ïÝìãÞûþqŸ»Ù͆@’ŽîÉ|s¿{÷î½çüÎïwÎýnÈXÆ2–±Œe,cd+ÜãôÕêoÐ@Þ—þ/‚_¥Î%Âf0²óHÏÛöG„êÞb°ƒ¯Xå{„€-Có ²ãþê`>k-ÔX§ò<ÀËæT, qÅ×áoý~ÀýL]üX§ú ñÐâªå4wò18dpÌ\‰1R¨[}þÀÄe ׈ñÅ7"fD@ô- |¥o²!xká°áË>¥Ë-Â×»Pœ7vÐjЀP±Z¹àãÇ”ú–U=©¡àHã.„µà 6#u€2ÿ ?÷æÓ}3£ˆÄןC3¢ƒÞ‚û€µÊ3 ^1·ânT•-Ak×yœj­†!u€ù› @ÙZä‚ê´`é¼_¡lœm?ŠóÇ!Y‚íà™ð7 €òÇQ(‚ê{~_`ÊÃw<)&Žœ„“ÍÐ>öüIHk†AcÃe â׫IêÛòó Ç>ºh­R4t4Ž5}Ž`¬ leÞðnÉ Èj°bUßïÏ€T@S>yZÛ;à”¯T+ˆ÷G²|áo”¼¬a8Ú´áX‡4Ø¢¿9¤5Œ‘ãðð¢'œólld³öíï1,91C—6n{Q0d € |¥²TÖ]{Õ$±ôÇk„Á:Ž4|͈v È ÞpÀèˆ6# Ë/t/Pî¾ô\ƒÙ’‘”Èòå ÇŸ?( Š•ê3 üòG?¨Âü©¡=Ò„“-‡ Ùp ã´€$ε×tÅ™CBJ CvÿÜÜ™J‹§,³Ö"K ª¯‚hÑ=·<„i¥U8ÛQ‹³íÇ<¢dK›6ê’´:€Ã0ëI(¸s;ó°[[8ǸO½¤ÏÌX¢X§úžOõ•-ÿ˜(U†ãöãB¨.¡(±[žÈtÝ,z²( H ¤Ëoñ”Î\&ì÷­ö €ék¥†Ô·æå ½rÙ‚5ʈacpøÜ§F[ADžä³ù”K`V|3Ûv6¥yž€–² jj¯C0Ú AŠ…:@LÍ’¥Œ]ÍàMI˜´èh6!¨5#ª‡q€!È”Ì6oÓˆ!@RC؈!$;À’A¬ Ë—‹á¹£ÝæE˜’î„3;ùߣ+”¶3õ'æžk?ÎF_OªðãdËAè2Uñ›Yìôz"Ì¢FfUëíh‰Ôãlð(š#g1Úa°d²dDˆ]í$l-Ä$KhFÙþ!(R‚½ÕŸ6žùŒ¿ºlEpçÓÚ³ÓV)gNžªÝðvèe^åOÔï]9;Ž¿‰S-‡à÷e!ËŸƒ€?Šf@ `pG É.³8 “-B¸Å2Žml²Ê¤¾™yÁ&,ÎÀ–ÜìNãYI[)!¬äéZCo_ÅŠÏž6ÞuÐŒÆ Í›þó’®i:æ”>€+rGA“„´´†Ï¢%\–HZÃõèŒ5#f„Üà…ÙI!…Üì[C(R(þ\{Kdv²ŽÙs›5^ +6%Ý ÇÞ@ÖybÏ Ú¡¶“úŒ`gç‘;¢7¶ÔaÖÄÅ[pE[7˦óñÅÜ’=÷ŒÄs„¨û'xaIE$e’ãsº{€} ¾Ú„†ÓÿÕo‹E´íï´‰«OìÁÔ’…¸þ;•N6\âƒßwAVÖE²Ì{·Ÿy;ðnȸà{Aô"xò²€¨ûá/èÄBò/;voÇŽý[pMq9ÊÆTAªÇI/( #È|"ý]F$ /xÀHá;]ª/D¡äžçß…ÛðÄÁÃûŒ-ŸüS^9¤ÓKî_Ívôê×Z„bÕ› Ú{ÙAš;×±¼rÚmò@)|¿(’}9î¢ûÖéÚëùÁ'j#›¶¾dd)Ã0kÜ ¤.\Þì*nðnK´õo>L¹™F¨q .º¨ú´Jy‘C¯;®¾U¹‡oh|qãû/_qçÜûÔÊ1‹±çÜf´ë n…[¼­ðêürøF9Kh–€d¬-Këi0á©Ð{< rSù|YC·’IòYí6ãë®6Ü[RѾîwÖ_pÛÝjŘû°¿i #5ñÙó¶6 !GŠSgŽC€ôÜMÚ/;¤µÜ±ˆìÙgl´BÊSÉ|K›ÕtEP±†w®¤:>lòJ©Ï*̸yöÍ4ù»•¨é؉šöV»ƒÛó-&ÌGW›†×^{Â=-ëˆâ?“Ý’¡&ÌûòeýKëAÈ;øb˜yNÒyP·æmõíú³¾ü¦eÊŠím´­­gO½òWà`ëV0qBsißáÀ«úü`‚Öõ¼ÃH²M7—iØ›¶r‚œÄ±dŽê_¬3ž 6àÉ}_|!ßþpƒ,ô—`Jñ½ˆìø¶&ÈBÀÊ €@O2³Ù“‰IâKiƒÜC 2‰cöмª¿ÙxŒ—ÔÔÖ†^g½¡Ê\Lq?rÕB·¢&>É è@7Œ4#•oÞqY0ÒÐ1ÑiýØ»Æîº]¸«áìùúõ¯ÿMïìèÀ”¢Ÿ¢À?ƪêñÿ&´$ $‚¡§ÄHüÅ,†¸‡Œ§rÄ àô'zͱ­Æ¡Ž®ý/½¶^žª¯ÅM…wadÖµVc‡¤¤Æ`_Cë…$Œ‰¹´÷½l+œBw{ºš¾pBþ«¨”Æ9zøÚ@®‚É%s  ÂGÙˆ… ª®FóQù§p ")‚êIvÉ$€Ë z蜧xê!hõ»å#&‰èéú•šì¤ñ3)GŠÖÎfT®FK­|®ë½ÌnªÑëWC}ýi–L¡ÏDÚ&±Ïÿª?nå‡wíÙ­mþ`ƒ¡éºã²âOù=½—’¸¨÷b .Í8¡=r’vÉÉ*óù}üÕð âãÎhË‚ã'ù EMm ‚ òuÝ$Hód²èÓ/,úãçY‰+1‘ðB/naõýŸû&æ —o (c%Kj8¨¨Ý†`/¤Å—ËÙËm2¡%jb^ xçû×kÕíŒiRÊ]4RI8'QóGEýeU+(_å¿ËXÆ2–±Œe,cdÿòp;†”G{IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/pushpin.png0000644000175000017500000000400212412506713020644 0ustar sergiosergio‰PNG  IHDR@@ªiqÞ pHYs  šœ´IDATxÚí˜kŒ\e€Ÿ÷;—9sÙîβ»î¶P0hHE#Ä"—†;rQ$$*ÄÀMDB ‰!E &JŒ ?¼ Á° E)á&Z B•Jo»ÝÝv·3Ý˹|L$hHÁì.ž'39¿æ›÷}Îyßó~ääääääääääü_"‹)Xï'/5E'SðŽ“@ Нæ”'/¢ä­ØÈÈêæ‡VÀ¡«W±£ßýÌô…ËÃÈ'ðž§À¬Ã9Å#ü:ÅÝiGWÏ~¨\ýðõG¬Õ/=üJ-Y^,…ô„>¡ïáûâ N ƃT92çÕ¸ÛfGî{佬­zò+ï¹°4Ò;ô£‚ç/ÇXúœ¢ßÔ(0D‘)3*eF)1ì ô«`UuÏЮ‹/x/ëû ]Àhið‹â«ó2£Á@Õ… H‰Š*Rö‹DAˆxB&†ŽK™s /^ÒÐé£ã3>zïý‹ZÀnÛ8;‘´ã(9Ÿ!¯J-¬Rz¨D%”¯ÐXš¶MC7™Îf‰üfÿŒîÜyðÎ/³cÙïî_´vÚzegkRG9Œ6Ô‚^FKƒ Vèz °8š´™Öuªñ Q¼ßSýS¦yWmë…³3‡®~lQ Ø*©×â¤Fã%†zÒ&’ÁÒ#ÑÔ(RDZ´éó§)•#<§p‡ñLŸ1öš™¿žü$+þœ,:™rë7¹éË Å¶5“a‡í Ž>‚~ú FŠ6BБ&ÉRâ,¥é’3Ê«2XóÎõü[OÚ‹ŸŽ,HZ)›ëãüc÷6RRB (Q¤B™*½ôQ¥?¨Òç÷P•½ª@¯Sg,ŽØxÖ0¡*¢Dð¤ÃánwkNº- åv)zÃæ}uÛ¾ž¾h •¡2!!†Æáð)P  !‘ )Ù•º VÀÐC§•Zž½¨STçm?‡'EDˆyã ëŽ~ú„i1U„ aìxvfüm-sI“•–a‘ýeТMê°…Í ­$+pE$ü2v JÀÊ5§]ëåÒËtj±&ÃB%¿ü‰vt¡Ÿd˜Àâ|(”BŽ, BbyzzŒ±ø6íÙ‰ÍÒÚ(2kšÌÆM:iL3i3Þ®Óî¤SïL~AèSå«Äq™XÐY‚u–T,àøô\™hŸc«j1-œ0©2ñcN:†ã’<9±ß¿Â†}Û-õ±¬r¡`Å1•Ôy#žáõ¤ {â]ïÚbæ3ùóîûêç{üòO=Q‘r€³h m4Ÿ²U–Ìl“ãÆyª»u7M<ó±þå|´g}MËØì4›â:¯µv³½µ‡W›“ü½U§Þ‰qõd3õô›¬ÙÕX8OÀ-}¼ï)'Õ¢ p”QV;ñzY®xÉmg,HqJA÷ƒX«x¼µ“;¦8*¤·1W˜›aŸË˜ñâ®,tô¤ö ¾ñÂÖÕ9çK¥ :½™´ºñV¤ÀXŽð–ÓÈæØâuÀëfî!„N°Öa´…ÄÒHZ¬+ï|Áó½Q¸a[l*YhÈ̤ö;\½ñ¹ÿǼ ˜Q³we3Äi‚'ž‚à‰0cëld'„"%§pÎÑÖ›hfૌZt£™l?kï\pG‰ ÄáÉóhy”«76þ[ó&`¯ŸöºÖø×Á„àpŒ%{y=ê@‰¢" Ï Ma2ÆÁá=eÿk¬|úAஉc^ø÷œè5•«j:(kp€Ãa dXЊã½#¥[:“L˜Ifp±–†%a·nR{9}„Ï<²ë@b™—QX_ò”Ѿlj…B[9ÚXZX:b‰Å¢q'ô¬à‚ÃVq|épŠ©`:: ª›|#m‡Éì©|3櫜â!§¸ÜE Úö7m‘nÛ°1/Mn&îÄl©og¢9‡3î­C¼Žî6»@§z”<Ș+ùKÅ8HMwüG(ˆ‰ÇËñ$ëã]ÌÙ¬ûþóT×’ëŽ`M·Ûî€Ï6ço7xîw~% øEQTħ _„¢ö÷wK‘îÕ±†ÌŒ/>Â/°¬Ö¡b¸Ú˱åaÊâЇ/ê­|ßõ·û'ÃØlf6{jq 8kÝ^H®ñ-»7ûMúû—pÊAGò‘ íl·'¸· ·. p®u×ñ•g÷hóº¸yÙ·Î<Æ^Úˆúƒ¿Ñ°ÄqµDö¦sÔ]†}[îoŽÆµ¹ŠËŸûÍûùÿypÃu7•‹?_’öT+“áã[Ç^ܨ§Ý›ÍøVj^tFÓjºÏÃ~™ÝжWòõçû¾{ñ|%ÿýko<¬T*߆ÁH³Ó|”Mæ’‰s×^TÆ?K:÷À3ÉÔîg˜b¬¡ ª[󩦕ýŠ}é%\¹þ¦ Í×~ûúbíÞ(ŠÎi·[ëæšs—þðÖßœäJ:N#Yê¬; c{Ñv”̽Lj6påúW?ÈXæe¨ Ô<ß?¶Ýnoi4ß½åÇ?ø·1¶}ÊZ€1àîùîQÿ3n¿ù'Ÿ¼áº›†?´ æäääääääääääääääääää,Dþ }¤j…ä шIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/overview.png0000644000175000017500000014343312412506713021040 0ustar sergiosergio‰PNG  IHDRôxÔú pHYs  šœ IDATxÚì½yð-éYß÷}Þ>çü¶{ïÌÝf»3ÒŒd ‰E!d!–€€p°D€B! ¦bg!q±hpa˜T’?XLœØ8I•IRå8®€¡Xb¤€ 4£+¤¹÷7˽¿å,Ýïûä·—·ûô~úüNwßç3uç×ûvúœçyŸAAAAAAAAAAAa<Aè?ŸxËxÿÓŸawÙæ˜ùk¾ü2”ÊÛ…¡è¤rÖy º €3Ë Œyþoý¿x÷Ç?s¬å© ¸@%…ókßv9gó2a (å9G`ò# š­ø2€ â¼£¸Z»à&‡9û츱~~À.'•óMf‡á¾ëß{¢£ÜãisŒÕêðý_Ñï€Ôïѯþö™¼Q‚0>D ÿ›_ý$ˆ¾ ÌßijD`Ò ò„o‘°ˆ@V`2¢’oV¯å\‰=gz!§®ÇYÅÙkMR´ÏÚcÉ/€ùè£ ú ü+€~ÓÉgèŸý†Xaˆ þ†w|<ïoC©§s_,„sbfUå·‚³Ë ¥‚´ðGÍ–GÇ¥‚åùæÿâå€5>(Z_¶×1Ÿ§'Àb _LE÷v„O°Ö¥>B¿òÛ§ò& Â0@$üõ_õNxÞÉä*ˆBZ2/¼ªB¸rþqK,œÁKëûÄ‹)ç[JëÇZ[î\+¹;óúWžržƒ€k7€Õ¸ýŽK+÷‚0ƒÀVo ‰0!ºàçÏßö–?=üÍùyKaˆ ‹éìÛpåá Ù 8ºd}ׯ$ÛpÃc2§Môé•ΟÐ@Ù]!L9“ávñ(<Ï¢@9™Ñæ¡•¢H'ð¼ò˜ƒ¼óF“‘k@0—.7oÓ©µ|üÿÃÞÄCàðˆÃ'@`Løì|0&Šnø†?¨€ÇÈ[*ƒ@a0ð×¾í=ð¼oÄ£[_õtjßr™I‡ãP°ùÒÉ Í¢ ¯âká©|›u'¬·Mà`xMT¶/Pm1¨ë <`2ö€Ï{xø*ð‰Ï°4ÆS†q xd‚À0ˆðW_þò7ÿÌC¿ý»•·Uú(Âp`ýíøœÏ›à­_jç— ë·Î 7æz/÷á¾Ì۸܀üœ™Æ‡]ÓfòžI±aÃ{{Àë^¼õË€?ý8ö•©Öñ¡Â)œ(¨Ë 6Àûäe„þ# €0¸‚×¾á‹ñoö÷ùy±P++¢SxΟÞòM­_oÙ½¬o•U¥$†ë&¡a: Ûg°\Z%àÑÇqxçNt;î_t€fÿÆsoýÂë¯þ>ú¢¼µ‚ÐoD†Áw¾÷2ž|êÓi( CŸ9…>î*Aä›à™¨ûÈõÏç(¹fg;R9qñÊ$;!·ppɺp÷’w£œës–ZÛtÀ»w€Õ |àåW€@Ã0Ã7I …Š@’xÎy„/ðËòÒ B¿@÷ï}5®ã±ÇÇÎÏ€—^²ë’‚>¹20/XÏ î+•Ÿœ;¹vŒZûÔ8VÕºÂë,!wû›D™ àå—åS¥0Ußph Iî "`JŠ4ãë € ôQ„aðÐÕ[x曞vxhGƧ§6`Ï Ú‹ŠÔ¥„ž#á9³Œ*„x™RÐFˆ7V2Po]+%ÁÙȘ¤H‘ «®–ÀÙ) SE˜‘‚]xfÀ‡@oR³Aè-¢Ã`1ÿB›{f”µ©äŸxNÐ7¥×M§¬ 9ÊC\Š¸Ä OT~Þ¬› °™OÎ=D¶ø2ƒJÜ ³™ ¨\.³°ùß½ûvZÙø€©"è q8O"9 þ &q‚Ð{D†Ñ ø~XðgìíGG¶‚Ýt–Þ6ħT~¤¼»]Qü@¤\äeäí¿@Èéò¿y†EA‡u—×:fr¹@<ÏfU¾u¯¬| pÿž]@`°áT"÷/@L¬Ø<@Aè1¢½ç{{7@ÊŽüìÈÿüÜŽXg3¬ ³ŸËÖ•l»¶oÙ:$V÷¸e±‰Ù”ŬR‘'È+á‹2îc7€a¸ZÙ¡4S@9$»–<‚ÇÀ›üKy{¡¿(yBßyý›?熯ۆ5:¬—?±£V•ÏŒöÂ?sò5ÁÙ ¬ï6ú µ’ÿ\½ƒÖɳ`¶î€ÀO¦DðŠR Ý~ö(_$o® ô±ýÇhPX-?°J)kˆÓCÚ ˜+q¬ €ÝùÌè½l>Ú¾h”_åfÈR´íÚqJj!DÛE)€ó…]vzœ[% t¨PЈ¹¨2˜Ìüùòâ B¿@è?7?Âtzm¬ÏŸ˜LlÉÚý}+¸\² ú Gý9ù™7Žü/±äž§Â7Ÿw®Ô|]+Ʀ۱U²|?©®xr8½–Y6ˆÂþ:#ü³({Ú}yq¡ßˆ ôŸéô{{ûÐÚŽT•¼0`¶ç´åE}¡ºé49 „Ûio-ý0³?Q:6 ²&äõjéîÏ]YUÝPÄYÆ$ÈåÖ+šUz6Œ=×Ó¿û?÷ú›?ò‡(=Eb„6ïY.mtzX“J•7ØP®´¿œâ´á±·î骪$FÊs"üµNuYTD˜’ª{Ê}"ìÉ»+ýE¡ÿÌfv”¿˜[% Rˆl@m(õg3hÃ]‹„;U.^۟ʦklXAöù.æÀ|žQìöŠ’D(Ô²àßÍ|K^^Aè/âúÏtfÛÔjmc"Àól,@$•b³ºkbç²uNqv'W>ÏÐtºÉþk.ƒ÷{Ïkd\T0ÍÆúÿÏNmñŸÓÛp)ÖÜ ¨ŽPšùQyy¡¿ˆ ôŸÃ#àÒ%+°–K¤X¥`2µ)ñH•Ó¾ÿ²é<Ï´^N¸®?¾Š"ß­é&×Òâ‚]ÿ„+üC«ƒGTËlî%Õ€¡Çˆ @À[ª¬ lñŸ8êŸÖ[ÿ¶†;:Îq cÿ¢@@6©ç¡@ ¢:G€›òò B@è?çga[\¶Âß÷ ¥Tà&Î}êè8U§ ‚é×Wë’ëœm€1I ’yç|DÉsÉ?»É%yy¡¿ˆ @À[™ùµõS/vZ9ÕMz¤Z{ºVÚ_ÍÁFëž³j»Ô> ·3a}…ÅÂZXNOí_•(£ˆÏe €•á'åå„þ" €Ð¦Â¥K„ÅÜ ©ÕÊÆLßµ®ïûOM7Ü6þ³¢ÐvÛZûUm[ Dõÿ?,¦º‘S_©€È>#/¯ ôù‚ ýçääûûsLgašÚb}ÄÏNZ,ðêLǨ1a£°ÚýsMÝKø\Œ±~ÿŒ-ß½?Ö ‚P€X„þ³˜ŸC©f³°C]Ø8*O§¶¬Ç– zny<Þì:6½†µC8]% ¥Pqýçxm­ }D,Bÿùد[i2Zá´˜'©€¤¶¯lDAmÿ²õyU ×Ìø9®פïþC&://jϘ0–B'~ÿTÁ¡t!À'ÿB/‚ûO?pÙ‚0,Ä ôžòIÿ䙡Ô0a™ÚÕ€I›®£ü÷†ç³ ƒŒ ŽÌÚöè¿‹t¿‹(Ô" 0o—L«eùÑ„q ßea8œZIäyN :gº61«oJ£ÿ‹ôkû9AFý‚ð`! €0 ·Uݳµ>௒l€l €QŒþ/"€ÈfVˆü„ Q„áprr+&ÌpûdŒ¥ÓÒ²ØO­ÑÿEáABa8ÌçÇÎ1™XÁïû™4@×p‘msNSHËÂ?¼m÷@…U¢FL ‚ÐkD†CœÃóÉhŸœ€Îu]Fà*Vt-*-ŸŠ¡ßˆ ‡ÉäÌ ìí[@–¬°RUlCè8à/w[Þd½ž‚ý„Ñ" €0~é ø>0`ë`§$ð…X6q-T¢÷@Þ%×T Šª) ‚0JDÃ7þÊo€ù³©d«Uº%0©Ðö\u¤M,(ŸnrNÔ9vÁUדw¢ÂØ@ ÿ+` ƒ9f{¶°v„QàMLü¨1Ý™âвfk÷@Ý‚0VD†ÃðݸïÛŠ€‘`ËÆðÆg«žîâ@µô–£ÿ&îA(D†…Ö*UµÎd Úày—Ó(ŸÞV l[–àJtA5¢Âù.&[¹Î³¢T@å9Û!úb.²þt£lË-]ù/¢Ãbµ<…瞌N(ïiÛ£×£ÿ®²¢U¤Ä5 ¢ÃÂðí8âåÄÄÕ¹žpîn7½ËÑöXžÊßFôA-¢Âù~aç:ªó:ïxÄÏMåÇh;úÏîFT~~AF‡(°ðýcÓ™ý:l„0 ÀQ6NûCÁò ñ_Äèí"üáAAaXœœŒ±u7 Oø7dMÞ¶åL·ñ»Ó[ý»Ë:ÒÂOB ¡Çˆ ¢;ÐÚ–ö}À_%-×èC `þþ](Kìîcb0ᮼ°‚Ð_D†Åý{ç0&éz›i½À…±M—£ÿí<:“Vú‹(°˜ÏaÌ9”²E€´q,y%³ôtÄßH¸×9FÅŽ\–2Y|ÑbÓ„ñ €0,V«s a`& €­Öþïjz¹»¤Sî¤ ÃFaXL&ç0féÌ · ¬˜eM°×`벋.¶£7øoâÙàÊÒ a,ˆ ‹_þ_«•VÆØQ¼9!i ì² ?jL_”K5”‚:£é ¢ƒâÙÿíWO õ1¼I˜²Æ6`-Ý®Žß€ÎFù¤V ÷ªý8'÷ÄÖ/cGaPü`àûsë§6Àjec¢ ÀºíúРֈ[þþ:"D„1" €04ApŒÉÙ ­íš\@Ÿ«6Ý’¿?5½½Z‚ ôQ„ááy¶0[ ÈÄmìÂrÀÜ@ȰÀ¿­ŽøÛºó\¤$° <ˆ ß?‹Óþ|ß*‘Pkâ»î[kàÖ#þ:Ç(|‚ < ˆ ÓSŽclO i°íèþ­Mç­æfÓ¹Ô tæó2)A¢ÃCëÛ6õ¬ðâ(Ò}íwjú/šn꨺Þ&.’sx^2MÍ/C„á! €0<Œ¾ÃVèû«Ðõžsc ¸ÈZÈî[µéŒøSÓ%ˆ:••K®@ôAè7¢Ãcµ:†ÑvÔa FlY°7ÖmÿÐðœ•)ض[‘­YTAè3¢Ããô”b„ýŒ {($Á®`›•K]"´áAAaˆÜ$~kF€œf@ì4P°jÓ¦V†Â\Ÿ.‹ Ø¢5@„þ1‘G Ž“ûçÛ ˜}ÛȘt [LLÿ]äÿ§n©Ë?j–5alˆ@‹Å1´>‡§¬ÿ_§  ³€ÆÿB³ÿ6QòØP)`Øø ¥ £Ax0@«Õ9˜@X(ð­ #·@ ¿ÿš@Ü ðzvà •´@F(ÂßZu,à©°P€TîZQ5À.…J¦·í¨:å·u °á¿à?ð–ªMëV¨×Uæh¦À1Sc»%37QFî8¯±­ð‡þw"zþAxGDÉæþJ+ßfD¥ãZºáhÿ`žÊ´Η ‚G@ïáK|3Lk8zë ÒË .á¨Åe?Õ“Çw›™?@D¿4ö÷Db„AòFƒ9i¤5RÑœÍÖígWv52oÌ”ÆPë«ú…9Õïô«^-VS¬äÃjÁ“~Ž™ÿCf~hÌ7* €0d¬UÔÚÆVw´¿±ß²"ÑÔÄ_+!¦ÿqÀ+~ÕjåÿÜ|>¿ Œ5ò\ZpÀßð‹ÌüðXoRa¸¬Vgñèß÷Ãf@°²_Q½4·Vûà@Åt!ûœºèÀgQ(.ÿ|õ/ó§—+;ô·J€<— øk~a¬–Q„ᢛà¯ìh€ÍWSX«tW{´ÌôXz @@jƒmà"1§ú«|ßßÊ_1 ­µ| ›óÿ 3ñØnLa¸hsÚ„E€ÂLp¦má¿e>LPcÔ.%zúuÐúýËåòŠÑ |]bØ”oð0ó¿5¦›@.Apß %ÀpI»Åh#!_B'2œ»›ÎS Jn…Dú÷øÉ ÞæAüÑi­ÁÌ0¶Yü¦\ð÷˜ù¯Žå†D†‹Žãò¿¾ŸžöܾpS3{–ÁÅ8Š@<ÄI?xÁ_½X.o0'C}Ã6Fk‘þr 6&`¢Ã…ènÜ ²ØÎ0µKSöFz®ò³04˜Í7›Œ gc µ†1FÜÝ2š ù¦ Ãe1_BkÄn€¨)P¶ P.ü¹El=6 CÊ QcC‚~rµòÿ²6:õ^1€ R´¤nÁgˆ fÿð×-²0áÚÊÏ¿v²ûl(äyGÓ"ð‡ý5˜›w,—ËÆØ^n;,£µ-•¡µÔ}݃Î@.Ap ­ÏmC ߯D € ­­Ó·!ð±…Á|Š€{¿D¢ ?ðo“ïç7Æ€ÙÀ»,Ò‹ 6C@a¸°9óll HøG½ëw!ü×®íÕU[âJEÉsó&(,,?½dµZ}‰)x18º|IÒöd†€|Ÿ…árvz­ÐÚ6 ULÅnÉÔ¿¶{ŸcªwÀÐÐ'úñ•ï¥ÖA²0î†mpppìËsº ®Áº¾y(, €0\£mî„ §ÍØuÓ×ÖÕþ<‚ذM›,j¡,ôß_]ÒZæé¤D Wu/›>rÀßâ`Ù¢ƒåÅ_û¿O`̱5ÿ‡Í€‚ÀÊ­l%@`s៥KÏ;œ–^@ƒEký¥Ï;L/%03._ÓÿŽx <¼o* €0Xþ00fcÂf@N!dR»þ*ðqÁ€ºQ¤bð0ŸÏoicÖ>@ÏópxãHÐîø ¯ø‰¾_¤(Â`yÀ0æØ–ÿe`µ²–€HøG®€]ÿBšÓ–^#{ҼΎL5‡€Ó ©cyK·Ëloï ³3p°/Žÿó4¦è}@ (ÂÐ9Ž3´Nê亲ó[þ] ö­Ä  AÌ`ëA<“T ß:¾ïß0 888”‡³{Þƒž[ÁD†Ögq1 À·Õ™ ´- mœë?`@®¸¡w|úŸ¾øþçpæýñ&Lö%ï¿¼Ž™¯öùE† ûëø‰¹?ò>+å([ª°6²b0`öþÛ¦ É•+WŽ@t”þ„³é˜Éóéø²>_ (“öœ[ IDAT°a¾mÍÿa  ‰~ë4êÂ=€†ûô(ú?¾I"A\øÀ]fõ^ON? _ßç @6†ïƒµAØùíl;þ›X ¶é·/#gG‘ýC倔 <Ï gŸQo@6lŽãÀq @ÅNC ÿNSÿºŠ(Ø] ÿ ŽédúHVØ{Þ‡òpúÃc}¾8Q„¡s7lwúû9q¨ðõ.Ö[þ…ñÝÂà8ŸŸ_g“|v`âyRú·_<ùéOÜîmAQ„a£õ†gÄ)Q™B@@B ôG௠v‚(¥~Ï0Zßp?+¥Bó¿||}‚Ž.™¾^œ(ÂÐÑ6 °…€´¶J@\¨ÂP¶®sáß'ïL»†OÒÇ%)€ R ž|~}ãˆzë“@6ÆØóX ðƒú‚»lÝÆÂõ…ÿEywz­M2…IÉOÂP`à–;Ø·ùüzÆ¡§To2ò¶‡Ï,`LVÊ]ÙùÎ…ÿ¶³*|øMûPô¼$`(L&“G8Œc!&žOR{‡ê±R- €0l´>›EÒØ$.”4Ú…ðï²|o–Î A|É=Çó¼£XÉ%‚R 4‘Ÿô¾Ñg•ZÞaèPý؄Q2q@ýÈÿ²um…ÿFËnIÌ{Q¥K¥”iJ@ïP$AØ ÷î½rŽéP*é=þ;ˆ‚€ƒ™=mÌ ¾'D"ˆ oQmi¢ƒæ3¿÷ÇÌóØ  µ-”òk£ðç\Ìh?{üÔ¨_$ÿîùGlÌõè]SD "qÛô3"5ïëʼn š7Z)w ­m ¿ k81„ÿ¶¶ÛÁh™i.›FÁöBñ&@PÑG»„¾1¿roÑ׋‘0|ǬàgØÆ@áŠôv¸ú,ü‘™®#ð×bDêÓ³³#6| øI)(%ÃÿÞ¡~ÐÛ/•¨ŒÂàS€“f@«Ù‘jáÀ…?º5õgS%äSÓy;üD,ÊĶ˜N& ²ùåDPÙ¬¡/?þÚ'zë €0|·¡ÃŽ€¾ŸôˆÚv!à;þö› ùZ™k϶5Z€­±Z­&`Ž{^R ôí·éNŸ/O,¾e&nø‰ €È¦:ßÆÍ…?÷Løwä6à‚¿B/!¥n‚è€Ã÷œb+€Ð+¼ØçË €0|§ñˆß8õ:ñ>»¶)ü×ï·ƒcåeƒyå1lËEeœEèãoÓÝ>_žX„1|Ël`ØZQ ü¢&ü¹áq‹R0Œ1*'ê©ÐËŸ&þhŸ/O,¸ clþÜÐmsËIû6>þ.üÿ›–åÝHy¨™ 20©ëq€Ôè-Ìáधˆ Œá[v°õýkvD¹Ñe#ý­šöËÖu¹OÓ4@þéoD&Š2DèÆÓëqcà.˜Ï’J€:l„|¿hvÏuÖm $\”ðo"ðSÓŽù?»‘•^hM•Æzï+¡ÜY.—·û|b†3Á°²:Z˜µ@§Áu·k*ü‘™ÎÙŸP0™¤ë'½„€[ÉL(ýe8×/ NæóùYŸ/Q^aø0ΰ@utÜpùHt™é:®aH(å=âöPJ\½Ãàc7^uó¼Ï—(aø0Ï,` „.í´^ß>zmþ¢üÿu·«[ý¯…µ@ môÑÚ§$ @Ï>¤~×Ä Œ€“ùù ˜¡Û (€ì/bUŸŽýÿµ…z—¦þ–û;—"ôcÌœVÀ"ý{øùº×5Q„0·~[ P›ÐvŒüÙíè:Ï?þ³©©¿†" ôfžÑͰе”îíç„^×DFÀË+߀yiÛsÒ€übî á2EƳ‰ ÙùìzwfË#ý²u»þkk}»µa±F £ÍÝBD7‰è ìœ4¾úƒæÞ§ Œ‡Ó8À_…i€@Ó Øo4¿‰’P^ Ê8ƒÁîð&i´q  ü’÷‹¤bƃM¹‰ÌÿqG@¶9'ÂKæ[Y Úø²u%ü›—–çîð}ÿQ"E€u[ù4ú†aîu Q„±p&l¼Z% @®o´Ç.€øÏ„Í¡½ˆ›Ýþu÷ÓB€½Ã0óóC¸P1 ã€ù ÀèŒ ^MlÙPQÚ×ùÓ:íØŽðW*¿w‚‹›3LoÙŸnqô’;‹Å|ym„±pÌg¶ŒÛæ6|Í›Výãëœ?å‚›Ûm—Z‡ŽÌþŽòáy(“ðJ¤ÿÎafb§€(=Ãàþb¹8Â¥Š @ °²€´ Ô&iœbǵœ?[q”­[+ýËÅÇÌA‚ÿv·(yé…¾áãøÆS7QSôFa0Ÿƒy6€„ 8ɓބ|WV€m¸â?$ü¹¨ôŸä•÷¥Ô#bè1„?Ê¥Š@Ìs “d˜¨# EÛ¸;lg¤ïüÙ\À×=FC@öY¤ŒÒ§ïh­bUM"{ø[„AøÿÑ…‘p¾8AÔˆMA%Àè ÚÅHh\ã¿ñèþ¢„yî¿Ð;öâÏPZ÷3Œ€(ÂH˜c«F©€Ì6%­€7èíÈ]×b;.pdQ8/ìfž0óÍ(qCDÿÐî}àQ„QðRË8 Àu¨öôG÷Ùóuù_u ‘0}ÄÿìÇC¥äCê÷1½o! €0 >÷#ÄŽ¡5àû¶-°6I`Jh"ìŽô¹Î:Ôðu]› ÿÌ}n:ê§n#¬³|yyæëQ‘+iÜ3ggg§½o!A€Â˜°¦7f«„ÍR »Ööï7ٶ뿲um"ÿKÖ!o¾ à$äìÏS—\Š\VÀý"Àéñ‹Ç‹¡\®(Âx`N1œ†@°¿–ñlCaïüÙh]ü§‹u+ ”Ù¶ddÚ=¾æýè•¶J€<çþüác¯{Óëχr¹¢câv* P” éì|WÛ^¤ l]Uä?Ò•3»ÈÀ²,—‹ 3ÛO&ÊÏ©?0Ñ8BaL0oÿeSkgdçÛŽô˶íZÀ—­«¹©‚{HCa'ÿ.¸IDÌ,E€úÉ`RQ„qqj…ÕS.w˜´#+@ü§‡Â?~FÕR]œ»C)e’à¡oß ¦ º£0.l ì?WøÅCÖº‘üØp[ÔÏÚE÷—­+Ëù/TdHßw´Ö*R¡ë_\=c0m€#Ä ŒÆÝ80¬Àä5» '¶eˆÿôÅ P¶.s® Ô¾gOøOÄÒÜÕX’Æ’&gÎçˆjª0¼“ßÄá!<ƒßÁö@–/$¢ë‘À·®âèƒi! €0"øà¤ ‡A€D¡;²œnCØ7Ù¶.€ìºèÚ=oëQåß…O~Õ>®~¿‚÷• “HÌ+g SR˜@s€çû¸êìIÇ_ÿÒÀ[ðÁ%AÝehb0Ô]€ÎQê!…Ém†aƒu¢09ÖXÛg@ “4V+(S@¦@Sžh,ñ üü Þ·Äs#òK @Ï0¸~~>ˆ6À¢câ.˜Ï`ô‘m l*JßöDØçnÛáè¾r'þÊ\gŠÍ3Î߇ýv{ÿHaú8%’+Êh»LIrÛ‘]áJ7z*3•™Ïþ¤¼P€Ûûñ°€A 0 ûŽÍ£\!¨c‚gÞ€÷â xo¨€˜X¡ ¨»:7РXáP¡¬B¦/Ô*ÀŒ~îçpù…ÒHDlL4-˜}Bãø‘§DàQ„ñÀ 0+Íp~(¡2`ØV €/[—ãØ’Pù6|ô‚ú)û·s\¯-j{©Ñž”˜;j* îug»ÌƒçÌ<Ìœó(L€Pa- xþ×qòÁ‡~W_λnžŒ®@Ee€ÅЗߟÁ´ŽWGÓ7ðÀ<.kkŒ­Àn©Û‚ེ@ýò¿ÈY×8دE€_íueÖî!L~ÄÃôKj Õë8óÏDBÜù§+þ%Û…Ç €ÉÆ8Ð-…Éûæç¿Ÿ¾š{ì(=R¨o¯Ç üÿ€X„Q}y`pR (2oS¶@=7Ÿoµï.Ý ,[–%ߊß}RA}«Â, ™×ÖB¨÷„Êìwe·1Ì7£ÏŽœÿ =`@m€#Ä Œ†{óÅ ˜­ðœŽ€Èä¸×´TŽì³ómGú(^W)à;ðÿ¯Ùÿ;1î&Ø{LJ×=Ì àIýúB"Ë¿÷»ðÜ×d×j­¯1sœ å–ûÃÚGˆ Œ†s+ìMÜ H‡€TÔ¨F]çO¡b°±@ïÐ4÷ÿGÓÑlêyµƒ€»_ÿ‡Ÿ˜À·à·“oŸà@Fÿ5`0ÞCŸ»ü³ú™ ˜oÆÏXZ÷‰AµŽ@ /°´¾ :] 0;Ê.Ø ·-jŒô¬ã A¡ÿ™ãuB,™f¸ôÓwÙ‘¿Œþ«Å‚ú]߉?y“³ÒÀ©lÑñç%lãìüül0m€#DFÃ|äVŽ |ÀèÜojµpß–°o;Òߦ ë•;*ï›=ì0á_úœ²ÓêÈÀ»³øÀõ(®…HÄÐ N ¦ p„(ÂÈàãØïÏ…&mÇ šhjØDØoe¤ŸÝ¶…ÿK åÿ6>rKaú—¦ð0…˜ÿëbcVæ[¾ŸÚ¥ð_ÉOxOøØ§n¦ p„¼=ÂØ8‡Õý°@ôk ”ó-X:é£Þ: $Àõ\ÿ=L¿sŠÃfnúßE“zF¯ŸãøZ8}„•‹Ò OÃj! €06nƒÃ€è_LÍ"@ñŸE᢬M\e¾Î:ÕÝÏѹ~/~ï)‚ú›ž¤þÕn™y?¢±|&œu¢<Ëž1¸@@a|܇uß.qi©0¯+ܳóM…}×#ýŠuu„?—´ nõÃò)_Á{‡‡½  þkL”å¯<†ùüpáMÒ o ­ p„ÆÆ1˜­é?*8©mYÁéL4.ÖSsߪù®„ýÚ¶ Öe»)Œ}O…Á SþµI‡ÚçÆGáæ¸l“¸zƒfæç†xá¢ゟDc’B@Q÷¼*îb¾L¸×Ü6wß R h-B²5„—ðŠÿ¾gf´÷ù‹ù¿ùósÕ%o gUJ‘6&,$ @O8_./ ñÂEÆÆ“ê°æzØ !Pü§‰p¯¹oî±Ú ô’më'Ž'Ø\¢0öð±—¿áUš°'Á-qUDŮǶ1ÀîaÜóƒ`Pm€#DÆöm´©8&̈eJÞv2êÏÎw%ì³ó[päÎÃn H´Ä\¿öò«1ƒ2Lmù,“ç)7¢eq €<Úüäàù‡xÑ…±}ï‚ùl- Ѝªÿáó(H¬øTDöçm‹‚m+ƒÒm7ùAù$î.ÞŠûË+ð0•à¿VdŸFœÚB€^ ¯ p„X„‘Á†Q ×&°é|W#û’m+÷maàÍÙÑÿ×ã^ú xØOÿñ†±ŽA™À7xž¤øYK6`~r†×8Balœ‹O¾´zŽžŽnûWòBÁ?éÐlVHƒ°ssôe9²N²8‹B:RÒ:R(ÉeÊFd™p•h¹›<²tŽá§·åer~æ*×à*&œ^a‚ 48T.ÿõ¯Þ¿Âõè 2úï g«Õjpm€#DFÅ»?ùók^{׆¿–ÆXÿÜ9í"GýÙù&füû®«…  e`¢9΃wãcþN\y ðÐk€ÃkÀÑÍPè¦ó)k@ìyp‡Ï”Q8´„ËÙ1ê˜UzDeòY è•s.V"KC¬?„ÊFöšò” Žræºtr¬3ï¸=t¢D˜tv„ ǵ@êì3Ø#"më’ÄôƒÓÅb1¸6À¢#„Uü èÄ`×¥þ  ßD1ÈþÑ_W 4.„çñÒò¡Õ#xèiàòÀÁ`vKç4ÙÎÃn„`æãñ¦©¤½ä”s‰”™t6e\+Bʽà*A²8T(¢ËÔÉv€UD¢cêUr}F§-)‹AÆBAà?¨OÁg®#À94EO½eò4€kÉçDÒ ¸|ìÆ«†×8BaŒÜ…Ö¡ùß±?cW¾ÿì|“‘üû û¢ù>e¢úëð'/¼ }>ðø›€½}À›“= ˜9·‘º§üùB#F$´]ëAÎ#r÷‰GñpŒ?ÈTÛ'Ó̼³QVÉ ì2牔\Ë’×ÑU4(\N ÐðÊcÀüæ8„30€ëOL 8Š$°èa¶Ž@#¶,§«j L&›[âÉmú•«r¾‰°ç‰L­ÊžÃ óâÎâ¼îÕÀå뎿>9rî>ožŠ¶É[ÜFòÚ'š^@åAásÈŒä³Ë¢cOœiW™ e‚‡®¿ xåÀê÷¯c‰WÀXÂóøUöB€˜ÿûÃ`SQ„qrÛ†Î×lC XîÒ ïÊ¿–ŠB»,Æ<û/âá7¯pã1à•;Àé+€Yj‚Ì=¯M6:mÞ~UJœõ¹õs(wÓòã9m%Ü›øÀtÏ>³«¯îý>0Å!æ83¶}ÂiÜ ô2 € ô Æ}ûí ë“] ³TÍwjÀf.€¼}JјïÀÝ›¯Ã_ú:àÖkŸ?L(Ý(|gt½&€«Fæ(¾T.ØvM gšAæ6@tS3R=5èv„ê\u­E„˜Ì¬ûàêMàÕo>ûÀÞkޱwÀ_àÒú…»ÄüAöˆ@!| 6öW5ê’}‰ÈÎ_”°/q4€h­¯àðéë¸ù„ !ˆQ¦s•õ/ƒ+V®åás+.Τõiû\Òû¬ÅV:ñÙk[œGW®G¯Nïì0Ût `gˆ`×ÜŸL&ƒ­ˆ 80ÿ훀y'`sèN:Xü@«0Œé.b{º>0˜þà·>yrx0ůÿÖ§ðÝ?ðk›U–Ùˆð'—ÙÚU£ˆ1·!P“žñäE stèÈöyóÄÈu”=e|/Í¿ÁdÞÔš®•@~h ð&‡,ñ7Ñ܃ì·¶˜rö-ý^¼hx¸ØÆ¨‰uŸÌOí9nØhûØ? ^ `í& @~0qÿôìl°5Q„è]æ{;À? ¨·Ø_÷W&T3à1€3» ˜ÌÌàó¿âsŽ2¯yókðï~ÿW.º @|@˜*c  nÛc™p” å(À§ÿþÝ“ 0øÜ/ÿGÅ Æ?¿wï¸Æ|Jþü†@#µTÍsŽD#²Ò¨@ ¥eçMܾ÷y˜&›+e…¾òœŒ’ÛÍ5Æpþ­–ég©m2.…Ú>zª±(“^X¶oöº Å÷GöVÖ{ux ˜< L^9øì‰øT‘A<;þÑÄóWŸ¸*.aàï1ÿØ·ø0€[Èm¸ÿÒFÌËÉ,Ž’mé)g9Ö§ÝcfÇe‘‚8J†r ìïáu_rù€aþ¡%b%ïåâúxîÅC|ßYA©Øâ^‡;Yb(ÜfGV€&½ξ‘ €¨Ø9¾Æ«à<ƒ¸ê2E À$_Èsø'³2•^—÷ Ý~AGe.»ý’½ðü”_¹õ Ø1ÿóúvœ)•]óì0ye†û/“ìH$ ÀÎpàQp˜ìý°ÂV\µ¼Ñ+æ‹–Ç" š‰”Œ£ô6•Œû端L€…N$@Y´û¨¬ØÌûy¥£÷l¹…þ+øìÙ#xT«%°ZÙØðqë àÓnâä¯á(KÕËS,@ö:9ÿöê[œ¿¦àþ =*™m¦{öä'Ç6ÒŸóm?… ‚•ª³„ øñħ†~ ¢<¨ï.ÿØ€Ÿø{‘*…Ò•àßö¾EŠPÀ°vèÈ àÆ¤B½ÝCÔi™Û+ºw¤”I˜9söAHj.yÊ*©B89—™û¸ËFæ%zdVOÈâçõkŠ, ®Á#ÏePùvæ)Ñ9Ãùµ{u/8àÇ|O¸d“£íhߢc„?’—<àX~_Ô· `t‡ó÷:ÇjXˆ0ljÿ:̱6a~ e‹ád£ß³M|ÖFç£ý<Ý$/n“s‹\ON‰¡«ÔåígàŒ‡ õéQíÛ‚@&'Á*÷_‚€1™ê ƱÂùÇ^àøŠ¶Å_Â#mr]ÜIÕZ§´ÂL€P⨼j€› òŠcôÙ °æ¨á%¬Ì((è°œ‹90›ÙGÎÆ>þ¨`Q㾜AÍÜŸz®’Q¼Kéc]{E8çrÍýËî%ÌV5°¼,_‚ÀÌêŠPPj7´áß 3??ô›à‚ùÙ·üa€ÞºìWë›^AWwR±^í–f§|o>/‚®‚…¾‚Íó ÂGùÿ£€ÜºŠ0‘<ãDYVB*ø.kM¨aÇoüVº&ÿ"¤à³'u•‹` 襭 ¨ÏžÛå Ë{è˜xVPJ”€sg±˜ßúMˆð€Àüì_ðßôDsá?ÁAÀø«ÄU¦¡œcmŠбàïÚäŸ'eI¡IdÙ<¸Rd›ØøIë_Ra÷eª_K?÷±sÎè%ñ9û®Ë¹ýÊ‹+ˆúϼyÍkPX´reÍþÆv´§UXÞ#hÍq¾ XvŒÁÉb±t @€ægßàGºÚLøMðGp}ø§6PëL»6äõcKV€ÌP½BÀ0.a̱ `¹{ÌMøç¹âW ˜)3ƒR„`¦®-ÕÄN¯V ¹©€©Cçäû—éu¶‰ï‡PÞÒ nÅ@4/JX€âàÃHQ €^„¾ÿ…]ë9Ú‹$°Ãn! ÀHa~öÀ Ðw×óëŽAðGpuf¿V¨aÀ[?þ(¬èÀ·¼* øs|þ¥Ñø@J-ŠE¯De` #̉JŒâGÝŵ”‹ìu]nh0>ÀAøÏ5Z9ÊXÜ Päÿn¡a·Ž`„0?ûZÀ»ËGýçÔ­ IDAT}úë`,#ßf=™äœnÛ‚~Óc\´• îÇš¡™ÁÐARþ—”#L³yò]¼!e&y“^g ö©•mÀÅq…©…@©PŽ÷-Pô*4ûû¡ð7îee´@úì³Ôbúó³oð÷úŠbá?bÁqm¨0<Ý÷£‡³^ &>ý†©~¹ûl9ð¯k@^,@á'¶ÍˆÚVs`qL§‰?Û_XÅ€r“ã‹ãÔn;û¶)(Q0LQ ¥¢¬Æ@lþ_¼L,Y€$°0xÐ="DÓKi#ýÀ3ù5ý»yõûuœ¼c’µ˜Pàkª'§wk—ujüÒ÷ÁÄ_Ùõ°þgbøœûaíߤxM”ÏøaZ[Ððc/*€S~¶Ýn­Î?å×”ÒjšòÛ¾þÌ¡ `•7úGXнGé¸cîÃn! ÀH`~öÛü$€'»©éޱc•óÀ³ŽƒÀþ‹ÔÚ‡X1ßfŸ]ŽòÌ7TL\”&`&^”~Ú…Â4÷’LzºpTÝÀŒ_Zy(s]”·œJ¬ýX ؉€Fn.!C:öÆý³óa·Ž` ï£Mó ú˜.ÜÓcUÓü0¼Z‡CÓÔ~e9û9Çîè¿S“f>Õ ¨AE@¢X`Fm"¿[©Ž½ñkRÒÔgíøœ¼Ù× 0¯iûᬶ“×^8g66À þãÔGb`|Ëbƒ!€]2‚6À¢ ù=ää4ôéÛhÇ«sLc /“ÍÐ&žN;¶ìb”Ÿºì2@³Ï‹3Ñò&,`¬’ºöÛÿ"´|Mº*s=n³þ¾®þi2A€&­ŒKo$ìï“ÓSXØzøm€#D(Ìz 4ô¹ˆã59®$o7…û¥Šá‚=†ã"ˆmö(¯ÙçX42æê²¿•€&édË»é}•‡îú•ÎZ+Lhþ7y§¶ÿ!l,1;fm€#DâûÇÏö ¡ÏE¯éq ø˜ðPX–ΊC°Ûú:Û\„ O]ú†óÙ†‰|L•»ù¿ÊL_ôQ®ã)¹–^O*YVáa“”QŽÿf¶9¸u”,€ÃÃo! ÀÐÞ=~öí°þþ5ôÙöñÚ;þUàHç¡cÚèõFðë7çô› z G9¨¬Xï#ã:1¨5Gþ­¬M_)ÞÝ?‘5ýßþÍ{} {— <ÏKÅ\»ÁøÃo! À€`þÐ×ôßüÄvsük]MŽÍ¢Ö¿ðÀ}Ntت. O§õ<²ÞZÚìÓRYÈζùÜݹÞv¹çj+ü«º ¶þ½®EçfgÔ_dÌc0ÔÄy%`—Œ¢ p„(ù¿ð˜?øÈ·ÝV-CÅ42Ë;Éx®{‡ìæPù¡ùß0ü•ÆTsE­ÙœûÛŠ Çv¬©[Út¾ÃO°H‰Ø–ð¯!ع‹‘ÉcÜäÜ\ ü9~» ®Ü$x¡ @Zï”Q´Ž`0ÿßàï'3`…Üšö…¿H¨Rê(eŠDÛÐìFOÖØQ¿o‹Òû¾†ñpc¼ ÃZ~X¨àZÚþZÛìhÔŸº½šó›Ö˜gl–î×¢Ë^ÛlëúŠ^™ÜsG¯2ço~ùºüq °FÒ8B€žÃüo^þI3;òW™Ÿ†Ê#”,«cà†ë‹Ö¥šÕµTä­ …ÿ*ùkßÀh†f&d]&ì•‘£ª–ÀÛôØÁ¨¿Í1ÜåíM^Eá.…ëF BÛ`Äm ÿªW6`2uË‹°3Ì8ÚGˆÐc˜ø`òÓ€ºì¸Œ´Õñ[iÿ’2b9Oâi÷/2Û^MŲm*yË4€UØñÏšÁA  3VÚàð’g“Ñý ìTãV¬# qAV€:ÛlÛ%€†…€xJç¿\~›E¯QíHÿŠm€úŸ¹ƒëË;Í‘T&ÛÐýH fûI €XvãÅ1ÝŽ(½fÿ]Àþ[€#غ¶^é›™öiý²EvF“™w§³ë‘Yƨ7b/Z†‚} õ•m·ŸÀ¹-öãûÌ@Ø¿¸< K¬EUULñÀv+‚0êo³Ïæ…€=‡Ãé>Ìš¢Wt+Âß5ÈOY„¸tEY €”Þ-£è! @OaþÁ›ÀôûGÜ€xQeƒ´ ÌÚapÜÚÏIÓ>%U^Ö¦ó” ÷Š”Ž6×HíúC«cÌŒÀ7КÁ à m»êÀº”Jg´ü[ô5÷I=’¶‚­û`¦ÔÇÆe·R²Méå¶þ\_9irî¢×§ìÞ)›ƒãÒC”$°H ÝaðÑ1ÝŽ(½åð룷ÁšÿWöQ®þ× ôËÑרyVB~Jb]Á’'ô³×˜§ôx°V‘90Y`6[âìÜG¦ûù¾1 Ï„×iÊê²,ëDð£r°ö·•û_ðšPK)SâQãR‹^Ÿ­Fúl³6¹%‹ç|UÓª ‚ÈÅǸkt Çt?¢ô–½o^à¬À;0Cy¤~ÊYïÕ<ѯYÙÈ?O`sδ«Pu?E¿¢Wa•€piÿÞÂ8@?4Ga`ß·½œûß™ ¯³MËÀ¿Fû”9íÀùAÁ~¹¾àî“ðO­2Å_cŒƒ#•Ô À®¸oŒEàQzó÷\n~1ð¬ÿ+èöÝ­*¦ë¤÷e·uyÖ_Ò„ZWŽ©T(²ñ îôÀãþ ˜M0*Ìç´f@ÁTaư£ã4"§{ÍúÃ/Ÿo%Äëls‘¾~ÔnÅŸg­1è.Mþûu“PöŠ]OîÇgŠïÁP0¶PÔ PŒ»qÿôìt4)€€(=åÖààȪúEÚ‹º“çúóßæâeMмe¹=f ÎK9÷S5Ä™ÂZDVAºàNqÿþ ¤¬¼_M ‡ŠÃ M¤¼g‰î¬;1ï×Ù¦  ‚¿:Eµ—Ê^¿-ûµJó«yì #£˜.þžî=ÁØ?”F@=àùk·®¢ p„(½Ä{5`®U›ù©b]Ûb<”sœº±yË»T(ë Y!ÎÀ> Ì<( Í€oÿ?;÷õ¸° ¿:Ût8꯳ —}&ÍYû”ëÆ¶ñ÷çmw‘‘þ5Ï_ëØîµ®½ }nÀ±åJ†ÿ;CãÎØnI€^â`Å€ïT¬)Sû‹„}‘‚P¶}“åuŒl[4wYÓcÖâ¸àÓˆ3$<…ý½ ^Y,E=`íèß÷­ >,÷ÈÜ_g› FýñdI ´î6Å0Öã€î„ÍWq§i~5?+]üXÞìï+Pä ÀnÐãJDè)æQ+ü—HF¹Ußú®êö79NS…¡ˆ¶– ¡ìÂl¦¬›Ÿ€8XÙ8ÕQž XK¨£ž`í6v<ê'KöUÝ@ÑœÝê~”-¬¹¼àØ j{þºÇŽ®5[·+µÚ€aœ@bØ!£JDè)¼gG¸s XáV¾«ü šËšÒD¨o[ø»…ȺL<¥0™(,} 5%àˆl'À¨`Óúÿ]ZÖnk£þ²c´w¤Ìÿ¦¸Á *.©èãßF°_éùó®¡KáŸñ—°Fa3 ƒkÞă `Wߌ¦ P„(½ÅGâçV™Ÿ„ìÏDu~È‹‚ Q²,»ož‰¿ê\eËÊ”‚èø¬‚tÀ9€@Ö°¿ça¾Oû*4ýW<‹¶V€N”.}m*ìíqvD“÷gýÕ䊦@e—wÚÖÁ~ûm«ÀOå#t·s“[rÜ&W‰§ÂB@¢ìˆQµŽ —ðkþ_À*QÀ²t¼¦A‚EzmÍñyç.SêÀ*F:œŽþyÀÄZìY[ ¡ *LI`®þÑÒ °ö˜jn“Z¶åQá6eJ`ÕëšÿZ±Éßn£îMSñ»b¿&÷_=ZÆC“)9Í€„pg>¢6À¢ô^&.€sØe×|—öW4M³«ãBØ4°­QךÀ°Ö‘ÈBI(Âlêa2Q˜Ÿ¶ ‡Ò(®€œÑn8Óx4_°_cçm“Z¶-_axÃÁô—KnµèŠÎù d,ÈXÿÅÈ?Ê™r­_W™hš•P”&XÐ> ÖBâ#±„' Ó™‚ç)hEòàÝ76@V œç³M?jYƒmJ÷ërÔ_²¬ôÝâê×q×þþŠGW¶_gŠJ^e|µUW®<Z”¨;ÁàøÑg›í¶Dpðø›¹¿fbÆÁŠ¿ùÜ ¾éŸÖo•¶ùÛv çÀê0QªüóU£ö¢áG–¶·X¥` `º‰ÀõÿGBß½L=èÙ”)= ƒNFÿ gú‚ƒþRËú¦ lðzg« 3†áïßðŠ>¾:×N줔Ö08ºŒ¸‘äî„:ÆÛøNA?侕fû¡gxÎG³9ð7¾áü†9€»lX1pÌç°!·Á`'løEwXó ͹ ÛÌë Ë`ßüÔ þäEàÿEù¯-Ó+ s,­ `I&@$0óLüîßì´;_5z¯øõÊ¿è†Û—Q¥ìXÅ(ÛgÀ~rjB˜Íl<@p¨¬ Ðt‚í ˜½ÎN„zÛýÚ(m}Å6¥ŸeÝïSÎQ:޲ï]¤Å5ä];G¯ré7ŠqxÙé(€ÝÀÿŠ?ðÆ è¦Po˨â^çÀSñ{ Üm(”ýѲè+ýöñ3€9.Mçx÷ë™að}Ù†­r`•Šs ·Á¸ÿŸ,æúÓi’ ¸!@uÔ™¯câþ¹Šæâ( Y\@•2aœçâFø“ìžÂtj£¦ýÏ6Ò´­® ðBGøuöÛ‚ /rlhãâ: ÛšüÑÅÇSµßÚe˜pô¯³]£7ÝFJàîYàˆZðøïœAýìê™DßN‹¿t[œ:¿>€C)J—ÉÖò; ¿¼OÙcQAS>{¼_dƇ…G~nÕÂ4+ÍšŽìªrï‹*ùU¢bºÎ½¸ûDÃ&s_ê„ÉD%.{Dekæ-ëJ¨—lSºß–Fý¥‰ûõàl*`¯ÌÖýý5¿¶é_õºçì®À¸üJ€]¡ƒ`Tm€#X`Êü=ÐN¡®&c÷bá_¿ ¯ÍeÅvb7àÔw?ú1|ÀËp+$Å€²þî&&ÿ¢eMFëeÁy(Ù¯Œ6Á‡€ùGÏ#çzÁS ž¢ÐÌj€ÀO²¢ÀFA€yËv¤ ¸/KãmjH`7K¢&)µsáßÖä_ñËöÛ‰ðw;¼Ê ƒ r%i´;îãjñà)þß8ÚŸLbô½Ô4;ê¯þMƒ"ƒ¼æµ÷'÷Wc ÀIô{‰Ó°ÒäŸ;”Ú«ÎQ´®Ž’Ф ».€uä)d <…Õ‘~HÎ9b‡*º-´v m„zÛýÚŽúË>2BmÕ·¡a©þþŠcmzü¢×kmž ^X»ßÁ‘•úâØgËårTm€#,€ßÿšKð~fêݶl9§¾ƒ”›ç úráŸÿ+X&ü©à‹ÿg`< F2ÚÍÿ5¶Ô™W¥ –M«œåu¬Eç*ËhpÝy­ A¹YQC m¢õt~yË.R¨3êgäKÛš¯ >Ž 2ù=Ž¢}; öÛäúQæ`(˜¸PäÞ.ƒÓår±ã­=0 €Çxûe¨ŸÚƒ÷% þ·.ȳ˪,EËPð .¶€Ç`€¢:÷>l \û6æ³é/Cý²eMÎQ5ˆ˜—4]|mD€çüý°CÖN! vNÑV€ç-Û¦2Ðf„Ÿ·¬j› ã€f¿K“Íã_d¤åñ Íÿv€²÷cÿ’f@¢\<ŒÝxÕÍó1ÞÚ¡ð¿íê§ö nQlò§X Ö­ùJ€]—'ü]J.V \7ÀgS¶ÁÈX‹@öLeùTsÛ&´m Ô…2A° QT!“ûc©”‚G„`OSXgkèv"øó–ÕÍ7ܨ'èÛ*¥Ý+„P“Qn_ýý¿Íõ·fèó°  ÄìŽ`|m€#Æ­øÿÁÑÑdö“— þý=Çߟýu“µ/ü+EbI•µ¬5þuÔÓ6•êF¿,u‹ü4…j.§ÎQ×MQ¶mx,…8'o3Ó‹†q»Pò–u© D/Xm¢íZ:›™Ó‡bl/ůè‘4:>ÐmYߦÂß1få¥ÀÑý}U/ìW¥\ÔÈn › ˆ™²ñ“F‡ tþ¹6ò©Émšûó–u4êf7i6SV*¢¯&ÿmá²™ Ù©¬þ’ãà*Û÷˜J€]p®µyi¬77`þ½7öÞ Þ‡àÍ¢p½ôh?™OFýȱpîH¿jr*Ëfürx=“àŸãUkõîË~iª¸HÁ¿í}Ê £S” x¶ ÀZb7@Þ)·$äK—Õ,Ìs¡.€æŸIá›ÙÁ¨¿è–Ëöí[°_áµq˜W&=B˜L•ŒþwãÞÙùøÚGŒCÐßÿÈcjúw®`úÝ{P9þþìh}>mêO+/ÅÚ2 ñõç*µ[×7üs6xUœ hœ#7{ƒÛ¾ù·_›L€¢g.‹FLfxZ¯—¦•l+B~“e- fà_ö|\£fmñG˜›QX´ª·«ñÙ‰¿¿­ð_{Ü‘aO§·‰þ޲ ­€wãù«O\ @ooÀ¼ÿÑäÆìm 'ÏNUþë(nãŸxæÌ÷Ü)'ÄÈlŸ|ËË<ùQq ŽjdËW¿µmßö~ï—— Q` X¿éL!¸¢0½Ãë5j 8\´O¿î²Ž”¢eîA6,ĘË{gòoyEKÕ3fW®ðÎGiú³W0}F!ÝÎg]ØÅ¬¯s½ûT`)(ðy£þ¬ð/ýÆ;ü3¾¶ÐPçW¨.Cr ¸6–¢tD§`è@ ?°q&c§áL*âEýº¶¨ &wPåÇÃëÇ üÛûqÉñ˜“ØÔ,G—g/ ÀÅ3Ò6ÀƒU®ñà1Ì~ôÓ«”Šôw…W_dà\ÁÎ9³Ž×·M¾íë.ƒBk@ÑÂZpí„k57z³û¿_Ó˜€õEäü#Ï–ÖQ;àð9F"í"°#e¨?Âod ¨]ábm7·¸â¶s“:;ñ÷—½ÆÙ ¢œJ€‡—­+‹¤Àniàˆá)gÿÞÑ­Ã+?q³ï=ÀtŠ” F áŸLSÁò|Ë€+äóCýˆÓß鼚<á_ôû 'ÞÀt?€¶ŒÑ5P\”ÈSo¢ TÅ„]´n² Ø¡i¿î²Ê@Ó.™îY”›stì—Ý.Eœ—jBÅŸþ¥ à…ÃÆŒ² pİ€Õßxãk§û?~ {ß¼/%¸“ßœ*á_e¨˜Îùgão8F”Ê8fàÀ¯Çf"…š½Â›¼þ¸_› €²,…Õƒi؈9 ,éâp¡u—u9ÂÏ 7¯[ŧüã«í,»süÎýýÙe‰”Otûµ·˜qùa/´þ‹`Ü'¢Q¶ŽŒ°¯ßÿΧÕìg¯ãà™i,|)Çç_%ü«•wÚ¤„CYÔxf]&άÈ"Pö#qÆÖp-u†Cúm÷s¸û×AÙ )E&4‡þÄs¼‹üñlß]í>ªº™U ]ÕyúàïÏ=‡)ÞŒa@088²/ªôØ g§§g£l1à¦ùàÜ¢½}ûW£6¾ë#÷ËS,üÝ@Áü‘ àŽ mpa A±• ìG€J~4îxŒ'S1EìBèo²ï6¬i«ÀÿÏÞ»ÅX’¤çaßyΩ:U]5;Ó;=äΊÜÕ’\/i‘„LÓ6AÐ¥ †màƒe‚-H¶¥ˆ!HcÃ/~°L’ ?.h z±´ ­@%€„`‰P«f7g–;«ÞmÍÌÎ¥k§wfêzÎÉŒøý™‘yò™™ç–ÿ §ª2ã–™ñÿñ_¾ßdO‹Î‚\¬&Ç:Õ²d@™_·…É»^ó! tGmä2ŸÕmWùcæo®—9šÓ©ñþ3N{œØÐv WÿÙéÞ{鯿‚£ÿâMMô~Yx_ª @m•A1c·ÕüÙû*95æOþ%ýMAU®C7JÂÆðµIﺖ Ê Ÿ–„&!œi€(JµAͰÖÕ3~À¯ À¾–ITü. TD8 `u"ß g¿ªk\1/ˆ!ÀEŠª,^#õC{œØÐö Ë¿ø‡dvú7^Áü?¼‡)¸àÜ^äDëÆô«4ëB€âuhÁåþYÍ^‘/€H¦ïH…/ ÃøÛ‚UíFÛZ×¥N}b!A9ÒÉVÊܬ~¼0y‡úƒØùÑ  jµs4>õ7(» {é:˜4¸&àè0Ÿ íÏ2š§=Nlh;€Åùïþðìä}§ÿ¦qöKÏ#”Ùº×5U'}4 Tbhæ J3(‚k»F#šb¼Éþø¨7 ~ÇiE»9@ë B ´0E £TïJv@ÏŒ¿²¾Oí@Í ¿êšy'E€6´æçÂØ®S¿Ç~J§¿á5Ve2ãä ÀÑq.ÉÕHÃíw °…ÀOð_ûÓ?Šû¿ø >õªÒžï+Dˆ ±DBê¿% F •0f¶¾9^ Ø£B¦ŸþTº¤ÈÝS9f/‡î̾=à’Xj‡Íi©XE¸ÌÀUØ5¦ß¦n]$€^CA@`½ÑäÃ)kÄ·Í,`?‹—kìgéJ˜þPLÙ‹Êß±~æÏö\Éò¢ •"ZŽQƒ“Zɽ¶L þïþò ÄÿrÌfXàLàNãû aЉօEˆ0ÅD'ˆUX!ÀX`ABb‰ ¬tfm…;„!±ÒÂÃ"(0Vˆ³o+Î \¸‘ý¯ŸüÕàÚ¨X)ÆÝ*î"¼!l¬PÀ!ù”­†}ZÒ~D`¡×(Šb4@%áθý`ò€“&€ºd™L‡óþ]Ný5õWù7ì§°.[QõN_Rq*`Œ € `oÓÚ€ÿòó ¦ÿó=Ìfïãïâ&9ÑR†L L#c Ç0ƒÀ À)¦ 0ÇG˜`‚N0ű nÃ`J(, K-(,ÄX D…[„`0VPX±Ä‚%€+-ÐÇc–ÖNVä¶G…L…°T 7«|K‰‹…Dê˜ÚE¦ß¥n‘Ù¤„ô®IÈ#œh!@IÍe¨¼Ý¡?Ð?CotÍãÒ–Ø·«úØv•i]Çú…¯@I( 8>cí«:zn€ö: °¡íø/ýØ`þ×¾ˆO`‚*ù!læÊ™}e…%àC,3Jó1‰ÜÏ©öežA`ŠSýc‚„)0cŠ„ 4ûeL´‚"†" … ‚D……6WDZÛ°@©µ aÅ !ÇO³äøú•’¸ %xK ÜEøÝPA®$‚YbH³ÉÞ±º.¡%×)FÄL3ÄÌ?ŠbH`ã`­ú`ü@ CïZ¿Á¡ëkeNäª"¢pÛýë· ñ«|…r€ërƒ& @àYŒ4 íy`C[!œâøø)¼üòÆ}œàHÏ?'§~'ÆD…R KDˆ4󀕾·„D¤Oõ@*@DPÉ©ßh$$î,Ca¹3“?/í´@ L’ ©Xp˜ƒ0pÖ: ‚µpÃúcWø üóÕGPK ,"à6¤Âóe„!^5ñpÝ¥†¨ß'ã§Üß뿘ÈÞ^¡A IDAT„%ܧ7Æßµþ´\TY»jeMxò ïUåß`yœ‡ª6õ¿¼áEAáüeŠMDc*à¡iÏÓÚ¼°ú¯þ½?ŠþäáûqŽLh†Ï ãW: @æÜúR<ÿ¬ÓŸÒz¥ïAsJ!!ÁXê;+}}©OéËä4¯ ÁZ€`ƒÊû èþCýYLºu`!Æ:ð¬¹+@øÄlLcÕ?"„Œë•mpM |Hš‚’ÍÑd$‚b H©ò¸µ!?°Y€×¤`¹§SÕòTöÕEåßrœ•uÍuK¦ÏG )(œÝg1š6Br¿ÓÚ¸ðâtþ_ÿ$^}á ø~0€k{ÊÈ9£ `(­ 0w"íÈYŒ[AYå9qŒ¿½T` Ø BæDΉß[$ÒDìtȺ]ãXX.@Ä=Ê$Ê f妟3Lñsø4~ïø>˜-€ëU _«ß¹]á‹IœAU–¶C3UÉ€€8 DçÓ í`°Œ  êHéúWY¶cLþPBB×5Y娾SƒúÞíýÙM§‚Á˜L‘ QãCxÌÍ 7ÿÉg/ü쿆Wq'¸ÁV §juÛš?AQ|rÊ9óù lSB|’—‰p@Æ×M9¥}ØI€@æúº‘Š2Æd¡´©úš„ÂŽ B\DÈjüA¶î¶y ŠùSœ@ožÑ”bJ \2ŽA“²Ch<ª‡_um«UþecuDä’_ ŒÙ±Hƒ“\FïÂsnTøCÓW~ê§ñ¹Oÿ^ÁS± þ6R&Ë9M€ù@Š®§ 8Ñ$ˆäaÝN¸D€PZ„Éo¶†@%B^Á–­?ûý³WŒ#ÎpŒ—qŠwN>Á7NÀå `ÆûË2 -퓦€Ê¯€€Ý ÒØLÅÙL,k?°…L¾AYn‡ ¸49õ—-醰ü«–©‹½¿°¬ª~ˌӳ Ö`(€ƒ3€¾éG§/¾üNVŸÚÑ)ÁûãÒ¸wûƒÉ‡Ü±• -“gèæºZ+EìO¿=õ$Bv¯©I¡Z¡´±€5°Q„Opƒ{˜ã¾_8~Šo}À•ÄÃë%Ò”ÀªålïªÐÐÔ™µD&òTÄ)M 1˜¿2Óã¶1~ô¤ hw̤`}šlA`£§þõ{Qù×]/˜”•|TÿNŠH¼}ºQàãèî'W“K,@{øK ì7Ùbœ·&Ê”§’ï +2!¤ßiñIÞ¾Î(Âü§Z ÄaŠkÜ!„ĜǓXø˜ñl%c]!aTÑ!j (ó+QìM)¤Œÿ±Ò7ËueæMÊv´ýûP÷3ê”o~¨ØþM©ü[ÕO7@gO&0Î^ôN6j¦‹ÅânïQ 72äëÉ–1ÅDŸ–kW~;$¾QîÿuåÍuʵ^&vpAÞ.¬i°&-Œ&˜ã—¸…€Àà3¸7y×ǰÿîRB­"ˆ#ÛÜv§V´)Óúöé¿ PC¨ "0Q¬ú78ÊÒâdœ9dü¥møfòŽe}½:mNÂhyêÇn¨ü×6/eiIÖ–A 0¿—*ªF€IáênqwsºQàNFß¹ÆXbŽ# ¥›CÉ+A½ã‚§ü›[G3ªú2&ßôzÖhP¦(Ž0à Ž!@xÏ ዳS|mrOð½«>¹‹ðâQ> ê©›Ò®ú |=ôé?˜¢ó @Kýë9´ÑjJ7ñmdüèI@í³rÍk9Ô©ß¡¯º¥é…ùÍM•°ÆtJi€Q’Þxùìu`C›5„¡zŽk|„KLõPVˆ2ùÆmaéÁȺ“gÊUç½8‡"Pþ ×ÃЖi²×‹R™ç#¼q…;ͦÀ,ˆÙ„ïB¼ø)#Äauš’zÚeAvËn™½31(©3r9Àú63þ>5I†Äöë’rÐô~ê/¸Þ›Ê¿A»œƒõXß}$DÀ© `†#¹ÿi€ mT¸–òúKÜa @ûÏ}Cå›RÃÏ )ƒµËÛ?í+Å.~y‡?v;¸°"ˆtÒ¢%Â8a‘±Ç fž^-ñùï7ŽA›L¾³Mš‚*4@ý·6Èy×—Úèªb”•|ó2~§ûÂa´°ÿ'ÓY PÕ1®¤¢²9õ7(ëMåŸû“ò÷x}×8zÌço”0ú K{ŸØÐF€%ó×?Qw¸wXb…fÉ›N%Ìzýûâ56« tkÅ'z[QŸí%+d•ú´&2  …ì_\8‚4Œp‰n°Às\ã\á=µ¦˜À,Àûw!Ú…î:ÓïP_ó²@h` $- uGùfüe×[Äù©¦cø¹æ«T·LOý]ý*Ç7 ó·NJåJ'_P8:Ö{Ì0,E£`Z†‹ï-øp~…—p†¹Æ0”?É“e d­1ä"ÖLkå>:.pîkÆxò}»jB„!D„Œ$–ÄÀD›¦>ˆL`¥á°fGjB»êL˜K L10z½•Ö(­g26‚Ìil`Æï#žmx5€ü…\˜jôöŽËƹf6Þפ¯‚ë^TþÈÎçÝPr¥TòþŽÀ°$#¹÷9 mVå[ )Ÿßau…G[ÎÚå«ülÊŸÔÍ5û?Q"4”Ÿêëö‹¼·¶t•ö|‚k\á7Xa‰8S &˜ |+´qŠÌûÀôÛÔ·~É-aÂýXÅöãhLî™ñ££Ó^EÙÂá¹ 9ÎLò´‘7\–~ƒ§þªåwm£TsÀåeN_bL&& à( H—J©7åa7+üþ·/.ö¼ûnï_á3L (pL_àE¡5^•ºñÕû ”sÖƒ%H˜ke„UÚ Æ?!±D”$*’@ÌüµðQ¨Ãׂ|>€êgª§}0”¯¨I$0×óe3}*ÃàŒ¿ìº'M@ÙuO%ìr¯ax oðÔîSå_X®( Çºu|Á¨œ—×7×lZø{ÿ”oÿ­]|Ì |L7˜a‘0q›¹®ŸØS, lô(ˆÈ[ü³ß'—ì¨y0üd]å/r¦Ê‰R'72Ì?Ò# A`3±_eÆjavâ‚Pÿ–ûúZ6[Ÿœî 0À¥É€”ÒEr›áP €HŒ&€!é@ÒÚ¸É.—!>™ßá…¯,ez>AP^õŸ¿—ÓÖÃüò¾þ”ùøÖaºª5y¼&¨˜>ŠÔý" sL…ŠH›”L§Ì믵Û»‹_È$ ìVÍ¿„Í·áZŸÊ×>˜ DçÓ;Ä‘FP” ¯p(;ÀøË®»–ejµvœÿdœ÷ºœú«–fkTþ\0Þ4×O¦˜ù7™ê=pô–‘ØÐêÉ]$ŸßÉè~È Û-Šîw!ʸó'w*Põ À0ç¬f øÛ§ Üo6”P–ìy,@ Æ5¸Cˆ$"eµcRN‡e¡€ûÄôÛ´AÕ×(Ž¥ŽÑeêhæ· w«Ùuuá‘—á~”¯^9W¯ÿ^NýŽmx;õwl#O ³cÖQ€c" !I…rÔ Jÿê{«û¾§72¼¿BajEÔ§ð)þ¾²Âƒ´°]ùì¾Ö…‡âS|Öï ëXþ,œ¹k ¬û&F] ¾¹ˆê›€UÏÖn·QãH±úŸ&„è^D&PfÍkÃé‹Á—]šñ\ïŠ,m­ë¾ ã/¹>ø©ßWæùUН¦À¸w.0ý'ÅŒƒHlhóÀÏÿŠÄÅ_x‚jÇ! bOØ\Ñu°ŸüiýzZ7û³ì;ÍfêË eßuÞ;¡Ø€B³…Aå²r~‡¤8À·W)€*y"Ú7•ÿ­B@žŠXõŸaþVh`ÕyèëÐpG†ã¢”ÚæSŸã(ÞlJÞf…{/Шž.î$ °¡Í ¤â‡¡Rk˜-'¾önTäP”-Wî{[$@¬ G/²âÌ Œ¬°@„ *ï”.á# cMOÿ>ãì·É7 & Š@›ŒýßÀãпý‡Ãº´ÍBíãÔ_V~hG¿®m0*€RCè˜ pPb\ÝÝÞ °%Kõú"Œ°<Ž’PÀz,—õ,ŠáW¥ßh‘ΠXÓP¬ÈÞY§"-DÞ3`­¶†Å„ð· j%!Ž]B÷éµÁ3kO!Å@€¤3F¶ €Ö£¸ÅñuSŒížC¶¶È<«S¼áS«6ʦ­ë©ßlAZ‰Çk}(P˜Ÿ ‘ûFŒ7|Hlh+,¢Åb.±TR(L£ðWƒ®wŠD;mp][)QŽ%Q¡™ÀŽJàâfR"|(·¡Ä½c; Æåg6‡o‡+çºüïX}*L¢ó @‹øV^Ͳ1€ßôz‰@PYºGª €9rÅ´îØ©¿rž®ç÷žéTïc&ÀáHâù¡=òvËè­E$Ÿ/Ut?G˜Vç–w» ®=s‰0Q^?‚Lù=ôÁßBŪÁg‹÷Îbï„ÃeúET­wDXM Ú`¼ÕˆÊ™Þš€µGÝãOÆaÌ&Õh&B¦rõа•f¸ÞÚ(+ßä(yÕŠdø¤²Œ10ú Jêp²ÚŽWë«o\¬¤zºP1® ãSô-ïÖQ¶<[öüâš´_§Ó 5ô‚üJÅ‚ÀwîVXì Üd†\ÛÚdkc!:â¶•ŒÍʆbË¡–F”áõ7¼žÀÁåŸ=^Ï)'å:MËLyPÅ.Ì¿"zÀå:£¥Ù L€ð =ÈäžR¹)Ï qô€q<¯@·©Rxth¼Àk¿'%ãñB)(ˆG™¯²­PNM™=Мág}ûëi„ÀNB”ùw--b+fé“ÉúÚüÌ¥&@ÀëPÀ ÈC³Þ!Æ×ë(¸î:ã´^·ÓN.ù:õ7KQ1ªý’>Y•?ëÉÇÇ1àˆ8É(úðОy;L˜ùá”XiDSeCA%*–‘ÿF—Ì|0i€ màQ™Œx ˆÞmöÍJåëtcøyÊÀd ð¥r=ýï3Óç‚™«Ø)MF5AYõ~¡€/Æ_#\8_÷Èàk¯·Ï”‘xýo“wþ í*N_bL&¤5£À@tyyuuP!€À6 R=‰?_*y_ å bwýBÛ”Ê×á†åÝKeÃý¦úŸ è'Ѿš“ p[}µÕ¦ cˆñ<æx-# ª]Ö{óÞ÷ÕVƒ#q§ó½\}2þ¾Ûñuê¯yÍŒ8¯À8ymÀHƒãíûŸ½0i€ mxùÍ÷/B¥Þ]*‰(Ý[o¯w³Ù»û¸ÛïÝûÈ·œ?ÇÆ¨€™HZÓ\0¡ØÕ°ìi¶¥-×6ª±öö_yÄËP.ò‘ÍØks¶³Îì›1üº’î-#“K ä&~‹wK‰ícÔ>ÛêÚNÎ$ £x" gˆ1¤‡frvàs¸ôÌø¼û®£F ZŸáÒ•+±P­•<úÚu”¹®|ßídž«I;(žr†‚bfMCRtx!€À6 _~_ER½¾T*qDÅ>áãdßß龞áµK L3 Êü»ðl¢[B mdúèÐN•@ @3è<Èúdºï“ñ3¶†ñ5G߆ËàòÇCœÖn§Ós’BAáü>!4è†èðBír¢4 v ±Ùg6†%}£ñ  „L©ù:­«“]†E>~žÌ÷L ?¶ìWm~"vT„Øø€Kd‡–΀k÷lÿÎu::þ%—J®“}¯¡ßK¾ý.Øú[\o¹›«üa`2åäsiR+yPI€ m— øÑbAž((ru¥Û>fïV>‹e`''VöÀd'°ß[FøqØù‚NOè{ƆmË‘4²b ”6Ä&±%jí*ãO.54¼³…èäÂî°ºÜ=´¯nØ›‚òm¥îÏ+JÊ*(ÌŽyÌ8,)à°Òڮ׋øÉRªç ) Òðrc¾ýíõi»‡SûånŒö~0ˆŒ Àv±àÍ»2€o$½¾Úó9®2'HË) Sè^&2>IJ`”¨æ=;ý~UýÉ¥²ë€›ñÚ㪠¶Ñû´õ-…š<آʡZE§ç”‚Àtq{{{€íz½Þ¿¼ÁO—,µ@=†~Ñ·ÖžÙ»1üú>ªãʈt%¬cP€ïÓù¶ eíär×7‚<:°*€üÍéh ‡ÞÁö_z?j®7ñÆÃ:ÌBƒåaWFØâQÑðºW[?üh4’öeÙ pöBª}¡ËÛÛÛëC|ðí~æïK0G`„e^2hëØŽÙÍN÷p.®i'š ö\7ÛB¢ „oD¶@‘'{SÚ¦ïCQv+ ©Šf"NÄÖ?[PÉÜ[:ðUÝóÂø9_ãO`‘©ý2U-ŸÃuŸ¶~ï§~B„ËôIë›a€"…_ùü÷Ýâ£o—©øáR*„S©sPÃo‰k¿s·ÚýôÁ5w„Î 4Å­À `jk¨—'ÝL{]ÛÊiôé_Bt6°Œ5 0[ùJÆÑÆŽïÜ^SÕ½¦öë{XCé·Gç¼VŒßg[U×5E¹ÿ.#€ÂüTG­Œ©€‡!‰oê£oÀR½¾#¬Ž£$ î«õ“#À­”o†Ÿ'cÅ7~Ÿ«Pb6UHÓ“—§íc7מ™7‚@haJ²`Ml2Æø}­AsøNo {ãþ.}ä}Ön3€ãã8h4 B iÿ¶PÀ"Z,çK)!#tcôîu»1ûê:îàÅS++ l,ýûw¼w»ÂçN†ÌÐW›¾Ú«È µ'‚«©ÉP€ȈÛáú¯Ýs2zbüU÷ê¼ü(Î÷뾄ì°ÄÛzê<Ùú ^ eY À˜}Fáx^™|$ßt€i€ mŸ°ŒÞZDòùRÉûQ pÔ"ЯmV¿ý´k?†Ž€Ööa+-ðU)ÀŸô3”"`îæZ ”– €¨dh{ÄørÎÖÕþ¯»Ì¸póGnz}°S‡>¸hiJ€€ y«Ÿ £` :Ä4À†¶ÏÂôÕ7.B©ž®X%Žz•°£h— =š`QùâÖš:)°Hž[Ÿ(ëøÞ2²v#øÜ-v%¤0ÿÜs`‰ ç0 4óOÀ€lÕÇP>ç{-œû¸ÎM½ÄÁ¸^W€DÀ:ðÁV§þ¦NxmNý-û`‡þórÒ½/1ŽÍ`äþÐ¥R‡—ØÐö ¯ýž”ŒÇw:'€Ò|SXÞæ©ƒªZ©cøÍ£ŠÊ®a€ J°. À6‡[!D蹨‰fôvÀZhÊç|oK?7álT»2e;yå7ˆhíœ×pŠºôQ¦0b-³s‰t  ÒÓÿxü‚n–ËåÁ¥6´}&Ìüp¡!\òtWá»ÕãuÚ·Ÿþ)1$íý€ß•†ùÛ¡€~Ÿ¼Ã n ½Ì­_×>j'Ú ‰%Ý ¥Î¯ºçQÕ_yϸ©{X*+b²rù†pòk3M]þªêÔ¢2N_bL&ñé_Œ€þIáz¹\,õñ·RãQ)„CÇèøÊé;¬oºùݾ=ÿó¸+Æah À×€͵ûÄôDi@âPÑ·³P°«Œë^i\½.äºdžlêì±­º©èêèW[§ S"'·'/ÁDÄ&«1pÿÄxãÓ?ðòí¡>þv J=QÌÏWJÞ#D1ý~˜}›–êú L!b8` k0XÊÆ¨v…éûl3Ÿ:%0ǔⱚ|”hëØ—¹4㯺×V((o²Ð6m[G|2þ†uê^¡>Âû¸a[\ò¬ ŒóZ¼Ã#õJšØÐvÂL¼ùþÅRªw—,•&Î~<ÍlöíìöÕuÜ®Ö÷Aúßø0V‘DjàŠQú¤m†®H ŒXyÂ9 J|ºÚ÷ìø¾lüðlÿGÚV• º…ÒÔ1¯'?öä7àbë/«Ã¶Åní5PPZ %£àt i€ m§ðËyÊÅR)„h¶›×¿?f4sº éÂÄy‚Ì`Ä?o|¼hchC»s€ª¯kÍ¢ó È'ÊŒ­èÏ6BoæŽþ¿/ûšKdj‹4üÐÂÃp:õsǶŠ,&ç÷ " Œ>€ÃС¦6´À—ßSRª×—V$•~½ý1{nq§yûëW „©„ýX›‚ \%Ž€ý1ç]ˆ2ÈONétÀBd Ó  µ`ÜîMÀŒ÷2œ’Û/ý·oï~_þûá¶mÙ¯‹„Äé™eöa€û& à­Cž€­}Å8Š#¤ É|*åŒ~Hfß&Ô¯N§`%‹F™l€F*øÖÍ …^Eífþ™s_íÖ ÍØó–ÌŸN ¨)Å€R±)Àä TŸè3—ZÞÛãç÷2‰‘.‰õ“UM¹ü¥m?õsIÕŽ>Yù€qr ª4f‚n¥Tß;ä ØN'@Püh±’çJ°ÜœØë¦ý4ë#b €ÁPXÇx¶2&åuÄÝiSí–Ûÿ“!< bÆo@€œúêî·ðdëù\1Uì¸<ž×pïþÊiië#ÛÒѯtlB‹2Ú<ƒK5 ýã“›Û›ƒLlh{â'K©ž/”¼/; ”[Þíó¿yÚþoà€B,€‹¨)@Ÿ¾Û"Lä'*/!ä©H#2pÀTÒuw׿'(é¼R¡Å´ÕaˆÐ>ë{n/q,|sÎ>Ä€¸b¼ýâg^üZ¶×›­¿ì^ 0}†1Ÿ‹ä=€~‰•:Ø4À†¶ZÀ"Z,ç +%!… Åb(f_^§›ÁØÿÓŒ€–þÃ:U=[†8[K L^ŸÄÓç6`»%)aîæA|-‰°óÔÀã¶x—Q IDAT½¿ÍŒ¿Ñ±—*— s€O'¿ª{CžúMž¥ ;!CAÞšägc*àè’@›ØÐv»™,£·–‘|*•о-w8 WWÁêo¹Oÿ€ÔÃÃú{ @ïÞ…XÇèŽs臶È_ I Ló˜êëÒö¨z„û~öÿÖ6~sÝ}\–Áu¹[ÜëÓïͯ¥Æ"ó Tìœ~8:£þº¹¾¹>Ø4À†¶[øê×/B©ž.Yi7@.ÙgÚWÓ¦À‚Ì9ÞÆ  hck•âˆeÙ\z샶Q °R OE܆”ë`@kÛ]û& ç¿®kÆ9ñ³Ìû½A·½ ùyŒë¯ë‹K„«¼˜7ؘNµ à¨è—×www›ØÐv ¯=”’ñøNIDVN€¦§ú¾Bý€îBEUA’  @O¶@•n/‡Áô3@ …·ä±NtF@%­Àlƒ‚WƒØÒš±ÃÍ㣌Ÿ/#·¹ÙA6êjëêÔ_¶DE7ŽÎ‚ fþbLÜ/1Þxð¹W6 °¡íöÀà‡+¥2‘>@o›ï ýûd¯’…P† ðIT.ÞiÄÝgq{Ú^W¥ R;†N¢¼ï.¶ Æ€]w¿énjçj8 ]6Û.P]j~ÒDIÀQè•ÂÃNlhë8RYAgìâ.´yf_~§ÎÕJX€2,€?ˆ$À W4À.Ä;Ü~,4‚Àk%Ëß‘ño@®ëØ»“_—¥f« OñÂ`21Q©O:ð4À†¶_ˆÔ“•RÏWJÞ—‚¨°Z ÉìÛôÇÛN³–aüºTPË<€/"FßwE§§4%0@ ©@4&K¨¹D8›`ìu÷û<ñûfukGúës¼7Th»Ö«´,)(VÚ…0JýÒ¡§6´ý`“o~p±’êÝ¥’ˆ¬n[7¼MflÒ‡½8‰éßbüÆ p!‹LN€®Ô·¿ÀP}Pl5 DçAŠ \á3ÞþeÕÖ±¯î~• ¿î~Îó­Î q6±6XÒüôõaç Æ·æ7aþÓw~Ÿ -ì0À}ÒÁ§6´ý¯Ù/ÿ>¯B¹X²B” ì'Ì[mßWuñI`A¹Ø`Jw¡‹EˆnLu_˜~Åéßœª i(`©+™ŠƒÇZ+Ç>ÝÁ¦¿‡¥áâ–˧³êépÏ«“_ÿºz¹Àü|IHœž™Wt<ý÷LŸØÐö _þŽ’R½¾j…PO¾’ ùí'Ý"í ˜P‚€X0ød%Ñ,-ð‘ ×çHgP HñÉŸ9—õ±ý€'mÀ–0þÂö.ºEMúP÷eëïtêW…+ãä,fþ# `ïôÉõÍõA§6´ N€àˆ.dlPˆýãÜùÃþoÓW°°°ˆHã«S"¼»Šð¨Šhûðþäõ_ÐD : R ¹Oõ}ôfß·úíÛÆÏMë¶[&“e¹O;Ýãøì»¶Yh¾_cÞÃHým!o¿ôêK£;"@ñ£Å*Âr.Á «|Hfߦ?רv; C‰à_Þ…H€ü8sù|úÍõ‘óœÔ§+¢SŸü PrD-‚ºuˆkã¾îwaì ïwYK.~ îéÄ_X¬ÆOLHg|Iáì… 5Œ@i€ í†@ü$”ü¾Pà§!3d. ûÕ í¸f!hÚÙ ŒCð$± ®c|#4>Û`o÷Ù²' BÁD :Ÿ ÉÈ9Ã,àf¿¯»ïþïÝÆ_ŽÎ‡€Ku—Ly5÷¸e½¦÷Z9*V<#×h€ Ó)ÒD@£Ð í†ðsÿ@2ðxÅ ¡Î ý7Åì‹~÷~ÒRÄ˰ÂÌ@/BÀPáz}÷“Ís/H§•–*b¬ Wù1¶öæ·ž±•cÐ/ãg”êð›.cÑßÛäÝôãä犀¨Ê”-  M4 ýí6«1 °¡Ý0ˆ$?\*;¼îU®%¸—¾²¥l%> X!Ú !Âï3°Š$fS“½ÎŒ§Ï°Ç¶©øšfð‚<éI}- €-P ìÿ•ÓÑ£ª¿2¦¦åŠæOϾQüÔmz¯µw¿KŸ\µ ³Œù\¤x#õEŠ™ŸÓÓÎ,ÕëËU„ð¨9$ð̾MU{¤-,,Aø.ïݬð¹y>Ÿ ŸÑz\Åû*Ž‚€‹ÔÞÏ*eúNŒ¿o¦^××L+×T©»oæ¡Áz±§rÛù]—²ó=[9·¶|Œ“/pœ 4âôK···£€¦°ˆ˹„T ´û&ëJ qºoÓOœв×ä±ÂU˜Ç Î£öCCkÊž;5ä<¦Ð‘ʰG÷±µ§ù’JÇ©·Oÿm|<–󸇆!®º_+£1 Çmâêîîîfœˆ˜vçM[Fo-#õ|©TâèËfß=epu©.>dìÿÆ `„2X„÷–QImŸ´ÛW¶Yß2(Û4§© ´N%}¸Úÿûvì+,S¢_f×ûù Ý×-“N¡;?ÐÞ&Ï=bÔ™‚ NIŒ"@o$Ç4À6íŽðÚC)—J!\Ë ýFûcöë%û‰Èi$@‘cd @@ø®2­ ‘¸èiv¤/ˆ  µý_ùÔŒ£–©Èø×¦¦ãÏ\w¡©ŽQ)CÆß—w̽‰¦A•cÐ$6ÄZ¾Qè‘Æ@‹vÇ þŠÊ$ >×µauܲ$÷Ú—Ù Ö)›° €ðµ»@”ë±0 ]ñ(J ¤M@l8ÖeT; Ç£ã_i™®>®e\f÷Ì'wõËGŽSÔ#xÐ N~ý²¨³@nS`œ¿ L&"¶ÿ@›vK < #…PI(¡ jM™oûºíût׈¸ D˜Ôåè÷‰¶£¿ê 4L¢)0YZ€µªC0~vxüœÿJË\#H&b•µœØ¿°ãø±+¹× ãïÒo‰vDAáì>CyÏ$£hÌ`Ñn¹›FêI¨Ôó«5?€fªõîvûæ}Âê+íÓ•Ëp „ßaÆ*”ð£’Rµï»?ª¾¦(i&)Êé’xÓj~—2-|jËd±(¯dÞ×±‹ƒßÐv~tPÏüUù­ÉÔLù˜ Gºdæ7ÇiHi·^µo>»XIõn¨äZ$@õ» f´aøEý$¾~€Æ0›t>à†€Ú;î2Ów!Ë b! šA æôO5êWWo~Gÿ˜±ÆïiI«Ÿ¶´\‡UÇ€{dîuý¶Ñ8ÄrÄì˜cÁtDì“./¯®Æ@‹vKøÊïó*”‹Y³¸¢“K¹ƒ^§@—ìáSì€ô‚Ñ:€¸’M €‡ 6Ãô×/ "`B÷íh¹0õÒçB³2˜ºK™ŽŒ¿6€ª—6ÿ;£æyï9ÔíÕ»¿«¶ÁNÌëÓ£À¸w.RùsÔôµý¼}ÿ³÷G€E»õª}ù¥¤z}¡5é‡ä—Ù³c6êü¶c$Íü¨Ð<€oݬPž` ê“Ê'‚„‰O´´ùq»œöá£LÙt•ÂÇùeüÜaê˜ÿ¦°Ë¸[Ôm¬m(ñ… 0î½ CÇD@ý‘Óçi·œpÄ—‘BÈR‡ÍP#æÛ²×œ‹2XêPœ–¿‘ ³U™ `ùºöYžX„è$T”eþT÷ ½ùK˵pì[»ì£L~ìwùzò²çu*0I€Jd4i¡wŽ@$ñÎ8 YÚ9Š…¡DÈ ªÂ_f˜}¶Numƒ8©ÍZã\D€ã½Ó60ýòÙKD3"Ë Ð•«øòæ/¼Ô²ÌÚ册ß96í)¼®¶+owi(uP˜ŸŽ©€ ÷Æ)ÈÒî „'¡RÏC¥îÇ¡€ÁÎ0ûl½fYRD@ZÇÐ~ßZJÄX*W³/æ¼ÍLýÅ1?ˆ€`"O,b [óU”Ççi¿ð’ÆÏÓæêÒbe¸¦›MÅó;´]W·sߥQ ‚ÂtŠr둼ZÉQ£Ýs7y磋ˆùéŠÓœõTd³çN~Íëä=šõ#4` Áÿ`ÿñÅ25û€Þu?‚4…² B4¥”ùÛfûa|­ìûU6þ:û>êç/ñð¼l]÷æàçzô]é¢ÁAü~Ž(€½‘ãíq²´{ÀÏý©€Ç!3"ý Qî³*bôý:æë¹6ég Øf'¯J…ð.„#î¦L mûµ¥£ü­XXDqF@B ¸Ä©ÏGßÚåš2Þ?¯ÏSM@¦ýº%®h§WÆß'PI€¼S³Œù\¤N€#õA·wcà<íž €”üp©$"H(LõgÔr³j9†¶¸mœ³ê dCg4À5€Ì]Óûž•®ÔG¿y)þ'^Aš€¹dæ Æµ­öýÌ­:ƒvÙx:DxòÆåžÕùu÷}›¸rÙ'_`ÇÞ¼c*àÞèên±1r´“Kõúr%!¬#jëté¯eK¾r˜´À„0°† O¶W‘ă±XÍûËifÐQ&%0нÙ|2ýÖåzdüC,ë˜ïVômî¾. Fšh¤ÞÞÇ7üàƒ1 pŽvSÜ\D‹e$)Uxòï‚ ­ß 7ÐÂ`Õ  þñ»nh€›Río¢ïus &BÛÿ% ¥…c[çÐ!Û^kû~Oªþªò>–Ùahµó£=Š_“ûEÙÍsü’Âd‚£b¤Hâù8 ë´“,£·B©ž/•º¯†€Óv—ÔA>êqíUJ °Àµ*sÜä)ú·'’Ïà„,¦ÏÙ芺Ów¯ZOý®'þ.€y¹‰‡8Ä©«)(Ÿ1‚ }ú$9f,¢ÝÔ|õ."©ž.•„lNçëdï'@ñ²ò†áú4ß²A„7F° w“Z†²¤@”Àó„b@> :Ùä´ïS+P1N§}¸ø×Ž¦Ü¿™`ˆÿ¦5ù×G¡Ô@“Ø jsQŒÔš“°N»)¼ö/¤d  J¿¿!™=jë5cøEd| ##Êù„'+ @¢}R ®´iÓ‚A€'<# ¬R€¢ö\ñû×.3†eüŽóÏeX¶äÇo´Ä€7|êßHÿŠ8[.8™0™ŒÎ}’Œ¢ÇYX§Ý4ÄŸÐC©¥CÕ@jüúºìµÏ4 þÏ`È",“؆†ŽÓßè»Pò{IN F ´Ö¡U6S_æ¶'Ç>§rÝLöOcQ1¿wêvÔýU÷Jd2…³ûÃS©€û¢K¥Æ4ÀE´Ã­B‰èHE}$@̾¼{ìËÁÚ“ÚXÀ¯KµŒ Žmè1ßh€Ûb^p¡¼ Sƒ€©@x ¸ÎE6ïËnïZΧ}ßu¾üäȈc‡Ìøí2¯Ïdj,xbDì‡.—Ë1°ˆvWˆÔ“P©ç+¥î+ÁtR ®¬Ž;”à^úËR¢ (Ä \„E¤pâ] ¿KLßÌTÑïHp„ DSÄa€æŸ@=¨}“÷;áØÇnö'ë×ÎÎêÛÎø}‘ô2Xãâ˳c“£ zûì•ó1 píîëöÍg+©ÞXeTÿ~ÿÊKør t©a|8`` ú'Ï–¶#`WqhSöüǠ狦ê,ÐÌ_f5T1”ºq¢õmÒ±¯¢ÑJ£x9—§¢ñ™ŸU®'›vðsÙ$|;–Lg¼wnüyÆã/$q1NB1í®ð•×9 åb•ê¾É!™=Оáçó˜Ÿ1•0ï(€·oV¨È>âu´ýP×1Pí=!baJ1bû¿*á¥øýÃv-çâ°çű¯¤\“n¹l™”\67us×â>Ïc¨r~,*B`Ü{´ `ôè…¢1°Œv÷uûòÛJI~}©²IÛÃì»0ü*ŠU°9_ƒ ®eM’ÒQo’úGV‡MD €j 玭›<í'Eç£)ãwZ‡Š™Ì½{™76×–©æîó&{MuË‹èæ&é0@ŒäÿÓCKh—Á‘z¸Œ$BV¸ŒÙ·û¦»ìåõ¸S_p¢®¶Lx²‘†nÏpûò ÿÖa€ D3"I„j®Ò›7¿ã¼4‰Õ÷é € õ“eõdƒß ;¿Ë«QÒŽ€Äü)Ð(x'µ’c ÚiŠE¡BÄ *É àÏ#¿{ýv)Šªêe0΀œÁ¸”Fý¿-€@>W¢+¥&“ Dç ët<0ÓOŠl†™gÓóóÔei»˜ØÃ£ åÝïòŠ”ºãÄ(¦ÇI" ‘û÷@ Ó—Ñn à'¡RÏC+ÀõÛíúí×ë?#aêô¯½† °¾±Œeþ‡\±™ja‰ˆN)eþª ÀšL¹ïŒ¿~ú\–˜íùs’m`ü-Ûà†}˜é9ú ãx.’,Ÿ#y§ ¥Ô¨(¡Ýv9yë{ x2'Àíÿ4µ@s ë}qŸ®ud2¦ÛE àÅ@!ë8äæ²-΄湋Rk  “ þ[å´%¤Ÿ£‰mßÙ©ŽÞüðèÑŸ@ŸK“o{(Ï~vþ†m‚CPÅæÉèVêl€#óï‰./¾{q=NC1í¶ðÇ~EJÅWœu¬úv}1{?ùÜëÙ{K`R¡àŸX¬$†eÀÛÂðm*‹å‹&a6]É©@_Wƒ`?rc§>Wo~ýùÁÖ6ÛÎg¤T™±iÏ~ ;ã/iÃKi»ßû’²Lc@ÛÒ‡¯þÐgïÆ‰(¦7RñÃPÅ¡€ÜR c6ãèvÇø_~O°|ÿ\2・Ÿ;µ}œ0¶‰Ù» ÙXŒ]ÃËyLG¸žÊ]ŸΓw5“²~Ö’=:nÜÁ¯¤LSuy;z¯Ñæ¨1páÛã$”ÓÎ ¬ÔëËUyĉv·ÙɾCß½Ô«oUä±O $pö¡Ø#‡BXMt2iƒ?¯)|Ûö›ìû Êæ§³©Ö¢¨¹"Ûw|D6|´kÃ5 dÕÇË>— '/ÁdtìÆ4À•´ûÀ2z+”êùJ¥ˆ€Ü³÷cóo+ ¤”É h‡Ù›‡ |ýf…b,€¦O°-ÔfLÕ‘D¦˜ÁBäœCVG= =àìû@)ã÷¹LpŸ¾A {›”©ºä«Ÿ¤(ãüR ÀÈÿýïJi€+h÷€¯þÁ…”ê©dnœ8ÿÍú‡úm# T÷˜H‹l8`xÃMZßF†ßǸòy㌀<Ó€Œ €†ÕÔQÏçißHÆßÇR·»Ø Ïþ’2®¨Îuý%Ê|û,a€{¢Ki€+h÷_¹×þ…”ŒÇ!+D: ,5p·H€¶ ûâ»múr9È`ˆÃòq‹7’¯¯$²vçæ©_¦Ÿ\1 ‘†cµ£Êª51 ˜>œöõ@ØÕ£¿‰÷¿§yß…¾’2µa}-ž·¬œ‚ÂÙ}@c" žèæúæzL\A;ï¨éa¨sìîÛ÷v·{=¡Eœ¬ôFVB Â` ’ÀÄA rÀ!"ÚVéF+D¬ÏלE¯ikç†"%7œ§6Ž}CÌYì?5xÔ]tðk37ÖåÉÄäV5=l-×www‹q"ÊiO~´ #D3ºaí·)Ñ7Ã/¢…X¿`µ’˜M¶áw}rW¢ÚÛ‚$ÑC.€µGÚqÆÏmŸ¥¢4ãw)×}ŽÅÈÛ¥‰€$fsNG%€ïmæŸ{åvœˆrÚ™3ROVŠŸ§XTù]¶ÍèVÎ}7«“ug4N€‚l@ ô¹o˜ññ2¸Ù¯q{LH‚iy¤N€O‹š¹•m¿…7¿WǾTš—Ä ˆO~ÜçXjÊK(œž$4À¨ðKᘸŽöã•ûæÅE(Õ»+¥*-Ý›dö;Íì×k'‡}³€y,A@ ðI$±Ù|›fúTþ·þU„èÄJ Ì5Áðàyu…>úœû 4YÇ“)ç†T;ô •ñnç¯*c2MÜ&0Î^ˆ z¼Šº]§1 p-í‡ð•×9 åb¥Ê ëÅ®®qÝ…<ÃwY8Š}ʰøöÍ iVÀ¡h[ Ó]!þA úšœQÎ °Ä»qÜ~ŸŒíOûÎÁöžuÒÛÈø‡O‰Ü¥,G‰QàŸÆ4Àõ´¯Ü—ßRJòëK¥éŠ*¾Lß̾o†_Ö—I „",€€pEø¦mŽ(0³Tp-Ž–!Ž•€4sÂRï§ýM«ù=¬]‘{  ½cü@¥ß€Âü9 ~$O$¼5NC5íK8RC¥ Yy‹èÚ·lÅ¥tŒHHàÃ×°ª/æ¿íúʼHÁæªç)˜ȳ €Eª«5Uˆ˜?7œŽ¾œú uÆÔmøT6 k7=ªßyÀ¾JËà˜›v" QðL·Ëåò{ã4TÓÞPü(ZIDÇ& ùå'të7‰Ð'0ÎD»¾µ4Xfžl»© •˜€ÅŒ²}&CKíÅ“?W° }Æ¿f ¦ž«á+Õ¡L/6þmqE€£ÏÇs‡Žüß÷vðÉG4¦®¡ýÀOVJ=YÝW`ˆ`S̾KßYÿtƒ`ÃQFðÙ㇛Ô×(‡ýÊÝ)— P_ uh[€ö(mw Ó¾SŽå;.1÷YqHÆ?À˜Ê®G· Ëc*`ßôö«?ôÙQPCûóÖ½õ½ ž†ÀþlþÍõúÈ)`Øx‚€CœÃøÕH"¼ á–`ÛmùEãt!*¿®Ã¯ˆˆôÙ6|ƒÀÛö½†ñ¹Åíë¿æç­J´æ2»Ïv÷Öžý}úTFE0î}Iáx.’Ô‘<Ò˜؉öGøc¿"¥âÇ3š˜ Ë¿ÙêP¼úúýcØš€5,®|´¨Â؆ßï8 @tÄ l‡¿Æ:Ù&žü@;§¾ŽŽ}•Œ?.Ú>àÆÿP~5ÓÄ%K€dÉ¿‰#y£1 °í‘ ŠšPÀi6]NÍ·;¬*¿]ݬÑÁ àR*<(=žl3õ9>={úä¥&Ú,¢Z¦gêŶ_P¨-¤·ãæÎ«Ô´‚¯GÚ„ƒ_Ëç4Œã—T’ ptôLc`'Ú+Ã+õúr!R*‘¯9÷Ñù:Ù÷PotIJ`}¡ à½[cÈûlå bP ð<ND Uç[“¼ÕüìX¾Ë’Uýݶû¡Oü>Çî° '/2‚‰a€ûØIÆ4ÀN´WÜE‹ÕÑ¡R`ÁZ9έ˜u§—¯C¦nm&ìp@C‚ð‰”( Û!`èqØN€:Œr"²&ÎÏ“5_Cökëy>íûŒ™­²‰·|zOÖÓW[\faœ?àX0&òM—DbLì@û%,£·"©žGÌ÷]Õ‘Ã3û´V—h€Ôþo°¨ à›‹Y À65¶Dø p&À3ÝYQf.¹Éx¹ÅcnPÍïs¸âE=DÆo®Ui2´¦iÔþ{§›«««1 °í—ÜùÕo\H©žF\ ÜUÖõÛÆ”÷iöV#Á,€L¤› |+4X ›c¼›Š0°m#´þ·N¤‚Ìxû·5ð¸>fl~jþÂ[ö3x\£!Uý€_5¾¶J,@ g÷c‘5~·›ëÅbLìBûõÚ½ö5)WÌ–êß³oê-à“á—‘É X Ë|·%€*o‘x*[¹áó9?j[l~Woþš›uŒ¿í;Ò¦zŒß§/@0ÀñÉ8=:'F¿[ϘØ‘öËÓÃH)H¥ÑìŒÞömëV¿}]ãDÿ`üz$¡Äqßý² IDAT9€íu.,™=ŠÓ)ƒ€h ËQœ؃Šß©ÞöýÖŠÓd‰m[Ôø Ëå….}^ÆÉ§8£Ài€i~´ %ä7ærþò7ã7P\ÏD¬ù ¾t!‹Há¤漋9L³H€B‚iy¦5JÆ»vÆ0Û·C_E¶xþ­Cÿ<¼¶¬I oOÕ‰žHhÓãñß;!€Ž´rg¤ž„ŠŸK¥làËnÏ­ÎÏÝ3Ö׋Q­¿lG@ž-C”ƒ¡Ãí*¥Ù… ˆ€Ø&Îk­âÚÙökëµUósãa4z-ì?¹áãm«ª¿Éte@ä²7qö©$ÆTÀÞ‰G WÚ¿×î›ß½¥zwÅJC»Ætgöùï¾?¬€4åq˜þ³~nñÆòöÍ Ýô»Îô©òš ‚œÒº<¿ëü”_ª­S[¯¦Q'û¾C=®›·Š¦^^?0ãÏtU&äT¸‰¨D OÿžIªHi€iÿ€¯¼Î2”‹P€ ¿ê>˜=÷V7[2[Ç8R&`b®•Ùl\#v™á7XH&²I@S¦ôvÚ÷Áø;®7׌iÆ?f ¹íPrY@a~:¢ö@·JÉ1 #íŸð奔T¯Hàô£Û³Gãºå ŸK0 “` àI&!wÝö‘{ÌDöOJ&Ã{“øwe° Êw ßê´ß•ñç÷žWå¿Mª¸%‚ÄÑ1iȉQðHŸ\^]i€i£À?”Š!ƒ[ˆ8›DlZßd´±€8‡p)mÏ,ŸOºÑUnXÞFõ3N“ˆ°˜RÌø×2¸Övqî06îðLm½ù׳Ñ{<¡Fòî–kb¸¢ìÑgó¹ BWS5ÛÓ>êÇÙfiÛ¶µ“@«¾¯.Lƒ‚ÂùËÀd"Æ<~é" ÃÑ íï«w-ÂH!RuF€þ™}¿˜1Å|ÞrX_¿Y!N <4óݦ¬€Å)… `&À3ÒfË`*ï*~¸ÏKWО5nçû˜]PÚ'3oRv“ŒŸ+þåŠßc" ÿ[ÍÕr¹¼'ÂöÖ€eô–”ê¹d¾¯’pÿ!x›Ä 0ÖØb¬ñ:A¸Qù©/ÕãŽE˜„@‚bs‘ÒænÏé]Åßpn¹e½óH®]mÀ$° ¡‰æËSP&DS Ã{¤Î4¦nLû+{~õ‘TO#æÄÐÞÝð¦€rí¬Ÿò|?‹ðõ•Î>Ö[VÀ] 1´´&%ðT@žz‡Î›IØý9{;í{Vó÷ñ ýÞb •m²}¨ú[<+ƒq47Ø#÷÷FjLÜ”öWxík’Ç!3$·wûÞ³¿šáW/&­chSÀÌ@(á‡)ìC‚ ”H JáŒi¢PïX4n7е`ú­Ôüvžÿ¸ù£ôÆø‡6Ip¨dr‹qrF Ñà›ÆÀ†´¿&Lx*• T9$oÎÀÇÊcè æ1a$1vÑ]ì*Ud4S4!È{BûHêÝ»*>›=ÌSWÀjþ ÞÞµ1 p ÚoàËO•’êu™Dpão<û¥w·Ýg[ó#,dÚ \VÀd¥¾« à.%j:+M)ž0M -˜f%Óç–m xÚo0UÆøgü} öU¶¤Ììc>×(€£€/Ó· ýöÀ?ŒtNvúÖüÙí}´Ñ PG˜¿ÙÆÿü6Dаë€Çñ Ô<(§·m4îøÜq*:Î ³•P¢Ã²ôaãÂnßsYs„8ýptÇ쌩€=Q„wÆIhN{/@©G«•„<Î{èdƒ}±“M& J„T @>bwÀžŸz(êo¼Bä<ˆ¿©¬„@.™¤6àЗTõðÆe>vÂa£¡pƒ"»ÆøMùŠh šc2 Ÿ[Ã{ã$4§ý‡  z"ÁÏsâ˜*óý¢nÆ>×  @Ào2#L’í óï;MpH­ä¨hAû/|ûà ©øiȪëv¹%I‚ò^öb0 CY!à†-·] ÀÚxuMt:` •l9.}IUóÂŒ¿­'jÙuGûþÖ0~ =㯘èï÷èL!4õH>Hñö8 Íiÿ€?þ«R*~–DT}ÏÛ‘7 œái€þ#ýI&y,€m¡!>ÞDPGpB)ƒL8u|œm9íû™ßÀÆåÙ}{ô÷YÖWÛ8R 4‘Z&a€=ÑÅíÝ호Äë§?\iGÀ²ox{Ì;M±€þ= ‚¾µ†¸)Ú$ÊàzJ`± `Í,õQ‹Xø®Ï7äiß犲›í~o® š€ó—`BÙWq¤.tu{{;b´ ýwÀJ½†r¦€ H¾áÖíùSÇÖÊ¢ÛMjà|œ»‰¸Èøô™¸¯™ëBåÙ „0àîÛ½Ùñ‘ØÃÔxvê|&{˜ª¾ö|—Í Ù7‰q~_Ä&'£à‡Þxåóß7¦nA!à.ZDÇÓ8Ðrìc¨nèp=‰<€ p!m€¾€mv4´SÇQ HfL”•ÐL^ÞÀ×3²§yb_o)Õ¶W½Þ‡Œ´kŒß*žO'a¾6…`"šy|Qˆçã$´£Ã°@-£·¢H=7@íÇ _Î~íÕùmÆ`à€³Ön @þå*BŠÐí`!ÒY3è<ˆóØŽ€y?Àõ?ZLo‘m߯ðe§ÒµË¾»¤ê¯*_0›óèà“Æ,€­é0^¿¯~ãBJõ4dUð½ú±ÿwÃô1ÛP¨ ÂÇDÈjºÒ.g Lí°B‚@ :Ê£’ŸçôæÐ§ëlÛÏ÷gN¬]‰ZNÕ>1þ’ú ÷ÎEš`ÔøøŒ“ÐŽCxík’ÇRon]¾¹<³÷qº÷R˜Mò[€ ¿I¨E„î^{”@Hç@@'"Öå#óÅžœúŠŽèk‚ÖÐF!±/Œ¿æz,N2î½@ 1 ¾HFчã,´£ÃðÀDCGŽ/œÀ¡ …uÒ?ú§4W“”À„g‚pJœ7Ý÷•ÒM˜ˆ€ c@Ð" Ðל±ç·§‡¥l…ˆÜ§Í¾iù¾Çb‘„Ô_æèà‰.•Rcà–t0(f~†Rq¥Ðî[•¿ À 51<[F5­ï²Zß…Ö7^„`BSÒ’†GÙ^Tüžlû𻔢¬«†CÚxù¾Ú®øtóÓxG`/t¹\.Ç@Ÿßò^R¤žHæç!+HÄ @ÊCn¿í Љ@YXà<ïÜ®Pn¸ÜóÓ~‘D¤1Aà± €Uýt¬1}Éxú°ís‹6šh>\ÿ†`äÛ"„TOa:­S© ½}öÊù˜¸%ŽððÝ )ùiÄ … +ë_¨ÿE`D`-$dÝå ¾o>ó0Œ 'Ø~Âu’Ø®}à»D Þ›dW™ÊÀ—À´Ý§ý6£XûHvѰEyæâ¥È6(!-¨ÓЙ.ÆIhO‡óþ¿&#¥¯X!Tj‰f/5óÀ‰PÂŒÀÎ>õC% ²û…Xo.B¬GìóÉßaƈ0u,ra€°|âØ¿Šã§ý¢·Ìq]o!ã7¯ ×|N³ Çóøcsx 1°Œ °â‡+ÅXȘùIprV6c¬ ¦œ²˜2{Ãú×þm×É+›×[+§û^Íó|Îaºß…òÜÀÜaü‹N¿@8ž©Fn¤n4†v¢ƒT¤…+‰è˜ Xè“?ÍV„Ž@V8Iø¸­h§Ì’…JãÉI_Í ´v-ÿÛúvRö—e(ÁødM§pÈQš€ˆ ç0EªèìÑï š×§'¿c꺦Mºq_m{ ¥ï`¤N¤VrLÔKª'R©÷WŠ¿Ÿ Á •‡vÌÑ×bó¯aêñ-‹˜¥L÷·ß.þÂ?ŠŽùÏ N£½È@½ç¾ð„ÙY&ôTÄ”5 $u!+ñ—Ñ Ø'¡ÝõÓ=¡,sÀúÊ™LýÌÞ’Ëø!ËPb~¼ Y}R‡gÑ`@4Ñé€m(`×¾w…é{i·¢9[“Ð9kÐæË3w›ó«ãäE ˜ˆØ]Ÿ&Bƒaæl{¤Nj™´5„à¸?ÛŒh—w6 Âº®v›N(>9˜ýœ¹”À¨€À3Ý–a·š×÷iŸkg°sCÀïn€ñWåB`0‚ ž‰€^$¢ÙèБ¾=NB7:<ö—þ~÷Ï1"~ SñGooÃd-£½ý{B9!Á0ø¼`®» úçÀg¸$İÈyÑâ4/€4•mõ€b¼ñìò_—¹¬&—i¥ë¡÷Uö¥ÐQ (fœ×°ßçÙºÓ>û {ìfWÑ=ÎZBN_À§šbÔt'…Ñþß‘R¼úKÿ/ÞþÏÿ Ñk~ú,ˆÀÂòœ7”rèB!¤Bç üT $¤U9SÆÒŸId¿µá¬ ŠM ¾®¥Éxtq ‚?ÒÆˆ|+9bÇëU??”8^@ž „gÁ5gÖ²}Ìö.žöÉosmƸ‹Œ¿fÙÓ™ZÑŒÆãwR#@W:\~àÿüÀ‹Gúo€ùO`"ÎЗú4ú~01ð L%Z¼fÀAHl-2šj…„¸©Î ¤Œ6;«Î7Q†ùc¥ðß¿z¬– þ\j¨cäTqÏ&×#àЛ`…K:§ËN Ç’;ÀýÀô;µÝ b¢ÚâfÍv½ì¹N`z$.ˆpoôððU(5¦îH‡-ú‰¿÷'sí¯ÿÛ„?òò)>{vŒEô‡p2=F@_á€THôæ z7!!¾V/$©ƒ![BB&X°@H`Ó&[e¤nC<{û“ÿ4ùi€ÿ|ê@»YÕß@µPôw]{pèÃ儜E!:ÑpÀ‰…KÿÛÎô+Wõ(°  !à¡’’f GÇô}žÆ0€®tI$Æ4ÀiÊè¯þ6¸ÖÿŒ¤ù[™2¿øï~þO!èý¤zóÉËîèKôi߃è‚ÎS!,Î Y!Œ‰A¤'1Î %BBF³/p½zÿû¿Œ¿õï?䟷ƒ ‹©Š©»€ûºì§ñiŒˆ¤Âòˆbû¿ªÃIðmׯh¤ÏÓ>7œ«Šzþ1äA…Ò(Î1@#ÿïN7WW—càŽ4 ]è¯ü¿•Öé7áeLèG“W!ÕË8ž¼‚HýfÁ˜ 8á[ d)ýóB‚ñi`Ž™ÿ'Kà.úE—ò·¨ç€º_¬H·®,¹:)(´5Îâ0€H1®ï‰Ô> » ògÙùÓ~ûÖUQ[®Y±zxœµ*›0AT¥WóÑ1>¤‘ÿw'…ëï¼ûîbœˆn4 CÐÏüß&cÕ;wã­à7áÓÞ…Û™Q¸ZW«‚ï-þ.Ðäû€ù¿ÿªzçvÝ­\…:†ÞÕì`;2AÑ•ŒQ1¤TW+©®œÁDe0Ç}þ8\îÔf—öfÅ#Ÿ}·¨ÃõSY§T3¢ÔÑ\|oLì…ÞøÑãGoÇièF£°yŠ·‹¾„ƒm\W«¿‚¿úÛ—ißü·ù§R$—S´+Sf‡º} ŽxþÌP’±XD˜JõK`þK`5ͤŒÿ­ )¢Q|Ïeþ¶ø´_2]ò.š?Àgjû;Æ_RÔøê0Ôò䔾K$ÆTÀ]iLì…F`7¨½0 ^ÁRþ0¿‹ëÕÿ‡ÿô?ËÔº»û‡˜Ï¾ ÿ œa6±Ùà ùkUBB±¶c*,_ø(ü;ÁŸA$?(е,™¼dUW勜É&s¹+è‘é;Ô#àÃïÞ¼ü5A@Û¬‚C©ùÛÎ ;–á²7P fëÿG +!€hö‡\„„5¢“¿y³úà/þ™é+gÿ1 þ ^*(•û‰–¹¾ W!öo‘d,WøÅÿ?~ëÿ‰Ÿ}àOCF@Ä@Åf ÌÁÌtkq‚"NEPÍßîoB«×Ç•p½Œ¦·T¦œaô:ÞÁûš”å¢K €þÿöÎý7ŽëºãŸsg—œ]>ìH$%’–õˆ¬–¡UÒpÜô&1’ @c  ÚÆ5úp ÔEðPhî/¶óC·HŒ&­ƒØNj;Œ¸Û‰-ÛMœÖ®5~H•DÉ%Räîrî½ýaœÎì›ÖÃ猴œ™{gæî÷{Ï=÷œ¥ÑñüY©­8Qzǯ9 4T( mÿâ%à_ºû¿ñþnŒ|œÀLÔ+w"®‘?;î<•Š;î=ÿ\=ìßÄF0µ©‹ñÚ®÷iÒ<âwèi)ô|Æ='ÅB/ £¶í@x~¡|Ý鉀–žïƒ¾üÛñwP™#BÄyÔÐ/ÖãßÒfèJ ÿîEà ÑÂ]“A {¢ÈOæ 5?ƒá` Wó30²!$0ãW¿H¨9ÊûâÇoûö»µÓàüg±¶–@ÉÆVÐڬ߉PhŽÜÔ¼OR¦2’b¡í”CÚýuÓ¦­›{ÍqÎôÚC^‹©=~e8”U£A€úe¥\.ŸÓfèJŸ›ºoXH9&ÞüÓ‰|΄…Bnöê ϵ¥ˆó‹¥ÿ\ßá~Œb9jC\ŸÖ!·Hœ6Ò‹gÂ¥¬`L)ßvº!vS.홓UgX’åR:µ5ïÏómG0ßù[ÕËØc9.—Xh1ýQKÛ½T(æVu `ß\8¿x^ÓJ7x€ëvý}[gÄÍ Yáˆ{YMP$ÏÊjôN±»·±7ŠŽ‰ÍŸÃ¸-ëÂA2ÓÉß·¸l–AÒe }³DFše!~mŸè¥2—²%‚ Åü*Î;ëyg{0£9oL—/Ù•æØ×E9ﳚÃãáLq$¸T<¥ôÜöoÏî½A-@€2ø_Oú CÁ0O 5‘ !FÆ+Ngb •u¡>¼õ,_ªüÇüG¿Þæô—O¿pòžO|ì‡x÷©æN36$Në°ÓFØMá„ãeÛ…ÔÑzbš!ù94ë¤]§³o7òþäõC7¸K¤5Rܳëºpe5ÚQ ½us’3£™&È™jVÇ|PÍêhDjá… å×Ξ]¹óð¯?øBòäÉç÷¿ùÑ?Á¹/ãïŽjÈàê‡Øþ.EB²\VÙÆH;eȹ̰…?‚Hzyß"¢÷T¼;V½º?å½­çRªKŒÀÛõ“ñû–Ìo¹Û·¢×·é=,—‚ükŒ8ýÕîû/ƒÆ*”«–[>õ£M¦‡¾r«Ú?5Ò £C¡Ü0âœ?±x¡üÌä¾ûOg]C¾ûì7ü¯þòEœ»‘O6–6”èÌ%.èC$$HZZzûËFQ‘éO+Ø2'“Ç:‡÷<\­Ùð¸ņˀ« KzL©n\82Ÿ¿ .‡`ðÍëq,îl>Ÿs¢>}á"M<(T(×4·Ýq¤}VÇ6ÈSÏ9wó‡ŸÏ·:Ï-ycFÁ¦SBDÆ0µïYžÿ]‹„Ú‡~DB£XrôŸ¼V›å†µÿËÖ,;÷4€cmÕ{WÂQôkµä‰`IuìÈ«_2&tøø¤<~Wô3âO1˜¬ÛjeÊÎZ®ËçÔ .£i€… Eé€-Ͻ´ t šêκõnØ$Á°~Ø!ÿ'°&ê‹KKKKšx@¨P”Þps/þ¤nY€…Ù·KŽì.ÂUkwŒAáçr=‰Ùb8~N“HHvôñc-Ú=±cÉÚï}á·V~ÀÝv?¿ÿc,¿è×jUD4Ù¾[ÆgLõ}&q)xHä$N9PA3"eÊ ‡c¿ btøß_»/—J«šx@¨P”Mâó¯¿Ùvúa°"V„ø9½ˆ„¸Áûãüm¼jïÝË>>ï_ʉÔÀ«i±8aC@ä¸!Ë’VØw mÒ0’QwÚ͵Ûx,çX;En*¯u{Çó_S»ž£]Ô…IDAT¶i࡯¢¢\F*`º™nHù9)bæÿòZtdïÑW’1Ød×,¾àHÝàbáß·pEHíˆëå`Ãh?iIH¦] %C²ÞxE™ýw–E!­ÞŒJÑÅŸ²òš³~»Fì§i€‰ E¹ÂéD$|ïÀ>ù…±±‘a#aɹ#A"sÀ¨s ÛñÜ„Hˆ0N=-]ShâñŽjmí‰ã¥ò_'O©°üÓ‚ÛrÒGÁ4XlŠÛBMOHŠy<Ídž™=9mþ?v¶)¡yš2­id …XH‰ÌDKp¢äý‡NE‘%¯ËzE—Šr ðk¯¼ÞÑj‡37ž6&Ì‹Ì:˜,³mÍû}ycÆð~‘a„ !0þdź#£è¯ö}eC–¸éä]võa_æÏñÍËÿ6LFøôÎsÃà¼Mˆ„ ?fXZ¥9ðɹziã›P¯³Õ”€ÏìáIøí‹žÅÞû ¨omDh¨P”÷“ϽÜ6úâÙ›O"¡À¤õßúÜK ­ê,Ùůˆßú{C䯗Ä:øxÍ©Sì)¢ -#rªHhH/—*’?g…1¦…5![©¾¹õsâúÂc±”N8kW½÷%Tô‚u‘Õ4ÀD€¢(u<ÀDk‘°û™~þNwöÏ#_"lŠ˜_¸ÐÒÇ®E¢žEB¼ÂŒÈÌ--YA³b+Õ}•Z*8¢Nž>uꃻ÷¶èëÖ5+Ö:M4@t"JQ”¾ù–8ÿ;%–ž¨P"Ââ¨ÆJÛ\mk|ön$#ìÅ)4oÎWcÄ·ä9iÙ ÇÝúæló?æýÆ)…¸Û€¥|ÜRy `þ#óÎ{ôé‰ KËKšx€¨@Q”ðÌù]~ôt‘©C†ü~àÃÀ„!? nÆ+SB †¼€`šêh)¸%!¶#Õñ?kš EàÄÌiÿ¤AFDGôäרß_k­UÐoo½a«Zˆ EQÆ×9´BÕù°á€øÜ/ÌŒ³3ŒXÝ‘g4ôØ9!Ì™"a¨6ž.:ÉïéÓ‹HÍ“¨?Á09KPýëÑ#pÎþPß–.‰8¦0XT(в©ü;Üv…BºHˆæ„\“H˜LC$ Õì—W$ÔLžkY;^bñé¦}Ö>Žç¢~]ò¨6Á`шŠ¢\|†•IŒ†BKiGž‘°*¤!„`;ø› fÜ!‡`jìâÿ®“T°Ûé&ap‰Õ¯~‘âÉÞúG1|Z¿ÕÎqËö“ÁXî m‰Á¡EQ® ã³Å:¸×'†BC~Öã's„ÛѾ€á1póB0,˜@hÈWC&ö!|sæãúñjbĵGRÅÿ*ºàx¥²ö²6Ã`Q (Ê5ÅìkëàvÞ˜0äÂá¬Ãv, LÓi]Tƒ".ßó?|ã±´óÞ~ãíïܸçÆGÈó[úuÄw [ gµ‹N(Š¢4Ó…Hv „B0.`)¿êˆþf‘c=È/•³.rö3[¶nŸø29>§MÞÏ_ˆ‘û´!6áEWEQºBþˆ ¡!7ë±ÛQ¹ÂÒKÿć:Zê÷Ú˯ŽìýàÞOaîVòöµ0Ìú÷¹Ne±ü¹á„hKlÂK¬(Š¢\^ûæ£ò+·|l"ŸË……Ba6Šìd®ÛFÄ>†Ã1O@-WÃûJ$¿prñðõ3Ð)€£@Qåê@.œºP £ÅY`úH°D˜&G‘ªHãêøú€ˆü~ý›ôB)Š¢(׿ØOŽwïÚzOÁäÍŒ[³ó&Œs&˜Æ3C@˜¢yñ•Æ*|Z†å¨~µƒG€¢(ÊûˆÇ~\æ~îçGvÞ¸+\]]ÙQ ‰ü9©Ša‚!¦qÌ`.»HøªˆÜ¡ßÚæ @QEi⡯}S<4²g÷žpeuuGq¤zëç$'£æ€ ò›.~|^D^ÐodsP (Š¢tMÇ"f€°Îûœ×€;EäûÚÒ›‡ EQeSxöÉgäð¡Ã#ÃCÃáÊêÊÞáááÉ\˜ŸDX ÓÀ,Õà‰?vËö™`,wZ[PQEQ®Q¾õà·¤tnulyayT[ã½åÿ×<ÞÑ«œ4IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/prs1.png0000644000175000017500000022346112412506713020057 0ustar sergiosergio‰PNG  IHDR\r¨f AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ iTXtXML:com.adobe.xmp 1 42/1 3896 121803/20 1/60 2 0230 0 0 False True 0 1 False 6311/1359 0 231297/38 2 5/1 3896 37/8 0 5 2.3.0.0 6 0 4146 00000a43a0 035021001653 0/1 0 18/1 55/1 0/0 0/0 EF-S18-55mm f/3.5-5.6 IS STM 1.1.1 1 Canon 2 72 72 Canon EOS 70D 2 Adobe Photoshop CC (Macintosh) 2014-07-24T21:28:57 2014-07-25T00:18:11 0 2014-07-24T21:28:57 1600 ô@IDATxì½ €åWUà}ë½W{UWWïûÞI'}#{ÒI@" Ê…AÑO 3Žú9ê7£24(~ŒÌçJ”aP$ ‚2D„!™l¬‘IgëNïÝ©®î®}U5¿ß¹ï_é@€ $ñݪ÷Þÿï¹çžsî9ç®ÿûO©ê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºê¨K .ºêøW'†u×þ®˜m Ì~W çxâ«_ýêòÖ­[ ÝŸÙ¾}ûÌsœ¥:ùu Ô%ð$€—øTü<ÌwŠ2Øç[\áŸo|Õùy†%ðÁnoioO3×]·}ò.êûFo/æ­o}kùСC 7ÜpCOèѼãßqÖèäô…³3©º~ùòO½á oè±Wð±}ÌžÀ`¿ïŸcžÔ#>Çx¨“û#Àºu©ÚÛ{ê³ÂX4øë®»®ÔÝÝ]ºá†Ó a4d ?Â{ÞÿžåG{/¯ŽL\119}Ñþý}g¥R9¥††4п{ðwÿàÞôö7½éOSÚ^š} ÑÏï!P!ë=€¥Q¿~ÎHÀn=ÄÚµŸ3ô‚ø|àûï?{dbâ%S“3WNNÌœ2›ÊÕ©Ù49QM““Õ„Ó¨ÎÒØ—Ê •…KºSgGó›ÿ?ÿöÛ=í[·Î‚÷_ż@ÝZSÿ}VK@ƒ?õÔSvìØÑ°}{Â87Ð~ô£­>úàIc#Û&Ƨl¢Z=«ZMËRC)OÕ >MÏΖfiòJ´ð\øg' afzzfvñ¢îò‚ùÍo{Çþí·(ˆ'CO¼® I»yVô~jôü‹êà_,ºzÆgXúvõ³tÿý÷Ï2>Ÿ>±¼~ð=óyôø«°ÞŸŸ¬®Ÿ˜^ÓPjÄØ§ÓøäTªVgfgf¦Keì˜+?=;¾a½8c¹›™™™]´°«Ô=¯é]ïÜþæ7Õ†.‰`ÿß¶2"]á?j¿'’öœº–‘z¨KàY! C/½ï};n»í‰]û[oý`Ë_~tëðÐô•S“ÓWT§f.œM•Åšà39M·¾¡T {«Åèk†®’cÆ~óÉN@·P»«µå8êÌôòUK*ó*¿ûößùw\ýõL"N=+„ó ¡ ê¡.•æZùoíÖKÐöwn?it´zYubâʉəK¦gÖϤJšfô>­|• ?í¼Ô@{ÏÌ߬»õäÖÀmésO½1•¦¦˜ï£•ÏÆJ3 êà¥>Zxw¤‡3éç&ûïÏ."÷èñOÓá/Ï_Ð6½~ÅÂsßô›¿yïõ׿ŸžÀŸ—=ºPêá“@Ñ­²É»¯~õ«Ÿ¸é¦Sª“Õk'¦&_ÈÝ™ ©²hz¦D·ƒ¯Nk×Um#f‰ŽfœKœî~XnCDÙ†›”M¹øÅk|Ùí¯¥Å­­ÿ «¥¢¿@¿€‚r¥Ré^ÐÚ»qýŠsóßÿûý8® Ÿo[q¨ðœý)$ôœe Nø³N lª)¹ÕöÉ&ïÞõ®í«Ž]>61ûãÕ‰êE Ý7¤rÆ>ÃäÝ$Æ—fèÖO3WÇL}aôÙ¸óê¼Æ®‰×ºôüæž{@­UÏÞÁ8>5‹7tù5~âÂ'˜vB(|cª©©¹±{AËÎk.>÷œ—¿üåCÏG'ð-ìŸ ‰úe]OQE·^ðom%ßÿþ?èÚ}¸ÿüñ±ÙNMÍ^R­NŸÓPª´V'géÒOG+5Na¤ê¢³õ¥˜¨çÆùúY ššorKnDÍRLJ±3`&ßéFŸ“œôà0[ôüµŒÙiÖÍ›½BC)r1L Nµ´·5vÏo¹ó¿þþöË—?÷Xèó" †z¨Kàû“€F@ŽRÞj»‚å¹Ç ãjxû¾yË`ÿÔ•c“3?N7þlzÉÌt9&ï&¦¦låÕ‡¡Ú­W´È¹·»^'9ÃxM&²f´Ñª›Gƒö×4 ØaAÀK>Ú¿Çq˜:›¦qU ¿±RIM,NLÃÎÀ\ÊNÅôÌôTç¼y ºš>öîw¼å:t .4pýœY~Ïy6ê <£@ß_}ÝwîÖ¿ûÝÛõõ]49Yºv´:uÕôtÚ<ÓP)MÒ­w]~¦:MÓÜÀÈ>1[ïÄ]¶4 = 5~µgöë…ùeÛŠ®»Œqáì~á)\ËÓ/´WDüÛ’GNïµÞÈÅeC£M¼=„¶ÖæÔ=¯3uvv¦ùóÒÎ=ûROoó¥(C¢©ðl¨Îïîªtuµ¾çÿ{ÛïüÆ•W^Y¹í¶Ûžó…å¶ê($0·QYˆ3…åSt=šy¾ ¸ùm©\iH«—/I-­éÞ‡v¥ŽÖÖ´daWê=ÞŸŽëgH2ªÐ-¿½ !³ôJ@ÜJ ±Ð1‹H‹–t7,Z<ïµïøÝÿxãóÁ ²]ÿê$0×Ê?ÙlýÛÿèí+ÇF'/­^561uYurú¤†RSãdmÎ,[m1q×éÂQ$Vähùóp<¤‰WÈê°ÉèÛ¥6“n^g³gÀUÍ 3ÔÜ_†²%®d´þÅX¾\N~{{Kjok¡{?/pÎïhOÇÓØØ8ß—†Æ,.ʨð4 å¹ü§ÁƒjÎAÕ@T/ôñÍ%  ¥ ÛÓªå ®Øþ¦ßºã¹î²œ3«õïç±0œ¨ëï´Õö½}oGïŽÞÓ†Æ&®™œu‰nú öÖ·3Œ]wÑ­gÊs˜¥«Ì´ù, gžy×f‹®½×6 ¶È^Ä€Ÿ’c†>ZUbHÎVÖ«iē˸0ôHÉ *g2¯ND|m|ZS[K3­|3xzà—ú†FÒF_×ñþáXb¬”qEA¶rënéÑËϨƒn¢ˆ&óÄUèò×P^°¨}|Ãúeçþö¯ýÚŽ÷¿ÿýo|ãss£2x^†b¦ºÖºÍ¸6ý­”¿«#²aM:rü8?–‡GƒžÁÑÑd ?»²g ü ÌENoŠ`q|œo0Ø~ˆ,zɦìPaf¶ÚØÔTY¸¨íÐåçŸv*g \¸á9èNG!–çäo¡ì·%þ¶ßfO”ªý¶ð¼ZÂùVî ÏõdÀ’]Û'>ñ‰Ö#ÇŽ\8<>õ¢ÉÉ™Ëx æŒR¹±<…¡øœ¼e< ?e7ña‚؇F>%ŒCä^a<¶<çÊ´²öf˜d+Û¶’y‹ÔpDë^Ë€¶§:¢(ð[Vؤù)hÎs`NwŸ GŒ´Tbsó-­-©©ÒH. tÑ„Z¤ ¥¦hèJ%ßë3XÁ“´eHÌQ»“dh®4ŽöN>øàá¶–Jã?Âóà›ä€’2ÃõóYäüY e¯¼²Ÿ3v >vìØ¼OÞôñ Ž;rõ±cG/fiçL ¾«·§/?v<9 T®¶  M•tô±¾†«¯}AùÊ«®ü7?÷š_úÈöí¯nÚ¾ýc?Ô-åIÚQ’¬KÞ|÷Ѐ2•4øž½í[º—»v}µëîû½àxÏÑKGF®™8›uø¶Ñ‘©444‘Fy‚ÎgäK•R*3†‘„õi°hVûš„æÉµ¬ê˜\¡^Ÿ;ÉÙöͬQF+F_ð¢±Éœi†€‰nHt­]8Ë/iØt±¸+ qtá5B!2>E511?Ci'æd$]ïÔŽ`«~MS<8d×ßõ}šepϰXN+–/ƒo–*I lüè2zoj…÷¸<§[ÀÈ*1„H!ÂüìhBô‹ð:“SÕ©eË6žqúêÿù+¿ôK/ô93ÔÌ’ö~ä_sËRì²bóÉmO0x*¨ñŸøðé»í»¢·wà…ÇúÎíì[ÒÇznï‘þ440fÅO·¶5ϲ½3;vêÊ®¥ÿlL›é96Púñk/I×þØ5—½âe¯ýücö–á‰vãÇ¡JðôZx„nug¶Ä©¶î9ÿV4}úÓÿpêÁ£=WŒ \58Þ{Ußñ nèïïO==ÇSß Š;ÓÚÒn¤¥:5Ag¿~9ŒŽ‡@4@"‚ŸÆrc‚ï˜dã阫Hùšâ©Â榆tú©ëS?=¡ùÌùx¹ ³ìˆ‡?³2Œó—x>¹ç=ø8qÙD»øñ36Q9ûŒu¥³O_ÿúŸyÅÏü%uK/óÙwl:DÏ9ø¡…o1ÇHÊ}.Ü~ûgWsçƒíí½ª¯·ïâþ¾þ­ƒC¥Þ#ÇÓñÞ~–§&SKSK0 t5m›Ë9,Qÿb¤6rÕXK€Ñ¿ô^™qª{vºòâ—\¾ÿÿúÙ×}Ê)/8öZä9¾ûÅ\ÏåÉ6ÔÜù;»Ýñð…ýã/ì¹¢±\^pò¦u¯åË_yGbO9]'´òõ•¯Ü¾þk÷=ô[Gö_861±µZmžŠV~‚ktk=´ÂV;úa7dàež‘ðÜ»t¦+Ta5|Uר€3-¢”cÍi˜®‘j ÑjGîÈXr Ú ÊŒv/»†Ì]3Â\>Ö´Xv†ç—îÀÈÈp:p`_Z8¿; Ñ»q _t®0hüÑJcð>Ücë_åÀɉ –üª©ÒXJ[·nd¾@Z4aö‘8 ‘åF ;å¦|"*¸ôZx>ä çBab䡇¾ºè _¾ë¬Ç÷\Ñ;8põ@ãøÁ¶^&îŽõ¤QºoÍMÓMMè”·”…þZn(iüò¥ðŒ ‹ ê\P5¥rD ‚¤¹µ#55µNuvµ6^vÉYw½åMo{`Òɧh Œú޲OlåŸ`À³³4ÿí'î>ãÈñ¾ËúF¯{CñÅc3´Ø(24¬_¿`øU/¹ü¤SO=ï°NoKŽ|áØÐð¹ti{Pͳæ,>Ò;kÙä™Æã¡©´éå²*ÌÐ&¸ý6O‡,TìšÂg%UñC_IÏ­hÑÂiãa†â[ývëOÈ—ü¤9>‡Èˆ¦q œ1Q¬TD²½ Hª³±„.˜(ÒÊ’þ©©É´gïN&ûZcS§£%a@#OñUèèÏ'''¢q`(e¶41ÇKÙ[6¯KxÊÅe098Ä#OÓ”)m%ä?A&-Ó«ÜHTê¤I#Í*#ˆ‘¿¸‰QGåóÏZwäg^¾í´Í›Ïéý˜9²Ÿ‰ )~f‚Ró/×y”’´ýõßþÅzz.8>p5KSçÓÍëî;Þ—ŽÐÊ3ާr§©ÀÙJc4Û<ž[ùbÌZ€´U¸<%Ø*DÕ„— m¦­‚°•ÆæÔÚÖŹïÝ©¹c^8z,MM.YÔÑtú–úÆ7üò/ƒ@Õ.TB„'†¹V¾æ$žç’ã}‡Ïø±áÑÉ+ÇǦ×ON5¤±‘IÖ§'¥ÅÁòL#3qÝtSsSãêÕólm.ï¿x¼:Û>À¤åèèdÌxOŒO¤}ûöN5”fJ‹®,µ´¶Ê*Ž ’b°Ì/÷at\ʾŠÊ7Þ_>ÆD™ÃнDNQ3ª¶HU`ÁÕbþcÙÌr¸Ž1y\g'áÁ%Áð"ÓÑ gï·qBDq+þL¿!Í%]n‡.G)XFÎxiמ‡˜Ìc’%Ëá¡áxxǼœÖ“Zq ÍMÍ18ÎÊ€½1˜—=:áï×­[pdH¥JSð/ŒyŸ‚% 4HŸŽŠhùSˆòqÞ$Œ¡àÍ|æ8¾ì½0$™š?¯³ñü3Ö}å?üê¿¿0Òh40 Ÿ_5vž^bγŸ¾åï7>òÀ#Ûz½¦¿èâþÁÕ}ǘ•?žüeC×lcsãtcs…æMa©bYK„˜h*‹{+¡ª™`Îþ:z³"ÊxüVZù¶öîÔÑ>?5·µ3[̃!´äÎxQbtÈ=âÓ'¼¬|Ê–Õ¿øºW½î¿Ÿè©1tuàIÏ®ûÝú{¾±ëœþþÁ«Ø:{õÐðøÙLÛ4ÎfÇåñ€ ³ïefß!— óê“eC£äãJ nߎº{-¶40MËŽ’°‹­451QzhçìmŸ—V¬\‰#cG[°_¡à` |Z¨––'ÒˆõFå$£}†ì(ã–hsÈךoÆyâNsŽxp˜?êÆ‰)p S 3N‚–²‰Â÷‘ ãsB Ø,Î1äÞ½e[FvÓœ°`…±1@•Ö>ê¸2²+ÓªK5óžð ^>:–ææ¦p+V,M]]ó©ûf>-Á³eÊ“¥Ìñ[«—ÂP‹ÙØ¥OçAnY÷–Š g(RãøóÂ<ÃpríúåMgž²æC¬ ü< 8Pt¸|vÙxÆÂ»ÞýŽ÷>´ëá_î£Kôè±tŒÙzÞÒ‚‡n®6·4ê-ã@ˆXúÁä’ 9*U+!ÉvADŒùë¹”ÔÒÒNW±;µbð-Ü·`à ]E+¹Pü¨HpXQê(ŠÇ”ÀtéÔ“]qá™'mÛöã0|'nÜ#`mF _åoÿñï·ôöÝ608øÂ¡á‰‹¦ÆÓ¢ x ²i袔Œ~r…E]ìåØIÈåI¯´÷õõ§‡vÞŸÖ¬Z—-XŒkD5 ÐÀ¬Â`##Ÿü¯+ ‡ š^²¹¦¶g¢¡‘Q†-‹Æpkh»ôd#Îøj0þ!…ñG¼Â.¶ÎÈkåm×Ú,ÙA8Æ:ÉKv“ÆÆFÓÞGaKo‰§üp¬##aèòc=–iÕý+°€«2ЄÁ‹µ«»#-Yº‡ÐÁRp;1–$ tÈ0A󧔄L¢ï+ÄJo .óž!s>°DšÒÉ×Á£ôÙâfd|ªzæé+§Ÿ¼úW~ñu¯{/zUáó„!£¸~”AÚŸÖP´¢7þÝ/ø§úÇ/ÿõ_~2m9yÃÙÀ¼Ò*é­§ñÚV¦“; Ò åiå]T«Fýµ‹ËKÜUšZèÖÏãé¯.~;1~*X/B¬bûþ‹K›Á؈ÍʨZ&õ”¦YX^³²»ü‚s6\{Ýu¯ýŒù ·Üò©•»ö¾„ ¨kFÆ.žØä×QZøqºêvë1Þi«šÛ]t _³2©øÑBRŽeªøµK¨ÏÑ’@¹¡3á˜9—ûƒv3<:œ6¬ÛX¸Ý5Œ Ì¢Õp4(aƒE‰'· T R-B˜ Ç¨ ?!x¢Œ4Z¤¯”ÉŠû,[Ѱх,Ù´ªv˜iƒ¦¸á^ÙQe*(&èŽâÀžލL²¹çÀîGÀE½³öïzÿ4Â0:pèøÙ‰ë„(s ùìèá@àI?êBKkSZºxaêìZ[Ûc³YƒvñJ“¿Ë qE:iÜÈC!%,Œ5ãã^Eµqe`1&ҥݫ€C-ÆÆ§Î?{S:÷ÜÓ.õK_zç³m§à 3#™‘ôÛå/q45”šy¿¨m¦©µ¹ÑýÚ±N«Pk^\‰ç.¡ý# œa8üêœÔqᦱÂ8ž.}kû¼èÚÛÅoä@Ç÷¹J@J+!{npUS¶ ,W“•†Ùâ†ÞãÃiÇ£ûÞü‘O|dò±ÇŽnÃè_ø™Û¾vúÔt©m”µõZy»Ÿ8§ª-Ëcaô¨NŠeɺŠ%~×Ö3:Š«¨ªá'H:Ír…yËŸ¾aùòÕl‚éO‡ŽLë›6Ä·šþN@d=xÖQìN•A›%f%¶›צsé]X­Î˜ËpšÄFKB[^P\£/e `÷ß‹.#²ÌÀ‘ò(Uä’|ÙP²C(fCÀF ϰmbl8ã‹þŸeÊebì̤…Ý ÒÞ}£ÌØër\)Ì$ú3Ídâ,=ecÝP;Yk´È–Ɇ ?G=¶ˆ'?¿: ªàU>ƒ×œ9¯$ÀqDCsc¹zïû*­Í•íÝûSÖ®=£¯h$Íñ£O»àým!*¼óÌÊå+Rk¹¹aœ'µ*Tfx[ƒ­ ÙÙ¼©ÃŠ£9 ¢T *Š´Fqhï^“w­óœ¹g"Çn}nuÏ:óF#®ÜÞ‹Ïš ˲êQ@Ê6%”Ùt”‰1witbrvçž¾‹û&n™¢[?::Å„»èJ U+ßå¶&ûß3³jŒ´\Æz öº¸d]«Tjl˜Ÿ™Ù¨¶±\™µ—ÍjöÕP‰ ¦`„~gРÁF`˜VàkíC&¯#šë¼ñ&S s«]e~phR«¶F›Oü©SìììHk×®¥¥ÛÇJF[ZPé çù@¿JžÜ%ç‚[QÎí^ ¯e‘¦àsTÊÌÁžÇ|F»Ág²(k¡Ug5ŒIæØ vítíÛiá›ÛXŸgò.&îX·µ*Âd­Lþ¬*[¤¼NŒ˜Ul„«Àæ€ åï\EZÙ5L\Àjº7QS9ŽhÉ)5³‚0$†Q™ `"P¦Ã[CVË‹üfåÚ2ÌG¨·ÉS( Pna J†B! d‘©¦PÏâEËØî<”ŽñðK+3ÚÍ-–H!¯à¯%Û%׸”‘è¢Å«)¸ðÁ°‹"ÄaGÅ%ŽHi§¿¾ˆ@Ç@¢ è\ ã&ÃÆÜ‹iÒðˆ%ÇÙE®€?ŒT§bQ.’– ÙÖ›! E)ä.†gãLlÉó³nÄd/ºBƨ/á1F'•í]é³c8v©eQ’¯вìAÆOÖ(Ce2N™b‘Êw–—×ZÌ_Q²tGî¨3å˜ëDù0IÄ0w6µ°qa×#‡Ø¹Úôëyã÷þÜk^ó?˜ü‘ï|Æ@ 3~ãÌÜŽ ÏÎëìl8rühš˜žHó33»>ÍëèbfÖÙú&š[ÈPˆµŠŒêŽÊQ‘5k“r¥  š¥NÍ üVn®­T£UZóÔpVc„¸6CÖ~³ò‡‚CŒCØ1–ˆàüE+èM-œˆ" 4šPTÆrXª‚ŠßcµyìÄk_€·žewûµ•¨ðr#jjÀúÏ­·²Uº°v·ìÚÚªY©¡¬99 ··a1!Fï4þ¸‰ÊИ¼°:ð׹½“6½½Zc…Z®Y-_×*™:ËœåÔ{^jɾõQR¦Ó¢EóÒ9[7¥S6mHk×mH ,Lû÷ïNþðô„ZÁËØ”êÍ<Òª±F—üÑ*B`ìl£ìPÜ0L®š-\Ī@_:|øC0™Ð(C{ %””üáÌÌMšº¥RòŸ[' çFƒÍg~A‚y£­)~M‹‰&¯qµ ÷âÒIè•UÀqíoÎc>o¸ã?œ’ù¼÷—Šv¯' ‡Ño2÷uÍ‘[©g4Ú#^&’›˜v‡]{U§œ|ZZ²lIÚñðÃäíM>,æÙ€ŽáÝhå®@Ëž×I“ަτӡ·¡Ìc ¬FnYJ\þ DÍ]%@ˆ$ ž ¶ìqÅW‘+|˜÷ót&yr¢²f"»22:5uÿŽÃëþËûþô£ x)é!â(>°þð¾ž1ÀÞ´2¬Y¹"}ãiùŠÍT,çÍñl·Ýk•¾Ä  «wÆ)ä,`ª!¤jÿJÇa6Å‚ÎI5Ii–µˆ€ÏP¶Mäȸ „FEb­â¸Ž(0:ªÕš,Ì­’Ú1¹ËäÒtf_À( tv4§õ«–¦M›Ö§×§Õ«Wcô 8²J·eK¾r:õöIïýà'Òú•Ë1d•µ€Qäâ¨j@é(ª°n”Ó«V¯OßdU ÷hotk[8K°PÆš²åáD–™“f"Ïd>-+bB¨eg!Ä¥|ó yÑAtšè5ßAžøø(sÙÀm^Çú–+8‹qatÙì³ÅWCÒ¹‹È-Qnó§•]€eGÝà©ÏˆŸpÍŸnÿ,úÐÑÞžŽ÷e™v$ p„åk—ãã±ÈÇ_;{\-nkkb2u!ø9C€•ƒYôЧu`ѳ„îàò áÄôE3 0ž;óæÿœ.§ÆÙ›VžÿâÀ‹cj,5~¬·úЮ–—üé‡>øæ÷ú_ø½7¾ñzå†ú!5O»ÙáLÚtËl¥Û–aÕÊe³ìßßÐì)-m­©op"NtQKQ„¦0&«Š?寓~Ñ¡Y”*™’$Œš.=š:”È{‚ß¹®òŠ3²™›DÜÔÖéÍDÐx‚”(X‚qÀûà¡cpÏÓðaNŠ–/ž—N?}KÚ¼ySZ¿v]ZÊ®³Ž¢.¦4œž –ÎÝ«–Ó…—\‘>÷ù»RÿÑ1tjI¼7v»Iæ‘2á1º—ÁRއ¥‚Ê®ñÆu›ÒÃî`(Й5-¤7æF9d !ð£Á*SîC)¹æ?§/ †$@ÑeƒÍ@¡¸\š×Ç|5Ÿ2Ôü£Õ ™‘ˆ¬”±eè,,!ÂÙ­¶ÕvbÎq{Þö›•ŽÀº³w@GžØÃÜmõ¥Á3\žU9š3Ì*ÇJCìÕ°,>;äÂG‰§úÇÒÑc=©MÀÊR é #ÎÊ•¨˜—!úÂ>À)Ë]ù+‡àÎtø”Ki6%ø–ûÐU¯¡7÷Z€oËmkª”øæÞÙζæ·}ü>þ¥Wþä+oþQÌ<­àJoý…_Ø>ŽâT~÷m¿ûÖC=Æ‹V¦e‹—¤<õZÄQŒ‚—Æ”g'#|—ˆÜô‘g]CÎ!è¨>d›i”®B暊Pèѵâ"N¢P»ÆóéËŠu¦jèGÈIýEeÒ¡Uøb|éì2¥x`æõŒOŽblMi­üÖ-›Ò¦ÓJz7óç/ +2é@3ü81ed†BDb¤O§n¶§¾öÕ¯HÛÿOÒúË=M†n0 ]{‚-2½”mâÐDrëNA%êêêfOÀÒt¨g?“KÍi>:9¦Õ`œ‰ÀC{HËh”Sq* e—•Úò,0¢£L቉ˆpÅ5 Ù¼"B€ 5œ 9ó¢™Ù€‡õdˆ³ pxtù¡_#Žî·œ߈.äMÝàŸ}#Ñc„j³d¨Òéøñ²¡<† šŽ3éSâôæ¦ñîñŒBBj NiÚzeÙe£Ì61¤qk‡@EšËÈëOduñ^ÓÅ•iõˆTí'ÒI'çx½å`‡4ÄyòVá²eÝéÜ­[Òé[6§u¬Å/Y²4µs½ÓÂÚÝu^CœA?Xbˆc1µ`ªÌ8t˜dmëÌÓÏL/ÞvAúüîe'Û¼¨íŽ»Ý$tÅ{“ƒÙ§#(³™?ú“wý?Ÿ¿ãóºñcŸZpdwÏôL¹Zî`% B·‹óú˜µ^X)ºt‰“?…ûºˆÕ³ß\‡€"ÆÊaÅÑî±B4.ºkQw™Ñù0šH'M¹ÏDõúÊ:*ÌÖÅVÀò}Ä·Æá-2³ `6lX™¶]~~ú‰—]“^zí Ó¥_”NÚ¼>-X0?ïh¤|Ïœç'(”Ž0~y(êÝ´Úu%´*ɉeìQ_–n¾ýNº‚­Ä¢bÒD¯#ZñH1?*ŸŸ0"‘® œ sUaÿ½ñTO>æ<äGÐ'¦âº¸³ŒC–Ô‰cqÿäI-XÉËkR^ÃxŠ˜\F %]ºø‘,ˇ֎ß%>—÷4°à‰D¨òÐús÷èYÍH=j^ý½‡ã P‡aÁ=°ÎTè1ÙSke5¤½£#äá nýà|—!h²Î°—B]s2Uy;(éÊ@©á‘íHs6òFºq5~kÞ…ÙËs`!š/ ÙÕpFâÊ`"¥Á#~ŒMr~å†_ü·?×üéO~êÒ}ùhöØ’õ †È ¸Þ%×ÄÑVÕ|ä—Þqûí7Þø¡Î®[½xzÉÊe••+Ö¦®ùKwu¦yóãiçÜÄÒÄŽÌòºAeåл[™ŠRÃU‰¢²¹ÖP¬UT¢Ÿ(ŒD»ÉޝÌPüžÈ’¡xQ{Àh0>,®è‰d'ÙHZ°¸ƒ‡5NM?qí¶ôS/ûñtÍUÛÒYglå1\Z{˜c9:Á²N¬Ðû-ßY£æ"%Ï(ó9æE“\Ϧ[¿p7+%óh¡&Cùs *™4ÌÚGdZáäÝ'«<šxìX/s86S  (§Tø ÙÒ”¶IŽU… Çy²›'ð@C`1M¡“GXe¢¤ChëÍàm˜+æv¼ïI¾1.·Ë¤ Á®M`ùT¶þïÇÞ€õÜÏÐq”’ýH‡°NFýSpS#o ;ÁäžËÎð»Ã”¸€£ 7-]±"œ~•Gå[zò\Aæ?8•_ù#¯¤=ä9—F‰|+d$À€E2uÉÐ÷|4_Æ+/ÙæÌƒòáCÇgZÚ/ÿµßüÕ/ÿÚ¿ýåGœ¸é¦›jW ~ú¿ï!Àöž“G :ô8Ywbxø²4Óœ^ô’ŸœZ¼h)/_u’¦‚²ÛZÒÅf&ÖŠ ü-y;ÊZ.çåçÚ…òW Å.°ZU„ð‡ M̈bd,¨aúl¸ÁÅ¥¢¼„nú$­ÉÐh™OóšÓ–MkÒIŒå7op,¿G5R]²~j𵠋ĨtªÄÔPÈ‹ãÄ+¯¸2Ýþ…»ÒPßH´jvw››}À … Y o&¾ù±‹­ å!†Wv%Kп>†Ç™èjá FÍp¡þÀ!Ke9¸Öp3HKàTI‰‹{#5ˆeSù¬à‹CáûíÌÞ~û?¬¾ÿÁý— Mþøï¼í÷/å@ŒµՆėžËÔª2ŸÌ!7¶ÊXŸrtÜe·œ4ØÌ>‘;À2´áCi0Ÿb’×[0Žâ¸'òòÛ¼TÄDÓÒ¥é¬Ó×§“N9)m\¿>-_¶™îºóž´ð¤5i‚Õ’‚>gæh8Æ97@>8;.ð4zLX#o×éµÂÝÿ?<2”æ±]ÙºEØOv¨YÚÒLóÏY ¡£ÐIJ’‹¡qÞ("ðÔôÞ{ƒúêÃo¸£šìBY¡ì|(@Ëæ©ÆÇzúyh¨çêÿöçØþ«oøÅí¼tT}Æö<%Paý§ïß;núì=¿=>YJ¾|£©yÒ‘Êã9yš-üúiÍÀ—9à½Án™†éÊNaFÅMÀÇ’ ·¡l‚„¬0n ,éDIü:³Ì|itr˜±z%­¥•ßvÒ†´é¤Íiqº²D‡sß3û¶¼Û>Æ‹*(wÒ²H¤¸bRºÅ“NÖ Á£½òtÁaѪN0£¯Wç™ï(#X«ñ¿Ë—Ï´³?üå/}IºãK_G±4Œ ¼N†iS¡” ±&8éV²a€¤›GÑØcZ²dyêa. ÷ø±8/¯•·ãD~ÒÕÉPBòF‘×q³g"³ŠÖËòᩨGÏsæ³>ò—¿q­#ÓJ”•‚†Éñ5÷¹ÅÇùƒ34øhuI ¶¬Xxµ•ö ZîKÏ;ã_•ݹ'=¼óÑÔµ¼;6ÿä"ÀRB¹.-ºJÐÎÐIe–nÛûd1aŠòå¡]ÌxܤÔËoð«8ŠA¾u²Ö·0H-Œ[GQìè“nÓ(Ü^e¤ É›wuz±š6#›¨¬sñèDÛ[+;ܟ浕ßrãßßxçk~ê5·<“ûžŠð\†F³•?zÏýì®G{TeŠm–<Ãô¨aZ\(T~ÂóÂ]̦ÊÿNìø'£ G¥«9˸'*‡0<±ÈA¾è"o÷m€ !®ï¯f‰îglI[Oٜ֯[›³/ÜGg±k*,Fy›Œou’ÑŠmg÷˜[D¯F“BäœgïÙªª¸¦ÐÂt’‡“ÈuãÉd:ÊvÓC‡§}{ö¤†—¾àâtÒ†UðUN¾Lù÷úÖÑLÒªmܸ6ý›W\›>ø×ÿ˜6®Ye6“¦ÌTÐpœJ5䢈3m* Aåî©H9;àÁGîOšÂ‰Ê:ç JÇkæåÄjÖ@š_¦:S½Œ¸TÁ Ž@/1ÜçI3”Ö[â´_[y¢½¼\ñà£'Ú|&›§Ð‡8£Hã› §¥1¹èÌétV\îºûé‹wÝðÝ,sNƒFlY1O€æøÌ~Ì!—£ô@­GõK“Âóɺ(¥‡x?À©[xx[õ7NOƒIhòCZÈO¾…ó#Ý~D篲(z7â5ŸÐù+ׇ¢|Égº+LÆés 2›¶í¿žÜ Ù ­¡áô}(··7„“³·ž|òyGŸ©ù€ïä4ꆷòv‰b⯊1Tÿìý:´tq{Ú}¨¿ÜÜÚG{…0€‘ N´¤B<÷0¤¾êÝ"¡ª©Vº±ùÚ«È‘á"–4Ƶ*ïGÜÍ5ƶM’6­_‘N>…É»ÓZZùn6µ°G,ÎÿéY}½µeXo JKÙ?ßäDq* ËR¾cÀb¥Sç`O¢@èEàs Ϊ÷1\œÈÁýûÓî=»1ü½l=íay‘]d,;£\ ¯û)ΰÏËQbÈå×Xú?!ûmWoK7þKÌb3ãm—š'mÃæ¡1Ož ‰LÉ£ÞØUÅ_:án6&-_´”½cÿ»ÃR'­ ùµÅΘˆ"_îÒ¢àFR‡üGðVx[laÎ$½¤„â/ qk4õo²5u›Z§ðlŽÙùÄXys¾C íKv`¤<ñ¸kwú篃½ÿ”>ÎÖcŽ€=ýÔ­zኀ„Ùƒ£mOgœuJºô‚óÓÎ]ûÒí_ü*2Ü<ËŽ(Cvd<2œV.[”Î={Kºå ÷3eÒM[:TøE¾³<¡M#ÕrÕõZ\&œ<‘Lîàp™Îiq¼¯áVFQ—‚qaQEËŸÁÅåÈð£Ìæ°©éYòñ›>ÿW$p\ÝuQ„°Ogø6Px*Üå/ÝäÖŽï|ìŠ]»-aœÍ§ ã‹¢ãT9 `Íž’øB9¹²»©B«2d…È ëaóP@å´ÕL}…F®^¾0]xΙ1·aݺ´léÒÔÑ™7â¨Ôü”ŽVŽŸð[åø“×_Æ °Æ¯rKßô7²/< Ÿ9M~œPÓ9ô ¤ƒ‡{˜XÛÇé´»Ò‘CR•IÚÀe×zÅâùñÎA :°çÞtßý§¤K.:ÖB¾Ÿz^w.ßϽæ•éÍïøã´uã:˜â݆8&˜ ¹…ÊÈf-„†"™ Êò B–­X“úøz:Üs0-ãT&Çù"Ò•Š$Ðmçˆ7#å8®Á"NXðYlLˆÅiÀ8ýuNœÖªZ㵫9¾Á@¼öœÌaµ8Ù”azj—1η{þµûvÄ–_{jƒ8 èÖiQ°¦ûFHsè ûöL÷1oràà_½26üXôÑJQÎtêXÚÎ{ö¥³¶nM矾!}îË÷GÉ!Ý,;åÉ^¥t+Oÿkb+¯-?˪8=Éžlè3¼Ìuÿ¡H(3Pÿ;’DJŠòt¾“±9i()KƒGë«>¼óð‹ÿä/þâÿådáw]ÏÒà o|ãÓ:i°ð¼‡ÏÙÒÿüÌÇO;ÒÛwÙÐðè6¼å¥cSK>ÎÓn³ì|kлænuF¡Ø‚7Œ6Úc8R8*€*D½ÃæuŸhGkÆStü4ÃV~Þü–tòæÕéÔSON'Ñʯb‰n~7Or ys+¯Ä¢€\FøâÇŠr£ŽÝ{·Úº,a·×¾…±¢O)Žãdì¸Áå7'“z¦ÌH]@IDAT9rk߃iÏî=éà¾ÝiV¿3 Zy Äí¶7]Ì D7¬Æ‘á¡Ô¶p]ºî§_“Ö,_•¬b=¥abh [dßóÇ’îùú#iAW>ÄÒ!‰NN©ä-†! J'¿²ˆ.¬ErmkÙÇù ;w=’V¯ßœpÒ’-mfÐØ5SBͰ¬+²Fદ¨Ya-/4ñ¼AuW¡ÀÖ§84 .u8¤kT®UY—×IùM 4aľÉו ŸýÉ«8ey4}òÓ7GôQ½GŽ„žðê½Cø¨Ô °‡&갥ÿFìÊ´`Åb ;ÏÉdnC“¦ tPï/»æštò†uéÞ‡ö¤½=ýÔ¡ÃÏ«PŠOÚµ„:ãGš=êÝ.¼Ã Tý9à•¬ò‰Â[–eÍ‘ 먙æ£ç+¿‰!–™Î“t…Œ‰§2Ëñt 眷!]såy¾ê%?ù•í¼~|ûÓøúñ¹ÝüŸ™¿ú›ÿqý»ÿø¿þ6O¹­u|:È9Þ/O‹45ÃÓY G+n`Ì ²¡ªT9×™An3c0„Ü#‰ùOE–ÒñAð2!ÓD½zåâtÁ…[Ó)[NNëË/]¼˜î¾{TÀlôî—7(À±X·Bh\…`üÓ„½Zùq6ÊØº7aü®³K3 ¬\ ¤[yŽÚÚ½ûÑtsjtˆq¥O‘ñìý‚vò»:` ç䯅3CñÊeN!¦å’k}àèîôõ¯ßÇpã2½wTb(SP÷]¾ ß.½ÙÈ„à+~êeé _y'•?‰4]LH“¢Tº¬`2!Ï™oe¢Ö@Ý] ’ðjôö”[°ŒV’tE—Ï¢JªìyLe•£âßV®ŽÚãÀžÒÀSs` Ùùg‡kò ?‚:"’À¯‚d·`ÃdjmÒ4óÞÇ#DÓ³Ä! òhµ+%êÐ^¢4Æi>b »ÔWÙßÑÝZJK·\†q˜ºhˆié(ü¼âO ®Yº8-›ßšöñn ©É{ j´Coȉ}ö£»v¿ÿ _¼ÁµÌòütv¸%7•s$n( ¼P™*eVœÌ¤¬É`f€k˜²—ÆOåyt³cOÞ[O…6¤KÎ=)|òæ´zíúxñEwlÄ!‚²Åsɰ˜@ÑàŸ à–U¢r+®…õÓ7<œš±p©ä¡«ÔÄÄ ­¼+‡ïOJ{ö=šaøC½,¢0®¿w¡€MKXC§»Ã˜Ê¿ÆR¥O¦ÅÖe@îÁHWJ¼·'M3¸ã›wsº›‹V¡¬(åûÿ=0*ø4NnóÆ éµ¯|qúïóOiãª%ñä\±Ê LPؤ—q§ú…ØB%È$e¶|åjNú&e縵F†,ÌŠpíRk¨VnÌðǯ82R‹ ™“O¶Q…k-œeÑÆj„Ž”`‘n¶×>ë&nÿB8ÄŠ‹Èh9çžÔ™†Óžt­öœN’ã9ÎòcfÞ]œnòqMÝ^MA«ù¢…¦nuÆÊz˜MCÑ#¡('…µLN8èhcRtxh0ÿhxx 4A?å‹SÉÁüª}È ü–= ɣ®[T]\ó†|-΀WŠxCþ-ÊÊ%Fœ—¹:#Ù,·<Íxû¡‡mx×{ÿÿ€ø…í·ÝfQ5H®~€À÷σcº¿ä¥¹ÝÒ\šØ{äXóÚ¥++.UÙí¶Âƒ=™Ž?nž­ŸcGGv‡d»E“6Ì{×pgË­éŒÓ֦׼æÕì^[ÃkºXïá\“1y§ÀNP@™«¿Þj²ô AGTP%=íQqŽó9–zz{Óþƒ8œtwê9t8M $F16^ÔÅ|B…5s[)hiÀø£ë‡‚ÄÑÔð¤qJz×*Ÿó×@Ÿ(Mñ~‚ñžôÕ¯=­à)½VN ™Uö½¿,¨k^xuúßw~)œ–ŒÎ0G _–f¹*­!ßë¢0Κ"KR¡|v­WâöØŸš85§‹¡@¤9v%—Ã2•Yå6_(yqm7·V†²öZmÏÊ̵püØ*GjÍ€„•:skP ?hEóQh‘žqèp}âÒñ¾‡€Øk›™á°OrOAa 'P¶ÈùÔA!í}Y®‘òå´&ú\ߎïE0äUÉœëHšA­¬çŒ?r‚((1 Xà,-àjéQ'½ÕRãÞý=Ó] ZþÏ?ô¡[Þðú×øéšpøðaËg,>¾Ò‚Oݼ¾üð¯¦!ºÃ­-¹ë›x`ÆV-€ùª‰ç `ýsbIF‚pO¶okíáŽvž[Gæé$wãÑòÓÂ#|©×|š„Ô‚xjò(¢jÊ“o!5”°®h-s#é8ݼ‡¦Ýûö¦{™±g<\b³L3]öNÆñÝ :™A¶±Ü\¾‡OÄäc¸F¡Ë´ø*DnÑ,,“cœRPI¢¾Kq,U¼Ðò{ÓÛONg¶9Ó*mÁÈ Ozth/kñ’îô³?óŠô¶?ü³tòÚUÔ‹«ô>(/xØ 1ëÁú &jeèŒíngÅlà9ƒÅ©ïØÑt´°=» §k½E¾â|Ö¯øB•eª²+#©ÁX¤µŸ‰®Ñ•5BHWáóŸ´n~$ã@œQWŠö Ý)Ȉžù—Þt ½§…ƒa™à/ó­|Ã%À‹âRK2\æ?ʧ˜ë¨Ð‘Á<Ö/ó‹GsàW\ám¸6Ñù¬¶¶æ†ûî;˜:Z[þüŸn½õó×nÛ¶§è¹ õ/ áæ2ãb§™ôêžß™¶®]žvì>’Ö®ÊÛek´D+(3ô "[0Á½-cüÄ|’I½a r¢Š—f.aÉ’yéßqWºüòËÒRvæÉX&+|?Gൟ(Ë8C-Þ圾~Æòõ¦û÷§AÞ˽­|¹¡Êƒ"ÍiˇÍM´òv Á¼†çé¹…Ô–^ã·[ÚhmQᢵçB‡=œ¸Oøül”ätÃQëT[c#Î×ヌs8+ »ytq=•àÒ#•tþù¤+/þbÚñÀ^Ö®[Ã@«:±™¥QÁ(sƒ†í··Öcpé_¾j-{`>‡3»c„zò^¹×p¨Ö¢KÌlGdGÊ(¡VŒq9·B0‡ƒú'M9RÅ[y¹Žï¾±ÛdhÔ3Ôƶß{ö§µ,Õ­á´¤ûvH-ôäÚéŒ9«O.†ÈøbÐ6p-[º,ÍŸ7ŸSúÒ^zx¡{Ы\q¼în¿ª­?Ž£Wx( œv ‡Á\¶¦|@,W^câŠÑô;ã¯S·¸¬Ëšé¬ybò*ÇB‡cwŸò€ U¦ñ†Ây“ŽQg¡AnÍQ¤³g⬹4Se(ÐÒÕuχÉyéÓñè0 ”Þò–·”>ô¡ͼêºW]îª ÇÇÆgÚÛ[Kï9W#)$i.9ÉLå‘Rh ‚rÿ7-?“7NÂ9)£á¸–êk›{ûp]•têÖÓB¨†²Î_^piäw ’ºà¸GÓç>wsºãÖÛÒW¾òÅ´gçƒij¤ŸM%6µ¦.&¾ÚZ™é·µwòŽ [Ò˜ ¤{ì¯[G]O¶+™â¼¶ÛËdÔBá¤ü çÀ¯ ­L² eòóû#G¥ö§¯F‘ EþïÂÒ\’°v[Ø¿tɲtÓgncW˜ïµ£wå˜5ÆÚ!}┿²Ê릸ƒ´pÖ: Obu;ôþ@‡“yøá‡-¯8ÐóM(AÍÚϲ Å_Ì ÛšË¨‚‚ã˜á×ÙwÃÕ»¶îòÖ?~ö 鱃û0< ø(] žJ°Ò šv<²;}óŸ¿”fÆúÒ2ð®\ºC3y8'÷´âš0÷ù7cì­ìækëìä`ÒöèV0~€t5;Q¨sÞVJ#—F6¹IU¨¤è<ÛªJ²Ê/-ù#>ÌÔÊ M蔦{ÿù.f´áDTŽ,³oåNqÅG¥ðþ8Îu›ñæ“7¦Ÿ~Å‹˜¸<NÉá=  T)ÀÈÍ7TŽÄH·Æiµ¼Þõ…ì’d'õÓC™` T¹S\þ@c´\ *‰‚è¤Éy Ûl[rÙa›Ulš†n:·Ü‹MÉ.1†ÞF˜Ï?€X>ʽ-sɆ®~¹´ÖÂNÆ==éá=Ó)›7¥S×-gr/ÑÊ/JÝóºÃ!±?d`°Ÿ<£¬Nñ8÷×ìϘ¦•cÅÃàéU¸€ÓPþœÐHpù’δnõ zŠÒ¾ã#ì¡hêÔ§ 8Ì'„Èœ´åÖÛIS?O€g¹k)Z±¢Ù{e@ä9ø•s(Ê„<ä%Æ%ĉ5Þ†l컇2™2ñÐ[ 7¡ç¹ aH…Ž–öJeǃûÒï}ëG>ñÑ‹¶³IÏ{òÊý)†'dÿ¸Š>Éî6=ý&öc?´“§«xÛc¨eZŃ6)ŠÊv¼Ykרx Ô#§ìA…/Ñ‹ðyí±ñÑÄð.ÝùŻҫ~z ,+œŒO¾ƒw„ž˜ûo”OºOŒÊ\Â]'§†‰^”›ñºA¹Î»‰Æ.~Œë1LçŠe„‘S®dfrI–›—dH¨¥ eòþ½~—sÒà·‰9†V^ZÚèÑôõoìàtàKÃð&—W+‹ã‚éé–#œi×¼èªt+gzJ‘OS†Ã¥»sÙÐ |×çx˜é*—Ò¶bÕzöpŽ ç–Ù€ãCW3Q_ñ¨”†Pâ|EM(G“¼ÞD1Bk8ÖòÈÄåòÉ+œÃ='ûœWñuK±'€ÞŒÝz_ïåcãMt÷;عøµ‡Æ8ß `mÈóîû"_{œÎd‘ƒ}ð±+íÅQtsH‹‡{NrHƒ÷µâ–/E¼Ð-ö´s\Ú(ÎçÂsOKƒƒéï¦ña?´ilVð2CVÄ;±«]NvA§ó!Џâå"ÒcšNÃ@rè ¿ê©ñÒ¢^jøs$Í|!SaL"·”‹ªÐ³c6q)ÛÔÐÑZ®>ðàJGWÛ_RÆièìN –ñÅòýˆô²—½¬ìá¯zÕ«/Å_³ÿÀ6ù”œ5vü´ûà±Ô…•Êü§HªQ*‚·5R3'á #Á“äñW¾±õáG÷¥‹Î;“3õ(C…©å«acäãb.XŽ!ÿr°"“@GûÓØñC1.tSOtéQš’-;¿q&Šî®²¼±#$eƤþZ#\š£j¸­•üÊ}QÁVA‘ùjªTÏ>N·õÈÑ!N^ÃéÀóP²?€‰£^ëÇ4efk;~;=š–ôwŸù<ûº¢»ë©5’õmùˆÈ‡d}M"s«i6ó6ä æúéubT¬·SNll UÌ<) ‘Û"ÍË“_C6ÑL ¦ òÇoÓ'qQ|D h/¤Ë›ŸØ™ ]ºÏ ŒWYKS õö(½žV†[é­Z±4†’=´ÚÍ8‰k×q¬Úiã¦Õœ3ÁCS´ú ƒzp• :à𮕥Ï6Þ>Õ¯éÒ37ÄÁ+÷ïx$gÿÀÆ*ÎX°{#éÈ@±(}1œÅXw¥2•~é”Ïpû!sÓDõ£GDÖâůc8Æ„à…/¸(]sÑi<0}y¥Rè¸fãÉÆ®Ñg#ÈòÉ2Š2ii]±——¥ËVG‹9Ä$©-›­œ¼DwcÔíÙUI öøÏÆ@\”œ‘ÒhYŠ+Àùõ:÷ Ì-„_þÕOI޽µ¡¡:b½¸Ì7ÉáŸc<²ëûÿæÓã܉øÚC»S+F|ÍÕW¤×¾âÅé´-ëÓå3|Oó.áyµiÛçù p^/WæSbÃOF¿ {QÚ´zeºìÌ“Ò"÷¾ïÁ]é±aVƒ\]€ ùŠCФœ‚èñy}‚Ï Äꀾk zÁ:"suøtòlºØHµ¢À­4Ã1‚×kó†íPŸQ4¸×MRÄà ÉGœÝ‡¡^–Ip[sè#ô4µ”÷ïé™Ù³«çúnü«ŸH鶪O ú}…ôöö*¼bËÝǬÄò’å+g™Xá¨öÙtƦ•éÞ‡{ÒJ&“ìRÇÉ.®ºÉ„Ì®ptAÕˆ· “¡r)mßà‰5ǘµ_Êášÿëæ;9犴pÑ¢h B¥àÞ|…м*ÂÜ5A0 ë˜h{dÕº4Ò³3Öy=ï͉"S¨hÔƒÆL§±ŽiMº•x YxZÒB›§Æe OÔ©ŠZN‹ŸÈcHÇ’~(Ï1çÂå[PÂÅ¡$ª™kžü'Èà+S®3ÊÆÞÆž‚ë^ùòtÇ]ïd[oÝRžcÀÑ9^¤á# h¡x’’ë%wW©È¨H7VùÌCSZ¹buÚ»“i¬0´e™S^¡]‘غ!=°OñÒ—·‡`ó#ç Ž¸”œ )9_þ÷ø ¬r™'óºTœŸÏ§ç4ÊxÐÊ‹e[1Ô~´úÒ7Nëx§ÂFŒùÊË/§uo†ªŒó÷µZÎzbâÉ¿ôîw¿{àþü9pt­Ût2¸޲Û5;w¢{ÅøÕ ’!.ùš‹òbN9>d€7t ë>ü6–Ív÷ŒðÜ÷fs7ÒµÕXsk¥˜±‡ øÊNá‰qè›_ØaÄî¾–ˆliëÍGE” )¿¦ÂøIŒz#ðÚ‘^;{no€ñXñø§#3ôpHsûË[S³(të´xåæ´õôóÒÅ_–¶œ´1”ÕÊ5ÿß1´X¦AÚ…gN6-Z²ˆ‚FÒ_ùf(½,-“jŽ@šjˆMÏ œ”J«¹àãVÖ€,V¦ÆX qA«õDO ˜„v_øawÛqw•ž¨ÌÙ¥·KÞÇvôC½}©Ÿ‰?W ¶ò¬ÈV{ébrp!Çλb²ŒFÅÙþV ,¬t0íg#˜§P§V|Ð_wÇ1;óä¶ †ïpHº¦°zwŽJG ¡2ΜzÈV9&æ‚‚Á 'O¡3Ê‚¼B,ÄÎC™rjv\NÈ8jhCI­CHŒ\ˆ˜SÌgª£“3óŽzlímŸû_ÇŽµé§ìN,ϺžyߟýÙgi^tÊÙçU¯Wîey­ÊÁ÷=ôhºw/B^H¥Ñªñ’žÉ·²u°›1\ë]‚ñX(—c,…+›b^Áj~÷Þ0/ýÞ[›—†v1[]3’9¡Êh6HçÊʱêâ§Ü1ž$»õŽ/¦á£»Âã?^MJ éÒ àeG>¡„Æ‚LƒÖk8`•r(±¿Ê®€³ÂåÓîáÖRâµæ¬>pâìŽ[Ì£Ç,¡²ºÇ¦¢gÜÝκµK‹:¢ž4Oò¢<䢸Oþ7þÓÛP(ŒÂ±*“›§ñ„,2}¢PÖ*sîLò˵¸£ .&˜Œ}”eÓ%ËW³6ÎIIÔ›y¢¥—°ÈÇ\¹eâJ4Æ‹‹‹lüªqNˆú°Ä”ú@|ͳš& Ù¡ƒël^:RZ8ôÞÀ›zìnÛÄ9tkao—Ün{dšÇ¹‡¬TY:â åp_âƒ]:eËwʺ‹zH›òÄ`tÒF‡Á&ú¶ '‘mÔ< Eã¾àÝÆ ¶0K¿¸ä˜ëøƒöè–ò‰9ý!( mCظQžÈ5œ%@…ÌÂ1D^3hä¿ò X~srÖCHÈ+O£ãSÓ§œ¼ª|é N{Ý¿ûùŸÿëíÛ·7ñÁë}ïû¹ÀÝzë­e÷¼î5¯9…WO]ÖÒ±`¦ÌºÝ±Þ#=¼ƒ®==º÷PxIà0/k6¬¢ò€7¦ù]c&Ä`åé¾|ϱpϱ´eãR&t6ÄL°Ê`Ö,NoòxB˜‘ê]†w#ûøÝ°qðÀ–°l…DÙüǘv®6"_™.•@1‡ðÅkQs©Yw£ˆsÇÚ[ ÙwÄX©+Í_²:mظ5¶õ,>§s”81-êf'âp†•Ïöc¨Íl=µ•)œH­‹š RTñ%ŸÅ}Ô3Î’wñRÿã7Ý‘V-[ÀjMîDk* X®ª«’†„,,äϯq^cn¹õÚsZj‚A—Ù"/ΑˆŒ'.MÈŠBc¶|_øÐ,%5@YJC8Ÿ#Ÿ5¤]«ˈ%3`bîB‡†ÁÇðrb=_G‹þyÂo8‡èàлIΉðMAýÇ» ²^è»}ëPl0ƒùŽ æ¯ÆYipÇà 2³«ótRÔó|eÎOyFþšã‹ú’ih•l'5ÿl‰!¨H5=tò¤3 YÊ?r riþ\WÅL Š»¨{ådPndWvæÑ»3 Pe/zW#llzzûø¹æ¿üñÛ?ôú×¾~À]‚ä“¶'ÿÊýyÒŠ½ º»,b—^èÃ)Ëy³ÏÁ}{s8xXŒ“å57©øÐ­‹Ûn-+vK(nç~)Š*øB Äy—ƒ-3 Ê‹Ó5)=ò~t°K¥mbyÍ=óÔB&_Qnž¯Pþ´¸Z¦yh`Ýr|à8ÆÃ®É¦E(.iµ¼Ñê‰Ñº .ròÆ vïçÐÅ50sCÏpÁSvÏä ‡Á}QÇDÌ9â›[±ËUvS0F¥=[cég/¹t76æ§;]Ö•±”¡Õ§(ciчP¦ØÜ…•ÄkêpÊMÌGéØ]pN NGB”cvd±H²Ôˆc¢Ô´(Q,NÐÊ.×\f)ë"ž?àbÒ•¨¢nâ`ñD&ðÄä+¼—£å-/o‹.B>°„ýátJMØÃÙó>÷¿¾ôA`^üTÉ”“cn% RÙ¢|ÊÊîr ¯ò^³fM ›(x'=.ç¶‚<äuüçVzñ û‚}œq¬‰—wÜç~nÞ„3¸ëÞÝéî»ïŽî»¼©>ïñ¯¸§ˆøµÊ3\MxܸãÏa¼o Œž_+)šåˆ©ò«Ä…wIhš†Çxqe˜¬Kë·^”.¾êÚô¢]›®¼ìRƛҒEó³ñƒÀvëŽG{2…p­ª¨äZùÞæøÈ¤ê¯"]ñU@jÀÔ eùV¢ŸþéŸJ‡ú8«YªÀaø”2‘ÕÚ_8Sñ(0ea¹nöBÊ<ðléê4Üw$ZXûfᔿ¸â-ET`ÌøK<ºVûdZ%:ŽÐFòÎXûqüÆ ‡*Èœ’kJþiÀF™+í½„öÅû#Z[ÚYéÁÑ2«ïþuFT3ÔѬ-½;Mi˜&Ø4Æ™ £8²±‘Á4ÉÜÆ+Mv÷íÄPê§•zê`i»™•<ÛÎÁ!¾çq}žŒÕ€Ð” WÂÄ'÷ªbˆË}æMYI«A¾Vă5Þ”2,x÷’AÍõ©s°4—a³ 2ˆp¹žHSÞÌq kÞÈÃua_þªØU…cѪìîù±?zï{ÿo g®¿þúï¹*0×(VØN¹p¨ÿXjšŸ'üœY¼bM:À>í¦ÒxÚ¼nEú&3ªË“Ý}‰Ê]á@hTxöZ!TcaZbÇ“æÓ†7vwàrNÃùÔ?ÞœÎ=ï¼ÔNÅX4à3„ lMx9 œŸ[7êÅ‘¦]KפÃÒT`µÊŽ´±*à ÉAÌQøn¸—m]ÀÛ± êx~1-,/Ú`©Ñ=ëârî‚^îÎse÷ÌVÈÓ|#D9¯9*¸æ+Šó‹P#'.Šk“T&ïs\ Xe Î`Yž~tÊ©§¦×½êEécŸ¼· /Æ1ä™ìháUJ¬W'§ä+†)ÒG‡ ¾¦Úu2gÑÎËJóâŒÕᨥ þ A\V–õ˜»ÄYù¬B)4U% ‰°Të"—ů˜—d 8 $ßÌé†UçD6hu)HgæÙË\<›`y1¿^.Á†c`qV'!£réF‡± LÃã`LÚïðÁ­éâ ‚(WšCG½ê$B^ý zã|˜O™ªf‘C€£(CµùÔv¥)ÒŠÌò–ˇÆ/-1l®h°¨Ö虺T­lBÎ5[‹^“DpÏwÔ“/}ð!j¯¼çï>ó?o~Õ‹âþïõÀМ ;õfÑ5š`9¦cþBžÍ.Çh—¯_›vÞ_Z¿zYÚ±÷±ØÐál+„kPÑM!?bˆŠ ‡ e0äzvL„”œ ®Âˆ*Ìšûªf&_ÓîÛ“î¹çîtÕÕÛâdX•ͪ4¿8ó2— ËŸIˆ³|ð¶²)Ä…/ÙÇòãè „DåH§cÄL¯•j_³ÈK0ú… G|»ï -‹]ÈØ:Ë0ÅÐÊÅMEavfmѹ‚*ãæ›»;Ì'æ(îŠt'a_ö’—¤[nûJŒY• /— ‡ì°Eùd%â—Ö%î)(ÇY†/Òp@¦cà5eœ&üÈ£¦Qž•ïìôE™˜\^¦Oh Œú%Ÿx¢,Õ`^Y¦Ö#ŽÐÓPþ9ç$ã0ÎÁ;†Ö`L"Ãð‘8}eX~= î¢Wi6ËrnǬŒÄjްÈe’—ˆX¾æš›²L`rˆ›HW07ñ ¾ìáDû.‡ÀfÍÛ}k×›¢3ze–ñÿÚÞʯ«¾ó¼’ªT›j¯Ò¾ËŒÃš…4¶ ™¤&²w'dHwçäœéžôr&žéL÷9=s’™ìLÒÙŒh’lŒ1¶ÞWÉZmYû®’TªM¥šÏç{ß+Éf3¤çU½ÿ{ï¾û~÷wÛýÝ]Xf)ß·´ ¡ÞÅ8IaÈ;þô<Ìc [/Á0î%Ë—]Ú½ûxÇðГDÔ7}³ C‹€øÀÒøCoÛ›ÇV­ÿ.,äe¶Rf ÚPGÙ?zˆ‚Ò×êÀ±34HÙ€ÒZI zü€PÉÌc~A5®ïxN‚¼ýÀSe¤€}ÇËw½éõéÆI ´È·Ný­A‹iñ˜ƒ…D>ÆN;“gNaõ±,à.1mµŸ†”ö¬)6ßÀ„¤›9o¤o3s؈¼v1qèóΜEðl‰®ûÚMTò,Úô+†üúÿ’³Á¬E¯ÉI ­ßU8 ƒÏ^ë]nšŸÚ†K7»Ë†˜ÒÌÖÒåÃ4®[9ˆg`Ýv=%Å"@©-Æõ´¤ô´jÐI¿ºuÏS§Ž²Þâ»û(C?×—-Û6gFÛgyùZ@ ƒ­þ!uROCAŸÚý´t#P’Äã…oÒ3†”BY`[©ã*ˆ˜êÅûðs1ЗŒi`½cÇ&–0¤ú–_þå~×/ý‹qàëõ ,VÚEA&¦Ï=ïpÌžþåKÜR¹›z¯ã³mY]ɸöý ôË™²9^v¾pº¬¢qE¤Å!y$ÇfZfU«&‘yã{)lT´.}×LÇ’AË;.3âëBe¶Ö'î¼§|Ç^—¹àÆl²å±HÜÓmï„¥ ¼ž9åo»å-”ä§ÿM½~x¨öï,«ÎœÇ­Ÿoêö]4Ø9ß>S ìâfO˜°1é\I©IÐ÷M xÕ¸ù ÷‘¥+Q¿æÝb~x›ø ¸:ôk|fBœöe¯ Áñý?òÞòÿé/7l^‘ÕŒ]îËÖüKôª"Ø*U0Uì&¯&.WÓµ¹ï…=@ÞèÓm®‡Ms5‡òÃRÔÓ{C%|­ŸƒZ“†dKÝ_< ãÙaÔ–˜‚ü6ßǹUÕö»žoý.m„%Ü+7Ò«ša#K®qýHI#äÛ’žîŽK;öíèÜùûàûZÒ¥ÖF]*~=ªn²pÛm X1ô?öõö þR7¥ƒ]® `¿ìéŒìeñcq³-5EØÌOò&+¢H-õ“TE¨U€¸6ä`° +ã<õüñòšë7”-[7¦ .*­)4ˆ×ç7!¹ìÁÕiÁ+é®KWBtòĉLrÉïÁ~†“Ö>` €£ h#^1Z|/l Š,â’sQ¸ hŽÊØö©^ ‹ÎWíûÖó }x¯0Ôw­Xµ0jj¾»*™ö%¾á¹9tˤÏOO”‡ÙÁ´Ù^Jÿy¾¬k#¾D•µ!Oh–f–ñµ­=ðÍ(§Û±³}·ÐêíˆG¤gWÝø6Oï YA'ÒL0kÐvèdz<Û Zå7 *˜ã7 ó½@—@ÒxËQÛ+Ú¬Ϩ*%3Õû$¢a‘)Ãêw+?Pc+/´ù¾"O“ž<¶ÍÊïÛxí}«„ÕiÞ_u‰ÁhŽk€GaXµž8'¿~Ïmj „ #²ák_ñX{oHÍñ5ˆ/½ ‰ÆÐhÆ:/Y·ï¹g§î½ûî/B¯¯ª ˜ßÛ·o$ÆÒ¥ÿŒÄeªæÂ,#Æ.Óm+ª£ªÖ®ßÀ„ æ×ÓuÍú¶ÛºÈ÷2QA«³.7Fáð4†È6¥¨‚_U¶0—Ü»(ǹ “,ÒW>ñ©Ï²ŽàÅ u•Z ˜C-êLºúlˆj,â’\9Ïâ {_8·x€Þg4n\»’Îuh!¶%àíŸÊoe‘0É?2' ¥´øcP{†á ¶mó³ Èûš£Å æ&àÍF{6á‰M`þ¸J…õoÿAŒg³Ó UCÇZuXóÑI¾tß“'ùÊ·tŽ¡|NÎ’w¸éX(™FÇ×Ñv.cò‰Š`ò(´¦¯+jº-­ô^Ó"·”îª<'<«o€ÍÈ:ºÉÒJ%0'[ƒ—4Ý\Q p–w@«0€e)eÇ’é«áWåH¥T®Ì_º!„x ï»(­ß–ë#¤˜¶ šNKëÜ%ƒÒǧ¤Æoý“F6MaçµøpJ ‰k‹£AÕ³ â½D¸† ½¦†´®Àl25mˆÌ}“Óá¨^ °†¿òRÞUôšüÚ¼Q¸-;@Ê0þ_ù›{îYÅè@׈?‹¬ ¸Rþí¿ýO§Pücš$º¿XS~R×O£A͆’CeKL9ÔrãÆÕ´Ø3‹FA­Q]TAEç%…À'¥K˜!E8¢ôZD™Æ[°©VL3k®›:ìýï.O0‹›Ó ô¨ßE¨¸mÈXW~ ­‡ R`Fâúª®MÃà(Si9+#Z…ÆmþÂÄHs5åšú•€NXû. ôTz6éQG&Ù à¥À®€}q:‹ÀeíÊ{Þ™[KfÇ-¬Ý¸®üÔ¿»ì|l„Yo´ÝF™|§JÅ—*i ̼èšË1çc,§þ?΀§Ó¬ã8Gâ°\óç[‰'¾‰ñå³kÉ®NÕöî±®´Ÿ /âJ"1~‹ñà;ᎴñîµñÌ[eN>í·iõ¯ž´`å—˜ŒKy}›(‡ïjp¤\$À«Ê¨¡æÜ«yç‰ôrͽϤ',¢Dž'ñ^ª/‚ââ!ñ=¼^}&ðêŸ6"a¦-.ß{ë[Øëšrš¶”úƒ.±µX¦d‰óB<òítÜ*|Ð|e‰á$Öß0ÍÖ NLœ© Š¡q¿ ]¤§Âæ7ùÓðÞùóÕhHª”œÒ¨Y]Þ¾;˜h™ÒK:ò^Ü„`ÎʼnGâkÒ©)Oþ;ÞAܵ*I¼*ØÄ¨Bפ‚‘”ÚmþMËXQžÜñà3§tpÚm‰xoþ4n.óæ7Ž:LÞ!Äe”P˜ÕpðµÏÕ 7Üt9xó`\Op˜Koõ¢סƒ´5Üz~:òÿ‘cà+YÁ8Y¾.Dxƒ—–»b˜p9rôÄO>|¸÷>¼hÇ›z,¶øxã7füð½ÿýßÛß?ð:ê‘è-«´#aŽ—îf¥×X³-À gOŸ ŽÝ]v=w”uøX¢™’\BÉ›êè€d2=³ì³)ÕL†dàÍW,Ÿ£ ]Žì™½GÊ«oØT6mÙ@H¦æ ¢9jNêo…Ò¾y鵉™ éWD^)ÏÉÃKßx%\üµ….ß]cÎѸxâø‰r”®ÌãÇN°ïY<'<#Òqm‚Nâ?ˆ#%š§—¦ò¢gÓkÄ¿:`ñBûŒÕšñÑ‘òᦌ±ÈŠ“¯új6« ª4íGõÆwØ0L=1TA«½;,œÉÚ†®¦ãøqO©O¤àÏÇ~ëç|„*Î>5¹ã}UOÞ©¨QVpmò_™.° —ÁÃA/þ©äâפP¯mÿÚ(ÈߪnFW¦<"â+«7UAyOÄšW•‹—-ž–´F#¨­ÞxoOC¸Ur/¡*ÿkšá¿âê=’ï‡9ÌÛâ-75O-üúÊo‹xhû4…Ðëºl´h}×lÜÀf™ûX±¦¿l]3XŽžœ,ã`ŽàJ†¼ðgA*ìHÆj£D0DØ{`/c¼ÁésÊõõO0:ðÕ7ߌ1æ÷"Wä¦9 ñÑ„˜ÎK^úh)#©|)Fõ.—†õ£n_"ß9øÄãÌ™³åvÞÏVbG.§h·`b–!ëa.ÀØð «­+›·l)ëÖo`9.TÉxqúõ) ¯ú©D½B;‘2L&×/R`O…WÝôšòÓï~[ùÈß<À: #Œ ¸d=A§ä‚/ua%„Õñ©wxKDî‡×gYJ|âìIÚÖ6ø&Yàá_úå Ï-Ýý¾bv…W¢Ú†{gÉô Í æI™ÉŸðü€çÖ¤o±ý(ïüVcR½Ð‚ø‰9k`«I5AB{6,µ ˨TaXñÜŽ!H•¦¢L8~Ù–¢í½ŠÚØâ5¸é?˜V‹¹j+Î&)¼àÃËÐÛgc ‡•<ÜÙƒå Õ€<ó“o|á¹Ï—‰ô Juð;dдtí=-4…/µä ÏÊ¥ LWL…¡aH#›FEóÎJb"ÍÓ†á& àõ{ž…ÅiÌšâå+~š»y”pžMσ—ÎÂ2Ì4bœ\'¡º˜éÂÒ³ª'ÎN|ïÑ£Oô­^ýšIÒ!‰4¿ ¡oûÛÓøŽøþ~FƒýlOoM6H“ŠïòLºE2Ç‚ðèÁCt¹rËYf–ÍPf2N3îQAÔ¬ŠpP®"‚ …µ!\!&3 ‹KŠ2iâÔñò¦7½!ÕŽJPòÛ@øo÷‡´Å$XV”*Ô ígîk2F7þä‰Óå¡¿R|èáòôŽçËÞý'ñØû€E;ÝKQÁÔ8aƒxjÀÉ31“å,Ã$ž”‹Q eá Ö¥‹b49jðHŠ‹Éûîª'Nƒ_E­FGâ!8Bcg?KŠè_(ƇIË*vž÷iÄ–y©BR ‡šô¢ Ü›=/Û¼oW0D؇ê1€|RÊ9"o :g 6VݧÀ–”ίqüŒ‡¼@žÃ‰È…eEñ©ÿíÁ¶º_µS@mWàìå¹Ã/NNÉp&jãÌGÀfé#vñÑ.«×¯•.xÌ*£ËÐ &¼â¨¹3)cb±|æ-SEÒ¸9É8¥fVgaM½9æp÷Ñ ö‰/Õ Þ¥Ç£b(&I×%ˆ2\OñÉë¼7ž©%E^ø$žA†LÔôðªhy´1°æ¹…–l'~kÜÓGJΆE\ ƒ’œÐ®¦²k4ô¸Â$•]Ü Ï ôÑî˜BÛ­îjÒ,ÛŸÃtwÀö¼ìôu¼?';ee#âá(óÓn¢süô«H¼ÜsÏ="Ì«Ž¶+ðÕÃkN°ÎÚ _!ÐЫaÀ&'N¦ۮ«kEÙ´y[º×VÓµqåŠ2ÁÂŽ6úÔ+ùžoe†62ýÀ<ëÊ(“qŒÆé4dǸîû¦ñÁòIÆLMNÞØ{?ðá5÷5äªß–ð¾êh¿Q@Úû«"R/â§’^¸0•ÍG&XÏðÁGöȾ(·%¥sÀÅÝE&4`NëeÞ»× 8Xúvà¢ON]*_þÊnfAž)?ú(]mVmD¶¦¹ˆîÕx]õnñ}~Õ/t&M °pÈÿè»Ë>–ÃZÊ  ǃ8–ƒ9ãY|3@ÒÔ¹_„˳üU¹]]g9}±+ÇÖ0O€5XJKù¬ë V…”Q¾ÑÕgqv„Ò’™ÕÝ®Â+¿]#’Í¥ÁÃ{e=9Z…«²€Ä’ù«1¨ãœÄ„2À´M'Ù¤a/’©^ˆ™1?ò6uäV",Ò»~o[Âk?æÁ- mDˆÃö¾ˆ#á jÜúe¥i$ï‘§JI“œW=ùÛ" km±7„YŽLÉî¤ÈøŠÄ#Q¾Õ(¤JC|ßÙ­kf­V3ª¢ÌRÌÏÒ ow¼<—Wuf+o1óÀÕA/ž,̰r+A]k¾ñ‡£Íg"ˆÜ}÷ûÞ75}iö°8PFpQ˜­Gº’Ït™½p6ƒœÜ3ÀÊ«CŒFÓª^‹pš ¬wh3/±$‰ )xa3 s†’@€jíȤÕÑÙM+:«±pÃ÷>YvlßÑx€]"{~ÍÃt›“X_¥6<] NÜ+Uy65lQJm79eC†ô½w‚§.wÝU¨ºØ&#^)ùNÜ4† ´Þl;é*<~j¢<·û@9|è`Ù½kOà/~ÃwÉ’y ¼cŸüú®É\KƒJ ¼æh¼éæ×”_xï[ËÃ'è’tí…CÛÊ^ÝI0‰§i™_n¤M\Gž°¾Ááx1,¢{Ù–òfP¾K#½;ûýýÓ LË÷+iø†ÜkÿvM·æçº³*q®fXã4H¸6~›À\¼‘Uμâ‰%6,ôkñ¨ïêµò¢Þ“|¸¾r nµ_“ô°:)™¹/"‡¾<´›°å’îqÇ0Î œ®íáŸ<Œþ)ï¥S¾l©î"'òG^©kžé¢ä]º`á™Ý¹nÆj=Åy†97³s « (ü?»À¸’Ïk{,¼÷½ï•Ò2a¿ *€sdË eRä¡Nè]Þe,Á½~ãV¾X`,ùxY?ØÏ2M¬Øø¥X&̆Ф i¥c,M€âZ"p’i'^,cxîR'Ø*jåH_¹ë“w³ðøHa¾« áûdßð0ö•£}òÓösqkïc`¾/^œ§ÁoWòõ<]žCl;f|Špû­y±ëME»D‰;O ¼ëÜ¥®ä&¸OM³ä5ký?Åžîn³‹†D£%CÑød/(TzUlšW‹¨U¯ ÁÇÅ“·ÒR×sõþw¼ãæùñ\K.=lŠJ¤1|©¢Vé)ðj$€ƒ’uƒÁ»%ÌÓXWNÒí;ÅPáx8I—ðM _ˆ•ãÜÉo ǨT9H]5´&.0¢R‰¬Òšaš‡z_ó&Ï̓qHK¾4ùgÈZ ´¥‡%¬0ëQóX-UùD:qÀ·Ü†ßó¶¦ÃÕ&½‹“ÀÐÆÜcá4ö^ØPØ.ãÛ#fIú¨øügV©Þa}Œ^Y=óµ†É*N–§Wé3Š’5 €=£ò£øvË/XÕæ¼ìçLsFÞPx í9zðæ  F1^i_4…0¶Y¼â>xôçêƒÆÐɥ˟›aµ•P)ƒIâƒI0 ³¬ÂâL@A —AæÒ;´öÆk×g7÷áZT“W*d8k÷‚˜¥½ádHns5Žihüs òz#†ú»ËßÞõhyvû³Ù¾«Â D)ÌßÚÑ`óUÅ«­pÕÞœc¶à Ï*§Nž‹{ìÎCжKqé3P4*þÂÐ…V l™Ok3 š'½—‹T\¤ðÄñÓË N@IDATeÿ zK[€BE¼ÅÜpóUYóe{~ö5À×V•.QµØ¸ysùg?óËÓ»Ù«I[S€J%Z óÏE¥‹[ Íí»H=S¾YÜ ðݣб–8­·X£ù«w 7üU#ø×ˆš—¸ý„«|¾@7ªÀóÒ Lôñ Ímâê¶;8 ò¶Æ@eö;ã™ÆâànQ,ûj<Â×įa2ב¨šÁXsÞi Úaº„Š&ßA`É£((u[…ã(Å´oÇEH6¯Â;.&…¤%á—å1ù7Ÿþi¨MCÔ•­ÞR”—Žû(¹Ó˜í’ͲhQzL¥…ñ, ^¶xß]‘Õ9ŸkŽCifžÝà…ÌVÅ4oÉc½­¿´åèêY¾ojö¼L„}ÿ`ÙPX&̰x„!*C'3ÇÖmÚwqíš•,[Í@!ª f,\Y–BR‰¯t]T­ªÂ3¯R âÜgd „s¹æó,÷4D½öÎO}†:Œó`Z¾W@…àß·v$½`àw—öΫðƒ#¯ÜzêÜEPιxIX—/¢°~ ÖgÛ:­£Éà\ik¶«‚¹ñšÈ› åy†5ïÏ2ÚqÆÅ.%MƒÇ×ÊamN[CÀæ¿­_‡èÀRA…·¼í¶òݯل'%î,Ž9›zzg_Ï~xŸô[ H>F`uq5æ–®®|ì<‡†/VåßXjV¥§Ê‘¨ïÚç Ÿ•ÕpT¥P£Ø¤Ý¶v‹†Öc¢ºVBîÈ‹m/‚3e¿µP©§ÏÒ‹_¿âÚ«r‹«‚/ìôùÇ.¼Àäh¢gá)|ØH\ &‚ˆz==ƒ ¸âf ¦ròξê÷.ÝîÀ*»b-Œ+ïM¼.ëN(:D£ô椕0›‘€¬c »Ò/àYò^èèðž3+ië…ÂØ?øü,k¥ÍÏα"“('~ËÛ™é Y{ÍfIƒ™w«Ø±•­§)Ý®g\Ày”ÅÖÈ0/¤Ö^[ €WXMªwÐ ˆ1´Ød7 kÖWpž*ÅØÛc}âËeçŽí,º ƒ4í'ÓCLÔ¿—{Àó5W€à¹ýÚ0Oàq•f.FØÀg}̡ή$;C‰ËÎÊ6¶PÏc&¦Knlå0++­`±KÆíøÔï`(«(Àh’mÌH ™¬‡éqVYƒªâ#0ø‰ŽCP)Ó®€Ç±Òd$¼†ˆôc?ù¾òðsÇØ‹©Ûàp ¾:0Qï¥R\>yò=gØu¢8 ¸Ëñ††G˹“Ç(•¬Ž‰¨ê„+âÜËÛš!®Ü‡ÆÄ#ÇÀö$\ܵ: /6ò-£ôÊ·¼«®´_û•×ZÍ2,–©Þx]‰Њ3Äx¨ ±Ïý ök`ÿ–o_Ã(Ãkʺ €ƒK¯0C[ÝH·Hÿ¡÷¼»Üuߣ£Aq`ûŽ[g©ÖÕA-ø‰/"$%RÕº¶¸ÓÍW‡ÇÝ6ž Y]W£goˆl´dtå÷ɇª@„jœDM©†Å1çV7Ý3ª‚’ B>7(pOÑàæ t&F^F²R‹|l’B c”ÚZ‡Nˆ*m ¤ŠMêø¢Y xˆáà*.*žïU.ÿ"?„Y2›Z IðâÊ…W©5˜DáÐ銧C€é1ë&?Õ°^!w NqœâA~¸—×iœ•.>__ÉS§f¿Ês×_ã3I\FqTN7!^TvÃGGGÏu.ë|Ì'ðá¿&š8"b†pe§Ï³¦<‰“¥coÙ°‘¶\ÏMLQe¿ŽôA›ŒV3X™AÓÖÍ8Àµ†&âseV¹6œPY`/¸IJά؟þlÓÐ^¤¾ÆaJíá}ž¡ŒŠæ±¨ôõ‘÷üñNÁ#K9uïϲy†J7@ë¿F°‡•t]ŒcÒ~U”ØÖuFí'¯Óg¿¤¸äh:V!:Í(B‡K÷:¬zô3ë1 kìplÞ-ášÏ‚‹xèöažÁoüáÇÊe«CxUÏ9Í~y;˧î{°üòþïO”?ù³•ø‘_*»ã£æfÌ\SH¬žlÞ¶¥üìO½›]™ÀÅ*Àne6m½2¤ƒ1y‹"àÁˆ¿:%¼O~øÑë©Ý‚ŒldLF…pik¤0§*à£ÆÛ©7Ï}JBxîŸB¹ÑÆYãHPð5ß\%ˆñ=TiC¬2ÔÞ¾à{¿Ôè™~äÔ÷Æ•¦ÆWÜL'`ä±§¥>ñ­Ó“_  Ààê .éàd#•¨zZzu–¶¸Ó¼KÏôgy—ªIÜûê²K§9žÓGÁ·u>²Þ@´œ†egcóNü êá›tñ&ð% šÀ®pVY°añD»uí­ÊÙ ÝÅ:÷Œ´­'Ê®©®@Î>d·pÅ3¯ýë€r¹ýöÛA¸þ¼ôøÜç>—p6güŠj (ÐÇ 2 á¼ÕÚâ85Íì¸%!ÌXÇØq6v¤tܺiC„ÙÅÌpÚÅgWŸ ·µE~ˆA¼Î]2íM•a‰éR;ĘÁ‰eíPo¹ãÓ–=ÏîÄ n‰Ü€xØðúPcHW~é!Š&Ü ¡°áÇ’T×}âüdYÃnX|¤N ójÚb"|ôw`ã‚ñYŒ™TÑ}šgóˆ’Ãg ÆÂg?ö^ØQxø¯÷cÊ3­õ苳C³ÉÆÑiôzÊ‘ò×ß{ÂÄÉn:§kô¤Nžl›XFÆý蛥¾ ˆ*¼]„H>žá,ÕI zfÎ`Œ]Åê²ôÒÔ¼[ýYXpK†ì?aØ-·Ü¢ýÊQcµO͵Ý#`yïŠ/º½;‘ãA! $¡øÓx8ÂlоzA c=±²7Ô¡ˆÛ¶¬/—iH¤¤Iƒ̵û„„øC#4>×!  ®v›EaÈjkÚ’ª‹6ƒRõ³±èÝw–mÆiB|ÜÒPX^İ-Yêk§ÞùÛæáJß ß˜np5‰ Œp¼ÈêÅ+™e×…5us“ª>Ë%4Œa{ªÉ‰É(ûÄé3å<ç¹³ŒýgU"èÁ§sO†µö–L—UÌ œvçX~= ªikQlp‘–“–êATáæxÿáþy¶UÛZxà!êõñ&:ËuÝ|è¿•}»Ø–¾À$îy7ÊÖeïÿ‰÷”ÝÌ_°-C噡¢ „ À%‚¹'¼¡LKx¥²ØJÝÓ7D«2Õ!6™3>¥Žc!ÒµÛ~Gº*Ÿé¨HÈm,ƒ¶ ¨‡È¯qˆÛ~V) îÁ‚wMaÁÕ.äô\ªåޡހ8å± #_ XèNÒP–sG_G“¤´Ï–ù4êa¨³UüÕ)Ö¸XàÙˆ7¯’Ãó9èeu. x(ºÀ1 ƱKÎ;´CÜtÛ¥ßÞøvסĜô¯‘²#ðQzK{×ÀÖs*ûà žâȪ~e™·=ì$‹ó:v¤§p™_èdŒ@G™¸À¾ŠM~I ðÄÝ¡àƒTG‡žöõûßÿþ–ÔÀý ²ª¼rý+a ½33³Sôú8€³!¨„æÈ/D˜fV[…]B\ºjÝzJìî2ˆ«¼eãÙ#À·q ‰b" fº–R Ëwé¶]9.g&ê¢-£Ô Ä]Å@š¿¦-`ßî=)m)m ¶˜½Šoˆ"A<®z'l…Å3Ößwœq¹ÕsYJ£^†Ê¼s”è#L[5^–QåYˆŅZ×qÏ»ûWP/-+‡WQÒ/'K(‹ ðéK–’lt¹š]~GF»hÓ8…ÑpP U'¬³é¦['ø4ÊР|‘ýgɾ†Ó,YþOßÿN6V+÷ß÷…ròÔÉòë¿÷—솋‘¢wæ,kž>Í6ïä!  è7‹Çðú7¾±üãw|g9rb"+;^ÀvÂ‡ä½æ©‚É i*K×K¾>B·à4» OM1'Bíâ”fÕˆú…Õ.`%ãµæ}míÏð]_ó§…„Ò®™&‰XÚÚ@8± F¶8á½w9c!|¯‘ñ[áÔÒÝ’UçYãa9$ý-Uk‰I€æÝw•[ØÞg 1Œ¤ŸU`,@¡¥œ{¤o@Êûì\Äj ÈßÔž e¹Òˆ;WFˆsÚ{d NáלÉ÷nHs‘q7Ä:zì0ÝÇ ÝYÆœµ~Ã6zšÖ±ŠõùêLO”mWäñJfffçf;Ö ”WnÙø°t^TrûÕÄɈÀ 7n8 ¹îšžÎxèIô†Ö^cµÉļÒ?\½€B€î¯5kC´m›×gû&»-áÓ¢‹b ’ð'.EBû¦é²*C¹æD_6 píîÏ|.î–xÉoUfnsä"€J£Võ¥aÂ`§t*ð¢nµjõ*\vö’ÃÀéÍœE¹–.™+£«ØššqCC ªÀZJlÉšÃkar4F±7ôX½nMY³vœ‚’­®ÏLГ@~aØ@/ z4j`”ëjê7ÂŽ9T¦)]Ì#W²‡Á§ïy |à_ÿG–OÛQvì;@#"»#HLÖ:ñ†é’msž«4‚îîtôž÷þP9£gG¾Åw ϦšgUŠ#|âù§ðY2Ã*BF Â!·áîY‰×s º  (NÔ1 ”€+ÄÖ¸£#„Hç«Ü×ò½¦—’Ž4•O5zŒ áú®ömû]he¾ø³tV9EØÒ¾â)²†å›Zšê&g’–ýô(’ŠµŠ›Ï¡2×EçÞiÚÒÜ®Þ9?c=Pì”àÈ·uzéå=ëñz ½¥ÍŪY­ïs%LÅPŽs’Nmµ7®Ñ@IO©oÅ?iÁƒ‹ððÔ V•:r¥ŸÀ“ì.#k7”u›¯+ã«Ö2–£§,ïÞžûtØ l7ç’B˜H š{{ú—ÓIò·0ýaiB㟹_<Cš›¶ðn»í?ù“ß9yæä±±þM×bgiÓ•þ$(ñå…Ä»RÓ”>=ƒ#í%c+µ’å±–m[× l;Kße”‰´1ÉÆ [JãzGX@ ãnxÌL´ÁE†iÅ;ØC` iÙ0§[ý™»ï-[¯Ù–/k}„ü„Ñà9z„̦ü¨ßûéh›A%i‡vÞôª›X"ëxÙà ;R–bð¦Áá{´ÄC±•Ø…3ì§?ÏHÉ‹(ÆùI{X2U8îs?@UA”¶mYW^yÝè“•¡fOÁC`¾ù-o.?Ë0äÓôœe©±ó¬»0MoÀfN" –Ê·q¬¯üßÿÇÊ»~èÑ5ØáTis@Ã( WÛÞö¶[ÊŸ`õe;Hoêìèç¾n,’z7Ê&Ÿ*í¤$´¯ÀB7•ÑÆÆÊÙsǩʬ­,1Ó¶ ­ƒJãðƇ$\0*ÀÓ›`ùîxalˇ¡By»Ø½jÕXYެt¸¢B1K©n!’ïÍž Ikغh[rȱʮ'lÆu~n-ípE™ÆvúüßTl"jÍmõ¨®¾éT¨/œýÃ?üNŸ<òîuë6ÏãÂvX*™ÑÊX2f†Èü$»³v±p„ÃDéµ7—òÊìz^ 3cK$Ø)T|D>l Áxà‘£yWc Sãæ-µGà­ëËv†ðÛx• ‹%{à¡Ô~ÃGବð}ö®ð|"?*2°nYLº†Œá¹W¿¾8&"¦åAÆ+Æ€fÚï"âŠI0 ‚Œª C\•ÃD}g?§FcåÂg>ý9ú¹¯H!,q«‡˜r\ ¨,i†C ʳh,ÃÅéì‹0a|åêrë[ßZ{Œ‰I;Ÿg7azhìÌH:ð›Bù ³fõÊòÌîç´ÅWÁÐ6u³Zð7^_^{ÓÍ¥—*ƒuêÔ?ÁC´mCT¬¹³”¸Ì`£žŒ³ð…8.2 Ía’Èú(k¹7­Ù5M§Ÿ:~2k>ùøSåË_z¤<¹ïxY5¾‚uÎÇ#R L…kÂE`kiVéÚ&*¯+¿à¼ìZƳ‘Õåè v¦eÙx]O]â”Üâe|°–@~Fç%# ߸žF¸eKèß<¨ʃ¥›Ð<<Ã\T»ÊAc ¬ÇëÑ™h$—[ëëŽaÐØ¨”²÷Ã@J’À¼ÆÌÇx åEL‰ ÍŒ2‹FQI£åg(ym•AqðÕ4m/®²äºêÉCè;)Ðôô¢T#ÜòyïW û´ã"ƒ*"‰2™YQ©%–ÄvƒÑ$¼±}/AŽ«]56Nëèdùýßý_¨ \WIT øoé'éP]\õõÉ“¸Õ|*È®ÅOüÀ²c÷.F=N!Vc!ë¾qª¦Ý”´eÀÛlÜáà¨ë¯¿ŽQ{k+C<"Ít;iíšÃÜ›g ,+¼”€ö!ïÅÍ B•‡aŸ¦à¹={Ëã=U¾òàÓ塇h/YRÖPUèf”Ö$Uë±9€×ÕéˆF¼7K *pê­á…ŠBš º¥â:«à¼8thy ‘’-Ú¦L´‡©*PÍ ßAxÉ£ðýkòd¡à{OäÀ+\šïkuÊøA¸ßTô,½…%n~›GB’†°ýV§g#x&~I"WÓ‹\Ë'hšôˆ ^™Ïûàd:DH•¸¾—÷i,ĺ¾¦2£èÄ÷â1iÐÓÍ Œyâ¸Î¦¹ÇÚ(iA`aÇ\È‚Ò_Ù¶]Æ4ä\híæu5.À1<_ï`á2ƒ–n_¶oýÖÞWþËù[3dMt¹\9¾¡s>øÁ²ŽÁ’©¿øÓ?ýËÇ÷ýÊ…ó—{úzb’Z/AÄ¥¼f´œR@×x|Õ&à eFß ¸½_zò@YMÃSÅ#‘iР㤱ë¸Úøã“X·¿i˜‚κȬÃK×Ýw~¶üÌ/l¡ˆZ-RÍÑæúJHûæ¥W` DçpTc JMK«oÁãX»~cõŽÓ6 ²cáÅ‹x6 ± *%6]¡ —]‰k·r|%]„L™¦ÓÒ õËHB2S-–€„$ŹÞú[ŸT¸J‡hJDgú>|„H÷”Gy¢|ñ+O•Ïï=Q61‘jõHoyÕµci-v Ê,®gz5.3É EMIF2òEŒböx†œ¦Y…M%VèøÆ*JÈ÷ön0¤Ü¿¯¬`Eá>ª‚ó.OÅw1Ë=~^ëÛæD8²i|eÁ$‘/]xŒg!ûNx–´éê#,ï K¾ÃÆPSc…Li8RÊò6ÃHM|ø÷Ž44b•Wl34Ð@òZÏI=6ÆÙúnál…¹ží3=tÓ„ç+| „½gñ‚b\ø¦Êniï²{ub5ª†Y#eºmE†ãò/chz݈¼¡ÑTÙíœêÁ˜ÿk•ÿöÛoéXrû}4$¼øì7> y\rùÁ¿ñîOÝñ䯭×,½á†W-¸È D ±ªálˆwÃüaº)æ°zã¹Ý;Ë“O< SXãQ|=4”u¢fVɨJN¹>†­J`ƒÒ#¡ùË )Ò²ñĺÔ*\îC‡Ï”?þà([háά<ˆ¹xÏã›f–8½ñŽ?Ý7»p e"„{#C„ØE¨wRšz7FÊa¤Zzi¥Òçñe¢ùTè=˜’  ç}Ò¹ áä¿Á!JÑSø]*íØ±ce÷ÎÝåᇞ(_@éwÐF±n¸¡ë»¨°ÌRBÎ’±~Þ½ð@¼ÄOE³ÚâˆC*o3ròà§ñ² ¥‚é’Jæc‡öS2].c«7NòA|ÿ*¯’ü Jº‡Æ§†Uš‚‰(†A¦j¤Ò¦:Á7VÉtÃý òÀµB&(Jîyô=J#Œ(«‘’¸ËÛ¤¨!â,zÉ»=V¼ ^. ¾q —£a§éNU–â²÷Ñ :€d®@«qhÆ'HÏ ¦—"m4¸û(¿ûH¤ú"Ÿ`¢Ü+‹¶¿9àH ¡ycuÇ4UB«zniß§Ç^ó¯ýõßú³Ç¬ÿSoÜ=À5Ç7ôŒ£òûñßxó3¿ýÛ¿þÉÇ^xç–Í×^¦QiYµ¶¤ õ$9è,=D;€“^ܦ{¤Ô»gWê>×o[É'h,r½z2ègœŽgÖÒÚevÃ,Â?òæ³1LFArX$f’¬ i8*Š•ž*YPSsÀ©6æ²DÜèj–BßC·ïD<'Ø'ñúT¨ ÐN¾—„É©¯›û”vÒÇö ÚAL0¤Ö’~«Ø†û—v"ÑPÆœ§ÀP€K{ï“ùj$ª2‰Àx y‰<6xFÿÃ1UN8Õ˜¨ès@6Ûå×IéÞÛÝO—ð@6p*ïB¹´7ðh‘…c¡m•Af™oƒìËÒ”/ÞÈ65?S»a¨¡éB kï‹ñ§.Nd€=•>&K:æû© .\þ’ÊoÒ_Kù ÿÆ€Fðhv.[·^û_ü»{ßyâılrq™a¾2¤ÎƪqC}žbÙ~¼»¸ºé;ß°iSÙ³ýF®+ï8œúÑ2Æ;º}X«¤%ŒUù£4­khb ÷' D‰¨Keî†ÕãåCûlyëÛn-¶lNc˜‚¬µð2Ò(‚xñÑ>þ•W–vE^Æp#Xi(Rð„güæ[±>T…ŠB."ìÀq–(ækñcnóm`ÖàÄÃD+¿XAøàƒeûÓ;Pú'X–|W919[®Ý4„ËÝU^=ЉÒS³e„\—!ƈtª+Y'‰hÌG­œ]Êl–Ü`ƒ5·ÚC¤mT`g8 ÀŸ´óu”õ½þl݃+Ø4öô‰ €²ÕZÌÈæ×ê[øëÇ~eiͽ'oš^9¨iV‘&Êä½(û®v «»UÉc¤x*=`}â¿â>%¬†W¾™g2^ÃeI5€rt¹IV%œF©Ul×­´KØü®åtq“¨[²ÍQ-Õ›ªUò¥Kò;Fpï°y¼,ž½¶ééy‰Ší+–ô¶!Øàx>úóY›q˜]³&v~~r&öì¬ÛçiØÁ;_û»äòо.†ÓÌ6}ÿ·ÐúÿÕî¿9þ¦€‘n¹å–¸?øƒï¸óÑ'ÙýÂç¯]·~#£,‘$2Z¶¤@´X\m]î–Šö«¯]»¡ìßµ»t’‘k6Ž”Ž3¡…X? mí…¨S ƒŠ'a×2SÅ‘yòR¢Î#`3Ô·.Q÷¾È梟»÷þò“ÿd#oå}®Êlap4oD]tåÁÚ7D Õ” öÓ OáÐB§,>œ««ùçð÷¬ŠðËàÀjSôj^ø–J ‚âØ p.EvŽ:õ å™§Ÿ-=ô$í'ûÁ7[6Žö°iGo]èI•Ã|ëF*H] DJIcióiÛØÍzY¼…œ˜ñ÷´q pÆÍ\Þê®&/ÄSAÌšpB,~…``ªÇÆáÛ¶ÛLØý(ÅYÖ 8‡`;ÉÅeSàÉ€`2é ]fñOXëe( *@}&u¡'fšñRRk„@4Ó–ÂûZ½2PW¿^¥«°•?Ñ—+†Åå7 Qn¯d!ÞhŒQàÉ“:Ðg9VÆtó]%y9]uãC+©Ê2žÃ¼ã ¸VbÜoá'xŽºô^íÝÉrú”ö„v`’¨š›:è¨m8¤Q™Ð!ŽÇV•QªrÎFÕ¨kLONШˆðNÏÑ}K¼e4¬+?Nž#í…¾þ®Nš½xæãDà¸JÝ—»—þ¼,QÚÆÀ¹?ýÓ?þèÎ]Oýʹ‰³—W °ú°Â"1‘؆È!…õšfxpÿÈxëe'¡Uë7”ûö–k·m(;>cºN‹¸ˆTà@žxažŒ'S)my«*òÎ÷*°ÄíÀ%:ÅÞ|h ¸ã£÷•·~ß­,Q¶1^€ ÍÁwâ§H($ ÏCfxµF2 =‚M󠣨ÄÅ‹¯càý˜‚KrWÁ­É·ù3§Ñý‹`‚¿-÷(=ã6ØSðTÙÿ^'ÂÚ?<\ΜþÖ«·5Ž‚SßTœÄ!Gðk¾kÀ]5x$Ù±ôÒ# —è£?Áf¢i~êñgÊ—)éŸÜw8‡£Lg¬ O A×^úwU𶄇¶ìâ”ø–NzUh^ 4Vi,CÀ…U“h°T” ‹Â‰ìTa&§„©X9†WÀ]BÌ3|Ò r[½2 YÃ#; °ÀÉI–;xäpy;;»Ší F2va°m”̇€F®“¾Âm˜®¶ ?q¡}Üù†0å¨óSe ¦ú}âˆ3GÐ!¾ôVI[9ð*="u¼wè·Õ ”}†^,«Q9ïfÝ„1–¼ï¡š©ê’;ú³'p «‘C[±~ž6î­~)ßdn7Ï$!ÇîÏÑýgã]w×R–Ó£:ÑG!sNú™Q›®r…&ù:̘¥å­ª)sÐSv6¬Å'œ¶‹%võ^š_òç¦yã úþ½ù:Yxy nP‘ã÷~ï7ŸdMûW¿íûßy™2ãX2ã1Uf‚´µtÙò24¾º¬`†œ„upÈcþ]9vð0³šN–Ï|egYÇJ;v«y„mrT´zuòá•ØrÔ×¾Wèl0t¼.ØE[ êªÑqF¥1.à÷­lܺBëû‘Â[×ÞçN‚&àJ¨‰$³ù„ð+„\ýð’o®~eLa_A±þ«,Ìಟf’ÇÞ=ûÊ“(ýC=CÃè\Êe ¨émð­Ê >Ô±ì|ËŸ‚¥+¨Quñ‡¸“ÐÏÞ†x$PÝg”ZÃÅ‚†“.lJÏÆ (_4KYµš'.æ·†Š?±ä¯Y ¸Š tÍd–„ù3¹.”ßü=Sv(·ÿâ?ÅÛ[(Ÿþüì¢Ätè(‚ Mu˜òOa™HÖDò*†*¨ð. ‚Ohjž¨×gäM™H€°Ì'deh‡¢%n€auÆžcIœã\ ’^ºm Ãê9|ƒ"!?—è2µå]šHÿ,wfinþ¡»Ï•žåSª|ıR†5¦7c-éÝc³\Ü:~`EWYÁÀ¸–Ÿ‘yÀðÔñД4Äß¡À.ârè ÞÐè3pç©ÿ»Q­ù aÑÀŠŽ¥C}K:öìõõW_²Ž°˜m³þÒãe{*¿c~þç~nãÚ-:°ÿÕG¾¼qÓÖ¥—hñ·dÈd³LÆMÕyÏ“ì!ÐÛ?”{Ä´lÞ´¥ß ¬)kh¼šÆÍêe 0K6¿’—¹"H–öPý*œ}nŽ& Ðo\=Ø‘x6Àœ¥ä¾{î+?ñ3Yí—ÆÏ#ÅhCš”^|©6°A«…Êc#”FnïUzûÇMÜ­ÂO8VöìÞÃHBå<¼½<ñüÉ2>ÈD"ÎÍ4æ9™*¥4(Ò$¥  ‘žJß§Žð)x¤iµKº›˜Ë˜©üÎOc‚k+ºð#ÈšTé Î*œ¥!²¼Í{F“%?BbÀ°SlS·Ö.Cóì_Õ1tƒã2ïf9õí´ýÜüªW”ª#® CAB*¡Iãã·qçELXœz--µ 5€7qÄ+A Âûè¤z™géná‘r«§±±„Wéçpõ)Jh¹ïggëÕ(}/U:|ZèäàÝò–Ý¡-Â4:¨r-§Õ_úË—x¸ …oÒÑkq½‡¬Å+›=ûá4ê§´Wñk;’ü2ßXe³ 0>b_éßÁ¬R^•…NÞ`Pæ/ŠÁ«šf$óùòp7Rré¯UþÛo¿½ƒSëúu—m„pÝu׉Ýzw®Y»áw>ûÔÒõ4òÄ…'ãàl%šÄ°ñÅANrl€Ãƒ‡<Äœx§9nÛºº<ÊÀ Ýžøy©Š—\4±0°B6¨Dr‰fãêreEYQ¦œ¥-`#+í|ø¯ï)·¾õ-eã¶­´Ðo Y £e¬É÷õÞµi¿(Z}ˆð7áQzz7 GÆîc`Î.úèyø‰ò¥‡¶—ÝÇÎd&ã+ß´µNœruØ9P˜Ü**%øêâ9ØÒD×>KSaPÜôÃ8”a¡O" Z’ëÞ«èvÒ$«’Á~VJQáɆQ8y\…Ï|xøìaöŒ/Â+¯$òEç .”2‰4môëcÒÓš•å òïŒÊ¬uü4KÈ)ÈÀ7;Êa)Y9.ªÕûPé¢ôâ/ ŸTúZ\ˆ~c”|Íû”¢Þ$|M®UᘑYúé36…÷l|‹,®Æ`±¦ƒy¦„¶0šo¤ ã`‰ož,Ý-åmOÑ›g'Nå[ðщwèŽaÑÛMÜÇ"-k™¹:ʆ96ÄÚ¶ b˜ù\ÍštõPFíiíF¤ Ý¥7Âó±ãgÀ •e¹þ¥ÀÎä"ù0yÉB"ôPõ¾<û!a=óÌ3‚þ†Ç·dn¹¥ö¼îu7ßµ{ï®];v=}Ý©3'çGFF—¹Ç]c¯H°¦ NaìE¼€¬¬u%3µqÓ66ÚôÂ_soIíâÊ©Ó9:ÄVf´Ü«ôï*{O^(׌Ój?Ø[^»ueª-ŽÆ›ÁÿÕ…·»ÎMU2D£o8Ã>yçjÃ*‚‚íêÖNf"³Øn}nÉ3Bl g©c©ªû_‡Á‚¨yEHmÔSX=¢p"­’ŽÓºHoÓ³¤–öIƒ ¼¸ü0Éù òF¬òj/äÅ4ôW¹§Áeüûwn‚ÕkMAª c=Z®¤«MFûÄU#R±#Ì8„EÉÁC ÑI¡îé6ƒîac›?Â6Kuï2ŽB™Ç^ZíW Q§Ç;†£:g0 YË@fš a«ÜÊjúé›9ºõ”Ìæ·UV mù׳2=ëôVs{f½š)àÃÌêcé6W¶-@3%ÿHD#³”¶†ø9)H¯¯`¤ô3r¶“®Eå@%pÁ¹‰ åø‰s¥›|œgѳ›*×âÂ’yv¬ÒùÊÿõ›þ0<€m¶Ìãã[2\`½@Úz–\úìg?ûkã£+ÿlïîÝeôM£P­ "ùŠ5’‰º^—$áº3¸TvŸ¸oýøÚµ,Q4˜õ̶lZYžÝ{² ;€†o­z(\Þ*L¶X°$£„kíÀV¡•w¦ë,Ddœe¾-Fʇ>~O¹å­·”õ[¶`y›¶â Wp¹ñzõ‘4x´¯LC\Ú6ÌhUŠsÌ húèzª|é±½å$}µÆ7ÒCëqwÜ9»ÜÔ7KðNš|Ó`dÃJ/ó›ïȱ”²`¨×âÄ œBmò\¢ÜR-i|çä%YÅ2L´:Ñâª!ÔpåÈÅÌ:;Ý´*ͳ-éùlÝ uP "‚XúÛ0E:äß´ô>LWu €ªw£tN³–ãX/ãcC˜½QöG ²x*܈•¥¼aòUœÓ̽<÷}Œ×Äm«îdì,M• ¥¥27Ì´ô.ZñUjá:cÓÁ5z4ž—ðï £•’å”Ç®³¯a–\*¬¸à°¤z¥W!Û;Ðù2¶byYC£á Ý{¾Ó¸û|&3 «µò¢6(b,ÙK›ÃÈðSè©t…1 sôñó}pÆp,AN.a°../„-_$œ]°M¡sÙ¥”þTÕÕmë8ßðø– €ni¼€Ûn»í/žÝ¾ýßìÜóô+^õª›æ—w1ð€žü*` ód ÔrˆìäyÖ‘G xV’Ù´e[yòчXsuyzïqêKX@æ©»—š–M{"“áÀŒDVá2ÜL+*ùCšRRìôçI» Øs'§Ëçï} üèOm !-I¯ÒÎCUÁsË$%e^J“^UzKßù¦»îùò4‹u<ôÐÓåá§öñ6¬ê+ë食F!†:‚Vsvf¡´¯ƒ@Ò§ÌL0 €u}[ïMÇ‘`uλ£’q’¦ M:¤7‹w ÈJq%b…Ën1gWp7LÔ-É¥_í ¯y„´äгÐ+à‘×…”TºY ¯›sœg5•׬+û¯Ÿ+·~ß-¬M°)Ì{Q¶á® ¾\Eß´4àcŒlc 7=E)öÜÞ}¬Ðƒ{ÿàSå±]‡yÏì:6,Ù²q°iU¦ás’5tÁc9Eƒ0,},ᯩó#„ÆSH,Å\ŠJEWqU®)wgJ‰Žâ!€®8¬²hìJ’*›ß.æƒo“óÐ(7YH~Œð{Te€–ͳ&Wãä×*Hí†}üvC‘ÉU¥§®VA„mxðG &à˜Þ JµÙKºÚ+êØµ¤—ÖÕ¼ç{¡h‘É›óéãq•3æ_‹$*\ëÙ*cFäQ"ú¶Ÿ†fëôôÓ«Ðé_G™lˆÎw€Ž§ÄÕ(ØG¯r¶uyñ¬ã%,sÍ*ù!=KøT'pÓÀãz}+Xñ©Ÿ oÜÜÅPÛgTp×ÁtÖë,y”–Â6 zGÊmS¥ûÇ×±¦äP”[Ã5ÉÊR§YóQ£È²Ý¥câôÞÈp•GØOîñQüK3lÉGšî3h¾s‚êÐ`Ï2LÀg~í?ÿáÁ;îxï²÷½ïöÿ €Äù¹Ÿû¹K¸å]ïxן?»ýé¿c÷öÕÌÇÇ»Y¨]‚a˜“{…G‹æÜ€I–Ã]µ¿«É˜iëìÛ»§lܸºì9¸Œv“MŽ0  À¡Hª„2rò¾–J–XZH7¼Œ…´?Üm¸-M'Y0äòÂtyêäùòå/~¹¼{ãFž!—V~¼çˆ iî…g#‡-ÅÇXs/JÿäÛË£î(Û÷±®>J=FIí†A”Ða´sl…F¿,Œë $qÍ:âØÖMýO†ug7¡ÓÝïB)dŸuwq%ë’–üº–*¹n¢°³Ú,‚è2T©'£ðãx GI†Êh^¸šºñ˜Ÿ„I/¤Š Hó+ê·øå½³Û„i]ß«<Œ›¯‘‡¿þYÓìh 4ÈòG£å;y¨W¢‘ÑýžfQËùyW´1¿•¯<ôˆ#­H{'®)á€k|»{ã7õe•ÚuV­BéQ¼tÏQ˜èú[Ú›ŽyÓí'ÑݦV¯ªA¶tutžã)’–$$ãñ¦HËz·ž–™]x¦}=˲ȭ²Ë¥_›ó)®Èùtã« Ò×ÓVþn–|ÓÍWzqSÖp¯M;U樥E”ÙDdsy~Ï>†:–5¬÷w¹›ÑO2Þa-3@#šÈŒ°y‚NÆiëv*C\7¯EŸ`ûª›ð>ú_ï*o¾å{™¡¶&n³Œt ÛfÄæ‹å(qìÞé ÆgÊ£Oì*{èËe‡â!ÖÞÛ¶ŽMAtÅ©GNó‰V~9Ê­ÅÎ<Œ‡.4\ÌÝw2<bXªiäž”òÚZÏTRÝLèe©¢ûmwž¥e¦¯ªà-÷ƒ½¥³ôá …^ºçžôô.B7¾Q¸t«S*8¤aÜ(w%Eh`é§K/L ÊäÄ¢•%ç!ÆÆ¾xXŰԭ<ÒÀñâé^¦%Þµ ¨+dïÂè¾â?8¡.â 1t–Ý4ôv…ænGä °\–JqÙk•岓³N¸+ä.³N=Ž.œŠmû‹ù×Ó ’æƒtlœŒ±ÄçÙ¾úQ†­ÓVÕGïEº¤Ë+ò…œEÑM‹Ü€ó2 Juà@ãjhÌÈrÚzºQlw˜v#ÇÈ„Uù¥uŸ‰tý’F¼èdÌÚåC݃w’ýò«¿ú«óè§·ßôø¶ €PI䲉|Ç+_ÿG;v>ó¯÷îÛµ|íºõ¥îH.alÐÓªFà¡’V“çΔôëŒÒ¥¸¦œb«­­[×–/<¼—:½@A¬ù&ñ½ÖÞÒ$ „à®-aŒdiÉàNµú–Ä“®T q÷í?W¾pßçË{~ô‡‹«"¸§Äv…°Ý}X¥ß¹cwyìѧʣ̮;ÁˆÂ!†ß2©¢l[;˜>ã)–ׄ©ºŽï–yÝYî å¾Õrõ@*Þ„.bõ^ª[Å/Ç—«Ü¶{µN¯+hâ†Aæ[ÒÈlÉØæ¿U¤äštbÌ W\øD®tPˆ¤(§ô÷»4æ ŒêYá@Û´d“¦ ÜöM§D'mÐKo%NʼnAâ%fòDüâ­ái”($_K¯ô2V5f2Ù,‰8++шç4o¦œƒ:¥#%ý8ÆT~—ÃÒ-wÔg–ß¾SéÑnJtJ_â¤1O¥·”Oã^5ÐiÔ$—BOUBX”ÊX5ÒŸg¦]Gf(ó £0]A™¶-øÃj»´Òk÷4ju9Ô×A†Hßìœ` / qi§±Oýã5Å‘zw® ¾N¡®z%}YÌE^éµ)3dM^ÌaTLwŽ™˜®j€ùÞ¥ñWt_^9´‚^Á©ÿ«õN¢“i¤»—s|Û€Ldšð ¯¹á¹ÿòGð—Ï>óØ?aéÁK}ý} ¸BB(Tð5®tnâTéeƒÉ4Œ!·lcù‘²’±ý}ûãzÅmV™‰o£ 4‰ÀgŽüVš^»Þ¸áDš8Kh´Z`@ºÕŽÎžrŠ5ô7m+wüÕåÕßñê²íúž¹21q†–{Võa¢Íc>S{rˆf˃r(í7ôÀx„(„ ±—¸÷(¾‹O(½(ºÞŒ{ê^vatdœ ‘ºÚÒ!%9§å²!¨º–Ôcq1Œìä²À@IDATb:–@žiP<É›ïTtFá‘–¹‡FÉ6gzÑ^!÷Ùª‡ß»Á„àT0½•¾ºº(0‚J”Šc“~­ÿН|ƒ¾DPõ<4šñÄ¿T«Ââr/œí 2‰“åÏt›«´¾ó}ª4ÊJæà™IêÃç˜N>È„¢aJz=(×KÐa£ZÖŬ¥µùG¥eoŠ wfßH/ŠžŠEXmK€fäÝ*Ôƒk4vÓô(´¹ÌÒìm”wõzeOþ™/z¶³ƒ#N)óµEñfÌR®ÿÏ‹åÝl·6ô<´¢¢‹bÛ³*çê}”a¯¹Ü¼Ê/=j Ÿ¹·`±Áw ¦iDu»·K¬@=ÄlÀÄ·éÁXÍÍž[6=Ë`»ž´þ¿ò•uwïÃoz Ÿ¾i¬¯áŽ;î ±á}ó÷~æÞÿá‹_¼ç®‘±ñù›¾ãˬçÄuä; -Q¤›B¸’Í ºie.µûÒýŸ£=Qvíy¾<òìÁ²Š7ë$(á>‹0 !kàèî+dµ´­¯,AU(G{]â´4q¾A§Ë+3ã-·½!­ÅO<¾³<üäþrÁZ³²æ»M7ý&¥W˜2Ì’k,¹ Ž+×G)¤ò»²ãÅõJêL¯Z—¡”ààl)).Ü©IÝZKŸ”Îx~c^Ô#o¢XºÅdºÞ£8ÐBÁ‘ •5¾;ÚÄàH À@\Q:½(}xPq±¡Vxº¶/h¢Ü¦|ë{½ ÂŠk<‘ó»z[Ÿ5Àí>ñÒPyT϶Ãe¼½SG±Tœt”ÊäƒlÄÛqü½FÐBC^ÙX;Æðñ§iì¶ž¢chtT ó“±÷°%ô‘N"/¾ä)Ò ³m*6œÚe·¢§ƒÒ%¢îÝ.È¢ÁÈ8 >çDZ¶Ñh\ô*$ˆðclHCœ ´Gedd(]œf.î¼ßqïêK|z#nîbÛŠßÈ@ùc <‡øÆà’®²uz:}±\Ðm½p¢ôtÌãe€m)3Sç.Nžšíì¼Ô52¶î©_ýß~ë&ñ"ö²ŽÊ­—õëFJ‚¿ûÛ¿y/kÂÝzë[ß9{Ìb!–fUèæí‚>+нÌkèüÖk÷Yß~äÁŒu¾ûþÇ3ÔÕ’Ô©· zdSºr7En’°a‰ËbZW²ÛÄÒUe³´•ñC4:vRO{áÈYlXš1÷}¸x н.ˆY‰,5±ôÀ´t·”—a®³îPQ»ñêÀŽêuèþÙ.^ 1 Æ© xMƒB¬ð…. "ߤto”\Ú˜¿zp’Tá0ÌW eJ𓎆I§T6q¨n{¥s঱ÉTÒ‡Õ(kÀA£”Á8òe±4^‹ŠÞà)Q8ëÕÆ]¯*©éøMÊIî5¤â¦ÈZ€x\'™4Æ+¶‹$>tÒXÛЪt/E]ýµ·$'XfÏ#É–¤"ÿUÁ;)åUªü†£”ºÍð?‹}6°ãUéâ“o×á ¡Ì>zK\ÐÃn=„ÆUúyÕÓ¦ÉÙ¬éZ²Wå—æ¡ñ5:z~ʉrYð{îíåŒÉãÒ…ÙT'Ó«Ä{¥·Õ ¿·ÍJ<¤[ƒ¿<œ¸`nj²œ?þ‡åâÄñùÙ™3 ]ÝK;V¯ÙT6o»žªôÈ/üÄOüâuÿ9—|ÛU€6 -»õÖ[/mÙöŠß>|ìÀ­î_ØvÍ an(añ ”™_÷tÕ ×Èw¨ðê5ëÊ.˜¿détÙ¸Ž.ÁCg¨ƒõ׺ol…Iê@ÏVí$P9ÄJ;êÌ÷a׌Xƒ¨öôêzM+ü›-kWð=‹v"|SÌ®ÓÒºVÛr¦aÆ'nºêhíué2ß!ÝXk ‘Â÷•kJàX¥ˆ²cH28„ˆÖçí:L¿1ïõˆT6]Fçý–4*tÙ° W]X3™ÆM„Š·9Sâî@'šdÎp-δƫ¨¤gšŽÁO—–¥9ôK°VùƒßÕ¢Û÷ùãB×PÉÌc52ÜAÿå6ô'Mi„~S½(·G‹‘¦ôk]òôWïM×ßš^'òp†µ5ÚöË[êª|)Ù¥¼QécœyWKlò MÁQoB÷>4§õÞU¦ì²e\û9ÚNc=‹oïîÎv¹JcéLiÄUEÙÍAm•ç™t5:žºî.ªj=]¼ÔõŸ|;W\4òô2Uy76ȬWÞ96$²HŠo#±c@¤£=üuúœ{€# çûžyláÄáÝìÅ2ÛÁîÛË®¹î ,S?2;<2úñÑÕëç]o×"{û·¨ü²îïmn¹å–T à¾ïÎgw<¾ßž›6o¡K*ZÂ()™hU•ÎjðÖ~òôÉÒ½~sˆßËôÇu¬ôìÓO”MëV–½ÏŸˆ%õC‰¦’T±¯B‡ @# Îˆe#‹ ‰ßÈL[‚­‚øB—x6ÜÅx‰¯qPØØ ™qÛÛdàŠõ+ûêa¬‚Áp¿Œ`ºzë,Mg l*¼­Çò>½î¤tUÑÈ´%³tH £brFs SXüSÀ"Ø•H$…\2 Š*x£ä¤øUÁÁsœDTì´Cˆ0T\Ÿ 1’~âÂ;˼´ €KˆÃ[NÙfyrÏž›ñ0oqí͇43€ À<³ýHº7Ÿ&Nö` ÍJâ ;3vsõÑk²¼oÌÉ6TP›Êa¢ôÓ Š»U«QÒÜÁIVC0Èøû~ç üެËRëdCÚ8‡D1ñÖ-¾)éo*´…‘”4³þ”N½Éæ·‚Óèùò¨q }y0}7smÛ^äcºý(é]868"‡ÒGoåàÁƒeÇ®åÀÁÝó'í[î¸ù¯ëb6ο8>2þá­[¯¿ó oxþd ”nÕ¼ÜËßÛ@€…Ûëðà©;þúŽ?Úè¹ÿ•­ÄæW¯Y³t–Fhâ@uŸ‹êÀ„¶’šcën ñZúéw=ótj&œš`2I/ÂÏGÂPÈÌb-•$àä.œHÉÓÒ€âÄ9° 2™8Œµ·|h]¬‡Ù^¦^ZÒwc,ù3••ø®(kõ•ížQ|[¥e¥¹£Î¿ê­ø2×*€ngMAd«¢›ž*žgß6Å'-¯mWÑUÑë=‰°Ù›aé¬^EÉ›FàJƒ¢%<”7i¤"§kNEižUzßiL$¦/q‹%ÚÒöÊ{ÐEU‘¯üTXÅSoÈ›xF^£Æ“zþtËUªD%½”–¥7Å\xªgÓÌ¡0ìH]1üP‰Ä IWõlt³¥½V]KO·ÁvϾQÆYÒh½Ì•^Î*pÀN‰O5 ›ÓÒÎ¥4œ¥šb‰áÀ-£ð(a"T”öx´%½‚JùÌ8S%Ì’Ó’$ G’¡q1îÚ'° lº}$ÎÕ®,Âü–¤¬¤Ç‘v ;U <ñ»¶T"q°ô±ÛN}œ'nìN϶t÷]¦psÍá•ÀjªÉO4VòŸgÝeqK•Ä<gQ xKLßûðLƒCA a³M`ix„~±áÀsq¶¯ÉƦ›ñû4c©iV¬^ūʵ*|Uúy”iiYÃ<‹ÁþÑ´ŠKÿŒëåiÆ”ØMh—] )xZð8RT1Ý‘v7+“fQƒS™±Zha /Reá[ÿìI¨¤JJùP%ÏÀmHhß0<º£àÈ8}ëöÂŽ!!snwìø±ò ûæ÷ïÝ~ùÐËV­Ù¼ôõoúÎ¥C,±>:4öàèèøÿ{à ¯þÈk_ûÚÃáÐ?øÁv0éKæÝ¸çïs€öŸ£]vøÿì¿|ø±‡ÿîG¾ÿmï¾Ä’aº¢©o"X–D _Ü7êTÌÕÌ ´ê¬*Q>ß½©wÝÿù'PmëãÕòf0 ØÊ ŠˆÇ¦4ˆœÊ¤ÊI¬ÕÆÚâ³ÙÊñq6+/›Ö¯¢»§·\ kïàÑcìµ7Aºµ›c ‰½uþ6¥ mŽ›äZûèmEÖ½·¯Þ‰$–U0‚L#æ¯ ¯ä8¥‰FI#‘€ ®½gmªõEÝ] ™™Ì†˜º“À»ˆÒëaXòÿí˜^åuçïi¤é½L³±ÛÂÁElˆ ±ãìfÝv³ÙÄvʳ» Éóì³û¤9Ž7¸m’'¬pÇÁئÓ ˜&„zi4’FÓç›ýýÎûÝA8ÙÄ6’àÞ™ûÝ{ßûÖsßÿ9çmçuXRf¤¶áê3÷ HT.jäKdÍc­ÒK$ENôë+Þ§dx01£&†gé©”äMTdxÖœ›eÊ¥¿qZìp#óe6<ûgÐß3ÌD·W“™ d ÍÈeMm ËvwögÍ-”•o€¡RU|: F\3¿’QÛ0šÄ¬šÎÒÖBɘ©ùe&¨L:µÑÖÀ€Ñf•M‹`È€T€FÛ›zæ¸zb|Ù(eƒ–Wùça3ºÍ’¨|!uØ ni;A?Ãú˜z[À¤´çÇp ßïÀ(› fÛ¶o)mÛ²~†íÔª6ÔW´µwa`´Õ´¦©¹õúþE‹¾¶úÂÕwG‚ü|þóš×Òraéà}ów/äú‚›yâ0€LntÒ +?ýôc½ç™uk*Ï<ó•±u¹vQý 2B +ñ(\°–ÙV|+Tnlßµcw/«ù:³Ÿ¢ç¸p@p¿j>OÐH¨h~(_§fçØÌ!Ä Œ…vbpñ(JP²0¦O›.­Wº'uRI¯Q/Èby'÷ч֢ÊíBŒ¨ø&oåQª‘7¹¿Ï|XÉ}¶Ü øð6+TéíHrŒ—ä) ™·¼2…z]\G®tŸF‚¸>]uWð'­‰£ŠQÊsÝIÓ°Á\Í#÷æÕC¹'0Ósb(’ΓÜ ™gøIƒJßHÚ*Ý#ïQº²_Ü où½ú}L[MG :ÿ@w¿M&§½:n=ÆñÃØÄiûç1ŸaÚþþ%Ùàö­ä'-{ö;T@o•èffå©ÉÕÂÔ†ç[9³²Äíu˜éËĵ£HòY-#?Áª-GY½7×!á” ó-ÔØ¬ÒÂÒå÷ñ-yö»S£ŒOøážzå0b4…©¦º_ÉO\, îd˱}Û–lçέ3Û¶m˜Ý·o°ª¾¡¡² ¯rÁI'Òülx¬¡©ñmmí×ýâ[Þq+ñæ=ù!í·1Ëöþ‚¶Î$Õ!=â;Âoö³Ÿýì}kžyøìÕ«ß…ÑÞšªX¦Ê‹ *'_&Ü¢ºqHWÄYÆÚ‚ìÁ{î„•Ù ·=í9ÕÁ$uÊÒÇ GåÑ–[}Áü (_¡ZÇ´\Àgû¾ûtí­L餭O¥1®½TÊ,îÉÍAiF`)åeNÉ!5€¬)µÄtOš*çOwÖj%ˆr6‰5è´eeŽÕ ~OUP;&­P,ú (ÒÎ @µB+­ódJqógÏuh QÁmc"õ{dÎ]ìW¤ãûü K§tè'Ôxs]ìDK*½So23þyDÊ%5Ë,CÀ"" ðàǼʬdDâiËfævôt§•„#‹¨¬ •¬œßÐN=qªf`l·†½H{ĪUu–n!H[kw`QŸó æ§-Π‡M2g€.  á.ÍÕ0Š]Û·…öàP[,óEú{/ˆéÀÀjõ«ü=üÖéäAÁ(e|S,<,@n_£ ·PãU›ÇúvåÍöíÞZÚ¶m]i||_u#Æ=Ú1•_×€¤_P»¡¥¥ñkÍí×\ô¦·ßKÝ%é¸âŠ+ªÐs¨¥}ÿÁ×C¦i>$xÜq'üñ³Ï>u «Ù‹þ䇖ŒÀ_~x*$TTv8pŒÓ½”¸½ýýÙS7`ïl’y÷ ngÛêz8;50¸®Kâ—¯J!?—hÐNƒóx]h£ºhˆË‰Fu¬3ˆÎ*ß(;⎱¡H> / é9)‡ ÌT"F"¤•’x©þGŸÁÊQ­aL+?¡ÖS±2 ùtú8f½ÕÞ¡#ÕNÛ˜‚Ç>Ô·à°UÒB”j©£±ÜÌ BÅ„!;ºHƾ¼5K¹ÌŸà6_N]¼àñúêGº›¦t²,ž!ñ(ˆáì©æ)ÐeÀ²y4®©ìÉ]:Ûló;$¨(mq›0/‰Y.°öv«ÁØÑ+ø‚¹?QF&Ì‘iÌg‚ÕVñÕ2oÞi¸µ€gx÷P$ì÷²]o?†õF­qßþ gÖA7—ØŽøÒ‘ØÒÑ”- A«½0Ò}»÷„Ô_Ȥ3Gtìt3O–5²å…çÏe&ï{é"&¥žÒ\zÉ0BÅÇUÒ:w$VoRϦÁ˜8°'Û3¸-ó@idd¨4>¶«ªµ¹¡²oñÒʦƳ¦§ØGàÛ´ï¿~ñ›.þ鸻mÞ)ö¹¿>l×D‰C=D£L@gv¶îOÿâOÖ îØÚû–·\‚öTÂjƒ¨VJ%–€õÚ)Sß܆‘~85ÒŽJþȃ÷f=þp6Å<È›ïx’6!†$ø!©âc™m?Pʾ*æ©óhåv°•‹¶¹¦,;zÛ5d5+±S½‹¼yõˆ«à±–I¤ØáßNļ]è0–Ï[Éï´U×˜Ž’I·`¸ÅîBRÆÔJJw–‘8&4Àù“VVDŸUùÍ€Ïp¨¹û9é¯Ä×Ë\å•Vߨ©…3Ú®A+ü€b+·e³\ÆïûpàWÚ„Dä}:ÈäËïH~¥‘ÚƒñäöðbVboƒmìLÜÓß œ£g ×7u29«+:LÔa|ÝαÎø‚R’'Ó£OFw±ÁªY²é»ñ°@ôø³eúþý¡ÙÕÂð]…)hCxe´Ì–ÁrE–ÑüXÿ(‡yrá':ùÆÑ£O݉~¿ ׳SÁØíß»«´kpKilt¸Š]Ÿ+œÛÒH½nnl{¦¾¥ñ[mmmßüÅ·\rqF’&wÅs’^·9 ûîH‡T p¹­€_ûÆ7þzëæuÿ}Çöí¥¾¾þJgåYFKœÒ»6Ý-·ÆYŒc'+ªüÈÎ xЦÀzN»±…?Œ-t·¯£VibáEåŒûôá‚-C_¦“±](¸Âf|ÑôQ K2‘–7éã›;âÑŸ‡Í Þq @»Æ@µÏÊ”Æã•(Ž1nnE“~àpOð âÑŒ³hœÊëÂ+é(y>ÀTsñKMpæžj=À`æ/À°Ü¡Îã ©˜è ³RVšD%–ÒºùhÅ.Ÿáw(cAÂà““«Ò<ƒ"Ò%( IÍHf¤­ã‹a2iPÖ"ŒE d €ÚQš01„ 4$W–OÚzØ)—⢽N†®,Íœø!3#tê©â×2LÜÙ³(k§IéØo=§'YøíE´£*´©c‚͈¡G¨ùÄeyÒ¿ô4 2¢&É5˜¡)[ù®FNƻߧí0›eŒ±Ù™ñáÒÄØð,ýEÕ =V¶u„L ,¨}²©¹ù»mí×½uõ%·ÿœDÏAOŸƒ Ϲ'Jùßò'8t S¡cEi×®]}_üâ•O !^»ê OÓ±-ÁåœJl+¹µ›Î™fzA[»zÃ* s³{î¼5{výúlÛ~ÝýàÚX2¬$H"}4ÁãsjRá¬^~PŠê÷~á¹Î)^¤wV™†ízø›^†T°òZQ¬>TÇÔY^éN‡Vë·i§Ö|+OT²Ô_aÛÜ™€06‡ýhSÇŽG‡ãìl”öÜ»æ>¤>aÔ ü\}o'žšŒåà a)sÊ­N4Îh²Èü¾ï¥  SâyŸÜ¥Õ\ÂGÁ$ôtò£@fG0â’õ˜Og“'†0UëÕ~ˆÏü:Üfl÷&ï|݆6ƒZ[[€R:šæ’²(m›Úûi&ÌÏú:°E.›Å~€6)gEÛi?b‰ŽØ¸õ¼ß[ÊNGWٙΘ¦ÐÑ™u¡²#¹£~®i£ä»¦ª$¥dÉ~CÒ|lÓ»(M2BU„ Yΰ( ÐOÓ5„æÎ¼ Õ00.ZA]XPSûX]cà õ-ßyë›Vß =UÓâø Ð›äQsR ÀRQð’Cííí[¾ô¥«þú¡‡îþ/ÃCC3L[¬ždC„8B5:­h‚à `8´‘Ýd‚S–B¶nýZìé1~&0˜bJ(^Οfx‡ c‡ *kŠwnîˆyŠJÉÇæê”SEe×?7¸S©sµ×h§wª÷ó‘æ5QÁ˜ÀAÛÓ!+¼C® Р§‹FbÁCsTNA¿Ÿ9Ü\ðĽÚI¾ Èá ´Ñ–š1Þ;q‡ ÅŸyœ¾î<$†P®?\"Ÿ‚PI­¹<“wXH<@þ¿=ËÉ}úÃ%¢…ŽeÂ…f /ˆÏfTôc(éùøz O0‹¸–£’!ð^{öu¬¬ So|5HJèKN™ˆ:SšÝ3Ï>0³dšvLÒbbOCE¶ôøÙ¾áálÇÆÍ0æÐæ¯o@Ê3¬å„Q[3¬cIM³TFRŠâYWp©K›ÄÕBýÆ%&˜Œ³RP1èŒA” ÊT”ÆfKûg°ÃoÕ®ZX__µ°¡Ëy £uµM?ZXW÷ÝÆ–Ö²»&ÇO€~NÈß-×CÎ,˜ã•Yœzê«>÷Ø“?þõ§Ÿ~²úœWŸ§€‰Úßò_+¯fUq”±â6öТK+×öŽžldÏîlI_köÈÚ­Yó|$DúQ» ·ÒÉÏ+»•ü&Òkš4”>~þm„W¸ÄÅ!BgÞÙ‹ŸTD¥…Ê6¼j}LÞ@²Ô² е Ñ™e¢Âé×Ê蘯‹Yƺíûʪ>•in²Ž}ªÎsmû$õ-G¬¦äœò–À.…p—`>ù-Z(-Ä|œ©RCã(Kw eyƒð~nd8‰<@4?‹)c‚ñ˜ã–ÑÅÖkRÅ7ùPÝõÍ" a#WdÄ4Œ?Êä ñhD 6~h™obvåò¨±Ð9H†£Ç_ºCx¬;/Èê1’yâ©§Cïùt®íc÷¤Ù¾=têñ¬–*zøQGâ[ÎS2iH&´“ ›r)›ri¢F䨒ý3v »Ö_&%×~ee I?5RšžÜo>PAöªêêêªkšº1Ê9o]cóu5uW÷÷/¾éÜsÏÝB s‡‚oÛ¶ÞY rÖQ ú¹ sãç:,ǪU«ªo¹å–éÏáÊ«Ö>óøûá‚‹§kj몇°VvëZHCÔ->ÎÂZ,-Z‚JLç *çš'Ïî¿ëvrY™Ý|ç£1R ·ö4ëJAÎ×li¢âûá­Tî¨è¸GÅ# ÿ¢×—{ãQ}ôj[^Fà¼ogÖÓÑÔH´÷Ñ Z™±2M1Nï0—3ì§=ϲM­Ö8qeL †sH/üPNG¢_àÁìÌrLçµÆÉ0×¼CÏúÍ‹ @q†€{HvË@…'KeIŸÊmÄ¡^런Æi\s`×r§—é}€”üÚ¾•‚#ÍžK \Ì“´3-ãóPÊàôÌc9%®jrN¸Ú´•iÞýàÚa<ÓNe6¤Ì­¾±ƒþŽ0¾RËúö…Ì]È„˜l+w`Ïplý®–!-AQˆË¬ëÑ\Y¨¤÷›û ÇÙfm”&@ g¾ž i¦iÕ|ë(DZvÍ.Êæ„«Š³ýìÔþ™©‰dÂleCvîú‹6±«¦¶þŸêZ¯?îÔÓo9sùòAÉX>bœÞmóÊmú JþòX¸ À‚³¥ø, ;õ”Óÿä™§žxÿú k«O>åtMÍYM£bj;ˆ[ŸÂJÏ rM¸{²MÌŒe=}ý™¡¼¾nvÞ±?Öä 2&þS¶b ]¬ÏU´r}ÜzLÓ„e":I;óbz(nN4i¦º ³ãÐJ9;½¬€c“._¦’1„¨W;.¼íywFï¾Ì+@ã]aCU&‹æ7¤¨02+îý§¾ò>!WËa€YÐëÄ ¾â*Às`ÉÀŒ[”„AsmHÆçá{Ó‰¾*¿ª°íì´cƒ©’`΂¿ÈÕª¯ô#óíjÓ!ÞˆÙÎXÀ{'ݸ8Gà#D£¹w€§•€‰yØ´ˆ6<€Ç9ŨÝl$ªµ$g0`¾S4 ÕºHÄ¡ÁmÀ=¾#iù-ippMÕ@%ÞÁ |7ƒU—¥§9ØâckûªéÑÒÌø¾Çèkj*+*çµv¡•,ؼ°©õ–†ºúkÏ<íÌÛ–.]:Läq8㕺]q+Ó߯¸âŠ’;eåïŽÅkª‡/ç~•™?þãÿñÍ=ÃoÃ.ž¦Ýʺa%€Ë ê1Ÿ·Õ¯³w :Ïœrû£ïgrÐ#ŒÙ³Ñǽk˜÷Ͳa*iH:roˆ*NÒ€«qFáøøÑV¶â8M ‰uÿ\Ý}ÕÅ@Úš«eJ‰ âF X3cƨûé¸GªX!ímv4cdä@0%µ™|ZnôÜt%ª`p“‡$A“@íOïõ]’‡Û3ˆÃÕÊì³yV P2 X½D›¿\òÐz"o*{Ä;Ž‘®ÍƒÈ ›¶0@ñÏ¥6&-óžþð‹ƒm7ÝMWw™Žù22ŸÉXÜ'šÛsN™È³j»ÆZÛ˜ŠíÒÙàvxM´14»wб· ‰a¸2úzv1 †Om‚Xn€o‡^̨Ôg²Ê; ¢Ö’´•ûÆCò×1”h¸)w¨‰d‘Ôª>¥éô1•f'öWÏGr´ ‚9LX[__ßð]¬ ãì³/½}` Â}õâèÕ¯ýë³ô¹ûKázØ4‰á*81Éuü§×oZ÷öÍ›7U-]z<=¬ik$%‚ÒÀêåâh6†?·=¶GW ,Â`Èق暬«y^uŸÕÇk¢•ÑŠªìÔ‰qÔ¤á8k»f™òqyWÖÒ‘§¡GUÃzÖˆ[­e(ŽRXÙ±^@d'Þ{ð•òtêÅb *i¬¶C3‰)ºäÓ°^‘ª8gæHÀÜqG™ÌásG€ :PA?¥1ÿ¸“7*¿Kï|Ÿþò˜LkŽÒ‚0&)“‘†^£íËS͸~üãÿéÇ]Ý'¿úÕ¯SSì6kT/ê‹€ ‰ XÛzúéh‹)c¨áwÜtc6ÂÆ"O¯Ý’­ÙÈ6cÍ´é¼ÃuT‡éé¹w%™vßÜ(!ÌQG¼T@ü&]iöë\x3N‡ž=à®té¯Ë}­t2†wYÚG¯½•´&…{kžäšÀ'xñbšJÿP£­ÌÂËN¿LiÇà®Ò†ÏVÞB›¾–Y€m˜”k}¼¾¹õ»Ímíß¾dõ[o%.9r¤—¤ÏËþ“×î@ø|‘é?ÿÌŸfú'>»whhÖµáöšû‘=©Î‘7UJgrîfŽxKTTUùe˲GîÛ•u2ðغí Õ3lÇ‘ËDQïæc[ ½©Ãpe«ÈÄ«ÒÜÍI§Æ0ÀÀºq§“Æ6ШùÕiGNðçCu2@HsjlÚZ*M>©—¨¡Î‹=žz+#³qpï_L,Ò÷1Ç€—¹$ @Eçá…˜/S33®ãñ_úxÈdBë7µ€€úMþÈ«R<Ê0áSZ&c^=(CÄ›ž#Þ’ç¸ã’F’Æ «^ 9+‡&@ tЃ倾¡‘Á<Œ'˜ áÕJ̧;Ý8¹JŸmíbòŽŠÕ³ü춃RÐ×c"LSØ ,vDÀƒiÕ¥=C»J;·o©Ú³w'ëL¦+ë±ÙØuüе˜ÌúfGwÏµï¸ø÷„çòÏO€þe'é¦ÅÁ÷©.ìrî•þ³í|¬þsô©§Ž[¶¢÷Œ³^U¢=,H º4,E5¦29í=–ý—…:?ÊP›vüïüþwé œÈn¹ýþlå©gd]ÝýT.Úö0¥†VujhÛ«ê:ìtÎý˜ZÚËþkaù  \×gÛ¶<ühTS›ñTuE¤bŠSð+‰  `óȳ€ƒkNÀ$íSX%ctÜ ¥s¶`€Ú°d:Gél ©ÜB+@lZ"’Q²­˜žµ9—š \ñ“oŠj´iN„ÁR¬Q‚Enõ øHMfàÖo-]Œ¨(½M—÷á‰;óù4:G„zà0®ˆÌ«3éd<ÆAñh‚lÙº…üU³ »=šez ¦iä”ávõ,bÂWOÌÐú“–šœc›¿žŽÀÚzÁÏx<Œ‚Q˜½”víÞV9²wW¥ƒÀ鳚ºúG[šÚ¾ÚÒÙõƒ·­~›ysÃr‚Þ¬–;ò¢h>Çs8ì€I ~?ÆÊΕ#tÅï|~ýú'ÿð„OšÁ\fœêþR%ôj»{ÿ¾!TyÔzâh¤ç~` ?[»æé¬»«9cÙUvÊIÇeë7ï ß' ÇÚcZo…V²ïc“‰Q–ü*5U/5%eûÝö¹0uà)ÍI÷äVk1*ÚúQõ}– „sÀÁ< €PÖ½†°…!P^ä'íò¯oÞ jãö)"¸T  ÆÊx -¤ìžVÚG€ƒè5°~(—1ÃNÈnŠÐ^xó¥{Hjü†ÊŽct¾éMÆïh£d8„tÆ=þcøkò»aÊê—7ÆÜƒ}¦„q‘É6Òÿ"“ñôElòe$å¹’ÏQ %½yhÀžŸmz-óhd†1;²oxfóÐ`Åè!‰º3`òõuëZznlnë¹ú’·^r ‘Ïÿ’¤Çmî}qó| PNRÙš½êÕ¯úâ5_ùò'×­{ºþ”ÓÎtfõÊAÙKœQ;‘(ì4„©4™d‚aÚûeO¯[Ç<®ì¡{ŸÎÎ>çUÙöÿÛƒi/ŒÀ²¬•ס:Áí0žcõ±‰´ói¸‚ȶª~”JFÞçÒ=ä]8 0Nîs?¨ŠVý¹±yË@=Oy„±0Qâ…)ç¸&9tåH†=ß”E(ǽÕÂ,uäB ŠnÌ\“t6ã)%ßàÌ)Å{™ã^€Ãæà‘ò”ù%_ȸÃH^ôSªy)ãÁ2šŽÏ¾+¿‰¼ÉãœõHÏm†ø†Å‡‡iå º‚²ŒrºzÏqí62Z0»oïޙͻv²,x3KtÞ3d»°fS}c÷ -]W¿ãßqô“ôØÈÃ\ÖÜl¼B½jÿt?éËüt~_°¯UåéÁÿÄGþ iü±‹.ú¥)vâíoŸ:ÚT½Ó½³·Zé lêè I>®ª÷Þq+V^³;ïþq¶|Å 1Jàö_Š!Ùc­?qò@.÷JK ‚¬ÅsàŠçÐ@|ç ~sâȼWÆY‰ù °Û¶õYÀ”#œ1(=Hâ­Œ¹ÐñúS΃¦(°¾þü‹|ÅU„ã‚¿Ä6â1Sä‡×)‰Äˆ*Ê’§¯5}p¹Õ¿øã—w”‡¨úŒ”Ó4L¤cxýÃü,ŸÐö04{0iަlb»·EÌáÐ.E"?ICPÓrõœ’¿½gi¶­®·©f=938¸½4¼wǼÙ ~°/DMMÓHsKÇ÷ZZ;þáœsν~``ày“sLéÎGŽâøX?#ޤÁJN>qÅ©ÿûû7^ÿ±žw‰ù&"©:Ù˜W>svBŽÑÝjØ ª¥µ=fטžÞæìǞʺ;)ÀÐõ < tìê<ûp{,¸8‚[`Ù H½õ :Qµya•NH @€qOäø²K•:ÀaR:’¹åLp‰ÇwDBÑ®'Nó«Ñ½áø÷0dtöy{®UÐð‡»qÛ\qøäyã6²®‚w:²DÔL‡ÿ}ÜEpSå)Ç:è¸Äs¤ #iI0"%‡ôëìÈJ†\+lþ³Hñjf{áBzñiÖ‘±Y¶Ý.íÙþììºG7VO U5a²¹µ½ÔÙvÂ÷Ú»:¾¾¨ÿ„ÿa½#Íè¸ãéëß«‡WÏf@‰Úƒy Ú‘Ó2IE7”V·œéDÆEsÛ)NÒ"%g’Ò†2­²v‚;ž#8™"xb‘GCEœ²8c(§WΫùñLù&^Ü}6ú¶ ^=|e9tD}w#ŒŽ®öØø¢À;ã’ù ³HúÒðÐàì¾á]hý¥¬‰ùmí}L îx¢£µý-ZvõÞð†§R¬ÏÙ¾/:òrŠÚkþým¬ÿJl×\sŠ^;ó¿þìÏÎ}øÞ[î\}Ñ%¥E‹+¬ZƒI*<€F¹£NeMR¬bŸSqGhó?|ÿi÷ïÉ~pÏãt ¡bRÙƒYP™­¬Æ••ªñl¦†u8ò—îupRq}ﯸŠ1zâðKà„?Þñˆ×t“ƒ"¢40qÄÁkaRi$ "iv[Ä zbrA §T—%˜%(÷üX.Ù¸Œ«\Šà¸™T¼ÖCÆýÆa‰…w¡1iÊ|½L3…ÓÀ¬ÃÉ|GÄqK3Ãù—âvÎOÒ¾œ5¼/£1LÝîì¶7vzr"@¿wx»M}l÷aó¾µk¦£½çÑÖŽŽë—-YqݪUç=Dœªó•H{© nÂ¥ø9,H_ý°Dý¯F÷ƒ¿ré÷û{—ü®F[/ņ¢i<^MÕÕî*ê<$H%CA“ NÒÑ·æÑG³=C»³{~&Úyh&Šýæ=÷Qa‰#¦äMTXf‰Õý#„¡Â!€•Úª䉑¢øŒ#@“â1l0€„Šè‹øŒŠ4Ô0ŒÖ¶±cõɬ6N3]âr-zŠ7rn>—£0¡`–¼æï#$?b^à–±Ÿ‚Ž#˜‡ì,ÊPM´ Ïáot½“]lâ>Q0<¸JôGè®åI T¦ ß—4¶œnIùfé«™YˆÿÒôxÅÈÞLøË::{´ï0ÙÚÙywG[×·–.¿áÍ\ðc“˲Š_€>'ȸÑ>€¼$VTln£·ÜÚ]>¬ø¦‡ap ÎÑÌPBò”lÏÙT(3{ÍøŒ¨øáÙÛVAZŽZÇðó\b‘Žf#F-L[oáOwKb©ÌG¨ [•>11àkÎh~àÏ6R*ƒ ¦ù•è/?ä‚ß#åUš%&ižek5̲d­¼fÖm§•FX»Á^õUSæìî_ÊÇ]I“n¦¥½}ÍÊW^wþùçoÌãçZó¯ÒîýËiÑÍAå?ªn_ @ |èCªþ¾0Õݹä/ïàο;餓bݸ3ÁG @À¬]ê€Ä8œñ³ñL€h’VO›YÛPî}’9^”Ýd*¾7J€4îbXòiõ`袔#¤bŠÖð—Àlxsä…w2'èiÇc Iè 1›gdX¤£q›;GRà,ôµh3Á”c[®™É#³[Öo¨žšÞ_Uߨ€ ¯¦Á¦¶%7¼âÔWÿÍ{/»ì9øÐÓ‘§”?¢vïÎDqÿÏ)jÚ?w?.¦Mž­>û•+ž¼ø¢K{ík/ÀÛt¥€O“t0/‘'ÈÄæhêÙµÏd{éiv5ßwo¾@PCETä\Pr%à ˜9àã'ÔzÞE…çU=Pf–Ê/¸‹¶3 K,z$üÀ#€ù#Ž`GDôÐñ\nEöÊ`Ž˜ËŒÎp©³1Enç¡GÞ¬ñ>1Hó(ÈuàŸpÁM—¼E°ÈMfè¹™Š›p°³]( ﬞ¢w¿&khîïíëû~[w÷W^sÖùß9ãŒ3rË9ÕHy“tÈ.@ÅÏQGƒjç‘ÏZÀ<µ€Ëß{éÇGF÷ýéû?ð‘é&6¦ÍŸ¯Ðv›â"­Få¶öƵkÙe‡hÌn¾í>,ö`>ºZƒ‚>!jx€"êyªäQ9ë!ØÒ›n !0LG”iF ¼á‚ÌaGcÚ¾›óäs9’À+Q*áõãi꺨]ˆá€-Wû-Ò»<_¾4O‰1$@+›Ó Å[ã &H^M;?ã4!ó†u¨Ô xôЏ¡ŠeÀ¯u5âáÛìmÀ:‡ívV쮘‡QŽº†V;óîêèéºzåé§}óç¿q£Ix¬b¢—¦àŽÄ–V)Åâ÷…RàEk˜ñÞÞÞöyïåü›¿øó+~oÍš'ÚÎ9ç5%ÔìŒÒãñ*8,TÚ6œO߀¦¼œwîʳTé@¹m[†9¨Žx}¿¢ èÌèæÆœaûU˜ n&pCðÆ³ž‰–ß\¢“ù-ƒÏ'ßËKÞ† Û)LHm8\›/øƒå˜÷Ñ—`d–ÅDñÃvJoâ6 ±øÇÀ2Ü,î¦åANøÅÍ0$î;•¥ˆ:<‘{úZìÁobà —Ú.¬™!ßIw­­ܼ³jAME¥[·/Zròcí_ëí]ôµK/½ô‘H ýhïÁØBµw¢Wq;ˆjðbf÷¬³Îš÷ÀLýÊ~éO°·÷‰w¿ïW§kj=Ø%ºjJ+3˜à¦ `¿Àö-³Íë×c¢6»ïÁGØzzoÌJê¨þÖxŽÔ£,}g3`šÓ!,½ OŽÍdÝ’"$¥ÈféÏèU¥ [–ØÌtäàÕðžqp£d÷ѬS˜¢Ú gxnt€F&‡1﹄dÇGÞ‰ÑâðÙ¹äb8Ï8xGÿ‡O-ùV¨eÍ€aRirŠ%¶;+öíÝVÅæ6̸ìÌZ[º6÷ôô|»¯wÑÿ½ì²÷ÞUŽÌK%Ú[• ðï:è]q{ QàEÕ¤Ó²eËJ0€ìô3ÎøìׯýÊ~æ©5óÏ8ël6~™L}h¢£\ÁõoEw’‰u;–ð­ý$à$GUº®øMQ’OÚ“ˆƒ°nYnÒ'€ø"Ä0µ<\x& :‰GL[DÆ…çhSûROÁDRü F (C* qâÏÓÃüD$é±\ŽÔH‰4pWªó߯úFÜΤ ªïá@:¤Ad:z•Ù‘5Â:¿a!Vtšô€Þ\Ììcß…õŸ¨.ULUvvwfËûOÙÅzúz»{®¾üÝø´{Þü{{ïUñiºÀ‡¼Çú‘êÏ‹_ dn6óÎw^ôwóç/üÀû~ùƒÓˆ¾WðM°c‹µ-¬¼ò|€U‚Ï>½&Vý=úøÓÙÞ}#Hm˜@Bfà%Õ}CŧmBfø„içÖ°x‰Ÿ@ð` 7îˆ3°í3÷í²ä7W¦Däµ yþˆ)€›dº~©CZ—ñ&§tMÖ `Sà¯Í–,,Å;óqàžæ8à€{Z¹ mIk:T‰6½¶ùhQŒØ_Ú=¸µzrjÖÒÖ̶]{Ú»z¿Óß¿ì«g¾vÕm+Øš7«Šv}NŠ—äõEפ*ãÁÙµ,X¹ò´¿¼é{ßþÀÚgÖV¿âôW°öT CÕ8_þ*{]] `OÂ.nI 66|€ +ÏzŽhã?©øÉ€JÒ؈#ö§Ü„\9h}“À–®ie€KOïSs$±Ë @´BšØÈ‹ÉĤ&žM/Å¢7Zø2þÔH¿–˰:äËrmêÄhÎÁ’â5åQÔû¨ˆ5õ˜P¯§ ɳlL:³cóÚÊý#[+›[š*Û{{f{zμ­§§ëªó^½ê[ Ãî&p®×¸ì²kæ&çíúœ2/½«µëh9ÄKé­o<÷[{–\ôî÷¾ ”šbµŸ3íìøÓ|ÛpaÄs×öMÙ0+ï¸û¡°èëÐÜ, P+‘îºi%H.'°”Æ2†%^„eh63ø>ÀûƒAýy“Áxd É{„÷!w”¡-X³`ªÁHô™0#qC‘fŒàfœÁ|̈ÏáKOá™kòT~On‰4Ê¿i¬¾µÉ½èȬšœ/ ïÚžíÜÂRŠŠ¬«·/ëìì]ßÓ·èËËŽ?á+]xÑãú‰Î¼bÑÍAyÜFu<ÊyÅ«;¾eú·?þßxÿwßxée¿Zb©p¥›qL°å“<(ù4ó5I¯ÿÎÍbjð?| ÛÈŒÀZ6ðtH.öìCÒŠY5üh ?1@S–“¼ìþÅTÍ€§ÔnOÔ@D^\pB/Õ½dP¦—˜G9Ýx¶B8ˆ×|¥˜ô,"9»C}z‹ÐæEæB¤yþŒ)4^iØÃ¿y¬·×H¦½øLËe¶ôtiÿð®ÙÝ;7³ñtÖÞÙ—5·uµµuÝØÝ³ø>ð¾÷Ý@îÕît¸óïƒ/¿Ÿ¨nGI±ÍKàõÝïyû›ZÏyÇ%—Òr/Ua (vx ÚöÓ˜ç¶MlO?³.{ø‘'»Æ`$1`< LîcLŸB³¬*rBœ’w~±>"#Tòàx»/Õæi‘«±Ç½±æG ™w§ÈË÷zTô”É?» -à´€ž¾¾Oßsû­Æ™¯še”äÑBÙŽödÛÍ9ܽ×ýÛéÛK*y¨øxRŠH¨¹1Ûåb3:é¹ZÊ LIDATb$*Èð'Ø„¼W^ø”|oqĸEôöÏ%T“Úøõ—"Àš„à×)ØB¤CÖô‡» 9GêÛ0r¢‰1!'&Ùï±€üú…0›ÒìèÈþ™ ›ž¬œœÞSÙÚÑU¹ä¸%¨ù½·võ\}ò)¯ºþÕ¯xÅfóP>Vñ ³Y9U^æ×ru=j¨`~ÀÀlõ¯;ëñeÇŸ±üÒË.¡ Êai€3wlÝ›xìÚ9˜Ý~ç½1{-Ÿ ò/WÇu·í’Ö)µÑ)GJŠlÁ—»áæ„ ×â®Slõ“fæŒÁLâ TÜÉ<³iTA Ö«^"@lȤ8”ç“<ÀÀø‘è`~xcþ±çT`{ð¶ÓJ. ÉìèèHiÇÖ ³#{¶V·b"½—Å7­í=Ovw÷cÙ¢ã¿ü–·¼å1"É*ìåUnÛ¶­¯Ï)R\ŸG£I0c³«v4Ó¿öÁ˯¼ÿ‡ßÿÔ¹ç[êéë­š`è)4Ù©¿SlÙUM'ŸûχäH.4F©zí_A´ |ºÅê@(’Åþ ͽëZ PÂ,’f®$·­WÒQ›‘Ê2£ X óÒ‰C¼Kçq‹¬&Ï]^eþÌ’VqÓHz˜ÂÄØ™›¶”wn˜· ®ªJПvÚ†;zú¯ëî¸ê=—¾ç&h¥ âJ@_Uý »×æF6RŠß‚QÀªzT€€º\1{å•W¶\uÕçž>ýô×´]|ñÛJã“ì!Z’å™YÖ`5–I,nßuË÷Ð\Û  Âä 8™(ÈtÃE¤qØHÍÞ‰jÜ“ÁŸx¯³1òÌ{mp±­Ì@q4ßy‡?Ó˜ë àuÈ{ü*ñ¹à?=Ø€~q¯¡3OIßàX=£0¼ÒÐÐΙá]›0~0QÑÕ3€ù¬ŽÙ®Þþ›»»¾tþk^ÝÁCw®«¸ð KE»^ÇOK¨?­ç#åO-€±çé÷ðÝÿó±‡üÝ~ìw¦Ú::繡eß/eûØðC&ষÃÜñ'†CŠªÄ¼×ÏåZÀs_€½ÕV½Ì@Í!¼‹lÿ9òRÈ3Žä7w 8GRÆŒ«™Fú÷!å!âĨWŽØp„[w,n ß=\n;19VÚ;48³}Óºª±ñÝ•€=ëìè£C¯ëÑöÎî«¿è«¿ôö÷ÏÙË“NåÅ7ò7S/Ž‚?޶&@džŠÖƒWœýÊÏ=ýÌã¿ùÀ½÷Ö¼áͫթU/0«˜ÂË.t•q~:È\¬lvn’´‚-Ér±‘Úð@Vg~BñˆóÄ(Œ^Ÿ Gªî ¯¶ÏÕ Ò;A¯ /[öñ—Ñ¡w¶ã±@ç£M ã´Ã’5NôÆÆÆÜŠC™“³{‡ýÖõ“CUHúÊ•gœÂ<ýÚU5 ¿ÙÔÜvõï~ü¿=o>½ø•åñúéb’N¼øù9)jîÏøp›ÓÞÙÿyúáýû}â÷§›š[c‘¸eןí[6GGÙÝ÷܇i°áP££óLÀ†8'‡–¦MƒÀvÿ€ã}*‰ÐÎc8‘‡hÂ_äúÌ™G\e&2<Æ&¤sðñ‹{h†h S«¸nS^Ã|˜ *íÜDOþ–êή^v=:!ì[[ÛÚohlíºöÂUÞú/ØÁ/ÆëýÅqÈ(pTj–.×–¯<õÓOÀ}èÁê×]øæ°*àæÑ 86¿Ãl  ¬`Æ ‚£­o»^ñ-˜•üJ`Áš€«kÄñ†wÄ·ƒÜõèã?¸hN,#éX¹€t*­ˆQ+¬6ÔüS‰ì µ®+@ä \ò7p°y »y‚ÞãÄoŠ#i¶ëûQ%=yuLÒYÀÆ–öàŽÌnß´yfpû3óçÍT-Zzb劕oÊÚÛ»êìè¾vù)+¾úúW¿þiS.ZIÎÛõ3.Œ*Ž‚G‚Tû£þì^þþwß|ËM7¬zã…ï˜9óìWVutwgCƒƒHæ™ì™§×e÷Þ÷HV‡‘Ð4».×'åßòdÐ,{È2†0:ʳ’½ЪIØyöQÿ½!äéÙ9øjìlœÕ³ÀŸÃôC»vÌìܱ¾¿ÑªÞ¥YïÀ²¬¥½s}WGÇ5Ë¿qñżg}…†Q³wwÔrä¨ÿE_b8ê’Q“Ó¿ó;ŸxûÝwÞôÍùóë¦Î9çüyKOXx‚íÀ7nÚ’Ýq׌£³u¨ê60R,‡O®tôq#sà¥>ú¢_€® áŸ‡ž2 8CVÍP]Kl]x£–À°ÝìÞ¡¥¡-ëØýfwuwÿò¬ à·µwu¶wߨÓÛÿ•w¾ó2ßLF†øùÐç¯o)Æësz×—G=€<æ1°û¿þ‘5wÝzãòóßðö©ÞE}óê± 0Ãrá­Ûvd7ßqoV‡ .¨…·(Ÿ«:%q¹(ÇGàÏ!õÕîe;lð•žÏ†–µNÅe]}ìcyò}ÃC3;·?[Ù4¯«k X²"kié:ÐÖÚq=ÃxמñÅ7/nnÞCq4IÇ,EYʯŠKA•Gu@™2³¶9Kg½òÜwŽMO}yrfò´ñÑÉ™-›ÖTp Ù|¶ ¼Ú PÚ'é­d‡ tçòâ]sä…€Ç1ÙýO †):Ÿ³ò4‰­=Ž#ûv—¶ïÜ<3¼ûÙêæöÖª“N\ÉN¶çµv÷?ÐÖÑ~í+Oå5+W®ÜžÍU«²ê?øƒ+²U«þ@ Zù«âZPਡÀ± ±ì§s,æµÿÖoýú·z{Þ†$Ÿ©«¯«Ú·öïÝ’$x%<-‰w¨e vrûÎÂSíC¡1_ yw]}ãôÉtØnzj"c¬~vÏà¶™=ƒO±NUõâå§e½¨ømÝôvõ}õ„OþÊyç·!ÿš«¶ãÌ·¯.$}N˜âzÔRà˜aR-`>çä'?ùÉãjæW­éêê­d:íìÈèHÅ 7Þ‚§Ã’²“äW#PñáÏ ½hÓóN›ÿNÃmmn‰á»ÒÌd¶ßð,ëêKCƒk˜g0QÕ3p *þIl‚Ñ2Äúúëúºýí»Þõ®Ûú¢ÑƒÏs1Iç ¢·ÇŽ40½$•²®øÍßøØ×/=þ’ ê§Ù úÆ›n¢m>ÊüzöŸ&•XÈÃb'ôØÒw‘K‰µ \G~KÛYÕÙtȲ1fîÙ½£´sçz¬cï¬îX™-Z¼€~Ë Šíüwí>¿sÇà%‹ê1ô‹{ÔöáÒ~„?³+¨cûtÛ C /bþ½{Ûixj|,Û¶yýìÐŽ­3£û·T6u¶Wž|Ê)•mLËeÎíXÒùÒñ§œrÃùgŸ½1§]>IÇw0€Â¨FN˜âzÌR@‰ü‚€F—kGì0ϑޯýê|êig­\¸°væ¶;n¯Z»a#Ö±ä8>jÀ<æà×14èìùñÿ> ú?<ñäS¦îºçžy?Â6`kKcl~¡š_ #˜ššŒÎ¼ÁÝÛgÆÇöW´4×Wu´·e]]YcsûXs[×w,ûòå—_þ]ÙhùËÆ2_2U¼(È¿FŸ›¼’®yÚ\k~ùòËX²¼4[5óÌšõUµÌd‚N¶w«ívn/Û]ÁN8Um­m´é›Ñ‡[ÚºnX²øÛgŸñšïÜ‹¯eâ“O.6·œ#tqó’§ÀÏÝp„Õþç}Ó¶ŽëÄýýßý½ÞqëW³Ùù¥yój*Ö¯{¼´cËúÊÚ†•½Ý•=}ÇѨ۾°nÁš¿uꩯ¸ùÃþÄœ…\"þ c™·úÑÿpóý÷Ü´jrbœ5÷­Ù¿[ï×*­z¼^5p]wV^«iM% ùîPµž¹÷Þ{9ë*¿0)DT?øƒ?¸H)õà„™-Æ¿nÒª‡ëLÓ%êIÌ6c x×uQJ½ øªˆ€¹…€YÌL»>ëÕPœ®ˆúɳj¥;_ÿL× àmÀW¯ºê*sõѰfäûÕrÃV+jixD Ì\ÞTsÔ?Ÿ´Õ·ÿvÕUW-•Ö3ûPf{î—)j§5^úóY LWT»^Ìæv:ŒÑn¢?ºêª«vÌÛF4GP'Ì¥¢Zù1]j® ‚é~Îj_g.¬˜­×«l•RKñ¦®™³ g  Ê c&ú\\á?Æy¸¡œÍóµ3ñ õZösÄõ>ãízøßJ©&à³uÖØæJg5W¶ùÕ»(¨‡û«Õnz¸/iÏãF 0Ë‘@@U`íÚµ#ÍtÀz Ø3ÿTãþêÝQ¯ª•Î|÷L¢®ËÖ¬Yc¯Y³æ…Ý»w§gÅ â¨WæÒœþ|Üï?ÚÈ|²?õþ\õZžbü§7Üg(¥>ç m‚³5b®,\ª÷Õý²ªúêólˆ ÆæÒÈM \‡Ä ˜5ˆ¨!sIÈ~ÿùY§£¼ê©­Í·ýLïXÈG Pÿˆ˜q..ì›Î-~B}åÛ\Ü&XOiÌtž‰€¯\uÕUMÒªêuÞ˜ª•F½Š€éÜ—.b`fóg®n”4ÆLãí®ëÞ¿}ûvÙ!P§ˆ˜&êEÈ^³=0PµÚS½´ËzJ£Ú(¥¶wЍODL#s­£˜í{ý%àô\·^Óã_Û6]5°¸CD@ý!`2×W÷KПÙý µÜñQO÷'Æ¿¼´Š‰¨/ É‚é%×ê"jÝKµÓ*N3ÏLþ¯SœÉ`Dõ(Nê}›`5Óšk.ûZçq^¸®ûïÛ·o?üùÏž¨»J<ÏÀ,nlóq‹_½•ãTüÌ… A³!F@=¶»zËŸé¨'J©fà?olß¾]¶ Î0"f°1ÌÅtòiÉ^y†zªCbü§¯í—ñ¾Ê 0³ˆ˜AærGP‹ôFK_¶öMo}1ÄøOOLZŃDÌ"f˜zìfÛ?ÙÚWû::ÅÜ\\4XéTšÖ0—–6ýˆ¨æC¤> ú3ûêäl6üsÕØÎµz]$îܾ}ûÙÒò¦uÔª•Žlñ+½–ˆÉåÕt–O=§)#öéI+÷ýÀ}Û·o¿VZãô!@ø´¦Uœ¦ý™Ù:;Sù1„å\±×qßÐ üû•W^)±¦ Ò8ËNk.á×/‚ ^‚Õû¨¿šé‰ ©ˆ&àÓƒ€*6Ðù2—_ïù7•ëϵ-zõ’¯³!í¹Þ†ë½/( œoµp– KLµkמ¼;ÿw5#ÄÕkZµHoºÓŸÍ÷Vïe:Ökz³éØìz½/¥Tضzõê¶Õ«W?¾gÏžT]WøYŠxê¼qÌç•ýõ<¯4‚_µ~ê¹î϶:1ÚëlX4üo¥T“Rê#ÀW®¼òJ‰PDÔˆùÜxk‘¾,Þ«ïº>[ ¿ìú¨?ã•O>V€ˆ€ê#`*v=¤5Û÷ù 3_·§³Ìë=Íùäõ›‰º&" 6Èi€ÓSyë.­Z¤WÜAÔzŽ|&N tÛ¶kšvþ¹*¬æ8–eù™ü5ÆJß²,ü~ÿ˜iX–E$AÓÆ;†Accã¨yå8mmm–Y9ϯ”âĉ%Û¶éììÄ0ŒŠÒÐ4D"ã8“®³Ãó+NcFÅy¢ë:J©QóµÜ¼Ôu]× Ïæóù WZ'+Í“1úª·¹®Ë•W^yã/~ñ‹„)#`¨æÀÉd’d2YÒéLÔioè“Á¶mB¡Ð¸~Å•Ï0hhh(»-ç™ò¦’g/ŸÇ¡±±‘H$RÕü-΋¶¶¶)u²®ëÒÒÒ‚išc~& ‹Å Ÿíþ›ššFvìØÁwÜÁõ×_Ï©S§H§Ó“N§Ú;DL 3„ˆAf‹/æCú·Ýv+V¬ »»{F½’¹~ômÀW¯¸â “DÀ ""@„ÙÈë_ÿzn½õV>ð ë:ýýý~§Æýˆ€ 0ÃL¦Qˆ`¡^hhhàï|'_þò—¹ð éììsZ ÖQ"Ât€ˆ€òPˆaa¶²téR>ó™Ïð/ÿò/¬X±‚®®®’iéŒ*"`rˆ¨Ê «*bA„zäüóÏ/L tww388XókŽqˆˆ€2Pgˆa¶ÒÐÐÀýÑñõ¯M›6100P³kwˆˆ€òP‡ˆa6³aÃ>õ©Oñº×½®¬‚ÕFD@yˆ¨SF•Z"‚0ÝÄb1>ò‘°qãÆŠbŒG¹Ó¥"ÆGÀ4UÆJÓ-N;NÓÝÝ-.¬`Ñ¢E¼ÿýïŸÔ©‰1ÙS"ÆF@•¨åÙèùtu]€ ³Š3Ï<“¿ø‹¿¨Êz€JÉ.A)‘!DT™Z‹A„ÙÆŽ;xÃÞ0#ë Ð^¼UJcµ«l‚ BŽøÃSZP…ð¯W\qÅ5R"j„xA†hooçýï?ƒƒƒ“^PÅ›€;Dxˆ¨!b¬A†È¯èë뛑þ1wͼØ1ßËCÀ4T8‚ ×]w×]w===e}¾FýgpëW\±x>—…€iBD€ ‚Ç 7ÜÀ¦M›& \ã~s9ðùù¼=PÀ4""@Á‹ð×ýׄB¡1×LSù‡ÀW·mÛ6/E€€iFD€ ,[¶Œ÷¼ç=#N„iï'߯<"f‚ Þz€~ðƒ3á4ßçmÛ¶m^ 0CT²8PÓ4’ɤdž s†7½éMlܸ‘¾¾>`úHùë]ïmÀ[æSÞ‹˜a&SÙ•R…F"‚0hnnæÿñY¶lYÕÎ ˜,¹ÿ϶mÛÔ|É{u@¹" WAAæ‹-âÍo~ó´ pÆés}¿üå/çÍ­€:Aâ‚0Ÿ¹ä’KˆF£5¿Žô³Cˆ¨3¤r ‚0ikkcÍš5ÒN#"êi‚ ÌG.¸à‚ ƒMé[KP§È”€ ósÎ9§âÓ'BúÓ‘ˆ¨s¤Ò ‚0_X³f çž{nÕwH?::"f£ìWA˜“\xá…$ Ɉi@@˜Ã,Æ_„ù@µ§¤ïU¬dRÑA¦F5§¤OU¦ÖN*´ sjLH_91"j€Tæb@駆€:@*± ÂèœwÞy¤R©¯K¿9uDÔ ²@Pa$«V­Âçó•¼&}euPgHÅA(¥8þ‰ô‘ÕC@"ÞA„‘H¿X]DHeA¨{¤?¬>"fA¥ÏW|MÓ°m[2EA˜2"f ®ë¢i’‚ ”0‹£€A„j!@Aæ!"Aa"  ÈêTAa¶aHT‡b sõ‚ B½#€ A¡ÞP#D‚ Ì.æ[¿- Æ•I„€ ‚Pˆ˜ª-DT‚ TùÚ§Š˜Æ &†[¡¾˜Ïý²€YVÙd‡ ‚P DÌ•z4M£¿¿˲$A¦È|÷ÊŠ˜E•//äD@Aæµ0Ô2%+ .*öd+¢T\A„Ê‘>ÔC@UH©”‚ µEúÙ!DHåA˜HÿZŠ€:­¤RQAª‡ô©#PçV*­ ó™jôÒŽŽ€yÒAæ#ÒŽ,•XaN"ýæøˆ@*µ œCúɉ ‚ Ì)Äø—‡AaÎ Æ¿|D‚ s1þ“CÎ!Ça`` ¬'{ª`%§ÿŽëºèºN ¡ªˆñŸ<"fãâÝ»wóîw¿Ó4«žv5¾—Íf¹ä’K¸ùæ›Ñ4q> ‚ Ì$"ª€eY(¥²€Yiš¦•eH;::H&“„B¡ï9ŽÃ#ùŸ®ë¾ÝqœûòFºÜÇq¦|étšîîîš>d¥S‚ ÕFŒÿÔ@Ùµk×}guÖãÀÿ®BÓUñ]×-xúúúê¾áŠ˜¡RÄøWUf×®]ÝguÖ?þ hš®±lÙ2~ó›ßLË ÿJPJÑÚÚ*Æ_„Šã_=DTÈý÷ßߨ£½gš¦»víÚŸþýßÿýŽü]6›}ãx•Ö4M”R8ŽSñ9×u ¬^½ºn ¬¦i466Jå¡"ÄøWpÿý÷/~ÄF{?›ÍòüóÏsýõ×g2™Lc6›7=¥>ú(O<ñÄ”VÈ+¥êæáÑDˆ4^A*¥ÖýÇ|ìŸDT†XÁsüŽã`†1~6kš†®ëSª€>Ÿx<^’Fµ<ÕLG‚ ‚ Ô"æJAº®ù¾Ì» ‚ ň¨Û¶1MsÜûDw4WýT]PbäA„rP .,ÛJn6›¥¯¯¯¢S ;vŒÁÁAúûûééé¡©©‰@ @[[MMMƒA)hA„9Œ€J2͘|¶ ×uÇ\ì—7îå‹É|6™L²{÷nüqî»ï>~ðƒŒú¹E‹±mÛ6®½öZÎ;ïêw’É$ßøÆ7øÆ7¾ÁE]Ä7ÞÈ[Þò"‘ˆ¢ ÂB@LÆ8õ½r¿;!ÍfùéOÊ'>ñ ^yåÂápYÞ‹††”R<þøãüö·¿åOÿôOùøÇ?κuë¤ðAæ"¦ÀTBÚÚ¶=©¹üügËýÎàà ßúÖ·xï{ß PñO†`0H0äk_ûüó?ÿ³ˆA„9‚€)R‰7 /ò{ª‰RŠl6ËücÞûÞ÷¢”"Þïíí-ü¾dÉ–/_ŽR MÓØ³gGŽ ãóùhlläž{îÁqn½õVÖ®];¿Ê8÷ÖË×ÓCM6^BmÛŸ«"ªXIëeÞ³Ï>Ë 7ÜP0þýýý8ŽÃöíÛ¹òÊ+Ù¸q#±X¬dµÿàà <þøã|éK_¢³³³º·±±‘Ÿüä'œ}öÙ|âŸ(ëèâÙF*GOA" Ïí‡4t'¼]‡´íý„}`*Xƒ˜bAXÖ ‹š 1 ¾*¶¬dÊâp‡¦{âùÚæ2ô{9D‚`hzÿ×3– ¿z0‹ž½ˆ.Ú43÷vä$dÊÜÄ3Qù¸@, Ñ †Ó*L"ªH¥k¦r­b”Rô÷÷óoÿöoÄb^¤âü速ýìg¹ôÒKikk+¤QœN4¥½½ 6pþùçóµ¯}»îº«à ˆÅbÜ|óÍœ{î¹\uÕU³¾¼R°,8t~¿Þ /÷B£ß3à Ï@š:˜xxØçýí3=/@Ò…Á„Gy^ØØW@[#´Nñøƒƒ‡»xíçòú‚þa†Py»Œ4ù¦n¡Î€åxÿ¦¡%º‚ö4†!‚M+`ÉÂú»÷§¸òki.Z''÷¬– ‚àW°¢ N›Í*÷å=Ü;¸šp”Êÿâü.´×áíwØ‹)VøaQâ~XÓAÖ,†åm°l‘'2¡šˆ¨µö _P|­'Ÿ|’;`üûûû¸óÎ;¹ì²Ë0 £pèPñbÄ|Z¶m£ë:gœq7ß|3ëÖ­ã–[nÁçóþð‡?äâ‹/&ÏÊòIeà©—à«¿‚AޤÀ¯AÜ„&¬ ô%áTgD]r†'×a+å¹þM ‚&„s€x„!à‡#IØõô$`M#l\ ›VA[gC*}'öÐÓÑB°uôi‡‰¼¤y/ X.ä8YötAê$ôfà?ž€Ö œw\q,^0³eõøsiZn2×aiC×é-`šðÈspý å$iV/‚¦Ø$n^Wün_M]-|ùÂÃý¯F¿ÿâ¿5Í3"šò¼º~bô¦àkÏÂO_ë7Ãå[ qvf²ð«]ËC>,ÇóÖèZ¾^{å¹f)üÏØ>ñi¿GoØŸÎ$0¬AßÈLÞüÕXUJ ý?â€íÂ=/yårébøàU°fÉüëO…ê"`*îpP«Ê¼ÿ~î¾ûî×ÿŽ;¸âŠ+‡ÃÄãñÂÈ¿8‘RªpQ$!NÓÛÛ‹mÛ¬\¹’~ðƒüæ7¿)¹Öƒ>8k@: ¿üoøÁpÿIX€àX0eĨmLɦÆßq íx×ë„}§<ASN , CwþýQ°-oDwÁé°jQ™UËŸö¨†îY"Š\ÑjäËØ68¹õ ©L¾x &´û<#{Ûïà—/Â{/†³×On­ÁT¹ÿ‘>~uBgYTÇЇŒž£=°|ƒðû—áÒ³g¶ž{FÓýj´Ï¿X|æÒSÊ«±,‹Àþ^øÀ7á]¯…w\&}¬P9âHš¦ëˆÞîîî¯]|ñÅ´¶¶Ç1M]×GD!,öVèºN0dÁ‚ƒA\×eÆ \qÅضg14Mã™gž!•JÕ}Þï>_¸ ÞûSx¦ N3Áµ¼Ñ¤ëP¾Ëvã?ü£ O ¤áP<}~¿óŽl‰À³'à³?ƒ‡Ÿ™Ú3ª©~'wÃ.µa ÝýMyb©3ïû|û×y¸+"“…o=faÀã*Ìa=•RЗòm¶5£¯x÷>­{ÔLq§žês½ÅéŒWwÛ‚°ªîzþù»pàø<éH…ª#`:»Š‹€½{÷ŽxíüóÏ'—¾8¦iÇÑup8Ìúõë [xøá‡GõB*?ù-üï¯ÂíÏB›¦ëý¼./Cr‹ìlïÇÉÿ8^ZîÞƒü߶㬧àÙƒpðlZ [–zÆn¢{˜è½ÑªÖXÏX]Ž’ù?-×[ÑÛaàÌø'á;¿‡Úóê¡ ?;a0t4¥0ôܳ=§ã±nÀ žß;í-ºì·† ®1§rï©ae“ÿ5cA²XÕ/vÀ?Ü'ºægŸZõgS 20…JRÉü~­*X6›åرc%¯mÛ¶­°Ï¿’¨…º®‰DèïïgÍš5%ï8p€ÁÁÁº,Ÿž>‡;~âòOOê,4¡5·­J£ Ãï€ëX¸Žãdql ǵs^Ç+?×óË*¥£4M3PšŽ®›è†9Ô–¯xSÙ¬7ÿî”[Ü1~Â$RY2>M›Ð[áMKi 44MGÓšVzÏù_“Yèê‡V No‚o<íM\{amËðÁß'~@#hæ>ŽbT»žñko†»ÿÎXéíΘ¶¾ ø¶†ÝŸô%’hÊ[ ˜ÏÓ1놛ª¡é:º¦Ðõ‘å踞—Nköòà¾'௾Y˜"¦Òø«¸Ú²Â`øçÓé4§N*yM)UæS©h ƒ$“ÉQ¨»29p$Ë翗ᛇÂ,õy Ýôa{æóóªù” 8®Æ¶3XVÛ¶°Û±‹ ±(ä2Ji! é> Ãa0̺®Úá/4œ¸èÝ¡º¥3û.ЂóV˜<òlûºøõ‚©)~êÂß®ëjjš®û0}!ü¾ ¦Yz¿Jy"àdŸgø7·ÂÏ^€×¬†‹jS†/îMñ·¿¶X ƒRÞŠ÷á('²²6ï†öè³à…}°iÍtu#~)aÍ"HšüüÙƒ }¨ÆààæÊÖ›Š3ð™~B¡@Ÿ1R  ¤ád··Mð‰ÿ-¼å"é—gº/ŸMˆ¨BÅf¤òä+­ã8ôõõ‘Í–ú’G»§ÉÞ¯¦iƒÁQ?Ÿõ£ŸþŽÍ„XêCy?£g^Î#`gpíÙlš¬•%k[ d-:²ÉŒMP·Ð]›e>˱ ~ÿ¬ëòj*?ÿ«¡™í¦ŽO7¼QµîG3ü˜¾0>Óô‘œçG9GBYAbÆô6»ÞˆpÍrˆZù»»ŸepB½ƒ_Aƒîí£7uM÷aú"„B aŠgŒ”‚DÆs·7E¼Ÿý>rmmÊñ±]I2š]Ó04UØöèâ‰9×-•4ýÐÝKƒ»¦QŒS.Ž A?œ½Þà•#~ºï¸ã”´\‡¸Q üºBÓtL3H(¡1§1@+]ÿI_Ò{öUmððn8ïÌʶšÖ3µî[çóU®DÓ¨8&Àðè|/¿ü2D£Ñ•¼ÜûÍîàÁƒ#Þ+Ž"8Ó>–äÿ3ˇ8Íï-ÓÇx4 0] ìÙlŠT6Ko&˾¤EPY¼¥Ýæ5+Ѭ[$PZÉPݶ’)›Á¤Í¡cIöNñò‘,Ïw¸¼’ÒA7Yðá7ýd|aL_ľ *·ýNÓJÙ„å>Îë® ¡¼gc„-ý8N±Ï¼4#ÐÑáhW–½'³<Ôaƒa²,ÔO6›$c5‹4–¸Ò•ò¶<žì Ëà`'ì>kN«n9¦3ðë]6+C!”Ò¥Ïöå¶^ª¡ûJ[p¬Î\ /œ€ƒÇaiÛ´´úqßµ/ª_û‚fn[ÓAÑìÌ”‚΋TÆaïÑ$ÿ}$ËAXñMGHf3Xv3ͱÐÐzˆÜÇ{ ¥Zá¡§ám—έ¾u:bªÌWDÔ BÍ„7@×uV®\YòÚ¾}û8~ü8ííícVô‰„€R Ó4GÌ÷/[¶ŒP(TyÞ7`óõ{Ó|ýHÓƒú¸Æß‡‹éfp¬‰Lšît–=I‹w,±øèZ8kµÉâÖ á ·>Vij,{â IDATÈóÎPÄ·b´iC¶ã’JYôög8|,Ác»zyøÅ~ÛiФÑ?@&ÂôE0|!¬`t¸7¢š5æ«ù xýæ6Þøš`ÑÚ‚‘P€í¸X–Cošý‡úøÍc|ááâñ-®J£!Gׇ¾ç¸p¼V¤`q3üôqøH•ÀýôpßqƒåQSWèÚГ´F¡{ ƒáóÜé.p¤–'¼¨‹>7]`ìrj_°´Eç†í‹ñf£—9O(R)‹#Çûxø‰£Üõ@'žêcE“Íq×›X ¼" oaà±Nظ^8 =Ð §w—ÕWÏwDÔ°b'jqÐÒ¥KG¼¾oß>¶lÙRñ=+¥èééáÉ'Ÿ,Œø»ºº¸úê« ç Ìä4ˆíÀ]¿èçoorFÄð\ÆÃö¶¸x£þ€rñ“&k¥èJeØ5å†Å¾Áá’³}Ä£ù!š—€®ë…Ÿüóiš†ãxklÛ.ühš"4 …|´·†Ù²qoïLðô ]üׯzøåñAšÂaƒhfˆ¤±¬UÙW_z6¿àsw³ hšÂçÓX¸À ­%ÂëšØ²þ _ÿYÏö)4#@Ê$ôÕHd½yçÍk½m§z`ACuÊ2o?ba Ž‹Â§×Oˆø½-/I“µ|øL ë98r Ö-…ß„+û¡!:ÓA®ŽÚùgP%íªäc.ÞÂL ò±nu «W4óú-'øämOðËS.« ?'û}ý~¢A­$æ@瀗ñ¨åòçH?\N7ßPãJ6]S®ë²páB@!œ/À7¿ùM.¸àZ[[s#ŒòFqˆàŸýìgÜ}÷Ý45 M.^~ùå„B¡Q§#Š¿_k~÷d/ŸyÀa]ÈÄÔõ!RÝ\%ë.~•!•N³·?ËŠ€Å—/w¸älXÄ@Ó¼ñ~¿ŸH$Rˆ•Pîsä£)f³Y‰:­ #lk ³ùô&nx¡‹ÿúU7¿<6@S$ÌÉÁ^Ž[@ÓÂrñ˘4ƃ,h)j&¥±ík±¬ ÿûÎc„C $ü1>_Á  ð¼§¼[imðÜíÕ¯JqÏ “3ã¹­Ãʲ9w^k¥HØ>|¦¿$‹ŽæÄ…B^` Ë¦ÍŽ_.Jƒ@0H$<ù´¶lóÿ~ÄÅüÒÓüª¿¥¾(]ƒ BþÅk=ÓtõzgìÚ/ œ>N8ÓRÙÆš¯ùÕþ .ä]ïzWÁ]‹Å¸çž{øÉO~B2™¨œtŸ{î9n»í6LÓ,yoÓ¦M“~îjsèh‚ÏßÀÒøóÆ¿hÁX~ä5 fZd³^곸¬ÝâSèðæ‹5š}„ÃZZÒÒÒRˆ}0Ù­“J)Ñh”… ÒÜÜL8AÓtZF¸ââÓøìM«øú;Ã\±¨Ÿ¾ž.î}èöð ĵhŒß‡^rñb¨I¶h¿ßO8fÁ‚Äãq.»h=:_cß@Y+EƲGD¨ëI@"éÆ÷­^y>øû>=¿õ¯t7‚©yÑ]Réé$Y‹ÂªJ /αΡÀ@«æ­{Ì")dV]«¬«Õ4-›×òÉ÷žM*Ñc§HgHgÝ’Ý® }ÞÂþ4$ê?F׌õÇBQý’,˜¾Š7Qå›LåþÙ|¿­[·–¼nš&ögÆ·¿ýí²E@>\ðÞ½{¹õÖ[yæ™gˆD¼IÅ®®.ÞñŽw°råʲî·VB ™ÊðµäG|¦®ªÜ†wÀOcÀÁ¶-^î³øÓ3-nz‹Ã†U>Âá0MMÍÄb±‚ѯyA–ñx†é£­5Ê/åïß·šoüIŒÅ¾£|ýáW !y+®[Œ S >ŸŸ%KÚyë¶µLàØ²–5´ö1÷Ê‚¾AïøÚ¾duÊó…= þæWY–M”¦a[{À‚töBw_7™L‚D:3"0ÐÑ.À´[ûÀ@nq¦LTŧX·¶lZÁÛWûpl ˱IeíÒ³ô§<è÷A_ýíЭûþw>"`*b-0M×uY¿~=×\sMáà`0XßúÖ·8zÔ²y.ï¡óóÛš¦188ȃ>ȇ?üaþó?ÿ“ÆÆÒól¯¹æšIïÈ7Àj=ÿž} n~BcCЩ›£ž1¼øû:6»{²üñéYþd»ËŠ%šˆÅâU5ü£¡”" ÒÜÜL,Ç0}4ăl»x)·|p=ÿty7>zÆÏ»¢ǽV•îyݚŜðBZŽM±ýÏ_c0åt¸Ë S;UÛ•dP`覦 þq½ÑÿiM^€ŸýÇÓtôu`gL'±Ju%¼5 ‹šàîǼ K5oÓã”Ç.›Z½÷û4ÎZ¥Órq]ÈXöˆC«ÒYÏëa˜pôäŒÄEžW}î\@ÖL¡BÍtàˆâûȇúÇãÜxãÜwß}d2|>¡PˆD"Á7ÞÈ…^È;Þñ¶lÙB{{{adïº.'Ož$‘HpÏ=÷pË-·”ÿ®®.n¼ñF.¸à‚)=ûTó/™LóÃ_ŸÂïkÀÐ ôaKþ]  yÆ?dÂó§,^×jñöKaùÒf”Ò'=2UòB  ’N§I$ÄcŠ«/[J0¤—™qcü^üwúºææ8ç/‹ðô Ê>¢D]Ø®ghtÍûݲ½C„*%•ö¶þ­ †Ðжþ·³!8ô@O"E»ÖCwºÃ%•  }!k{^€E `À†÷y kÓse[øC[dSeêFzKÓ®Ô¨$]× S0!‘²’¾FÄ@)"¦ÒþghËßhk 4M#H$X»v-û·Ë_ýÕ_Þ¤ÇÛ5@3Æt]Û¶gî¹ùæÀbBÝÿH??æmýóå×r šæ0„ðä^xÓfE÷‚¿¯“5ÁÓIBþhɶ¸Ž>èéƒå¹À@5¸ãÆqp«\6€”ƒ¦´±Ë%·Î·wPœ»ùþ9¿Ð5 ¡išˆ€"DT¡’U \IzÁ`T*…ßïçºë®C)Å'>ñ R©ñx¼ð™¼Áéëëã©§ž*|¿¡¡aÔkwwwsî¹çòþ÷¿ŸeË–yÏSɇɤñÄ®ð…1tcøÉ†@Ì„öoTz¸/çÞê²~eM¯¯ênšæˆÅ•å]îŸjõkéŒMWÚÒ ÏØ C¦îÍ7LoáY¥¤ÒC[ÿ@+Ýú—»Î¢ϽÒ,.­ÍÀú |÷á§8•ÀðEHgÄüZ!Bʂç¼}ñÏ÷N`\Vå°Åî(¿õ¹j NvÙÄý~oÚjŒÏäLŽ…læs÷î–í²9tèÍÍÍ455¼¥"d @M*\µÒ-Íñ®c@×u ƒ\{íµ|ñ‹_dóæÍôööŽó-—îînº»»y÷»ßÍg?ûY6oÞL4×}^yþñÒèHsÿÓiV‡üèš1b ¤ sájOö›ÖY¼nS¸îŒÿ$3¤èwF=§‹ó$’6Ó!4ÃçyXTéå5åÍÿ;ŽgÀ§Â«“Ü}Ü hèš·õ¯øñZ#Ð…ÃpF{ŠÆ˜âŒÓWsãU 9Øu +›`0‘EG»a á­xôùšШ¯ªqß<OÂÒP]3ð2碔W6C;æ§«ïèììäСC ¼žóU®xµ夫”"p‡`0ÈŽ;øÂ¾ÀM7Ý„¦iôööŽõ‹¼áß¼y3·ß~;ýèGY·nþÜè£Ú÷=™4öìç{G4|º1â^\ æóNHÓu8Ño±ý<ç@5wǘäŸ`‡`%œìrHq4Ý?ÂÃ’ï4B~H¦¼ƒ”ô)L5?ö\ÍðƒÒšzAläãþ·Å=£¶ïœµ2‹/ç1¹ìÂ54¹]XéékÈ+®á,:|š¢ðÔ!/^~=ÛdÉZp ;@K$„¡ë„|¥^×…HÀ =ÜŸ€hÈ©žKhV5wÜþ1•JqäÈ:::Èd2ó^È@ +aµ+W9ÆT×uÂá0ÙlÖ ð¬]»–|ä#ìØ±ƒG}”Gy„§Ÿ~š#GŽŒø~[[×\s ]tçœsNá8aÓ4‰D"S:yª •R<ölèïä½aéi@SÐ[0v¨Þ¾ÅâŒ5Aæ‹ÎUjê ‘rù÷Ÿ$p} ÝÀÔ‡M±¸öC(=ý°rAŸQÙ€Ýû|åÁ,«ƒAtMù/ê‡qo{“/Å’V—@0 Àª•í¼ÿ‚ Ÿz¼‹µƒé$>#X2ê>Ú ËA8hë¹ÕlŒ…Æy¿xÀÔ¸ÿÑÇRq¢“tÒÆoŒ¼z,à]·«âa§$dõ|és'n#ÞÂÖ®®.hkk# Nû¢àzA@+e­æxÞ4M¢Ñ(Éd’t:ã8†ÁêÕ«Y¹r%;vì ¯¯¯ ‚{{{‰ÇãÄãqb±‘H„p8\h0ùôt]¯Ú=O6_”Rô¤Øùä «‚±‘®i×›/^ƒpÐ zÁ6Óœý+¡'Üb>Æï“Åq]~þP’ŠÒòahÚˆh|Aú¼ @g´V.9zj'R>6E½­çZ¢Þu^:×½.E,¢Õ¸ú²Õ|jç Ø H%‰øƒ…ðÀЛ‚ã°¬þ{7\¸Ù›º˜VªÐüž„Ÿ?dm»âÅã.ŸQ²íÕÅ›ûoŒÀ@ "!·ªë꽟t±(E&“áðáÃ444ÐØØXw§›N"¦©r–Äþž×\ (â“L&q§ 8  …X´hQAçÿ/þ1M³¯X!WkD?Ù4öèä{¯Z¬o7е‘U7dxs¾¶ ‹"°¬}®mƒ*]zVˆ›w›O¡Z¥³ðÓß:üí/,z êüúȤ¡AsÄÛp ®?ß©èz©4üêY› ¹­~£¸}@Ø„EÞ|¶,g¬rˆÅJãQlÉHÁ ¯Â—~w<¦³¦ÉsÅ›ÚÈ´\â~h{óëQ=MûÂÊÊÿ÷ÏõñÀI/‚£ßÐK"ÿ¹@KØ;Ñî@l<-M$4Ò™ úÙ±í4Nut`gHåå;7]ƒp¢ Ú›àžÇ½sj“ùãxätдòó)cÁËà¿~ Ÿÿ‰'^NôÀnh j£–ñ‚ÜÁG»ÁY+-Yà6 4M#›ÍräÈ‘c÷Íãâ˜vj1úo4­iZaß¹ã8d2,˲¬‚ÈxÃ0 {eó‘'ûLµó ¸¼òj˜!4mXô¾œË·!Ѱ7ÿ¿bÃPšs½3Ìç¾®ÁÓû!mÃhû=Š=½ Heà•“Ð›öܵ†áP·R·d/~îd¿î­ÊwxñˆË—¤XÐ4ù#÷I‡ÛïéÃoÄPJÃWlÑr×nÍÅýµÃå¯ËŽéž=ÿÜ5¼¡eS½þ(ÉL–hÐ,Ü{Ö†£ÐÞ ^دYWµ†7a¹(àp7Üó[“Hdü9y¥ £|žë‚…AhÀKG¡7éýî3J n.LrCœ€öpŠ%­Ž#c»‰( tøgà®çž{®c>å€YÈX"b¼#}Á3ð¦i¢”*l ÌÿŸ&˜”QÎÉ“¹‡JŸ/ŸN*•áÑ]=,4¢iE‘bo´×†€ß‹O‹Pxw&N)¬rÿ1²kž ßðA‡‚GyƤxA\a«`îwMåŽHö{a}uz§ü)ÀP#/¯+Xô¼,{CÜHpúJ›Jœˆû%ùþ1ƒ3b&º¦yQså~hŽÁ‰nxýÒ$ËÛ]‚ÁШi-liàÆ·œÆŸ|£‹ÕÁFSaÂþ¢ÐÐ Nöy»–·ÂoŸ«¢½8 Gëš· ow?üú!Ej‚X :Ö Ñ„¸é4N€Oƒæ Wî0QæÓ¡%æÍý¿p$Ëß\c -<_(w`ØTì€ï:tèļʰ|ß1zÊm¾NB—{ùÑ|OOû÷ï§··—}ûöÑÓÓCGGJ)ü~?k×®eùòå,Z´ˆÆÆF¢QotW‰¨¶W —¦V8®]y+ÓuÝ[=¾hAmïkJuÔW0˜‡žË-Ê›\:wØa9ù¿]×Û*—Ì@ÆÎmçS£_USÐàƒ¨Ï¥³ßaOGŠO^¢!VÙ¢©ÇžKáê~”¦2 ¡+h{‹õöŸ„\ž¦!îc¼ålÛ·žÅ?ýÓý$ýÒÙ!¿Q ”´¼)‹Mka×QØ–·×¢4†Ðr£ùŽ‚…e¾¡ò*'aoÆ0õœ‹ü¢×–ˆþ÷±ýÞrfšµËÀqÀÌG¼¬7r"á0ðð#àLJÊÎç<0•N Î…xëzzzسg_ùÊW¸óÎ;'ü΢E‹Øºu+o}ë[9ï¼óhmmE×õó (¥ÈZ6½‰ÜÉ/£¤£øLдÜ1°jâEq³Ý3¿û®$t&'6.jØ*çÐÝ5ß‹5l‚šMW¿Í37—á5ëB¡ð¤ïù•WùêƒiÖãöþ9xQ6x{Ù#F†%­Áàø×iYç]ÖÌû~ØÍš@œTŠ€/Rò¼‡»aå ´7{¦*†—ˆ£\obÖ¸1Jþ‘çj”÷F[Íï×!p±-‡'¤Yϲõ\…axk%òÑ\×½øÇC‡í—ìðZR. ç™ó÷óôÓOsûí· >$pñg†“J¥øæ7¿É7¿ùM.¼ðBÞóž÷°cÇB¡PÅ" ŸO]{,2™,ƒ6ʧPŒ<üǧ Å£“?œfVˆááîT©[¿¤üǪþÏ8Ÿ3•C@eÐl›“I›çzmÞ¿ÙbûùáP¨"7óÃO ðXÊϦ\ÜM•ÞJK"Axv?œ½4M4¤QÎf¶Ë.\Mã%›i!‘NµBøMo7C>0БX¿ž9WöAS¬ÚåSš¶KÉã•-­Q[Sà×\|šEÂ⥎ [Zm>t­NûB…í€ß?¿Fÿ¹þÀÏ>üG@ç¼Ê˜2PåJ8]Æc¢ˆW¿ûÝï¸é¦›xæ™gJ 9äO|â‰'x衇xùå—¹á†8ýôÓ§$*É/¥ ‘HóB·ESë(£ÿa‡S;nxÞÎø©ã½Qƒ[Ó\ÃM£9ŽMWÊ¡7ëð×op¹ò|—æE£ÿdÊagñÖ¿¢Å.žË»µÁ‹zgº6œ•Áô•wÐ@>0ЧŸèb?Æ@*…Ï•äÕáNXÖñ(<9ÕÀ@š*ªôWèXhŽE:“¥#eñBÅ›WÁûÞâcI›†íx‹~çÓ~öræý5MëCŒÿ¨ˆ¨Q…œi£ñ»ßýŽ}èCcÿ±Âç#þå ƒ˜¦Ég>óž~úi>÷¹Ï±aÆ’sª½àoägra޵ü²¿‘Þr¼“ÐtÝ[oÙÞùñÕîdêÁ;àŽÈÊŽúV¢ò‹\×µ¼åýNËÎ’r’–ÃS —·.tùÃ×Ã…[4‚“H4VÑóüÖ¿–AÀÐ1ô¢Cÿ\h xÁluÀ–e)–´iºÿóhšâM—­äÓ>if &àÏE2RÊ[I¼–/ö]°ij§²p”úX¬*©2n~Á†ká:Žc“°²$26lz-‡¯sÕbŽãÕM1þÂdPãÊYKƒ1Ú5t]ç¹çžã}ï{Ï?ÿ<±ØŸ³¿¿¿0zß±cË—/§¹¹Ó4éêê"NóðÃóøãC^Ã0hlläg?ûçœsÿøÇ ƒ…´ªõ¬c¦ãº&+bpıGmøùsé•òæ]-[NA<Ô¢Ó™n1àæòb¸½‰П ?cáÓrû÷Šî­4RàÐJ@×õb@8®ƒí¸ Ø.{Ó.§_¸@ç²suZhèºN,¯("ä`Âæÿ»§Óˆ{[ÿ†¹ht 7z;ŽõÀ;ÎOð…<¶moK_&ëA0ôb $¡{ú“p´ót6mXŒ‘éfÐJ1˜Já‹„ #hÇõ-kƒ¬‚ç_…³×O±<ŠêèpZ£pª'IW"ã…TΩ´ÑÜÿJÅÂpÇÆvlÇ!c{bìÕ¤ƒëºüÉzÿuyKLB!ã_­Ó%gKß*L išæº®6ÈSü3Õ¡iýýý|ï{ßaü{{{ …BÜ|óÍœsÎ9,Y²„@ PÉåù;ßùNöíÛÇ÷¿ÿ}¾ûÝï‡ £ŠX,Æ-·Üš5k¸þúëǼj |Znîµl6ƒ«[¸îèS©Œ×Çf\ï$¸XˆÂw‹Ó«UGT;AàŽûNc^»"ÂÃÏáÕÞþqFç%Û rÏ`¹0hÃñ¬K@s¹æ4ÅG7èl\m°ò4Ã¥t|>Å‹ËöJr×1ƒ3b†¦aoýw!æ‡1è„“}i^=áPTÓðò1HXÞŠþþ d‡e‰®¼)„Ó—Çqì8Ý}ПLc;Â+å…ˆ>ÑéúñcpÆ o+dµËÆuaÉظ<ÈW~~Û5Î|MaOz®Lm—i—î’°\>u¡+ϳ¤Í$ÖqOÔä¿ß?¥©kòmMŒuPGŽôù|¿O§Óo¨4 ¥mÛ¤R©ÂÂ)MÓx饗øô§?]ˆåžñ?ï¼óøä'?ɦM›JVôŸÏoii¡µµ• 6ðš×¼†¿üË¿,t0ùÎÿÎ;ïäÒK/¥­­mÔõÕ4¸ùü1 æÃÑl׿Ær ³?7l梿µ02Rk Gð5K»°Ÿolc³f9ÄB‹ùó»Ÿ+ë-© •;o×PDth7as‹FCP±eµÉƵ~·š„ƒZn'…Â0Lb±Ø”V–?þ\G i:!sä1Î-Qðù + Kû¹o¯çÉÉÇ,È?eƒîöдí@ÆCY¤kÐö8'!cáS°¨RxªØ» Ç…E­Ð‹pßþ#`Q'”W9t£W´è,ˆhüÍÆ g­ ð+·ú uÇŶ½ÕuŸÏ7çGþ•ö³Âøˆ¨€«¯¾úØ>ðímmmo4Mó]J©Ë5M O64nñ>ýîîî²Æh×PJÑÓÓÃW¾ò•BÇÐ××Ç9çœÃÍ7ßÌYgUý¯xÄ^¬°mÛ&‹qíµ×âº.ŸøÄ'ˆD"ø|>šššxàxòÉ'¹êª«Ê¾×©z8‚AëOóñð I‚Ñ숎ëÒ›P¤ÒÐ…C'á5ëÆ_%WËü´yŠöö#ðw´ñºµ§pÝñ÷„ƒ:€F0  ëºÂïóŒ~~d©) ¿ß7僠^ÞÛÏWL³>¿õoX¤!Ÿi ž9ïÚYË3ðŽ·D¡tNÒ@GÅÿ+wƒ‚Ž¢À@=?0Q$@×Û–ºie+~u M9c”ˆç劄 LSÃÐM>LC z§^:®‹ëR0üšæMɃÁ9ßߊá¯"*äöÛoï~|ë­·þØü‘Rê:¥Ô’J*m>ün¥hšÆ¾}ûøÿø×?À»Þõ.Î<óÌB@ ŸÏG(*¹^>Dp&“)œ  ¹îºëH$ÜrË-455>¿k×.®¼òÊŠq%Ïiš&«—†éú}‚+ƒë:(UBèO{{< :=CViG3k¼E8œ±2ĹãØÎç¢(J£ Ò”†axu$O¹^‚·õïñ¤Ÿ³bC[ÿŠW#Ú.ì)]ÈXù¿Ø°Ot'£I>wXZI wÀæ5°ç(ì; +&À-þe¼S]ˆaË™ øŒ¢›()‘ßÏà».ØE":±3Ì›¾¶»Ž„Ñ0E>ö±< ‘H¤Ð¡_wïPÇ!›Í200€eYƒA.¹ä>ûÙÏbÛ6º®£ë:»ví"™LV4©Ä+ ”bÅÒHűR8vM+•æ]¿Ÿ€¤N4èT´YkºÄ@5Òw†ôÂϨ/½¦RCâ3oô«±.%Ï`Âfç³6ëBÞÖ¿áqÿQC³Zµ²¹Œí‘‡»`y?,^¿{~ò`ÔLíU7ïÅpqò^wäwGæµBËeˆ¦i…0ÞóõÜz¡6ˆ¨"ûØÇÿçÖ[o½¸Ôqœå”±YXÓ4nRJ­­ôÚŽãðꫯŽxýâ‹/fáÂ…ƒÁ®5’ž÷ZÅÓ+Þ IDATÞÀ†ÁÀÀétšåË—ó®w½‹/ùË455ÇyôÑGééé! U좛Œ‘u]XÒÞÈ"c7VfËJc˜þ¡€8xó»Gº`Åtà¥ðÚÓ]\§º‹«ÍD‚ ìÜu!ðÅpœñœù|¾QÏŒ¨öóíÞŸ`ç ƒEaƒ a`êjØ>FÊeP¥¸ùðÉGOÁé+a×~èì…æx%©¹ã^'iš„ÃþqË9ÿšùê71É‚ÑP>ö± ?™Ìw¶nÝz¹¦ie €áF#›ÍrüøñŸ[»v-‘Hdø!ÀøÆÌ0 ¢Ñ(–e¡i6l(yÿÀ V¯…N`d]סeAŒ}|{o?HÚ[ÀP(9Çu9ѧèèöHùíK°yµÂ0ª1g:æöÇÏ‹ñw|€>aäéØÂ8˜°øê=Ýhz¥4ü†Î0ïÿÐýŒ÷÷ÑôFýžšø3ùÌ:Ò +Û¡!O½ [_;©B*û£ 0ŠÑ ÓÎò­[·.Ù¹sçaÉŠR¤FÖ Úpvä¹®K:¦³sd°«–––1ãøOdt5M# ‘L&GÝb488ˆRª$íj–ÑŠëB8äì3âüëS=,ˆ`[±!/@îà—ž¤·pÝrxî$¼rXã̶S½û›LVé*”3ˆq –UQÑŒ_=˜àË{4ÎŒ™ºŽ¡©ÂS8@P‡t:I2k¡Mþ—Öx(¯GY;FšfŸ¡{DySFGOyç<¶Þ° ‚“ÚI7þ)Ý“P{r}äë\×}hëÖ­·_ݹsgŸäŒ‡€9PÁ,ËÕ‡ËrÑftó§¦ÓéQ¿3ÚÖ£j@n\ Ãä5gµsNü9:R½ø‚ Fi²žÒhköÎH¿÷IX±È ä·s§áÍâ…~îçJ~©žx> z¥i }„(YÚ†cò‹çŽbŽâö®V*Ž2ˆEM‘p!mÛñ¢.[¶î:gC ŠMº©%×.—+¥>çºî¶­[·~nçÎ÷KΈ˜3 ÇL·ÚÆ0ŸÞâEM\s^ˆO>ÐÍÚ`>_Ý0K¶ˆ„ǽ‘ÝSÇá¡]på¹.ÊUÃÂèÎ’…~žjXº-®8t4ÁÿÇb]0ˆ©éŠ"ÿ¹.D}°0 Çuy¾»×Û _mtE£›¤1F3DBB¥ kÐ ´¨ ~òœ±r²^aºú¸j¤¡”ºÜuÝs·nÝz'ð¥;w˜Ïù*`Ž4]×Y±bEÉk{÷îåĉ,^¼xJ×±m›gžy¦dÅÿÒ¥KË^XM¯@ à ç´Ñò›ýdÓ½d31t=NñF¯´í°ÿ”F$ËàG»`y«Áú¥¶£&|Þéœ×/Žã?©>nØDº;ìÍj‡@ž,÷=ÜÍ=' ÎŒ{[ÿ†ßJS¢!Ø} Þñš(§·g »†£Fü2#?ÎdùöO÷ñlb †?Æ`:i …ÎØž ½ÒÀ‹¯Â–IyƘžq‡nIÜÿõC®6(¥þÜuÝ·mݺõo€ìܹ39óC@UÌ©FÝ|àÀ¶lÙRñ}iš†ã8 @WWÛ·o'NJ™WÃÈú|~V,[ÀÛÏ<Àí/v²ÆÁ0F€Â–* 'å²ÿ„bõbp|î>øØ6ƒ ËÆcåo-¼ywGüê4¶žëÒÜ0Ù„†ý­ªŸß•00h±s—ÍÚpØ &d”º÷ Í[¤iÙp¨ËáOÞl²vYó¸Á‹&Ø:?æç”Rèvü]DÃM ¤ÂD }è “}pªÇ ôÛçá5ë©| ÅpaæŽ^TÂÌ’kKooݺuë§vîÜùÔ|ËÙoR‡s²ó,\¸pÄk¯¼òÊ”i<øàƒüøÇ?.yíòË// 7\ésN¥Ñh˜7_¶˜Ù.ÒÉnÒ©¾Üù¥;NôÃÁ“Õ½óþéðâ]s+º×j¸!½}÷HØ<ø?ðÿ¥ñ£g=c8¾™È[w̷lj\ò µŽ¬–ßúgê:AËý?tÐ;õïXl_Ÿdy»…m+/á¨?.vñí–ý9×-›–rn¼ŸtºŸT&I"“* ™…# À‘~Ø´Œ:QÈôr?+L¥¯¨! ¸عuëÖ/nݺµi>å­€:¯ø“™»_²d ›7o.9ªw×®] TÔ4MãÔ©S|ç;ßñÞÆ«6/7™çTJÙ°¶?¿<ÄÁîSd“=dÒ €Ÿ±wÑSÐä øì}ðâA]sPÊ­ùý÷2y;øâ«Š/|OçÝßÓho…å  `RF1ÔÅapG[˜·ûjžc"³|õž.4ݦéÞÖ¿üÞ?×ý·7xG5ê‚-kÒ„‚>ü~?@ ¬Ÿ`0Xög}~Ë–¶ñž«q¸³;3È@*‰SüÜ®¨o–´Àï^(7¥šC4)¥> |~ëÖ­ófÖF¦fåÌ¡›¦ÉÂ… ¹ä’Kxú駉ÅbÄb1îºë.nºé&Î;ïÿ,ðüIàû5ìX/P×1=ûç‚3;鸲Àp䤂§_x¸ÐÆ8°v XÞ°UpBîš?bïáÀ ¾O\”WPWÕ`¿˜mÙ^ö‡OÜ×E«É†0L«VÎàçî]Žñ"¶6&1ßi¡¡ëž­Ÿ`g ¼Î txÏ­©“”òl²¿®èÚÝfxà·Ì`+0ÊoªÏqÐ2öîw¿wÜq‡RtzzÚK ’ƈnöÍf»ví‚iš²š¦%:- øyºñ z½öï]ƒóÁ+øûÏb#×lÁÓœªôc0†%pö*°ØãX9içƒ?×þì;ÀÖ)Ž;·qìÞD˜hšPT€ëÇnÏ W3nË…+ ¯Ÿäxò0ðð+À‹—í|õ54tz€Æ€ñY€+2ÂûÍ“"yÀÀÑ øÊÛãÑ«š°jhwqµ‡Û÷ô iõ%sP¼çG¶aú¿= ³»W;c«7<-gv©“ç€k€Ç_î” D},@×Ò“«¨¢lªÀˆ“+ˆ]¯iš Ç¶—×c£ø%ñrë¶ À4Í€OçÜK*$ÃËϯŒ±úûÑh4`š~òƒ;ÑîÆ>t›~Åpµ#Ð18.ÎÛ `ÅpÕ²Oçõgv¯Ð°g°r˜šuËñúÆl{<$KÚ=ƒáøYàÉ—ï¿ ¼4g§¹m*À¤j«˜,DPÐî!paAh©CßøÞ%|嬊ë'UÇöŒä8Û´35¾t¸e}c æ’€-׭ƯÝÙÄg¿Œmµ ,t[hÔto¦8ðƒW·í–œûDçËjªèÚ¥ ü»1«ª !D`£6M36ñK?"Âüü|à¤Ïƒ¢(¹“•xÀÂfRÚ˜í i:Z Â{îX‰‡ž=„¼Ì±Ù.€FkŠ¢Gê–À¥6pµÃqü‚fÕŒ-œŽµž±óÑ7`Õ˜‚q]ÁDÐ5€,ÜÆ…+À™ËÀñ+@ÇÎ-Ú'}À¬n ý ‹€e dg»ó _:Ì${\° w'×甾Ôq ®Îxð9ÛZM(<”õ¶óߊIÀÀ‰Ë¿|—ag·[Â뉪ªàÇîÙŠÏ|ë ¬©YÌwZ˜l4QÓTl-Àùyàôy`í,ðµv² fbæ]Êxp¸&B2WTQ⚨¦à‡ƒÜÓ>ça݈¥¾/¿¾€oQ±ª¥¢®ªÞ={ÀNÒ4]g˜N_>°³-ëêµØg¾Û{ý&ü Ïã Ç/ccmW;‹ÐÔ1pfG‰4,ûÖÈÚ•N` #ÀÍ»rOyLJ0 Do1•MFó-ýZ×õˆ£Š<ü!µ™pháßhCÒ‹,ròì-•sŽVk †q;·¯ÆïÿÏÓ¸éÁãø­¯ŸÅaÂ2»¨7g¡×ÆÍ·d·%„@·t àR›ãÈyû4¨«@MµO¯*TÇ^o û_Çz&`8÷Ðmow[èóØIê«æ9ÜžA¡ÿ_"ÈÈiRQçÈ÷}~á*Wç»ø‹/_SÆûWÿ¼¼öÜ­ž8zøé[{hÔÕ%þ0>Þįüô^üåï¿1>‹Kó¦Æ'¡:§ç€ó—€ëVßýpãŽþÎ\Ë• `t¶TzS#g¾YT€Q|Yí76ðc ¦ibþêÕþ‹\ð…N´V|¸â@Q”HAò·›´c¦´­( ÆZ-\ŸÇÄXùѰ¬Wñ;÷ŸFcÜÀZaÀ4&¡×Ç¡i 0ÆãÇKvÚa @0M†6³ãËQh,Ðs ñ"aÀÏ` «‡ãgTœ=_s„ ðKIû“øRå;gRxÒ¤KŽÒ÷ÚÑEüÇWìžÐí«œ£×«1,›.]¦õÖ­h4Çmõ¿y 醽›ðó»_Àý§.`Â\ĹÎ,vÛX6¹ Zípüœ}òå„hóº\O#ºŽ* píî§oa”V€Ñ~s½?çxåå—ñkÿxªÇª÷¢jdÃ0p×]wá“¿û»Ðc)®˜±F;Ä ×j0??F]ÃO~`3vn>Ïýíy|ë¢ëÆ»0hµqÔjãPÔã¡“6 öÀ»"Fá_òO™`V$ ˜–…çO8~ ëf¦@‰ÉpHÂÖ™I ÎDôñÅÍ¿ãùÄÚ€ø§®ª¶¯ƒïl³õïÇ÷v1Ödà~Vô BãcMüÄ{6â¿þÉq\ïbu³Óì Ûkcfb&ǧqâÖ+À†•À£/D@ªëECÛçÊgýÖ~~ø!![•ýÈ#Dl÷ÉAj–öûóçÏcÏž=¶!ŲIn#%u¶{Ûa~~õš†[o\ƒÉ »8ƒ?}² 4&p]«³;UoBÕšPÕEë«£ýnݲzõ䎖 "°z°,¦°Ð³¯wT²ð®u=üô»:˜™X‚ä‡d|ͪý¸ùÉ|{ %Ÿ1àãóøêÛPuM ðij +&€…0©õpûž.4­îýÎ2žkr—?zÏ^|³ÕÄÃÎâ;?¸‚ >¶€ y,vЛ\ŽçêØ½ÙN|î°|:åÙ$-ÊŠ®Yz«  £úæF^Þ¥ˆñ>äAeޣβÑ15]Z-ÌÏÏCí›gñ›À»o»€xâ >ûÔ"PkáºfŠZƒ¢Ô j ¨ZŠ¢sÛ6í9 2¹{úöÔÛ^$ @X aB–°` y“p¤+ 2 ¿{ûߦ`í “…e& –eŽVÂŽÿ_PÝLrà‚…\)‰ð͇ûWÿtF aÀêÿŒÉ¦†‰á“ÀÛ7t1Þâ¨×ö³t}AÂ|%×@Ú‡þzì:8š‹*z³·ÏêY¸T€‘]˱iš0 ã‡zÆz³‡È Ä,v:èõz¨×Tܲ®ß1‹{n¹Œ<0‡¿~~'Ì–·˜ÐÀ¹ÆU(Š îθm&pc¾Ûd {[wˆ,d_Å´ˆÐ¶ÞèZ\àŸ¬!üo;8öm娰ZA½n‡ÉUÜx䜉ýƒó'&º‹—a,ö'€ˆðj›ãòÜZ0ÅW)õdÊŠ>8-g W®xðy [›uÀ\@×4Ñó%UDCÝÞ2œ¹"°wSzÜÕ?ßÄg›§ÏYï—Ô5½Ó´°zǪãx×;Lüâ…6ž{ñ¾þý³øòÁ³ cî¼yž~xÇ^ ÕŒ¶ÁD—¯vû~ ÌŽÑ]P±jz|.èÞóÃJÉ·8ô'LÓÄÂÂàÊ•+×l×™»¥büq/¾º€o?3‡¿:ÂE‡¢kX£k¨)*ÀmOvÆìKÿÌþ,¼q£h[„& UøÉu ¿¹SÁ¾­*Ö®TÐl0Ç\€TEA³Ñði7(r}Œ‚¡Ý]Œ‹Ë¦À¿m`ûu›°ãuˆî‚9X‚àåÀËGðWÇL¬S/¡CÑŒ“DÀ™ù«è†ß bË: µÚ¸súG"Š£„çZä=‰oÀ¹}Â9ZÍ&::Ý.4UÁÚUX»zï¼}-~ãôU<è4üà ŽY»°gõ>ð#Á̆m£‡Žeb.¦™ç. hnܺ•=`€í®$¡] ÿ(U`4—„côy 6àÛ>(}½Ê½û|èÐ!lܸ­fsàÔÁ©Äf¦§¡kZαf–°Ùû„ƒ}; ÕjAÓ4´í¨†‚ ©[7MbÛuS¸û¶.~éøŽžêർtjÏŸgx¥§¤Ø÷¿ˆÛÿw#ù¸Ìbœ ¸kÆvx»c—Žéq`ý* ëVjh68ë§­U8‡¦Ù·!8çžOEä­ÎþéNªº8‚0ê TÚ¢±à»x9Q¦¹0oà=…Ÿ]µˆZdéƒ"@ÕŽá–í+P¯«)@'é¹2i3ŒŒ %ò•Q²V«¡Ûí¢ÛíBF]öëf±}ó,Þ×îâø©Ó8zFG¯»zM„M+5¼OíÄ5äÿ 4­.ˆVVÛÖ›¹cVÂ?–*ðÃñvƒˆP¯×±uëV©³sÔ žzŸýÓ?Å/ÿÒ/á'>üaÔë `Œa¬Õ’Rå‡jJ$Ÿp‹sÇ$ iºÝ.:LÓ‘í49ÖÒ±o§Ž}»Ë"tºæ®h/ ,v,t{„ËW-º=àÊ‚…fc¬i§¹S0Öä¨×8f&U¨*C«Áçê ûOŽASUŒ;¡”y$ä­«-Ù¼aŸùç Â鎣3H'ıÌp¹oÔü‡Vàg^¶× õ:Ðh4ûWÿ¤Oìílw$EpE‰Bu;¶Ìbë&‚®Ù|j5ÿË/nƒÑëúæ”E:éšèÜzUhÀ›G5C  Œ"QTrs=}-1<ù$>õéOã…^ÀoþÖo„ÀG>üaÔëõM@tƒË·†„™ÐaDR,)· •ÂÚÎѨ×QÓuôz=†^¯A!È;Ì7j šuÅþ¸¿o„sè{òuÓ^Àœ¾®ih4ýæ¸ì¹aTMC½¦À4£Äÿ‰s­f=è7€tþq|dç~b¼‰ùyÓ²êûŸAèê_ÞgÊ‚®t¬ð;’œ‡Ë}ïI„%œ(›ýG09ÞB»ÍÐ3zÑ—#¼ÞDuh¿«h(T€kê=—|ÑÃ!ÆÜÍ‹"C”º‚í‰'àSŸþ}üÁ055…n·‹ßúíßøèG>‚F½KXÒ}gIß°`ÛÌí; ¯Ït óf“Ã[áõ𠉄@¯×C×î3°±•ü¦Ã|h€;Y]ÁÝl:§^ç7¯C’ý·cÔÛ!ÝÜ I¤8íæáï¥äæ¿?÷š¦¡Õjaaa!Õtăæ^ŒíþÓ{ªF õ´(üŽãLê]_õ|šÍЦ\ß )çÄŠÞ´}õ-HÍWÚ}³½ot]‡¦¦?NWíÿÈ£à÷ÿàÓžðúwè?ñÛ¿V³‰Ÿ¹ï>4 û°Xe+̲¢ÎQBý'*:s®M™+Š—-‘œSs¯gÀ²,˜– ­N·bæÀòœspEñ¾®iäIñ¹îó÷¿¦ëМg•:ó®Ëyá=/K34³Ô$Þ;o.4òö·ÿrÄòÐÁÔσsŽf£F½Þ_C>•¿ëH˜i¢ðÀ_Šùƒ¨X_è·»”½â-·,ªÀ.Š1ØÙjyâ&á.’G{ ¿ù‰Oàùƒ199(c BÂ?ÿõ_ÇÑ£Gñs?ó3صsg¬L"ÙÀ=éZôôÎòö oÆœèu u'?¼?°N|bâÄ {øLƒõ?+ cf8ߜ󘇔*ýk}ùNòÅíú1ªT~)|$ÍŒ³äú©q âÚÎj·@·˜”9ÕW'ÿlªÀ讀¸/c7 7Càc?Žÿõ_ü <ó쳞ð¿|ù²Wnjj õzš¦áßþ»‡çÄÿÑa×®]°,9s@pN6ùN}QA”Ä;^8äãϼûÜ(Ék>¶ÿ9„[‘1 ‡ß7bÐgÚ¯•ij¿8¿’<|ŠìAë²h‼áZÓ¤øD º×ÅA ïJøËQF‘BÙôÒˆsÝn÷ÿýßã>óüà…<á?77‡·ß~;~écÃ_ñ‹xàÁ155EQ0==¯ß?8cø×ø‡Ø½s',Ëz#³ÉørÛÙvÿÂôÃämsî É’²&Ä÷Ÿb›˜¿7†ø§¬ðm…\|Kã™.på´Gy…ou‹Ôc¡¬Ueñ8òCÉ»íQ©å*ªÀh’£þÏR-sEA¯ÛÁ—¿úU|ì—Âÿ–›oƧþå¿ÄþnÀ–Í›aôzøÎw¿‹‰‰ |íë_üëõ¯°{×.ËÅGjIÜdäÕø,ž¯ŸIïlþqÂ2û4\ ÿRÚ&ÿbs“ý|Y®÷$gY¼FQàËÔ) †eZðßÝ,W_¤úEH©¦àÚ -[¶ü€í™Œs|ðýïG«ÙŒøø7IÎ9ºÝ¾üÕ¯àcÿìŸ ÿ·Ý|3þðSŸÂ¾½{!„À²e˰÷úë191‡~Š¢@q<¡Ÿ{þyœ8y;·oÇÌô4TUxÁe›®MÞý6†Ë~3ÄxÃ0çÉŸ ÉoàiŽ¿›_¤z½¼uò”FÙ 'JwpnÁ¥Ë.ào¾ô%Ôc2ˆ–úöÚ}þ1}Ï£)»ü}GB±D»{Aþþ¢¬¤>Çó->ÇA~®©¤èí×R¤¾O(Ó°êäüNù\ Ê+W’ÚçØQ¬J¤8DªÀ(’g_óù0†n·‹¿ýÊWñ‹ÿãÿ /üÝì€ÿùÏÿ÷Ü}7굚ÍÎA^°¡g–@£ÞÀ}ý(n¼a?þÍÿþ'øöCazzz‹í6Ž9âÝFˆBò‚?vˆÁí'º! 8ÂÝaI}€|åô=yžÊë{°ÿ ¬ªZOÌ IDATÔ>3ï¿EßgÈé+X¾Ø>ùL 9OüEêäüNÁ2ABf¹ €šù3­Ï>-F¥U`É ¯½v$Yøîs¸çïD£VC³a æ32+ND3ÅI*„UQ°g×NüÞ'>øöCaffÆk¯Ÿ ׿lK¡¡&ò.©©XAW"ÿ~„`hX”æäG¾Î²RûîYOV?žàÞÅý’MR,g½"m¥—GN-•È7Ï©? $€”SÀŒÀ*0DªÀ5BùBZÆhX– Føÿ™-ükºŽFÝ9ùû=ÌAÄC£V‡Â9ÚíEX‚eYعm~eYxè{ßë׉Y˜ÅlÕ²£îKLù˜÷yÛ^ÿÂû@0¸_E c6È% ªB»ð3̘™š­Æ\Nµœà¢´r’Œb÷ áv#¨Âý…*pQ ]+KIépÒκÔþ†{ÞyjºŽV£Uá 'w·M@×4 ´Ûmìܺ ŸùýOãü6þàÿD"9¡ÿMÊu¶V&W_Ö9ß-¦²ùÚ(åÚ\Hd…„õAÞÙˆ­Lp4(¯RZ^ž‡©T•2‚L»>Û…¾Oþ[*/€¡Q®arÁ@¸ù| òLF€Oøÿ‡ÿ€{îò Å'´ ŒqX– Î9,Kx÷û]SFíÅ6,Ë‚e®Û¸?ß}PíÅÅÕ\¼ +GF·e*UPGÅš?ðBÿ½=rà;ï1 Àǰˆ£ÊÍZžÅ 7Sô‰-Áâ_êÝRyæ#Z 2ŒÃER}*”*0 ºãÈìß-ËB§ÓñФ ›:6¾ð¥/áâ¥ËX¹b9îûð‡¡©š½M€¢Œaqq½^–i¢^«á¾|¯¿q²RÔ¤R”!¬£;d¹ücÚð\ñ@@F6¾â|3¾Ê5IÌæ›€J ÄW!ƒO>ÑçA}޼úMè×Âæ÷ÒäÚü*0DªÀH.*Hô]`«ÿ…“°ç?ÿéŸâžù‘TáØîhÂs‡á¶ýûÁ|‹Í-®rŽf½¸&Øj4pÛÍ7Ca\2"`Ê©=øuÑÝ%2²òÀ@‚´+ ÄðxŠ´>0ßüZ„ ˆ :›¯œf!™_> }‹‚€¼ÏÂïÌ&S1R |ßÔ «¸F¡C¥ ŒùS“?À†#à?ýûï ÛÛ_I^@DàŒASU;¥+ÁÙ‚TqA€è_T8³ýòn>ÞÞ7aOðR´¾6ÂïJ}Y)ücÀ€ïëa‚´¹ÌÅlÑÓ|ˆ“‘Љ^jð}VÄ6P@¾—Z6µ\É€bÐÓ¿·ß¡¢!QF‘Eb¸nÃz\·a½-üë ¨œ;§z§^$…¨.VñÈ &ƽëƒÝ^Ïq8$–,¥ì1ùÕ mHqm°ø«l¥ðO¥ÌOPP×>d€äÑ:Äô1%RQ6ˆéS ÃÙ‚á„rœÒ}ˆòžì3Ë£lN©^&Pû¤Õ ÿV9•*0ŠÐ8_ aŸä9·…¿çíÚ "||+/EÝF pÔk:TE@$¢'¨¤ÅŸo€Ñ7¥ñOˆ]P ÿÀáüÄJåÕ>ä ÷³ kÊ0;Pb_ÒüX¤~^Ó%¿k,»&“vVµÁÊ*›¤òËi! >²¯^Ú^WÑP¨£H$l-€?ùŠ [U{Õâï4‡Ñ5‘Í7eÝ2š¢À•<ä>ÛF #™¡úþš¶ÁM ˜jeñ§È_倚ad‰/»«œv ÛÛ?½~üÜÆ|# $‚kEþÐdÎù°„»ç@üdxÉòÉcRˆ)ïj;— À[1¥pF‘|N€îÂá h¥Øüc­ï#üy1›[ü¾—"áRs§·ÁRyçäJéd òï·‘œ”ð<ŠòŒ×3q¤WÓÀ ÖO>ðÇeVJ·q“ÛŠ«ˆõXÚ)¿`Èï°ª?P( ¼+Ï ƒ*0ŠcP¹bƒä,§ßÞ@"dv¿´¤>™*ã„7dlÔƒñÏ>4–>’½Ûsð•¶sK>Ç  öä[€;>ysFºv PPòœÆ^LÈg–η x(ä)Wr™ÒA€¨LC¤ Œ"¹§õ°êÚïRK¡Í(àH1N€i›K_‘Ä}åCl%ò×bñgRÀ)¾ ÉŠ’M³Rŧ×ÍÅ' ,ñIùëÆúGÈÖKõ,éˈ‰Àrù$Èj(7Ô2ƒüžT¾ò&U $º÷Þ{g˜«Eº° 'oJ!™ ϧ-°Cv»À"ƒ¤NeI[“31n#á4ZûW&—À†åçíäù€<( ÔˆÕÔ‘f(Ÿ_H‚Љȋ¸>°¬ù`Ñl™Ï' 4“/•÷y´™(¤`¹a—Éù»  *Ð0©%н÷Þ{ €¿F!" ÀZi[—‡ŸŠŸ ‰dYýMÍþÄEüÚ¬ãN9µjœÃÝ€m„6y?¬bü£Ũ×)Ï8ŽÑo™äI_†§ÿ‰Ý«s˜­ “ÙÚ‚xAšR7å™±¤õÁÒú™"(uý+¦E %£(Xf(@@Ò¯¢Ò •*Pi6-Yk®°&JQI'/šža`±ÓA¯g g¾*<¼„364J÷ÈV«K¶‘&ã|ÅXnþLºÁ½9g‰.ØÝÈOy%ÎF&Ø`2ó˜`×ÏY?R’e9š¦ƒ‚ø›1Y×ÿÂÀe˜'(}XBÿÃó^X€‡Ê R&Ñ©g ©½¨ÀP©#FÂUÓ;ZW%Í93î++Às²úÖ”–Ë2û¶Þ-³ÄÆ|·qXØl´¹%ù6i½BÎ6@L>>L^Þ2~ …x³Lðä±d2<ó8@¼Þ™2F)3P&0r  &òj(¤ÅNQÿ–W€'ò“‰Úƒ "²L‚Þºy–€*0b´lb ]„,žnÇÄß÷!\™Ÿ÷V cÀ{ï¸+fg½°½ä.*/š ö5þ…ÎÌÏ·qÿw¢/á Âï¾3“SÉ› ù„—œ“—Í!þ1[N”ˆ Ä;µ\'¹´¬‰Ñ ‹ð£Œþgòa?S±¹O}ŽÙ;©¯òcd‰v)ÓD,xIåd5Y‚>ð(ñ÷4Ó€w«©Bâ Œ1gÑ“E¡rŽ /áÿüÊ—1Õl.·ÛX9;‹÷¾ãŽà)Ýõ!Š×€…ãõãÇð|á 6øp¥³ˆÜr+ꚊIÈyá¥lZˆÇãŸÚNžþK tòñf¥ñ¥@ÓMÉ2þÙ–Ù@#¿£#“ªÏ2,”oÜ `"H$ ù€ˆÊ(욬)B.B¶ §áñVï“obÎ5À¼9G*’¥ Œ" Ÿðv•ÊÜyÓøÛ‡¾ÆìP$ª¢àÛ=†·ï»­f£oKóLaaÕ0ÌÏÏã ]G³V³ÛSüÌûÞ±F–! Ÿ­§»ÕG÷¨œ)·ýŒ\ò†¯ßr¦ÊÅ3sÎX~ ”q“KÆÄ¤*Ý4  ¢vö|>‰1(»Oé¾àA8d r™2Ãàk" üíûëŠêÀ0©£FÞäÚãMl\½wíÛ‡o=ù$º]UñØ¡Cxùõ#¸i÷n:íûl4œ)xíØQ|õûßÃx£0, û®ÛŒ «VÙ)ˆ)%J_£¾ŒŒrþ[(ÉŽ40¡œÉvdIt^>µK×ÇB*–?“gìyV|žÈ©ŸÏ4@‰Ñü“ÀDH;‘®J…uì’ë/“2Ú.z#J«[9“*0Š$ü÷õûêߺ¦â®›nÂýO<Ñ_?Œá;`Ï–­PÝþBøò øw¡¨€`á™C‡;Ú……ÜvýõhÖj"Îiп®óä3îA™¥‹œÖ%øÃÇ_.·}~¾I\b=ÜY~~aîR &•O<Ø¿=VRüÁEš£d éQÓAA:€HÐÚ°°ö¡€ Ž+ñ (SØÇý^fÝ*à0©£HoaצM¸ióf¼xü8TÎÑÔuüã3ÏàÇïº [Ö­‡åªÿE(Ÿ@Œ€1†«ó xìàA´juöéÿömÛpÇþâA„¿›Î‹%¦‘?Uç˜äS–V ÏÉ=¦¿ÅL²`!MÈJòIõ©ð ±œ; ä’'¥Š¤±&€‰ØqQü-¸„²Ñç ²5EL%œþ#e–ø÷AÁ@e*U`ÔÈÔ"ΖJ˜h¶pÏÍ7ã‰W^ÁT³ Æ..Ìã±çžÇu«×Õÿ¡Œ‚a ãÀó‡_ÆË'OBWíWåj§ƒ»o¼«ff!L+¾Yñî‹ÈŒ6µ˜Œ=;'ï~U–í¤˜—/¥éÜ è IŒ-#!¨Sú‘|3! `$ÝDH3ûȃl_ƒ0á ˜”"âøR(Pr¹ xEAŒß3µÁ@ÒïÌ9d,A6À·"U`‰„ï`pÍ@7nßË–áÒÂ8c¯7ðÀx÷-·`ùôt¿~Y“}S€9‘Õ«óøÂ·¾h¢®iØ»yKߌ׉ÌÀ<$u@Oý1ËÙ<+hNaEÜ'ÆŠö94H§ÎcNIôÊ—å‘.LScñ'¢SÇŸ û(ò‚ Šüd“DìÜf⨶)KX'ôiþ=Õœh3%n²ÿ÷J0TªÀ(’ègí çÿL`ÅÔÞ½ÿFüå·ÿãµTÎñò™ÓxîðK¸÷Ö[}€>@„1{ÇQ˜‚£§Ná…cÇÐr<ÿÛ½Þ¹{7ÖÌÎÚα$ü'5ñMAaÃ&²¯”Á?EÈS¢Fº ÏD_”»ôÒÂ6¾_ñfŽŒSsjûIóB™õbOÔþâ20ñÈ&brH rÏ@œ›A›À+’•eŒ·LŸëŸ,~Ki³Ê8TªÀ¨‘+¨õ½e ˜–ÿJT·íÞÿö½‡ípÁŒ¡¥ëøöSOá{ö‚sfŸàEPàe$@…g^:lGtHS|ðï€ÂLÀ¢(ÅOò©‰or,øœ'îLᙳïqÜãÇ”Æ3çi>¦+ÙYøò˜<â®+R®ºYóÂâ&†$úR“GÁi "á”-ÕŸ¤a‘ äÁCà0„ß…zY`!¥ž`^³ŠÊ§ ŒQÀÀôºÝ€7>ã kfgqçÎ]xðàóhhtUÅ ÇŽáôùsX·|Eß‘ÐÝY\Ÿ&À9Ã…ËsxüЋÞéß;V¯ÆŠ©),..b¼Õó›!Jl”Á.ZåâŸØVɼýýÍö’/ xXLêeÊ™¥PNð&ªò³NÜ mG…7寿N!!Ó&U6Däòà!/p(û÷‚»0X à¬®.U`Iì(€]³Ÿ‰˜ iwíÝ‹o>÷¬÷ý…ö=x?q×;ƒÁ„Ü•)Àˆxâq|wíÛ]QðñüTUA]Ó¡+ 8€£§Oã…S§Ðrâþ/ôzxûŽX15žö —ÀŒÛt"{bvb̶ òOj•Ì6}~¬¯Ä~eì$$?&òÕcyæƒÅ÷7±Ÿ9û×÷úq6ñÙgð£¬vcÕûqñ²€ƒÎ)~~ ƒ‚%ú- 'P…†BEò™Üu¢q“¨ŸÞ€Ñëaÿæ-Ø8=Kí68chj¾{ð nÚ²c6­\‰º®;‹Ð3»xìÅÎ5UÅ®uëÁ„€ªªž© LR›w`_(®=ˆO‡[Dö%V\@'ÍEA˜çØþêƒÌYLÛùA†DÅêþ;¦‰ëW­Æªéi¨©*¥;æôCβP°¯’²³Y¸{ +“?‹Œ…4¾¾ÊÎEú-‚”M>ÇØÈ©Ï Ï‹¤#g^ â£T%øUæÙ$\.6!­L»LV ‘ÒVF;Á6(q.³AAÀ‡§4  àûV9*P¹'o÷ÿà 8l_€Žÿ~>„eáöí;ð¥<€Â<òâ!ìZ·çÞ‰^áÙW_…aY¨;‘ÿÆð¡[nASÓ 0f ‘r-Ç?n¢|'ZYJB……³¿ë÷]âId·ÅÖn-‡€O¿/4À8r˜P§g’ïcLùdŸ&7·L(¦<¯x­DšŸ‚{2I ‘ÑVš`Õ×8¤ è´ßÓà§ýœuÄÒ¦¦·بÀ¼H¥ƒ Ðuô_ 4{=¬›Å[¶âÁÃ/¡¡ª¨«*}íU¼ïü~ìX·Œs\m·ñèˇ½Ó¿)v®Xm«WDhhxâéŸõ¯ÆÍGÜþ“‹|Þ)§ª[†·«ª(°þãÛbÒ}•ê%xÍK±Þñ9ò þ~Ÿm®e  õ5K”{ìñ`B¢}WãDYq’A “i+$ØY޹"ÐhbHéWÒo©@#' ˆ«ã˜&‡MK¢½½©K@¥jÿºÒC×÷› ¨*îÚµ ß8ô¢×¹nO½ò ¶¯^pÎŽœ:…ÃçÎy§ÿ«½nܸ M#J8ý»‚Y^xæb¬¿  YoF¥Y'È7l`žÉ}“8ÅA9uYÞºÌyH$ûröÑQ S c'ÿš$ áX‰ "U+Àœ´¿Y‚àP4 Oð1 Pìó&½ÕNý~ªÀR9ZJÌÀàh #à Ðëõ°cÍÜ´f ^<{*çhi:|ï½a?ÖÎÎbn~õ½‡½ei õØ·aTŸ© ¸õeç£OIpˆßÕj#¹=_ÿKþA RÌüáŽW˜$ Ö¢À¦_W~ ,·v†åêc<ÿxÛ|2 —óÀyÁqIƒŸ K”Øbù€ƒhä·<‚?«N/×0„Óù[Yð»T€7‰ &€ÙWÀ•@Ë4ѬÕp÷ÎxâÄ LÕjP8Ç+—.áбcظlŽž=ƒÇCKÓ †Ÿ½éf¬Ÿ¡¦+!ç?×|ñùˆe:ò—¸PPY_ïd ’Ûဢsè"EÇÁdžOzô6r„¿¸HèA@ -—lÈ®óo޶ümföÙׇh3À‰*XßÒµyêÈOC0TÂߦ \”ÇD@^.ŸDd_ 4ŒÀ¾Õëõ°ÃFlœ˜À¥NǾ¨ªxîè¸{÷n<{äuX¾E¡+ v­YãœþíÓG ôoÒ–7”SzyüãÅ'¿)Î/­Ÿé`ÀIç8 ')¤}H1µÄFhÌež‰¥rL4θ3Çœ &˜ß¬•ÊÙ§ú4Áì>Ç7“Òx‡„hPK’µYuy3@ïKÖ•àR®!’Ó ôoÄì @ví¾À¶a¦Õ»¶mÇçŸ~ 㚆º¢à‘#GðŽW^Á“o¼îþ;¦‰=Ë—cÕä$` ÔtݾbQ—¦lµ%¹;øÅL¹üâ°¢ìóƒ•dÁÇg(˜±ôxòk[È÷ÎåŽbO¸R@HÖô"ÃÏ$(¥½ߌl‘Ò@ sÛùNöæÈØ8¾>W#íûDmgñ½µ¢>Uà¥T0Zá ÄöàèôúY ¶)àöÍ›ñ¥çŸó¼^çz=|öÁp¹Û…®(…s|hß hª×ö˜Ø^Æî\ʉI*Æ7éëb·Ši,¢Z`Œñšˆìñ°mÚ}ML”P>‹XÈú~Ä£œÈÉWJSÁ@"?ˆÈÉõû&4áO‘P,ÐoJ¬Q7¥½T3A((,„µ ïJø'SF€/pB  à†À sŽù¯X7=;7lÀƒGŽ ¡ªh¨*Ú¦é C윙Á¶•+¨«zbàŸLu}ÂVŒXL›eðÎ0ùœù3PÚl²‚c’¶ççyµ yø3I`‘*(ü~ÊðbIs%"ÒDV}Ç$ÀäúÖ’ê…@C¶¦¡àé>(H*: ƨ6U`äˆ2Õbî"W9CÏ o· (Š‚»¶nÃ7^{-¶îUÓÀkÖ¢¡¨`‚ì{ÿ*¸\Z  ÓfLoÜ)„„ÍÆþcÎÆÆÊÑ n¡$C‹|Œà̯ãUîyûËçi0€áóÑ`’ "ëTŽ40‘ $²A„ €@J®k øÒÉi/-L¬Æ!Ù¡“¥ ÿ’N÷@LڑߦþrT€$°Dæ¢Ð9‡Aðèõzرr%n\¾‡.^´£û9»¢!6´Æ°oÍZ0P¸âyÃx¼“˜$傜,†àÜfÑh€i˜¦Œƒ7êcP 0E‰H±¸2 ˆÅŽýÿ…yi¹»ç€Â4òWo Ða'“e=³¼ ¹|òÍÞ²Ú~A‡O–¥^Iø=Ddß)äê²€CÔ÷A4ÄßÀHÒ2 ð}DøçN6@ÉÍ¡üù¨£F)&€ðÆÉ¹(úZKZõÞµe+œý>&5Í[4mËÄÏm½ë§§"Ը櫛ÖVRWI§Á,þäÓ|p61¦iPW®„ÒjB™™ê `b<{%îË^XhçÎÁ:&?ΔÓóH0¦ìÄ*”Çö;nVœ'Ëð2¼Kï(¹šæ÷¯Éþ>äwÜdÙà#Ö12 8 4dk ü -ݼQâ÷ÒÂß§=v¬„~ªÀÈÙ§‰EáÞ0IøC¯×à kÖà¶+q©Óåh–¡ŽËWا(Òê¤ìi@Úi9ËMžË8›˜_½êø´eËå˼Sé¤ëö¿é)¨Û·õɹó°^~Æ… °æ®€LÓN?²o”üs*씪‹cã˜Ù¸ÂTbðI P®+G@t;€e_£¥n0Œ¾ÆÇè9×l­`¼ "0ÎléÍy?¯ÀmÒ‰I`1ý„M5-î„#Ò%OæÉ c  ÜŸXá⑺ü…©£HBØ›Tü® ;4pÐ `+ZcøÔ½ïaYhw»°¯ù5uݾú§i`$â‘ù”yZ&–b |jÊš5PׯƒºlP«EçBÇ@ÎuÅ~¸óh?ÿhlû¿máŒAQ”XS`ù2(Ë—ÙZÃŽA÷ð+0/]˜¢Á²lÎ$¡ÒŽ- ‚phqïØ·C‚M#A©³nYö¿^èöÓ´µ&‹‹6P¸x bn¢½˜†ó>s[#Ų@ðÏÈÉ[¢^TÅda‹8ME2Ј×N°ô~±˜vÒ$”M8„T‚pªÀ¨‘Œ À·::çèþ+¶ ®i¶0ÓÔ>È&[-νoóÚ%†¨MÂîÃÄ8øš5Ð7¬‡¶|9X£ámÂ0 „€åB g`¤ýÎô­àŒ1pΡ¨*'F‚GšlߎÚöí¨ðÚt_z ƹs¶0PÔøqâÞ/ âökNÀüåËxö™gpà 7 %´êÈ“¢Øÿt‹Ÿi€bÀÜpñpñ"¬Ës ö‚m"l@àj âžHÀG‚…2ø%<ðp(’ê$†"§|äá¾Ç•»T ÿR¨#GŽZÞ’PÍ; Lc,z%Ð n¨MÆ€º’|õ/«-‰/ƒä4b“`»wCÛ°j³ Æ9„eAt:ý~Þ>I÷…gØÛd„iÂ4M°nÌÑhšf —4 رµÛQ»pÖsÏ£säui€©šÇ_Nm_Ôi2Î9:Ý.Μ>©ÉÉ\sRxj‡¹ ôÑî\Í3Ÿ¹±Œ¥óÖ4`EˆD IDATÙ2ûÐ×¹ àÂ… (`Ìv&eñB2p²Oz9&5Ÿk`Ú锲]' cIaÀŠô‡ï°0Gˆ+œÛÂ<ìÛú àüyàõ7`ž>ê,Ú‚Uáí@?yOBÏžo°N²€&\MÉòrýÉ –%ò¢VT.U`Ԉȶÿ[Rt‡//qÂ,"C„Á˜ïê¼M&¸q°ú/@““ ëwCÛ¸J«aç/ð…8ŽÇ’Íq áx@`ºÚΡª*4¿‚®7ß„ÆÍ7Ï>‡ÅgŸƒuõ*˜ª„‡ÔuBV`Âu†¥=ùa^gjƒ <Ï 8 €ûœA=Ò4`õj`õj¨–œ9yæ™Ó ÅŽc*ê_1:û±Ì÷ h» |ÀHô”Æ#MÐC„¾ó_E®¨TªÀ(’%@ŠÈµ$¼,)§j…sÔ%ýéo ÛLhÓIùÕ4A­¬íÛÀ·oƒ66ƬPâ¢$J52|J. ‚ÑëÁ0 (Š‚š®M7ìCã†}À³Ï¡ýäS `šTÒ ±ÁÀ›ò ÒYÎ>³Òºä˲µh†átÍöᜃûýFX³X³ªiƒzùeX§Ï½®ý»ë@Êbh$úRÊÇ ßœe‘ ,2}\}77–¨€ë°¨£H‰É€26c0SNØ ç¶ª8#ÈPî<÷D€ Xë×Bì¿Úòåàœƒ„@ÛçØÜ‡±±K'Üg§ß–i¢mšàœC¯ÕÀUß»aš×ï=úÚÏ=o_#TÕ/*2¦¬y#BÀý?-ukž©³Xêù £¿D˲`Y`š`ŒAU” P`í°µk v»ÀÑc cÇ`: X& ¨ŽàM ²”}‘%hìã˳DA] ¬'Ëó‚‚”ú^ %2¾©£FîÝ|Ëê·øcÖ— ²úŠ2=áôŸ° ´x‰©ª cïn°Ý» Ù}¢ï€_¿SòÓ’<ô¥y&‘a tÁ9G­Vë zU»ó´öîA÷ß„qü¤µ0) 1+–Ö—ÅôÑñAH4 xÒ~SžÃ5¨ð÷ˆl­›ax¦¢(¬Õ€m[Á¶m…zå pð0_}ÕÑò)[)ýN&ƒˆßN`°ÇÎ$Ëú|EäD<(È0)ø¿«4C£ Œ"YVPÅìî7ñK0°îtÆÐñ—8çö½QlŒmÛ² Z-toº|Ëfhºnƒ_øát¦Å7÷7øHÅÅEpEA½Ñèarµû~ µ§ŸAû±Ç!æýf´ù-’¯ØÙMyî€ê…ç?é9 ýY\ËÚ!`ôz@¯Æ94U j€&&€w¼êõ»m ðÊ«vL U•Ôî8XfYûLŸßà´æÁW1—ï@¥U`)ã`RD:ûJ Iö-€þ÷ ®€Çžþóų÷6ÓBwí7z%TÅÞÄçÅ7Ö²Ð^X€¦ªÐêõþ7îGsûv˜ßùº/¼èÅHêdü‰Uê€!€JKú,®Uíc !ÐsÀ€¢(P5­ïD89 Üñ¨;vO? óÄÉ ¹(Q À¢ë0Cc(Ÿ¼²,&muÒIŸ$Ë…gÙ+'* À©£F^L|K®¸³šÜ¥Å4T%xd'Øa-p§s˜YºÖ£{Ûm¨ÏLCåÜqŽ*}.¼¦¯­Ó^R Àiš¨Õë}Up« õï‡qòÄÜ\¼Fÿ”ʺçÏ¥@%]Ë‹›ÿÏ`ÉŸEIï +³€ç3À8‡®ë} °lxϽPÏ=ý4¬ã'l¿5Þd”èTÊä| bý}X.­„Üwq@Û€êÀP¨#Hd €çP‹…R´Ä0…þ˜*Ù`–…ΆuèÞò6Ô§§¼+R|Ø‘çJ<íœ]%tíͦ÷½ðkvrD^Œ~–ààÁ=ðóÝNœsÛ\æåËÀÞû¨çΞ|Ö‰¶O³}Çù’0–§K²,‹×6Dý a^ä. T`8T€Q$aBö4å²KJº™ׯÃâ-oCcz çPá_ȳ}@`Zt¿jW&ÇCjÎûP1š¥Ž0*N…×~ P«õû´|9ØûÞ õÌXüèÊ•ø¼%öÀxX²¹$Ë%¿˜ {o;ñi2*ÀШ£Fû”ÈtŒa’*dYv–……õkѾõmhÎÌ@S¨ŠÆ‚‚隸ºw ¢Àš©º½m'H ·Yêç0 €àBt›$¿‘•+¡üÔGÇŸ€ù̳vî¿Spl¿Y|r pÑX?‚lû+“£8 $TN€C£ Œ ¸‘4bòÚ¸üffK ;3ù·ÝŒÖ²eÐUªªÚ!S%ÛÍÕö t­ "™ÏyrøAž P ؾçÀ®¡þ•Ù/!ºí6¸¢ô£Mê:pçP׬õÝï‚æ®Ú×IÝíA_r9ÿ8XPðÊF´ NÆ¿¬9Ì •`hT€"`‚+P\GÀ!PðªÜU=KQpeÿ>Ô–/‡®ªÐ4-Sø§µ-Ùr‰ƒ¾FA(¾C®ÀYes˜F\«Ú²ÞkaYè¶ÛÐu½o6Ú|”É Ð÷õêk>ÁtáîÃâËôûÏâSÇ€‚HÊâLà * ÀШ#D‚MΡ ` À);²Œ´zز0·g7hãFÔ4­/üGÈ)/ÚøÞ§àI‡„DˆgYp摼CË0ŸÃµª(ø^ÒŸ^¯fšÐ]³Àì,Ø?ù ÔGƒùÌsÀâ¢Ò×}üé>!caóA ±È(Si†F9rNÿ$!"Y)­ùØ…¶ËĺµXܽ “tM³¯úÅ4¯åˆm™çº[„¯£rŠ£´rsèÚ¿º7„÷§Ôþ¾IZr̵z½[àöÛ ^w¬¯ýèòå˜ë‚Qáî]çKÕ8‚=P%gôC ¸`1O"«L¥U`Ôˆàdäƒí ÊøLB`q|—nÜæô4jºUÍñ:Úþ¤¾èâX\'@ý-ÖQS¦Y·o.h$ ŽaÔîò—ðþdÏíÒöi¾t:;-µë°r”Ÿÿ§À#À|ü 'ºd0õp4õ/â³²øÏ²šŠ„±Îö9ˆ-#¨º8$ªÀ¨‘“¬‡8å_R1Kàì¾ë¡¯]ƒF­ÍŸì¤È˜}x‹‚ÄOL⮿oäq…!_}ÈcYÒgr-j—²5ì@B´¸½Ñ°¿¬éÀÝï´“}ÿQ0= ø¼ùÙÿXò{Õ$û$›‚Z á%•`XT€$²,€X4>|* € ‹3ÓÀúõh5¨éº\lé^ö߼ýÏ1Š ñÌâÇÆs¹'<;Å\FŒ(ÈÓ'¸T»m¯EW÷λ  á€=>.ès¼s`|Ü~BL^€ažÈ7’ˆâYU*€¡PF‰˜³„lƒöÉqJ±,œ½~7jŽê_‰ILT@×Ôv!›z—’5‘¢±òŸ%W‹õYºça³TÏëZ35p” @·×7Œ¾6à]wC%‚ù½G’À'.K`,hèÿÑ÷ ˆ ”Sk÷YT€!RFŽÈ±“üF‘ç:Y1!0·j%¬Ь×í$&K:üè† xg§`µ„ðþ&§ž«¥p…ÿÆ–.Z^œ Þ»(ð'”¥-¥Œ{ €†5ŽÐ3)ðV£¼·TþÝ)ÒGö&öE&ã§ B¯Óé߸ç]6xøûv:ê@Р7_Zá~×r€†TaN¡¤C”œ ØûƒÅ¦/¯¨ªÀ¨‘ç˜~³ ËÂ…Ý;ìÓ­EQ–^åîB& Ó´ªË4!„ç_gÌÎÑ®(PTšªBQU;çK €ø,2àÍ· Ç–d°ù.ÅP|'Ü¡¿ ƒ˜®¥Ì’%kìàA=¿_À»ïºv-Ìo~ ty.9³`8¡K27E…uºI ÿ™œÍ)ªe Pº`À+ À©#EÎê ßH(êß(X‘¶ÂßË«W€6nÄX£aßù–6Ô¯“JÕ´,˜†á !,çäo™&,Óu:Dv’ÃŒÙá‰UÕòª EQ p•+P8‡ªªÐk5èº͉j8 0á&¨ˆ1‰ÇÃÒùú6o*Ë IB†ë²Ô濆ÇKJå(Ìy¶,&¼mžçXj–Àµž&Àvî€:>󯿚›óÅ Èò `1I(ö³¼#¡0PJyg^*Àp¨£H & y'ʼR–E Óĉ-›119‰z­5túOkS²•”ömÁoz½ž'ôM0{¬+WÀO‚˜»õÜy¨ óPÏž÷6UÖíÙcp„¹Õh€4½™it§§±85k| ¬Ù„V¯{Â_×4ÔëuÔk5hº¥ì”Æ~Ê ,¡ÒañÉŸ˜‘ÃÌPÓu!pöìYpW¿ DN¬æ|ÆXÿ³ûç`ŒAUpΡ¨ª­R”>xHy¯åÖXîŽÇ>OH¬7¿¿¿ Bwq5¬] õ¾Âú«¿ék²’ …#ü¥•÷ù:ã ¡Ï} CByw],Õ»ò£ Œy€l•pÒÅ6~B§VCoõj4j5¨š–•Ý €å ~! ˆ`˜&ŒË—AÇC=ü2j/¿ ~î<)KŸÅò-DEÊô€T¸Ø<›·,\Ú°úìLÐó¿`49Ù¶ ðmû°SèZÇŽO@íÅCàgÏÙÌ4 PÔPivo×O‚;ÁÇêü´«WÑ|ý(¦žzf«‰Åµ«qyë,¬Z uj ÍfÍZ Íf­V ŠªÎ+mö×S=ýÃ_ø³‚¡€‡­¹DP¬šš‚ù÷ßæ˜ÊY–0L–ùÞ»Y:„¢À¬ÕÀƒUÓ!œ„UF½¡©hC4ສ×Á5ÍNZkÅš®£^«¡æa¿†ƒ\g鋦¸V Ö­…zÛ-0¿ù ¨ºÆ› ˆQP`S¼9p%üî¥ýõ9†¯·0T>C¤ Œ¥j²„CöF‘d¦‰‹Öcll š{¦hrIǵ# "ç0Ïœ=ü=(O< vöP«\q çÏ„#U°C«AŸÇÄ /aüÐË0&Çqeëf\ݺWW­Dk|­v­V ­fÓÓ $<‰ì‘)Ì ó̲³¬ÂN€ƒõâ%`¡ .È‘Å|‰ïb=Ð}ªsWú‚ȯmö”Û¡ªª RUô&ÆÑ™œDgj MˆV 5]÷ò^蚆Z½Žš +.vÒ\E}ˆìðÁͦýÅ»ïÒíÁúÎC ]wúÅ÷9%Upšù@,x®¬.`ŽïJ`(T€Q$/\lyÑý¼Ew«œ‹Íºk×`e½-Ký=àu+Àþ¦eœƒLæ‹/‚¾ü5ðõš}â}–sä€9›–~iËyÓÏÄ•m›qaÏn\Y»ããk406>ŽV«ÚüSé„3ôy‘SÌ4iÏ=m.RLy)Drø²WJ€éï~|=Š-üÏL”žô h m´Nž¶‡£pU…¥ë¸²j:³³¸¸b9øø8´f5]‡®ªÐuµZ FõzÝóÉK© c ûÀûÀ<hZLæ¿ß ëǷ˦€ŸÀ·Oø,gYG»X%U`ÔHÆ ‰rr—·,\\±Úìl_ý/+L €×sŸs˲`>ý ÄùKàê¼]PºdxlLvn’ ºšÞíbúÙƒ{å5\ܵWvlÇüºu˜ìvÑít066†š£f–9æ$Æ@¾rÉ/ Ì„r øl2ÇÇ;âÜ(—_^.w¼ýŸt'µÐ³­,CÌ?wnPz–¿üpøUôš t'Æqiõ*´gg173 µÕB­VCÓÍV FjÈL”6k2MƒÌÖ¬u»^þ徟‚ù—Ÿ.^T5èÉÏ(t­$ØÛ@  Ì²ä›j–\–Ùwÿ™³æìd@• `T€Q¤¢À·Àrï0''Ñp¯þm[Fà8§bEUaYŒ§ž†õÿ?ÀÕ@S"åù6’˜?S˲üeˆ1h m¬zôIô~ð.íݳû÷¡½b&111‰ñqpÎóiÝý×cã¯û¿bÙŽ¡w&àåœ ¼#é㊻ÝŸ†r'A¶Z¦Œ¤³š[W[ì@o/büÔÎÑžšÄÕ峸°n-®¬Xæø8š hÖëž¿ˆ¦ë©@( Ȭ1Æ`™¦¿ƒs`Íj¨÷ý$ÌÿøöúòÀ+ Ýë§P_ iâ‹”e Œ(¾lXà®‹Š†B5*¬`¹¾ö“óË—aÂÍøWÆø8ã|§¨*À9º‡^‚ñçÿ—í@¦©^ª\–Ó®/7f–« 1[5¬-,`ÅàõúQœ~Û8½}º½ ÃÀÄø8jÎ)‹dæB–Üvð–=~+§#U™€€‚YýÊJ#“-N¦Œ”§;¥|ŽÎ³íÎfc—.aüÂE,õuÌ­X† 7àìêU¨OMa¬ÙDs~­V MLJ MCäM›üM† €hqqVËþ¼e3ÔwÞ ó›Ú¾5Îø×ôÂAzB¿oªg‰@Á+‹,­ó©J<4ª@ D¡ "C§¸Í<¯\Žâ=…ãÊô–¹Ás†q-Ç'üUEon½ûÿ8h6Ò˜¬@NÏóìùqÔÈ\ÁØÑãØtæ,.¿q§o¿ÝÕ«Ñív199ë;®@ªA~,©ŽçoEæºÈó‰i0£B>1ýŒ‰//›šÖû•uŽÅ÷?3›ç­îûì²'0cPL³ÇObæä)ÌOMá†u8»qô™iŒ/´Ðj4011±ñqhª*¥!*M+c …Ô]ðÁ3LÐ?ü£ìƃa~ÓÀ€{³†œéö x÷¹õ?“¿\è7ïoÆ«k€C¤ ”H~ëГ (9?–Œj[‚ܸù‚`M´P‡®iCMüÃ9‡®ë ÆÐ{ùeX÷?è+×™ÄPhœés‘Úq¥g`öñ§P;}go¿'wíD¯×ƒiš˜œ˜è›üW'ýíSJ ÆRû9-†û\¢ ÷Êô5qðˈ1Ÿ®È9?Ëx³0~ÑÖ Ìyg×­Å™ÐZ±Ý^‹&³š 8 ¿·ešüו}/Ìç.ž³/9·õœ+}qŸ‚ÀÀsŒ”óÍ'¹f Fô×ã¢2 ‘*PÚ~H‰ŸËîU±\é€YÁ–…¹å³`ÃÍú@Óu¨ºŽÅsçÐùÿþÆ;Qè9ΜÑsÇINa Š»ß÷k¦ó|ù§ÏYŠýsŒ¿~µ —pòÂEœ¿q? Ë‚išžIÀþÿÛIõÈnŸÅ˜œÉ²ÄÒ¥à Sœ€´ žBJ^º4Ûuè3¹(©|HM¸/áÍ>qù &.ÎaÅÑc8ºcNnÚ„©™t:LMNb|bBZyG1¸V àØl@ýȇ`|î?yQ÷õÀÈõ "üû§yÛ$ÿ[¹Z†@°J0DªÀ JDH«¢›ä5BÖíÁšœ°Cÿ:€C‰÷ÏtÇ^n= ñÀÃÀ²©ÀéßU½ºñAÆ »ÑÜÜ9&$ÞðkÂ9 Ý&,PÌü&^%ôä9ƒvuïÏlj»î„±n ÃÀÌÌ êµZ|ØQ¿€D;i߇“A‘ea)#ªSèe‘[q„t|jÈØ”Ï,«|ì‰6ôÙßïç¶ fÀ1K€ÀÎÏàì‰S8ºkÖ¬A§ÛEÛqkµìˆ‰9ƒk ª`LÓ„æ¦ Þ»üηƒþ¾}å6$àÉ›Sד?xà*$Ø…bÀ£¾-¨C£ ,!•¡ 9¨ ËÚ ò;’ianbÂË’—´ùÞ€Rx?l¯uù2`š»?cƒÂ:ã^Fiþñqñccv?kÎ? @0aƒ‚t0²'»_) f{ÖbÞ~¬íÛ@D˜™A½^÷âÔ{$È‹?¦¥p$®{ÚRlòyn 0û `·¦£>@x_™šp±¸(L(`¨q€bl»YC‘‹›V—÷íŸ2ýšƒF"ˆ2"…C? ë¾üu¼aY8¹o,ËÂäÄêõz̳E†·¼ïƒÌ=yØ>þ”Rž—ì3“&w~øs0MJlù ³ù6K<½£oR¤ÖfKú5 É@À§îöÝXXyò¦/\Ä¡ùœØ±–e¡ÛëÅ›ŠJȘF €áìïžy8vÜγÁB}p}s†çÓhùµ[>aoüÑr®6€WN€C¤ \ƒ”©H1do,Wô\a ºn;Ù b¶Èè&÷iÔe³øÿÙ{ópKÊò^ô÷Õ°†½öÔ»çnè¦ÈE ˆC$G£qˆ jDsâÉcÎÉÍÉsnnî¹7ÉÍ9ÏssM<9ç‰ 5*Á J4"D‚3£"ÝMOô´‡µ×Þk¯©ªÞûGU­UÃ÷U}U«jコë}è]µª¾¹¾÷÷½#›kBß0 ªé)%až»aE¼r« Ôå• ”`ƒ.¨¯ ŸZ¸³¤ª(ÍÕ±ûίa_¯‡~ù˜¦‰êØf\@Ȳ8ï‹EüÒ÷¼Pz‘bÎä€5Áv%´ÎG“‹²à'žq¯}ƒ—6û¹g®ô¹֘½Úê"8Œ‹|ú8rNÀ𫠘ͩMäP¼H½ïN•íI* y’ù„úŒçRƹ0­‡±ú IDATà~Zâ‹ð}ºèˆßÈM¡Ãî×ËcäÎoÌÌ#° I’æepžâ*=—>õ,N..á¹—^‚žagÂܶu+ÊQ È0æ3ÔÞþ6ôžÛt:θ°Pûƒ}aQ’€@xk±ò’q×ZAÙQF‘Ì@p ÙÌ€L”o!oûÉûôó\÷µ!ÃÆ:¾È}Ú¶ ì’ó€gö õó‘õÄEÅ ^HéÑéJ}2h°A@„^ßk ÀÌÜ+EÖébÓ}ßµZøáä~åWØ®¿<ù Ê…þñ‚{ üHŠ8ßúá­Ø8§rŸ*—QCÌ€þæ<ý€Ù{Œ½A$†mQ¶SNŒÁšØŠÝ~LwÖ‡é¬ñƒ v<fôð¬iAa TUÅæÍ›m£Ñ8—zÀ6‚ÙëÙR¹]gByÅå°î¹¬Zá¼F!ÆÎ,€Ÿ@¡äFE2ѱ…ºÜdþ Áh÷ÐkµaÆÀm-M(P¦25 «Û45¼IÅȹ7(Bt.?^ xÿ} Ú8¢h×>@½Ñ›¾Ð±ÞÂWªr ›¿ýœ°,œ™ÁÆ’î‘Óì{ä±¢÷‡° Š»õØJjK1ó€‰ýyíWÀ‹ØOùž¿Ã`Ä.ƒ ‘mHªzʱÃÆæ .~úç8~ì8êu4 XD!¡P@ Ÿ.½´g÷àÚ## æß>fŒ}m*$¹QF‘¢NV!@Ì4yϨ ,5Ñkµ`ºž9÷meyyp}Î9˜øØAGŸº&çÉÙÄ|?'JúË+‡ËœÁ9‰Æ×écddleg“gÁú@ñ×¾>ØA?øiŒVgþº)ŠQ"²Ïó~ßus˜±Y Ç8êoòvc˜—¯|?CmpÄé.ÐàÚuHQ°óÄ,¦öîÃñÙYÔëu¬¬¬ð‡C€ÓeÚívÿB}õ+v'0i@hNø“ÔóåI)òÇr’¸ú7ÿÀÎÀûàEU1†Ò¡9”––ÐuB”æM½^–×øè}×bâÖ/€Ž= ô̰Ž_Ô/NÈßWNèâ ? ž§È÷]×r7‚ ãOmDÝÄy–Â×¼r(j5åµJ7…ÌZ8~[¦!4ˆ“"™bGk)dF•¢Û๯­P1P§ëpþÞýh9‚……,..¢×ë!Æcx©c°d‡±¥,ª½Q“B úµvržK©VŸ‘ˆ„¸­$¾Œ¨ƒÇ€ùí’òmP’KaØØlaÛs{ñ‰¨×ëX^^–’Ê €Ž«ž›ž†òÊW½g̈;Tqc  à¢ÐFÎ=Q‰?r1©°–—Ñ5 ˜ @ Ä´,¬,-ùîi×¾“Ÿ¿mÀÛa†7i)€è:Z àëã*È<bxþ${ }¥È¢s<)A²Ážk w™"Ë%é:ü}¦e丑dlrÁbÉ΋0† Û·'ææP_\D§ÓIl'íüz½€´_¾Ôí…×xÄ€«ÀXpA@r£ŒQ²GiÈrftL8„öò2Z­Vä‰#+Âô ÍP¯ý­XêHô+Z þ™´=E/¯hÄPýß ‹Äm¬gøM3Ké@¸œ$%!¯õtR¿H>ªy’ï·GZ oàFÔÉT5L¼hßó8~ô(¥¥‰ö™=‡éŸ½Ø4±ÎHðMqP\Ä'Y°þ|©#DcpBâäú‘   eL?ü¬ÃG°´¼«w Ö¶ v’ åF÷Ѩ×þ&o¿¸è,ÐÁ½Ñ[¥î¶˜±ÄI@’ ±ïùæ4°¡Fªw(aG‡uÿǰ€  z¡$c/š§Äãd)QÝῇS m¨ (8£Þ€~øæëu4›Mt]ÆœÂj^v>lûÀØpá/z")@xœR W*À‘`£iAëYˆ<é„î“ÜÆ-Ú84úÞc˜|ò§X\j`¥ÕJõ]¦a ¶è±±¸8p= ¾ãm˜¾ífèøA>P ¤mXÄ5Eª")qyÉÛH~çÙ~$ õ|R`Àd@KXÚ’^ àoÓpRpŒ÷³W d:K¾oœè@™g½p'fg±´¼öD½eyÕ¿r™óMŠÄüa@D‚î‚2¡Œe*Ž•,Duß™¬aÃÃ?Bëè1,7›¾¡Ãö%®)nv²¥¥%·Þ;0þÑ0ñ…Ϻ :¸/¢6Þ%É=ï¹?Üø‹‚äHVï»áŒû¿gègœÙ!äa=²'ñ ä$jŠU ¤ZÀ£È‘4äy>xƒ ê(LÁ®ùE˜G¢¾¸ˆ¦ûM#û¥œß¨uNPÎ9T* =¢TI W“ùÓis § ‘ð#²„WÜ[•ï?ƒê3?Gcy ívÛ“¼%›ÖEm:v8{²U®O²CÚ{Þé»ê»Þ:ødÀ@Ùl qRI7Ät•EÏŸïŽp×NòØ% õB§÷”RïXðÕ Rn‰”¢³1ó%ÛÏÿ¦, ¿tøœœ›C³Ù´¥¢¹K9·¡63†Ž­sfÖÅ/¶#ÆŒ¾ÓHU Ê’ 0Ò4 “|è^ ielüá#Xš³¥žïyœ$ƒ›+ XYY±½ »wcòÖ›1qË­ ž8!¹‰NÒ ú’ÌpPÐJó®ÿDÅç‘|à°ÚÒéuK’Æ‚2z9ЬTx;F-@ àþMRuQäØ04¦`÷ܺŽ`¹Ù”Ë×1$ðª”óÏuºüˆ€ó hx?ZæiH8(…÷@?÷· eŒëQh{÷¡±¼Œ.Ïý(ÆŒÁ0 4}¹ ëÐ~û½ØðÄ“Ðÿð= O³Í¡ÇDöÅxK÷÷¸ú£È¸N麜…t ‰»žÇX0)À ÌW¦LHª:"Áp'óðÅ 0Ù5°ãð ˜[XÀÊÊŠ·_6Sàê—Ê_ ª”Cm#I@Ó_µq6yl‹§1ãw©#O”þY K-æMqÇ”å66<òõ:š++¾a &§“$XYY Å ÀÅaü£×câ¾o¯ºÐ=3ù&2æ£ÐA’27ä½+!nÎzìeæ5¶NÉ`@ˆ8½KI¢T'i˜¯¿ù8Q!!Pb gÍ- ±°€V«e‡ìM:ß ¿Q Ôpg통u ©‘ˆ‘‰ HÈ6PÁøT€Q¥¤ök)Ëf4SÃÔC?uÄv ìv:ÉO|½^Kõ:ŒŽ?.€öú×aú ŸEíÆOŒž&ºn’Ìd‘Hê}J !#«"EM2¯i‚‘GÍ"%ó»X& «€Txâ°QœÜÉ™€1lhµaÍ΢¹²‚N·;\¸n™yd =1.ÛuÆÀ8—}\Æã#7£d±Ìâ»V0þ `¤ˆVñÕ öÝ!M…þÜQL<ñ$æëu4––l KˆÑ³”8±Ê›Žm€ÏS`Ôþã0ýݯBýó?xt´‘~8HúýäÜø¤êN«¢NÎ+!ãoÓØÐé]Ê›.ZJ%§“ꋬZ ê·4¶ö;¦…³óXj6Ñn·û¾ú™äþ<øM9{¨g ¸ÈåpðÛp×|ª®Œ_D8%(5À€T呂&DZùžoAyâ Ì.ÌÛîyÃ& Ê ½–––Ðòfl#Á}¾õm¨o}èù'@ÍNx †9…'˜’Jìƒá¤£°\H‚qæ£Oï’'qßœÄ5H.IKê_¢v8+ŒaËBõFívN'TôÐ@€·o^ß½¦eÅŠüÅ6Q `§Û‚ñÇRF™VI Z$ ¥ŸŸÀŽþ öíÇ\½nëYFšºa¤Œt»]4êut.ƒøÕ×`òÖ›1ùåÛ¡\° ´ÿ À0‡ ”ϦŠë(¿CÆk"AÅÚ”á¥Þ"Åï²ó%-Ž—/“òîS‚$Ev-5¹yÛ Óá2¾¡ãˆx¾GoT@eû6XÕJôZ4䬑a£VŒ_Š pÊPýk2f^øaÚTEõág±í¾P?r õz2{€d_sr0ÀȲÐjµ°Üh b˜@©õêw`êö/ òŸ€5·ÚT<.q>ý±§øøkßÉo—À8#4ÞÉpµ¶JaÜ„”R€øÕŸD %ŽbÄ”"‘¤K"äl@Õ0QY˜G³ÕB§Óaù¦ ÁÀ6nmÙd3ÝX€êU‰Éz $iZqêOB((öCc`P¼Þîk›jØ|óWPû·ïâÄì,ê‹‹>á|Úš@:à€Ó0Ð\^ÆÊò²?vÀ¦¨þÁïcæÑ{¡ÿçkaít|)ÁÆ3¬@&¸R»"ác™"a“#Cßå%Aµ@)€´8>É ’@-€”!‰åÚ¡8ãäKKèv:¶;`‚yOC^cC¶ëLX¦éi¾hŠ5”l`ÁøÓQF”RG³M\‰ín¤qWMNcÓÝ÷ƒ=þæëu,¥ÌL–¾€ÀQ ôº]4 t‚qÓÏ;ã»3ßú6Ô7]kÿãû‰ñÍ@ ¼”Þœ¥¥ƒñ’qÒ 0~nÃPSdÖ+ ¤‚>F[åKêÖ#Åñœq—Ãæ(ˆJ%,·V`Œ^/1|/iL¨J)¢ÿ9,K_›bó Dÿ .'aDÀÀ³”Ò ÷-$Î(0ÈŒ´÷± ð´i#ØÖ-°6ÜHŽQ’ò˜?|?7*Ài@Ѣ‹eX@0ÐKd.€8)@±|”Ÿ=%‘6p$\I…ŒçªTM p S«ÞÒγ¢Ø`âÚ.rk”˜Ç‚2%­‚$‚D~L©‡œ'íg™dÅ*T"c)6Øø©¯D8ñ–ßè‹9'&& 8¾ùQ5¹´–f„D„••hÝ.jµ :™Î؉ñ^Þ•—cé}ï+ïΜòµ–"ÛOé{|UxmÿAYa9p =ã÷pN£‰yn~wÒQ¬YïkqÖí\º'oÆXü<æy‘ËŠú¦}õ½?è'9÷Y°>ᤊeÁ²,XYXË{ßóz%¥`Y°TŒæþ8’ó >ç»äF…àT¢!]Õ#Oà>5 ƒ‰Ñ£û¬Â@›'±ñÓwbÓwaî¹çprn‹‹‹èõzÒLi=H Ã@£Ñ@»ÙôÝ×ß{-¦ø#(o¹xîAûIÚ =k)ïvæc˜T:0¤ 8Lå(s ªK¤õñˆ­“R©ü®rYë˲úR€L¾Áüú€úä¤]§”ï?…¾îsóÏ• 0jD>a7g4¨ÀJ\{Ú<Í7ß‹=¹½GÁÑ“'1·°€V»í³ HÒ«µD„v§ƒf£áÛ •Ë^Ž©ëÿÚ^ zî \ˆ¢Ûb2£§6 Èu„í¥¤L:Ap JÜ×ø$ø6’Š­ƒ¾íÜîÅ$ŠmüõWÐ\ÆO”}Ç&&l €ˆÏÇŒß΃ÂóZPæT€‚¢¿w@h€eƒ ñ²Â@[ÇQþî3Øzãg¡~óAÌ>l{,-Á´¬¡DÔ« €ža`±^‡é·~Ƙøèõ˜øÜG@Ï? 쟷2ÝÓïYJ°–Û(…æ*[`èyNpèh}q#\¯XÂà}G.·}B#DŠè²š«– Å ÈCÌ:S àf¬”m€Ø‹-cJÄÆr,(#*À©F”ÑýˆMÃ{®°íäÊ¥-5èÏÅŽ?¿“·ß‰ù½{qbn èv»™è©WC:`«& ËÍ&ZËþ(úû®ÅÌãCyÇ• _¼ ÑÞ!D´I¥k½,¹›¼D#Uaækü(© JÕ`W@º¨„Á¶ðÙšEP-ÓÅ'û^RÏ­ €1Å ¦Eœ¹N ÕÿêPF•òÎX'¡=píttbÖ¤Îf0¦ƒ6OcÃÇoÇ7|ÝÿÇgg1_¯£Ùl¦R È´3@@„N·R à’‹1uÝß@½æª Ø!§$‰}Ýne$^šDñí#щ6* ‚ £õEÕ%!ŠÕ›ÂA˜‰äÃsEæŽèß"²í¦ýF\ßezÊö`qÆ…¤c+øuEÀü¨%#ŽÔ´oólÿžÊ@Û&PþÎÓØö‰›Pýê×pòàAÌ:®‚q¹Ì‡m~–€À«ðå8c'¦®ÿpH„f”5ÆLuóx$]?Þ6 k8ø;l`R;H—'0pßIšxÐwIU@°¢@Õüø Ã|#r/PèeQöD¼ ùÜåCIJk=Æ8Š”ÍyÎõÞÑ¥\ =%lƒvh›?ô L}ù,=ý4NÌÍb~a­V+si€¨Ã2@ûäµ´´äW pA@2‰ŒP¯ø­Úxð›o2Li(W>ämdÒsß•÷DH•*ØsÃ+‘ÓT Š¢@QÛ¥qˆø RëÀq´êuÀ2Ãö-¥¦‰ °TØäI1JÅ«3©,žT¥HÀ"º Ú2ƒ 7Þ‰÷è=ü}œ-tÛØétü]põU _åkp#H©¥#¥’ S)¦6³-˜dÚK¾&`ú‰óÅ šlTÀDqîùýT‘*X"k #ÀP,]ë3,#‡Ì€Š#ö'"@Q1[ñm¦(õIÁûs§œ6DÙ=±¹…@€LµŠ­Ðz;ÿâzL~ñËh<õ4ŽÍÎbnaÁ¶ ðf6Ë3n=§«I˜ c Ýn7 nø0Ô«_뀀ôsán¬$5g´¦cÙžXËú8O HŠÖ+_ôÕôø¶§ŽsO‚ËöºÅI{MQïg!ð”a5œØDr €VÛ]µ a¢t?çè%à>- ˆpS›*ƒé*¦?~;vüÝG¡|óAœŽêWïÁÉpr~ õ:ºŽý¨Ì·€Àm[/( Øéؼó*Ðþ9Îø'“„º >6 ‚“и¬æÂ•‰ü=`0GÁŽ‹†’•0’¨1(&è" ý\SØ_ïß–c¼†J¹ UÓ *J:#Ú¤k¢ÿ 2çï/ ¼ä IDATA€ Ø†‚ß|6€È 0‚D¼ïUæÁ¬*Œz x*P‚0(ôPÜÕ‘hGæ°é¯>…-ŸüGt~üœ8~¼o$hôzö¦“椳ÌO¤øë;§ì°Á©'A|OrXÔ絑k+Þ @ÜGîW.FÈ»I|êŽZï‚zçxá—*Xìêܵõ‰q”ÊehšUU‡œ›k²@ ó @Ÿ‰KDüV°ýü©§Éécó0Œ& D6Hu"ÑUÐöIÔîü>¶ÿí? öå¯`ö¿Àñ¹9Ì-,`¥Ù„å5LxÁÓ)q ø0Á"c·´Æ‡>ËøöÁ9³ûËŒ¡;9‰²®CUÕu>28 ˆÖ‚ûÍY`Ùm­µP»cíEHÀ|©#O1±¾×ÐзOÀ–رXt܆3Ðöq(‹+˜¹á‹8ã†|'‰ùy;œp§c¿Å†ŒpÔ=Wu òÞk¡¼ÿí gO 1× ú†Í?̘H)&S€“ÅO¸†(EùQÞhCRd½òù ‚ý5ЮÕPÒu(Š’d Üøÿîýn´Ò‚XºGñóÄ›³‚ÿçJ8U(B)L&aÁ¡ŸãËdh°@_;™ôëVl P~|/¶ÿÙ ¶‘à#âĉ89?o'2ŒáA@¿[”é‰xÅ›NXU1ýÿþ7àŠùU‰¥<&‘£µÌxð²ë…ŒÓFÇ Q¸ÞàûRî$f¸Áºc¥ÁÌw±”¢í¸cJ„nm æÔ$tWÿ/pÌ.¶ DþÝ.Ðj¬ù)bÚ$Â*”;à” dQÞ¾–y“T0”a ²$…x÷“ªÚ6ÉÏÞ‡ÿóï1þå¯`~ï^ŸZ€<T¶}K ayqqpoÏŒýÑïƒö½ 9ˆ¢òU_~ÉÆƒÃ^Ü?J¶Ü#OíÏx)ƒˆ‘ÂTÁ‰R˜E8>= c|º®÷]ï ÉuìytìD¸ïQnŒ>#Á¨±+A^T€"ÊèÅX‚¤¡„S´¡†lÉ@ª¢Ú1¥±‚ 7|;nø8Ø7ÄÉC‡qrÁ;€åP8©t€1ô ••þ­Ê{~ êï]zö˜¸ÿIÇ~­NR—}ç¾|N‚)G1DQæ¼à¸¤MDQ*6I©@ ŸB Ó&˜i¢7³5G jZŸ9ËnIÁP;³^‡ Qì\‰ æŸ'`„È0mZPLÇLñ­d"L¬QèU¨Ã®*¶Zà±ç°õO®Ã†[¿€ÖcOà„I0Wi@¨¹ñ€€hµÛ¾ß§þÛŸ‚½öbPÈ+`)À:Ú;£NÍa±}Š¥c©¼IŒñã§ŸÌ50T¯ï[ŒŠN(:chn߆j¥MÓ  ád?P5;¨±ÿy' „J(Ç’ + ¢Ur2è”Ò*FtEEËB ÙN@ÉI)ÌâÚLâ>PUmŸÄäÍ_Ƕ>òÝv–Áss¨/.¢ëF\ÝÅN‚–%¯*ଳ0öö÷•N‚yËqânp³ì%5”YïI<’Ih(Uç;$¹zAv ÖÔ8·lFµT²€®û×_Êy‹ã¿ª¢Ý.ŒŸ=”Jbñð:°.€«EÈÜ\Ü´f ¬³1™M%H)p‰Áö(ñÒ 'ZÑ ´sÚáYlú«1óùFóÑÇpôÄ ÌÍÏÛ‘-k-Ió3LÓ—=°üîwAýÀ;@+ñà¦r \õUÈïwÔupˆ¤Ö·¼*€ï9œ×A8ŠD\¡š\·Áø~`YX˜ž„51R©Íq 1Ü!ö%ÞžÀÓ4X°²âHˆó/Ĉ€ÖrŸ&T€œhíÁ@¯[pßÿáSò“ƒ- (ƒ R óNPR€þ]í˜ÆÔçîÇŽ¿ÿ$ªw 'ž'ææ0¿°°6ÒN;`ÄþÕwü&pøè`Ü)éĉí¾)ðDžÒÕÄ©8óÌͲ[ŽdT@OþÇã êÌ[Ûƒ¤!Š=ëÈ0an܈ñ±1ÛPU#BpSf`@q €µ÷y. rëL 0 ûçS2"Š<Ñä(ñC‡ Ì>2'S³¥plRl«ûãÐ.`óÿ¸Û>u“IðÄ Ì:yÖ €%O€ ÒWçî¶«øÆ}X·ÀøyÍ_Ý*/ð2ÂH<ø`j»Àº–ý¾Ò +åô5t- vD}ñÿr­Š½çž±±1è’Öÿƒ¦ŸqÖ7\ä\T$ÃÈüÉÖoAé©«L^0óÉõƒ!1³Hâc(cÛ'xq@€„ [W@;'P»çGØqÝ'0yû˜=x³õ:–ÖX%À˜ 6Î@Ïo‡C}å3èôúݨßr²Vóœg}§á±  Èç’ç{,a}„y%QC„3#2ÓÄ쎭`[·Ú€ºÝÕÿËoJ©À€hÈØ¿Ÿ+þŒdãÕPpýÕ¡¬1 r2”ª#À”(u;£Ñ>ƒ<¨ìü›^Ðæ”Æ ¦¯» ӷߥ§žÂñ“'*ÕðŒ@Û hì­oµ—8ãâ1Gâ­ ÁåP` Χ›âž,6$Q”Œ)GÕ’¸ð¾‘Xá7qìƒ „û³eNžµ“““(—Jý @ClHrk‡Š¢Àjµ`þìi \Œ/E¸J€€Â 0W*À:¢ì¤”»@t—2– *sŒ=‹6`PÚ9‰™›¿†3®ÿ8º?þ Ž<‰ùz­VkMT}[‡ÔË^åš× …Ù¤¶ÈŒº•‰t€Ò©‚׉[¥=­/®>”û€4™Ýk‹ÐÞ0…Öî]¯Vmý¿®'òÿl”++cPTV§ ZYé¹êÿ.i¬™x)A”Ñ‚ÒQÖ1­Šº@ô‘r7"é’F”ÐùÑ n€m$ˆál¶ŽCæv|êŸPûê=¶»à쬭 ÷#'²ˆ`F¿}¥×]ì;=.Á¹!>‘¿µ4 ˆ5ä“W׬P5ä”%¤ŽÖ—À <D$ †Ä ‹gïFiÓ&”Ëeèñ¦ë6ˆ ¨*UEïÀÐþƒ¾= î·I’Œ‚kwÖmA6`Ô)3cÀ ë2¦”Í=h«l À ',YMU Ç濾 SwÜ…ùçžÃɹ9,--Á" %0ÎxóÔÞðz`׿TƒÏa–cðäØçFô!…*€;;U@ðùTö1žñ[œÁ#˜?kw?úŸ^*AU”žÈ ÀÖÿ“e¡÷øãŽÁj”e?¿ý¼rÙ ÊŠ p*åùBò¯’(j3’“¸ÄœÅ["[5 ÄµKh ¨;§0óÙ»±ë£7Âxô1!—%(`°ãôiÏ(W]cÄ vŠHµÖ.V©Bó’ÄÝPÊG?`?ÄÉŸ$(6Ïúß00¿çL¬œyj®ñŸ•kv¨µÊTMƒ¹Ø€ñãG€J™ïÂÑ~þX$:…`îT€S²”ärŸo»žü”~Ð5,yc$,ƒÚTCùÏbâλq|ß>Ì:™£@€¨Oi7Y²,t[­þuåê·znÉO5,-É.Óa\c¸:õ UÞk‘H9v½ÉfŒ_â‰û˜È €c—¾•Q©TìÀªš(RGÚÙfŠEUÑ=p´ï@ÀÀ&Õ×lJ& Xûà•§ àT§u&¹vIœä €€Š †¼{ñÆ1L>ø¶ßõ5ß¿¿Ÿ^8 õMj¤C»Ýî_V®¸ì¼]ñ L†Éz ä""æ û–Là½ð&…q-|mXûq}|û€Aù¬g`þì]蜵ãcc(•JÐK¥TÆi«ªª€e¡÷ø¶ø_â—üýI¨jŸ)HŠ pÊS†î…C Æ{„6£„‹ÜH‚% ÆHÄlÃÖ/} Ûï¾'ÀìÂp XkÔ†Ë˜Þ u˰KÎ`Ä ‚¹·“2öÌqÜù²Wð†‡d™0dëà¨"û‘¬>ô‰ùKíÓÀø/‹õGªªÂh4`ºâÿ`_…'zâ3â¾—3-ȦŒ‘`+Ê.&ç‡ù&ØY[@ó¿HRÈ0ŽãÑ' û eâ ÆIœx›o{Ûî¾'Ÿ?ˆ¹…4——3?‡pº—@åܳ®!udÕè”sœ­B*U€Dì~a0!$s ” LCœüyõ£ 2ÃÀÊ™ÛaîÞñj%]GÉuýˈiо= ( ˜¦Á8pÖ¾çâO_Yä|‡ƒEJNr^Χ;`)IÑG%Y¨¿õkØðÉÀ^þj eÄ>/Õðí÷Q®Û%Aƒ‰Ø\æ[ïö¯Þƒ¹Ã‡±¸´£×Cž¡‚ܽ^ÿ«õ¿Í ói°¼t >¸E3ç¨"ûÍgÈ\éC”¸òuD'À <+ùØ€cxáÊ+ oÜØwýÓt/EÉ (Qâ§^&#Žú„;žktꉼ-SNâF‡“}1æ‡îþƒP.¹SòG •ý‘ Æ*зÅ|Ó lú‘%ÍÄlÇÆº•GÃÂâ"šÍæªlÞÐÀê‹Î5Òsµ¶‹| 6º$´Këí=åDeÕ¿\Þ5?ÏBÝ=9 –œj€uº˜»ì%èœ÷¢~à]×ãAiF`€ÁfÃcýÏ_•DÚPP!È“ 0‚D¿oHI½îC§Ù„þ®k0ñO·Ø  c×ú!m cã pºI—A÷WÆ€ lýæ¿¡yÈ–t»]N“ ‰±~ "Pwì`‰CV °^vÑR ù$H2à"¢!äÉ<Øÿ)½=@ð:d\?ªfhïØ†W¾ã6 R.£¤ëÐb\ÿÀÛR®]×úß8x´ïy€)Üþ°à8Å€ß\‡­V(®Ó“ 0’$wâ–WDlLtðüsÏ*ÿþ·QùÄ å}áB²ˆ$˜Ä7§ !Áð» ª’ †¨RÂØžÃô~Œù…,7›6ƒê\³Œ½ïIN¤T«æ$Æ2bð×|ÿ$î|D­9óã˜3oâ¬Î£×¿½ÉìbU²ž–ýÞ‰×\‰ÒŽí¨U«ÐK%”RZþ÷Ç9áºUUV§ƒÞÜþ ãËq#Z¦Þ? JD8Mˆ¸Ì{œ±³'OöïM\û¨o½4÷‹”_j6R€Øø‹¾ÛPPfû¤™ ¶<ø:ûö¡Þh ÓnóßËhÛ¶{. ×ÃJ4V«ºø¢~ŒsQLÅœyuËg ¤aìbÜ…`F y`í毼 ÍK.Æx­f3Çï?›ù‰_³ cPu½gŸ…ñ¯_ˆÿ±ü)1‡.(*À¨ ÷j’Ø;VIC}~~ð‘NN`æ£×A}ó; `Õ¥bW)a¼u8ҲݕÈvH×PþÅ1l~ø˜;yKKK¶»žLÛR"rNX€R*V Kÿ$I™VciF2êd"{q&D×@yW=¢Ä@C˜0 þgÝ:»v`ö•Wbbz‡ùKéþSMqÛ«¨*È4a<þ$`~ñ¿‡a+¾æS {ÉbPlXÇ‚†¥Œ,¥5¼ @ÉYhƒ19|xpk×™˜¹þoÀ^öª€QàjKä^ãoÜnNoÓUlüÖ÷Ñ}þ–šMôz½äéƒÃM 4= ö²ÇGž“MA=ôªo­q ªuFV Ê2ú ‰*GõG6.ÄKŒÚf_ÿk¨ìØŽªò×qûË5?…g2E¢iè=û ÷~Ã9ýó™¹Ê™a@À­ÔÓ† pºQÔFñ©)Š‚å¥%˜Ýîàæ¹ç`üÿú/¶Q`Ûˆ­cµ¥¡ N°!F® ð¤ŠýÐ"ªÇŽ¡ÝíôPsABP`ºå—J`µ±¾D y½±˜y_7¦¢y¸Éñ^$" úäG¯Ódª ªLàØÛÞ„Î/_‚ÚØtMƒò7¯yTÁxäQ`¡îñý§@ü Æ6]µIA¹QF™hx)ﶈ)KK¾W*ïy7&>{ ¨éõ XRQQ}ÿfÇC@ú(tã'N¢Ó騾úylTN™ýÄ@ŒíÙ ,w¸Ás(Å E1‰üŒÎ^ ‡SKŸójœ*€{šO³_Øv‘}€e óoyŒ—]ŠÉÉI”K%h ¬þ³Lü£hŒƒ‡`<ô= Rö‘ùºIñc' '€\©§# ñA™†ÆÂ‚ï^åw~忽Îï@Y¶3[)ïU9*'^ïH9¦£vô8º­z†‘kLËë °y3Po ‰@'Ðß@¤Ä$S9 H¤ à½í(Œ¥·fbC÷FÔüAtMñ ÝæÞòëhüê«1>=Ýgþýˆ)†;íü1EˆÐûîàý…qûÈ( F‹‰r(Ÿ àþyRFr’ˆw†ža`©^÷Ýž|ßµPãm£@ÙòWS =V# ‚*k¨9kyF¯çcÒYS¨lÂXŸ>9Æ.éJ1J‘It‹âíø!ÝýÐÙ‰»tiÈ“¿û[i¡ùš+Ðzík093ƒJ©MUm½¿2üv49•¢ª0†ùÐ÷쨔Ò–*ÔqL~€‚r¥œ®4ÄGÆôz=´›ÍÁÍ­[1ó‰@}ëÕ°î¤qEyð8ƒ¼ç-RØâ2:ËËè†/`OÖä­×êt€q]~.§Ó°,À43ÈH S>ƒÈ JÓI CÙðNä‘$…Q OÅàd&z/»õÿíP.{9&&& «*EIÇü£æ5!)šóða_øâÀç? Æ÷‚UÖ÷?fŒÄ   ¼¨§QÊW†Oj˜&ëu>ø·³Ï‚:FÌf+ÛÕ•€B€:»‚Å_~1Ê‹«œÌv´ØL“ŒžYÔ}ßψô¸QÌý$k_RDß¿f¤‹O‰ƒ žVdZXºæÍh|à?`ì‚ P«T 0ÆTd»-Èϧ¢( •ôn¿Ã6üÓ5~_ÉU÷7Ÿª'.nB((äJ8•h()@ 3aˆ }ë–W°kfnú$Ê×ÿ=hi_?b øÓ^M)€| €B Í‹/Âää$JŽž6."[ÚíËU/õ:¬ÇžpL(ý¸…ŠJ™Ï PD‚I/\u:U¯ÈxƒÓPÒ¬$jA=¬gÍt/½?ûcXï~'&Î<e]ïÏ·ªª¹©•Bó)XãLQ`öEÿ•Ⱦ²€lܸDÆgˆRWü?7ÒŠ!8ÕÈ5ãÉ÷Ñâ‚€ñ‰ èe'cØÖ­˜ü£ÿ}zKÿáwÀ–·›¦ß;¼/ß&ÏÂg9?ðžÞüÀZè¼á¥`眃‰Z­”%aÌCßXE£ñ­7; vh8kƒý qŠXÀ_Ñßöl—WЊÉ÷<Ø®þŸÄï›ïQ»Ÿ¾êÜ´Ì‘åGÔ9†rÊf2u×L ¬¾óÅç¢ý¦_‡uÅå¨n܈’ªÂ²,Xn¬}4Ivd6Njk¦i0Fïóÿì$ûa‘ãÊÀ ÀbÇÜ?.äüÁ„óùçJ8Õ(jßOÂT½·x›†€\›€¥Fµñq”«ÕþoÕ÷ÿ{¨Û¶¢ñ·}ãn`ù€ªpª"q¢Þ$|MêÙ¸‡0,PYÅñ7¿cÛ·¡R.CÓõ¡§)8nÞÖ¸A_:>Å<† ÉúÅãM¹¬·„€ ‚Éû¯y €@c`ÞúCŒYfŽƒLŸày,X¢ÚMÀÒ ¬-3è^óVX¯~%J»w£\*, ¦ë_q îdÖI®`@Q@½Œo>Úû<ØÄ8 ›-ñ2~)àfòÔ/‡7ßî| O*À)IYK’}„.po./ò,Tkµþo¥7ü:6]pêŸ~ºõÿ)»€™ w8mb2ÎM °c Xø¯¿óâ‹0S«¡\©ÅÿÃ̘KŠ¢Øî_D0ëu(ÓgÆL‡y…ž_%Ç*’Õ׳¡îyX‘予—2ˆ¥)þdQŒÎ0€¥@SÑ}Ëë`¾ñסwÆÇì„N¦aØñ#˜ãY’@äŸ'`ŒÁ|äQ˜wÝc'ŸõÏ#­SƒË+˜à @BA¹QNEÊZ fCqJj­¬À4 ŒOM ~ܽ Óùh]t!šþèÇß&ÏÊ*·¡/¸iGµWJ.þžCûW¡ñ†×cjãFT*èZ¾Ÿ SÛ «^‡ñðPš(‡ÛÊSpïþŸª©Ä'óþÚ òÇÈ—._¦¾Àø@NÙý"Lh4’ë%/†uÙË€K.†vöŒOOC9Ó4Œ‹çºþ¬À`ª ëÀÛêß²@ªè~˜‘+ýþÛªñ¬`pM}°˜Zëõ¦Œ*åÁÈ%_‘Ý|Üß:Ý.Ì…Œ×jPK¥þïÕßzª¯~_üÚüG`6ïðרü#ëJ=®‹9‰îÛ_‹…÷¿cgž‰Z¥‚r©eX­RÅι°P‡õÈS¶%¶ÌYö½&ëUF_Ÿ oA¾ì”Ï—/þÂùmïô@.ÌK.€yÙËÀ.})ô=g¡2=R©Xz½:†r¼c04óOû=r?UÍÍ£wó- ýGeG^Pÿ3T޽Db¼îÛ9R–õ²vOa*Àˆ’ÿOûÉ¿'c´Ä†ÅFÕJÕññÁ;¶còÿøß1vå+Ðøä§a|æF0L›·ÇVLž › -ð<Û3€“ÇнömX|ÿûP>ûlTJ%”¤cMK è«z³³À¡EଙÀ´¤QŒÀ"Î@2à7ÜC4ó‰ZïÁ[†tñþxT)ƒ.<æ^ºârÔ6mB¹R;cf¯cG‹$Ë g àe<¤Qߢï9EÕë0¾ô/ Ÿ<îüñ>TwØ(`a{ïØ»ú;–®”¥ ¼©#D€Šeùe°øûõKª(!óûTÑjµÐëõ0V«AóH´_¹ 3/»½ßÿ=,}âS0nú”½ùl<×FÂäêeÃJ^¨ƒ¦khðOÐþõס¼e JšÍùϵ˜QF¹ë n:?ü`­˜á輪úÞóßXÅ¡xFtÃÛðîIÙˆ…E@· 4[6Ó/ë W¼ÖŽíPöì]t!Øô4*7¡4=M×aºÎiß2Í+aÜx¯ ÇèÝ.Œ¯Ý ëÎ{€Éñð¹i²™¨¢ùŒ2š”@PP@ü¨#D`ܰüœ?ð±3Ñf—ª6Î{Q–Л}À6Ðh4P.•PDSUè¿rf.})zðŸÐ¼ënô>tÈ:†mÀ–©ˆ&z6~žñ`œà;ØŽõþ7¡uÍÛA矇±±1¨ŒÙFyªjo„Qt¼”f3'‚¢iPT½z½o~ìÌ­ájت˜qdG¦i3Òà Ž‘÷šþ^G—Ó—™˜aÚ‰w ÓN¯Ü1@„· IDAT%¬c€ÆË@¥LÔ@gï›™»ô% 3Ï„¾q#”]gBC©\†âJ«Ù„iš°œÓ>¥YY¬¡˜%A€-®ïõ`|ý°¾t0Qã2òÁ%9—vr,DºbFØgÈ2}!¸-(k*Ày7´à—í¹ìïi}¢ûy²LÚïÝTÚz†r©„êØØhôË^ŽéË^üîûÑüñ#è|õ˜þtð§`(ã;1=²Ñƃêm µÀX×¼÷¼ì¢ Qžš²S;ÑÙEø‚Kw6Åfîœþ¡(èìÝë+ß²g3ø†hƒ1™Ø —@VdÀ%{v‡¥C¾Ê%[Â$Ÿ¦é ™ ÀÌ(åP©“`SS¶Êel l¬ V­B™˜„V­@óÛ{X,ÓD·Õ²}ø- ¦ó/åJ9céa`+a>ò(¬›>g»áºÀ6Ø—ÀÿÇxmàFbñš Â0G*À¨¥y”†fà”X G¦ib¥ÕB§Ûµ@µê{¿gj{ö öΫAÇŽ¡õÈ£èüäQ˜OüôÝÇ@ÇŸñôl N؉sªÎÒîÀŠ ¢€€eößïz7è5ÿ¸ä°3Ï@u||`ÙìlZ™Ef‹N@UUa¶Zhã~°@&BñÌ0ŸÊu0ûÌ÷”ÌrÊ(““Øü—1”á¤?’ \t÷ÆË²l§ë`ª*ÏLMf·k3yç„ïïQÿßU9¨fÜ5m=ò(Ì?cßôÎK #W|"ýd À¶°WXÈ>#¨¿ Æ((7*À©@§y®>p(wÁl©:躎R¹<ˆ$Ø'ˆíÛ1öæí{ó›€næÉYtyàŒÙY˜ÇN‡Û]}¤(@­VÒMM¡lØœØXʶm`5GüéÙà Ž+^®sfbŠ¢@QUt‚ñí‡ÆQODÌ&3‡²i²Õ" Û†㲬>ÈsOÅ}ѽóoŸÙ;§{ËcÌ·jÑúdÖŽ pû§( aÞòy`a(éÒŒ\­û÷-à>Šû®g„œuìúö3)7ÁÓj'_u*ÀiC~õ±´z_¡iY0Ûmtº]h++Ðuº®Û‘÷¼ÓJ%¨;w ºsð+— î†íËÜíÚ'4ç„CŠêD´7 Ë4ûÿ™Þ“à÷)_%bŒASUÛPòþo‚xlÏùƒ46Pã­2¤jZfG–…^»^.¨Ä«•`Kàeô€ÏPÏ÷wð^Nc”Íg\I…Ëü?õо`^‹‰“¿æˆðÉ»¦ÜÞS€Éœd<5 ʃ pªPÊÓ|¤QÙZ}‡ŒˆÐ3 ô J» EU¡iš/W:ã¹ä9÷X©ä·Vv¯ºÆZÞ¿‡2ÜʪˊU×Ñ}þzwß ¶óœø áù®s½8XfÓ(Ëì ÓD³ÙÌ}È7œ“[P4çë$HOòŠÉ×~ﺶž~Ö­·žxÚIò#/Âgòp àÇòäþN… @®T€ÓŠÄ·i­—ÏÎ"‚e0 ÃIJhæ)NÄ<7•jÿäî÷ZžS9§|Z'LßKnþ÷ÖÀº÷^°³Î:ŠW„'7¿~ s¬†n<‹~å,íY+0@–e`Ázô1Xû¤-ö¯Vy¹,Ï}C/x2ía}í+ªªDhÝÿèë_tpM¥HbyˆmIM)ðßúý4Vo=ç5&–eÁ@Ý.Ìûî‡õ±OËMÀ—½’Ë„¸Y?Þo‚kò•ù0îšÐ@´Jé«Nk*$§Iû÷3ù÷¤ëÎ/I–Ããkâ·ÇÕýwž~½ÏÜ ¶c ûWe›‘P@â18Ýç@j=€tÀ²,XŒê {ï}ñ;„›r[ù' `DPû¹âR'ûËrßOê&Èó(TùR!((?ZÒØ&bmO¨ª¦ÁZZBûö;@ísNÿ6 6_AÃ#{®d€‚ó³çàt_ËIÇ‚ˆ`˜¦}ò_X€uÛ?ƒn¾Í6ˆíûù ÖGÀàqù£ð³âk¿ªK ¤Aÿ ʇ À©H™K2øG@: ê-Ë©ÕI»Úºÿýq°]Ûú?Ê Or¯€Q˜—õh§±Vc7¶Èß Ltø0pÇ]À½S~k^‰¤J@Aë÷Eæaþw}c#ŠÈù]xò/”ÿ«BYZÍ„e_ëi ÜœðŠ¦¡ûÓŸ¡ûá›gü¾×Á7x¡}ÓzðÆÎËH¨ VIUàCD0- Äh¹ zèaÐ]÷€í?Œ…÷‰`xoŽ¿ê×·¬!z… ÜAþ,1Lߨ8ýçIU†çm ªM£ `ÈÜwUMƒ5;‹ö§?zâ0Ø.¢#Õçbå¼) ‚“9Œl½éÇ+ã±rã9™®;+èÐaÐÿ Üû ÌÈËü¤Sf (ž5ç7З@´€ úXçu]P.T€‘¦˜X¯Y…±w†¸ÕMË™ p‡Û×\Ñ3DPtÔí¢uç]°nú<°k‘÷½2Iä˜1¢Ë1r^ã¾vËv [Žû«Åhyô݇»ïöjcN-Y¦íÜó¸ñ©ýDz†Áa>Yyq×ÒÆ‚åJE"Ï¿iõe ¤Úü2¦^8Š•]» j&ÇÇ¡ëztzÜÌû<º€ Ÿ†•Šª‚u»hßýUöwÀö]¡!W¢JM¥ 8}ÀÚÈ‚„cäf´Oý‡€;ïîý&P);Ìß_M ƒÆx˜qð¼›}’e Nìï@>Y êSáp* ÿ PæWpÆÿs=ƾôeÌ<„¹…¬¬¬€,kí6û Ïöz÷4p²ý1í¯ß‡Þïýw`²ì³úw» FNM”WÀ:ƒu4/ëÖÃ@r|,Ë‚a0, ærÖ÷¾üÍuÀׯ<™3óïÏ ¿5¿çnŠßÀú<ß÷ϧÀKÄ õßwI•‚ñçM…`Ô))€ø7€¦ª€aaâú„vè¿ù&t.ºÓ““¨A×ÖÉ2Z§R²,@QÀC÷‡?Bïo?l¬Õ’¿¹ž44OI@äü®áfºN%ëF:À‰¬i™&,"˜D Óöî¾~?Øýß¶“bõuýÑ1ö£$ jèä,ÿ~8u²“ ýk¿±àzš¤S“ pª“ôG󠦀&fPýòס?÷<–¯y f_ý*t¶lÁD­†J¥EQÖ×I|0˲ú'ÿÞˆîÿðÜq`ãXÌéI›šh®ª€à‰î4ŸÞH¬)¯qÔi®Ÿ›ÿÏí} Ê=ßæíD>’ÙöÜ¡æ‚ꀀ¨÷ã à7øà»"œHˆ ;€U¡Œ ñ¤Â‘R€Œr@a ©hOÅôã„ößEóß]…ÖùçajbãccÐu½¿™­¿[EÆãlâLUNÝo<ãº~qØä9½yŒ°O>þ´©þ¬ íÜ.¯Ç#Õé \Æïf©@í¶ÍøŸxìk÷ÍÕZÕfþîx óè‡ÈcÝÏ„™¼$P *49R B`'‰¿5¦™;1þ_@å‡aéš·`þ5¯B{ófŒ×j¨–ËÐÖ‹Z ²»ùX´»™¡ª°æлó_aýù ¶ÎÓXÄÇÈ3â fLó45R—zDæåVQ߸Ï$ê3~öãŸ@ùòÝ€aØŒ|Œ?F)@As@@<Ó÷Dà  €o,èy&•Š @yQFŒ(ê‡L¤r:R`j3´ŸÆ¿ø_h¿û4^wÚ^ˆÚÌŒW«(—ËP•³3æ4êI@U…uò$Œ[>úŸÿØú";.»@Ÿ¯°äLÆ·KÎõÈm¥§˜tÀËô-"X€Ÿñß~7Xϰ-û+eùÌz¼=ÀÃÄY_çωÿχ|ñ=e¯}kÍ/ ´A p\e*À)G9XÎD1”ªT¶ òÅûP¾ý;XùÝ7£ùk¯EëÜsP›˜ÀX¥2š@ ßA9D–˲@Ž„ùäOaÝ| è–vœon ÆÓM»*NýËÛp‘/ ‹÷]Ï ð”YÞ£|LßIÕkY–¢÷ða(ãGÏjUP¥Ü¯…%I¯Ë™wôOþn|ÿ`¨^§žTÀBÆXý(ƒý‡“.€¹RN%’É—¡ O MO‚„Ú§nEõ‡Ñ¼úh¼òJ¬œyÆÆÇQ-—Q.• jÚhö,¶É ÎBHQ@'OÂüÆ ›¿í0}Ó„éžôM´´:åÉŸAùÉ£`Ïì,ËõWÊúÕÓ €ÐC*÷A‰DÌ~$Wxöòغ$5, @~T€S’²t ¤ø"Ýo^cÀôf('–0ñáObì®o`å­¯GãUW¢¹s'ªã㨖J(—JÐtÊ(Šú<ŒŸœSV§ëgOn½ øü—€-g;'ÅcçÙƒÝøëÉ?Õxâ¹qîŽPZÞDð:€ 4“w™~ÿ¤ï0}æ0}õ'‚=í0ýñ1ǰq>& sôýýq‰¿'ÙÏk³8@ØXPÐÆäJ8Õh)@ºÃoj ˜ÞõHÝwßÖë^Öå—aåì=¨LO£â]ÓFC*àaü¦ã£ Æì þ™Ÿƒ¾ó]ào>4{Àγ¤ÆÔ¶ÆØåó@€”@|ã/o™ à ð…;¼®›^_íÓOÌXd3}4`‡CyògЂL¿VåO\M Øù$”Èø⓸_Ý?œ‡À`1ñŒÙ&Z¥WäD#<ÝR`T÷5ÏÆ$~bX)ÉÉÓMkŠ0þÑ[PûÔWÐyÇkÐzåX:{–·mCil ÕR š¦Ù`@Uýúȵ$Ç ‰àfq6{‹1Xí6ðì/@>öO_žÙ lÞLUc˜ó@4« BUw±x»¶Þôz™s×Ýó·kØéªz¼Éx,˵Z nê‘€FÊÁƒPü”§Ÿ³ÁxuÀô…s˜ `#Sa§ö ²â ì‚Èõ‹)—‡–`¼ò ˜ç‹öe—¢{æ™ -›¡ÖjÐuº¦AS¨ªÚ` cÃO°"rS«zÜø,Ë‚ÅË´€F8tì±'€ï~Ê=ßÐ6môI>ÕÛ¿5¦‘ª€¸ùàØ¨ PU0]GK­ÖHn‚Œ³Ö“Mû@¶L–8§zf¶ß}ÏY”N”V l¥åè1¨ Ð}XZ;t ¬ÛjP©¨ hj<\O:"#ï^Bà ëÆþ2 ÒÆ…ý•B¦/Ó/^‚vÈTP0ý0`$)ž»{M½ØRÎ)(Ëh °a Ð~vÚCO¡|Ó—@Ó3è¾ñJô.xzgœî¶m éi(ã5¨å²¨` pàlÀÁ8ãÀÇôþ‘aØ:Ü•°ƒ‡ÀÊCß»÷{ºÀÆ-Àöˆ3ïE±? [Ì$¤V€ãjÈpÞ¾ç‡î§sö¿²†"x–ü…4­eÌù¬Ù„ÒlB©7@ (õØò2X³eÍÂ"HSÁ–VìwÛ]P­ ”uÛ¥sb,ò{ P†;äó‘¢ïƒß×­ 0 àÅ ˆ·d}ít"’ïzˆ½¦`üB*À(’/pÌs,eD³€•ºB À}1`fÀ8˜”oûʸ @´a¬‹öÀ8÷,{v£·s'zãÀø8¬éi(ºV.ÛñöUÕþ× ú®M.p²Œ̲@½¨Ý†râ$¨Ù„öÔÓPŽƒòüA°¯@ظض1º£QýöŒ½Þ¿7n–€*:¦îûÌ/=êšçpï¢pÇÊsí&pÍXèýÐB‹}&À€‚Ï{~gÞÆq~GÜïÞv+Š˜IUŹöÆjP˜ëžØÌ?a›ƒ2-9w,ÐÔ&X—œ ªUA[6ƒªÐÔ$¬‰  \¶O(ŠsrÂ6Šj,ˆ ,/í6”nÊb˜›«7 <ø}em 6Tu`ëF铽p EJª lÀ €`0Éixåro¤1PŒRT´ÿ¿½«Yšä¸ª'«¾™‰16’Ùzö, ­Yð,^^/Ø¡…WhAx¡F8 ’-1í ìO"@ޱ„G#K£é:,ºº»~òçfUV]Ýç8Zž/«2óffUÝ“7oÞÜýðh,0y õ[*ݵ³þF Nßd+íÞV€ $ ¤¸=G3Š’+ÙAÎá½>+¹°*0%ý0¾ƒb'ÈÊ©7옲D0< wçöÒŸ•hFßAÓuš‹Ûÿ†Y\k†¬ápƒ€b›Óæ4,ѾPöЇƒÆêeôåjm ÇoŸe™!³)?íe&#Yû.0.ŒÅ"ŒÉESÙñ6s|;CÏ užOȼzögDÜ {Tt9Y[o¿ì£¾¤a<8þˆ€žo =rÑüîïw…ù¢z–ðɽ·ÜÐH€K–KSóóÚVŠø.r¿\â‰òÍ:˜ sWSã×f îI–_”øê¿°óÙý*xÈc†òµÈÊÖ)69Æ^ÀñÇ" [ÿ2²vêþþ®¡D.s­´Uq˜5à¨ôk8ÜG„+2*8'ó’ýÎÞKuCçµÄq^””Ò¬=–F[_ζ*$ÎZ>˜/«‰ä^˜?‡ï‘E‡úÆ*ëŽ0E LõzˆA×îÃþw$&OÿF_D®œ¥«ÌD`ïéÞ H’!F™¥kzÉ¥€ãZm/ÈO Nbâ,8Ùö°" ŽÇd€é$À·`š…Æ ¬¶²g‘€T;"K{çÚ{t¸‡ñr<£}Qžì‹Í®×´4A 5;Ûÿ…ds ^´- å!°"láv‡ºÄïb˜{=ps÷ýß›¾{D ÈR@Žœ´ç)@öË!‡õþ^Дx~«ÀrþeI'ÈxBYöd`é“Âß)ýÝórãzfÁ!eì3Ã'”o·dúÓ’õ\šàà°ª®Ïû¶¡ DV„û ¾ýÍÖàPf dað–.¨[•èr«)é¸à tî`¶Õ!‡ÝÔÍÑá_OŽAI§@ëØXI€7)áôi"+êU˜–Êxt =¼©rF“f¦ýfÊ;˜£³ §ƒ-ÎŽ‹CþÒ¸m4ÿ_òû%¬[DwÅx^âÔuæç7–Ý%5€ûÜê@ŒJ2ÇI.u­ àhîwÁãõ&ê<|ìsåN(lgé¿ì‹³­ IÀi± ‘ŸAzú™­/ÈÞ¡Ï·òŸ»E¤ç¶åHÀᙤÇa0åèK‹Z%º¼ø5ˆ‡–€À%¢¨©?•—¦Û÷ óø1 ýCîJ_;Ò„ƒ4ª;)0>µÑðÁ{{ĸOéCŽ„ ~Ê?'ñøÚ¿÷ A`µ°(dÌò=7g+r# 0^;š«w¨•¦“¥ûÿ½bVëÃô¡g/Þ_xgÇ91ø—|F™ q*jA` HÏÎû3ñÁó”5ï” dŸFìXµFJÖ—–1óïÕþY ^»eÂÁáK™ÿ…úve˜ºkyaÊ*~¿¶ºßO]ánòö¿{‡cô;ìFðø':Vß½ÿ-;æ† ÿ9 &Í_Ú0 ÔäòÆÞúœâðW$Ê =¶À.ÂÞœ­{¡úröçÓãcWn‡@Lž±û€µ/€OØà+KA`Õàü[Šo œ³U¦|ÝÊЉ̧ЃŠ>ÙŒÒ$ ‘žK$¼÷2Úgœ˜?=¶wCöI,AŠ2x”sÎÖ½P}Ìn[_ÿØ!`"%ô8 Æ‘įÈáŸBAˆ¬%ǘcV 91ï6ã5"cßR^±H„–}z3¶Z#ð…Êèõ½ÎâQ1g“€’å1 6½“ÛåI³d·oÝ›;“‹¸eÎEFw È m àÐà„¥ p àÂùY²îy™´ bÜȇü¥©KYKlË þø4Y&@ $“ê¯$ $g\v" „}õM"0íÏ'ÑÈoX"È™ù‡å9NúÇ2:_‚¸ÁByˆ\, ã—Rõ÷ÌOhÐÙú$ÒsäÎŽ/@cý†çtN|ƒ’ö†W>#З³ 0Äè÷¥µíõ['Êûx# v+¿à’‹ìFÚ~V\ŠŸ“½‚¥€Œ›û³-ÏýSÌ÷¥H@ð^(ÃxƒoYŪ°s*žsè¥"eõ| Î`8÷Õ—\—µ%'Ho)e®_€åcûïs«S†À5 _/šw¦UƒñKÞežPö9õôH.–x½¸=yÍžöS®œ“aØâ'ÂìBOéHŸKB[ï¢3ÃD?œ è¦pq@[{”p¼¿Ëî9öª çò¿€óßÇhðO2ÿŸ"Àâ¦÷T…3o¸“5mÎÏ»àR@êšß‰ÐRVI€N3Ʃ͕¡}ømÂ$ßIÀ¡=\®ü9$ ;·Å=˜»C„ni IDAT Ô>zÞ@lÓ’ñ·ø™ÿOõqAìýîNß×—Úz½àR'7ª|ž [éóÖŽe/æQÎä„sÂ÷“¸¨ÒN•‡ÌòÂÖ†Ql‰s ƒ:çÅ=Èw µ¹¯Ïó–$vGÿ¾‹ß‚p ˆ,ˆ% A2úϽsNu-×z·50k “¸F§@dÈè€ñszw!ƒç€Ñ.¸Ò$À«”™ÝG#lí³‰ÎýûTØ—Ú½ÿhäüwB¨ŸOˆ!!(E &¯UŸ³C`±¥€üªMy|³ÄHupšP§v œ `'‘Ö3$‡¶X‚÷L,?8Nƨ}ß ë¶Ä\çÀĶÀŽ þe ŽväÈùï´(„©Ê¼4!oÕâüc sÌù+_ HmYÏ‹®—Ñ?f§Àó#û†Œ"K‡ 6•—§¤“Á{f–Ÿã˜ €4k[bž_€/íàSá‘Áqoþ§œÿN€3CÔJ@>(²˜qË™× ××°`TÆÑèz±:JÅ%È)#«ßæ)lÿ3º>Ð=䇥Ë÷µ![Gfâf?£_@"„°Ï_¡p Êüb¨¯W€YÖAŒïIVù‹Y ȵ<,*á‹J9æ´Ùä…Ÿ²$ÄÒí »ïM¾20¨Ãë_°ü~±‘à<ž: Ÿó½Õ90ô¼¤—%Bþ À ï:™ÿO €5#Ë¢l]«¶Öµ‚¥€Ò«9ÊÎXI܉ðA‚BéY$€ö~1*;ïúúÌ2OG^ñSÂæÎdÚ—ß©"ê IÎŽJs nüÀ¿¸߃öþŸ7ê‚•cO¡gdßÿù»³½kG,/]fûsë3vpè¶`ú¸Ã»ŸTg`b·€:¼g””j·¥ŒH:SP'“O6ß8`§m®H™9yCå…ú.,÷pLةÙËÚO‘± ƒB‡íb÷áÚ“7¸”ÓolïsýØùúñXƒ#PøÂ?w ¾_5øì¶Þ¿ª÷ÝCàZRƒ[ºpÞ2" )]9‡¬L"¡k*$YWŽ" (Íö|‡„¼%H€©Œ‰)×T?¦•©Ÿ¬ž @–BfûÇá‹6Cù&ꌶkÿ°¹~(d7‹x êk»¨ð5€'ñýªÁ[­â¤/ô@à¥X#7{Þc ¿Qó*—1©¨©ËÌ:”³ N¬€‡Ë%˜ZFŠŒ,KºÕà ·îš`Ò¬œ:\@!ì,å˜ÅÄv±­ÓÍ”ÃÁ¡ðÀ×ཊxÓ/™üï"׋‚ Ü_*ÈPŽK-L%!YõÚéûØN•Áó‘f'Ý? Fò1‹H$>Œ$ oÙnMë¡q;S°OïëÕŒ%z^Êh:äÀhá`§Îƒ|C«‡GǓ٠Gü¤~XçˆØ)~™ûï"«DÆ Ó›uÞ¬½?û²‰7IÖ¬¼ €©KSd ‘€Ù¦ÿAï/L0—d•‘"‰qÉ$»&ü‚$È6›/@úcšã+à©7´ŒýÜ “×ÁyÜüKÎ^øIM¼Wovÿƒ+ûZŸ3D. -¤Jéfr%pR_…ürå3,Ä è[h 8&”­­ïbr¤úq 8XJ¼V’)eÆH2- yuô|fY4rœ;åÒp(ÿÈ/ŽuÖmú3·ñ^-Åî¸FÌX ˆ_­kæ”K øÄ–J‘€ÐrÍà£ï&–3›$—–%~+II+¯ 8l†lëèí îŠ8úƵìv&~’øÂ·µÃñn|` )þs‡À¥¡” @öéK¹Š.L¹¶”?@àõžü³É¤dÝ$`ìLI¸³%@lý<1ÏõÌæúÔ­_Àp[Ôh•>J_^ýë€ÀµÂ¢œæxå{R»pÓ‹²e\­?À„þȘÁûS ÜRç:HÀñÊ®Lw§$Hξ¯i¾G²<ócíû8î<ù à¶~pxo0Ó—Ò_DV‡Ý‘™ÕKlì™RšÆÑXŽ÷€2MÝQÐnPFJ†%Ày Ȫ3óþКÇpÝØ\nÌ|x6’ïu:xüƒ½À0Ý<íµa¤9çs*ëd^Š„¶§L$~wœŽi'½D{¢VÐK½ì˜øðÌ×Àj‡wjà‰SJíXøé+ðâ÷~§ýh»õ5¿ñDòäËäŠ4Éͺí~C<Ú6EÑ×v^6¨é#lŽÄÃmã/¼U>÷¢n%4÷…tªCþAÈØÑZ6#D4fcŠ\sì‘¡C•>Ò3 mëÐw2ð”w¼oUÃu‹êDÊéUÛYÏ­ãÀãàÀöÒ€Ñázƒ‘ü€g•Ãmíð£Úáݺ?ÛÿöÒ‡ˆ 'ÀŠPøÛÇðÕãGÐû'XP¸xYÙøÔÝ€W‰à-ð[drø¦ &îøí¦ç>W6£;a]eÊwEË} àƒÊá#lðŠfû €¡&QC4„rˆ ÕøeBiüÊp€DSßIDÓþDh»#r·U;ÅpƒVékp."‚ ,ŠŠ:ã]ÎòÝT‚ ÂõA@A®"‚ ‚p…A„+„€ ‚ \!DAá ! ‚ WAA¸Bˆ‚ ÂB@A®"‚ ‚p…A„+„€ \œs«þ  zã7®æaÔi€‚°r´Êó+’¨W&{Ó4Í£ívû»u]£ª*:V¸3üãf³¹šP@.UU½×4Í‘|¹&¹>|¸ýðÃÿàùóço½þúëõk¯½¦ÁNçHþ€¿¸¦v‹ÂeàéÛo¿ýùõÕW?Øn·Ÿ“üކQ8%ZÅÿ’ à/7›Í××Ô~A¸ ¬ùÃõ)ÉOˆ'C«ü¿ðg›Íæ»×Ør„•£õøbÅM €¯4’Â)ß™Vùÿùµ*@@.Ÿ®UðÏ>û¬išæÇBá(ÿ¿¹æ¾„ËÀ'k~»Ýþ»†PX­òÿ€?¾våÈ@„3Àv»ý¥zAXåÿ'›ÍæŸÕ#²ÂêÑî›_µýæ›oþW#),)?Dá2ð|åòÿ§sQ(Vù?ð§Rþ}ˆÂ€äÚ÷/Z×õªý„»Ç ¬4ü7ÉïøÃÍfóõPò„•ƒäKçÜÚ×ÐéœÓV@ÁŒáù$?!ùCOü=€_¸Ýl6«Ý!³4DÊ Öa&¿Çk—›û÷ï?qÎý¾†SHäÇíÙ?ð€ÏüÛf³‘3iDÊà×$¿ QWw€Ïü×ÚñàÁƒ7›¦y `«!<ø?ïc·åõO¯éàAAAAAAAAAAAAAA® ÿ¥/˜‹ØRŽIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/iconfile.icns0000644000175000017500000040557712412506713021144 0ustar sergiosergioicns TOC His32Þs8mkil32 ¹l8mkit32t t8mk@ic08’Úic09±is32Þ¿‚~{ont€€‚¿q‚EOƒqƒUÜÿÞK ƒ$u°µ—Ž{% €2‹ç¥SJw¤' ~Ärd–ºçÕoX(~ªèr¡ÑÉäÝñÄdwËÐvtlX¼áÎôÿð'qx(—‚|‚˜–žÄÞðåÿiyz,@/µË·¼ÆáóõâíxAx>#µçÅÜæèÞØÎôi|~%në÷ðìèêåïÐ r€M„š¡—–ˆ@‚ ƒq‹q¿‚€ƒ……†……‚‚À¿‚~{mlt€€‚¿q‚IQƒqƒ U×ÿÞK ƒ f”‚Žz% €8†Æˆ?-j§' ‚ËjRx‡ÕÚmX(~ªîxšm½çÛóÄdvËØ‰ePCºèÌõÿð'qx(™€fUmAJ»ãíçÿiyy+A&’‰U8cÖøóãíxAx>$ºÙš»æëÞØÎôi|~%níÿþñçëåïÐ r€K€‰— —–ˆ@‚ ƒq‹q¿‚€ƒ……†……‚‚À¿‚zkkt€€‚¿q‚MUƒqƒ UÑÿàL ƒ Rp^g{$ €=z—`!Z©% †ËW€6µþ¿PJ€ÈâÆ¸¼«ØòáÉÍøñÞM"mÓûó–vâåÑÛâѨÙóàиëþüüî¤ €}CzÌ÷õÖf‰Øµ“uDFÏùÞÒºêúìòóÿž{R¼é°aXP?6YÈóØÎ¿ìýóöåìöa€{~·¬Ì“@\=aˆ¦Ò—œøïÅÀóùïñóäö°„|{ž~›©¹ÉØÕ˦|†¿Ð®Ñüóòîíää×R†ycyI1ˆ¾Âž±¤‘†¨¥–´ÑòöððëìâßÓM†xe^$'„£”––•µ»ÂÞðùóîîëèçÝÖßh„zpQ⿽»ÄÑÓ×èöõìëëéèäÝÔÒßm‚[,Žöçîëéåçîíçåèèæãß××ÐÜØN†‚R`D*pÝÖÖâáååãäãäãààÝØ+רÌà©#…~>11®òÒÓÓÔÖØ×רÖÒÒÐÏÏÊãëS :5»äâãÞÙÚÛÕÑ×Ù×ÛÛãë߀(y±ÂËÛÖÔâçÙØÙÖÓʦM €€#1>VPIdrTPSJJ7€Œ„€‚…„‚ …€  ‚q›q¿‚…€€ €€€€‚¿¿‚€ €€€‚|v{ƒ†€†‚¿q‰ Žq‚ € O°Â¹‹1… ‚ [ØþóúÿÉc…¥á·ÌÕÕòÿ‘‚6?u†€…¬é߬\*‚ rŒ“y1| u|Y a°1V~ 9Mˆ½­¹ªŽ›v&oÒ§~u„ŒÉÏ͸ƒ1-TœëÊM¦·`­Æz/%k”†ºåæŠ )½ÿ–xN'q¡­‹tÊìáÆug]><¸ýÉdGi£µ˜Œ‚ØóÞÊÍøñÞM‚$oÓúó£y»´¤¤©~ØôßѸëþüüî¤ €|PÊùöÛy|§ŠmV.:ÌùÞѺêúìòóÿž{_•ºèµquZ1!@ÄòÖξìýóöåìöa€|¹®Íž=XS*IaoZŠÿîÅÀóùïñóäö°„|{ œ©Ž‚„‹‘ŒŠv#3¸Ò¬Òüóòîíää×R†ydxI0l…}…Šƒ{d28¯Õïöïð:ëìâßÓM†xd^%g€^K@0<›îúñîíëèçÝÖßh„znR ’æ­zL;DaÖÿõ€ëméèäÝÔÒßm‚Z+ŒöëîÞØÜèû÷åäèçæãß××ÐÜØN†‚R`D*pÝÔÙìíîêâßãåâààÝØ×ØÌà©#…~=01®òÏÍÍÏÒØÙØØÖÒÒÐÏÏÊãëS :5»æäåàÛÚÛÕÒ×Ù×ÛÛãë߀(x°ÀËÚÖÔâçÙØÙÖÓʦM €€#1>VPHdsTPSJJ7€Œ„€‚…„‚ …€  ‚q›q¿‚…€€ €€€€‚¿¿‚€ €€€‚|v{ƒ†€†‚¿q‰ Žq‚ € L®Âº‹0… ‚ ^Ýÿò÷ÿÈc…¤Û¶ÐÙ×òÿ‘‚>7T_Zg¤èÞ¬\*‚ cxhMBL?t`a°1V~ ;OlŠ}ƒzccFoѦ~x‹y™¢ƒV#…ïÉM©¼d”œ]#CHE´é㊠)Áþ˜sDLdiCDÉîàÆtg]>>»ÿÉhDIpy\T:NÕõÞËÍøñÞM‚$rÕþô¦s‰sh]_1-ËøÞѺêúìòóÿž{`˜½è´ly\#  "»÷ÔϽìýóöåìöa€{ƒ¿°Ñ£EWB&.4=…ÿëÆÀóùïñóäö°„|{£…Ÿ§„[DDE>525µÓ­Òüóòîíää×R†y`qK0JA+5=95- 4¯Õïöïð:ëìâßÓM†w_V#DT,  7šíûñîíëèçÝÖßh„zkN ™æ«wK>C[ŠÖÿõ€ëméèäÝÔÒßm‚Y~*ŠôîñßÕÙéû÷åäèçæãß××ÐÜØN†‚S_D*qÜÒÙìîîéâßãåâààÝØ×ØÌà©#…~>01¯óÐÎÍÎÒØÙØØÖÒÒÐÏÏÊãëS :5»åäåáÛÚÛÕÒ×Ù×ÛÛãë߀(x°ÀËÚÖÔâçÙØÙÖÓʦM €€#1>VPHdsTPSJJ7€Œ„€‚…„‚ …€  ‚q›q¿‚…€€ €€€€‚¿l8mk%dq_= <ÃüÿûÚ, $ÏÿøûúÿÿË^#¤ÿõøþùøôÿðT nÂöüþÿþÿÿýôÿÛF#ÿÿüþþþþþþÿÿøÿ’UÁÿüõýþþÿÿÿÿÿûþøf (àÿñüþÿÿÿÿÿÿþÿ÷ÿÛ0 úõûÿþÿÿÿÿÿÿþÿúþçm%,Ðÿ÷ÿþÿÿÿÿÿÿÿÿÿÿþÿ뵟V Wôþúÿþÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿé«ljÿüüÿþÿÿÿÿÿÿÿÿÿÿÿÿúöö÷þÿü §ÿøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûôú÷n¼ÿõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþÿóÿÔ% ©ÿöúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýûös±ÿûÿùýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ¯ ¼ÿªÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷þ®!Çä&¢øþýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ¿"εJñÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷þË/†ÙMCéþùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ¯ ~©`ñÿøÿþÿÿþþþþþþþÿþþþÿüú÷w7fXšýø÷ÿþÿÿÿÿÿÿÿÿÿÿÿþüïÿÍ«ÿÿüúýý÷öööööýú÷þüÿî[ "‘åÿÿÿÿÿÿÿÿÿÿÿÿÿþø²P”íŒÓù²¬ÅÑ·¥íÕ¼ÿ¡ ©ä•Î(5.í“:íkfóú“ö—ÿLJë} sÿÿðöâG·ÿÿïýª#nŒÞÿÿsBx¦ùÿä8 g½.—»q!it32t ¿‚«€€ €€€€€»‚¿qûq‚ «  » ‚¤º¥‚»¤ *’¶¦c[•M·¡ $iqo€ÿ óòÿÿêz@zr+¹ €KÅòöøõäáäðóèèùòáÿÿÊ_ ³¢ .ÌûÛààßäèêæåîïêòúôîÿç/€€± #SãÙÖßÝãááâæèçêîëèñîïÿšKN°Ÿ# [ÖߨÜÛÜÝßßáãäææéíìðñóñèë³-±œ'@ž©·ÕÕÔÖ×ÙÚÛÝÞààâäåæèéìîñúõÿ²" °œ*GÐïêäÔÔÕÓÔÔÖØÙÙÛÞÞàâäåçèëêëéðóÀ²§D­›  £ùÏÔÕÜÝØ€ÕÓÓÔÖØÚÛÝÞàãäæçêíñïñ€ÿÜ@­›,°êÚéàÛÕÚÝÛÙÚ×ÔÕÔÔ×ÙÛÜÞáâääçèìíêìêÿ©¬˜€*  ¥ÿ×ÛÚãíàÖ×ÖÒÕÙÕÖÕÒÕרÚÜÞàãåçèëíõçþÁ ¬—0@ÏÿùÿìÒïýõ÷ôâ×ÙÓÕÚÖÔÕ×ÙÜÞßáäæççëíøÙp¬˜1)/7‡šZ6`”†x¢çöîòÝÏ×ÖÔÔÕØÚÜÞàáåééååúÿ®ª“+x‰BK˜wGF;ZnTJD4(U~]åö€ÙÓÓÔÖØÙÜâáÝàïþå©g ª’7.|Ì®@sÖç̸ÉÞÚÒÄ¿¾›_NE"Y¾æÞØÞØÕÓÕÚÙÕÙêôÜ›Q ª“8 jÂù–2R$ ÙÌãÜÔ×ÓÏÐÐÙÖÉѨNnâáÏØÙÚÔÍÔäêÏD**¨‘< jÊÿò… <%kËÒÒº„ls²ÑÿÃÉÇÍЀŒÿñæØÒÖããÁ~: `Ƚ'¦„„<R©Úµ…W5”ãÓÚ½nr-5£ÔÉËÆÁÁ¼Â߈/t³Õåêê¾u0  U¯ïýúh¦=(l–|C2>X\b™ÔçÒÍäfY*[ÓÉÅÇÆÆÇ¼¼Í{9+_ÝÇl, FœäøæÝôq§„$KU?Hy­ÐáàßéÜÐÔÖÝh€' „ÚÆËÇÅÅÄÇ¿¼ÈÞ‰ L40ÔñâÝÛûíD¦‰C$Fh¨ÞòìäÝÚÛÒÓ××ÒÜ¿`*% …âÃËÈÉÆÁ¼ÇѾšb?‰àöÙÎÚàâßr ¦S   +x»êðÞÒÒÓ×רÛÛØ××ÕÞ×·±•X‘ÖÉÍÊÁÁÌÓÂŽM &Qw†²äßÖÛéy©$~{EKravjj†µêé×ÏØÞßßÞÞÝÙ*Û×ÒÖßãá×ÏÐÌÅÅÐ×Á‡E!NdYA6oÓàÏï‚ ©#~P'*pŠÌ¨œ¶©ÁÔÚÐÚáßÜÛÜÝÝ€ÜÚÙÚ××ÔÍÊÌÔÐÈÊÕÚ¿? € ^i"hËÖÞל2DÎÝáÇ,§„ØâÈÔÐÐÉçÜBRô’©‚,rcFk¦Š[)^›ÉáÝßàáâááàßÝ€Ü(ÛÕÏÖãÞ³o.2wºÇÌ©1òÐÝØ××ÙÇêÁ=Z5ª !nvK{ÊœrA6{ºÛâßâáâ.àÞàß×ÓÛçà°g'*o³ÏȲÍ~;ÃìÔÜ××ÕÔ×Íê©„A}hÕ‘¥‚VžÎäáâ€ä0ãáãáÚÖàìߪa!!f®Ñ˼¹½ÑTVêàÚÝÚÚØÕÖÑ×Þ_©„G\y†µÎ²Á³: 3tµÚäáåäææâÜÛäïߦZ\§ÒÐÀ¼Ã¼ÄºB|õÛàÝÜÛÚØÕÖÍ籨„-"q„‹·ÑÌÑÉjT–ÉäãæèæÞÝêóÜTSŸÒÔľ€Ã¶ÏŸ8«øØäßÞÜÛÚÖÖÑÕác€¢ƒI5’˜¾ÞÖéáŸ= 5qµÜæâßáïôÙ–LH–ÐÚÈÀÅÆÃ¿ÄµÔ”:ÁúÚçßàÞÜÚØÕ×Íèª ƒŸƒJ\Ž” ÂêíðéÌ{QÇâäïöÕD?ÍÝÍÃÆÉÇÃÃÁöԉBÌöÝéáâàÝÛÚ××ÐÚÙQ€ƒJ?‘Ÿ­Ìí÷ñïä´B 0p©Èëц<3‚ÉàÓÆÇÌÉÆÅÅÃÁÁ¹ÒuQßòàéäâàßÜÚÙÖÕÎë† €€˜‚QXz„¦³ÔêôðóòÚ} T¹7*wÁâØÉÉÎÌÈÇÇÅÄÂÁ¿»ÎcfóîæéæäáàÞÛÚÖØÍç·,x£$+R:›‚("0=z¼Øîõôóùð½h44j³g !kºäÝÍËÏÏ€Ê.ÇÆÆÄÂÁ¾½ËVsþëêéçæãáàÜÚרÐÙÞY‹ÿŸYÀíØo?yn" €’W=ušÈàôôóïöüé‡!*^› 8b±ãâÏËÑÑÌÍËÊÉÈÇÅĽÀÉKwÿêëëèæåãáÝÚÙÖÖÏí~Vìôèÿøÿà^cØÿþ±€‚& Ak©Õã÷òëöúÿõe:uˆ¥p  V¨àåÔÍÒÓЀÍ7ÊÉÈÇÅÅÄÁ»ÂÇF|ÿëîíêçåäáßÜÛÕÙÉðŸIÐÿõùóôôêíüóõý >;#‘dÌÊÊÈÆÆÄÃÁ¿ÁºÃÂ?…ÿîôðìêçåâàÝÛØÖÑÖè]{ÿ÷ùûùùúø÷öõõôñëðç‰X–ǼYŒ)\‰mjlÈ÷âðïðÿÑÜÿü÷…!0KÈàÑÑ××Ô€ÒÐÏ€Í&ËÊÉÈÆÆÃ¿À¹ÂÀ@ŠÿîôðíëèæãàÝÛØÖÓÒêjpÿúøû€ù÷÷ööõôö÷ôïðîù÷ÿ×,€ dxtetÜîèôðõÿàÍ÷üýð•9!5p¡¿Ú×Ô€ÓEÒÐÐÎÍÍËÊÊÈÈÆÆÃÁÁ½À¸ÂÀAÿïôðíëèæãàÞÜØÖÕÐí|kûûøýùúùø÷÷ööôôóòòóóîèêì¤=Œ] iz‚XxëðïóïúþõÇÞÿûýç˜7OެËÖÒÓÑÒÑÐÏÎÎÌÊÊÈÇÅÄÃÂÁÂÀºÁ¾>ˆÿïôðíëèæãàÝÜØÕÕÎîŠeîýöýùúúø÷öõõóñïîñòñéóÖG‹)1x„‡R‰èèðóïþýÿßÙýÿüâÂf)h¯ÔÓÑÑ€Ï0ÍÍËÉÉÈÇÈÇÇÅÃÁ½¹º³¼ÂDÿñóðîìéæâàÝÚÙÕ×Íð’]äÿõýøúúø÷ö€ô€ò ðîïîé÷½UŠa O2G–N“þõòñöÿýþöóûùýøÞ²A Dy¶×ÏÐÎÌÌÍÌËËÌÊÇÄÁ¾½¼¿ÄÈËÇÍÉEÿñóñîìêæâàÝÚØÔ×Íð•Yàÿõþøúùùø÷ööõ€ôòòñððïíìèê`€ WK;u}¡VpÐêý÷øÿþþôòþþüÿèÊ'&^}ÆÓÌÐÐÏÎÉÈÆÂÀÂÇÉËÐÓ˾´žjT†ÿñòòîììçáßÝÛØÔ×Ïï‘Wàÿöýùúùùø÷öö€õó€ò ððïíìïçôçJ ˆ=XJ<€pƒ“‚¤¿¸ÐìüÿþþøèëñùÿÿíÊ`Em|©ÕËÊÆÄÆÈÊÎÓ×ÓÍů•dE3 €yþóññïîëæáßÜÚØÔ×ÏïŽVâÿöýùúùù÷€ö€õóòññðïîíìíæìÔ@‡8~rBRVjx\’îݼÀÕôÿþþÿãÅÄËÓ»Ӥ4&Zn’ÆËÌÕÙØ×ÓÀª™zXD/(YôøîóîíëåàßÛÙ×Ô×ÐðŠTâÿõüùúùø÷ööõõôõóò€ñ ïîîììèòÌ…j+‡3€#;4?DgiO†˜˜µÂÓîÿüÿîÇš‘mPjnˆBCc‡Çá˾­nW>%, =àýíóîîìåÞÝÚÙÕÔÖÑðUèþöüøùùø÷ööõõôóò€ñðïïíìëëéæèõ±%†-€ ;[/JJ[`iy£Î¢²Þ÷ýüÑØÞ}l˜Ù”RB%3a—œkL6"ƒ! 247ÈÿêôïðîæÝÜÛ×ÕÔÖÔïs]øüöüøùù÷÷öö€õóòñðïííëëéìåçòh…(€ `8X^vŒÇÞø ‡Ìàÿöǹ…MV\z¢—aJ74l¥Lƒ%/Hiƒ®¥F¡þêôïðïæÝÛÚ×ÕÕÖ×îfkÿù÷üøùù÷÷öö€õóò€ñðïíììëëêèãèß[„0€ B7{‡œªµãåý½r³ÔôóÆd40LR;A”Ž‚'2Kp¨¾ÃÃÁÄMtÿððñððäÚÚØÕÓ×ÕÚì_wÿøøúøù÷öö€õ ôôóòòðñïîí€ìëééãíÞ?†,"ˆ†«›}Á饻铜Öôãª}0)=-+.#;X3a©P.1Rs’°¿ÈÉÀº´°ªÅgRèúîôñòãÙÚÖÔÓ×ÕßæY‡ÿõúúùø÷ööõõ€ôóññðïðî€ì ëêèçææèž)…)W¡‘¢À±©îâb˜÷º Éú×¶Âl;4&;G0‹€-8Uu›²ÅÎÉļµ²²³´¹°Ìn¿ÿìöñòãÙØÕÔÓÙÒèÍR¦ÿòûøø÷€öõõôóóññððïïîííìêéèèææáó¨‚Y€ Pq‘Ⱥ©¹à³¦áÚ°´éÿïïÂN9E2"";5N—?_y£¬¹Éʶ¶½¾½¼¼»»¼¼»»ºº¹º¹¸¸¶µµ¶¸´­µÊ™,;¦³¤«¨ª¨¨¶{.Ey…€tR?iÛÿòöõôõõôôòòññ€ðïííìì€ëêèèææàØ××ÖÕ×Ñß®$‚!€ 1‚c]aY_fcS‚(!)c¶Ë¹°³¼¿¼¸º»€º9¹º¹¹¸·µµ¶¸¸³­±ÅÀt#P°µ¦®ª¬«­««»¡e<;L[»ÿÿð÷õôõóôóòñòññïððîí€ìëëêèç€æ Þ××ÖÕ×ÐÜË@hf|Ueb`bicghB’ÂǼ³³¹½½»ºº¹¸··¸··¸··¹¹µ°­´ÄÅ–E(u½³ª±®®¯¯®°®ª¼¾µ×íõÿÿóðöõõôóòòññððññðïîííììêêéè€çææáÙÕÖÕ×Ñ×Ô]&~#±ŠMo^aekdb\!YšÀȵ°±µ·¸º»€º¹¸¶µ²­­³½É™X,JžÅ²¯´²‚³±´¶ª°æÿøúñëó÷óóôòò€ñ€ð€ïíì€ëêé€èçææääâÙÕÖÕÔÖÍáÂ0€=~ }•Ud_bgodZƒ<Uˆ±ÆÌǼµ²°¯¯®®¯°±´ºÃÉÆ±…R1DˆÄ°µ¸´ƒ¶ ¸¶±Àæöîîðôøõ€òññòñðñïïð€í ìëëêêééèèç€åããàØÕÖÕÓÖÏØÕH€&€ 4{UU`^h`c‚g7[‚·ÇÉÈÈ€Ç'ÈÇÆÄ¶ƒ\<5O‰¾Ë¸²º¹¸¹¸¸·¸ºº¶µÉêøôöøõóñòòñðñððïïîíìì€ëêêè€çåããÜÕÖÕÕÓÔÐ×ÙX€ P‰IU[[eWZ[-Q]<8GQ]q‰Œ‡qaSH87Os¢ÈÏ¿´º¿¼»¼¼»¼½¼º¸¾Õðø€ñðññòñðïðïï€î ìíëìëëéèèçææ€åãáàÝØÖÖÕÔÓÔÓÒãy€ AyNVY]`[Q‚1 ªÿą̂d\M=98ƒ)`ìåãâßàÞÝßâáÝ×ÔÏÌÎÌÉÇÆÆÇÇÈÉÊÌÒÚâêðóðí†îííìíìëêêëêê€èçææååäåäãâàÜ××ÖÕÕƒÔÕ×Ñð¾% €Ei\€d]3… /±ãÛßàâ俀çèëìëæäáÜÚÙÙØØÚÛàåçëïïîíììíîí„ìí€ì‚ëêêéèçèçæçææåääãàÝÜÙ€×ÕÕ‚Ô"ÕÕÖÖ×»L~uL7„’•j‚šöÛßÞßßààâãääãäåç€éêêëëìíìíîîíêéêëììëë€ì…ëêëëêé€çææ€å ääãàÝÙ××Ö×€Õ„Ô×ÒÙßY‚~`*~©©®Ž3#ÂçÊßÜÞÞààâáãæäã‚åæçèè€éèç€éëììëêëëêƒëê‚éè€ç€æ€å€ä ãâãßÚÙ×Ö××ÖÕÕƒÔ ÖÔØÑáÈ7€ E’¤¢¢v+‚ ùéÞÚ€ÝÞàáàáâããå忿忿忀çèééêêˆéèçƒæ€åä€ãââßÙר€Ö€ÕƒÔ ÕÖÕØÑáÅ4ƒ0\˜§§›q/%ˆ·ÒßÙÜÜÝÞÞßáàááâããä€å„æ‡çèè‚çææççƒæäãäââáßÞÞÝÙ××ÖÖÕÖÕÕƒÔÕÕÖÖרÖåx€‚Y“§§Ÿ}EAÊäÖÜÚÝÝÜÝßßàà€áâ€ã‚ä ååææççææçç‚æççæ åæåääâãäãâ€áÞÙÙØ××€ÖÕÕ…ÔÕÕÖ€×ÚËò›€€I|žª¨šwK. åØÛÚÚÛÛÜÝÜÝ€ßàáàáá€âããä€åä€åæååæ‚åáãå€äãäàÝÜÝßâ€áàÚØØ€×ÖÖ€ÕƒÔÕÖÕÖÖרÚÜòÞO "Q~𩬤ŽnaL*()0GáàÔÝÙÛÚÚÛÛÜ܀݀߀àáââáßáƒãäããäáÞÜßãâ áÝÛÛÚÚÜÞÞÝÚר€×ÕÕÖÕ„ÔÕÕ€Ö ×ØØÚ¿›V‚&Acƒ–¥®¦œš“’¡30ÕäÒÝÙ€ÛÚÚ€Û€ÜÝÝ€ß àßÝÝÞÞÜÛÝàâáßÝÝÞÜßááâáÞÜÛÛ‚ÙØ××ÖÖÕ…Ô€Õ ÖÖרÙÕê• …„€$?N^z‰–ªqyáÚÙÚÙÚÚÙÚÚÙÙÛÚ€ÛÜÜÞÝÜÜÛÜÛÜßÝÛÜÜÛÛÜÜÛÚÜÞÝÜÛÙÙÚÙÚØ××Ö××Ö€Õ…ÔÕÖÕÖ× ÛÖÞâ\ ƒ†!#'GOORN«ØÔרÙÙØÙƒÚÛ ÚÚÛÛÚÚÛÜÛÛÚÛÜÛÚÚÛ€Ú ÙÙÚÙÙØØ×Ö××€ÕÖ†Ô€Õ€Ö ×ØØÚØÙↇ€ pìÔÔÖÕÖ×Ö×׀؀ÙÚÚÛÛ„ÚÛÚÛ‚ÚÙÚ€ÙØ€×ÖÕ†Ô€Õ€ÖØØÙ€ÚÜåo††€€‚ 7¾àÒÙÖÖ×Ö×ÙØØÙ…ÚÙÙ†ÚÙØÙ×Ö×Õ€ÖÕ‡ÔÕÖÕ€Ö××ÚÚÙÚÚÛËò§„‘€;¶ØÍÔÔ€ÖÕÕ×Ö€×ÖÖ×ƒØ„ÙƒØ ×Ö×Ö×Ö×ÖÕÖÖÕÕ‰ÔÕÖÕÖØØÙÚÙÛÜÜáïïj†— ‚ðÒÖÖÔÓÔÕ××…Ö×ֆׅÖ×ÕÕÖÕÔÔÕ†ÔÕÔÕÖÕ€Ö€Ø ÙÚÚÛÜÚÙÚ¯t‡˜ 9¸á×ÓÕ×ÕÔÔ€ÕÖÕÖ×…Ö××ÖÕƒÖÕÕ‹ÔÕÖÕÕÖ×ÖØØÙÚÙÙØÛØÙÒääfˆ˜1W|ÒÓÈÑÒÔÓÔÔÓÓÔÔÕŠÖÕÔ ÕÕÖÖÕÖ×ÖÖ××ØÚ ÝßÙÚééòŸ‰™ ·ñÚæà×€ÔÖÖÕÕÓÓÔÕÔ€Ó€ÕÔÓÔÕ†ÔÕÔ€ÓÔÖÕÖÕÔÕÖ×ÖרØÙÜÛÙØÛÚ×ÕØé·|fŠ›D«Ï—wÂÛÑÖÎÎÑÓÖÖÕÔÓÕÖÕÓ€ÖÕÓÒÓÔÔÓÓÔÔÓÓÔÔרØÖ€ÕÖØÙÙÖØØ×ÚÙÑÖÞßÛÜßçë*€Œœ@¯ìÇÖÞߨÕÎÍÐÖÓÏÍÒ€Ö3ÔÎÏÏÎÔØ××Ö×ÖÕ֨רÖÑÑÐÓØØÙ×ÒÒÔ×ÚÜÞÙÜìâÔÒ×Ý×ÕŠ›IkãéãÃÄÜÞæåÙÏÓáã×ÏÓÏÓáÝÞâÓÏÐÐÒÑÓ×ÒÏÔÑÓÞÞäßÑÕÓ×áâåäÙÕÒÚÖ±Ððä÷©J>ž@ \”x59Rl£«Ïñä·´ÝâÖàÛ·ÌɵßãÝàÙÝÙÑÜâÙÞáÎÕ¶¾êÛáãÍÞªzÓðÚùœM´Ñ©2€‘‚9MŒr+%a¸áÝŠ)A<(ˆÖÍÒÜÔÜìÒÁØå™@H'CÁäÞ>K"mÒÝ­.:  …+\M @?CWF^„O0TT€,\M€7L€•¤€Š€ ’£  €™¥‚€‚ƒ„„†–®‚€ƒ‚Á±÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷‚ ÷ ‚qûq¿‚÷‚¿¿‚«€€ €€€€€»‚¿qûq‚ «  » ‚¤º¥‚»¤ *’¶¦c[•M·¡ $iqo€ÿ óòÿÿêz@zr+¹ €KÅòöøõäáäðóèèùòáÿÿÊ_ ³¢ .ÌûÛààßäèêæåîïêòúôîÿç/€€± #SãÙÖßÝãááâæèçêîëèñîïÿšKN°Ÿ# [ÖߨÜÛÜÝßßáãäææéíìðñóñèë³-±œ'@ž©·ÕÕÔÖ×ÙÚÛÝÞààâäåæèéìîñúõÿ²" °œ*GÐïêäÔÔÕÓÔÔÖØÙÙÛÞÞàâäåçèëêëéðóÀ²§D­›" ¢ùÏÔÕÜÝØÖÖÕÓÓÔÖØÚÛÜÞàãäæçêíñïñ€ÿÜ@­›,±êÙèàÛÕÙÝÛØÙ×ÔÕÔÔ×ÙÛÜÞáâääçèìíêìêÿ©¬˜€*  ¥ÿØÛÛäíáÖØ×ÓÕÙÕÖÕÒÕרÚÜÞàãåçèëíõçþÁ ¬—0@ÐÿùÿëÐìûóöòâ×ÙÔÕÚÕÔÕ×ÙÜÞßáäæççëíøÙp¬˜1)07ˆš‚Y2`“†xŸåôëïÞÏÖÖÔÔÕØÚÜÞàáåééååúÿ®ª“+x‰B>xY57+@Q=62$T}]}âõ€ÙÔÓÔÖØÙÜâáÝàïþå©g ª’7.|Ì®@Z§µžŽœ¬§Ÿ“qA6-Y¼åßØÝØÕÓÕÚÙÕÙêôÜ›Q ª“8 kÂù–1O$ ~ª¡²ª¢¥ œœ¢ž’™x6mßâÐØÙÚÔÍÔäêÏD**¨‘< iÈþò… ?#V£¦¤‘hVY‰ž”’Ž‘’•–Y ŠÿòçØÒÖããÁ~: `Ƚ'¦„„<Q¨Û¸‰Z (v·©¯“_u1*~¡—™”ŽŒ‰Œ¢`)u³Õåêê¾u0  U¯ïýúh¦='k™E/5ILQ~¬º¨£¶O['F¢—•–“‘ˆ†“V& \ÚÇl, FœäøæÝôq§„"NW<:bŽ«¹¸·¿´ª¬¬±R€' f¨–™–’‘Ї[K40ÔñâÝÛûíD¦‰C&AUˆ¸Éľ¶´´¬­²±ª°šM" h®”™–—”މ•ˆmH?‰àöÙÎÚàâßr ¦S   (e™Áȹ¯°±´´³¶µ°°±¬²­“ŒwEq¦š›˜’–›f8 &Qw†²äßÖÛéy©S~{EJtc‚tji‡šÀÁ³­´º»»º¸¸¶µ³´·±©­³µ²©£¡–”œ d3 NeYA6oÓàÏï‚ ©~P'*r‹Ïªž¸«¿¶±®µ¼»€º3»º¹¹¸¶´´²°ª¤¡¢¦£š›£¥a/ AFjÊÖÞל2DÎÝáÇ,§„;#‘d,/?~½ÁãøîñØëÿûš-Fry’¢8>‚¶¾°§ª¬§¤£¢ œ›™—”’Œ‹…‰ˆ-ƒÿìðîìéçäáßÝÛÖ×Ëæ½L±þñþúüùûûòöòó÷Ù×ÂJŽe+0J…›³ôîìúËÒûÿãZ%Z}…§{.|°Â´¨¬­ª§¥£¡ ž›™˜–”’ŒŠ‹ƒ‰‡+‡ÿíñðìéèäâßÝÛ××ÏÜÜUŽÿôúøøùôôù÷÷öòýøÿÅ-€g6cT`f—æñéîóðÏíüÿ¶32wx} Š£Äµ«¬¯­ª¨§£¡¡Ÿœš˜–”’ŒŠ‹ƒ‰†'‡ÿïóðìêçåâàÝÛØÖÑÖè]{ÿ÷ùûùùúø÷öõõôñëðç‰X–ǼYŒXWsimÇ÷âïðîþÓÝÿûø“-BLZ”¼¼ª«¯®«¨©§¥¢  ž›™—–”‘ŒŠŠ‚‰ƒ(ŒÿïôðíëèæãàÝÛØÖÓÒêjpÿúøû€ù÷÷ööõôö÷ôïðîù÷ÿ×,€g dweuÜîéôðôÿàÍøüþîŸP;Nz£­°­«©©¨§¥£¢ žœ›˜—•“‘ŒŠ‡ˆˆƒ)ÿïôðíëèæãàÞÜØÖÕÐí|kûûøýùúùø÷÷ööôôóòòóóîèêì¤=Œ]l€‚YzìñïóïûþöÉßÿüýå›H7`ª­ªª©§§¤£¢ Ÿ›™˜•’Œ‹‰‰‚†‚&‰ÿðóðíëèæãàÝÜØÕÕÎîŠeîýöýùúúø÷öõõóñïîñòñéóÖG‹1,|‹‡RŠéèðóïþýÿâÛýþþá¿t/Bo”£«§§¦¤£¢ žœš™€–(“‘ŽŠ‡ƒƒ}‚†*ƒÿðóðîìéæâàÝÚÙÕ×Íð’]äÿõýøúúø÷ö€ô€ò ðîïîé÷½UŠaXHV…‘˜M”ÿõòñöÿýýöôûùüøÜ²S)W|ž©¢¤¢¡Ÿž››™˜•‘Ž‹Šˆˆ‹‰Š*€ÿñóñîìêæâàÝÚØÔ×Íð•Yàÿõþøúùùø÷ööõ€ôòòñððïíìèê`€ [XWŒ‡Ž£WqÑêý÷øÿþþóòþÿüÿêËŒ>?iŠ££ ¡¡ ž›˜–’‘‘’”——‘‡~nXI:„ÿñòòîììçáßÝÛØÔ×Ïï‘Wàÿöýùúùùø÷öö€õó€ò ððïíìïçôçJ ˆ= J^F‹|ˆ“ƒ¥À¸ÐìûÿþÿøéëðùÿÿëÊn6Ys—§žš–—˜˜›Ÿ ›•l]H1$€wþóññïîëæáßÜÚØÔ×ÏïŽVâÿöýùúùù÷€ö€õóòññðïîíìíæìÔ@‡8bQ:ddu^“ðÞ¼ÀÔôÿþþÿâÅÅÌ×ÒÊѧKAesŒ šž£¤¤¢žqYA2"( TðùïóîíëåàßÛÙ×Ô×ÐðŠTâÿõüùúùø÷ööõõôõóò€ñ ïîîììèòÌ…j+‡3€0QOYQupQˆš™µÂÓïÿüÿïÇÆ£˜oŒŒž[,Si†¦©š‚kTB.,9ÛýìóîîìåÞÝÚÙÕÔÖÑðUèþöüøùùø÷ööõõôóò€ñðïïíìëëéæèõ±%†-€ -WQeWkgj’z¤Ï¤´Þ÷ýüÒØãœ‹£à®t_IJe™ˆN;) ƒ!% /ÉÿêôïðîæÝÜÛ×ÕÔÖÔïs]øüöüøùù÷÷öö€õóòñðïííëëéìåçòh…(€ Ks5Neg{ŽŸÉßø¡ˆÌàÿ÷Ç¿–ajp‹¬¥udbRq¢Fƒ% !1GVtj1£þìôððïæÝÛÚ×ÕÕÖ×îfkÿù÷üøùù÷÷öö€õóò€ñðïíììëëêèãèß[„0€ U0C‰ž¬¶äåý¼r´ÔõôÉv,4K:6;JfgVZ–‡‚'#4Mar‚~‚/tÿñðòððäÚÚØÕÓ×ÕÚì_wÿøøúøù÷öö€õ ôôóòòðñïîí€ìëééãíÞ?†,1™‹€ªœ~Â餻钛Öõã«‹K@RHJLCUiNp£J.$:Qg{ƒˆˆ‚|xto„>OéúîóñòãÙÚÖÔÓ×ÕßæY‡ÿõúúùø÷ööõõ€ôóññðïðî€ì ëêèçææèž)…)V£“¤À±¬ïãd˜÷¹¡Ëú×¶Æ|PL,6G@RZM—€-(>UoŠŒ‡{wxxwzsˆG¼ÿìõñòãÙØÕÔÓÙÒèÍR¦ÿòûøø÷€öõõôóóññððïïîííìêéèèææáó¨‚Y€ Ss‘̾«»à³¨ãÙ°µéÿðïÅ_MYG88?SKh–6+?[r‚’’Œ„€}z||{{yxtxx&ˆûòôóôå×ÖÕÔÓÜÏô®LÇÿòýö÷€öõõôõôò€ñ€ïîìì€ê èçåçããäe:€ |¢” ž™‡†¼Ã›œ«ÍÚåÖ©Œ]X±¥K'HWzx&*G]uˆ‘””‡„€€€}zy€wtƒD Cáüñ÷öåÔÕÔÕÖÛÓõVéþòûö÷ö€õ€ôóòññðïïîìëëêêéçæåâæÕݾ0ƒJ€ =’ŒrŒƒ{‡˜®¥‘ ´œô¿Tw‡F2Og}‚x†“˜”ŽŠ…ƒ„„…„ƒ~||{yxvxs€c œÿòøõãÓ€ÔÙØßèXuÿõ÷€õ€ôóò€ðïïîìì€ë èççåÝØÚÑÜÙMƒX€ !Il®°­‹”¡”k”¦–š¢¦šÆïÈt72\™”‰”‘‰…„……‡ˆ†…€~~||zzxwys~p "=âüõúÝÑÔÕÙâÌóº/´ÿïûõ÷€õ€ôòñòððïî€í€ëéççèâØÕØÐÜÌ9V-jŠÓ¥‰Yiˆ„†¦¯§§ˆaWm•µµŠ‡……‡‡ˆ‡†…‚‚~||{zxwxs|x) uüúãÔÖÙ××ÍåóK_õöõø€õôòòñððïðïííìëëêèççèáØØ×ÖÓÝ€5.Ž…­–š©Ÿ{~~ssˆ‹nWMh“±¼¤†€††‡ˆˆ†…ƒƒ‚‚€~}}zzxr|z1" ’öáÏÍÍÕáñòg<Øüðøõöõ€ôóó€ò€ðïîíëêêëèèæçæÝÖ×ÕØÑÙàV€W€=‚seoiuŠ“˜ulsv}z™›¸¾¡ˆ…ˆ……„ƒ„ƒ„ƒ‚€~~|{{zwwyut€u."vÏåñõðß¶TBÌÿò÷ôõõ€ôóòòñ€ðïïíìëëêêéèèææà×ÖÖÕ×ÒÖäa‚#€ _ZPa_eed\|RFby—ž¬³©–y€…„ƒƒ€‚ƒ€~~€|,zywxywrw‚j# "9}ˆ}tR?iÛÿòöõôõõôôòòññ€ðïííìì€ëêèèææàØ××ÖÕ×Ñß®$‚!€ 2€a]aX\daVxc'O…|sw€…ƒ€€€€~}|zzyxzyvsuT!€ $ L\~»ÿÿð÷õôõóôóòñòññïððîí€ìëëêèç€æ Þ××ÖÕ×ÐÜË@ezTea_bicfi€%+aƒ‡zy}‚€~}||}{{|{zzywusvi6 #!ƒ$ ++®ðóÿÿóðöõõôóòòññððññðïîííììêêéè€çææáÙÕÖÕ×Ñ×Ô]=~#±ˆLp^`ekcc^ ?i‚‡‚zvxz|}~~}}|{yxvssuz€kB%!!  ''¶ÿöùñëó÷óóôòò€ñ€ð€ïíì€ëêé€èçææääâÙÕÖÕÔÖÍáÂ0€<~ ~“Sd_`fodZƒ<;]v‡‹†zvutvuuttuvx}‚€wa= #% !€ ! &!9¼ÿðíðôøõ€òññòñðñïïð€í ìëëêêééèèç€åããàØÕÖÕÓÖÏØÕH€*€ 4ySU`]h`cg (;Tgz„†‡†€~€€€|n]G) !& !! "" $(XÐÿòóøõô€òñðñððïïîíìì€ëêêè€çåããÜÕÖÕÕÓÔÐ×ÙX€ QˆHU[[eWY[5R•_9/028HZhic^UH<3! #'#!#""!!&'*„éÿîñòðñòòñðïðïï€î ìíëìëëéèèçææ€åãáàÝØÖÖÕÔÓÔÓÒãy€ @xMUZ]`[S‚? ©ÿâЫƒi_B  (&"!! !#&)%"a¿þùëòóðññððñððïðïîíí€ìëë€êéè€çæåäåàÚØØ€ÖÕÔÓÒás€$UUW[]dSlF€ƒ ŒôáóùõõïסZ $)--+&! "€#&(('%(]­ðÿðìóðïñðïïðïîîí€ìëëêèçèçææääããÝÖ×ÕÕÖÕÔÓÕÐä¡\jK^\beYW)„,-·æÖÚßåçñûë¼~L) $&&%#!$Dx¹ìÿõéíòïðîï€îíî€ìëììë€êè€çææå€äãáÚרÖÕÕÔÕÓØÏÜÒC€ >bX\[d_e>ƒ-`ìäâãßàÝÝéôíÔ¨]N_y‰–ªqyáÚÙÚÙÚÚÙÚÚÙÙÛÚ€ÛÜÜÞÝÜÜÛÜÛÜßÝÛÜÜÛÛÜÜÛÚÜÞÝÜÛÙÙÚÙÚØ××Ö××Ö€Õ…ÔÕÖÕÖ× ÛÖÞâ\ ƒ†!#'GOORN«×ÔרÙÙØÙƒÚÛ ÚÚÛÛÚÚÛÜÛÛÚÛÜÛÚÚÛ€Ú ÙÙÚÙÙØØ×Ö××€ÕÖ†Ô€Õ€Ö ×ØØÚØÙↇ€ pìÔÔÖÕÖ×Ö×׀؀ÙÚÚÛÛ„ÚÛÚÛ‚ÚÙÚ€ÙØ€×ÖÕ†Ô€Õ€ÖØØÙ€ÚÜåo††€€‚ 7¾àÒÙÖÖ×Ö×ÙØØÙ…ÚÙÙ†ÚÙØÙ×Ö×Õ€ÖÕ‡ÔÕÖÕ€Ö××ÚÚÙÚÚÛËò§„‘€;¶ØÍÔÔ€ÖÕÕ×Ö€×ÖÖ×ƒØ„ÙƒØ ×Ö×Ö×Ö×ÖÕÖÖÕÕ‰ÔÕÖÕÖØØÙÚÙÛÜÜáïïj†— ‚ðÒÖÖÔÓÔÕ××…Ö×ֆׅÖ×ÕÕÖÕÔÔÕ†ÔÕÔÕÖÕ€Ö€Ø ÙÚÚÛÜÚÙÚ¯t‡˜ 9¸á×ÓÕ×ÕÔÔ€ÕÖÕÖ×…Ö××ÖÕƒÖÕÕ‹ÔÕÖÕÕÖ×ÖØØÙÚÙÙØÛØÙÒääfˆ˜1W|ÒÓÈÑÒÔÓÔÔÓÓÔÔÕŠÖÕÔ ÕÕÖÖÕÖ×ÖÖ××ØÚ ÝßÙÚééòŸ‰™ ·ñÚæà×€ÔÖÖÕÕÓÓÔÕÔ€Ó€ÕÔÓÔÕ†ÔÕÔ€ÓÔÖÕÖÕÔÕÖ×ÖרØÙÜÛÙØÛÚ×ÕØé·|fŠ›D«Ï—wÂÛÑÖÎÎÑÓÖÖÕÔÓÕÖÕÓ€ÖÕÓÒÓÔÔÓÓÔÔÓÓÔÔרØÖ€ÕÖØÙÙÖØØ×ÚÙÑÖÞßÛÜßçë*€Œœ@¯ìÇÖÞߨÕÎÍÐÖÓÏÍÒ€Ö3ÔÎÏÏÎÔØ××Ö×ÖÕ֨רÖÑÑÐÓØØÙ×ÒÒÔ×ÚÜÞÙÜìâÔÒ×Ý×ÕŠ›IkãéãÃÄÜÞæåÙÏÓáã×ÏÓÏÓáÝÞâÓÏÐÐÒÑÓ×ÒÏÔÑÓÞÞäßÑÕÓ×áâåäÙÕÒÚÖ±Ððä÷©J>ž@ \”x59Rl£«Ïñä·´ÝâÖàÛ·ÌɵßãÝàÙÝÙÑÜâÙÞáÎÕ¶¾êÛáãÍÞªzÓðÚùœM´Ñ©2€‘‚9MŒr+%a¸áÝŠ)A<(ˆÖÍÒÜÔÜìÒÁØå™@H'CÁäÞ>K"mÒÝ­.:  …+\M @?CWF^„O0TT€,\M€7L€•¤€Š€ ’£  €™¥‚€‚ƒ„„†–®‚€ƒ‚Á±÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷‚ ÷ ‚qûq¿‚÷‚¿¿‚«€€ €€€€€»‚¿qûq‚ «  » ‚¤º¥‚»¤ *’¶¦c[•M·¡ $iqo€ÿ óòÿÿêz@zr+¹ €KÅòöøõäáäðóèèùòáÿÿÊ_ ³¢ .ÌûÛààßäèêæåîïêòúôîÿç/€€± #SãÙÖßÝãááâæèçêîëèñîïÿšKN°Ÿ# [ÖߨÜÛÜÝßßáãäææéíìðñóñèë³-±œ'@ž©·ÕÕÔÖ×ÙÚÛÝÞààâäåæèéìîñúõÿ²" °œ*GÐïêäÓÔÕÓÔÔÖØÙÙÛÞÞàâäåçèëêëéðóÀ²§D­›" ¢ùÏÔÕÜÝØÖÖÕÓÓÔÖØÚÛÜÞàãäæçêíñïñ€ÿÜ@­›,±ëÙèàÛÕÙÝÚØÙ×ÔÕÔÔ×ÙÛÜÞáâääçèìíêìêÿ©¬˜€*  ¤ÿØÜÛäîáØÙØÔÖØÔÕÕÒÔרÚÜÞàãåçèëíõçþÁ ¬—€'AÑÿöþéÍêúòõñãØÚÖÕÙÕÔÕ×ÙÜÞßáäæççëíøÙp¬˜1(05ˆ—ƒX-`“ƒwžåôèíßÐÖÖÔÔÕØÚÜÞàáåééååúÿ®ª“6+wˆD0O2"*R]}àõÛÙØÔÓÔÖØÙÜâáÝàïþå©g ª’7.|Ì®A;ktcUakf^TQP<Z¹áá×ÝØÕÓÕÚÙÕÙêôÜ›Q ª“8lÃù–2N$Smgpf`c`^[X]YNR>lÛäÐØÙÚÔÍÔäêÏD**¨‘< hÇýñ… A 8kliZD86S^VTOPQNNO*‰ÿñæØÒÖããÁ~: `Ƚ'¦„„<N§Û»^N{ot\Jy6L_YWSOMHIV.!w±Óæêê¾u0  U¯ïýúh¦=$kœƒH*(778Xysmz1!\$+bXUURONGDJ%XØÈl, FœäøæÝôq§„!Q[8(Cey„„€†~€vx8&?gYYUQPMMHDHL&H20ÔñâÝÛûíD¦‰C*:<^…“މ‚{|}{vyi4@jZ[WURMIJMD6& ?‰àöÙÎÚàâßr ¦S   #LkŒ“…€ƒ„ƒ„ƒ~~}xzub\M-Gf]\YSPQSJ6&Qw†²äßÖÛéy©S~{EKudunjˆ‡rˆ}…Š‹‹Š‰‰†„€‚‡}uvxwtlfd`ZWY[P7 MeXA6oÓàÏï‚ ©~P'+vŽÏ¬¢º¯¹Œ|…Œ4Œ‹Š‡…ƒ}zvplklha_caT8lÉÖÝל2DÎÝáÇ,§„H=Zv‘EI}x‹‰ŠŠŽ‘ŽŒ‰ˆ„€{xwtohgkiX8/6käãØ×ÜðÔBJÊíÃ1 §*cr_gQJNYf›’‚Ž‘’“•”’‘Œ‰‡ƒ€~{unotq[:€-;H;ÔáÉÔÐÐÉçÜBRô’©‚+,uePv¬aG@w—ŠŒ’’–˜——–”’‹ˆ†ƒ}xy}w^9€,AAD3 ŒîÒÝÙ××ÙÇêÁ=Z5ªS"s|V†Ð yT8XŠ–‹••™š›šš—“‘‹…‚†a8,CIF:G,ÃêÔÝ××ÕÔ×Íê©„$D‚s¤Ø˜©‹1Ap•“š›žŸŸ›™—“Œ‡‹…d7+FQLDA?GVèàÙÝÚÚØÕÖÑ×Þ_©„Gb»Õ¹Ä·J-Tƒ—Ž›œ¡£¢Ÿ›”“—Še6 *GWRIGGBC=zñÝßÝÜÛÚØÕÖÍ籨„F"w”½ÕÑÓÌu0Ak•™˜ž£¨¤œ˜ e4 (H\ZPKKIH>I.®óÚäßÞÜÛÚÖÖÑÕác€¢ƒI6ƒš¡ÂàÙìè¦K,Q}¬¤›Ÿžž¥§’c2 %HabWQPPLHH=K&%ÆøÛçßàÞÜÚØÕ×Íèª ƒŸLX“œ¨ÇëïóìÍ‚,K"-ËöÞçááàÝÛÚ××ÐÚÙQ€L-‡™£³Ðíøôïä¹M'T}¬§žŽ]*Fhpf^\[XSQNLIE?JAÜòàéäãàßÜÚÙÖÕÎë† €€˜‚Q O€‹©¸×íõóõôÛ„+Bm—³k$Bhwndbb]ZVSQMJIE@GañìæéæåáàÞÛÚÖØÍç·,x£$+R:›[!CO}£ÂÜðööóùïÀ{UV€·c>h{ujgfc_\YVSPNJHCBFwþéêéçåãáàÜÚרÐÙÞY‹ÿŸYÀíØo?yn" €’  *H{¡Íä€õJï÷üê¤LNrŸš-:g€|olkjda^\XUSNLJHBCD{ÿêëëèæåãáÝÚÙÖÖÏí~Vìôèÿøÿà^cØÿþ±€‚a $-Iq¯Ûçùóíóøÿø'U{ˆ§d 4c‚‚vpqokgda^ZXSQOKIGBCB ÿìîíêçåäáßÜÛÕÙÉðŸIÐÿõùóôôêíüóõý >;#‘d*/C€¼Æèùîñâñþü›+Bt|—0-^ƒ‡{ttsojhfb_\YVSQNKGE@B@ „ÿíðíëéçäáßÝÛÖ×Ëæ½L±þñþúüùûûòöòó÷Ù×ÂJŽe(2P‡·÷ðíöÙãûÿãY"[€ˆ§t"[~Švwwsomjfc`]ZXURPMJGF@B@ †ÿîòïëéèäâßÝÛ××ÏÜÜUŽÿôúøøùôôù÷÷öòýøÿÅ-f1^Xfj›èõìðïïÜòüÿµ1.w{€¡qqŽ€xxyvspnkieb_]ZWTPNMIFE@A> ˆÿðóðíêçåâàÝÛØÖÑÖè]{ÿ÷ùûùùúø÷öõõôñëðç‰X–ǼYŒXRŒvkqÉúçñðîüÝæüüù”*@Q^™®Šuyyxurqmkifc`_[XVRONLIDC>A< ‹ÿðóðíëèæãàÝÛØÖÓÒêjpÿúøû€ù÷÷ööõôö÷ôïðîù÷ÿ×,€geƒ{hzßïêõðõÿæÙúýþð¡QATz§–xwwssomligda_\YVTQOLJGCB=A< ÿðóñíëèæãàÞÜØÖÕÐí|kûûøýùúùø÷÷ööôôóòòóóîèêì¤=Œ]p‚„^}ïòïôïûÿõØéÿüýæK=c“¦„psqonkjgec`][YURPMJHFCB=?; ‰ÿñóðíëèæãàÝÜØÕÕÎîŠeîýöýùúúø÷öõõóñïîñòñéóÖG‹].ŽŠVŽíêòòïýþÿçàýþýáÃt0Iq˜“umokkjhca`^ZXVTQOLKGC@?:=< „ÿñóðîìéæâàÝÚÙÕ×Íð’]äÿõýøúúø÷ö€ô€ò ðîïîé÷½UŠa[HW‰•œQ˜ÿ÷òðöÿýþôòûùýøßµQ,[}’}lkjgfda`^[YWUQMJHFEDDC@@=€ÿñóñîìêæâàÝÚØÔ×Íð•Yàÿõþøúùùø÷ööõ€ôòòñððïíìèê`€ `[W‰‘§ZtÒìü÷øÿþþóðþÿüÿê΋>Fj…„qgheeca]YWURQPOOMLHB=5)"ƒÿñòòîììçáßÝÛØÔ×Ïï‘Wàÿöýùúùùø÷öö€õó€ò ððïíìïçôçJ ˆ= HZGŽ}Œ—‡©ÃºÑíüÿþþøéìñøÿÿêÊp;]t…~hab^\[ZXZ[YUQMB7/$ €sýóðñïîëæáßÜÚØÔ×ÏïŽVâÿöýùúùù÷€ö€õóòññðïîíìíæìÔ@‡8cP9edv‚b–ñß¾ÂÖõÿþþÿãÈÊÎÙÒÈÑ©NFdz‡m[bbc`^\RG?1$ ƒ&NìùíóîíëåàßÛÙ×Ô×ÐðŠTâÿõüùúùø÷ööõõôõóò€ñ ïîîììèòÌ…j+‡3€,MOWSwsVŠ›¹ÄÖîÿýÿïÈǦoŒŒY0VnŠ~c]VM?1& ‚+4ÔþëôîîìåÞÝÚÙÕÔÖÑðUèþöüøùùø÷ööõõôóò€ñðïïíìëëéæèõ±%†-€ 1\OcYlkp–¨Ð¦·Þ÷ýüÒÙ⎣à­s]KOk›o+#ƒ€" &ÉÿêõïðîæÝÜÛ×ÕÔÖÔïs]øüöüøùù÷÷öö€õóòñðïííëëéìåçòh…(€ X‚2Lgj~“£Ëßø¤ŒÍàÿöÈÁ”blo‹­¤ueaQvŸ=ƒ‚% #4%¤þìóððïæÝÛÚ×ÕÕÖ×îfkÿù÷üøùù÷÷öö€õóò€ñðïíììëëêèãèß[„,€ #V-C…Ž¢¯ºæåý¾v·ÖõôËw*4M:4<741/,8MêúïóñòãÙÚÖÔÓ×ÕßæY‡ÿõúúùø÷ööõõ€ôóññðïðî€ì ëêèçææèž)…)U¥—§Å·°ïæg™÷½¦ÎùغÊ{PL)4B:T`N—u €-  +7>BCA>:523002,:½ÿìõñòãÙØÕÔÓÙÒèÍR¦ÿòûøø÷€öõõôóóññððïïîííìêéèèææáó¨‚Y€ St–ÎÁ°¿â·«âÛ´¸êÿïïÈaMZF76;UMj’, !0;BHGFC>;977533100/4†üñôóôå×ÖÕÔÓÜÏô®LÇÿòýö÷€öõõôõôò€ñ€ïîìì€ê èçåçããäe:€ ¥˜¤¡ž“Š¿Å ¢®ÎÜæØ«[V²¦M%E\v_%1>FJKJFA?=;<;98631€0/7Cáüñ÷öåÔÕÔÕÖÛÓõVéþòûö÷ö€õ€ôóòññðïïîìëëêêéçæåâæÕݾ0ƒ.€ *|™w„‘‡‹±¨•”¥¹•ŸõÀQv‰E/Sk[D?GLOKHEA@€?><;86531001.2,  œÿòøõãÓ€ÔÙØßèXuÿõ÷€õ€ôóò€ðïïîìì€ë èççåÝØÚÑÜÙMƒX€ Eu°´°‚™¦™o˜«™›§«ŸÊðÍu63^ ”[FHLIECBAABA?>;::86542001/20 =âüõúÝÑÔÕÙâÌóº/´ÿïûõ÷€õ€ôòñòððïî€í€ëéççèâØÕØÐÜÌ9V8nØð¢ ¨‹^n‡…¨²ªª‹dZq¹ kICDABABCB@>=<;:986432001/04uûúãÔÖÙ××ÍåóK_õöõø€õôòòñððïðïííìëëêèççèáØØ×ÖÓÝ€#.…Œµ›Ÿ®¤‘€‚€tv‰Œs\Up›³®}B6@€B1AA?>>=<<;9775331011.15 ’öáÏÍÍÕáñòg<Øüðøõöõ€ôóó€ò€ðïîíëêêëèèæçæÝÖ×ÕØÑÙàV€W€>pdnhwŒ—œtpxx‡ˆˆ›¡¡µ§vK6=DA@@>>?=<;<::8654411010.23 xÏåñõðß¶TBÌÿò÷ôõõ€ôóòòñ€ðïïíìëëêêéèèææà×ÖÖÕ×ÒÖäa‚$€ ]SJYT]^`S§XFeu“œ–_;/6@@<==<4::988654421010.05.  :}‰}tR?iÛÿòöõôõõôôòòññ€ðïííìì€ëêèèææàØ××ÖÕ×Ñß®$‚"€ 0|[WYPV\[Jxv #5HD6+-8@>::;:9:988644321210/.25' ‚ L\~»ÿÿð÷õôõóôóòñòññïððîí€ìëëêèç€æ Þ××ÖÕ×ÐÜË@hyK^ZW\c[`e€ '7<=847;;99876€4;32211/..25/ &&®ðóÿÿóðöõõôóòòññððññðïîííììêêéè€çææáÙÕÖÕ×Ñ×Ô]<~$¬FhWY^d][Z!/69:413456776544332//./034/  ‚! #µÿöùñëó÷óóôòò€ñ€ð€ïíì€ëêé€èçææääâÙÕÖÕÔÖÍáÂ0€(~‚–K]YZ_h]S< '0:=:6310.01‚/!01451*  4¼ÿðíðôøõ€òññòñðñïïð€í ìëëêêééèèç€åããàØÕÖÕÓÖÏØÕH€9€ [ŸDOYUaZ]|f )18;;832455435/'" € ! UÏÿñóøõô€òñðñððïïîíìì€ëêêè€çåããÜÕÖÕÕÓÔÐ×ÙX€ [Ž>PUT^QSYS›c7$&//+)(#  ! &ƒêÿîñòðñòòñðïðïï€î ìíëìëëéèèçææ€åãáàÝØÖÖÕÔÓÔÓÒãy€ ;mFOTWYUO‚? ¨ÿáÓ°‰odA  #  ^¾þùëòóðññððñððïðïîíí€ìëë€êéè€çæåäåàÚØØ€ÖÕÔÓÒás€ SPPVV]KlIƒ Œôáð÷õóïØ£Y#&%#€##! #[¬ðÿïìóðïñðïïðïîîí€ìëëêèçèçææääããÝÖ×ÕÕÖÕÔÓÕÐä¡~vg@[TZ^RU,„,-·æ×Ûßäçñúé¹zE#!  @u¸íÿõéíòïðîï€îíî€ìëììë€êè€çææå€äãáÚרÖÕÕÔÕÓØÏÜÒCbaKZR]X]9ƒ-`ëäââàáßÝéõïÕ¨€Y8)(9\€¬Û÷ÿöéêðîí‚îííìíìëêêëêê€èçææååäåäãâàÜ××ÖÕÕƒÔÕ×Ñð¾%€AdYaa`X0…)/±ãÛßàáãææáßçñ÷öáϽ£Ž{y}‚ަÁÑæúýøïæéïðí„ìí€ì‚ëêêéèçèçæçææåääãàÝÜÙ€×ÕÕ‚Ô"ÕÕÖÖ×»L~uL7…’•j‚,šöÛßÞßßààâåæãßàäíõøöõõöõõö÷úüùòéæåéíîìëìíì…ëêëëêé€çææ€å ääãàÝÙ××Ö×€Õ„Ô×ÒÙßY‚~_)©©®Ž3#ÂçÊßÜÞÞààâááæçæãáßàâäæè çäáâæéíîìêéêëêƒëê‚éè€ç€æ€å€ä ãâãßÚÙ×Ö××ÖÕÕƒÔ ÖÔØÑáÈ7€ D’¤££v+‚ ùéÞÚ€ÝÞàááàáããå€çæ€ä ååæèëëêééèéëˆéèçƒæ€åä€ãââßÙר€Ö€ÕƒÔ ÕÖÕØÑáÅ4ƒ)\˜§§›q/%ˆ·ÒßÙÜÜÝÞÞßàáââã倿çç€æå€çèƒçèè‚çææççƒæäãäââáßÞÞÝÙ××ÖÖÕÖÕÕƒÔÕÕÖÖרÖåx€‚Y“§§Ÿ}EAÊäÖÜÚÝÝÜÝßßààáââáââããä倿ççææçç‚æççæ åæåääâãäãâ€áÞÙÙØ××€ÖÕÕ…ÔÕÕÖ€×ÚËò›€€I|žª¨šwK. åØÛÚÚÛÛÜÝÜÝ€ßàáá‚âããä€åä€åæååæ‚åáãå€äãäàÝÜÝßâ€áàÚØØ€×ÖÖ€ÕƒÔÕÖÕÖÖרÚÜòÞO "Q~𩬤ŽnaL*()0GáàÔÝÙÛÚÚÛÛÜ܀݀߀àáââáßáƒãäããäáÞÜßãâ áÝÛÛÚÚÜÞÞÝÚר€×ÕÕÖÕ„ÔÕÕ€Ö ×ØØÚ¿›V‚&Acƒ–¥®¦œš“’¡30ÕäÒÝÙ€ÛÚÚ€Û€ÜÝÝ€ß àßÝÝÞÞÜÛÝàâáßÝÝÞÜßááâáÞÜÛÛ‚ÙØ××ÖÖÕ…Ô€Õ ÖÖרÙÕê• …„€$?N^z‰–ªqyáÚÙÚÙÚÚÙÚÚÙÙÛÚ€ÛÜÜÞÝÜÜÛÜÛÜßÝÛÜÜÛÛÜÜÛÚÜÞÝÜÛÙÙÚÙÚØ××Ö××Ö€Õ…ÔÕÖÕÖ× ÛÖÞâ\ ƒ†!#'GOORN«ØÔרÙÙØÙƒÚÛ ÚÚÛÛÚÚÛÜÛÛÚÛÜÛÚÚÛ€Ú ÙÙÚÙÙØØ×Ö××€ÕÖ†Ô€Õ€Ö ×ØØÚØÙↇ€ pìÔÔÖÕÖ×Ö×׀؀ÙÚÚÛÛ„ÚÛÚÛ‚ÚÙÚ€ÙØ€×ÖÕ†Ô€Õ€ÖØØÙ€ÚÜåo††€€‚ 7¾àÒÙÖÖ×Ö×ÙØØÙ…ÚÙÙ†ÚÙØÙ×Ö×Õ€ÖÕ‡ÔÕÖÕ€Ö××ÚÚÙÚÚÛËò§„‘€;¶ØÍÔÔ€ÖÕÕ×Ö€×ÖÖ×ƒØ„ÙƒØ ×Ö×Ö×Ö×ÖÕÖÖÕÕ‰ÔÕÖÕÖØØÙÚÙÛÜÜáïïj†— ‚ðÒÖÖÔÓÔÕ××…Ö×ֆׅÖ×ÕÕÖÕÔÔÕ†ÔÕÔÕÖÕ€Ö€Ø ÙÚÚÛÜÚÙÚ¯t‡˜ 9¸á×ÓÕ×ÕÔÔ€ÕÖÕÖ×…Ö××ÖÕƒÖÕÕ‹ÔÕÖÕÕÖ×ÖØØÙÚÙÙØÛØÙÒääfˆ˜1W|ÒÓÈÑÒÔÓÔÔÓÓÔÔÕŠÖÕÔ ÕÕÖÖÕÖ×ÖÖ××ØÚ ÝßÙÚééòŸ‰™ ·ñÚæà×€ÔÖÖÕÕÓÓÔÕÔ€Ó€ÕÔÓÔÕ†ÔÕÔ€ÓÔÖÕÖÕÔÕÖ×ÖרØÙÜÛÙØÛÚ×ÕØé·|fŠ›D«Ï—wÂÛÑÖÎÎÑÓÖÖÕÔÓÕÖÕÓ€ÖÕÓÒÓÔÔÓÓÔÔÓÓÔÔרØÖ€ÕÖØÙÙÖØØ×ÚÙÑÖÞßÛÜßçë*€Œœ@¯ìÇÖÞߨÕÎÍÐÖÓÏÍÒ€Ö3ÔÎÏÏÎÔØ××Ö×ÖÕ֨רÖÑÑÐÓØØÙ×ÒÒÔ×ÚÜÞÙÜìâÔÒ×Ý×ÕŠ›IkãéãÃÄÜÞæåÙÏÓáã×ÏÓÏÓáÝÞâÓÏÐÐÒÑÓ×ÒÏÔÑÓÞÞäßÑÕÓØáâåäÙÕÒÚÖ±Ððä÷©J>ž@ \”x59Rl£«Ïñä·´ÝâÖàÛ·ÌɵßãÝàÙÝÙÑÜâÙÞáÎÕ¶¾êÛàãÍÞªzÓðÚùœM´Ñ©2€‘‚9MŒr+%a¸áÝŠ)A<(ˆÖÍÒÜÔÜìÒÁØå™@H'CÁäÞŽ>K"mÒÝ­.:  …+\M @?CWF^„O0TT€,\M€7L€•¤€Š€ ’£  €™¥‚€‚ƒ„„†–®‚€ƒ‚Á±÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷‚ ÷ ‚qûq¿‚÷‚¿t8mk@   [¥¶ªj„€\C[w±ñÿÿÿÿÿÿÿù³e]cD3£áøÿÿþøøùûûûúýÿýúýâ¥74Ðÿÿýú÷ûÿÿÿýüýþúøüýûÿÿÔ6 ªÿò÷ùüÿÿÿÿÿÿÿÿþÿÿüúû÷ôÿÂO# Gêûøÿþÿþþÿÿÿþþÿþþþÿÿþÿýüÿé¿yoÀþþþÿþþÿÿÿÿÿÿÿÿÿÿþþþþþÿþüÿÿÿž43»ÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþûöüÿÒžs¾ÿõúþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüúÿÿÿº5pü÷ùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýøøõÿ¸­ÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿøù÷c  ·þøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúÿ³ »ÿùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýûõšAu¬ëþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüüÿŸWŸßÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùøùpY®ôÿÿúøüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿám@¡óÿþùøýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿ¡xÝÿÿ÷úÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùøÿ‹ 9°ÿÿöúÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõýÜ6^Øÿúùÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûýø` ôÿ÷ýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿl›ÿý÷ÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúýñX#²ÿúùÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿÈ/ºÿ÷ûÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûýä^ q¥¢Ìÿùûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿõÿ® ¦ÿÿÿÿùþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ»¡úñõøýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöþÈ,3Õÿøÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿ²cöýûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûýðe²ÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþùÿ¡sôûüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿ‹<ãÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿÜ6 ¨ÿ÷þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýùÿ„ _ñüúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøþÎ6³ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþúÊ”U2P> Wîýùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿí¸ÏíÛªFNvpC ™ÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùøÿÿÿÿÿÿà´èÿÿá/Òþøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþúöøúø÷ÿÿÿûúÿÿ—?#cøþûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿú÷ùüý÷ýÿܾ‹!’ÿùþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿüûÿÿÿµ%²þöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿýùôøÿº˜Áµ/0ÍÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿýùÿÿÿÿÿÌ0Eãÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþúøù÷õÿÄ% QïÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿüøÿÀ*^ûýûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþÿýùÿÈ=cþüûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýùÿÚ^ Nõþúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ÷ÿñYƒ÷ÿüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿóÿ¾ @¯ìÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûüñv¯ÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿ醫úöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûþÿ„ ‡ÿýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿóþÝ6kûýûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûýõ_Wôÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûýý`;Ýÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþúÿ¡ –ÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿüúøx’ÿûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿæ;8Ýÿùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþøÿ’sÿýüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿöýÈ'i÷þûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿêG+Íÿøÿþÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýüÿƒ°ÿøÿÿÿÿÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿÏ+#ÁÿøÿþÿÿÿýúúþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿïT>ÜÿøÿþÿÿÿÿÿÿùüÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿòV]öþúÿþÿüÿÔÂÿúúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿØ6‚ÿüþþþþúÿ&®ÿþ÷þÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿ´þúÿþÿüýûk‰õÿøùþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿ“ >Ýÿúÿþÿûýúd ^Ëÿÿöúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿÕ2 ”üýýþÿùÿöT-ŽäÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿëMLóþùÿýüø“E–Üþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûþûd]öýúÿøÿÓ+ÿýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþûÿ}tÿüüÿ÷ÿµ ~þûþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿ”Œÿüþÿùÿ© Žÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿ»©üøÿÿûÿ“RêþúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøÿßC³ÿøÿýüÿu&Ëÿ÷ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ÷ÿÎ)EÕÿûúþèKcìýüÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüúþköûøÿÑ/¨ÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúÿÄ#Ïÿôþîc ¯ýøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿúþéWxþùöÿÙ8œÿøÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿêJ¡ÿø÷ÿÑMUòÿûÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýûÿ~ŸÿÿöÿêŠ< ‚ðûüþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþúÿ…€àÿÿþÿØ™]3Íÿöÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿøú÷cBšÜÿÿÿÿ÷Ì­jkgæÿúÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýôÿÀ@µâ÷ÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýüÿÁ;LjŒ³ÆÙ÷ÿÿûÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüÿ¬% -A_t|z™òÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿùÿÓ(  [×ÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþùÿš[ïûùÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþûþ ˜ÿùýýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿûùÿv$ÎÿùÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿûñÿÞ/^ôúõþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿüÿÿÙX”ÿÿûþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿüöþñ–;ˆØþýûÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüùùÿü{9¡ÿúõöøþÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿûüÿýÎu  «ÿÿÿÿþÿÿÿÿþÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿýúöþúªd0|·ºÓýÿþÿÿþøøþÿÿÿÿÿÿÿÿþþþþÿÿÿÿþþþþþþþþþþþþþþÿÿþþþÿÿÿÿÿÿþþþþÿÿÿÿÿÿýúþÿôSßÿøÿþÿÿþú÷÷ýÿÿÿÿÿÿÿÿÿýùøüÿÿÿÿÿÿÿÿÿÿÿÿÿýùúýÿÿÿÿÿÿÿýþÿÿÿýþÿÿÿþþÿê®^!ÅÿöþþóÜíÿÿÿÿÿÿÿÿþúúú÷ûÿÿüøöøùûûûûûùúù÷ûÿÿø÷üÿÿÿÿÿÿø÷÷÷ûÿÿÿýþÿ°N(Æÿ÷ùÿÊQP…ª×ûÿþÿÿÿÿÿüÿÿÕÚÿÿÿÿÿÿþýþÿÿÿþÿÿßéÿÿþÿÿþÿûüÿÿÿÿÿûÿÿùÿÉ#&Åÿ÷÷ÿ½ :»ÿüþÿùçïòÈ}8Þÿøøÿª n²ñÿýüþäjÿûùÿëN8Òÿþþýÿ¶- ?Þÿøøÿª ”ÿÿÿÿÿÿþÿív šÿúùÿìN=ÕÿÿþþÿþþÿÉ=?Ýÿøøÿª gúúõÿÿÿþÿùÿóVžÿúùÿìN³ÿñúÿÿÿÿþõÿµDÝÿùøÿª ±ÿõÿþÿÿþþÿ÷ÿ  ™ÿüùÿíQNîû÷ÿþÿÿþÿ÷üìX@Ûÿùùÿ® 8Öþöÿþÿÿÿþÿ÷þ¸ «ÿüøÿêF {ÿüýÿþÿÿþÿýûþmRäÿúøÿ¤RïþøÿþÿÿÿÿÿûÿÚ‹£êþþûýöp þ÷þþÿÿÿÿÿýûÿ¶{ÆùþþùÿÈ%jþÿýþÿÿÿþþþÿþûÿÿÿþÿÿýþÞe³ÿøÿþÿÿÿþþþÿÿÿÿÿÿþÿþýÿ¹/pýäÔùÿüÿþÿÿÿþþûùýÿÿþÿøÿîG·ÿÐâÿûÿþþÿÿÿÿýùúþÿþÿýøÿ¨Zÿ­Žüþüÿþüùýÿþýÿÿÿÿþþýöÿ–¬ù‚ºÿ÷ÿþþûúÿþýþÿÿÿÿþÿõûîK,æ‘xüóõ÷úûÿÿÿÿÿþþÿÿÿþÿ÷ýº ‰ã`´üíø÷ûþÿÿþþÿÿÿÿÿþÿýûÿp WH¡ÿþÿÿÿÿéðÿýþÿÿÿÿÿþÿøÿÍ05\XÙÿüÿÿÿ÷çöÿûþÿÿÿÿÿÿýùþ…oÅÍ˶šoS¾ÿüÿþÿÿÿÿþÿ÷ÿÒ3( ÏËÄ©‹[ïÿþÿÿÿÿÿÿÿþúÿ'3-±þäíþþÿþþþÿøÿË/12&Qú÷æ÷ÿþÿþþÿÿúþ…±þŸ»ÿúÿÿÿÿÿôü¹ SøÏ›åÿùÿÿÿÿûùþo“ÿc¢ÿôþù÷ùø÷ÿ‹ %å¶cêÿøý÷öùóÿé= P©X²ûñýýÿÿÿÿ´)zpûøùýþÿÿÿço 8ÄÿÿÿõݽškoÿÿÿÿìЮŠJN‚†zZ> !n†ƒnN2  ic08’Ú‰PNG  IHDR\r¨fiCCPICC Profilex…TßkÓPþÚe°á‹:g >h‘ndStCœ¶kWºÍZê6·!H›¦m\šÆ$í~°Ù‹o:Åwñ>ù Ùƒo{’ Æaø¬ˆ"Lö"³ž›4M'S¹÷»ßùî9'çä^ ùqZÓ/USOÅÂüÄäßò^C+ühM‹†J&G@Ó²yï³óÆltîoß«þcÕš• ð ¾”5Ä"áY i\ÔtàÖ‰ï15ÂÍLsX§ g8ocáŒ#–f45@š ÂÅB:K¸@8˜iàó ØÎä'&©’.‹<«ER/ådE² öðsƒò_°¨”é›­çmšNÑ|ŠÞ9}pŒæÕÁ?_½A¸pX6ã£5~BÍ$®&½çîti˜íeš—Y)%$¼bT®3liæ ‰šæÓíôP’°Ÿ4¿43YóãíP•ë1ÅõöKFôº½×Û‘“ã5>§)Ö@þ½÷õrŠåy’ðë´Õô[’:VÛÛäͦ#ÃÄwQ?HB‚Žd(à‘B ašcĪøL"J¤ÒitTy²8Ö;(“–íGxÉ_¸^õ[²¸öàûžÝ%׎¼…Å·£ØQíµéº²šua¥£ná7¹å›m« QþŠå±H^eÊO‚Q×u6æS—üu Ï2”î%vX º¬ð^ø*l O…—¿ÔÈÎÞ­Ë€q,>«žSÍÆì%ÒLÒëd¸¿ŠõBÆù1CZ¾$MœŠ9òÚP 'w‚ëæâ\/מ»Ì]áú¹­.r#ŽÂõE|!ð¾3¾>_·oˆa§Û¾Ódë£1Zë»Ó‘º¢±z”Û'ö=Žª²±¾±~V+´¢cjJ³tO%mN—ó“ï„ |ˆ®-‰«bWO+ o™ ^— I¯HÙ.°;í¶SÖ]æi_s9ó*péýÃë.7U^ÀÑs. 3uä °|^,ëÛ<ž·€‘;Ûc­=maº‹>V«Ût.[»«ÕŸÏªÕÝçä x£ü©# Ö¡_2 IDATxì}€^EµÿÙÞ[¶$›²ÙÝôBi@€$´ 5 M°‚å}úžÊó©( à¤ø‘^„P¤„Þ˦lÊöÞëÿ÷;÷;_f/ߦ“,É7ÉìÌvï7÷þΜ9sæLDww·„]¸Â=pdö@ä‘ù³Ã¿:Üá`„ @ø;÷ÀÜap¿üðO÷@˜„¿pÁ=&GðËÿôp„ @ø÷ÀÜap¿üðO÷@˜„¿pÁ=&GðËÿôp„ @ø÷ÀÜap¿üðO÷@˜„¿pÁ=&GðËÿôp„ @ø÷ÀÜap¿üðO÷@˜„¿pÁ=&GðËÿôpD¨.ˆˆˆ8PM…Û ÷@¸vÓÊ’W˜ØMG‡³Ã=p8÷@˜Îo7üÛÂ=°›€ÝtP8;܇s0ÀáÜI‡à·Å=¿ ß/pï„kà?€>~8üø&øµððaî½ë „ß»»†K÷Ò£‘þ|;<íµ‡òåHo ‘· i·ÁgÁ‡ÝaÞ³l#‚„ ¯ìS/&£V!ü)ðsàgÁﯫAäƒ'—O.a=||Ø=pÀp{À /îég5¯? >½·J))É2qâÑ#UUU²yóf©©!¶wºØØXéêê’ŽŽ¸fbôÎÒÂiÄÛðÁÿ¾ >ì>£=p p{@Øÿö0ŸÑ—±‡=å^ÅÖ÷H;ûì³»võµµµÝuuuêxàîüüüîë®»®{Û¶mÝÍÍÍêßxãîO<±;::ºG;»¸× äM»Ïhs‡§çÛ¼O¡]%š–””$¿øÅ/äK_ú’^GFFjhÓ+†gžÅ-}É’%rÚi§ICCC{ôrAŽà2ø¿õ’NîÃ=p ]ï ëÃ?ô0x4‚þ%ø øå /ŒÜ²uëVõo½õ–lܸQ.¾øbeëÉÚ“0XÈÎ8=ãÌ£wÓ'L˜ |ð€K[o½UÛmoo—uëÖɵ×^+™™™nwÆãâqønb8~dõ@˜øôß÷S¸Å…v›±cÇÊK/½$`×-é#93övô·:Æ w`œ‚¥ó›ß”ûî»/Èu Þjø£àC ØnØõ½8P@˜|ºï–¬ÿ2»Å¨Q£äÕW_ÕK L°k7´¸K ,¡?Ýò\Ð[ÛnÚOúSùÉO~¢Ïø³áRøwàÿ_v}¸Â ¿çÑþñð:..N/^,ñññA°3Ý@ë´?ÏÊ-ߟn×Öž{í¦ 6LŠ‹‹ÙŒßµ á~øÃ×ù3Ã×}£Ë>½÷™Š¦ƒóëñãÇë’žÍÝÝù»ÍãÝ<Æm¾os†nKg}KwëXóý÷¸æ®D†t” ÜÏ•‚ !K„›Ø9=l~Ò!ý!$¨—žìÀŽ=ZÍQ˜`¤³ÐFiÝ™Î4¸·<¦ìtn=«Ë4:^‡J»ì²Ëä™gžÊ$ÚÚÚ„+BRhp\¶|þ"ø´pp˜õ@˜¸:M=?-T“X³W@0 `¦…»¼å±¾•7â`×nÞîÒrrräßÿþwÃgœ={¶ÌŸ?ß~B>"Á¿ Ï•Œwá™Ùv‡AG¨Ãà·ÊŸÀÑòCøO€ŸëüÔæ«¬¬TàÈ.+ol¼¼,gžyL³znhé{›fÏá¶ ï¾û®\yå•þ¾äT†ò wÀß Ï©BØ}Æ{ ¼ °ÿ/;óŒ ø³³³åÎ;ï”3‚"€w±‘ÛºÜ+0ß-ãæûÓÝk·ëØ5C»vÛ·4+ÇkNY8%Ø…+BÞçṂv¹Hø„ €ýïÅÐÄÝÖÌÌ™3uÝÿ‚ìÚB+ÏÀ³Ðâ¡?ÍòhÝ2þ:,gu¬¼¥…ºvÛzóÍ7…‚Â|(555銹Ÿãæ„Éð$aw{ Ôw´/·€}éµu8úo†W-¿£Ž:Jž~úiÍu_Ùl:7Íâjü1ÀP™î6Ó,ߟÇôPi½¥‡"Ö¶Õ±ë?þXæÌ™#¥¥¥|só9Ù.ÂáÁéÿw³¯w €}í9¯Þ,o2ʹþ{ï½'ýú™ ¦†½7ß^¨…Ì#ð,´¸ÖM÷ç`YÆÊ[CKsÛ°4+·«ë)S¦èªë À<»‡Ÿ~¸ßÉþÜ-,ÜŸÞsÖù9ï§dÀ1o`30Y:‰=¯Z97dœ/™žÄu&tÓýyny˳4†nî=,nm÷v½`ÁÉÈÈp{ŽöÂî3Øa°/-ת÷ïß_ì·{í»+génÈ{¸ 4»!ãX8ÓÜ2Ö†›î®„ª×[¾O•øCK³|^È Äj¨V& YÏò­®K$,î¶ç¶cu®ºê*å^ÝÇïèÆýëÊpíCÑaE ýëõeV}ÇŽ ÄuKÇ<1ni ˜–ÏЭÇ|+Ïv\oe TÆ]‚Á:þt{+gÏÈiæB]3ÏîDzl;à¨>LaèÍð%´pÐÇ{`çÛîãÚï8<Ó±ö\õõõªZKP˜'PlDgšçµ VËcèϳºnheØM°QpGl7Ý÷—c¾?ÍmmP}˜÷sWD¨Mˆ°aR§cúr4¼ °ço‡Är:<•_¸¿ŸÚ=-úüë_ÿ’üüüàp*n bc–o¡?ÏÒö–g#4Ûs‰Œ¥‡Js Š•ó§ù¯‹ŠŠÔzÑÚµk]N€·ýþ$ø^„Ýïûö·å0Ø}¦£È×à¿¿[A·ûþö·¿•¹sç[&PÍ­^6_þïÏJG{‡ÜþËû$2ÄT€eù‚í%ØC¥[ž[Öâd†t~ï+! —bm³Í… ª~@uuµÞ'ð‡S»Ü„püÀõ€½ãým1LzïÁBdqyë+ðÉð=Ašš*yyyºÇùòå񯯬l~LL”œ8yŒL?þX,—õ“²ÒY¸x‰,YµQJÊ©<ç¹üAYrÚŒi2`ÀhÛ5JyY™TTÕHjJêž(s/»¾°—n#¿]3¤·t¶niŒXCžù. ý×V×O<ü׬7räH)) NÿiW€–†Ö3/ìlØ»ßßVÃà“=8IÜørü'd$\îƒÕ^ùÆ7¾!œ÷ÿð‡?”÷ß_Ì•[®8IÒcZäþ.‘…kJ¤©™çwìté)‰r„Arô°LyoùYZT!5õM`Ÿ{Ì¥ƒ¦Ž/oç[rìŒ3¥®º\Š7®“–æF7ùILJ x—ØGb¡9!•湕±t†tùË_ä7¿ùp*àsïáú ø=²R꫾ÜEØ;ÝE‘=Ê €ÝDÁ­à\ OVÐq„1b„Ü~ûí°Õ?QÓŸ}öYµàK ¼çžv¼Ürá(‰‹ º=a\GG§,/*—ʺ‰ŽŠÜ~‰2lPOb ŒÎ˜ ÞÜÖ!;*¤¾©]: Qïîê–m•òü›eÅÆŠÄ!#5Q¼ç72ùÄÙ½Žü~B` ALÇÐmq lä–n!óh7àá‡Ö}½XÒûà9á&è„áì}îo[aàz~Î÷ƒŽÛxao_þã?þ#¨ùF6ûg?û™üõ¯•L¨ý~áô£ä˜airôp(ÁäwFóÈõšñ€ €!Çúˆ‘èF¨eYÏâ(¯i(»„àÍÅ;dsY½4·vJZbŒ¬,®•5[ªdPNšüñžßÉQSg¡¸GTBMvE\@[ÜB#þkn ºÿþûüåå<¥lÝr”<~Ë×ìµÂ ×®Ù« ná}~´[‹#þÑG-øÃtžoy8¤CY ½&N8J6nÚ,8´C³O˜˜/¿ÿÞ™ð„~ #1î•/ÏOºPV¹ØC.€u4d¸Æ ?ôwV”ʯŸ^-uM­2aÄ@™{ÞYò…«¾-±±ñZÆ}$ éÝtË3€3ôƒÞ• PÀÇþxê©§>qB‘õÏ„«Qæxra·=`ïo?šÐªG*_'ü÷à{Ìó ä׿þµÐ‚¯ëh[ÿë_ÿº ¹¾ûÝï 7Ä<÷ÜsòÄOh±Ä„8yÿ«4o”j aø̓Ü@Œ|»$,GÎàgœ'yê2­º¡EîøpM™´µwÊ€Ìyä¡dôÄã½ò(ë<Ûñ§ñáwE(ÔûÝï~'/¼ð‚ 9Ý>Ù]<==]è7mÚäý5.¾ë&„ã{ßa°÷}f5BŽúiiiÊêŸzê©V.®ZµJ¨úJ¡c¾õ­oÉ–-[ä£>Ò}òI‰ñrû5'ËÓ†)ø¨ ~oÔÖÑà3À³a¢¥Ù€œË£€d\¹^£-д²Úù%ÁG«ËdòØðZ›’Ðr¸‰@ÂήNùæý‹dýö:yö©?˸I3‚†eéàØ5]3¤[ºt©ÜsÏ=òᇺB5ow¨qÎ9çÈwÜ!¹¹¹:¥à´‚Ó.R{0à®Bø¿v÷¾ì}í}Íž5Ž”)7é? –ûó $8pSòóóÝd³ƒiïæ›oÖÐùx5Ÿ£þ…§No\|œ$ÄFy€åÈMÀ)8 Ì.ùéÿ¾%[êâ•kà¨zï½÷×Ê“ÑÆO®>ANߪp¤â¨NoŽŸ7ožž­·råJ!X¹ÄGv¶µµGp{£Fï3O-לžÌd€#'€‹*Ä#0™áþgÈŸþ¹Hå6l+VÈÛo¿­mk!ü¡ìàÁ[fËp,*ñ`}‚RÛ!A0ð34ã“\¹ ®Üò¿K¤±¹M†æfÈŒã&ÊôN’é§œ#Y¹Jøáè>ÿüóòÇ?þQ8ÍÙGaém·Ý&Ç{là»Dr·Ür‹ÛÀ=^Gxú¾Ü/\ÇëE÷Ý€_EwÝ \×:t¨<öØczP&¥ú\Ï'ðÉúr‰‹.==MF*c† ’qCÓäÉ—>”aƒ3eæäað…‹QxWÐÃH7j° ¹óyÝÒÐÖ)~a±²Ù/¾ø¢ÔÉyðæÍ›y‹ £²Ð« ¶ÈðÁ!($ñ ¸¢çÙÁ†ü£iüƒ«Àå˜!©r÷ב‡ÿµºÍò÷—ß“GŸ™M¿ÿgþò }œ‡¹ŽŽyòÉ'>¶·' •;âô‰#>§½9^øôä0lúdùá°oôÀáL8×ÿ‘u3çúW\q…|ç;ßÑQ˜ËY! "ªU¦ee$Ë+ÿ}À‚Æ´-¯>Yz¶ë ¬¿Ý eõ>éOù§ ¼·MEHŒÊj[åªß/’Ô¤xiïöÎ'èíYv•Îå¼K/½T-Ûù†î\ßÏò“8X>¨cÆŒq…€\är`Øíc¸„w›Ðj‡@aß³ð'Z§ EìÌã´ ›mÒ°çÒÏÏ–¯ž=Qe%¢Xô¥z‡¿Ž¿^“…»0:ëHIࣖ]S§ŸôbÈ€tùåMgÊ÷÷R°grÃØ¼ÜxðF}˜Ã@#.³}Q.@Ÿ"'¿`•ÿÕòïnÓ‘¸¤bßVÝȱÿn¸á¬~¤(¨9ÒÜ~–߮ݑŸ„àÜsÏuÁÏõ<ÿ„Ý¡ïÉ€îüüXëÖüü|ï:tþÝ;¿xî‰rÅìÑícP`ÁGÌ@Cå²yás6ô“ÓÖ‘ùŠLޏš7p‰D€£3Ó9"—VÔËCÏ-Íàʪ¥¢¶Qꚥ= TLˆ•·~‰¨XmaÔ¶Ñß È×{òY°\È‘Àõ½%AÖÙ^Õ$@ðΊ2in žõçûa»¾ŒÕc¸ Bc§¼‡ lÝÝ‘Ÿi¼þ¬sÞyçù-ÿ wæyƒa·=À¾=îp!ùè ‚¿Ð:%33SãâˆÉÜ“åÚs’¸XΓ‰äð9zcòÎ×£;kÇ6®È^3‘#0/ô%xÀÓi‹ÐòdÍIYR(𺪾YÞ[ºE^yƒÌ_Y,Þ>G sSà÷Êzº¬ïmƒm±]¬0ðZY~Þ“mƒè¬ÛV/¿¶1¨ˆÄ½vôñǯóüÖÖV•‘p ÅCDÉðã7à½]/Z´H¾üå/û•ˆ*ð@“á·ìõƒ…+ôè0ØÙ#} >Ï’8z±ƒæž9S¾uñ$ÉH‰Î=óUf™R;% $š ¬)´ˆòÃWà{ •#М°œØ ' jp^¯Žôh£¡±Å“?°¬Žþh߀Î4Þ!†_ õÚòqSY\T%¿ºA–l¨Ô…Á‡ßË6áæ'®ŠPõ™Ü“9ÊL†®Â?N \` ·‘߮ٗRŽTŠúÕë-!î{|fôüÌgñQx é{ù›Q?vÉÒå¿}äÏ}ÇnEÌšq¢¬€ñ6lG]¹|•¤¥¤a~Ù*ñÉ ròÉ3%5-UÚ±¦ÿî›/Ëè”íÒÞXãŸËsJ<á†5€{ÆI€3|à9I'€2ü'½L‚ÞH¬óq¤£\RΩ/Y³«`p±z'Ѓ×r-ƒÖ1Çæý¨¤÷D~P;0@xÿw——È#¯¯—•+÷²W{‹Æ­ºðBY¹zêïŸp xrRÜõG=|RSS#T ºé¦›Ô.‚K\öŸé´™ðòË/ÛÍJ šQ·Äp¸o=`ßâ¾ÕÞYëSŸàA£öüö˜ùëÓ—=ûÌ3‚‚uü¬œtÉk¿mÛv8g×µ·Êò¥‹¥rG‰ŒŸ0NN:i†T¯QI¥yAwz€ W°ã/‰|·j{lm€"Ø­= lD8×éÙñJ‚Ôcí9B“¼( 6j¬]¦ég„€£7ÁÌ̳t-ëµAÀ{¢,¹RâðÊGÅò€_´½‡ ®Ï¼‡±Ì´ùâôþ’-?ýÛÔŠ„Àï|¹õÖë* ›aÿXHŽ€Û ¹G€» y”8Õ~“““ƒ}é.³rå àø’à[,!î{(ð©¯ì/øÙE‹,ì¢ÒNTT´ ÊÍ‘§Ö¹[>^¸ F8ßÀî½ßÈ ¤=þðc/‹-—¸ÄhI®§àæ7¬’tŽøÞ¨ÏPÏlýȲE§ ú_ Òt­0(¹6Ï©ƒ–ßH`º°6ßM†‡†ºÌÐûq*àMAØ:óIHZº™¸>o§ù|.*ÒtËÓom'ç­—íåû&Ñׇş”¤8™3%G¾ðWÔµÉ-­“øØ¹ñ¦oÉ¥—]®ÅB}`ԥ༞‚=®ª¼ôÒKªØD½:’wÜqšøƒ"ãá¸‰áø¡íOˆŸ·mÇÖAéý";ö8ÉÌÈ’·®”Wßy_"[j¥¥©Yžþëß%¶ùZ2Òeô¨±R%‚g}UìÒÖÈà¬øð ~õ*Ïk>%ÁÎoTczKôC cáÝö üºD€’¸Ñ‰Ö9ïçÖ`Žþ´˜ä8jÿí߯i,=0=ð©¯ìÏcâc‹ºá†›‰O¼¤dÇvã$>-]¢£»dö)§Ka^¡üó¹H–©†äɳ¾-[Kªð™'IDL„ ƒ™¬‰£ÆÈ¸á#$º~L)ŒEÝh¾Îá ÌÀ4€`¦S¢à<´}ðž¤X"@¢€Pó0!`8=PI=â 6”ñ$÷¸F 5M ‚pÙúR¹÷ïɇˋÕXˆsë}ŠÌN‘«fÊ)²½û’Ø@”ÏÊçøê=ˤ¡¥SþýÞûŸÔƒðwþ~¤YœÆ~2Ïknt:ÿüóÕp §¿üå/]bþ8ø-,vûßî»ØŸÖú4ðë_ß3öîÎ80S¶lÞ‚5þi¨¯–f,ûuòN'ÂÌÌ hü•#½A"[»¤±®f¨b¥óë²ÆVÙ°~“ŒY(•­±RÓØ)Ùi ½ŽÊøø::s÷œÇÉ@ð‘`ÿ®tƒåàüd ›D„ì?Ò5…Ã9cøO’¢²Í &“„`·àV¹ïïóeÉÚ­*áGÒ~¹~i‰rÉÉòùéƒq·ñ!HѪò(xFûh6–7ËÖò™{Úd‰Kð¤÷vs–a_¸syËchmXÈ4–§¶ M€]ýõj>éŽû>âað;ÒW¢}šüùÏ÷ÿhúô“ÒËv”â´œÝùZVY!3 ­6ª©Í-M…+×ÙgM=NÖoÂhT#±‰iÒ„Ï¿vü¶ïüÁƒeKåL”U×Ù?ºü€9WW¸8S‚GGOä«\î³Srkà]7ç0¢ØG-\x“€g»òêëägæËª¢}ÛŽëÿp’±Ëï‚éCå²Ó $.šÏG„Ò»{}‰§84ç‚ ½ß}¨^ßR੽¡E¬} ™HŽaÖ¬YjL•UÇyÿ}Îu8Ú‡z /€éØ"û5•"ÇFÈ ¼!8d£»ùRä$Ì3ëëk¤_ÿIHLP0pà 9nòTY¶y­¼õö»`õ㥥¡VjaÜcþòÕ2¢0_Ê+±§U²3°<ˆúÁo£žæéK"x£ôãöÆnÕð#QP 舓9P(g 4Àûü‘§__‚MAɦ­åäõsIïôÉCäÚsFKj|4@Ðäï"VwAmª…"U¢œK‚† IDATtÆEÚwÆîûŒçoÚ°:,Ëv~øaU'vL¨-F2=a×{ ¯€~è«¿¤¤¤F66·HTL¬ôë—)ñXrV€~míÒ‰%ÀÆ&„4ÉÎΖá8¹§®¡NæÌ>Kæ8_Ú[À¦'éñ\¥m•²`é2™4f¤¬Ú¶Nr2° Ø4ÿ<ð#¦FRuœ/CЫ&Ê*û@Œ‘¥ÖFô@A ׆iÊŸŸŸ/=ÿ‘ì(ß?­=k–Kz'5Hn8o¬äf$ûxF¿Sb P.1hiï’âò&™2.O«Xo'áóFr¾ÛfoDÀ¸ãh]™ŠBûÛ߬ú9ˆÀB‰¬¶„pØwzÀ¾ô¾óDÞ“Ü £yý ‡Î=Q˜“ضm«dôËÐdý««k$\?œÐÃjÅX>h°L›4Ušë¡9ˆýú- tÔ !¥n`›ºR°5·QAφÄ6\€Î_çûœó³”M ¸  €×T-¯—F4—Ä Bmòýæ±y2óªßʯzõ€Ò¨\yà{§È^=Mª-ï1öè/Ÿÿ—n®“V¬¦L dö»Zœ@gÜ<Û¶¸K(,ù$æÉðä$ÊTJ°‹pØ·z /€Y袋iu&Æ<ÒÒ3$..^¥ç™YYº— ÐKV8L’ •Æ +9Ù9Òš€[asïsX!ˆZ[ctcß}ÀÙàÇ —JæÀØÍ½/¹ä·Ä‰¸è¡ìf†ã‡®ú âîfw$%&Á~>yM R8|˜´¶´JJrŠ$ÄÅ!×qšpRnB|TSÁ¤ËØ1ãp†^›ôÏÎ’c'O“Fì\£ðŽ&©º±ãm5¶¸6 “”-«¶c­l{(Glí1¾"dëŽ*¹å®§dÖWï’??ûoLEöOsÏi`všÜyõIòÄÏ”ãǰäý 7€û‰ƒÆä¤égô¹ÜBÞdwDÀ-kCrÔ  – ãntâáhé^pÈžîzÜy<×êsp wÌqcèÇŽ¿AªgÎõkê¡sû/…`™i˜£w@0ßA¹–kúKv V––Égƒ#´¤¥±ZR×R'-ÐÈ[ÓÜé©é²­óúØ,ßHŠ1Ýag¹@bãyüQàÎgbÚÚÛåº;’Ù×üJþþÚG VxÞàú¥%Ë·¾p¬üýççËYÇ„n‘ϱ®¼¶ 2$‰OÀ$ým´7°³IؖδÞ\oy<$ÄqÜŽ»¾Ô}‰ðdÞ;Ù9qå§L>Zjp¢L.ÀßÙÑ®šeyyCÕ¶\,ŒSDbg`4„ƒJÿþ¹ŠÉvL FŽ)± é I2ç̳UÐÝÙ&uàÚ£be-ô Š«ª$õÖUC/>·UÐÀMÐSlO¯ 4 ¡Œ1ýó—oKo¾GÎùú]òÊ;Kpn@ðÄ›ýz·É XWœsŒ<û‹ÏËegŒ•h“?ø[ÝGð“–U7´Ë€,Sto`ß]z(Âàç~ô£7á'P@}€°ëC=ЗÀÕèeÇ®¬ä¬ß×ề¹jè#1Kxøx³³21êG¨pÀ€þ Vü‘8Èhû¿ êÀ§w¼ä ÈA¼^º ‘¯†N@3@°xõJŒ|QRZU+•]é Q¨éIü©ñüÁqx{ñQ  {ýÝ¥rþuwÉE7üZÞ]°*xXÈþ¾Ïø¸9Ö8ÿ"ùæES% ËztÄ9þ{/Æ«=vZ—sÞh¬¾çäöÏ Žòt l:»fè:7Ý%þr¬CYïÕüüSðÃÓ‚sØÂð¾´Cø[óCø®=Æ1ã†K}‹ÇîSߟ§ÖdAÐÇ%°høF5µÑE$ €È‘ó̽Xhèµ6Cfµàºšjé@Æygœ)?öôÝTÐö¿¼¼F6ÂxHFÜŠúPN—~ þyp4úIbðÌËȽO¼"kжÚ#0‚Ê“&È·¿xœ ÉIÁ Apö{ÉÏÎÿßà>(÷þ·âÀ’Asƒ€›Ï:2Íy¼ jK Õ®¿ »f?üáÅ’ ˜È¿áøÿ† ž‚ÂÓáóáé6Á¿ ÿ<üa±ÐPØõì¾B¾ˆÇR)mÏ}õâSdsC<æûÐþÃG”XRÊÆ*@36ü 2D²ÀÔqP,öúCZvY§æî¸*0ŠCE7ɬ)Óå¹W^”êÊ:IЉ—Úš:Iǰlc‘œ‡ E[Š6Kì°|bP,J„ Sym7õÒtTWE Žeï"Ü^íÉ(òó ƒ gq¾[ÕÏ4#n𕵴ÞON…õ&Z áòöÛ€‘-äÊà9uxÞ\2"çÃçÃ3Ô[æÁWÁ‡Ý^ô@_!ß¶g1t€Ä¥åIkU5–ø’¤Úí°ÿG¶¾ N¸îßÐÔ¨@åÜ;>ÞfA«EÍeQo€% Àö²‰éŠ’“Ÿ!ûç3P j‚þ©ïÈ–ØúV©ll(ìîÛQV!-IÉ’®û îÿë þÒ¤¼c¿á°!9òíKN™Gð8Å Š?%g„D©G·”Õxé0M¡c?ёȚs‰ÁîÀmu‘E&Ož¬ÇŒŸ|òÉj]˜´Ð¾ [ß—ƒ2ÁŸ Ï©ÃÙð0Rá]Ç¥îk¾Þ£tnn8²ú˜„';Úžî²/&/®*–² åhìäkÅÙôíòSµ4œMUççÕtòì´8£§ê öö6!ØÃ…ýú…(·nõz9ï´Ù˜³Ï—  —˜,˜¤dö“E«ÖÈ'Ì2L²²FÈ?ß~Oî¼ëOR]»G¦=ò…¹Ùò//sfŒÑQžª»Ýé4i„fi¥ÄAÁ‹Œ'@]„žµÿp›2h‰—¡‚Y="5Xú„6jB°¼ö‚PD€åèŒ(xW¡ÿºD€Ä…›„xrŒÓ•––ê)CΉÁ2a™4i’ 9íãå|ßw)BúÞ\"2~? ~.| |Øí¦úø¼=#GùUíòÖ»oHp¦Œ ÅÅÅ2´ _G©øH‡|Ô6#ø Že ã¡À2œ_œ'e¥Ò„uùÏŸu<óÒ³2qìxèl“Êöé*é•Û¶Éøƒ¥¶úã3C× ñ€€ ,é]9gš\~ödØ+ähë %{Ï¿ê5ðn 2èõš$VUÕy-¹Ý¡utýÅ«< 7oXÀêlÛ·Ýßk{×wWo¦l# ªýÑGAf“¦Ï|â‰'Ô°h5V{~ûÛßÊé§ŸîýÆÀíV¯^-W]uÕ'Te65?i˜ÛILZ0PÜq?„'§°<zéì%ó %Så”XÉ]Vñi®û 2A¼}ûœì³ *Àýô þЈÁqZQ`_Y‡‚:ªðÒb-—ù1òc .A4Ê€Q Šž>sºŒžvœ4Ä$I4Ê5`Azz?)§ÑŒeÂbœ8lÄD™q|Ù¯ŸŸÄ%½9ÇÉ+÷~]®ˆŒ‚¥.¾rÏã:8`# ‰¦w[-¢IÌÐÌ^l¯ÿÖ4u@"ý«ÀØv†gÿÙµ…þ4»õÖŽ?FB¶oß.Ü)ÈÕ˜:×^{mü”ÿP­›žeF-?þ8ÊrÊï9} .\(¯¼òŠôúÎ;ï¨-+ƒ0þßð_ƒ?+p ìü=p¨ '£#ùPqI‰²£Ê:µ1– µ¯­¯“,‘ñ`J²‚C`ø“Vwy¬V<>~l¸TE ì ûoQxSƒ.­;~üXÉè7hÌQ²|ÃJŒ„õ0⋃2!ˆCýRL ’°­v#‚³fœ"yƒ8íÜ7‡çå£/ýþZùþWN•äï"£*wòŸZGZKSÔ{å¼|¯,“=ˆ°<ÄB xÄ„é,¯í±&¯Ej1  lÞ@n!ËÀ-Mû™/ÅçÜ|_–>ŸËEpþOG+A¬GY öå—_.gœq†.ý’(ð½1ŸZ„TÏÏÏ—ÓNã
NÁ=÷Ü£§1ŸÄ€žƒͱ-ÇQFðGøà7ï€ÿ ü'Tw¨;ƒ’\éãð"›pœu&³°Ú% ѱP©­×Ñ}à ú~š Ñ óÕ\«çOI=¾ûS#ŽÒfSAå‡L. ;»Ÿl(Ú(ëW®’¦êRe;»ZAZÑ^”T–”(è·W•I|æ9í„c´­½ùÃwæ´Ñòÿùšü×MçàÔ_LI91ç²B°ð½V©_à]ÀŠd†W€^½Ò ÌQ\³²µ œeÌ!Îÿv´ –õÒëšÁà÷ºÀ E¬5èÖóçÑð§?~¼²ÿï¿ÿ~°OâΟïŒmÐYHpó=ÓºO*âˆOBBî€õÒsZÁ:·Þz«ƒà zF8Ø<ÿ&ü¾Søžm~æ¯5˜ÉŒë—”Æù<ëHX×!›OÖP¤ù|á:BDÇèÇÂ)=1 B|@µà øAH°-zî"ÌÈÌ’Æ–Ù\´û{@8Ö‹ÂsȘۆiF9 ŽÌ EXëŸ=ûtÈöü™8:OûÏ+åþ[¿ ùƒ2½ÏŇS¸£?‰‚JìÜbZX‰ë˜P“}@´¶ã©"{IšÅ¨¶ÍÚð(„—e÷f:‰k§dTbãÕ¦3ÍíæŠi`ùnãnÛ–Ç÷@I¥ PÅvêF(8ÌÈÈБžçì$ î}ØÓÉ1ð$¢ /ÔY¥rä4|n®ß÷¯"øŠ—‡šè„›[{c!¼£an€Aë½ü–Û°ïŸ >ƒÁ$&ÄéI·ÍMí°££$>*.rþƒ݆½‰‰qà¢ð{/D‚n,lDøÄÕÜÚ AÒ.#wð@™?ÿ#’KN£[’3 döI\œØµ+Ò_îýñ%ò×_]%“FVyèà$ÐQ×4ÿ™³Ñ_Ë x µµ®VÒò^;;ë±-zKç¥ç­{Ùz_ž@?P­«)]Ð2ÜI D p{V.TËëQ!ÄßÑG­r€8·ÁïØŽß‘!àIò€Öj$$hâ®»î’W_}UÈÖ¬Y#O=õ”*uÚç´óx ÁgÁþð?…¿~0üá%ÈCë0‹¹`wÞ?`ŒÉÍ)âü¿?Ty‡ä ÂY€Í°PŒQ¾óØ}9«Õ`I/ †B¹_ óÛ^^%«‹JñÑwèR ÷auËH¢Ï† ª³¥  Ä¹dëÙ\ºCúgæ`ãQ—,_µRF«=¥ræ™gɈ|oêáÿúcIï'7ž//Þsœ2 ߨŠgì“€ƒ”Ÿl¿‚DÀûQ hàúFÿ:QÌÐË*€—m˜'Nô2P†eáH0• (`yÌñò @áò(eà23ô§ñÚï¬|¨tšÿšútóæÍ 9ê{ïªg­PÏà–pëË  pqܸq*càw4uêTyä‘Gäꫯv«rúI+-oÂSñø[áI6Ã? _X»O¾áƒ÷s{ ±Õ(ÍïÆ(MåŽþd©Õ×ÔÔ* ?^$;°|—Ÿï´|±UØÔälNLŽ‘ÖÎYµ¶LjØÐ_DÀõ‚ $Ú„X:Š„áŒþ+·ëéBy…ùÂe§  ˆŒI*çž>½Go¤§b—Þå§Ë¿¸Q¾8ûãVð{€ ‚÷²Ñݳ Œfø0L'apò=^Çé@ºYÏܹ¯<„MðÌËžì?3ô(¯¹ J,¼t&ñüž¥` Þ¸XÇÊ2î:xnºçïtYxº¥K—jªPiþçô—q¯çT€Ü‰M!ØWFŽäàt;—‚I!.΃ÿ¾çG Ù‡ÏŸCI&X7¦cí= ¶ýÀËC V<ì|›~ñdí>üpÀ¹AŽ=v*4ñÎð]u€õo‚¹0š £ €{þ1†ÉçÎã›íÒX"Gxu@™h$ö\ËÃ*a‡œF7Tˆ7•–ȦòÒ/5I Š,Z¶ ÛÊšu›dÎ_”“¦Œm‚x¹|ÎtyýÁ›äú‹NTc#ÞÇÍ‘Ÿ9Õx#°—áÁ‘ñœËBEu°óz¶§ÅX W¼–ó¸ ^z.Ж×b iò¬kýÀÕ: Cƒ¡y»öÚù×êìLÙ)¬³4?P™îJë)Ç![n.T»¡Ò¬¼…{RÆ-kBFße<¨®L¹órss­Ãtøgà³xq8ºC©4Ä:tÌð<™~ê©òä ¯JD‡Èä)“å½wÞÂvØHY±t™J‰Ï<ós˜ÇC32„XR^KÁÉx±0 V­²€Ø˜dÉŠï–¬ôxyÿÃõrÆì‰X"l 0„ñ~4_:o޼ýþ‡òæïI,FôVh.ÞX$†‘Â!ù2É2˜O‡¢Q“l­n—k.»HFd‚Ð@HéÈ#ðä5ñù)@OÖµC‚Ü*§2$$ŠY4\*D9eï™IçÜË»`yƼl„€'𔯰ò¨ÚÒŠÎ…3ð° ã®_Õ\ï•q’‚õÜ4œõ\Ðûó AkQäPuüi|Fr„½9·¼·òä›°CôØcU°s¹˜$Í—X1í‡?þñr÷Ýwë7… NSÿ?¾ þ°r‡’©jÞ þ2fÔx9©´Víû§áôÚV˜üNMÍ“tòÎÑ£Fè‡E S‡œš€9ý³ô£àËL„!šçîho„òÏ yñ¥E`(ZÀêÇ à<. ¬áÍ߸^¶lß*Š7I 6•ÖTÈë«`($½¿l1Ùþî»rá¹ç`Q5vb3Kü& §Â=_?Ú#ê‚àGŒi&œó„~n `°þÞÏtÖáªG ®í’˜ØèOäz%¼òÁû ïO<è³ Âª¼’H<çE¼{y)‘€ÉÀJÐÐÙµWÚå]âà'¡Àfu-tÛ̃.‡»heö¤+»7¡K888þøãeÚ´iÚû€ù¶„Ï@ÍÂë®»N•ɨsp§!|žÚ…u´Ã"8”S%dñ‡.e8ùv#ì÷§`Þsÿ:1róÅp'` 6êPñÇ[÷ÄZ­²’œÿSAˆ«Ô£z}7|23â@0À ^0 —ÐHhÒ{긱ò]„2S2`-¨Û†;dɦ-òÎÇËv©oï„ p+LŽ'Êú[¥6rttƒV* ±’v_õôÉpTÂÊ…éíüÌ#0Q6P#†Cãø¤¼¹¿WÖý½8]ÛÁ_ïÃC]Æõ*PD/¬Mæ+ ÔKÄj ?t¯_<Ð{%¼¿ÌÛ_·«6rrrTWƒS6¿ó×ó_ó™]çÏwóBÅ)$¤l€BB.›|€« ”Kà…íÞxã*rÚ9ñ7áû9iŸùhÏ=¸?‡¬•vø¡£dÛî°Ðûõ#°ƒ¯kÖ|at©0 J°sIsy޼©`ߙω£?_`7åÆ u0Þ˼·V8Ez4ÂòÔ$$)8뤓å¿nþœx $ÓPio€­< £€›®˜DY¼rµ´vcsVvÔEKSÂPeÇ bõ¾Žê±Il%ÀùP”S˜`=8^G\ëº?¯w5úÛ}Y÷â%ÇeàB‡}¯MfjL5PÐ*xÕ‚÷D»+³»üàÍá2§mÚ¹ÏáÆý÷áÀâé‹€;ô9~#¦€dœ‚S„‚kêä9iŸéè¡$JI3!Ä‹ŒO—lèH…:n:¶ã80í)ÜëĈ‹#?×ý9§ƒO.ùQ€ÞtÅ9×WÓÞøü JŒ‡lÛ^å‚À? B0‚½q#‡ËmßúŽÜþí›e Ïà–`˜ «ª­’¬,ƒÞzZFªÚ¬ïΔvvÌŸ`%`é¨Ït‚,˜Ž|¤õ?óÈ T°(™Îq¯M-ÃöàÑ_«xÅßDÏb¬Ï8 “Ʊ-\jšW„Å¥5ÚëÿHÛkÁ}Èà& ºpZ¡Ü®€ªüÞ¦õÖ¾›NAÿ»ßýN^ýuùÜç>Œp?.ep³7}æÝ¡$Úyƒ °`ª f»úaTï»ÿõÖP·¿ƒkûòeÂø‡¹H²I½£¡ DÖŸD‚£?ç©‘4ãÝ Uaðû9ýãeÈàL, V,àÌ©Ù/,÷eBµ«¥YFäåÊé'Ï”jÊf@ŠZj `çãõÀåÒdË(%ïÈù1ÇÆzóXÎÿùr™¯@‚òÐG©4̈%Kyæôõ-9,z8R°Q6ñ ›ÀîÏ™yªäædɶMë´P5,ÕÃÊïòk¤ÆD+Ál­‘¦(Oðè_öRÊ‚? ÈQ&vÏíIýYݲ†,éa^ÛÓz¼ÖD´ќƵh ¼•uÌòT jn¹EÜîm÷Òíü!ðÌ;É!£½µª0çØt½X U¥¡Ø0‡lt¹tHBÀ~¸å–[„ÛšÇùÃÝðOÂ÷¦Oàï›ÑCIÚhÝ—6ÿ+hýgÔ'CJ/5•åºÖŸï eÐw4JÇïÞ›Ç{GR“ ãKb:„Ü»ƒ5Ý4Ø¿K–’’ –Ðrúì=¤ØsÐ-C‡È ¡ù8b¼B®ºì2Ìÿ¥gД€M­ÆÉB63IÃ4¥Lv´a*Їfˆ<ØóW {„@¯Y†iœŸ#T`jÈKÖ·6h¯^Pðgå™N¢Á¢»ýµÌÎ{Û¯ ‚ ÄÁ )X± à^ßíü\Y}–ÙSguB•'ѧëm ªÎ®Òö湬½©ÃˆD€}òãÿXÎ:ë,Z[/†ĹþLEw¾õƒüØïUõ‡ÿ‚‚áÒ ¥ŸìÍO…„6 ËrœïwæÇª‡b¥À[ð¤×èy èÇpêzþœxŒxùC)kä¨ ¶Ýq”°M~c _Pƒ•…BLGæž;Gšpy„‡MÍM8b¼N6ÃA´`ž¬+ eýØb´8ÚqG}‚˜Ï¤S ½÷Nð3Ý?˰Ìó€Ë6õYèD¼¢>®õ¾^9×ûðw1)h5þÑ>'âÀo"d'-èS­ƒ47t¹¯¢÷×Oüå´m·Bˆ¸ 8ŠÎ̹y!ª†Lr ”¿@oííªŽ¿ »¶¶¸RE"ÀˆÜvüÚk¯©>•Cx¼§æè$~¢=sžxcwwúÍ÷=ø¹Q3g¤š}²ln­—ø8€ºþ4ÿ•ÀQ'³ó›ÀX¯ÀsÛ}‘Ɖž%_°½0þŒnØúë„êëÀi8Pt§âŸøàmê0hð )^(%ÅÛåÊ .ÂÞ€,œ)ˆS…ð u -²û­]‡e¡,)ƹE8O º ËŽ.ðuµ¢2n^à*ðCY}.âR „eSã‚ØÕ‡f[¨¢ÂCýè¦ñNvíÝÇ+HÃÎß¼)Ê'ÄÂX ” ´²Œõ³ÛZ˜æ–·t¸'eÜ:{[Þ­kñPÏ˼ÞÒ­ÞÞ„$œ¾P.ÀI>ø  6Ìm"h×ÒMìëñƒFºWtÇÎ<ëÜ/}ñ¬óžXøÁûÊZ8\`¥·dÌqµ@˜—{}ìàDP[î¤`”—Û… tŽÚÑÈÑ,Äôþ—ï#|7Fí&ޝp€ @h#?x~|¬ÇÕ…ÐE༾; /„¶`V°u^Ñ€Qs[E…4CkKŒe• ²®.E:#i›À²7ê˜hC?j‚y®´_ïí? \ŠvZ <žÄ@ ¸-Ô–å•g%- q%Ú)*o–Uè4ÊÔí·{9% ÔežK¼¦mZ„Ö—–ä¿fºÿ½¸JEVowa°oz)¸»ü^ªíu2¿3N9|ík_sÛ¸Aå67£/Ç!6ÿôÝ÷ÿëûiçÿþÚ—__QR–2 ?O¦3MƉC* Píß)­+Ûtħ&V"Ž­¢âE4 Ù PÇî¼pß IDATFžÐ…y¾‚Kq ^9¤àJA+vÿ5DÖC$C‹Ùh¦}<ý¨qXX E7È—æ~^Þ_ø±l‚=Â8X&jïÀ*Ec«¬Çè?ª¬›¶î€Y±,)ML‘Ñ-@"‰þÖâÙ&×ø™h `šÞKË’$yà&bI<´‚PÓÙžW?j:3ò˜àT—@ÛöT}Wmm5[ëeÝŽFÙ à—Ô4ë6jþøAYIàøLöŒÖ'Lg?éó"Ît7/ø[XpέcÅø~ÍYûvýY IH ©Uè8 7‚ÿ|ƒ“Þ§£…¼ùÎò 5u×GÄÇ¥Ð~?OíIOÇ\ö¸žxé)Œ¾c¥ -Sª üÛ´q£ YعýÔZÐrì[¾t Ìzå©Q‰aÜqîÎCBøñò…„rLOljÁ›qb0Šéž²r®ãGÊ‘!UŽK±1¨›Œ®ùâåò“ÿþ/##uÿAgDœøƒ¡É‡“{jk¤òŠÌôF‰î®G“€.Fi2¨œÃTÅ1 Ùè(Ëçøøù :Ú{íÐÙ²þÈã¿Jœñ·¢¸FV×KQ Œ”7IEm ¸¢ž²ÞÃíÔbJÓPW .+-Øoü˜Ù.°Ý4«Ï0hÝznY<Að—Ù“k#X¡Ê†z¾Påüi½Õ³ïßÏgà^Ÿ;×\Fºþ1_^Ÿ¼ì‰†Oá»ï¸#òìõë“JJJ“33$wøpÝŠ ¥(üŒ8TvlØ"ƒÇg`Å ÕUR‹Uö<ë¬ãdâĉøèºdõʲxÉUÌX³f a¸Ý“ª½ÿF–ž2jvmD9On@å!N)R!k öÕñ”¡|È–.[)Ó?IŽ=^–¬Y' œ’tàTì+X¿c«dåÀ@i­T5¥Ke*Ž&ï®Spðíy4ÄMùëü$F(4•ÄÔø4®…‹~‚l,Ŷå͵²f[­mo”âÊF-wޤÚìüinq[·r¡L˜:+Øo~@Ùó³ocb½På¬,óÍ…J³wã¶gåÝ0T]7ßßÓòªc@ß“öí7ÐDYGGáGÁÿ8D~ŸJúÔ €Ü~{wÖ 7ÔÆFGTwwtfÅAˆGû¢­¤wFòáP¶ˆK»Å ln•é8µ§`hžŽ´¨;iÒ1ØË= : ²hÑ"Ý"ŽÓº k–ÊQSföhў݀Êk‚Ʈݖç¦YÜÚ±k†$$æLúo×{º@Þ]ÝPÏâÖé-߸·¬·zòðÃë"Z&~î¹bu#Èýߊ:ÁÿÓ­Û×âŸ:ÀÔ}æ%cÕ}eRrê ®³7Ä­TþÁÎ>Îé;«Ê¥ÿÀ²fõ€³ûñc»o…¬^³ZYÚ’’R©‡½?ÚσüओN‚¶„[EEj6|0FíONxhW:åß8”bãÆÍJ@’°o`îí¡ÿ†Êrœ2´ Ä¡®­EÒú¥Ë¸¡…’Ú%5k‹`Jü˜‘²dùIJÏ–J(%`T.—¶° º[‡ã’$¶» Çë%›Ï·ŒÐ|pȨHp]]ׂãɪö*Y°oØËj!üì…g³Â-_ºXæ|Ù¸³·н?|ûøÝtÆ ÌPy~bö§³PõC¥±l(·7eYO~s¨ûpIrîܹšÍß4kÖ,ÕüÊW¾ËUÛ¬Ú¯9² {">=·9*º´’ª½Ñ©°ä …”8°ÓmPKJ¦ežxÊ2’}oËï;ï¼+5µ5PÅ—ñG½þí²nÃzÙa\. zæƒód]n2e ëy†díW­Z c"k䘉“dÔ¸Ñ2ÙRY°,þ¸IÐB,çžü_Ù²e«äd÷—2X¢ÑJ%I—R†Y÷XLA,\ VFGܸØhVËȃ°rÑ Å¥hir|À7{3n£þ¦µ²|Á^-¶ÕÈ–2ìE¯ýän8÷Ù?­x\L”¬__¤€%Ñ4@Úý D‡„·2 YÎõnã¬Cïw4éFGKÀŸ¦³ßÁ{¸¿ÑMïíþny– U‡ÓJ–³sÛÀŽå -C-MØ-¢2ñBùhùRY¼l•Ôc.ŸA{Ø0Ô†uõ˜V$ã(¯îgÀAÞà\yîÝ·%ò‚ì %íZ Ί?4[ØÝ"É0:B"–ˆÍKmà æ/Z.Å¥¡··Ì—…]Nýq ɨÜ$˜8#à“%†RU.¡‚ ‘уåß««dãšÅR8ú˜²“O>1ALa*ûÔ;¯ 8n-í]à[¾-‘]¦ UßʺáþÓmÇïêÞ»ÊsÛpãöŒååånòN ¨›ÚGâ‡\„Aôþ®ÒÖöÖ¦²-[¹ §*=€Ë–œ4óï°ëdû§Á„ó֭Ř»¯”|ŒØ\›§´1Gú¶ö)Þ²EÞzû¹êÊ+dÆ"š\ »ó\2äz9€Š¶G‹µCø÷_’ûŸø³”Â=[‰Àf a…Ãô-[7c#N—"кu›`/´Û“Û%'%M¦Nœ"O>ÿOÈ â$„`]é6‰Ât%7{ j-’cˆì¨“5EA¡ñ 9êA ÌL”1ƒø™2 'íÄ{;'ƒ°ÎSw>ÒQàèæ½òÉ~”î{ß™ëÅ ¸Á6üœk?Ap²zD((—‡©^¬3ïÊíîÞþ|ÿõ®ÚöçY]°?ßm嬞åsy™Îý™Å]ƒ}Ö€—ß=uöŒ ÀÝ& yl$´ø¸À7hz'B7Ý ÅR{Xo0 ¿ä@ïž’úæf˜û†f` „Wd¯Èf]sõWåŽ;~ "°UÖ¯Û c %¸lÙ %öñv@šž°rÕàqœÓˆ¶0¢«J-ˆI<$e˜pZÒÞÕ"-Ñ ÒN%!Ê@&²¡¸|ÝR(Ì$Ȉì<©h¨ƒù0!È…“$X2æ3-?OV•”‹û ÎJ–±C’嘂TŒð© ^¦Á>¥à!ˆ þàšWŒït…9ЋÀy…ï€x^v}Ï•–bÿ¹¶õ'óü`wË1?”c}· NhÉ™.TýPiþvýevum`õßÏ_ÇP×{R‡[Ô›¹þqø7xÑ×ÜA!üÑIÓOÙ‘^´öåŠ%#F-Œ™:fB|]rNí¥ÂÎÚuke 4þF cÐÀ\ ŠÚØX¯ÛG¹ ƒ¬#—¹‡Òì+VÉñÓW3â- •ù¢8eàÆü‚|iÆö^|Ú0.BA ÎDœ'7A-56ò¸YÛ.Ów~¬±I|a#ÎÒ‘Y“Ž•†ª& ÁŠÊåÂŽ`6XúÄb:ð>T•qßOÃÅc÷^^v²Œš*G¦ÉÑù)’„ úQ+Î=)´·Ü0+ð }ÍÄ#1ìùdQø}ƒûÅɇË6i?q?…mÑ5°°؇Z L3Ï4?A`ë˜%7à©@ÚË»Žm‡rö\Ìó—ÙÝu¨öÜ:nkÙäž?~¹%ö•ð €ywÜѱhÅÚG‹·mù\WkûØ ë×C™¦]òó t%`óæM²yËf¬tèúþŒOR΀V€ß|ó-©Æh=|ö¡“¹c„ XˆÓ%Àz¬ d`;1ÛƒiGíÛíøÐ˜Î©ÅôIS¡xT¬rƒNèõ'Âì—/†ŸÓ…n¨ûr£ ð FB,ƒôäT‰íÀ…X1¨kªUC.Ô“¹*ÐÒÚ(k—¼!ï.ÜpÀÞe"Ží*€SmòÒdÊð4°õ¸?6?éSá™ø¬ú"A— R‚ÿìÃÔÚû(úÑ& M–§ÞÛ!K YÉ㺌°ÖŽßBK·÷8F RŽPYY‰S—δfvúïé/ìÿµ[ߟǶB¥ùÓ­Œ…þgpËóÛ$AýÉO~"………rß}÷©’Êð¿À/«ï¸ƒFø“ÁìGT•”I ÀÙe 4©­«ÑmÀÉPË7vœ*ÿBØ×@@“~’°Z! p2І eæ (¡“ÇvG…㣊Áh ö˜/‰ë± Ë HD¢PY^-g̘)cFÊ?p¯,‡õŸ¸ølœ ÔŽ…Hì&ÄK£„pZ0À”uEl°Ú¶v”—áØ0,âyó1eÉHëÏeË«åÍw>”Ø ØW— óçÀ˜å§Ëäé2>/jÒì'àD0 ½üzOæáËѱ\ ²3î¥ôø›žÌó.vÈC¿ùùõŸþWiŠT½¦Û³0$¸ÜkÞÀ;ËóÚuk×®ÕõññGw“5|ö@Ž ÞOÞƒ·¾Û¶w›qË»é{·vILÙÖ5×\£œê÷¾÷=k‚?úøßXB_@EþèÖ]\UY?|æúGO@|}úvõX¯|„ÝŒhtDåÇÊþ¢as/ó ÄÚ'¸×¾:¶¹xñb­~ Þ‹¹às[Â.Â]•í-¯·ô]Ü&˜eu- f8û‰D€»i=è/ù‹| sów'ÂÇà+,áP‡üàÎ žÿÞGçgddÆÎœ9SÙx*ÿ4r{(æúdÙ© œ «À4^9dÈ "*ÁåPŠ“óÏŸ#sÏ;WAÁ–l:OÛî••Ð ‰éA4–ç’U+çþµcÿþ´©“ 'X-÷üß_e%4ûaIpL4v•KFüpäb±  " ;HŽþ0&ÀrV€± Ó”(ðgáÔ Þ~ZÞ^°~·ï®_Z¢Œà.Ì)#3edn2ê°Xu²óJz_$A,Æ–¡p&²œ—åË ~„~m@‹~âÏ›kD¶@7b(¬%m†@nËÊ•’!* €ä¡ïEÂÀÐ& YN1øÈà÷òØ &xB?|ˆvhס]C{„<ðÊjIÃjÇ9)Iò‡Ê¹çÎ;åç¥øNHP­ÿ¬ÞÓ>hÆ]ð[™= Ùî‚ ðž¼Í[ú[BTôƒ7T9šÿ:D³šä–sãvOK³Ðߎ¿œå»å'ð¹$HGµ`. ¾øâ‹VüJDŽ,pÙe—%M˜8~ê˜Ñã"ׯ['MÐÝ÷ìúE`í?Q­ýrT# ‘è<júqã }®ß°AG÷ââ­ÐØM>ìÁ§>>ÚÁàŽ;n*ˆH%ê”@ˆØ-98RœzÙÐ/ØQ²Lu Ó³$sÒqÒ‚5Xûÿ >#ße_ú‚¬ÆF¡¥KWËÛ ?ñyQÁ™Dc‡`[d—ä+%4@bW³4n}WжUéËÌÍJ‘1ü°~2 #üÀLÏ@)?µ B ÃÙ8ë?$hZpÔÇ5ÁËrZVñíÔ ¦ï»Jü™ŽlžÁ®Ü=/VK8®¯ÂÀéxp;é ¯-ÿ)d*$î4ÀžÙ?~zKç},Î2æCþL£ô t7(´zÜ4(t£#ËJËãŠ6¼(µ`;yFýXÚºu+–íâ±îŸ `:”p<{usb¯sS¯€\ ;õJ±M˜6ùè« ¯…7ÜÃÇ/—'J ŒŒÆ4 Ëz´. î D!:\ÿ?çÅcEa |¶âE½ýÑ|yôo“mØiX8´{¥+QXFŒn„R}:Òc¥¶–} G,ubEa-¸„f=\ä‚ Î…fa¾Žt>õ”üñ‰ÇÕ6@Öb)zoõF·N°ú1˜õ'ÆH;š Ë9©12wxŒ“V!{Íåù‹q¹×ìVeõ5ÛïaØFw^FU6ÈֽЭ ¹ ¤{•í÷Þoày»rå-‘òÍûWIØÒ;s2$Q¦¹1íúqi¥daŠ4ï„Û\y„·ßñ~ܱY»ˆŒ{÷ÇO´cD ·ÑŸù³gÏVÁ-9;×*“˽§µß[Z¨|·¾][Èv{+ï–±¸•µkÖgœ»P™gù–ÎÎ-ùå—»²€{ý -´ܶ÷± ­vPô”#"î€Í–-_¶ü£vùj,‘œtÒ‰Ø55K%¹2zÌXUÌÙŽµú5«WJ]Mµ7’C HcÁ-Ä`Û ,#•TVA€˜¦2‚V˜îºà‚ 丩8Áei;‡VaŸ5ÎbðAS‹pÔÈ>qɱ^Ö®*’‚Ì\¹éÒËdXÞ G–ŒåÂ’ÕÔXÖ«ž}ž\wñe2ç„Yrú¸‘rɸüho¡àѹ=µîÅћޛï3 ‰¸Vì+ Íëˆx’âš§u¼ô øõ^HÃ?ýЬ_â^;ú{ýƒ‘ÜùÄfØl‘«!×Hªê3!¨šáçVpYºõVÕ´äGM Ó›#€myÕÿáõ~Ö5‚ðÁ—iVÛÀï˳mû–Î0”ó·ãÖwÛsÓ]À†jÓM³²n}æ“Õ÷ßÛ­çÆ©ÑºÓXÇÍFœ B‡Ü”)åß}¢ö”›g/{íµW¦ +”qã‚VߘV.€RM^ÓÍýò—¿Ô=·cša€²< ݶ÷6-Ty·=7ne-tóüñ]=«[6T[–ÆËÔÜþl;!‘D‰õ·à HÝA™Ø/¼ñÆoÞ £·åçÆPSŠç®{ì4=`t* %FÀs÷GçCÉg Œz®Äþ|n!¨„Šodl<¸‚\IÆÔ¡« ëè‡Ñ[pn_AáHeíã àd›g nß±MJaÃo+txæ–Fl(ÂÁ£X࣑’‚Ü9jÌhN$CåÖY¹Hbê7Á<.T„î/=€\/ðæö¹Âß@ hA¬£<²­ž—áˉ»,¿Â_‰ë±AÐ6ÖKðćòø¼e2óþú¡zqo`Ã# ޳ ä^H«ikÑݯÏ—[´Í¹àgšônº¥=ùä“òýï_9µÇ§Jü'¿_ý×Vßß[¼·:þòn9ŸÇ„}»+gÏN!÷¥—^*+±ìp%Á“¥Ükç>Ó^Wv*4€÷;Ÿ}ü(ªƒB¬2”€jdáÇK0×ÇÁ•`•Ö¬^­kÅ,OûqÜ7^\\Œmº©ªïKÁ ‰±WÂϼk¬iÀiÀPeín…v`‹îÿ/ÞQ¢í‘Én…n/9ƒxH¿©CÐjÒRüiñÇ ¦².9–¯›'1eJ– mä –À®‡>äHÈÀÄúR˜Eá€q.m°%:&2Leø‰¸—Ôë×|–Ó Þ3yÕµÞþ<»4BÁ_€ß{-ÀÏgìÍŠiÀ"pó6n”‡o¿M®¸ãN-š†•J´Ýí­.ÈYÈ€néî=Èöþüç?×iÜþð7KãÖnÆž¦¹Àc}·^oq÷>n=-oõYžÞÿ –ïY–§ ÿìg?“‹.ºH‰ÊÐxè$øþòóú ,ÿÄá»}ñÅ_ˆ,‚Jï›óæIÝËuØî›ðGü XÆÛªGä`„nWBP‡-½YüÇaÔ9n.ýÅ@Q' {VUTIs}•d÷Çž}ÎlÀ” ¤G{ƒý¯ƒ ÁFÉL퇵þR\†Ã=·méÆžyȦM>S‰‘傉/Y?_bªK\Ý&XðõáTz¯Å€dA€"xèæ‡A ¹,:~4 EÕg3Hû»¯øÔ ä,f÷e¨Yø³îõµ‘ò§—Ê`|t?ÈJÇê‡6¾Ëšß‘¸­¬C~ûôß%«0ŸÃ¡$Ôæp:è.øÝrL§]<,ÿêÇþðÃ+WÁ2ÁßdœÐŸç¿fÑP s˹q§iºu­œ?ìíLgY+Oé¿ë,ÝMóǹÀl4Spc  `L| Õ*ÄK‚|mM…l€Êo"¶Ö6BÕ‚Q¨?¶säá‰6 àÒRÓä( ß‚…žUKVƒ_‚b öóÅãã¦2O¿œTÙ^³ü0¢·µwɲt9«ˆFBú@ñU-•'4×WÊЙráççÊ(Èxö_ñÆ ÒX¶Z¢jVKLÓ6ìàK%ˆ}ÎM0Ñ¿]‹¢€3Ò3Éó÷ÁìÄ1Ê.ìƒ ²û¨o£>ËèSð¾ZžíèvûçåUrï K¤?úçÇÙé’ìóvU™å¾Ÿ•!?ÃÞ‰ÿþ÷ª«1÷[œ¦z ·ÐüÓÛ$Q IDATF˜ÎÃ\n¼ñF}œp•†Î~³^øþøóü×.x­ª¿Œ{íÆYÞ­oyþÐÚuÃPeȹí¹å·:þt^óÛvœwRª“p°£Mpýõ×ÝÔXór}cCªÕ¦@øÄµz®åg`žÞðVC »ùÑt8C®û³Óª!Á߆Óykš¤\Õ|¹s'’ìT””#98$Jî\²jÂ]êôïO ]ú¥f@#¶ýšª¥¬x´UmÈêUÝZ¥£Z²»èÿƒHô®ÝKé‘Ðã@1ÌVž Ê'Ó{?ð Á.žŒY¤?Îï”§1çÏÁ”è6€9ú{ëJ::åW—”¡φm»ýáI ïØø©ìs×]wÉK/½¤?}ôQ==§G(Tš=«?Ï6þ®®Ýºn¹Þâþòþr?×úýåìÙúëXÓ¹ÂåÔ€›ƒðŸv±7¡{½©ç/{ЦII1ÃZ»³bX ÷hû¿­»óüv)¯Ø¦s¤hœÀéµ[`<”‡{–•nÁÈÞ!'Ï:myRJÊò5+WLKŽˆ)L„6M‚ì싌Á>þˆVɘ‡¶ÃÂOš¤¤%I¦ m •R³m1”‰ÖJd36Â4—J,‡6-ÞëÎØ‚\µxD=®%> ø¼'oíxÏ Yíìù¨Ï¥¾_CÚÿöò 2 ÂO²ý¶Öïá»»ˆ)ÑBWànLŸž‡ÚõÛ§Ÿ.çÀFâܯ~UÆaW%öTw] ™ U]_}õUÕõ'0h.ûî»ïÖ=¡ú6Tš=—?Ï˸ùnÜŸ·§õüm¸ÏáÏ3ð[™P¡¿Ž[欴8à§ðï7ÿPÄ ðæ›oÆ¿ôÂ?館,û~}±¡xnçÁÔ¸£áèÐ-©øøê ;tð©6_wÙe_9çŒþ{_nUq¥[—áŠÌ ³DP&cÔÄH;4ƒÓO’(æÓh;ÄÖD Á—AóÒñÓt’ŽŠŠQ[ý¢Ï(­´‰S4ˆŠbû "a0€€ˆ  2Ãûÿ}Î:wukï³Ï¹ûÜsî½{ÝoݪZµÖªªUîS»vÕ)/»Ñ³Zõýö·VøÃnxâ÷ÀÆ•N:»Áý{º»âòF¼êj³o›ëmø±P¸‹y­vmÁãOÑßý ®òd‹ª€¨Š­{R³ãÖÈÓ|þ&`ÇJÇÏ)CC‘O}¦´v{kw݃+qàZw~J]†±øç>5Õ‡·ñzöÿâ Çep íQ/0cÛƒŒï†» ƒ8W· <–_¿ýô§?Åý ‡4ûOì¡é>šÄGubòhYíoˆœÖ£ý²êÏt£ôkퟃ;(&MšÌN©ð0ÞÁ{þ?­;?¦¸P£Ì°ºãž=»Gp!Œ{ûåÛó C ñó)Hºü®äj=§¾­öµ/¾ÐkÕöã]oXZó ÞŒôâÉp­ùðÃim—.kÕýWðs¢s‡Z÷³oìz´Û‹}ûÐ=ºsçºgö±›[Ð :` ÃeÓr²³Ša§fp.ý2ôê:>ü]£0"øÂÒ6îÖÇæc-d‡›ˆ× ÿ ø$ ‡Ã®¿Åë* ÒspîÁß1lÂf¨ÖØ,Õ½|kÑ3x•{f ãÆ NI²é‹=âÒÉg;iVk?y5Ø8¿¤'aÊk¿ÖgýšOû5ß²eË~ç>BÛñÏ4O¥ü2tÙÿžë×í¾k\çÍdñ$D©AG ú#ÿa`€Ö :.<­1%Åà°jõÆí[Œ‘î@xñ®;ÿØq›pçÄeÓ6¸³Nâ&ƒÅ¨ãã Oe;=ùH&ÔuäL¸ØÿyŽèå?Óé™4Huô GYb  ÞdÜúô'î…·ßu}0›ºôP|ÁX.€Ï¬taagæiÿìFþæ?B“ʳI—å‘èc·¼äÑ4íg\]ZFø5Mû%=>œ¸‹Q¯þ[>ò è8dKYùB<›€‹…·’nR³ÅÐ2Àí1ŽÅ½<†äÓžÀNN?]É• g¶¡‚’ÕÉ£¤ö¾‹&ßm˜³Àôy`î·Ô.,bÝûÌ"7ñæwÜ’uü¸ˆÃ Ÿ¬Y—~ÌD‚×râ²ÆÁ,?å :rî -ıQÑ/‹{|Úúƒ|?›‡lšä²°YÔÚ]xëB74¶?OÅÉIÃÐùY‘åÆž_åFþú·ÞlŠý¼‘Y¢G: –>º„.4¯u…ñŠ y…_h¢W\Ñ!ñ¹™«0(Wx)ç¥Ü5×\¬se‰|`]–c¨ §ìÀ¶m»ðéãž°?>xDñ @f`ÒÜ@Ãé†&ƒ€ t °ßf|D’ß‚˜àßrü?x}$^½uÙïßpWüq¹ûpK¶²³77(èüþVƒDDgÒÙ9°!I‡:= •ëôÁÀƒ,Ñå´®4¬¸ŸZôQ[wÙÝ+Ý´?ãËD¬Bÿ OýÉtÁ]…DaÇrc·‡»#þóÎŒU²—”Ã×øuœøƒŠÉþÓPè>>¡Ñš„µ.'aq)#Ÿ~Ò5Hغäa»x k×ǃAøÝŠ‚ó”¿bÞ²ÿhÕjo—­Ÿ|ºQØLùħعÛãã<þ3O6f™ñbDºmÚÔæ×R}sñ Eþ¦zx;ð0`_¶ÎwÃ:÷ùýÜäSú ƒŒà*!ÈCàËüãºyŠ M¢óä`ß΃€Ä€Î,SG¬ÀÛëkÝŸYåÞ^±ÚuÄÏ¡s±Èw~ëg'Q±t4”é€cŽs‡ÝqgpB!]Roa|ºó OÆÒl˜²Z—×aí×2’¾¸Âg]›–ð‹+üsÏ:ë,7}út‰æJ)g ¡nÙŸýòÀAƒ–ïÞ³óàÕ«W|™|°Ë!óää“OøÌÏô®ÌÀ rOÑš}[`¼}wÜÁŸý‘ð bù“€'1r@À»$|mÁj7qчnøA¸‹O:Ð îžÍóº;Ò·žòºçÖëèA‡–\ï–NÖ‘Eñþ1sVµuÿõÜ{î® :þ×ñ±ÓÄ.]çÆìùÈnÏ“¾æFÜp#+e)n‹êlb «Ó†É§iV§Ž³¼6&+:Ä ““xqÉg!*®γ4ÀÕ‹†Ö¨Á²èÐ[`”%S¯ÿõ} üíä¶mkk:à• •1–Ì8mÎLiLöìïÞµvÛæ=3ÇŒ“ù¼¯°y°äü¸î¿ÏåäŽùÿXë¾ìѵ£›pÂgÜWF´w8 2]Ïë5Lä:A¶3Žt ”‰B¬SË·ü“6îɹ[ñûþ=· 7'óè®owíì&tî{G_¬„b0ñçXÿó/t]ñÃl™âÊv4I.S§ªïÚx¶zm|T8LVdÄ­Ÿ« …ñœÅZ>Ö~«‡¶Eø Í@óX`><&}Ùæ]»p(?,±cÇ.<õ9íÏ<ùù¤ç):ì bD®¶öésà²!C»ýø½¥«fA,~ ÌXy œ‹¿þoàw€µÀÖãã¡Ûû»ûÃ3íÜúã‡uqǸÇuÀ‘àõÁ& ÿmT}áP Ÿô‹6Õº×nÃE$ï»6§õÅ(ßíÙÍÃW|µ4R#C[ì«8ô†›\×QÿTTʶ“QXê3LQX¼¥[Ý6>*¬e…O\_%Žrâ' :NÓ­ŸŸðY\qÏoøD‹§RnÙg,š]°£C°Ö?¾ È,ÄqÇSÔðí@fŠI£c ÀÁ-ûÚ·ÛxËo~sýŸaÀ] 0ÐbÈþ ? 8LwÞyŽ4Þœ?ß½úæ¼Ç®uŸ9°> ;® ¯uÃ{ìö? ø¯ïþ±©­[òþN7oñ·`õ:·•Ÿ=Cy_l¬9ß쟆•ý~8¥¸RÐiÄgÝÐ[~ïjñŽ_@w ¡r}ÃGÓzÂâmú–O‡µ_Ë ]\I7,LYÇ Oú¸/G]6,úµËWÜ |ß}÷ ¹Þo‰h,·Qfó'›;ñ“_Îi,v|9chÞHß™i{vïÙôÞÊ•sÐù9¥O8#X/ŠÎ<óLÇK8:ó° ne}öÙgÝk¯½æ›õ–{,ËÈoã{÷èâza“ÑjqA;œY€›1—hßvŸë$p;îtpÂÖ5nýVìÒ[¿W›mõ៺•ØZ»ß3Èï.èŠwø_< «Kz#\Ih›Ž¼|²ë=ñì ¬ƒ(ˆÓàE>Œ7Œ–¶å×aí×òš®ýÌ›‹_dälTw~)—¸"+aíÊÓ_hœ(è¯üñ6Ê€Cjñ„Ä7Õ5\õÐh4Ž i4>ÃA\«š­ÝºôB7JÆ‹¶SO=5H‡o¸u„ 2ý¥K—GXÏ›7ÏÍÇ쀧Ù._ñ'-~,â¾3»ØLs$>€wöŸÅLcPöô#ÉOÅ\ŒY]NãºæZ×;ü¢ ª¡ûäÂø}téxZOÓ´ŸrZ‡ ²Òѵêú 6œ¡Öÿ϶¤as4Ø0_ £ /½ôRÇ6­Z érÛsň™ŸCÉ+@V&`íÛ_î‰q:Š~a˜lP1LSÒçiEÄo}ë[¸üí¶Ç-ÂWn—ýÃí„Ì. dÛ8£Á‹ÅøÓJ;èë‚5Žþxª÷Å´/˜øäiªŽ@{L÷ûMù±ëˆû R'qrW ¯èóÉêl¾|Òcã}aMc¸KÏ÷”×|qó"åÕ® œm*èÿà EkTo£ øb¬u›V{;°³ãÚ ã±³ià`)F¢Ñ÷íÞ»®o—/nt.÷ÞT³—êÏ=Âùd4hPNÓÖƒ#$?ÂÄ›‰?ó™oº±¾évà´›u7Ýà¶¿3‘ߦûã¨ó>“~ä:UT¶ã–3ŸíøÌˆ•³aÕce$l])¸ÈK¼„}i ÈÚ°ÐéÚ¶#q¼8”?3Õa+'#îN‰ol7¿–)õaƒuÝ»oÏ@ªg‚ìüD1’ü,äiX|2üñõ×OÊ_v†Òݹ"zçw^*‘.±Pøývý§ÞâÜÿëô•SqL®ƒòjE~}Ùeô87øžÜ!Ó‘çìõ\Rî8®ØN»>9¯ý´ ¦‹KÓaúɧAêBh:^tŠKϰ–÷å‹<VÖ†…®´k¡é0nŽ;V¢èž¢íg{-+ÀP5í»ÕöÃ9y¸[~9 Ѐ|³× —ïeë™ì`Ûð^ +`¸†¬þûÊ%k{¸ hž»'ÞðwŸ®Lúuc`XÇS)ã…V;` ësõÿqŸzÖuŸt¥ÛoèHllä‚*øÃ¬f¿þ]¯K~à†Í|É ¼aªë€WQ¤ŒâÚxquýb;Ÿ+¼"+®Ð鯡‰nÍ/rÖݤk éœúÛé¿æ×~‘ „=ÿtgg´ “Æ™¤ü4®”ÿ'¦ö^²vÌÚµnÍiØÑ3H?¿¨©É\íM3ÐØ{÷ìݶß~mÞ-ƒYø{b ß'8÷Øc•Á·r^=éRál$òSEhR¡ ¥,­x²~÷â(³ÍO<î¶=ÿœÛ½dÎ$È|3OÝe °í†ŽpÆŽw]N9ÕµU¯ó¤ …ò—OôHg’°vÃt…Ñ)kã¬~¯ý’®¥Ù0õ .$Ž4í÷…µœ´ ¡……Õ™€d]-ü•pË> «ï;sãéá½ÿ&ÿÕ=ÓaPT È5X4ãS“„€À½»ƒ½B­¶×Öî—Û-‘ a8ÅÈ«mlUÔ³QHg–ôXù|25¿Tx+ÜkÐí̳Dáܬ7lý¢ÛõÎ|·÷ìÙ„íßÙ'È–ä"_­qIJ›!‡ºvŸûœÛÿ _tŽÄÕÛXx,lG+Eel§=ÅÐ}y±ò…Â:/¢OËÆÎ/qšßú}aÒÂ@Ú‚ÄK˜—„¼øâ‹B¦ûˆ4¶¿´–Rd.ß{oí¼~ýºOiÕ¦õ¿uÜ¿C0ÿá.8";Vë`= ;}Ä‹ò]»6½_SSûj‘ÉÄaÿ!˜¾ Œ<Äâì³3ï½I“Æ!•%|¤³‘È `yENøéætpŽi7Qè{±©d.4Ù‰Á`7N*Þƒ3÷‰ûpÙ>ž°Ã-§¸¯ ¿Û[áÆÞ}xeØ÷Öà÷cLÛ<ÈÕ4ÈÕ‰ʸÇ@C0ÑE~ ̃nÜš/i¿ÏL#Œç˯ÕaÃ>]Â#ú¦_ÂvÚ/üÔE(ÎpÕýÏÕ7HÚO s'áäÉ“õ±`k}7y*r$ wûí··}õõÙÇ~üѧÏãÀ^EMC‹‘>ÆÍ¼¨œY¸LòÄ€!¹|ú¯ö£Êãpå8«fº’¶îàšN~Ò5Ÿ¦ûü¤‰~‰×4Ÿ.Í'~­Cû%>®[HVê#®¾0¾0=até˜ZŸ×ÒtXüZiö)¯ã™žÈIÚ…ÂÂ'®µ©‹ÿÑGu\x^‚Û±|þ*Ûkó[Ð0–}@F[òÎ]xá…Ïà(©ñ#p½—p¤ôò÷ßÿàq/¾4&øåyIO®åÍD©$úu‡º¸Œ^iJÀ¸Â/®Ž¶4Öikë×26®P¸!²¥6º(9Û™¿ÐÄ•rÚ°è#~ûû^âÃä­>9q­=uXûO?ýôà~D‘ƒûgà?«pQÞBùŠ«,³ì—»4¾Ó‘ÙÌÒ?äñt¿õƒ5dæ¨}ƒî…·ßñD5”4DðÚ+ÓD# Jˆ4‰Wxèr ©yIãÕÚá7 fÿ .AÂô‹>í’nAdD‡ kYŸ_d£â¢x¬œ¶“.—ø-¿ [>¦­y$/ÂÇ0ÓäÞýJv~É—¸¼oQÁÇð_ªÂó–}À(ø007À6Û'?ÝúéÖ¸†Ëèœíñó ó7¾ñ³|ñ  íYÎ4°A±ÑÐ JèÒð„GÂÂËû 5H¼¸:Ž~¡Ó•ôé× ºÃ\­ÃÊj=ÚoetXò¡ùůùÂÒ²ùYºV^tXºæÕòB×4IOhìüìø¢›tËCšŽ&ýt'=*ÌÁˆÛË\ EWÿ%/e$!qgÍšµ½¦uÍsçÎÅ.ÚüÆNòˆ#Žè‰u‚ë¿þõ¯w¹ÜU¢ãC\>ú®³é3l;€4Æ ¿öS§„…—®‰×®Ž¿ÄK$,ñ>W§iåDÞº>=šfù%¬y´_çAÓÅ&ï£ûhÔcé’¦Ž#-ÎSŸº4 k^ú£:»çϺ3f7+=¹B­"ÞFXÊ5«×܃§å²åË—ç÷”¬ úôéÓzÈ!8‚¾vÉi§–¿Ì]º™æC48~‰Oê믿>Ðd+ŸDÒØ˜4HƒcœÈˆß†)'üZæ·~ý6>N˜r:]ñ“. ´$]Ñ-®Í«ÐÅ•x Ó¢1Nç—Oyá§K`¼ÜQ aÒ4¯ÐD‡„éZÇŽ_lç§<¿<:t¨VŽ(U0 Ø[V¾ööÛooQ‡#ädäÈ‘úöíÛ['_Àª<;­¡ÀÖp›(á¨úèöèìÜ ”¬lÙ݇Ïq·ÁÀ—â@Å?ä1è ‘7‰(®,w£Gv½zõrßûÞ÷²®Xᣫ+ÕÒÃdlÃÐrVg˜+£ù´ßò•3ÕY$Ý0ž0zØE~";ºð°ÜB—ô$NÂtmZ6ìãÑòô[ ÛvB~nÂO[­zË5¡¿¯ÅÈ oEf‹}ƒñJí]¬þï8üðÃ3Ûò$wY—¿×ßxãx*ü ŸS~w¬-6,Åó“À`C’vÂî=Ò­[Ý7ñ¶¢ÉKšÎ8V|X\!YÆ Ò#|âF¥)<¥¸¢7nc‹â‹Šóu\æWËð /|šN>¡Ó/`yHKtÅB+öu~Ê~‚íáŸÿ<Ï«ÍAoøÖæBEz|e)REÀ^ñ€¹Àœ'ñî~ä‘Gö‘×iA³ÿ8%\ŒÝs8PaÖÃWáöÙ‡5O~¦÷žð÷Àí·<ð@ðjPW ÙV:å„&®è¢+:|qŒº¸¤…èÒñ…ä Åk]â—²JXÜ(]a2"+ñ¬;9OOÊC½â~º"#4†‰lœ¯ã‡é}âZ]B×WnK³a[mîÊ+¯õ<ç‚@þ"…ÄÆp å?†Š€¥*æd̘1íºwïþñ»Ã† ÛE“nÚ€R 6¤U«V¹wß}w/ÅV¼2œwê=÷Ü3<á?âDAÆå‡ðs„ÄãÆù3@§'~kh¡‹¬k?㣄Ož4«CøèZ}:.Ê¥3JNâä÷8mÁ P…ò¡;&eØy´=©G>ÂÒtáW/õ ]ŸŽ¸4­Çg/K³akÏC@0Óuê# ? ½ótšÅú}å*Vù«fÌãÕßP,šÜüÞ8ü4èÍEð§n "îÛ±sÇÎN;-ï«hpÂñ<}r  |€q<«ý¹çž£×Û¥"­Á…â_¡°m ”+$#ºÅµü¢Sw¡‰L!×ê´åÔOoê¢~]:m_ZVÞò0=êó僺)/y KKâµî¸4-C¿Í‡ ûx´Í-?Ûçå—_\žM‹O}|±åæeÃ%9¾ò•¢¨ê)~Ê¿Æ=ô} a†ºrÊßXëÖ­sÜ`DÄ¢Ë^4¬ÝxÂ쀎mðïÄÀÐ3ˆý×DP)\˜áôŸ I×g`Vn]òméš&i¿u…W\‰—t-BwŒ8OhÑés%¢— éÓïë°¤ h^>ýu˜<6LË¥íN)—¸äÓàÓ—¦õÐoíê£ùxÄ^šÿ•W^qO<ñ„[¹reÐÆðƋѷÀó} ”êúÊYŠ®ª¤0¡^ãODÃk‹SU7à{‚.¾ 96<¾ï§Ë)$]îäGHü˜güõ¯ ®¸¦«u±R&ú FgÚZöK¾4n<:ÞúÙ˜Ñ'raC¦ÕÂoõI˜:å·9iRVʉ_xµËxa¼ÌŸè㡎°¸°òùø}´(Ý’wºÖN6ìã‘:=ZæùçŸw_|±Di—ûÿ¿ Ìû$]3Äõ‡•7®¼ð5ÊçÀ’X)îC=´ r?%âµá(üŽš°lÙ²“Pcå~ f®Wï^Ýè~@,æ¾9`ÕԦ̀'³p&ðæ›o:,>,¬H6<[ÁZ>Êø:Ž~êÓƒz„Gž®¤ñÉíÍã“óÉp°ã ü6}Ê0N:§Õ!r–.rŒçŽ;h||̷λå K#¬ÓKÚqõ„é×ò>»Xš SÞ¶ ËÃ5*Üûÿ/À’¾ü3º Vý ¬´X+èN3•Áw+G¢Ž‚»­}ûöbPØŽSÛ¹‘¨':;.Ñ­ÉSµiÓ¦}O=õT ŸþØyü à`"@~©h‘•F%aá¥Ë8]óÐO¢‡aŸ iä>e AXeÇÝ>Qq–Ÿå!JÇ•|ûtøh¢Oä%,n˜L±tÑG×gϸ4iQzøåß‚¹Ý¾\ñ Ì(ÛP+±z›ìà+ègœq0èGÂ8G BËÍá?¸ÆFtŠíp·ã)ÙO±Ãø}6ÏìÝ»w0mã}<¸Qƒ¯qH¼nB7JNxèÆåÓ2qýVwR '®ž(¾°Nϲ…ÉK·v²ö`¼¥Ù0yl=[ ÿêW¿rwß}7EN‚çY $å†Ù¡XýÍj+üE]ÔõÑzàgÁàë‚Æ×—5žƒŸãÌ"ûùÏìß¶ú¤’-]¶‘]ÜBòÂ'n±ü"—”[J#+$SJ§gyÂô†Ñ­ |¶ŒK³õjå$ÌÕþ¿üå/:éG8]’òÇ-w¡ôª~  PâÄã=?_D¯Ì¢¹€Wh"Ï*¤¥b%NÝÆ‘G7nÛh¯åöé ]Àò ½ëÓ[ª®¨´âèÔ6ñéŠÒF÷é÷Ù".ÍÖa!¹/}éKvø“/OÕD«ÈÇ@Õdäeð`ð¥ óöÖ›oÑ :,›¯Á ÝGY6|¤YÐ:´ßòÖºÄ_¬Í/:¬«yįËÖùµ‘7NœðF¹ì¬¶ÃúhÔaùØñ u~Ÿ.,R;Þ8¥ Á«ýJWY¼é1ël8¿ ?óÌ3? $¸q¦ðä f¶c„u²‹ž8®/­¸´8úÉqËdÓñéžbã,¿¯c’Çvr¡Yº¯ã[_˜4Êšõ£’÷úÛr•+œu–å òË-^þú믗ôô—Æ,n]ù>_Z>gxHÒ(Šך#y²n>W]Èæ¥.¦ÎWˆGÇ×I…ûØmÇ$·î£Ù§¾'Œ&¹âZw§*¨÷>PÅU…7êªçy+Aî*<ÿüóóÎ 8íê†J¿,OŸ–µ-*¬åâú£ôÙ¸B:mùÂø5Ÿ§P¼•‘IWC!ºæµŸqÈ%?IDATVŸ&ih]\ýW Ê|ú/ÔñÕèo‹€E~xo‹‚|_þÁäÄmÇõ5”8ÓðÉÇ¥q÷޾×Y­ºM?:sâo¯¥°1]~oðÿ€‡‘Ÿ†ðÕŽ¯!0^ P|±|Âïsã¦å“õÑJé„VO\qù¬þ¨2‡ÅùèIuü—_~9ø½Ï·•sPçróo‚YcË‘T¸T;ÚôÓÀZ$æ®BÁO¤)S¦¸sÏÍý:ðKª¯ñ–¼`±üyÂ(¶áËo‹f—0:å}qq;~˜¼Õ‰¨z·ŸÎ6§c¼ð£Ô³*´®PCí*ŠÓ5±D¾;Áû„tóÍ7»»¢ö¶ ¯¸¬ ‹çs-¯/ì“KšæKWÓ¢ÒÓ|ââ‹cg´<…è¶£†ýÆ·|LǧÛGãצæ˜oÉ&·û~XÖÎ/‰%á¦3€p+öCÔÿsG‡ñÜÀÏáNî±çE¿øÅ/Â¥‹ˆñ5Æ"Ä+ÂÊž*T|X\ÒO|–UÒºä’KÜÓO?­‹ÏÅ>žõ?v…æo°?)û§@tUpà àˆO’s ©Ê°i0,ÎWNZ9˧\Q厊+gÇ罕W_}µ{üñǵé¹ñÿ`£núIª~Ò@W¥ßÏO¹]x"0ï­É]wÝåFUO*©Ê©§¸ ¢:­+Š'*Î×é©3LÆG÷Ñø“ï—¿ü¥[‹››yàÌ|\ó¾eËÉ.Ý×ÇËÿ†©)Hª¥€2j/gc“Á'vÿý÷‡ŠXYe|aÈÃG’ª,›Fµ†}É—×B|…â}?L¦:ÏSàÊþ½÷Þtz_ÞA[ ä—~t’jSéP|Õ} "/ˆ/½à‚ Ü)§œâèçâ1 ®ƒêÚµ«ã¶â0HªÃô—›Ö©ÂÒÃ_ˆÇ×é™^˜\)ô›nº)ØRŽ ÿÈ£yÓþ²“j;éPZõ\±« ‰â²“à®B|añIUr˜þ8ô°TH6®\¾b;=ó¦·}Μ9Á1fªÏ]}÷ÿ ø*°âTÛÈûM[ñR5 \¬nrå7ÿªaU†õë×;^Dʇ4Ä­¼°ÆªuUƒ¿˜|Æá ëð,k”|X\Û½ùÛž5†{ðÁÝ#<| ’µë^¸×ù¡Ø§YZ³rÒ@êsÄ/Nê^Άì±øêW¿ê~÷»ß!âñ56œ3¬ÒW.éNÏ|…¥-ôýèG·LEábDÞÅP©¸¤ÚH:$WƒÚ7¿œ àì³Ïv?ùÉO‚ƒ?¥â¸ÂÌ㣸²|Î9ç8\‹æxQꀂ'’ÈÆuEo!~iü…øJ‰/FwT‡gÚ>]¼Š ¯¼Æ- N<ñDÇõóvë­·æ\Õ:9ÕÇIQúi¯Ur /îž¡‰Õä[ß…òœ…,TZ<ð'B;çÏ€ã?>hÀÜ?þÒK/¹5kØÎò G¡»qãÆ›x.Áøñãó™²!êÀÅ)N/ƒ"r÷?U%¿?"zá…;L\Ð(®Œîì|¥6{ölÇÃ34Ò;wîÜà†]vZß¶l‘Ÿ9sfбE7ï}¸öÚkn› H,3¿Ú›6mšã{} ¾ x°b |&OÞ`:xÍRUÄ¿#7™V×Àl{ì±îª«®rƒñŒS4ÜÛn»-xÉãÄÈ!‡‡šòîpºËŽ:ê(Ç—øá /°àÍ5×]wãÞö$@wv®ð|üáÇ;ž¸Ìã²_~y6Ž ßL½¥<6݇~8(›Ü¦ûÎ;ï·òõß´ð·:gJÒéE~óæÍÁ\¼CmÄÙ‚ç Ë«º Üð4à+†^µÁt¨ÚªÉeìmø‚ý9ŠßÃÍ$œ)Œ†~›ÁFŒËP‚»¸xÅKO,ðöÙo¼Ññ²Sòñ 8cFøl–ƒ¦ðzôÎ;¢6l:­îd|zJ— ¿–äkP}O[¾ôÒKõ}x’¥Àå¶j~c!÷1ȴع9 y:iNž²“'Of’?~ÇM;¶óç„Â=?AÔ¿‡GWgL:Tg½è\ÅN’åúÁã€_ò‹ÄÐq^À½îè£~p ÀµêÁUi^fCä¦%>aÙ¸(ËÕq~û@ .tÜÜÄ©ûqÇ| Ë“¦OŸt:òrƒ×«sEG­«ÏcMJ™ ¿©9r¤ÃE°//hQhze4‘çï1¿üiƒ{tT\ÿ0þG\æjâK€jª ^Ь>ÆÇ9 œ ìl(ðC•é@æ­/ðX rÃ*$ð3¦w(°X¡®ÀÌ4%\ÃzDÕMƒÂùdð ç¨Ò˜¤€zŸ¬Rq)X¥vªd¶ØÉøÉ\!üZŒL’§Æóøó0¾çwÐÂÁ ð=÷2`˜l©ôÐùC Ýor2h+!=~˜ÕÈ핼µTç‹egü(`’¶‡ºêƒRú¨OÆVLõ•4ÍQ1X æßyÌy/ —¹ÙÎú€{Ùù;˜ÈÁ€3>Y·'Üî@>uéÚöò)hkk€[œUt’ÆO©ùÔß´ð43c€ì°| 18›à|æi°=å\ÜL¡ Ø -B4e­B pÒ²XJö8øsäÙ,2͸€ämí›+|ûnB…ãË&¤«ÅªI€†U=Ÿ@¦¢žô”z”æCøYÂE}TR(ÑéP¢á²bg6LÜ+Íõ„†þœð*®0‘e*Çì¦:+lªÆK>fë3&î•æ ùoLÓ&ò‹F.& _NZaKÒ—¥×v{ˆ^ºx¤äÁ‘±M3ò˜2e»9ÚªL¦ª¯–O›J³Àa+×ʯðúùÙì?›Ãï\nø)p1í˜{)xv_¦ƒŒ |ïôK¡ÅJ¬y1]„âz·_jü;н£ýü&þ|`5ì Ý'eË%%ØŠúžò5n“ƒRú¨O&ÝTzÕÿ¢Q²’qEÞø¥Z€OéJÚ#*í­ÈÛøj1TÜ|ø:s)´rMaã–£)óñ€ üF½€?VKýr°ÀC<ª8P>äÛ—ÕÒ@š¢áw›LóDš ­’Á±Hü‚Jf@¥íkg·¨øJ{ùvâ.`5þt*«m|SÖ›‘òLYþˆ°¥–FNiôý ®6dÚéC«tðPd€¯*[¤@éÕÍC-5<ŒÀvM¨ÿäXiàO£*¿E…«ÅËS‚[¤@éÕýD¥Ã³q/ú~ë–žB2’\¨ø³Ê)S[)ƒTÊ›¥[ž‹X·fÅgeÝ>Y·šœ¡U’™0gÂ_¶â+A®´H€†UõÕŸ|&«†Ÿ©VøÞVT"Ë‘è¹À·€kÕúþ½Zì•ZܪgÂ&å¹ø§婱·ý|‹0ø ð²"äŠeíU¬@ù„îײúí[”BÉòîÙ@ÎŽ/ÄÜ€xþ4aZ-Ò áÕ¬³…ºs€¾§ÈRÐ_ò vú9%> XΠÚfyËQ^Â\à|àa øáy@ÚiNÖå: »÷Ê -ªO´¨Â–³ÕduO‚;ÈŸ|’pfÀðÕ@6jøžÐ;Á(³ ŸL1´°t‹ÑQ^€Ÿvövr@\\ ÚÕgIµåjµ—-s"ᤌ–Hfš‰þ àÓJžX…Šå{BO‡gI j毘™–d³2”µ tòœû÷³º¿7êö8q7CGsà' l{€„÷€qlÆCùTÔTÀ×K¡¥‚TOó5ØÙìü+ܰÆEçÕYü 16«§9;¡pòäç¡Qv ‹ãIBW»›”ÒÙ}25$&555I¨Iud,ð 8Ša ¾þz ÈÍE¯_n¶4`GR ÐÜ+ð6¢½^®6IH¬ß&¦(’lHí¡lh‘ndStCœ¶kWºÍZê6·!H›¦m\šÆ$í~°Ù‹o:Åwñ>ù Ùƒo{’ Æaø¬ˆ"Lö"³ž›4M'S¹÷»ßùî9'çä^ ùqZÓ/USOÅÂüÄäßò^C+ühM‹†J&G@Ó²yï³óÆltîoß«þcÕš• ð ¾”5Ä"áY i\ÔtàÖ‰ï15ÂÍLsX§ g8ocáŒ#–f45@š ÂÅB:K¸@8˜iàó ØÎä'&©’.‹<«ER/ådE² öðsƒò_°¨”é›­çmšNÑ|ŠÞ9}pŒæÕÁ?_½A¸pX6ã£5~BÍ$®&½çîti˜íeš—Y)%$¼bT®3liæ ‰šæÓíôP’°Ÿ4¿43YóãíP•ë1ÅõöKFôº½×Û‘“ã5>§)Ö@þ½÷õrŠåy’ðë´Õô[’:VÛÛäͦ#ÃÄwQ?HB‚Žd(à‘B ašcĪøL"J¤ÒitTy²8Ö;(“–íGxÉ_¸^õ[²¸öàûžÝ%׎¼…Å·£ØQíµéº²šua¥£ná7¹å›m« QþŠå±H^eÊO‚Q×u6æS—üu Ï2”î%vX º¬ð^ø*l O…—¿ÔÈÎÞ­Ë€q,>«žSÍÆì%ÒLÒëd¸¿ŠõBÆù1CZ¾$MœŠ9òÚP 'w‚ëæâ\/מ»Ì]áú¹­.r#ŽÂõE|!ð¾3¾>_·oˆa§Û¾Ódë£1Zë»Ó‘º¢±z”Û'ö=Žª²±¾±~V+´¢cjJ³tO%mN—ó“ï„ |ˆ®-‰«bWO+ o™ ^— I¯HÙ.°;í¶SÖ]æi_s9ó*péýÃë.7U^ÀÑs. 3uä °|^,ëÛ<ž·€‘;Ûc­=maº‹>V«Ût.[»«ÕŸÏªÕÝçä x£ü©# Ö¡_2 IDATxì}€]E¹ÿ·½÷’ìn²ÙÝôR„P¡P¤("ˆ]x¢ø}þßSчå>@ž¢"‚t Hé½l²Ù$Û{¯÷ÿû͹ssöæn:äîÞoÂìÌ™væüÎáþ¾ùfæ›0Ç#êE@PE ´­ÇÕ§UE@P" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€" €~Š€" (Š@" @¾t}dE@PE@ýE@PD@€|éúÈŠ€" (Š€ ú (Š€" (!ˆ€ !øÒõ‘E@PôPE@PBBð¥ë#+Š€" (*è7 (Š€" „ *„àK×GVE@PTÐo@PE@ATÁ—®¬(Š€" ¨ ß€" (Š€"‚¨‚/]YPE@P@¿E@PE P _º>²" (Š€"©('°°°ÑŒ¶¡(G€€Çã9‚RZD84ª84>š«(Š€"  JT”¯UJPE@84*ÍUE@P%º`P¾V}¨ŽÀôÿðéÞçhG¸þø·à£áGÁ…o…ß_ ¯NP#F@€#†J *;ãp‡oÁ¾¿ÿ7IôÉðÜn .žƒ^…72W€„éjÒ€¸hâQ" »Ž0§x"‚"øsàÁŸ¼® P{ð <µñðÔì€ï†W7ÐßíAðƒàT‚—0º À¿Å(y üyð©ýÕJJJ”©S§ITT”ÔÖÖJII‰ÔדÛ¸èèhéíí•îÎD·ÓïÂ? ÿ'ø^xuè‹ ¶nóCR¯ï7lßuögúô:<7pÒ_|ñŽñ žÆÆFãüqOAAçöÛo÷ìÛ·ÏÓÖÖfü¿þõ/Ïܹs=‘‘‘‡l×u߈τW7@8Þÿ_µ¾þæóP Àý¶n«àodr߄碽>.""BzzzLZBB‚üøÇ?–k¯½Ö\‡‡‡›ÐbËÐÆ™gã6}íÚµrÞyçIsssŸ{ôsAÀ ðî'_“ƒþx«SŽçæx[ÑúŠ€"Ð$ýWá}ä/W]u•`ä.{÷î5þwÞ‘]»vÉ5×\cÔúTíS0°!ð§gœyôîô)S¦È| ÐȽ÷ÞkÚíêê’íÛ·Ëm·Ý&î>Æââðó܉WÐA@5¡ó®?Ö'µ£Ñõ&³ñçÑí«l×'L˜ ¯¾úª@]o“É3ãhGÿ¶ŽÕØ÷a56ýk_ûš<úè£>­êmŸ p!ÛU|¨ øÞÉ@ì‘ ñ­aŸ-áa×Nf—¨ú_o;0vìXyã7Ì¥Å+ѳ€%lÆÝel=†þé6ÏMú¶-wÚøCùÁ~À,ëÖ ²~ üßà«áÕ1*ñË@]S`½¬`îª%Ÿ`îãIèÛâžßá}cbbdÍš5ëñ3ÝâæOèþy¶œ%r›ïŸn¯m{îkwÚÈ‘#¥´´”Íø»v$<ÿ}øFÿL½TŽ÷0Ð{¡kúÔþ+4Öã›_Ÿ4i’ÙÒgçîÝó÷vßǸï·sÿ Ýel:ëÛtw›Æ|ÿ{Ür w"t\ðUx„&*ŠÀ @àÀDä x}Eà¤"@úzxZó£úß'`7Î:Gá$c:ÚQºÝ3i$ðþò˜N²§s׳u™FÇë@i7Üpƒ¼ð Â5 Â\„ÈEƒ^Çm‹/Â_ ¿Ò›¦"  "TD/Så¤"‹»¿j ^`Ͼ!tKÌ$pKÌ6<áÛ<Ö·å­p`¯Ýy‡KËÎΖ÷Þ{¯€Á>.X°@V¬Xa¡‘áß…çN†¥ðÌì„W§(ße€?‡v_8™p´¼þ òç>Zó«©©1ÄM"w«ò­ß’¼YÎzæ1ÍÖs‡6ýhÓl?ÜmÇÅÅÉÒ¥K妛nòÇ’S\ÏÀE‚eðÀsª@"  `tà~yÁÔu; ¦>}B}á¡<$FùgeeÉ< óæù–ôéŠÅÊ?tkXùî2î|ÿt÷µ»ëØk†öÚݾM³åxÍ) N Â#ïSðÜA îF€‚Ÿ:EàxPàxÔú’Gˆº;ñÜ¿²Ï>þ|³ÏÞÿÚ^ÛЖgh±³Ì4’0;Í]Î’¶»Œw][Þ¦ºv·µxñbáBÁjmm5;¨Åðs<œ`<…uŸ ¾£Oðöz«A‚€ ƒäEžìǰät²ûñ ߟ£ÿxcåoòäÉò—¿üÅtÁýM5;;ÍÆmh àÅÑ5Óý‰i6ß?éÒúK$ضm{ýÑGÉ¢E‹¤¢¢‚]°îmDζ~2ø7ŸÌ]õ.ƒ Û=IÏC’Awžy1Ÿ›sýË–-“ôôt^úœû‡ÚÆ­@ÀB6Í?džÅÔ0Ó,aÛü@y‡Jc^ 6lš­{¨ë™3gš]ìƒ×QxÛ^høñ#`¿—ÿNz‡ÁŒ€.ÌoWŸíãFÀ7ÉÏy®¬'qZoÉÖ’©M§°@Ïk†¶œ;dœ?òôìb=»0ÐîŸç.oólCwî{ظm»¿ë•+WJZZšÛo¸/4®(Æ{Ò^'9¶[C† 1DîOîîk· `ÉÞ ¶œMw‡¼‡›”-‰»CÆ-a[‚gš»ŒmÃîÞ ¨^ù~¦„/Aó-*ŠÀÀ@@€ñž´—Á‰€o+÷ÐÛ¾%o÷µ%xºó·ul>C›fóymIÞ’¸%u7QÛ2õl¾­ëlÜÝž»[çæ›o6Ú ïkáïÈW‚ói¯E ?ÔPÈhº"pxÖÛ"eee†InGB%qÓ1Ï’8 Þ¦1´Älóºë1ß–g;noË’¨w ¬ãŸnûaËÙ>2dšu®™gïDzlÛëh>˜‹!ï‚/÷¦i (AŒÀÿÛƒ¸“Ú5E 8 }šmûÕÔÔdLë’­'QÚ=ÓÜq^»ÉÚæ1ôϳuÝ¡-Ã6Hè$k+¸Gìîtÿ¸9æû§ù_Û6h>˜÷s9dÚDÈt¥kTP‚ݤ/f u‹D4È…å9ð4~s<­ÿõq òÏþS ú£›(Å-©²1›oCÿ<›Î°¿<¾ û>º…›çŸæ¨ž™ââb¹öÚkeÛ¶mnMãø3á»y¡îÄ#`¿ƒß²¶J¨Joûc|VK8ã-NVÓ©¸ñ­ð_†?ìB7÷û‹_üB®¸â _IÔÖmY¿BþïwOHwW·Ü÷“G%<ÀTËòÞþÈ[²”nóÜemÜ’½}7þ~$$¨ µ¶m¶¹jÕ*c ®®Î>&CN<èNÐø‰CÀ¾ã×¢¶Š¨ŠoýcxfK2CÓ'«É"ܘÛÛ>ŸßÇ‘“““%??_Hú6l––£æŠŠ¹3ÆËœÓgc»\ºTV”˪5keíæ]R^EãyŽ+ÈË”óæ*C‡…µ½©ª¬”êÚzINJ@ݹrÅ wôì¾ùÛk†ô6­Û4Æ-Y"sæ» ÝÿÚÖõü¯Yo̘1R^î›þoGÒdøÌSwb°ïþĶª­…*„Úÿ˜žw £¾¹þ 52ÜîwñÅË—¿üeá¼ÿ=÷Ü#ï¿ÿ¾ ËÍ‘»?w¦¤FµËc_+«¶–Kk[G´S“âåŒ)y2md†,ÛP&늫¥¾©êó>sé¾:³&Ê7¾ùu™=o¡4ÖUIé®íÒÞÖ"gœ!ñ ) ß-X’°¡%ó@‚@ 4’·el:Cºçž{Nzè!3àë¼Y†àøf¿t½cjüúÛ ½äï]ôç%z$zӢ淿Ћ²F;  `² \c†ßGôK6VÈÏÿ²E[;dÊè\¹â²‹äÓ7C¢£cM+X’`HïN·y–àú“¾{møçŸ^êë¬c°Øa¸åN§V@Ýq `ßßq4¡UþæðÇF"p| 0 Oûü·áûÌóÊÏþs;vl@¶oß._úÒ—Ì"·o}ë[Âq^zé%yöÙgM¹ø¸yÿñ/‚hQ>X›î?Fó>m€—ŒùÿÝ!…–£æ€äÏ8DLœiuÍíò „€å[+¥³«G†f$ÉÓO>.㦞î”GYÂg;þiìü¡„.êûå/)ÿøÇ?Ì"Ç> æ"55UèwïÞí.ùs\|Ë ñ£G@·3­q0*Œ‰¦H8êOII1ªþsÏ=÷ §ß¼y³Ðô-ýÑ0Î׿þuÙ³g|øá‡Âùï„øX¹ï–³å‚SG:m›äïŒÚÍhi–ðyKÄ6ÍNPÀò(à9…ŠV Àk´…&­²¡]~AàÃ-•2cB¾¼ðÚR§¬Å~ÀÛ{Ùë@i(ÞG(..–_ÿúײxñbio?º;í!Üxãò½ï}ÏhP(,ÑV€×µ"ä ŽêĦjxTðªSŽŽA­o ÀwÐÙÁûFý‘‘‘²páB³ /Ы\»v­ùs‹ÉŸ.))ñ^lÝk•üœ yðkʸ¬!$á¢&Ù“€ke±üî•õ²}o5ÏuK*¶ù:!GîX4E†`q`Éžÿø£NÂöà>k§Ím;mR @! aOo|í±Õ²c£¼øüïdâôy‘¾¿ÀçàóðÖ3mݺuòðÃËòåËÍB?¦©ãvÈK.¹Dî¿ÿ~ÉÉÉ1S œVàô·Òz ×ÝŒðí…†G€ù6޾šÖPú  @8ôâXr Ïõ{ø‹ÜÏ———'?þ¸¸“Mœ?°K—.•»îºËŒ€]äeò9ê¿êÜ)òåkN“¸è‡°9r'¡r&1÷Êÿ÷ÙÓk´U?òÈ#¾½ò‰hã_¦öÄ:®™5j”YüÇ)·`Iߎüí5ÛãVJ¯£”BûÊ;l‚†ÇŽ€ ÇŽÖ<€€ °ÐØq П€ª+Ñì‹Èw6Òå=P?zíº ¿xúwÏ|iþüùagÍ›+7l€ýû.Ù´a3öå§`~¹Cbãäì³çKrJ²taOÿÒůɸ¤ýÒÕRï?·çÀYœF‡ÂÚËûŒSpøî.RNËâ?ü3dÏ8¸ŒDL27óñ(€r Ù£¥©|3šÒÛ½WC2G†Câ^¢÷][’7eÐ:æØy?2÷D¾Ï: Wàý—n(—§ßÚ!›vÛÂ>ûœ±1‘¸•_$›¶l7öûÏ8ã CøÔ¤ðÔ?Ú1X¶l™9ˆ”¾úÕ¯ÊÅ_ÜGp«ÿù=|ùË_–×^{ÍÞ¦šVw°ßâ hJ›aTá—"ý@ı’¿íßsúË /¾ðÂPEGÇ>þÌìTIƒjß¾ý’›[ ­]²aÝ©)+—IS&Ê™gΓšÒ26¡ü ¹£ùƒô Ùã/…x§ð×<®û8CÎ$tÖ²#r\3ÿ¼Än§zAúV@°£v–íµ–þ¬ ÀÑ;Éœÿ˜gÓMY§Ý0 ¼'ÊR‹À>R8xýÃRyÄ_¼¿®OWö"#%N>3gˆd%GÊÿ¼Õñàïr¹÷Þï›]lÏ`â ©à1È<#€§ rÍþ&&&ú°t ÜfÉ^ÇH€o· ;*;vZóº àûÓÈßÝ•Õ+WõÒhODD¤äådËÜ9§Cuî‘V­—þó_8½ï!™‡´?<õŒD…ÇÊšÕ$&>RqçaI trºYIÏ¿3êghˆŸÙ†ô½kX9tœ*0ÿ”y%f¯=i¤Ì½ùœ:prˆkü•A/öæ{øØ0h€æ~œ pVú›öx_´MÑÂÃ|ï}Lwx;“Ï~ÑŽGþòÎNùãÛ;dÕ±­è7ÅŸ¤„Y43[> ò¯nì”»ŸÙ.±ÑQò•¯~]®¿áFS,ÁЖçõ¹°»*^}õU¡a#Ú @g R8í´ÓLš÷¥¬Ið+݉W“‡€ '{½ó"°¯lo^jZzøi³O“Œ´LygÕ&ycÉûÞÞ í­mò—?ýUÒòó¥=-UÆ õ0rCòÜQ'Ò]/Ã2c½ÄOò·£~„F¿Ïkv„dOŽ21:a€qCÕPù{°Ó†ñMhèí@0 €ùfÍ€‘ÌdÈãͼmÀ¤á>6‚€7ÞÖÑ)Ͼ¹Mþ²d‡T×ùæÓÑÆÑ»¸Ø(9oJ¶Ütv®$˜‘ùñßK¤±µSþû?ï‘ù ¯õ5j†ÄÌ^³ÉþÑG•‡zH{ì1£êâ‰'|Z·ÀE….+€¨®AT§*ÁKÐ.ôˆ'ê3×ß4§¶º"²dw±´`ýâ;K¥¾¦R¢=5ù+o½!1YC¤5:R–®X%ãó†KafšŒ„9ßmU=’’Ð!)ñ‘yÉ7Œûî@ÒF ð²Cäù"Û;:g飯7SøƳ ê7f9º÷."d þ‡VAöŒ;DÎÀÉÃ=*Y>Lo•¼‰¾¾¹CžÄ ‚//+–†&ÇD1³ÅEEFÈœ ™rëyù’Ì’œVè•¿­¬”-8?àsWÌ“³/¾ÎGòþ¤ï&+ äy,2íPàš[âÈŸŽùÕÕÕnòg².$ ê A@€ yÚÀ¼ôÒóÃ:ÛÛÆG‚XÊ+«¤¶;LšÊöILxð4½ð®0ì©ïh9Ý¿¿ºRÚar·§%G’S“${H‘”Ôn’I˜}ŽôŽªIþÃsÄÏüîý61ÅAÝ,JÒ„é¤{ mø„¨ÿiˆ¤nÈÒ+8m£cÞY¶ì î½Ó¼6wâ-œiìyü¥µòÆŠ]ÒÒzüÓå3Fƒø/,”‘Ù±ææNÿD:±®àÿÞ+Çqĉr×~izArä¬`C·pë­·JSS“Ñüô§?5S¶ .Gý‡ .@4ªœlT8Ùo@ïHÞ|sÉ™=]í9ÑŶuvKgC³Œ–#§Ÿ6[²²³ä_o½%ÍÍ/U˜ˆŽ‰–Ø÷ß^Q% Å;%#k¶Tµ§à¸ÜVÉJáGjAtÆÂéQ 0L4Ó®.q±X›Uúaf~-PÚ€PÂzNmð+#¸fÛt´à=´ÖCAmñ”ŒCœmⲸ¼A~ó·UòÎê]Ø;lÆ{¼š`ô°4ùˆzO¤€Bþ= ÊeU•Ô5¶Ëw8śg´õ­ ß^3´äoC·ð­o}ËtôÜsÏ™y ÌÑÿK/½än‚ÖÿŽoÃÝšÆEà¸Ð]Ç ¡6@ú=: ›ˆ;ïüêÓѱñו—íÇ"À‰MI•ÈÈ^YpÎùR”_$éoR‹mjà óåÅåïÊÞòZÐ\‚„E…ÉÈŒ$™:v¼L5Z"›¶ËÌ¢hÔ4}5sø$fï4É<ÐsXÂsVꃩ P€Ðäa ‚„Éé³RqC¶(ã¬ÜÇ5ÒPÈ„&Í2„ëwTÈ#ýP–o(•®®îãËÔÍÍJ’›É9S²œûRذ¢ì+ûó…‡×Ks{¼·ì}‰ŽMð<ásY!À÷üH³q–áû¶ž×<èèòË/ÚýçtÀO~òg‰"ü^¨;~Üïâø[ÓBÕ„ê›ÏýóŸ?œÛÙÕsqnn†ì)Ùƒ=þIÒÜT'mØöçYö ÌÈHƒÅ¿*¤7KxG¯´4ÖH2æ¹»0¿^ÙÒ!;wì–ñcФ¦#Zê[z$+HߌÊ]äo3:ç0ÞqŽ&Ÿ õ?‰œ«ú¡òãü=Ä…ªÿ‘nR8œg ÿQ¤0Z“ãK¦Ó÷Ê£]!k·í5+ü‘t\.=%^®;»P>5gîæ>HÒhÕè(ÐGK»ªÚdoU³\qÞ ‰‰sVïÛ›³ ±pÏåÛ<†¶ 2åi-ð{ßûžÜqÇrß}÷1Ùíþ JþnD4®*ÁKÐ.Fàw¿{ì»s朙ZYV!É8ˆ†'ßVÖT˼¹se"LÓ¶µ·JFô$+î³?kÖi²£t7F£õŸ"­ ¿*ÌOï/-“‚aÃdOÍNLÄ9sþÈ3¤º ¹ ÏÐ¥k €äiFφH1r¦–÷9°r×à{s8#†ûQ‹.œÉ€g»=aòÆÛåñVÈæâc;Ž×©DœòwåœrÃy…Éþ¡ŸXáÞZëZtåUγ{I?P[.x4h˜"¶}2‘ƒ³Î:KÆŽ+›6mr7ÅyÿGÝ Wà@@€àxÚ‹ƒ˜ƒ#ro5[È¢Ã$/¸Ô46Á¶’œ‰ýåMMõ’>$[ââ㌛›'§Í˜%ëK¶É;ï.…ª?VÚ›¤!5EVlØ"£‹ ¤ª&‡ñtHV¶‚¢©öw“¿õš<Ó’w„!7G@ÀØu € yC´ z#•†$fÀÈÎæA³ÿ—·ÖâP e÷ÞªƒŸôR¸¥ïüÃå¶KÆIrl$Hßk5ÏE®>„ °zw )ÅË™\힨“8Ø‘àùL‡l-–¥ðÔSOs°Æèuk¾-¡¡" œT8)°ëMƒ@:òŸKJJoik—ˆ¨hIOÏXl9Yˆþ:»¤5[[Z!¤HVV–Œ=Z›eÑ‚‹dÅòÒÕÑ 5}‚´¶uHEg¬\·^¦#›÷m—ì4l´ 8þsÈ1£ÀHÚ8Ηc HßXòCY£> ÇR¥n1 JÔáÂ@—ëÄ4Åï^^!ϼü¡”UŸÕ>Û,·ô19Oî¼l‚ädxWösᡟ3ˆW@q í]½RZÕ*3'æÃJ¬v@ðqFò–øÝMö'X-€¹*¤¤¤CAþóŸmõK¿Å&h¨(Á€ý¥ ŽÞh/GbccóÓa‡žûD`þš€}ûöJZzš)AÕ]]½¤‚pÒÓÓÍIu¥Ø8*o˜œ:}–´5Ár`¸GÚ±6 ¤¾jÛ6éa·ö&áhÞCúlÈ8‰. Do6ùs¾Ÿž¥ì”wÂ7©¦¼¹´BÉ¥0&-mòÐ3oËü›!?}òFþÓÇæÈãß>Gþó‹§Jn&„˜£qì'þ[WÒ(ØM1kÆTGc6HÞ–ÀIôöÚ¦Ùk· `ÓØ ÖS ð£ýȬ ðvRŠ<îk (A„€ Aô2´+³ð÷’“›+)©ikVÔgdfšíxqqqÒ»ô#‹FJ¬ÒñÀšì¬lI‡%À½0M{!vDÁ]gK£xº{°Àƒé=0¼N2róeCbO¿!1ßà™BIÒY @­€„SAÆÿE˜‡¿œ ‘¡€€¾®¦¾I~øèË2ÿó?“Gþo±ÔâúD¸ÑÃ3ä_;Gùú|›ȹӧ£m˾SåŒyçö!zKè IônA€l¾M?Ü}¯»î:w‘¹¸ècØ©qE@89¨prp×»F€Œû+f%Ä'H*Núkmm–¢Q#¥£½C’“$.&¹Îˆ³µ­Eâbc`š6Z€T™0~¢Ðtî¬L™=ãTi©¯ucg¶¦ypâÝqÛŒxTB–lÞ½öTÛräÖ#æ×0Ù[V+w?ø¼œõ…åw/¾‡©ˆã³Üg»”›•"|ñLyöû åô Cmòq…;¡ýˆÅÄés.èCò–àmÈ›X²gÍs§Û<«`H-mÐJ Ë}Åר" ýüAÏ´ ¡ˆÀxèIÜ«Ÿ=¦};Ú1)íÁ‰yÆÎ<÷¯Ó=ÿå"¸Œ´ÌÑwca~7åÉÎ"ù8-°¦¢R®¼è‰Oˆ“ö–:Xl‘ÆöFi‡E¾Õ7JjrªìkÀ¼~t&YÍ…3Æô.u6wPØp<þ¢( Ž}bÚ¶]ûåöûŸ”·üTþúæ‡VÐßàÒSå럞-ý—ËE³ ·È~ƒ«jèĈ‰‹7„N2·Þ’¹%z6ï&ûþngëùç_r §ÿ}ŽÇBpuŠ€",¨,oBû‘  1åÏœ1Mêëê0 u—±,—Ÿ?äß)ÑQQ˜¢”H,ÄBA2$Çpr¦ÆŒ#Ñ RãdÑ‹ÍZOO§4BÐ-Û`O ´¶VâPo{ìâG㶆ô½äNÒç²}zc@ÇK´(c•þ+6ì”ëïzX.ùÒƒòú’µÒ­Ã‰p‰X>wÉ)òâ?%7\0A"íúÿÆ‘ü)ËÔ5wÉÐÌCþl¶?²?\z ÁÀ_ ðÝï~×w@nŵ´ NP‚‚äEh7ä‹À€B€QO;ʨ’‡cÿ~Ss³ š#] ÿøXláè=+3£þ0³HpèÐ!†¬ñGb°v`´0|îi§KöÐlÄ›¤+òë`  $¸fË&Œl#¤¢¶AjzS!:s[!{¥sj@mÿØX|vEä Éð¿%z’Øéì5C·s§»…ÿr¬Ãµ´ àrw"þüóð×ÀGëS“„€óKs’n®·U¼¾eÑ8eâ(ijwÔý´÷¿yófÉÄB?n‹„oiiCÑ0Œ.¹í,Ùýƒà£a¡¯£ k`¸±¾NºAÞ—]°PžzæiØ»3k:¡þ¯ªª—]eå’wuÓP˜ N•ô°jC”fñ™ŽÄOaà…×>Gž}]¶ï5é'êO$*ž9½P¾ñ™Ódxvn㸷ÌSX!ß;Ïàîkuc'vôH^nŽ!xwã¬C"'±sßMê6-P»îvÜùlãž{îׂ@jæyË_…püÏàŸçBÁóá àévÃ/†þĨXÐ:E@8€€ °ÐØÉCà3¸µYåVÿÂ5çHIs,æûaý$’3³tYØІF .™Ð4ò èX¬å‹Ä–?,÷3œfv ‡á â]»å¬™sä¥×_‘ºšFIˆŠ•†úFI‚Æ`ý®b¹  í).‘è‘… ŠÇzo=¸ïï_xGžøÓ?eϾ sÿùç”qÃåÛ×Ï‘I…YftÎ3 n˜8G둲3Låµ½»“fFõf‰‚·ŽÍ>D¸¿ÎY£PPPä#y·Äï®j ŸiVp§Ù²6ÍMü6áÌ™3aš9ïªÑlãùˆüÂëmš;¤Æ žSOÁ[—ˆÈåðð̇ô&oÃ׫S#D@€#J‹}¬|ö>zÄP‰IÉ—ŽÚ:lñK&Xÿëêê2jýV8Ã}ÿÍ­-†¨9÷ë,fƒU,ì1S$% û+Ë%ª7BÎ>}žüùï/À€P«4µDISw–D7uHMK³DÀ¾pYeµ´'$JJ ´8_à±?ýËÅ 2ÞcŸáÈáÙòëÎùÓF€x9Å@ÿ˜œ$Œôà‘Êzg =rìsCâDG!Ë:·0p8r·uZ!! 0cÆ Y¼x±œ}öÙ2&œwìØ!Ë–-3Ç»Ûè'žô'áÏ…çÔÁÅð“áÝŽ[/x®ñðޤãÎÕ¸" „€ A¢ Ÿ0Óq¿iöž7\{ž¼²¹T*wî’i8ɯ£½]º°ÊŸ‹ÿâ¡ èèè‚‚&:û¿3l‡ Ð‰„XØB‹ˆ—"”Û¾e‡\vÞÌÙ¯êÊJ‰‰O”jL$e¤ËêÍ[å‚3æI%¦23GËßß]&<ø[©k81û÷í31ÌÉJ“/útY4o¼åÓt/G÷t†4IÒa&ˤ‘Pp`È^MmxùÜ”ãS YÂÉ0|Y}"õ-Øú7rìaóÚ_$° œ«ÀÝB… D§&€qºŠŠ ¹å–[dåÊ•¾F¦L™"Ó§O7‹@9í³|ùró¾½®GHߟ‹GÆwàÏ‚¿¾^" Žf}"|ÊÞ…‹÷6w¥É;Kÿ%)0À3sÂ)--•…f”‡~H‡íxÉŸdɱ,ÃXØ`ί–/•ÕÒŠ}ùŸºèJyáÕeê„I°°Ojºš¥·¼[6íÛ'“r‡IcS›Ä¦ ƒ­ø*¤aKßM‹N•/ž!Qè¤1)l‰¤Mõ>ÿo‡á-‰Zê'ë›4Ÿ`Ë¡ªqNKnp˜:fÿŠ×5;€œü‘}VgÛnr·÷wÚ>ôßÃÕŽ)›Ñ0Õüá‡SÁÔè :Tž}öYY°`,:ÖÉ/~ñ 9ÿüógôÞnË–-róÍ7K Œ;ù»$•——gŽ!¦0ÑAÑëNC¸žš‚ Þ4 E Ž0@†&)Ÿ\ ã4Ñ’?®ªâ¤­ê¬ '‰ïß_&{÷îƒ àtû[ƒ-C°øsþá¦êÑ„o7¶rû Ɉd@[‘(7F„äüùsdÜ©§IsT‚D¢\3ÎHMM—bhÚ°M°tï^9zªÌ;ݧŒ8®ÇOà–¾E§Éë|I¾ kHÑ´%–s<®}v$!ÄìÜÖ1IÌ0™2œØQÿ­oí†ý„hàm«¶ghãÄÏ^ÛÐ?Í^ê€mÇ?oÞ¼yx—ûÍIÜ@§M‡Ûn»ÍGþ\ÿA³Îô,3nÜ8ùÃþ€²œòw…>.,\µj•¼þúëòî»ïÊ’%Käò˹$Àçò{þVø‹ày­NPüPÀ½üDàdôÞ1&!^Ê`¬§¥$Ž-dXµßÐÔ(QØ"—ššjTÁÃóó‘&]Ø~ ‚ ÙàÒêÆü?ÕÿÍØ2HçL ôšº“&M|ŒzóÆO– ;7a$Ü$á½Qf @ êW`j Çêî‚À³æ#ùyœv>6ƒþ.:çyõ×·É¿}þ\IŒÃ”Ùœjz +ðügIÝäÙ4–cœ¡·Œ)ÍKã¼[Æ+,°#L Îë3Qç4` €VIàÖ[’·!K[‚·ig¾?çÎ÷Ë2Ïà<‡“Ãùº—^zɼ7žñ@íÆo” .¸Àlý¤PÀ÷ÆviEæ  ä¼ó¸9@ŒM‡~Xn¿ýv“Oa€žBáC=dÚ2?\#ðøÀ—Ào„ÿ<üÁ‚DuŠ@(" ÿ3„â[žg6Ã6ŽôcðCÞÚÖîÂü=ˆ-.2&u›Ìè>7/×ô¸ý¢££0ßÝcFø\©®0sÿ´HÇÕæÖ-‰ŒZ€¬¬tÙY¼KvlÚ,­uFmÜÓÛ! íEHMy¹!ýýµ•›1\Î;ãÓÖÑü!qÍ?uœüí¿o•ÿúê%’É91Ïõ ^Âvˆßi•öœk2´ai‡4qEtÈ›éˆÃ±¬áu–e’©†?^ò7…˜h’ìPДuÒÛ Àóº‰; à´uð_w=ÿ\+4ø§[!`Ò¤IFýÿþûïûŠð)ÜqÄÏwÆ6èlHr§&ç'?ù‰l‡gŽø)HP;Àz éy!ëÜ{ï½FðÝ o„Âæ“ð‹á]ÂëÛ¦^)ôëðŸÏ'ˆ„ê7!…óù t\‡{šŸª{H%Vóóߌ#£ Yp €žüg‚@ A !PH`[ôL3TUVInöP)Æ^ÿ ÎÇú#爩ãòå™ÿ¼I»÷ÓR—ÒE§ð;g× ÍèŸBY±ç.f a†uì¢FbáetSß1Eì$™,FMÛŒ  GBp²ì½™ŽÎP¦h‡ NX"gA#l85|éL³„îÎ÷3Íw§1înÛæñ=P@¢Q 0Åìv$ø@÷°B¦¥¥™‘>wì)¸ïÃ6˜NÁk¯½&W]ef•ÌŽjüÜ<\/÷ßEàWL/Á€ ƒÿóš wíÅ{§Ç#‘Ée]ÝwË0hâãb¤­½ vº$BGÿá .(ãü~è;qv@|| ´ 0ç±)$ÐM?F {I¬mm²§¦ZZ eÈ–++V|(Ãs¨iðHbF¡,8“›튆‘G¾üé§7ËôqÃ0ØG§ ñâ&4èc¸×!t;&g‹vôÏm€q3p„#0 ¢ùg6âu}Úgy_†¹ÿ˜4„$|\á05éì¦è…•Á€%Q†–pm‹îЖ TÆæ¹ËŠó¹¦M›fÖ”••T„íø;+dð)亩F!€BbVV–<øàƒòÆoR[·n•çŸ^¸Áå8íô4<AŸÿMøÃÿþFøaðêA€ ƒþíæ£gf˜¹`O~‹IT öDŒæ¹ ŒóÿC`Êwx~žtvµÉ¾}¥å7`;Ê<—ÕÕcK_JJª9/ óÛÿxm³l)®éu›­€±xd4V¢_ èiï„á˜÷]»w”T”ÉŒl<Ô+6o’±cFÊî½²páE2ºÀ™zðGp¶ôýà+—Ë+ß.çœ .QÓ™wµ¿Qñ#Íy¨~Gÿ^v6uMœ7s/y³ ëÉ“æÒ°ºS–%yÉ £°yÈ0…YÌ#í]ÎöH«%WKà ýÓxíïlù@éþiþ×´@÷öÛoõ;ïªo­@}p—pס–BNœ8Ѭ1àw4kÖ,yúé§å‹_ü¢»*§ŸêàÃÓáÝð÷ÂS0(¾^"0h8øÿðAû¨ú`A†@Ÿ!6GÃ\ÍïÁ(Æ}8ú§ê8&€[[;dÕG«¥ Û÷ œ‘6Økq¨C.&kÇqÁñ‰QÒÑ%›·UƒºäQë8:ÿ•WJ6¬ vàPxX 6ɦý¥Òë‚ùEÂmgQX€ÐŒ…ˆQ©#äÒóçØê&LMÆ)}7ž/ÿ|ü+ò™§x¹–äï®üqmG÷F0`m[†‚+ßQá›qº7Ý¡lN8Z§¼mÂËç¼ì«þg†é† IÁ N:ËwuS¸‚åD=ýáÈ•ulYÆÝÎM¼îtwÜÑfH¡ Ÿnݺu& ÔF 4ÿ~ú—q_3Ωj ( Ø)¶ÁÝcÆpðïs¶ø’L„¿‹—Áß÷#0ÙúG¨08Þã@|Š)¶Ó©Ø{Ÿ'Ðåcë_TñùPçwÒ¤jwùò• ç2{ö,XÄo68­ªÿÖ¶v, Ë0kZßÒ\ IDAT°@”&^0Z¤§KZš° Gzí†1¡18#à¶ëaK¦³Ûh<0!¼»¢\vW•Izr‚¤§¥Êêõëqüp®lݾ[]ù9sæxIiÞ¸h޼õÄW厫çBHÀáA^‚6äσ„ìÈß;:ˆæ9tì„TýgÒY„äìxYMÛs²¼\å­«Ù<'êK0eM{¦3ÿϲÜ=Ag “!‰‘¡õöÚtý±u\I þDͲ¾çBœ«õ¹Žƒjyëµ(Í–·á‘”q—µ‹ ýŽ(6Â#ÍsÝórrrl5†©ð/ÀgòB"0ØPC@ƒíœçn»:~T¾Ì9÷\ùã?Þ°n‘3gȲ%ïà8ÜpÙ¸n½Y%¾pᅘLJe@¬ ˆ‹ŽÇ>å’ŒýáÜúGC2\ •(™±ÉL•÷—ï LÅÁ.) †9Dwíe‹äÝ÷—Ëâ–I4Fô°¸fW±L1\ІÈеë%S í­²·®Kn¹ájA‹IÖˆ½çµk®¿O¾w  ïÂ?´©ÃбýÏö8•a„&£YßVAäQƒ`ÔûˆÇ€qsí¤Yõ¿6NÁ‡íš–myTkï¸p–<ͽ½BKº-s¸4w>ã¬ç`äŸã\6 -‹ûdªãŸFá‚¡þœ»¼;nËSKÔŠ"gÏžmÈžÛE©AúÑ~$………¶˜Y ú›ßüF~õ«_™o œ¦z~|+¼:E`Ð  À y•îA|£ªü¼!2~ì$9³¢Aš›š%%!¦~[¡¾Í—T,þ*9;Ú ‰¼ ÇúÒ`öLC ü1çÊp4-0þ“'¯¼º …v¨ú£ YbŒk´iP ßõå;dÏþ½²³t·DáÀ¡ŠújykóF¨Œ‡H „‰ýK—ÊU—^‚„êp² ³‰Ý ö¬{1&ùâ^>ò'm“p9zgjò7 ÿXeLY'Nò÷¦É³£äÛÛùÊØû  ÞßÜiaˆ˜fÙ'Ó5_MFLûÞæÂa"ÙM¦öÞ$M_Ysþ°¬[8ð¿D¶®ê&jïÁ‹|Ørpo´e¤[öhB÷³r:àôÓO—SO=Õ4A‚ù\XÈ}hÃôí ИmxÝy_‡§uÁFošŠÀ€G@§ü+°`ªøG%•uͲ«´L’0oÞÒÁˆ?Ì< 0 õÐð³ï?{ýŒ*™óÿ<€»h-Žæõ=0ð“‘a¨Ôãô;ç‡Ä~£àÁJøY'È·° ,#)Mzp´p7l¬Ý½G–|ô‘쯯—¦®,Ü+qXŒ¸c×^iÏ“ndeCÜØIu¿±ÓO‰€£Rì\°vû&摘Q–õñº¬ @b´ähâÈsæþ²Îè߉£ë¦üu^8ê2n®¼E¼;m2‚Cë¾’Ý$:KxNcþ2ïxÝ¡ÚÈÎÎ6¶8eãïüëù_³ÏnçŸïÎ ç"A® à"Anµë¸Ë€ë¨%àÛýÊW¾bÖŸ¸Ú™‹øbøtWšF@ßÿ£ô£hçT­šÜá#ÆÊ¾2,ÜÃN€ôd8Á¯ {ÖùƒM—œšfûqKçò9òN†úžù$ŽþùîÁH˜[i*ã}yûàÀ"G½¦<- R¸è̳å¿îúŽÌ=+Óa §«¹Eb oöFÅËšM[¤ÃƒÃ…°³ ¬1RZãFu<›²GÝ$pgþŸ}rvPe盧CÓV`=8¾ýãÚìûçµiËÉ3…XŽÿǶŒ7ih—tνpÁy”e›Ì´ê+`ø*˜Zþ ‰®ÌáòÜ G:c›§mN´s÷Ã÷¿KÇ^´C~Žß”5@d5®"\¸Jù®4*ì«ð7#© ,â M•rè’ s¼©8¸#pŽöià§#öCòç¾ÎéÇÄÀnˆ™óþôÖV<çú¹“€DXT˜+a‘0òSã?91)8 û&Ž%ÿþõoÊ}߸Kr“S$‹G'%KmC­tc—ÀúM›$%-Yj**¥É“!]ë~$pŽøIÖð$V3êgº!i›Ži¤b#(0dªî²·,Îtþc{Ž.ßFÀ2®Ñ¿©âüAùÏŸs”qØoÉ2,æu®¨M:(ôiTà8x]=4-Ü¡ˆ;Pù£Më¯}w:ú_þò—òÖ[oÉ…^èFq?neàaC´´7áÞ]8' EÊjšdÈ?&2LŠ÷TJcÔ0L°5Î5€øA²æt?CÜ$`NpIþŒ!nC¦™kªå3äÍfœra à¾&M3uLÛdS™f¢Îèß”sò©½w§¤Õæ;‚¬Þà™[pÒáܡۮîáò©~§£ÀMºýÕ;’2ýÕµéÇ"аŸœà •\xÓM7ÙæRŠyþN^¨S** Ô77ðûÝJâž›Rj¥ÒJ]Ôù± ‡z¯Êg`$Fµ,WÉ÷‚äIfÑÑÎ<6çÿùãÎ|C¤0þ¶‡ãªÿHÉÌH”ªZÌé7µƒt9,vxL‰ƒ‚2`ƒ}Ø uÿ¢ùçJNv¦ì۽ݪ«o„ Ò.6n•žˆh©V`oS”´F8 ÝÄoí‘™¹ÆÀ·àÏ’¿O@’G/Ù“hÙo£Æg™m04×&0í™zL6y¶ Ë3 צ‚SÞ–u9ËЀR[Ä-Äí½í½lM’x­·iý…ýµ¨<çØéxfÑ:·p,d~¤÷ñ/Ç­ƒxÿ»ï¾[x¬±ËqþàWð„ïÏž€«¸FàC@€à{'¡Ò£Îh,â+Âq½Õµ8þ7?¶X¥+õ5Uf¯}l\¬³( ˆ„{‡³ä?gS÷X±Mm¤™ŽE6, {ºS$/7QÊË«Y”3 Þ‡±`œ9à‘# %oDÔVUËÍ7Ü€ùßxéjmIöJ9ÔÔuØ•°sW14)˜¦¨”²NLxbÐ ™—îx7Dïæše˜Æùy„†˜MÈKÖ·mÐz¾…¶<ÓÑŽ)z¨Ñ¿)sàÞöi}äŒb¢Â}–ˆƒ%x»?n’µõYæH­¨<…>ºþ¦Õ9TÚÑô˶s4u¸Ð”B1ùþ÷¿/]t‘Yé†5ÂæÆ&)Ç΂Êît¶è%m<ÚqúIâì“™j0÷>@þLwÈŸeHØÌsˆ›mš¾¢·“lÜ›ož—iÌrj™ª¦¶-βL`?ÇcíD;05u¼é6îÖ8¿s›æ_δm3û Ý„KB¥ãVN:wžI8‚?nÅ¿xíªŽöÚ¶Å*x!~óÍ7=[á•ðŽ™CW¢F`G ï/f°÷Vû7àØåñ¤ÞõèŽ?/u삳¥¤£Ibc@ưõß½×qõ';[±Ú@ÀÑQ8¼OmÕæQQÞÑ7ÒH&ô$%þÀÛl‚äéE›0}›;4EFçT|âc;u7,O GIyé~¹éÊ«q6@¦´7Õ›ö›Ûe?ÎX½m;¶…eJiÉ)®ƒñ¡Nl;t?I–ÄoXÙKî¼BšYð‡²¦_äe–#ñÓ³ŒwªÀjØÓ²ÌâA^s}?ëóNöÚ¹óXÞàÅ|^›†œrqÑáÆM·!‹Xüˆ¡GS˜æ.oÓýÃ#)ã®s´åÝumWµÉ?VW›ikØ>»)‡?ì›Ó®#8¸–1Ïd {C‹¥Mö¿fºÿ{q²õº·»ÎáòÝe'ÎïŒSNV¸õÖ[ÝÍ] Ÿq+w†Æ`E˦Õ)/ÿö_ÿ–rù¯o»§´¼ôŽêòʤ¡ù2ó”SeÒð1’3 ª‡ôHǦNÌé·šyýø¸xcø‡ Å–/_ë‘I8H&+;Kz1ÏoÈ[ñ yƒ :Ü)ÐÓÿšÃ›`&ͳd‰É’G:-Jñ®rퟒ÷W}$»KK1⋃ }ìRhéýƒ)ÛÝ{Ë$2&S*â“dhd;Ø‘BþóîÅg›f?>©›Ó̽LY¦9$ŽD#<˜HÂ&í‘ð Û;¡Iç3#Ù^-€ÝQÀâ4õ»yo³lÝÛ$ÛËZ¤Ä_^ßfŽQF#’—™€E€^… pì“í£Å„éÄÉôq¦»ó|Ï‚‡pî:¶×mXgÛ·×%¤ @‰V]Ž‹ž„¿¾Ù•®QE hP h_ÍàéØâ%¦Ô·4Þ“ïÄ6¿ÔTÌõDŽɳ¯>Ñ÷)LÉZ,þÛ½k—YdÅ×´´tl]‹ 8=núµÆŒìرc¡z-4s÷‘ØçOòâr ÇôTðSRR‚r0á†mTåºIŠDÄ&‡+p0P7ºå37Ê~ö_XŒnÎè ‹‘bÿ0X²‹‰Ä±ÄÍRŠõ ©-éá|6¨£t²Ï8S “ØA¤vôï-Ë~PsÀºì !vÔŒöö,ѳ!£úGÿÕ4tÊÆÒzÙRÚ$ÅåÍ ûV©nh‡V¤ïZÞú.ìPhÀ”FscNNLñáF2#Žnbw§Ùú ‘¶»ž»¬<@à_æH®­À¨l þ*çŸÖ_=û}øç³NgŸƒ÷p?£;½¿û»Ë³L :œVb9›Ç)«aX J;Ÿýìgͨ:þTøðê C@€ {%ƒ¯CS³²Ú¶õöîéú½«ò»1ß ã¿ÿ;‡üÀ´/Wü'âHßx¨âgΜ% ëa/>fx£"ÃeÖ©3)ÛM7Éž}û¡WŽ€ºµ‚ÁxI…!þÛѬE°#õòÊ cÀ%=+]–´R~öèÃÒ„­~-ù{@€%ÅÛebÞùÜWˈÑ#eOmükÅ2Y…i€g_Y²"qD,~ì»;Ú$2. ÂA´4ã¾a¹a°Q))ZzÂͺ=>×fŒè7ì®AX'»ö7È>llnÁN qÓ&Mšd<§©¼nB,*Õ뜹o„Ž?þã[{±oŸ{î#Aè1á18T¯fu{%ûé»Û;ÌÜ|ÜUVVb{àC ü.((@¼×ì¿ü*kª¡úß/Üð>Ôû3fÌ0;ü°j¥‘ç Œ–&œ P˜Ÿ/ßýÊ7¥Vèjëk1Ï_%Ã.’sçΕ1ù#°õ0FŠò‡É9Xoð"´÷ÿ÷OeÒœ3 ¹ï­¯‘p%ŠhÅžØ( ÆbO8…Í+¶ÉO~ó7©¬ÃÔF'Î#"—mE<¶\&ÈôÂyú Ù¸¯Î‡­»«þäÏk«ð®ÜõÜÂ;qÖc;ÖYÀn €ÿ{³eýCÒ=Òzþíº¶mùß#PÙþÒ8-Àé¸6À%öW^Ó“€ 'û „Äý¯†ÿ'j›Ú[¥µ¾IºŽ9FÚ0‡ÞŽwÒÒ¤ £òüá#dÈl³½ªººJN=ÇúŽJ܈©€‘E˜*h’ýØŽW !`æŒS$+c¤,ƒÀsæí¹„”?è•h£½§B¨X±f•|¸a¬Y¿Yš0—Ÿ†“y`P'öÕoÄ´BbBœ Åêþ´äTÉ–#/-}WÒ°^ +-CZ{·A3Ã?8v ÛÓ.‰½QFˆ‰ÇáEÐ ¬X½AJ+oûI¾Þœr4$-^Ææ$È”$üDÉJ„é]NG˜… "ãòâå½-µ²kë)wJ€µ÷˜$ÎÅ”ÄÔMö¼¶Äé®eGûnâ·ùvëÕåtêÛ²îðxˆÙÝŽ;~¨{*Ï݆;nûXUUåN>°ÒªqE P ^ ïÂÕD?Ö[ÑÑÕÑZ¹gO<á©MÍáfIvd´ Åü{=ÔõTûŸ:k–ìÝ[йûMR€;÷æsµ=IŒ.i]íRºg¼óî¹ù¦ÏÉÎŲuë6™6[¹_D ªjj”.,üë+¯ÊcÏþN*ÊÊÌÈ= ‡,iÎس·ÅI mß¾[:±¾ ÿ²“RdÖÔ™òÇ—ÿŽ51’A`{Å>‰ÀtENV®±ZHAxw£l-ö-ú2}ü¤þÐBnF¼ŒÏ#á'ÉÌ‘I’뜜è#03O} G“¡  {ûõ¿Iþ¨ÉæÜû¹NÌ·¯ ÿ®kÀ•Õ'j…®HÂTOfæ¡æîÞþùþ×}n~˜ [×øaŠû¦@l=[žÛK)à¸FÿÌâ©ê D@€ |-ƒ«Søñ÷ÌZ0o'xw7˜|B8¬øqƒ{~Þpü:†™CwF`«öuc¿ýСC$v÷¹R¿­­Ch0 ‹×¨^¥šõ–/~Aî¿ÿ‡öÊŽí;e<¬®_¿Ñ–¼º±š>dÍ]xí5Ìù·bûaäÜÂD,V Tb€Ó]½íÒÙ,]4ĵ²`pÃöu0˜'£³ò¥º¹Qz0—ŸA '=‡9}Z·âmÙX\ù‰¼°h`0,3Q& O”S “1ÂO†ðbí S.<äóÁ3ô rw®(vâ¢e „§î軀刟›Ø,žÌó'{w9ær¬ïnƒSéÀ.Pý@iþíú—9Ôµ›ÔÝåÜqÿöû»>’:<¢Ú5ãÁ¦®‡ÿü¿x¡N&T¦·1ˆû’0眲Ôâm¯U—•3¢(jÖø)^òí•ÓN=ÍìÙ¶}›¬…Å¿qcÇÉða°«Áˆª¥¥ÉËCX¨:æv@àÃÕì7n–ÓçœU|§´CXਜ?Ôœ2àÁ=…Ò†ã}AmmjõH$â´0Ø ³´Q±X¼…­ˆ ]Ð2`úžd5 `±¡š€³¦Ï–æÚV©ƒA+†9Ii˜vÈ0‡ÂDc:à}˜*nÁ}?‹Óûò³eÒˆd™V”"Ó ’$R3<ï¬Bw¶‚Ì ñ“ú]Be—‹Àó K‘åëwœxž‚=¢×’%1 †6´Õ™f=Óü¦±ŽõÖ ”A SXXhÚay·cÛœíóüËî:P{î:îx ²þiî¾øçQ8ÍÉÉ‘sÎ9W^|ñE›M À ðgÀo°‰*Á€€ ÁðB oß÷êÛ~_ºoÏ…½]vîØc:]RPPhv””ì–’=%Ø!Ðmö÷Ï›{¦Ñ DÀVÀâÅïHFë£Fâü üÈò0–)S¦`w@ŒÙØ„i8N˜íÅ O Ù¢a:§æLŸÃC¥fÝ@ìúÇ'%KÎ èùqºÀs¿ ½?ù;vÈŸåèXÎ9wRúüMMLÅu™<ùÐËÏû¿†˜­!¥þ„¦Û¾0$¹º¯y7Ù³<¯ÝnÛ¶mfü¤É“ÜÉ&îë»7ÇMÞ>‚w}wÛwywú‘Æm»Ô¦°­[n¹Åhª¾ýíoÛ&øÐwÂ?d4TN6*œì7"÷Çdøwïýî5µ5M£†b®ÚÔiRˆQR2¶ÑÕbµ>5aWÀtlé+(¢è€J¿MÖ®YgŒ¥Àîÿ¥—\,9¹¹Pýï” ì hjlØ„D³}0&&ÚŒÐÛÛÛ„ó°ÙY™Ýžb*)Ù%»`; 'mˆ$ÍŒ—Öº©†J¿[£Úº%#ïp,¨#û’RI\Ý¢a°‡ç„CKÍÁþe™ IDAT¬M‡êù{oʪ-°Gp.…ë ò’eJ!Fø£Óq²`’!|’½ëƒÃlÓûŽüyK[êߨÇ<áºõú‡8Íܼz҆¬ˆW< YGò¦#‘Y7˜à^ÇêØæš5kLõSð^¬óõÛ&"²5@äøj› ¡"p2Pàd¢B÷þÎß¶bÙ‡—§¥eDÏŸ?ߨñiü§…ÇÃb®Ÿ*{šNLLÀü|ì÷çÃ`¸ €bäòËÉ—]jˆ’„E5=·ý%C‹PS]›c0=‰íy‰h#ÑlìêêÄ®‚éX'°Eþ¿?É&XLGÞØ¢QÒÒ[%ñ·CË@íA4¶FBˆ‡e¿pŽþ»{%„ÍYŒe1M!CAþ™)©òốwWî8ìÛKO‰—1 üiEi2sL†ŒÉID‡ÔÉ¥Ô:psÕùFô0üJ„Å8Âfè<YÎÉbh“¿iÀ=èÏâ­"{`aDt””`AÞžM›$‹()ø“| A€„GÁ€¡õ¼ ëZoGÿöš!§hAo6¶wú§)àýã?T6Pšmÿ¾M?’жëú×e¾-ãŸÇç§F…S^x¡[àTÀð?÷¯£×ŠÀÉ@@€“zÞ3²7~þ¤©§Œ¡¡ªé÷——upFص°øçmÿ(ÌË7U´È«¯½)˜kçœ>­Î=ã œ½>K¶mßÕþ$%%Ý´a»T”cdŸ“)ãÆ2¨Z²ÉÍÍ“M0¼{÷nìñ—q£`C ³ÁÜwÍŽM°;Ð-—.¼X²²Óå£5«¥¶ÿ©êoÅ1¿‘0/ƒãŠ[a¯`wå>iï…#,¾+„‘ ¶†½²jårÒÃ#€ûº,Ø37‹õŠÒeöØ ,àèÚ1ÿ0R'ñþÆ?éÑ’‰ YÎp½—d ×;¤‹‚¦-†fÑŸëÚÛhßN¹®š»Âäñ×·H v;\’” ÿSS/?ð€ü?ŒRùN(PYül5öÇãnò·eŽ$d»+W®Ä{ro²Ïë_ן¼•óOó¿öoÓ^»Ë¹ãöž6͆¶ž ýËÙtwyÆÿ{ç§GUîÿ³›ì¦g“M!!$¤ÒE”KG½`‰„¿‚ „‹ØÁöîEEQAáªA)J EÚ¥HBz!½oz²ÿßoÞ÷YΞ̼ewvwv÷wò9{úsÎ|çÍ<Ïœ9s†ŠŸ¯Òq[`¾xÿý÷[õs‘`4¶)mŠ¿st~æ™gö:ð ýŸ8ar図g»ÍuuP*˜r‡êë…;Ïݸ`ò®žoèU"Nã€;ýñÃ=•˜–sΜèî~Ñ¢ÅØ#`)vò«Ã,öà‡Ò™‚#Ž8FÄj´Y†E„õnðÐÁÑ}ƒ°¿À[Ë^öØ·ß@7àÐ#Ü&ì!0ïþ? %þ.ÜùžùÉ»øPдi3Ü/=ãã~W‡™‰®øBàöÊÝnŸq“ܲÍ£5=woqu‹Ÿrs—¬‰Nܰ}ÜD*ü1µî¸Ã>;ÁQ à›Ap‘[¹ÓÀ?*ï¨S‘>þDy‘2‰ªxmóõó•£ö¦üMË"Yì6Á]ÿZ· 3.çÖÖ¸ý1ÛцÀC˜–ÿ!ÖTÐðDã€3¨üè-Ÿ]XœuÌÇÝý3«ÿbï.´vþ0M¹úya<®]˜W®«Ê ûÓqõ™Çõ)œþ÷Ë/¿ür÷øãG V!‡k„ŸÊTZZ›€ €Ö&Þ ûÃþè•+–¯ì6wÎýn=¦»àyúÐ!C¡Ìãµ½îxïöÃ&<;£ çðaÃñßz[1•_‡íu·âN™€)xú5د¿ ”W7̼øâtwë-·c A¼>8ÎõÀk}½ñX +fVÃ(è=øþÿþNƈ ˆ/qÛp¡~âÿžw7ßq‡[‚/ î;j4¾EPçæâÍ„.x°k]×è JÄǛ薿ö¢ëÓ ›îl~{¬vçœ4ÆrT“{ユZe@-B2Þè³€iFXž3âîúY7?;ÀüÜYÝköQ½ÜNÁäÊsr9€d÷ÒâJ÷ÔŒùî`l¶t8Ž‹îÝ0rذÉý«ÖÏþîw##ŒÏ¯scäHrŽióÌñã¦øóUƒ»ï¾;º3~ßûÞרŽ)àF™ùû1çÇ“ò|Ya}K[HVßÏKŠ'ÕåÞ¼ã§chñ(#ÿ‡o­ì·ß~ k ýx>$ÅÛ„Þ"zû?Y›Œ@vv§w0õõß«<ûìSðÞýͧO™RõÊ¿_‰î†6ãõºØ~·Œ*¾FÕ íºA å €m‘±ÀU÷»°ÇþðCó ¬6ã™ÿìÜ7Ë=úØTwä‘G"¿Ú­_»¯_í‡u|W~Þ(˜…Y‚-xÿ¿ÚvÚ±³à>Ñîon¿ÝÝpë-nÇöÐÑ»ðÞ?”ݶÜÝí.LõWíÂSÿžUn4uïÞ5®oÕ.wêØ*wHÍÆ%Ìÿ5¹»|1R J>G€ÿ­¢©þ¨ømÅŸÓávwϦ6µUŒ”kã:œMhžò_¹µÒ}åÆ7\¦¥¿?¸¿ëI n»\¶|µˆG$SqNø™Û!øCèxàW­Zµ‡òg]3’îþY~ÒI'E 79³Ã~Ì™bµ4øk’ŸçÇ­/',·´…l“T߯cq«ki¶g¼3Y,³rËgHç×?묳üµ×£øKQ¥&þñe7Q„š‰Ö7ɉ@ ¨¨øÞî;¶>2ýÕéÿ·Šü³xEꨣދ¯¦ˆW¥†¹ 'Eó,Å»ú3g¼î6¬[›»“Ç‚À½±CàpÌTá+v¯á5²e«×`aM´F`Û–­Pì§¹#‡ë‹º» ô7àÍ€5øNwœ«‚¢á.‚ãÇí‡Åg|åp£›õÆ\7zÀ0wá§ÏtcFîåúâ-‚þý†º^Øš¶º_W‹·N?ùCî ;Ó}ø=Ǹ'sŸšÜ#§ü!W{Т½è!=”7 ˆèÙ>wÝCïÞésÏû™Çi.òcËGaN9Ôçö×Ê¢6¹üp±rsŠÆÚñ|!ž“ÃD²Ã÷ý[¸-˜âÿ,fIú`¤ FC? ÕŽÄâÇŘeùíw¾í´H¥FENoŽ Ü^¯ O’òg[3ž}öYÇW=öØå*NÖ§ìP¾å3Œs¡¿½/ÏÏ÷vœL?ÏêúíYΩþ°o¿玖sðËs'!Î ‚äD M ¼mŠ·é0ÔyG'pë%·®?îÒ“^}è¡9z̾nòþ`W¿½Ý˜1£±©Îv\øwãóº¹wò9eºûÿWãë{|.Ý+ÖŸyþ7mæl·»â%w0žÝ/]¾Ê퀰ŠåùçžÅ3ÿ>x# _t·_ …Åoн³½ù<Ší-ÌLŸ5Ó½…OÏæC·¹á=ûÁpèíÎ2ÆÆ»;Ô2y‚Û CeRì¸êyW¿~Uî.Ê4rù:¸áΟQ>Õ5²ñ7ºsG"—ÃH.Fƒ€mŒ‚|ÛÅÏÂH8B‘Df!M!ÈÍ's™ñvÿF7oåj÷1(ÿɘ% Ýiø(Òóxò×wÝåN»ðÂènž+õ}#€ŠŽ†ACÿbŠŸ¡o,˜|æ›»úê«£o|L¡Z™…¾ìróâêûòü¸ÕµÐ/ ã…Æêדey ùý~þؾ„ˆ¬±ðÁ_ /'mF@Ú }ÇêØ¿à'Ù|å;K–.½|Ÿ}ö­âNi£FÂ+aït}° ÐØ gv‰£Âç×ÿxÇ=çÇ&? ,À+|3±!s«±ÅoeuwÌ s½ñè`÷v,¸Úµ{ô÷…†¬ÄÞ㢩ýnX À‡íµµýñŠá·|õz·{°-[ëðA!<»ÅØN¼i0zØ`wÀÄ n2f"zcÆ`õâ×\åê—]ÕÆùx°‹-‚ón‹~¤€M©çžíç´2Ô¿)qèÁœ¢Få¼âÏés*ðœo¨‹~÷§ü)ß/ÈuEQBUrxës»Ü-S_u‡ã¹ÿ—kÁ'Á=ŠoüÆÑ1£G»_aµz?ì¹@…eŽŠ‹Ÿh6ç+æÙ¾ŸoyþóŸÝ׿þõh¦æ–[¸%þžÎ8XI˜NÊ´ß.)žÔ&¬ï× Ë8[ìW¬ž‹\?ýéO»×ñÚeÞ-C¸|îyå–úc*±‰ª‰À4°e´Lç÷Á~ü]¸,öÀÔol´Î½ôâ+xÖ_}°gæŒÑ»âÃÆ¡ÀkÝ¢E‹ð™Þ¾Ñ~ÿÝ»Ôâ5½n®gu…Ãf¾nõÆMX XåêÖmr]±•mý6ì¸Õm\ƒo¼µ f@WV`á^åƒAÐ븇ÀNXC°Šÿ¸ãŸ8vL´ö€¯®œ=ÕU­xÎuÁ+ƒyµ‹‘¼­m1r£›\*lüã9º(³DŠq¾Ú@I¢{b«Ç\fÒ7Šçä4ì땳^T)7¦\“¨]ÒŸ¿M«ˆ”ÿhïç¡ü9Æ$w<¼ŒY€©óæ¹›¾{¹;û{ߪÖ`“&®h÷?oë+yV2Eoù~œö¾òÊ+£Ç8×]w_Åã”X©y¾â¥0¿]R<€Õ³0”Ö·4ëÓ‡c°ò0dÝj,X½âŠ+Ü”)S"ãu†Â ÿBX_ih-2Z‹t'ï¯uƒÞšð±}¼r.¶ô}lêT·áÁ øÜï>Pþ]¡ü7á5¾ÅX±ßÃÞg4îÐwD†À|Òw VþwÃ]U÷Ü«Uبgà€ZkÜ–kÜ !ðÈ`;^qÛê–­\MÿoXM†ÖlpúÖâ]ÿ¡nÑŠ5˜XŒ[· ,t Å0%ŒÃ^û]ÜJ|phù›Ï»ª5ÿvÝ6Ìw»·7>[‘Îe™"5%³ pdÔ¯T ŒøSô,BVôüߤ"oé~¶§°HB¦¬_†QQ.?*,ðçáY•î·¼äF@é|c`?¼ý /Ð+Ò`$\¾b§»ö¯wºÁx ãýçíÛo¨àé|Eï+¿ó—,Yâðúg¤ìnºé¦hVuŽÉxaX¦Y5Néúõü¸':Šúm­^&õÁ|Öµú\ýï;Ë÷óÂ8ßà‡¬`F+ï&!”`4¶:­Ž¼sv8zôÄÁXà7zÓ¦µÑ"¾^ØýºUn¶üí‰OëÖa!ÚVÜ…Á§€yç¹ JtfjúÖ¸°Xðñ'Ÿro¼2ó¥Ø˜ßóëåÆÍ|j÷uKW­Å^õ0v»W_›½ÎV £¡G¿ánëÆµn5ÖlÙ¸Ú:ÀþÑSÝx¬;ؽ{›[4oŽ«[1ÃuY7ÃUm^‚oð¢N%8?ÖþGŠÚ+*xwúl•äõ7]¤$ò S Óýhowý¨˜ÛEõ©x"Eÿ<øF…ûÕ}¯¸!àsÙ ~®··˜¯PcÖûúÀþî |;á²_þ2Ú«áÔ‹ø˜:§ô-4C Tþf0ÿ9|!ñ‚ .ˆÎð- :;æ(ü Ë´¯¼­iXÇOûqÖ÷Û[Yš\?Œ«ÃY_ž_Ÿqkæ3Íß¶çº{qEE Õ h @«#bH:º/~ñ‹o®[÷àÆºMC¸­n,>ã»ú|—¿?žÓï€ò^‹]øø5@*‘X Àïýó¢¹+ø—,_áÖoÚì6a}·ùå—{*°’½/êî5h°Ü¿6¬ˆ^YÛŒOôr¯!C8ÐÏÕöí{¹›×º‹fºíkæ¸Êµo¸®ÛÖDwµy•4|ä7hñ|\ºA1#ÝéSy7dæšE&E>/*Cœ‚å7Vü&žoX|^€öÇÍÏïrÅ3ÿÁx$r9”y?ì·P®[¶s—ûÖK¬ß“÷ßß}ëºë]¼!Agç8Iùs³ŸÿøÇîÀëÝÍ7ߌßݘG~@åó,ËBe–JûmýzIñ°~XÊŸïú‡õlì Ã6VÆ|¾ Á×)óîÃï±D9¡ßG9íTW|šði(Þbzõª³µ®~`6÷mÇ¢¨íõuxοí\µ$zFÚµª[ô8€»nÝŠEzØÅò…¸³ßéŽ=æ„é½úô™>óõ×ÞÙ»¢jßžØÍŽ {ìÄ—ý*«*\uÅ6·Ïð‘5ÂÕô¯q}jz¹nx\°}Ój·nÉ¿±™Ð,W¹ÂÙ²ÜUcá`î6½ñ»$yeÕÅEÝ.Æyï)nTÌ»¨Ž§ø™¦â·ÙùœŒHãs@hE¹ÖºpÈWý®Ájÿ'¦Ïqã±ø‘Óþö®á–{–Ç#‘«°WÀ/ðøäïØvù‰Ot§zˆ;õÜsÝd|U‘Îîö¹Ýí ¬±àV·ÿüç?£½þ©O=õT÷‹_ü"ú&ƒ±ñ{ŠË³ò°ÌW´¬ã—ûñ°¬Ôv¡ a™)«†mü:wáM Oùsñß³~¹â"ÐÚ4ÐÚÄ;hvwwx=öX÷î»ç{«W¯øú&¼];Ô®Ø÷ŸÏÁwEïS×GûDŸ¤…ÖcÈ©þ]؃ŸÛWUwßp晟9å}Ïžü/wôÔÊaÿøÿ@ ýWÜñÄÆ5}úôucF r{õë‚ýª]×ú-n ¶áï‹…‚õXÌW¹c¶Þ }¿àºÐØíx ]Øß¾So¬±­M4ÍÝò£ÇgŠŸ >W‡íP<Þ–e=Wlíâ®üË"7û­î(è½wíÚ9‰ ḷ¿}{žÊwÁÌ·©e®Öçôxe}WÔÅú*«6ìØ°znÅ÷*¨Áé/Ÿ¹lùòëªæÎëÊ•ýOãqBß^ÕîÛSöu»ïv=ñ¥?Êñ•;{‹\þ¶»aAµn)._-šºgýhüÚ…™J?7ÏŸ¯í?ãG“Ýù59ź¨Õ,q(ìõñ¹]Ýõ÷NÇZˆmî ¼y>ð“¦;\„–‹a¤=³y›{†À:l†Ô›%ÕŽá ½Êy"f Ž?þx× og„Îx”šÏz¡‚e^(ÇOûqÖõ]Xæ§-nýYšíý¸//Œûõü¸_oÞ¼yÀ>„2þ†¿í×Q\Ú‚€ €¶ ÞÉú¬éÑcЪ•Û&îØµ3Rþ\õK,®‚PÁPÔ‘>æLðê)nDº`JÆÁâ¥k·n °Ýˆô¬Û·ÿ¾–eëÖ;÷åëV»O;Öñ.,¶‚8.΋tj^é³³éò%Œ4É5ºàCGrù'RæóJŸ]ÓhÈ:Ìg6Año› ×ÿs£{üÕ7ÝP̦\%=_0l)7ŸYYÃs†?xª›|õ»jÄ$¡VXÇp\õ°.ëøy~œe¥ÈòÛX}?Ï[4N¹…±¿ú?¬Çºæü²‘#GFmí ¨³~–ÕU(mE ­Ù¶¿úÍ8\{by"÷âþü¼ònŸŽJžq†ÈÏ¥sÛÐ"'dXtµûM,0Û’Ïðƒ©Hßð,u±ýá¡™îŒ_¼æf¯äÇ…hN@ûZÈ8f"¢×ò,¤.Åçë³}ä#Eþ¶ì¨/”Q©0n‹ûx·ÉÆÁúù1äûŒÄ`”Åäþ™]Ü箟គò?Û_;ŸB†òçä–öƒÞq„›ü??Цñ‹-ÌgÆÕ1ì·³z }gù––û²’êZÖµú–gr-4VÞ0se¼ÐêxY Q¶ûá­sÉgÒ`ýrCED Èh#ð¥Û-[vàÓ§»ŽÂþøÑ-*ßÈüéqNÿçòÌ0C€!®Ÿëñ™ÆÚ *‰þÌÇߣ௄§ŽŒÜšõuîË¿zÑ]tË|·|SþbŸWÜ F¯À£çïycÁò#…¼ Œ3¦ìiP‘˜Â”>ªAéG††Ä†CS,Q7ùñ f®©r_þÝ"wÝÝø2!V¡wý— ¨q=hDcKûþ“tÿïordò†‹GœòóË,€-?®žå14gy–öe…e–¶mLñ3Î|ßY: Y‡¿[sVni?Œ+{ÿûßí†èÕ;Ç‹+*mB@Ú{çé´²rwMÝÆÍݸˆŠjŠwü¼@R¹G×^|œ·ÿ¹»*3\dYnQ†]»V7¾Jï‰o'²øLõ>øà÷‡ÜóVºs~ºÒ6i¸»ääaÑÂ@p•]4†(–ûÃu¾³»x˳âFí noä¢ ÈŒòù‡ÇÔ¨FI‰WWU»[Zì^]¸ÔõÆã³±Èï£xÖŸŸD)IFs+ x×{Üþ7þ¯X¿\ØyKêÓW¾V'®M˜¦ÙÖ—–ûi?î·±þ-´zaöeõ-´ú–N ?ùÉOºÛn»ÍйR’3k,C¡´6âÿ£[{Dê¯CÀ°=zþÎ]Û÷]ºtáû¸Á–÷Cæîœy§Œ;üÜchלa3î¢+ê7áâYã|ì_Ð=R>ø*< ¼ €îàŸ}©;cær7qŸîü÷rcjswsÔ=ú>Ûûš{EixHiÐî¦ô£†ogG‚JûÃ1<³¸Êýù‘nÎò•‘âÿ>vtFMo×·55?†;èÄÿt“~ú3ž KyL!ek$B™ašõü¼P¦_Ö ÓImM†…Ií¬ÜBÖ ]¡²áLJÕi¨>f*-­E@@k‘î¤ý@¡oÂEqöµ×üÏ_ý•“ªªª+zá•1^(sK› à´ynzœ¨reسçŽ[Öïzô˜cŽÉ}Þ¯8G,9ˆüá÷áÏ…~çÜÀeúœîøýz»ÓÚÛ½ROW $r6]ŸO¾xfBƒÌ+Ã(0ňcb#K¾- ¤Øü]Ý/Õáùþ·®n³«Á÷Çûõu§÷íUòŽ~%uTB%>ŽqîçÜ>ýWþ˜J?¨PÑZw¹sj©=ð“%•‡ù¡ì°¼PÚokõ,Œ£•±ÅY€ïü2??ŒSùÓpÀÑ·ø„¼c…"Ðd´õNÖ'ošÏûì¶^ÑZ,øãÛ¹…x\à×ÊŸo䦘yÑ…¡€7Õ÷ì¾ö—W_}Íݸ€îh²YhûÿàùH€ÆÀðч†Î9çÇ Z^ž>Ý=ûò6¼Ç^íöÞk¨›8²ÖMÞ«ÚM¸3ÚS€õÓp›ñúÞœuUnö’ínÚ¬Õîõ¥+]?{ áð±ÎGûõqÄÊþáU6%‘F¯åÉè3é7þ—¿rÕxÇßœ¯@-¯X§ãò|9Iåaÿa=?íÇýv–o¡õ›”f[¿ŒÑ@5ç—1/L[=?äk„Ü øü£eïñLÀ Š@kДՇ[¿q}~ò—óã¼XRñó"›»Ðâ3¾˜È¹G»vîZ·`Ñ¢g ü9¥Ÿ†ãŒÀ*ô‰O|Â}õ«_…ñÏc·AneûðûçŸÞÝ;õßîÞ|Å~ýúá³Á5n06Ú«Oµ>¤»ëÙ³Ÿ#ƃªzמŽÛñnƒ‚§«Û^áVÕ9·bÕ6·zÍ·bíf·[ë®Æ÷ L…pAß8¼ÃÿÎýÜÑ=»»!H·¥ëÒ½‡Ûë+—¸!g|*†¯<ãÆUŠÂ³vIu“ò“úëûi?î·÷óý8Çæ§-nm™6ÏÙ(_ùÛqYhm-í‡v÷oyü çFxqEE Õ Èhuä¯C|¦wø£ù¦zWýÃñ¢É‹£yæñâËtTVYQ׿f0Ôhªî“vÊ)§Dýð­nc{úé§GžýÏ;×½ð nÚ´in:f.\èæ/|Ëm >k² …œÂï cg 6Ó9@š„wöÀLÃ誖۸§Ðxö(ƒÍRsÔ1nŸ^áºb‡¿B®¢‹k—T?.߯/'®žŸçÇÙΗ–%¥-ŸmMÑûr(×ê0N¦s¹{þåoÉwLÏ™3ÇÏšà'Ö&  µ‰wÂþž|òÉÞ]++ÇâÒÙ°=¯]DsrJ{`LÀ®©ïQßpÇž¶Þ&‡_l06pafŸÖÿ¾ûîëè?ö±Yõ(ä³ÛÙÏ=ëfâ+wkñ)áíh³†ÌÎhàÅÂ^xŒÑ EwÈ«Á‡¸«†ißh⣑¤l$zbºø¥ßp½>8“RFWN]“צ˜²eÛ°]˜f_NX—öóØ–»ôÅÝåûõJ ë…ÎŒÎ6yŽŸY ¿ÐËSTZ€ €VCÝy˜€Ë IDAT;Âãºt­ÜÝ‹ÊÞa /†T¶¾CV”Ï<^tëwî^9¬ækkxoÚ¯ÞÔxÃãÞÙ=ºAÇä,°‹¶Uýï÷Þ{Š;îô)nîäVþü§në‹Ïï¡ ¬~VÃã&º¡Õõ=∲†*äƥÔó¶É Û…iÖ óB9a¹¥ÃÐú´öVn鸾¬Žµ Ó–Ï0üíXÙ~ðƒè1ÓêÕ«-ë$D~c …"К_…[³gõÕiL=ºßîú]£xÀüÁQùÓÛEÒ ^XñÉà ×\sqãe×V¡éáKÖô7¿ùM¤ðí"ξ˜°òncƸ×þÒ¼õv×çý§¸®ÝzäŽ Dǘ±__¬9úx7æ÷rû݆1¿ë]9C+Üvü…Bcç‡qõýr?Nvæý|“æùiÆYÏwv.,Ï/7™²Ž_δß>n\¬c.l¦­Cû][žŸæã¦ãŽ;Ίžì'Ö$  5iw¾p¡¬èÙ¿z¸«¨•˜È-vã”oöUVšçz€ÜÏÛÎæ¬þ£mkû¢çû]tQôÜ׿˜3î+¦ýr e¹åUå†^ö]7êÁ‡]íÅ_sÝÆOÆÆ†| ˜Õè6b”ü… Ý„GŸt£~z­ë…WÑBgÇhaXî§­Ž…~ãÆ..´ºÖÖBËgXJžÉöë[»04ÙÌ÷eÐ1ŸSÿáô¿_ß[›¨qÌ_Ù³8L33IžÃ£19hzÐ6Ü;O¯˜Ú_þ…=0нK~.–Š>ççw**º4(T^lwïÚ½¥[·®o¶$>O¸ß'pîÞ{ï.Æ|€¯h™³ >•„=ª°<» 3MoÇR‰×øúãÑýîÝúûþî¶<öˆÛ9{¦«ß¾ÍD·|«ûøI®×q'¸š“OqUÞë|v ÅQj=“cÊÔÒ~˜$+)ŸmòP¾_îÇ­ß0/LSžå1ô¿ðöoõ’d[>CûmX^RzÁ‚V…áR?¡¸´&·¯z­Ù«úê4 êë?±öÃkðÞÿºnÕÕµ9…‰ÃÇ YÍñ®“Q÷ØíT¹µºº[Ãn))ÂâCÃ:ʵoØS)˜2·þxñç!ó Vß.ø•}ú¸þŸødäqpnÖÔ=õ„ÛñÚt·ká·k¶ÏßZÛ&…W—>5®ëØq®ûA¹ïx§ëuÈ!Ø÷°iÿ­CEÛ¤1¡Q¨4MN9ùqc ÛK³_«cò,Í2æQù[™_?ŒÇ¥™—äì·`å–Þ¼y³{â‰',›áßü„â"Кšv¥hͪ¯vO`Á‚Ó†¯½´²k—ï÷îÑ+šÿä.xôT¬]¢õùéc¼(¿cǺ%Õ϶Àÿd¾ÃäüñîSŸÊ½÷Î܆Ǵ;½åïÆ¦2;fÍrÛa ì\²ØíZ±"òõ[·¸z”Á Â"È®Ïí+{ôpõxe°KÏ^®Ï»bú¸jÔ>®zŸÑ®zô>®Kès‘lþ‰&º1^:ŽÁWnQf ý‰cÀ®’ò“ÊâÆÊÓq²¬ŽÉcšqK‡ÓþVŸ²èŠ¥sµÞþÛp¾‘åÇYÃÒÜIð’K.q«V5¼Ü² Å¿c9h á½-¡>Û?»È%É 7ÜPõì O¹aÍæÇªªª*z@±ÑÙïÏÚoذwÝSï¾ûîc“d51Ÿwÿ‹à£Ý×Þóž÷¸›nº)º8[ß¾‚gžåûý1ϯge~]?Îò0íçÅÉ2™~èËðã~RâÅÚÚù(EV¡:Ir’òM1û2ãê†y~Úâ¾,æ…wù~9û³vÖw±´Õ³0dê§-~Ï=÷8.<={¶5c8þ?£Ôx8ÆRÛ©žødø4o2»Ð…p¡ê‚2ÛÏ}îsŸ{hРA'Lš4)¬¥Ÿ{î¹ùK–¼õ»;ï¼ã‡±šžÉ_cój<¯ÇæDnÔ¨Q‘4ì¾B¶| £Êù?Ñ+~†·úzE{~¿o¿M÷Û„eÅÒÍiÛT¥S¨]¨Œ9þ¸ú–g¡g˜6yÌg<|¾oåIíCyaÚÚYòôÓ~üÃþ°›…YÏÝø©^º¬h±q•%L•;-ܲëN{ø:ðV ða\¬rKÿÑîî¯kÙ[¹9ê˜ÎÇŒ3o|:¦¨¹YcMÀ€ÜÈ‘##Eà ©1¥‚0%aeZ{†œBöë2¯;>âCgõ-Œ2ó,!¥7y~ÈüÐY“–JûmãâÖ¶PY¡:a;Ÿ“\ë‡é°ûöëØX¬Óì“{÷·¥ò·qYØ«W/‹2Üÿ%?Cqh 2Ú‚z'êwAwÂ7Ì`›Ý6×m®[»{üÄ8(çžx<Ð÷#ùÈ'cŠ›“µÓsÀwT(T Íù ÅòMñXK[Ý­ø°ï¬ÜB¿ŒqËghý3î;“ú2¶¾?¶ñÓ6¿¾ÅýzI}…ã´¶ Ãö&#Ì÷ëúí-ßϳþ,ÊŸŠßd3?¬Ã<¿¼”4ëøÎ¿»g~¡4n/í¹+×ꈢmC@@Ûpï´½N:ukE—Š‹^zé%ì¢ÛXÙ /¤|𠬸æCúPŸA-6YË—/wkÖ¬‰U¡4åaJŠ2ü¸Ÿ¶º }gõýÐ/·¸•Û,måq¡ßgØÎÚ‡aœ?/¬oi¿Ž÷Çàç[<©}\~\å„ùÖ§_ƼRîú)ËwÅÒ~]Æ )û°œuî¸ã·~ýz_Ìë~Bqh+2ÚŠ|'îwÙÒe¿ÇÝò¼ùóç7Ö”y&C‡í2vìØ>¸SŸýÁ~°ñ2÷¦s›Ž¦xÿÎ9Þ©_sÍ5‘¤ðâÏLæQ™øÎˬÅÃ4ÛY}_Ž_?Œû}1–—’f;¿_‹3ߜ奚l ñZ¾…Vni†…òXæ—wùVŸ!Ëy§mÎê[š¡Õµ<“aé¸:~¹ÊŸíùåÉñãÇû¢¸…œ´9m~ :ß0 °sË–-ÿùꫯnâvâÜäÉ“{ 6¬¶N}|Ê”)µquÊÌ£Fÿµµá]Ùµ×^»‡"±r†qJÄòL Y}_™øq_Ûš ëXÚú,+äü¶~œc¥÷û/$ÇÊ|åÄÙ¾œúqum¼ÆÛ—iã³<¾^Çù˜ Óä[¹µ Ó¬—ä⿟þ‚NÌf¹ /¼Ð}$¹#~®â"ÐÊô@+ï¨ÝùÃRñ´ÓN;;ð=qøá‡÷„²çn@/Èø$o=>Ç»ò¿tÛm·ÝÔ¨Bù‰~hò2ü>Ötï½÷vG}´§úé»îº«ÑûT{4(œ±?Š€6$²ª}°{ßÃ?ìú÷ïoY­eò8“޵!Àö…Úš|†ÅäøuOOX¯Ü´É-UÙªW¨,Nqs¬~Þá[=?Ÿõ,Ÿqsaæ—šg2Ë+–ŽSþl»ÛCvØa&†áø~F9ñ¸c)§½êŠ ÈÐï á…±¡˜â‰úà.¼öCj¯Óù28%Ì÷¨çÌ™³ kfáø›o¾ùN¿Nqö·Àê8ÐýéOŠ^ ô/àv‘;6˳Ðd14qe,·| ™—äL–_^¬]±r_–ÅíX-ma!YIm¬­•óÜñîÎŽ‡r-nõZËcšž@X§ø“d˜< CY–oaÜq‡ya:<¿[¹¯}ík&ž[Òxû™•”‰bT­“ÐÉi¾±kŠÌcŽ9¦{mmíÕ¸ˆ~f„ ;±hªœL*’Å‹»7ß|s7”B^œŠðÚßÿþ÷¢ß䇸u’ÏXÖ7Þ=ðû³xx¡µ|kë§ý8Ë )„¸öÌ eX=†¡<¿¬P¼ÌBí¬ÌžÇ“7@*6_1³ •·9Ÿ'åØG˜ü|«k¡¿¸y¾|«Ã0NF©y¾œ8^a^˜™øå˜µr˜érÞG€nBçø}–;®re¨¾ÈÐo þ¯9ñêßx,šú9üAxÀáÑÀ.¢Šs|4°téRúúmÛ·mïÓ»Ïë¨û,Î]0ãbøvÈûüŸX6|øp÷È#0«Œì¸Â ®åG ñ§X:TlW¬É¶0¬o2}…hyÖ¦XÊ Ó¿{§,Ê÷χßw\_aû°û£¼¸qP6ÛÛ˜’ú²r_v©y~ÆÃq„é¸:>ó°>Ÿ_ùÊWÜ+¯¼b]ñ®ÿøi–Ñ”0îøš"Gm:7ûü§vôá…¯¹‚ñXླྀø_„‹ëIPÒK` 샂ĕÓ|ƺråJÇ †è±èj7ËNÜanƒŒ-ˆo‡aÐ3=PV!º(sa§ÿéìBÎ0îËcLÊ·ããàçYV? ­®…Vný†ùTоb,åÝdÆ…6>“KLgý3§°™oί˻?Í:ašy<.Ÿ;ëØqYÈz¾‹“Sjž/‡ñk\^\ãå×úé§Ý}÷Ýç-ZýÆðÆ ‹Íý‘ ,ÑÔ0î8›*Kí:/÷ܧzäqÇ4:€!0JèsOÕ^{íµ~$¾'PS¨O*¾ïÏSÈ ¹ ?BÄOß{ï½îÿø‡ƒœ(ôeñ¢Î4}Ü…6)ŸÇëËñã> Ë÷•‡_Æ©9ް]’b´iu«ʳ4eÚ³yæÙ±²Å­®²œF€¹¤ºŸÉOªCIeIÇW?.¯l;ÃS˜Ž«ž;¿Íc=æÎ?ÿ|¿ ‹sÿÿÃo·Œ¦†IÇÛTyj×9 èsÀó¼·›£¾ýöÛça°ß¢ÇkƒGà9êéóæÍ;à}±r6fÜà!ƒkÔŃ ß ‚ò•TxÀ4FàÓºœ xùå—FUx!§â /ð~ûB_¿ŒqÊó•åX»»fïÜãœ_'®]\;4¬~Ø?Û°Ì”s(ÃÚ…ùÖŽåÜqÏ ¸z·?ö°NRIJßú.UN’|¿}—0/L³}øÛëpJà¸÷ÿÿƒoÒ—ÿYJŠ@j4ÊÎ-(¼¶4 ¬¥y.Æ|·êô(Â-={ö\£`kMMMwxn$4ʾG8¾uëÖÕ?øàƒœÀ΃ÑcæXß.ôÖ֔Х­.C–Ååûu§L“Ãt\汎Ջ«Ã¶Å\’‚¦b6Ùq2 •…õy<ô¦¸mÜq2âòLžµ·´…ImÊÍ7y ãx–šg¿‰Brøå¿×_oØí—+þ†oÈ`Ûæº¤ão®\µï\dt®óÝbGwm±Îô£ÝE‡àâx0ƳBn¶2 ñð«a0¬…RÜŠp+î’{ã.v~Ÿ› ¹!C†DÓ¶§œrŠƒÑШ‡BÇæ+„F(Ôί[j=¿M©ñPvZŠ£T9…ê%)}[R»róCN!–‡yašuÂóÖ±ôUW]å~÷»ß±‰¹yØi…IÒ’/9ƒ€ €Îqž[ü(íØâ5¡ƒóÎ;¯ Š‹æ@<5P>½fΜy',Òr—_~y´{ØU±c •D¹í›[?lßÜtS”L±6MQú<Ž$¹Iùá±Ç»RóÂó¶³4Wûßÿý~×÷ ña?#­x©ÇV’Ó1 h @Ç<¯:*Þóç‹è‹òÞ+q@â§ðù™•¹)x»°[™Ñ ËXÇWn¡Ò`¹ßžé8Ì7Ö·übaœÜ¦Ê*ÔW)2}&q² ÉH*KʓǢԼðk÷ÿñ¡pWܘ”'Y! eåLhmEàbt||ô¥@âß/ÿ›A¤°©lâŽåÇ•±-Ÿï™:_†ë•›öeY¼\~}“†~‹ûÇœ¤ü}9ÖÎÂRʬn¡Ê:TØqy”Ö£â/¦üãda‘ªÃºXÍ^íï S\Ò&  m¢’× <…A_e衇 X2 KQLV§QÃ|"TŒIÊ‘ÕMN)a\_¥æ•"Ÿu’\©Çö'Ïê”[ÖS̬*yË óãX'.Í<¶ Ö4y¯ÿ𸔖  %¨Jf{$À ZràürÛ9çœã^xá…&Ýý›2³0 Fœµ¼¤6a¾õÑ”0”•”¶1…aRýp,qõŠÕñËãÚ‡yTÀ¡bf¸ü¸¼ð®?®NRž…kI¸;¥çöxÐ+STÚœ€ €6?@FlÅ8ζ±pWÁsÏ=×]{íµ wäV懾¢b<Î…u’êùmCe[(í·+5^H^XVLfx|IõýzquŠ•‡mL!3ô]±|¿n¨øYʋ˳>|Y\ýï-(åÝÿ ¿\qÈ-ÌÚÑxÚ’ÀTtþ3øhQ ß—ë­·Æ*î8EQJ ëY'q2­,)¤Âni—4ÞBý–Ò¦”:aIŒÊɧúÙG\ûRó¸ûß 7ÜàU›þø4Ï$½˜ÉÓÒþw¡lG˜ßø?øý™Ú{ï½£•ÝÅŽ¯X9eÑ•Z/W;þo2|ÉMQÂ~{ÆK•Qj½P~¡cN*‹ËOKñÿë_ÿŠž÷Ó@ä¶Ò4¸;bÞqóŸà—YFÚaS9¦=Ékßd´ïó—™ÑÇ]l33¸òÂ]iDÈ.½ôRwöÙ OJ’V.rë—4ˆ¨T®â)·~8ä$.IùlWVªâOjÊÄN”þnþ°93þN?3íxs¹¦=ÉkŸ´ }ž7ºe ¼ñ´.~ñ‹_D»»ÚÛÞêZÈ tè­,. ëÆ¥ãÚ¥ׯŸW¨?¿žÅ ÕO*£²5Ö)–*ê¤güa=ö';._›œ;wn84¦¹Ýïûà[Tù³#9Hƒ€fÒ (±w]íËpŒÿ9øvƒvtPôœ^½z¹ï}ï{VÔ¬0N5K`+4¦‚OË;þBåIeißñóX­¯/|á îŸÿü§ø\ìwümð;ý‚–Š§É¿¥Æ(¹Ù'  ûç¨]ŒÐ.Žíb°¥’ëîƒ6Á'‰”@K^ŒÛŠkKY;®Bå…ÊZRñoذÁ]vÙeîïÿ»ÿsø_€oXà¶T¼¥ÏOK[r³E@@¶ÎG»M¡‹r»=¨ÜÀù‰@n||£·f~ûÛߺ#Ž8"WËû«‹³#-å÷Q¨N¡²8¥Ïn“ÚÄåÇåñ‘Ï~ð·bÅ ·qãF7}út·iÓ&ÿà^@â]ð|îߪN¿±VÅÝa;“ÐaOmëXÜ´uGÐâ½qà8øKà£7†în½õV7hР=:_¸paô…Ánݺ•¼B~!í4£ÔßB±zÅÊãR›ròñ¥Èheÿþð‡Hé'œ†¹Èç—þ¶º“ÐêÈ;d‡2:äimýƒJºÀ¶þHZ¼Çÿ@[/ pŸýìgÝÉ'Ÿìçâ°Ûo¿ÝÝqÇ®_¿~ŽÛ '¹ö~/÷œ—R¿X8¥O¾Iíš’ÿóŸÿ<Ú*á¼-Dþ¯à¹sd£é€„ú-’ÝÞ;-EBË&  ldjG éBW·äýÇðbÇ1lØ0÷ðÃMÿ|.òM=¯¥¶+¥^¹JŸç%In±ügžyÆ}þóŸ§ú¹«ß­ð†¾Í]~mAh6FÏ4›-MD s¸ ‡¹ž+¿«“yÕªUnùòånèСª”zñNRV„e QÎ8K©›¤ðy¨…Ú'•%ås»g>Û§¡öæ›oº¿üå/îoû[ô-ˆ<Öݯ„燢6çóˆ@‡! €s*Ûö@’.²m;ªï},zø üéð¾–§âˆöØøÀ>à~ò“Ÿ Yº+Õ@(]bók6õü–Ú.m¥Ï#NêÛò¿úÕ¯º»îº«œóQxc¡ mU–ÅßH[±P¿M'  éìÔÒ#`U/«³Eiô„_ÿiøká#÷©O}Ê}ó›ßt]ºtiXÈæW]uU´È쬳Îrx [²d‰9rdtGjmK KU-yžÊ‘]Háó˜ãdÍš5ËqáeŸ>} b9öØc£õC† q×_}Ä=”É©þóÎ;Ï¿Û÷er ß àïð3³/õ|giÌKöÈÈÞ9i—#Š»`·ËIgÐ|,ÀGÝM¼÷½ï÷òÉ'ݲeÔ3N™2ÅüñŽ› Í›7Ïp +åS”1f̘Hfl/“»×ñSµ¬oŽzüñÇf©®)çÙWö|¥î©§žr§vZ£.‹É}饗܅^)í¸m™­ý£>Õ1á|°»âŠ+Ü„ ¢,3¿ÚwÝu×9¾×¸Hÿþ×ðm¶À/SlR@,e–I@@™ÀT=ž€]€ãK;eî8êœÖiæáyä‘î;ßùŽ=zt$‰Šë׿þuô "gX¾ß~û¹óÏ?ßUWÇ/Iàt÷#<â=ôP7vìØèÃ5O?ý´[ºt©»òÊ+÷¶OÃùÊžë8¦‰'ºÚÚZ·xñb÷¯=åvíÚM½Ûñ„ýÞyçѱQyÓ½öÚknÚ´iޝçñM >«çLIø›[¿~½ûÈG>â-ZÔH$q6 G‘ÑUWWר‰[ᯃ:,ÈjZ@VÏLû— €öu¾2;ÚðbœÙ¶ÞÀ^EWÑ~Eºäf2œ)˜Ÿøm*1î7PUUå¸xmëÖ­{ˆ=ì°ÃÜÏ~ö37pàÀ†2Öã0_KLr4ø˜‚«ßûöíU[½zu¤´ýóÊ»gSðò x÷ßô$ÇfnöìÙîK_ú’[°`e5 ¹­2¿±pÈ!‡4ä³/*w$1Jº¡Û^rÉ%Ñ,‚_ãã¦=¡òoh”ù&Šþ;¹8›%2²y^ÚÛ¨d´·3–ÑñÚ…8£Ãk‹a•jœŒÁÝÏõï„?þýðü"a¢A€²X׳gOwøá‡Gh(¼øâ‹ŽÓÿ¥8nZÄ;l*¶åêx~û€2g̘ḹ§îßóž÷DŸÂ}á…Üm·Ý)]Öå:†þýûG+êyÇî}7¶û®]»ºÉ“'»ñãÇGu_~ùåDƒ!N@MMM4^>ÚX·ŽK/Êv—¢ÅËn•22p:Àdt€“˜…C°ÇY(×ð6þ8x§À‡o®ã‡jnƒç؆Á O££¥Ýbtð 7M‘,aŠÞžI®gÆWrŒ–ÈÈè‰igÃ*û£Ÿ†+í••Ø_àù*ÚçJ<*ø$7‡ÃŸ 5üÅðÜÇž«9>>mÇÛòKà¹xÇÀ¾Çÿ~|¹n:L†çîJ|ÕÒwNha5[$©%f7ZBf³VD =ÐΒƘUmq…ü1- ·­Ež‚p`ÚŽ’hM€¦&"=ál!û¶Ü¶Ë/¶„눬Z‚“dŠÀx·!'"P>ýѤ¥ èAÍWäN‚7|GxÎÍ×[Âq1 ¯cÜKáxx¾(£äD ŠúúúbuT.E TTT­ÓÁ*œ‡ãi©×öøi[.0,wÊ|'ÚœÿxƳäÖc0-µ¶áMÈ&¯rÝ£hpüÂr¶u}]·Ûú tŒþ[ê¦cÐÑQˆ@21ÉEÍ.™ å*vÊ;áßÂßÏGYq¼Ko)åÏclŠòg»ãà߀? 9èldt¶3®ãM‹@mŒ u1ym‘ÅG÷Âgåÿ7 €Ðm3Ú(MC‰ß¾NE +ˆN]Û!„S윶"CGvÆòÙŒŒ'î:à®Èõ éIDATóËŒŒÃàl gN8ƒ"'†@ÜÌNsð:Ph5AÛ[ó‚*­žÌʦBKƒ#'§?ym‡ðUE9è4dtšS­M™À+¼;‘Þäµu’ÏÆéÛÚñÑÈBo÷ ¾ÉKg%zrV¢qˆ@kДÕGG$ð Ê>•Û ø¸gÝm}ì\w·7ˆ .VEE -Èh êê³#à"¶ëó25͇Y Ægd0?Å8Ì`âëwYdÅ/;r=€œt 2:ÅiÖA¶Ë w*üCyù#òa–‚¸·Úb|óÑéÙðÿ†_Oe›E—^Yd£1u0ZõÚÁN¨§U lFo„·»ÆÝeôη¦Á? ÿå2Ú•[up¹ Z°þ_ ûù¼üð-ŠbÝ.C…§à9sðÞb•›QÎGìKN:<þë[˜€¿˜íôu|Ü]ä\ä¿ÿ<• ãœ?¾% €¬ÍòÍÇñÒ½?~&·éiðäôL>ä: ºGrA‹ýÕ5±ÅÐJpÖèÇžµ3¢ñ´gcð—ÀóQï$93ÀðKá©Ôâ\ÜúvT´Y…¸6åä%õ[ŽŒ–¨Kèø~ðÃáûÂÓ Z¿>É‘kè8›Öµ,«¼ÂcVZšM ­ÿ4͈ˆ@!ÀǼ[µ;Öb‡w‡~q&! G$ËŽã+gŒ!¯7ÑžSöi=(g,Y檱‰@Qᦢ TAD Uþ# æÝÿu)ö0/EYYòú=Å…Òp¼û—IÉhd´‹Ó¤Av`3‚c{éBSàAõ¢É§ŠÖh_fÃåL¡QT)9IVœÁ‘NA@@§8Í:È X±MóÆÇøôôÒ͉òn– é:’³W.yLóá_‡O‹—/båD cÐ±Ï¯Ž®}ø•7LÎðU·4Ü „¯*v$w†FYÑ¥Á‹³.¿‰¤ét2:ɉÖafš§Ÿù¶ pU|sÝ/!à¿›+$ƒí·bL_‚çT½½Ø\^ !ë}ði=J€(9È>®Ù¢F(žÀN!?DsnþH6ñˆ©†ç¶»vwÜDQ™nÆY€/xÇØT^oBÆÿÂ߯ŀ ×¹TÔ××w®#ÖѶŠŠŠ‘ÛI…~Ç}W ÇÎ×ßøŒŸ› = ÿ,<€Îæfã€Ç9hYÿ†'#òzžwþíÒéºÝ.O[æ- s§¤}H@ªç‹ÚN€?~øZøíð¼Kå]ëËðTüíVaìiºý!ì$øCà9О¯ôÑ@âg›¹ë =v' CœÆ6?m~ :ÆdtŒó¨£hd´ó”õQVf}€Ÿˆ€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@¯fþi€" " ">ͤÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óddþi€" " ">é3•DÈ<™?E ˆ€ˆ€¤O@@úL%QD@D@2O@@æO‘(" " é>SIÌùS¤Š€ˆ€ˆ@úd¤ÏTE@D@D óþ?Ïùùy=^iIEND®B`‚icnV Csleepyhead-0.9.8/sleepyhead/icons/trophy.png0000644000175000017500000003614412412506713020517 0ustar sergiosergio‰PNG  IHDR€€Ã>aË pHYs  šœ IDATxÚí½wœ]Wu÷ýÝ{Ÿsn›>£Q·lYr“;6%Øô:BIpxB % <BLB ByI /!<á!“„P ¡ºp“mI–%Ùj£6}n=e—çsνwF5KÂm>[gtî=åîõ[e¯½öZðx{¼=Þo·Çhä——dö ´I¾w~Ÿ‡³WkœÃ9GO¢;?Z£À9çÂ:0íóоk¡·‚°´†$8‚¨qŒð‰xÍoSO¯j7ØG-Æ·¡–¬Ç 1ïGí€øÒg)Ë”£i­ª7”‚‘(JUBô7šR'‰´•²[šhá´&NTT)Û!)(Z‹1Vjë¤ö¤ó 7‡°Ö -„°B`‹;,Bá„)pi¥NJIÚ=¡”'” „RáùEé{eY,–¼ ¨¨ ¨x…BE e/(”T¼À÷}¥¤ç…–Ö„*IêÒššq®>£ãÉÀè‰ÀSsU!f£DOY!’1cTÍÁ½Ó³ÑÎK¯a?À¿MŸµ¢Äjç8×Y±Ò:.Ó†­:Ahá8vwiÃ^ñ2³19yîü¾\Ýhˆ§' / C†´#ιÁ”’’’mÅ‚«9¸'ðÝßw‘ﳤXàÒ(âjmV.¹âêO y}¯x¸:þÝø¦þKcßØÍ¦^›nE‰óMÑŠ#!š¡ÐQ(V¡"Q '„ÐRa¤ÀH%¬¥°Râ”VJòî¤Ä)éß)Úç‘R ()„TB(©PÊžÏ+ß/É ¨ÈB¡G‹}ª\îW•žA¯§g èíôûú† ²2@z( <0"5 S(¢*©ï.&Ñî~gwyÍæ}ÌÍÖ¸+®oxÅD³±ÿ_G†Y¢ºZkz¬C „µ`Œ@ëôh X눃Ѣi¬û·jݼù7ßÎìiÀ¦[x[½î½«Zs£ZK¢H'çÎå"Õ¡”ÃÂ6ׯõ[K— ôX+JI¢Yö6*Ëþ0¿e8{ð¿æ~ðÝOÖ&'¾EÉ\V’`’h x6Ñ~¬/–JY¥¤-•moÏ UJZ)±B8‹³ÎÚØ%ºá¬mZ)Bâ¤HA« )qB ‚Àz¾‡'B ‰RJ)‘B¥”,¢,D ¤,Ï+IÏ/‹À÷+¾_ö …U(ôª (<Ï/AYAQ“”¤ô¤JÆQÃ▌¦¬Õ&½z}\EQ“VsV´Â)¡õ´pœç®}Öûä9¾ª=Æ·|]'>Z œëÆR€µ¢­’¬Mèë%‰#&gš7$†ßxãï1s¢ðŽçK{ïYþÖVkŇ}Ï¢¨F+lam„s1Îiœ³8ç1!Û³dduϲ·¼~°-çf~—V« ” è}ÖÓ._'G-Â(4qÜ"IZÄqˆÖ-’$ÒI[k#gm‚RE‚ @ᜳ8k°Ö¡!I"gL\’©ßùê8C»“_§R€B™q„B <Bø8œZØÈ'’>Rz‘^'8ç°Îa­ÅƒÑ–ÄhtbH´!Žâ8&Ž,ÖõR®,£K×Ìç;¡·O „rb‹Œààœhÿç 4š¥BÄ@/¯®6h*ëŒ>Řܶê™ÊþŸéMî#±“YGfè‚R8ü H”€~(®u°LˆÒ åÁ2d¦€b š ×À5ë45šÍ­VM…­QT#ŽêÄq$©ctc"¬iamú.`®øLvÛ–Pþ×åà¦ËN8ÂJ@g ð"Vd`>BxH™ýÔL‰ä°H!R"a²ß«p.&líbãßä©Ï½:{vBœ@ ”J ÝÍñÎuà,)\¬¥‰“ ¥ ô”H~þËŸ{õ?½âu_úÎ)ÀàÈ/¿EÊ•ý»öÞë&¦j$ISa³ðp.ÀÙëb¬MÒ“O ¡T%{„Ÿ¼” }æ ¢€¨Td×à ™CfZKdœ›rŸkÎeÖ¨s ²QÃe×tŽî¨ºOÌÿ;ãÆüÙBˆöû!‘BfïØ@ªÖ®ëûÝÜQ›ÛÔ³ñ˜¥PH¹Ü˜ôÙÖ‘©p6ýmBÛ.FOk#m¤•)fJO½ö×ë‰OÚõŸüø''d/ÚÜÌÛVÉÁ«®94™°kσq½>EÑ„Ñz¨#eŒç)<¿„çõày½(Õƒ„ PÊ‚iGe}±¿t©B!¥š‚yÇœ@²‹x {1Od®"ºî(DÆÅøºÞca—]‘ Ÿƒ'@L³yˆ¹ñ»Ó™ý(•»Ëľ“écS#xžÀ÷•õ}/)Aâ\)®70K–ŸõÔÿèÇ+Nt:¶xxƳ`häÁ;¢¹Ù[ÍÖTÜ k:IjÀ4žšÆóæð¼ßø~Ï« ¼rÊÝN‚H‰9Ÿà²«wkÁ¹|À»ˆ)Ú€Dùìá×ÿÖO=ÄYÀºQÌLï‹™$A·BÔ’%ÈáAWäÎ…W\r c`?¶åÂ/{jÛËWþ)ÈÊÑž[T t‹ÿ¶Z8qçö“”m°[õtªMô¶¡*½¶g€ÅITilöά!.Æèd‚f£ä” ©fÿåÀxëÍý“G}={”'éí[îgj®ÕÚg•RÖó‹ÚµjK„;¸8.ÅèM£1©uFaë­ J%š•²k,våEOaïúõÕBMnÜéoy¸!˜q¿è2ûG#úÑô¾8Aêwðÿïèø R¡¤BJ)=”ôÊCªô³|&Óù¾—9,ÖV±æI]ˆà‹ ù£Á¡’ï¥çA!ÀÎÍõ ^Ôô‡ßvÍß¿sq5DÔ„“iО=ºG:wú .Žù©˜§³E÷Ô4W¢£:*A¶¹¿›øÝ6ŒkBác cÇ|y½¡ïò"¬ÄTw7£hÂ:§„sRim„Rñm'2G3:T¿9Ð_)‹Ò÷AW(oÛö`F—¾î­/Y|áÁ`Á¶–ùëò¶ GF><ù)×YÃÏ—y;ÅÂã8¦…ݾ}æ¯S,\:|ýbÁ¯ËÇc6Ûóz®è‚ٳ랆µ‡§ŒJ'1BÔö*@¼ýG=eZ½½Ëß—2ð¡§§_ìÿÙ(-ûê‹»´g-§'ÓÀ u³ ÛE€‘vç\{”ÚKû‹J‡Ó+5Ž.—ð9h³¹Nè\ d—ÿ.‚ÀeXž8êcBVáF.fZû÷ß:WÎy*N(ÖÑX³9~ó©@ð±Û?úÁÈȲÞB¡ ƒQ. óß7ÒjÀ ޾͑Áê¢qLHñ“d}1 ,8º4 Ã‘‡›Ù»Ì“‹KÓEíü\oÞ&´Ã:‹³ë,ÖºößéçÙoiµCéÒ)7ÓGçþg<‹àüa8 Wß\­×î7ÎÊ9å…aR6ºyãÛÿ8™oà «Uÿ××>Å¥ ¯Û³çà&ëZ÷¢«™ÉPϺ& õ3â…]Ò!‰1&Á˜$ã"ÝÓEøîàÏÅ@pòÒÀ&ryÓ¥œíp~÷§]·»5 ‘þŽÔTÊÃS‹¯:÷;â–>®öÍíØ~cÓÙŠrÎ÷M=P¯·¾òîŽ}ó´@ŽÜ<ÙÛÓøÄèH¥\©ôŠE¡Êá^÷rZß»ño&€á¾ÑýþÂëÖ]µfî^ô,ØY šõFÆýyhxÔ%!BHBtat„51ÆÆ›`]×Bê;±mûàø¥;AÌ£HF¼œø9÷§ÀXΈ®µÆX=©:0m0Nj$ºúõÅ_¢÷½”ÖÂ`¼ïþïO6ê[­s%?Že¥Z 'Íê'NVÑ÷²ÑèêÛoè7ß,}¯TD¬:k0yÛϽyÂàÕÎý볫Ù;Œž†p˜¦³gßð3‰ÐH»i@¶9Dëc"Œ‰±&Æš$Û Á¥£Ëz7áÝQ='o#Ì»£[(ìý¯1:éâþ\%tK-寬å¦#sÿ?¼ –¾ qÆíšºëWëÖö(c½ Zz«µúg¯ÿðÛN;Diª9It–N™ȹ¿Küwz*!R;¤* ¥ÿÝ7¼ùpàÜFáâw`Š>xµ-·}c¢QÀ[ôM307WßQ¯ükB“'òå‘õwü¤\JÞ³li¹·§§R,—‘ƒ¦V£ú·ùsc°íç>ùŽww_ã—fvÃì´ž„pÌ4°8Ð?ýQ$¬G5’.Óšc£6é€à0'SaÝ î˜üïŽ.÷h•.C°mvI<9 éì&³"\ˆÖ3_9òˆ¿ä½0u¡?7þàÆC»w~=4¶×"zg皦Ѭ^ÿ¿ŒÆÏÎ_wÇ—‡‡¢ï-í]ÒÛS(ôTƒƒƒÑ¦{oþÏ/¾&^ï~y[ôá ñI2… ' ž†è°“Ô0(׈¢9â¸J×Ðí-`Xc]*pI[t_,ÔÿâdÇâõŽ*i{óæ~]\ŸM—Ðíã|  MÒÞBçì˜ÃÜt8÷O¾Ư«î»yvb|rjó¦ÿ¬FQS&‰,ÎÎ…•™Ùæ¿çCÓ_á!6ïD/Ã4vn¬½ip`àãQÔ÷´$™ÑÆèÐØÁæ÷ðùñb!^uù¥Ë?UÝsì;ëæKÕÀÄΕ6Æñä寘nÛ*lÎ.*@çš$q•8ŠI’D™bmÚ q6N÷#fžEw˜w18;àŒ.:Ãe÷É=’¹#G¸l÷&û®Å:°Æ¶9_ë…ÄO.óc¤[×Ýwßðf79Ÿø[ž{Þ3»÷ ÑôL4µßÆÙ¹¹û]¢‹Å¹j<:3×ü¯øÂäßs šw2sùØÔŽ;Ô{”,|3Iú†­­N8§£¹ê@ýæ[¾t0 ¯XqÁyÞßN?°Š¡sÇþ­¸œzc¬ñµž¹Ü‹Ë(¨í„Þû™èC@ë:Z‡è$Aëk¢´Ûg£l3jº!—´AÐVÂvÙ ŽjˆÌ'Ÿs]ŸÞC¸Ü™:s„5Øl³§s"ÛtšFcÐZFün ] sH žÏWæÿKσ»ÿ~âïMœmÎMOm1Iâkõddz6¼ezföÝ;w“œ È“½pÝv~å )GFú†ûz½ ¿O˜8¨Þu϶ƒ›¶Œ•Žó··½@ÉÙ/Y;·?ަq¦†‰ÆÍÀX&¡\FatcêXSÇš&εÀµp.Ĺ.gQF|‘_äj@i•±[Œ-fv‰|rgS6ek;p²i]æ£0&A›­SÀ¶Ùy£SÎ×F£u*þÓè-’–ŒðŸíWÐ׿Ööÿ»gÓ¿ îÙsÿÁÉÉɹ©©ûLÔztv®y Vo¼åÏþFqŠš÷P.^Õø7ÝêYcz>Šë†ê””Z×Áܦ- ´–Ëׯ•»kã€+®˜ý÷úÞæ?;óûZÂÂì6¸"Ý5<@àCÝ5»¬ý$Ó÷)Ñ]®ÿ3×±@gÓ@¤¢—ÅåuÛ~îØzßåL6Û&Ý߈À"V€íÕ=k]¶í[áXë0Æf è2þ´Î¡qX¬ÅI'„ç¹~áÏ;í&)QyÏ[£éê{vï¾=™žnì¯×©Öê&ŽmÐlÙÑé™hjv®ù–üe´“Sؼ‡zƒ‹fÿ wß´k+•²oDˆÚ”’‰n4åÜ–­–8±ËÖ¯åöm®¼TˆæÇŒñ_Ç3ç Ѝu€ÂÀ=¤K ƒ@¥Rfbœk¦Ó-Ä'ƒï)kÿt}ó»WŒõT ×$:±V&RZ#I³A<=+L£‰ìí1^OÅ !ô13ÆinÞé¸é² ÷ïÙq;o.—FöIQxÍ\-¨4ÞLÄq'Õ±}"º»vW\Ú¤ —< Q86! RÚÌʶ RXœ4ÈvL@WléÆץЅËfî4vGÕóqÒ¦4;WÚ%²™@šÃÇÚ4·Ö†8‰‰K’¸,¿‹S 72\ 'ÆëS3s¥ÙV‹Dk­ŒqÅ$qKÂÈT[‘þ£v‡ŸþÔ?žšyþOEt·;¾[ze½Q~G­\\««é0²õ(LDâ=óÚhÕ’á O©~á©~jõYâ8åm²ô(ÆfÜnÛœoŒA‹1™¾+Æn>ÁŽÂõn‘ápÝ&£È¶q§ÜžJÑNÙ–¦sq™¾­-q¢I´ÍRÊ:â$@b¤[±<¨/_Z>XoˆFYaŒ ´qýIb*qbo Cý—ð¾øÇœÁvFv`l¾•%õFùêÂkëõ §ÙR3†«/[W]Ñ\xEOÊdž(޳Œ˜m\zÔ5÷tše3 ¸ n^ÂJ׿N ½ÎÉ6:=ÏÜ•?}Ç”ð–DC¢]šS8†ÄW(xñÊåå“q¢]Á×oŒ­$ÚìÒÚþéÔLø¯ïÿó3Ãõgy»÷fyå\µøKÍ–ÿÒVË_ÚhªêÙgioÝÚÆ°' ÊZŸ$Ñ$:Mþlt€6±; ȉ¯M&†m>}£c±»‡€. ÐÖý ^¹øÏ§}9ñu7ñhEÂY§Ìè’`ºTjÆÚcmÉ»ÃZû§a”|ïí×›Cü”ÚO%[ømßñV5›þ+âØ{­ê’ukÃJ¹äœÖ‘ŠÿÝèˆþÉoÛ͉¯µ#Ñ)ñMa›‘´KFý½ÖÆ5s_5Æþ—ÖñÍo}·ý©þ§ €¼Ý}•°Yzv¡`®qÏ󔬳a4h“V®Ë&p™Ë5ã>íRiaS‘ìn:ntMû\gGp[ì#Òd¹ágm–Æ-UIÚtˆŸ$Po;[SrÙ¨etXŽ9Ä÷-÷…ß|»þÆO›èt·‰íâUÎÊOi#‡¤p2´A©Ûáüüó¹oùÝç»õþ| àÚþÿÜâï§ÝÄ×ç×êRÏT…W(ØmË—rý@Ÿ÷Ý×½)™x8>oÞÃåE–¬w_žzÀp—$rÀ‘ÊxPÙVêî9~gËiV®ìÿVyúTpÇÇésMÑp» IDATÓé©·û'$Z¸¹šˆg«¾o¶—ŠüêoÿonåÌÛvÇÝäÃée†Ïå!í›<ÏTVY+"!°JYÓN±…6áéÊúá#d!|pë4ÆÄY7é4›i$×h’$ZZ;§µû·(á£ô!÷“GÂX>"°o3å(âÖò{À•:+â²U8ë$ÖŒõq®Ÿ8 ‰ã9’lz¶0ûN€4ëW€ÒÀ—Eòä»zlÛá”OEµ†VÈÞ8á£aÄßýáÑ”q|Ä oÜÁˆu¼Ë~Õ9uB{1&-° ²µÛæÚŽ—ÃÔA–b-#¾j/ð´]ÎÖuQÂÐ'|!Nø£w¼—©„Ä o;nçrc¹Þ^aLê}3¦«g•6Ú%WŽÐÛ)Ú <‡Gõ¤º Í–bÞwp‚Oÿù'Æ“ûÇÆ6Qn…ü\j$2E]³€¬·‹.-B·TÈÿî®Ðe²õýD;ÂÐÑhŠï‡‘ûƒw€G¤®T o»6r¥Öü‘µ¼<г%Ølf«€‘;Šv7tâˆbGµîê­¿©ÖøÈ‡>vrÅÀ™‘ƒqÌëµáu"F’D˜D ™$Nĉ= D¦ûU^ªÅ†¡1¦ó-¶…!oχ:›7ÀÃ_VÆâ1 ¥ÕÛ{±’r¹±F4µ–$¡s–b1‹ÄL X|β‘•O/ ^ ”²HQ*¢úû$A Ö…è{Òvß}”Dï“®§øôJoÿZÙÛ×_.W††{‚Jo… ¯zpÏ3~åá#ý8NY«Í½îi«–ÿâ—ñ¯~9œ…Te„,cñ…ô|‚@2[…åç¼éÃ.yàŸœ{ç5ÎÒóXÀ£óÕÙ_^iŒ}¦âeÖñÜré¬~öÒlÍâP!PRâŠjc”»Æ+W-ñ žóZDßFçöý3Ô¿ëyŸ»Ó˜Çp:Úrà8…YJ>òá+ÝýÂ•ÆØk…Kœ“x„§'ØF£V%1ª|6„˜Ä e‚S?þñP(X6l8_JuÑ•0x%ljý{ßÙxçì®ÏüÄøä§gX¹¬N±Ø ÑhÐjµÓJšíPqwB»R¨"Í”ýSi?MOàuÀgOÅþä/åg_p+WV(—=´víŒÎ¢k}šÍµÚ4f“f#¡ÑÔ4› ­¦¦&ôõ.aÝú ¬Ys6CC}”ËDT™™àÎ;ÆøìçvòùÏO0<!e‹V«EÇYø¬Ä‰à)À~ZDPüôÚõä©ÁN²ýöo­ã¯ÿêÉ<÷9«Yº´Œ¢½GÏ62 ìˆbZaVX'Žc§˜qí’mRJâ¸E£9K6Hs>¿åR,-眵+xÞsF¹òJÅî݇زeß÷µ‰møöc ¯ÞÍI¡W\ÑËß|âgxÝkÏcåÊ î˜h20$–D'$qœ¥Ÿ5{Ú®\yݾ$‰‰¢&Ifyо_$úQ‚Âj.Ú°Ž< #ÃðonFk…牶 â„ë àŸHké™sfѼָ,ÓX'«HºÕËÍ:¹eÓsZëTjhM¢´N <ô”}å «¸à‚+¸öšUüŸú6ÖÚåþ쉔€/=Vð7ÀOô¢_ûµµüï·_ÁŠâØf„— ºÀ¦%;±ý9l¾­ÛaËêRvåÊ‹AµÃÅÚ’$n×þÑÚ`¬£T’(Uz€¬]{5ÏyöJ>ûÙ¯µUÀ aøg:µX |”43ôq·'=©Ÿ¼ÿI¬YÓG»tËóõuzºCˆùEœÚ È÷ôg„·¤@è"~wf±þðL{9Ñ‹ÞôXwî I"q·¬;>ÎyYd¯ S[2åô”Û»9yECÒÌ¢©(¤@  ¥@Ê”“uS«Ï133ÎÄÄ~ØÍØØ.êÕ]À^Ò’wŠ7ýÆkÊØ\w¢ŒñH“«ÏÌ|ߟ<‰á‘~¬I Žóœj§pÉ3…u¶s»Žp]`èÊ,âºÄþ¼ÿÏ{zz®S¢SPk‹ï9Š%xx¾fË–{غußÉÌ–_ƒ3ˆz&=Ï8îîsFX½j¾7ˆ@¤I™DJ‡A8“eíÖY&/æ‰ù<¹ÝI$ó&Òü0í\ ¹$.¯ 'ÒÔ3:‰©×æÚ¹ “ÄÇ ­V‹¡¡qŒnø*»µ8Q‡GZ†÷Œ&Š€ÌòYHtŒ®ÍeÄ×´Z!µÚãã½£™˜˜>âçíUÀŸÂ1ªˆ?ðBઓ¹p÷nÍ¶í†‘Ñ ‹PUŠ¥<5GKÔp®ž «á‡W’íÎö}ä&²"SÝ èC; yz$I³ÇQL«Õ V›¤\.rׯC|ëÛ›2ã“‘k€'_?S8S6À{ynßz=áÕ¯~&iåì  •À“®¾eaaf›çóÉŒÀŽ1¸`—0óAÒÎDæ˜odžCkSÿBœhÂ0&ŽC´n±ÿ4_üâ&ÆÇ5žÇÉ, å;£>3€‡äöؼyŒ½{ÇyÙË®Îm .©Òš=v±2ííÌÞݵþ޼U|~_`fSF›yÛ6@l£˜}ûj|ã»ØxwDOLí““Sp†}g'íöínwݵƒ÷ñâ_ gxÒ(OcmÒ®ÐÙ)7ŸJ€6ñíÂÀâ½í(Ês¸N>âæ“ºVK³w¬Î7¾±—oÞØ¢X ¿¿ˆ”òd\ÁGj¯â -ÕŸn pRnßÅš‚z½Å¿ô¾óÛüg[øAˆ´”l^˯]¢ÝÚy.ßvFÑnqŸKˆvñ‡Îöq ãvÍþý 6nœä;ßãߘ"1ƒœµz)RÊy~‚ÜѽÒx‚m˜Ô<íɤO'ÊV9‰¹ÿbÄÏ Åë‹_¼kžz]4ÄÀ€¤\vx*õh­³Å ÓÉ8ž¹†M¾6Ðõwº¬ì¨×âØ2>Þdûö9î¾{’{75]Æà`?ƒƒƒ$IB£Ñ Ùl†!QEQÛY”¿çI¨ƒ?ÞñHÀ;Iç´§Œûó£”$Ž ¶T<å)KY¿®Ÿ³ÎêÁ÷½=ž/(Š  Û\m­£ÙH+|D‘¡ÑHØ I½–°ióÕjÂDÙs}úû+œ}öÙœ}öÙDQD³Ù¤^¯·ÃÃZ­Qg«ˆ¹$8IìžÀiö œ.¬îW)…ÁXÝUNì\* BH|¯­Lò]ÕjÌÔtšóa`°‡åK{ÑF#2q—¿·Nt{v<0Áƒ³ ô Z‘c騣Zk²té2.½ü…ÜrËlÛ6ÅÔTkA éïóذáržóÜ_á'?¹…¯þÇç±ÎIŒ èíÛË3ž +W¬eë}·³}Ûn|ÏÒÓ0W­37;Mµ~+×\ûrŒó™ž…fˆ"C[æªi-cÏ\tÑ¥œÁ¥ÜzËMLOÏF†ÁÁˆžÞ-T*RHrƒCHA__97 h¯ Ü¿m?gŸ=Š’rÞ>0ñhÀ]·ÜºË/;‡+†æÕww€pihçòmY"ŽB|? ··¥ÒÚŒOzò ¸ñƱsç k-¾¯(K r×]›ø§Ï•ééšàâ çòÆ7þwÜöeêõY¦¦kDá ŸùÌÿáλîåÚk/çºë~‰[oþgšÍûh6m–|éK7ðÄ«/¥XÔà4ÊS,[ê³îÜÞ4|¬9.âî»·2;;Çk^óJŒÞÑuîº{Šéé˜R©Äe—^Í¿å¿Ã¥R‘ .äÏxÆîºã¤PXëR09Yeã=;î>S8û ÀuZ;111ê•Ãôöç ¯Ð½w, º,—$O~ÒF—™ž‰Ÿãë_ûW Å.»ìr¶o€ïÿ{”Je–.]‚ïà¬=§‚ïìÚµŸ™™”R\|ñ%¼ä%?ËÖû~@àú‹Ôj“Ü~ÇxJqé¥Wñ³?û|¶mý!…,_~{Çf°Ö¢T‚ï&§Ò:Cç®­°jU½=>ƒƒ>;wàÀÎÞð†×S*ÄDÑ »÷Ôiµ :iðœç^Ã3ŸùüÔ Ú½›]»v±oß>zzÊ=I8‚z=䦛ïãž{Æ>Íšœ øÀ¯þôL“ññV­¡\)"¤èÄä[Çž±Ö‚6޳×T,ÒÛ«hµ Qìóío›5kÖð”§<…C‡ñÀ088@êw7 ©×-¾ïX¶´ÀôŒfÇŽìß·|m$†ìk2Ðï1;«Ù¶mÎÖ˜ÝÍ̬c|BóÀƒc!X·¶„Ã2>ž`ùò"ƒý6“Tq¤Ù ëë`||œ‰ñql¢µ£P,°eómìÙ;EOOFƒB¡ÀÄÄwm¼ÁÐP‰z=ä‡7má?Ü `?>ZPÞ˜™ži²s×A¤”ôö)kûö7I‹s°by‰bÉ£\öY¾¬¢Øã[ߺ߸òÊË™›ÝÇSÔjMšMÍÁC-¤²¬^]æÜµ}”KiΠçÐ!ÃÞ½M P\¼a¥ÒzÀwܹû·ÕÙ¹³Ê¾} ú\p^/kÖô25sèP:›]¹¢Hÿ@!“^‚rÉ£X”à÷nÚÊæ-{Ù $Œ,ÎB± .rçÛØ¼y+ssu¢(AÁÊeÎZÝÃäd•ÿùÑý9ñ!Ý ðÒåàÓÞÎÄîEšñ°àóÖò¬g^Âò僔J­V’-— J%/ÞM%$Æ8Z¡!Ý200ŠÑuZ¡%IÒäLž'(¾¯ò­ÿĉi[çùê\¥ìRÝ«KšMRÏ“T*^û͆¦¦öG©äQ*y Bd{Ó{ÛABJÁà@@[šÍ„f+†öõˆâ;òÝïn¢V»‡e;pù£ Ÿް؇ë×-á‚óW²~ý {(ý¶Ç¿ÛT‹¼q~ÊíGæÿ¸Ã×sB¦7q‹® ºc>dAs´Q:ëh¶b&§ªìÝ;ÉÝwïd×î™#Ýé+À+Î]ÎX~€»Žöáölß1lä’‹Wrá«êex¸‡ÞžReY·Ü|@p Âçt±¤9 ûf¾ä|¤{sYxÞþrÑ 1séFÒ0L˜šª±{Ï[·Ž±ãcÎðÎØðLว5÷nÚǽ›Ò49Ë–örþù+Y:ÚÏÐp/ý}e …4æÏ¼v€gŽyËôt~Ö=ähq§çàrtbH´! jõ±½LM×9thöxˆ~RcõHÀvR—ð E ìYõFˆsd³ŒˆF#ÂËÄd“Ó£6s&p¦Œ@ ¼Ž4/îѾ³ê¿S/éµSE-GšÎ-8÷R¤É³ºßm’t?àiß~¦ðhkâÝ£²’“ˆ¦~¼=ÞNºý?stV¤ò„„IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/moon.png0000644000175000017500000001152412412506713020135 0ustar sergiosergio‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ ,©f»ÕÔIDATxÚí[kp\gy~¾ï;·½iW«•,ù–‹%ÇvlÃ8±7!ri›–˜”¦%Zz:Ìtè…áwþçG/@K(Ã@§C iBÂ$@qÀ87bYv‡Ø±$ËÒîJ»{vÏí»ôÇ9{|t¼»’/0tšygµ’öœó<ïû½·ïý€w^ÿ¿_ä—}¥@#! éÞ_uÿ5!€$„¨ÿ“(¥X˜¥ÀÓH€G<& !‚"­ ˆ4Í"ÑzpÙ@$ÞN¿v(¥´´Ö‡v ’tåZA®©ë ðIú-Òƒ„^ÚOÀÓ$®vihW^À§ ÐÖ¹ Ö²1€€ {]¥T@á¿2”R4¼ i+äY@/óïú™ {Í虂+‰Úš¼Ñ‡=~Õ28sæÍòÌÉ;«K‹;;g‹”¢p^¡Œ6c+–a.Œ”+ǧ¦&OìÚµg>^Kk?M¬RÊ¿\Èe‚7൬`fæØ–—_}õ®zmé^Çu¯€J¥ÂÇ7L0Ó0‰i!ð}®ç¢V«óÅÅ&„ ºn,–ËÃßÛ±}çsû÷|=½öSâGð/Ç/+?ˆ €~ôå£Û^:zô‘f«qȲ,¹cû¶mÛ$Êå0Æ@R J…Ê"„D¿¤h6xëÌ[˜9q\4›M–ËæíØyÓßÏ}/ö ÀO‘àE$¨kB@´¾ æZ$,TŠßýö¾¼¼|¥2&÷ß¾ŸMŒO€R ×uá:üÀH)A‰î!áû!RÁ²,lc õz G_:*Μy‹åsù£÷ÜýGwîÜ9×|’ïZ`&À÷"Á ?ýÌÓgŽûk+cîµçæ=êÖ[÷J(–W–ÑiÛÐ4å‘ Ã€”õZ–•Tžëvï‘  ¥Š‰XXXÀìì,FGG±gï^ LŸÆÏŽQ¥béÉG>þÉG5Ms{Þ½µB$YcÝ›=$&sn}õkÿe­¶ô[ï½ën2¹m v«…z½i›¢X,a¨XŒƒ]µºMÓÁy¼WBä*"Z­Þxã H)15µ7ß|3—ñô3ÿ- Ý<úÑüÞßT*•fp|$î 0ˆ«1_yüËŸ©ÕkÞït|Ã8ªÕ%´ÛvìÔ¡`Œ!Ÿ/ð\”†J°[MH)SÈøç¤%Øí6N½þ:8ç(—GpðŽƒpO}ïIE^úÄ}ê³™L¦“ï&¬À¿,¢Ü¾K@O"¾þ¯ýáÜÜì#¼ïC¤R©àÂ… /þ" —þŽ$ "kI[ÂjYYYÆéÓoBJ‰|¾€ß¸óNpà;ÿõmaæÿôÓñ·iàÉÏýjÚ§ªÓzHîžþû·ÌÍÍ>rÇCdll gß>ƒNdžR€à­fµZ Õj+õ:<ß]•ì)(œƒs)„àœó84®NŠÅ"6l´ZMüàùç`ÞwÏûYËnÝýûú‡SÏ™ÎL±.R™\¼@«V«Å—þÊç·Ý¸MMMNaöÜ9´[-A€€ûh4Và{>””PRÂ4ê+°í Î?€JIH)"-RJøž‘TJ(ãã0LÐn·qøÇ?ÆXe ·Þ²ÌΞûì+¯¼x}åiQ8_7¬GJ«пûä×5­tÛ¾ÛéòrµÈá .ÐnÙ±GO×9mÛ†çus€´BHH9>þžóAàÇ¿ïZ¥›7mŒ¯\«ÕðÚk¯a׎](—Éá~ü¹šOâL@ÄRúËñN¿uzCµºôà¾[ö1‚ÙÙs@¤!%xš°ÂjTäè\§©”Œ€ 6 (c”i¤Tà\Àq\x^ (•JÈå²±…œ:uKKKØwëmZ»Ó¹íÙçž}w+fX´¼Z@²È¸ä?úÁóå²y²uËu˜ŸŸ‚°‚"¡K)C ±G¡Ç§!8!” ”‚F©1PJ ih”¡58ŽƒN» »e£m·‘Ëfá8t:t:Žþ솇Ëؼy‹8yræÓ=ÈØÖ$€õ¨¶´ååå|­^ûОÝ{™ïy¨×ê±~I´N¥¡EÈ´BQNÀ@¡¤ ”ÒK¼=hºCgQ(”áõ¢h!¥ÄÐP1¾P­Uq~n»wÜÌÚ¶}ËOþôÆ>8X_RÝ[š&ã?zþ!Dß´q#ªÕ*¤à ç> ÓôX›P¡¿%0- !¡TÓñ¿+”1躑)%Ãøù„|¡:QH( œ8yÃå2 …?qüØ}=pе,€vaáüÝ›6nR”2¬¬ÔÉÊÅÌ JBÓu膦iИÃ0`™™ÐJ"ðŠ HΣïʾ±Ÿ1]×cÍ«è~R*ò¹àˆè…óçÑq:˜Ü6¥-7÷÷éдH@ú`Ûö{6ŽOPÇqàº^äèTøP‘¦cgEµÌ4 „²Xsçè´m4íV+¨Ukp'þÞ¥hºJI‚ìм2™,aÈçó€RRbîÜ,6ŒŽ!ðýÓÓÓú´äi?HŸ¦¯üü•ÍB sd¤Ûn]tn]íÅ¡,|¸®èjNJ Îy– JsƒÀG³Õ„Ón¯J}Ó©qw©Èèz„R —‡QÈç‘Éfa& .\X@.—¼ñ‹×wõÁCÐSÎ;;E)U…¡!øž>” ›T2z°0¼IyÑ’ïÝ,OuãcäÀ$—±ÈK,`Õg~ײ,B`Z:Ú¶€€êµ:(e(•JÁÊòòö˜úГ»eOäó9N ÍY&x%c‡%à»±?¾!aø£ €®}L\[c4,¨òy €Ã4 ¡Ð²[PJ¢8Td®ëN\.éâ(&$üœ¡›a¼'£$ M 2ìfK¥ „­¡»,¢pHhØò¢”†À†FC7Áícú P""(j§é† Ë²Íæ@@ 1Î9„0L“ .JëéyÐõTˆYÃ0( „€i™à®gF¬e©$„à‰Ï*ª ˜Æ éZx B ë:²¹Lœ)öóªK®”ྥ×q Rc ”@7Âháû Ý€”r¨.²V[\¥ÞS €i:ˆT Z´½EÝBI ÂXøNht3‚\.ôÚÑZHt„Vß§ûJº¦ÁsÂÈ#ƒïÖí¶ Ïq!¤¥,ê?ÐnÅIÖƒ‹®ñO €Ò(³=ß“**H —Í…¦¬äª¤'‘ü§,@BDÅŽJÔ}µžMס[ft= m·!¤D»ÝFÛi£[|¦Ã0à{>4¦­¤jêžJÕúìάM×Û§§´aÖ§!›ËÃó\H!EBHrÛ7L“¥”!BsÆØ Ndl IKÈXtMçRHöºà•R0LŒ1ø¾' £ÍJíi} Èf3‹ív[ã\Äk-Lq)(£ u±xï¾)€Q-ò¡8Ng€Ç—}ònfHa:LËe žç¯ú{>—@°ÒlÓ0R{É÷\ò¥¯Ÿ€€‹R¯/¯²’Je#• fNÎðL&{äÎ;ßûz/,½öVí«§'2âÏw:ôMÇs17?‡áò†ŠCÈåóÈåóÈd,@XV™lÙl™LšfD™o´BHd”(„Ÿ¥’pÝNÊ'\꥔¨V«;G”bïÞway¹ŽÅÅEí¦©í_NÍ$IXW-Àû $ñS;æËÃ#ßymú5Áy€Je†iÀ0¸¾wœ (e`š? JÁu´ZM´;m~ÃI”59Îk¿»CÔ€çyq<›œœD¾Ç˯¾Ê³™ìË÷Ý÷Á£0¬M@d&¼ÇDÀçÁÿ½TjéØô1‘ÏËçW= ç¶ÝB§ÓŽcb¨ÕjhwB ó ÀJ³F£–JÂ0 èºæ ñv)–“ÀùóçcÏ?R.cÇŽ8}úZvÿëž{>ßãÙydþj½€>àÁÈÈHk÷îÝÎÎÍÒ³oŸÅØØ8,ËZeº„°Ki©Ùj* !›É†¡1Ÿ‡ë{h;NXj:¬LÙLÙx …SMÓ1;7ß÷¥PÂþP_^ÆÌÉj|ÃÆÇöîÚ;—˜áki¿/‘ýfrî}ßýG6oÚòØË¯¾„¥¥EŒOlŒ»4†i ›ËƒRа"¡”@·™Ò-¡Y¨z.mïîQÏsÑnÛð}ù|J,×—…B„ëzøÉ‘d±XüÖÃûƒoö˜ ¢¡Jy%Ûãt­ù€úÒ?|Þ¶[¼ý+ —ã}AB™1纰ÛmX–[†ãv „Àpq84{¥àz.<׉¦F±YJœzý <@¹<‚ýû÷#|þÉa®Ž}òòÇÙl¶“Úîn{W3!¢õà8Næ«ÿú/_hÙÍì{Ï>:>±ÍF¶Ý wx¥žï£Óq DJÂô8—Ë1¶º÷‡0ÍwŽ%ÍÞ>û6”&§¶ajê&4+xá§/piÇüífëÖ­õÔ˜Œ—“W;#d¤FcÌÔ”ùÏéÏ–¾ij»Ú¾ý&"…DµºÇé _(ÄSö‚;É2r˜ÉŽóÂÂÎ/ 4\®»P(pæìLÏLËl&ûüÿÿñ¿²SsB빜1¹~àã ±oýç¿?ðÖ/~ñW™lÖzמ½ze¤×uá|ßGÔ-sr±þ ÷ÈêÍ&Ëæ°õº­q‘óÚôtP_®attì?öÐÃ_ÑuÝëÞÀ×rN$ÐS$Äòæ›§Æžyö™Ï5[Í÷VF*|ÇM;´‘‘H©à¹.<߃ˆ#º=$5O}ß‹çsùF+£Ðt­V§N¿!fgϱL&sü¶[oû‡N÷”ô×;v%“¢¤ÇŒ`ÏIÑþð¹=ÇfŽ}ÂnÙwär¹`ó¦ÍúƉ(ä ”^ÜðŒZå„’Ði†M´;m,\XÀ¹ÙÙ Ùlè–eM_wýõ_|ð7÷G}&Eƒ+Ùãò ô„%ôKa´޼093süfcù¾ à(¥r¸4,‹Å!M×thZX"s àvÇæ+õâ>cŒ5 …³[¯»á©î}à¥TVד€õšýUŸˆæÔôÀiñ#/¹þì™·v¯¬,ßìyÞ ‚‹’rˆEa-±]×Ï ‹Ç7Ml™>xðà)]׃^‡%z‘p¥#óW|`"qJdÍIñužH̯u^€'À_ñ¡‰«=1B®Á‰Õ£'¹æ‘™(à p•¯kufˆ®ó°Äµ83$ÖJoåô b-ótjlà±™k}–ð—un`ð¹Aô82ÓÏäµ>*÷K'`!¤Ï¸äÜЯâÔè;¯w^ï¼ð¿ úu5rlñŠIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/mask.png0000644000175000017500000017526212412506713020132 0ustar sergiosergio‰PNG  IHDR^nÜsRGB®Îé pHYsgŸÒRtIMEÛ /s\å¤$tEXtCommentLEAD Technologies Inc. V1.01~Ѓ IDATxÚì½y\åu6þôÞ}{ßfzF#f¤Ñ $dd# c0q;ÞƒíØU¡Hq\•ò’¯ˆc‡2æ‹?;Ž l'v Žù9^ ð‚ [,V@„Ö‘4£Ùgz™žÞ»owß^îïñ¼y»;Z¸§jJR«»§ûÞ÷=ï9ÏyÎsÃ^ÑV(ôÅÅE]UUݸ†ý±f5.Á+Ïfggõz½›Í†t:z½Žz½n\à GðZ±ÅÅE½X,¢ÕjÁl6Ìf³ø»¦i:³Z­&ãŠf8‚W‘©ªª'“I”Ëe4›M˜L&èºÎ “É„f³©çr¹Ž×ØívÃ!ö’f,W€ÍÍÍéÅbõz‹V«6› ‹E8“É“É§Ó ³Ù —˗˨V«¨V«Ðu}}}Æ=7̈^ivìØ1}qq­V V«V«‡‡º®C×Ob„Ífõz‡àr¹`³ÙÐjµP©TP¯×Ñh4Œ j˜¼R,NëÓÓÓÈçó°ÙlðxŸG&“¦ip:P6› `³Ù`2™`µZ…S°Z­"€l6‹v» «Õ ³Ù ]ס( |>–——Q©Tàv»Fûo˜‘¬F›™™A«Õ›×årÁétÂjµŠˆ€¦ë:Z­L&ªÕ*l6œN'zzzÐl6Ñh4 ª*Z­ªÕ*|>ìv;ªÕ*4Mƒªªº¢(†30̈V“MOOë“““°Ûíp¹\PN§6›MTˆ tÜD“IüÙl6aµZ‰D`±X ë:R©4MC«Õ‚Ëå¥ÇV«X»v­±ŒˆÀ°Õ`ñx\?qâ„Øü²°X,…B°Ùl"Ï—­Ñh P( Ñhˆ(!—Ë!‰Àd2¡·· U·Û V" 3Ìl\‚Õa¥RI„ïn·»#Xéô—Íf³Áï÷Ãf³¡¯¯Á`Íf‰DF&“ ‘Hn·ívív[ü³ÙŒd2iГ G`ØÙ¶t:­·Z-ƒA8NØívÁ$P­VE(¿’Ùl6‘0­«.— ‘Hf³Íf•JÑhÔät:;pà G`ØYŒ,‹ØÈf³¹#ïçß™ç7 ´Z­óù|°X,h·ÛÈd2âq«ÕŠV«UUýýý&¿ßo܄׸ ÑY¶¹¹9Ž@Q°Àf³Áív‹(!“Ɉ°~¥4¡Û)¤R)T«UX­VƒAT«U„B!d³Y@,3Ö€aFDp¶­ÙlÂl6‹ðœ€¼É†ÈíŸëxI'œ,5’†¬i–——¡iàr¹ …Œ`˜áζ%“I½ÑhÀb±ˆŠ#:ƒV«MÓDíßf³uà/eL7ŠÅ"Ê岈ìv» 8ÙÖlÜ Ãv–¬^¯  OyMÓ4T*•+ +ù‹E¤ív¥RIDÀÉÅr¹lÜ Ãv6Ó€üwd4°±H¶v»-^‰D/iA>Ÿÿƒ" à G`Ø)´ÅÅE€8­u]YeU†^ ,äk¬V«(+²ÝÙ0à Gp†l~~^WU‹E(u{Ýx@÷IÞ]>”Oøsrz ÿNcò‘a+™!Ms#²G[PÆØD™rÙÈ©; ’$W Ìf³ÐàûÔj5Á0›Í†„¹aFDp¦,‘HèÙl¶cÈmyyYP…+• 4M}+uÊÎà…X€ív{E¼€¯åÌþ^à 3Á°¾¾>Óä䤘JL0 ƒ¢)ˆŽ ‚CLåÒ œ:0èÞøŒ6äôƒ-ÎF:`˜áΰÅãq]UU1¥Hÿ˜¯“äv»;Aš¦uŒ/k4ÂY°ì'ã+E2&Ðl6 '`ØË2cœb;xð ÎÓ\Þø<­©,3 ´Z-ô÷÷w€ív»cš±\6$¶@Яk6›"0HC†ÁY0MÓĸ±jµŠr¹ŒZ­&4Èõw8p»ÝðxØl61ÛiE0D»ÝF¡PÃMý~¿i~~^÷ù|ðûýƽ5̈Δ5›MýÉ'Ÿ„ÙlF0D6›…Óé„Ûí`a½^ï £ƒp¹\Ðu]8â Ý D¦V«U8MÓDi€ˆ˜Vf˜œA;|ø°~øða4 „B!¸\.ÈCã¦g…@.’UX*•Ħw8_éĬtW LÀ0#"8KV*•Ðjµ (JGËo½^(¿,K622‚ååe¨ªŠjµ*f0ÿw8âßFµZ­£ßÀáp'ÂÈ€AUUÝ(fDgØ4MÓwïÞz½ŽP($H¹ùI¦eËÒû|>äóy¨ª*ÊŒN§Slt:—ˇÃ!¸Œ.ø'£ âÆ1̈Π8pÅbV«Ífõz6›­C”T×u!LÒjµÄs†Ðôz½Põz½ƒJÜÍ"lµZ±0µ ©á 3ÁYÀfggÅ)]«Õ`6›ÑÓÓ#€Àp8ü¼œL&…Ã(—ˢπZ‚Ífóyú…|Œ©ÉHFårf³Ùp†ŽàLÛââ¢>>>]×Ñ××'“(Š"À¾|>d2)J‘HDt"Ê#ËkµÊå2šÍ¦˜PL@"ÍëõŠNB«Õ UUaµZwÅ0ÜAK§Óz::ÍfÅb­V •JEˆ8N˜Íf4›M”ËeT«Uäóyx½^ôööÂb± ¿¿333Ðu]Dù|^¼7pRO€é€Ùlà!1ˆååe(в֏3†Žà šÚí6r¹òù|{÷îÅÑ£G‘Ïç¡( TU…ªªˆF£¢ƒ1 AUULLL`hhÇŽ¤'à¤ÞÁÜÜZ­€(ez<„Ãa¸Ýn!ªÂÒg«ÕÂUW]…OúÓ†’á^ý677§g³Y4 QÃçiét:…¼ØÒÒz{{ÅëªÕ*ŠÅ"êõº8ÍÛí6l6‚Á Ö®]Ë´KKK°X,ðù|NÎK$QIUUd2,--á÷¿ÿ=æçça6›Q.—…>"Ooo/"‘¬V+¢Ñ(vî܉¡¡!T*ÜÿýxàÄçhµZp:(‹°X,ã þQ«ÕÄäe9¢¡CÌçóp»Ý¸ì²Ëpå•WâÜsÏ5Ö”á^}–N§õ©©)Ôj5!Òê“ÌváîMNk4XXX@½^³úûû1<< ˜™™Á088ˆz½§Ó‰J¥³ÙŒññqqrß}÷ݘ››ÃÆ…SÉçóèééA±XDoo/b±.¿ür\ýõ°Ûí÷ùÖ[oÕo¾ùfø|> aff^¯„Ó‘¨ˆ‡”J%Øl6´Ûmx<¬]»±XLT0òù<®»î:\ýõ¦f³9hµZgd8‚W…ÍÏÏë‰Dº®Ãçó ðNOÖjµ˜ÇS´Õj‰6bEQ£Ä¢|>/°p8,6âââ"jµ|>†('¦Ói<ýôÓ8~ü8yä¬_¿ªªŠßµcÇ<õÔSÐuŸüä'ñÞ÷¾[¶lyÁûû­o}K¿þúë›7oÆââ"†‡‡±¸¸(ô4Mà#G~.F.Á`P€Œv»»víÂí·ß¿öÚk׫ç•cÆÔ—°jµ ³Ù,ˆ< ñÙ4$Ó€†è dÙ/—Ë!“É`aa‘hãÆ¨V«X\\D>ŸGoo/B¡ÓÍf3ìv»è,œššÂþýû±~ýz$ ‘Bô÷÷ãøñãèëëÃm·Ý†O|â/êàúë¯7íÚµ oxÃH$°uëV9rDTŠÅ¢èq oBQ”“§‡É„F£l6‹¹¹9,..¢Z­Âétbçθçž{úÇÇÇÕcD¯ K$z:ä»Ý.Úƒeš¯L(ªT*´Z-Ôëuá Ìf3^÷º×ÉïD"!¨Ç}}}h4˜…ßïål6‹Ã‡ã?ÿó?±°° 8ÅbCCCX\\„ÕjÅ_þå_âË_þò˺§ªª^âr¹>¹wïÞw|ìcC:ÃQ§§§ÑjµF¡ë:ªÕªàF”ËeA–¢T»ÍfC$A$Áºuë0>>ŽíÛ·ãSŸúT|ddĈ GðʶcÇŽé<é(BÀ2Ûí's·5 ¤ÓiÔj5Ôj51éˆmÃ}}}H¥RXZZB¥RÕjE0„ÝnG*•¿óĉøîw¿‹'Ÿ|kÖ¬Á‰'°sçN;v²×èõ¯=vî܉뮻k×®}Ù÷´Ùl^mµZï¿÷Þ{õ¿ýÛ¿tãL&“ɇÃ!ÀB‡Ã‹Å"Z§ùCÅ%ʵkš†K/½óóóˆÅbx÷»ßøÃÆ:3Á+ÈårÐu]è²”Dz›ÜoÀ¿¢(ƒÏs©T ÅbQ„ÜŠ¢ §§½½½ˆÇãH&“( ؾ};öìÙ#´ üq|éK_‚ªª¢¼Øjµ°´´„7â{ßû<†††^ÖýL&“¦X,¦Ëýú׿®_yå•vŽ^ ƒ(‹Èd2P•J‡C𠨙 k$Øl6„Ãa  ^¯Ããñ ··7Çw|Íjµ~ÞXYFðŠ2ÊŒ±ŒœDÔ);îv»a³Ù:6¹ü‰DB„ð´ÞÞ^*‰¶e*÷÷÷## ¢Ñh°£P0gggQ«ÕÄæ,—ËPU.— ·Þz+Î;ï<ÓËu‹Åôd2–»òÊ+7ß|sÆëõ ¹Â9ŠrZ Ot6›Í‚¤´ÿ~ lÞ¼N§O>ùdàÁ|§±ªV¯݇/*=W$_€èdu€x D,åÕj5är9ÌÍÍ!`dd6› (‹H&“Èd2Èd2ܘp»Ýh·ÛÈf³( P•JÕjSSS‚݉DP( qÇwà²Ë.û£¢ºX,–‘ÿN§û£Ñhä}ï{_ýÉ'Ÿ´g2Äb18Nd21{AVEâS&F7nÄÄÄ>Œ /¼###xàÎ7V•¼¢,ëÕjU佋Eðþ½^/‡ø?EQÉÈëõ¢V«Áb± ‰ §§š¦áàÁƒ¢jàóù022‚h4 ³ÙŒR©„|>ƒQ˜–?~\”"«Õ*‰vîÜùG;•,ÆছnZ&ÈîFUU Q.—Ŧg:D…%™¥(71---aaaÅb÷Þ{¯š¦Ýb¬2#Xõ633£—ËeØív8NSBœ}üûJ677MÓ:¦@(B¿xÎÒÒÚí6|>J¥J¥b±¦¦¦ðøããŽ;î¿?ŸÏãƒü nºé&œþù§åþ}ãßпúÕ¯ÂãñàÈ‘#ˆD"¢„(h펠€“b«‰D@@@ô0lÛ¶ ¸òÊ+ñ‘|ÄXwFD°ºmqqQ¯Õj¢üGTœ5}ö÷çr9!("Ï* ­[·7nÍ?ìC˜››Ã‰'Äiïp8 ijµZÇà“J¥‚v»Ÿüä'H¥R°ÙlH§Óx÷»ß¿û»¿;mNn¼ñFÓèè(4M³I b©TN (ÐJ ö¾¾>Øl6Ñ;a±X0;;‹|>»îº ?üáËÆJ3Áª6†¿,ÊF0ŒáoµZE&“Áüü<¦§§155…ãÇ£Ñhˆ×ôõõaxxÁ`PDétGŽA©TB0D8‡³+• žyæ<ûì³b‚ÒßøF|ò“ŸÄæÍ›Oû‰zÙe—áØ±cƒ¨Õj‚C!—N9«AæR U.—E€`H>q¸}ôÑß«Íp«Ö8_Ü"ådØq†!BY²œ ÚÜÜfff°¼¼,Þw``º®£··WHšµZ- 'ÁÈ#“ÉÀjµâî»ï„Ãaø|>|îsŸÃë^÷º3VÿÙŸý™ÀD˜óËíÐÝÆï ‘J¥`·Û …L&Q«Õàv»166†þþ~4›Müüç??ÇXm†#X•–N§uJ‹s“³,FT¼Õju é>!)-V,‘N§Hçž{®¨·“ŒCgáp8 …Ðh4°nÝ:ìÞ½Ï>û,úúú0??o¼o}ë[ÏXn}î¹çš^ÿú×£P(ˆ”Èår‰¤Vwÿ4 1¸Õd2! BµZÅÞ½{1::Šýû÷÷ïÛ·Ï !Ž`õY±XìèÓgQrþIçàñxD‘ËŽl ^^^ÆáÇ‘L&ÅœB²ô(n"ƒpÄ îºë.ÁUxÝë^‡ë®»îŒ_÷¾÷½¨×ëâ;‘ÈDE¦îÈ@×u,//Ãn· >…ÃáòîV«ÇÇüüŸ>ŸŠ¢ ŸÏ£P(t8n V ¨Sàr¹¨ÈÈaÿþýèééÁÛÞö6\qů·Ûíÿ÷,G¦ /¼PÌYàé@È´‘A)w ÒQÊ£ÜeÕj5Äb1LLLÀï÷cÏž=8xð n¬D#58«¶¼¼,ÔyIšé.úýþò⦜"Ħ"Ž;s8èééZ…ÕjÉdR€’ÀÉVå'NàòË/Ç5×\óž] ×碋.Â׿þuAs YéX ãdºÃVj‰ù|^p EÁ‰'Ð×ׇ»îº sssúºuëŒÁˆμ%“I½R©ê°ìl6¼^/¢Ñè :žækÖ¬ÇãA0yt£ÑãÔùS~¿_42Ññhš† Ùlâo|ãÌE]ôWË5Úºu+¡iZǬyºÓ&žür%ü¾ÎãñåeNazôÑGñÈ#;ÒpgÇÚÊåB9ŒLì(‡½E"‘f0] Êõ ÙŽLý?nœB¡€Ç{ ëÖ­ÃE]´ª®ÑÐÐÎ;ï<Á)à&§µÛmÔëõz6#Ž„#JÝG2M&¦¦¦`µZñ›ßüÆØ‘†#8‹Ṇ"Êwó”#°—ËåJ¥Ç‘J¥J¥°°°€™™™çaÔï“Y†TæÉOÌ'%†Ï<ó †††0444¤iÚ[VËõQÅ4<<Ü1¡¹ÛÔj5T*ýÐqÊß‘Í\š¦ a•l6‹t: ¯×‹#GŽ ™LXáμQÃ? Áãñ<¯lÈ4Án·Ãn·‹nC‚~ñx{öìÁ±cÇJ¥ÄûÆb1ŒŽŽ ¥!Š˜”J%áEÕjÅÀÀî½÷^¤Óilß¾`·Ûw­¦ë´qãFX,Ñ€DTCÚ55 «Õ*\.—Åþœ3Ëå‘+ ¤#ÏÏÏCQŒ1ìdµ™ÏçΧ:‰Wrd@°L–MÓ:øœädà†#8£–H$ôT*%12PÈ›Ó~(-Î…ÍS0N‹Z¥Rº‚dßU*±±©HðpË–-H$h·Û8pàŽ=Š;wbË–-«òz1ݱZ­Â 0üç5#HÉàPX6.É-ÍÄÀؽ{÷»ÒpgÎXþ"Í·Ñhˆp•ĘP(Ôa¯ÅbA,C£ÑÀÒÒ’h8âôcQUn·.— ëׯÇää$Ün·àî' <ñİX,ؾ};Ö¬Y³*Ëg@@DL2·‚›_f_2’{jµªÕª¨(ÈN‚ÑD«ÕB±XÄïÿ{ýâ‹/6ʈFpúMfÀqa“UÈq^ÝÂ$žWF´ÙlX³f b±z{{~àv»¡(Špä„B!lذ‹‹‹h¥Py‚ IDAT·Û8~ü8vïÞ¡¡!\vÙe«öz‘È ;,¹±åÖlÙ1бò: ‘ð1²9z×®]ÆÎ4ÁúâÏU x‘.ËÒX±XhÿË1›Í&Ô…1ðwWÐl6 E%3 ŠÅ"6mÚ´jñ:@™j-weÊF§ ;² m6›¨ ð¹¤hó¹Åbûöí3ªFjpf@BrçÂÚíöŽMOgнÐK¥’‘Ö¬Y#ÒŽ N “’¨Ôn·»0“É ÝnÃn·#‘H`ÿþýÅ…^¸jÓ:jä$Ø';nðp¥çÉñL'è„K¥æççñÐC»ÓˆN¯e2¡ŸGQ¯×+FË [xªi\.‚Á ü~?šÍ&:„½{÷âСC˜œœ ~ݺuNê V*Á.´Z­°ÛíØ³gzè!lÙ²ò'²ª¯Y(‚Óéì@ý9þ…”I$"i‹iÕŸe'‰G†½÷Þ{qøða#*0"‚Ó rr©¾ù|^L0îæ¸ÝnT*4›M‘.p z,ƒ¦iÈçóˆÇãX^^F0ĦM›Ð×ׇ@ yˆhš†¡¡!LLL`Íš5رc¶nÝjZíÎSÓ4‘BQk€ +;8娊 ¹ü;0«L›šÍ&ü~?ŠÅ"ÆÇÇ1==mìPÜ^ Pî kµZbAÊ'•Ýnï(‹E¬_¿ÉdÕjÕjU,è`0ˆH$‚L&ƒr¹ŒƒÂãñÀétÂãñt4ì躎d2‰\.¿ßµk×®úkÆ!­Š¢pUUUUÉ®”*CàõzÅõ$‘¦jõz‡333Æ5Áéu½( Á” œNgGš@¦p’5È…ŸJ¥D]¼ÙlÂãñ T* ÂpR”„*ÈrdÏç±eËœsÎêôM§Ó‚"Ý=è„ܲ-ù½åÑhÔ1àu¥–©ÊÝ–Ÿxâ £#ÑÀNŸÉ¹¿¢òäcêðrJ0ˆ8AC—Ë%DMÙÃßÅ¡!<ù.»ì2¬_¿~Õ/ôééiÑ-)óÄBz.šê¾Î|.E[UUýòä(v&’ÄU,ñÔSOáw¿û±Kˆàô/A0òä«Õ*J¥’  è"cÎápˆ±elA€d2)NK › ££!i¦X,¢Ýnã /|E\³±±14›Mø|>‘æð{²2ÒM9îNˆÈUÙ™ðú¸\.¨ªŠZ­fPŽˆàôX"‘Ðyò<Äò¡¼À¹(K¥’ —Ëe1ÑèÀ˜íxïX,†¡¡!(Š"èÄ\ø­V •JápªªbÏž=P›6mZõÑÀä䤾ÿ~¶wGÝ›y%c*ær¹ ‰ä‘I¼ÆétbrrSSSFõÀˆN­±*Àº8ÃtUU_²¦ë:6lØ€R©„l6‹x<މ‰ ôôôà¼óÎ"‹‰þ| 22b” Gpj¬{á2"ðûýÏã¼Ùl6Qö’îV«…r¹Œþþ~Öj5$“I˜L&8ÄãqŒcÓ¦M«(TE;räÈÔ%—\âVU±XL¨=Ë×q%ëvŒÈ+`ô%WºP‰%˜Íf¤R)ü÷ÿ·±[O£½æª$²È¥+¶Çf2™BŒì<öØcú%—\b¤†#øãm~~^_^^†¢(ÂÈÄY\CvdÓ± F•g$ 9N„B!X­VD£Q¡Ø»´´$ø ­VKˆšÒq¬VûÆ7¾T*…h4 UU;B{yƒËéU÷¦_I¨„ŽVV4&ƒŠToâüMÓpìØ1ÜyçH§Óz45œáþ8£®¾Åbé@¶eàJVÓáã\à¬,D£QÑAW«ÕD_{ôƒÁ ˜†œH$Ä$–ËÒé4¶lÙ‚Õ|²=þøãúµ×^‹@ Ð1Î\NV:õå/§²dY÷ýàÆçcäÔj5øý~ÑìT­VñË_þo~ó›]k8‚?Þl6Ün·p ÷Ù';¦Äxš·Ûmd³Ù“Îj…×ëE0„¦i(‹(•J˜››CµZE½^G,C«ÕB6›ãÃï¹ç|êSŸZµ×izzzü3Ÿù ;´šÍfÑXÔü!xII[ ’‚MA«V«‡Ã°ÛíXZZÂ/ùKhš¦Ûív#*0ÁnN§S ø,RsÏjµ B›Í&€?nxFÍfS4%Õj5‹EÑ2‰D°mÛ6LNN"—ËarrRH¡õôô —ËáñÇÇÀÀ.¸à‚U{>÷¹Ïá׿þµ˜IP*•DTÀ6á•ÀÀ•§É \ìGÐ4 >ŸO„ÿLdçËh‚ÌÏ@ €ýû÷ãW¿ú•±sO±½fªÑhÔÄ Æa¸NÍ~›Í&3l;¦ )p½æTàõë×cttT´-/,,`÷îÝÐ4 [¶lAoo/òù¼`"ær9üô§?EOO|>ߪ»>ªªž{ýõ×ßñÛßþv„›Ÿýܼ݊Îÿ“Õ‹¨IG0„×ë#ÕyoÌf32™ŒA02"‚?Þ …‚žÉd:ÂZ¦ ÙlV`}}}¯“;{{{Ÿ÷¾ìPd/~:F(B @«Õ‚ÍfÃôô´`Ô !¯ªk³ÿ~ïG?úѯÿîw¿»´P(ÀëõBQÁ¾dÃ\QùcMÆ È¸¤ƒv:BÁ‰8 V ÀÖëu<øàƒ¸ï¾ûôw½ë]Fz`8‚—oñx\O¥R‚ÙÆn@¹‹Ž ×ÔÔ”h­-—˨V«0›ÍPEL/ ƒÂ9°yaa•JÁ`³³³p:زe r¹‰0::ŠááaƒÁUsmŽ9ýÄ'>ñÿ~øáKûúúÐÓÓ«ÕŠb±(6>S£SarþÏj µX©ac£vp’~¬ë:¾ýío»×pX$°¸¸ˆf³ ‡Ã‡Ãñ¢ÏgC ÕtJ¥’˜\”Ïç±°° ¢€@ €`0ˆ¾¾> ˆ÷سg€“Í:ù|Š¢Àn·cvvoûÛ‹ÅVÅIöÀìúèG?º~lllýÐÐ*• ìv;TUE>Ÿ ‰R(0øbQÌ9'#QîåZb6l¶Z­ðûý˜™™1¢Ã¼|ã©ÆªA÷ÉÖM)îééý õÃá°x]&“ªª‚‰¨( âñ¸ j2™‹Å088ˆcÇŽáøñãÆÂÂŽ=ŠžžžUq]n½õVýýï?J¥Ä3*QÙYÓ4Q6ì'=e@•¤`ÌA©vˆ€”ãjµŠr¹ŒX,†¯~õ«8|ø°¾Ú…_ G°J@™™ªÅdÊ'“œ0… –åE‡Ã›Í†mÛ¶¡P(ˆ^Åb¹\ÓÓÓPU7n8Æx<އ~½½½…Bgõz<ñÄú¾ðÜ|óÍp¹\X»v­Ð]ŒD""<ç´&*³¶*LÆ (WÆVäR©$*1š¦‰T#å8Cqyysss¸çž{Çõþþ~ÃŽàÅ‹˜ê:ÝÃNå ¡,JÊ×ÄÄDÇk¼^¯P:6™L(—ËXZZB±XD$ÁÖ­[±wï^ìÚµ ###p»ÝgüûòùüŠóO—Ýwß}ú÷¾÷=\rÉ%(‹ðz½…¯×ëˆD"Èf³¢éŠæñxÐh4„€Sâˆ1È8ƒÃá³! ‹‘qáp¸ƒÄ …Dær¹`2™ i¾öµ¯3 GðÒÇunV6Ñpâ+òB•#™þZ(°~ýzd"¯B¡€={ö`óæÍØ´i“˜„äõzáóùDß©²ÙÙY=ŸÏ£P(@UUŒajj Ä7Þ(ˆ@===°Ùl"¼g9PôB*ïËi*úß:9±‚R©$* ÂJO¥R¯m6›¢ïCÓ4Œãûßÿ¾þ¡}Ȉ Gð< P7›Í8~ü¸P#&[† ;e½Á\.'¨®jj³Ù:„D|>Ÿ % ±9(‘H`||Íf;wîÄÐÐvíÚ…±±1<øàƒ:?ù­VKpëe¥òïI‰.‹"ýX\\ć>ô!ÌÏÏ#£ÑhÀï÷‹´†òh‡Cl9Ïf>üÜx©TZ1”?]&;^²µðQ½HUU¡Å´ÍétBQ,,,àG?ú‘±£ Gð|³Ûí¦Ý»wëÑhTL+¦´‡ltã333¨T*( (•JâDr¹\p8Ø´i“ƒ&Ó`)jR«Õ‰D ª*‚Á 6lØ€£GâàÁƒˆF£¸é¦›ÏçE©În·£Z­¢Õj g%c¤6ó$–Óyž‚ßï§óC0CUêõºhìñx<ÈçóBY‰ßŸ‘\&”7ê©âÈ'?›¾ø»ëõ:¬VkÇ$i‡Ã!®«ü̶b6›P©TpðàAüâ¿ÐßñŽwˆ/Ñl67Z­ÖÆV ìæÕüåTUÕ>,º‘‘,,,¼à‰GÉ,n>žHõz]œÊt"lRr8P^¯}}}¢äxèÐ!¤R)ƒAŒãÎ;ïÄÀÀr¹fffP(àv»•—v<Ê PÜŒœª,&çé)j*v °è ôòñr¹¼âsWÊéOÉéóœê1ÿ.w‚x•UÉ1`Õ'‰ˆhÎï÷Ãn·‹HêœsÎÁUW]…üãðûýFšðZŒ …‚žJ¥°¼¼Œ‡~·Ývn¹åT«U>Ž™™üã?þ#ÆÆÆ0??uëÖ‰8“Éàãÿ8n¹åìܹ‡ê@íåŸ?™LV«U„Ÿ Û™ôõõ¡R©ê1;æØ­¨ë:|>‰J¥®¾újŒcyy¥RIP‰1p°J·šìäÈrŸœ¢È¸OPn4æÙÍf¹\NÈ1ßæï‘1¤ìþ,§*# ™jL§Eu ›Í&Êå2\.—ˆlÈt$V`µZQ«Õðæ7¿{öìÁ~ð\z饯.5E“““úää$víÚ…‰‰ LLLõ9”$ èõzQ(H$ð–·¼ÿôOÿ„‘‘œËÃKd!YhDÞ\°<±8£ ŸÏ &œ¢(ˆD"¢•™lÄC‡ᦛnÂÞðìß¿_Ðxù»»Õ“º77çæ_iCrsÕj5fÀ䦀R©$>u8šœÄ:‚n:ñ©l>z Wеy=x²Ù,EÓéì—c´¢iÖ­[‡¥¥%4›MlÛ¶ ·Ýv.ºè"@|—Õj½ÏØþ«8"H$z:F.—Ãââ"žyæ8pW]u2™ €ØHò¨ÕjBç.ŸÏcqqûØÇpÍ5×`pp.— ù|^œ¢²òé´¬§S=§ÕjÁçó‰™ÀÉ.CV¸K¥’ kš†óÎ;'NœN£\.# ‰P]f8Êډ܄݈=ãgîÆ8d#ODž™Ñøý~±É»§;Qx¤[]x¥ßsZO§ç"nry¼KŸ¼&r‹²ÉdB4E*•B.—C8ƾ}ûðñÿ÷¯_{íµØ¶m›Ép«4"˜˜˜ÐŸzê)ó,// >2™DµZ§.oz©TÒb¬‘Ë‹•ÅAÖ­[‡™™躎¡¡!¡Ê+/hÓu]r8š¬P(tä±ãã㢆ïñxà÷û:ÄüÇà™gžA±XÄï~÷; ÑpSsÁË‹^®—sãËá1yøòfí®zÈÜ}Î'ä³X,œ4›Í"àkùÞÝ}§{ów;d:;™ Nð“üˆF£Ñïð^ʪd2 ³ÙŒžžäóy<óÌ3øìg?‹`00¶þYtÍfSæ™g°oß>Ü|ó͘˜˜sòÍIø‘KCGÔYó–É4¤Æªª*6KµZ…¢(‡ÃÐu±X •JEtÊ!Ëm<òù¼ÐÒã‰Ü-^Úh4ÉdÉdDÔ@´·¿ýíh4¸å–[Äð…… Å#FrØ/§ÌÛe0¬Õj‰“ï…Nl^O¹rÀ膥B¦;ÙlVD &“I4uó dÉ÷n•âSm2!_ÞS™ôD§ÇÏÏûH‘ï‘N§áv»±iÓ&LOOã»ßý.yä‘ú¥—^ê0\ÀtÐyäÜpà xúé§Å)X©TÉdP©Tàp8àóùP.—…(H­VC¡Phq»Ý´^¹‹Ì¾@ ^¯ë:öíÛ‡÷¼ç=H$Ø»w/vî܉±±±ç• eľR©`Œ‹L&ßp¨ #”\.'ô ¨h±Xpà 7 àöÛoÇO<ÁÁA,,,çÆðVæ5ÈìBù´§ã!¢.oÌîkA'Êh‚„(þ™%«Ë~¥M.;œ3!œåõ®Õj©¿Óf³‰|>v»P($šÊÒé4Z­ªÕ*Ö®]‹_üâ(•Jö|°þ¶·½Íp§ #ÓŸ}öYÌÎÎbvvˆÇãbA\#0×=g€å,³Ù,¦³ìGÒ‰L‚!ˆæp8àõzQ«ÕÏç±uëVüÍßü Þô¦7ann½½½›ZÞHÜXŠ¢t æò“V«%wÖ¿‰ø³öÝjµH$088›Í†Ç{ þð‡qÑE¡ÙlâÀ¢<&çÿ w}>Ÿˆ\H¨áÌžxŒd6 7¾ .rѱ0¥¢ó‘_óB a·½œÙ‡§,ä{Ë'>q¹_‚‘ïŸÍfC&“A(‚Éd‚ÛíF±Xì˜Iép8°cÇíƒü`éòË/Ïöõõm2"‚S`³³³ú—¿üe|âŸÀÜÜœðÖ…B&“IpÂÙÇÏP¶Z­Ân·ÃãñÀd2 BO0 &¥R©#¿öz½ðz½h6›( bã²EuÍš5Ø»w/î¼óNlÞ¼›7omrýΈÆx:¨îiHܼ»ÁÇÑÑQø|>$“ID£QŒŒŒt8 ¹Í™›iˤËÒáð¹Ü¸+ñ äql¼îr¤ÁèÃãñ€£áÙ?‘ÏçÅw–I:g˺ÁP:y^Þ:CÞCâ!ÍfÁ`n·©TJ8öx¸\.8NìÛ·ÏþÐC…ÿüÏÿ<<33£¯_¿ÞdD¤íß¿_¿ÿþûñÄO ™L  £œ¯TçéÊN3–åT¼¥L8Ã^—Ëǃ\.‡f³)†Ž6 |ûÛ߯† °fÍ8Á ã¦dóЋMAÖu]Ì0àf£Ò.å¾kµšx/.¼@ “É„ï|ç;¸ýöÛ±sçNT«U<ýôÓ¹?O1ǻݎx<Þ‘;ŽÔœ‹\>Õä`6›E €ÓéÌH: ‚ƒv»^¯­V ™LFCT$ÈÁ Cíž>ôRåÄÿ­!Âȃ‚¥Älˆ°bÀ”Án·Ãçó 2£:Vø\:âQv»…B~¿;vìÀ 7Ü€sÏ=k×®5ÁË´t:­ß{ï½øÌg>ƒ©©)Øív¤R©ŽÐ“ˆ¯\7§S ð#‡Ç c™»24äBL¥Rp¹\ðù|XZZa41Ã÷øÃؾ}»ˆ2¸°Y$ÇhEžO(G lC&—€ŽN€<n€ÁÁA==T*…Ý»wã#ù‰òù¼˜è …Dy7_'®ìx³ºQ{‚sòi&çŵZMtñq2ˆE§™Ëå­¾ÅbÁ`årùyy¶ ’år¹Ž Èòf0™L8xð`GwÿduÎ9瑎,.. ÁŠŠ¨ª*¦2Ëࣞì:¦üt;,â²þŸ,±&÷òË÷‚Ÿ•›‹)ƒ×ë€"ßï/gÒ È\^Ÿîñê2Uœ‰¼ÎApÓ3EdšÇª“ÍfúuëÍfñƒüûöíÃg?ûYý ox§^µNáe±‡zHÿÆ7¾ééi躎L&ƒT*‡ÃX,&F€ä…çâ%ðEE Þ ¹Œ%×íy£å4Ãb±ª0O:æÖ¥RI0éqõÕWãÓŸþ4Î=÷\‹EÌÏÏcÆ âÄ]‰šË˜¿_Þ`\8N§St–J%1ü”´ç¡¡!ø|>„Ãa|ç;ßÁW¾òx½^¡¿7>>.š”äÓKæ*ÈŽ`áJ#Äa1zr8Â![a倛$-r.‚Á *•Šp¬ìAàg 3ßW‚z:@E™@Åë"OA ƒ‚Î-÷CÈ<âI¼_‡C\ §Ó‰¥¥%Á>-•JÐuG\O‚Æ$0ùý~œsÎ9رc‡ö×ý×öõõýék2"¸ÿþûõ»îº >ú(¢Ñ(æææ`2™0<< ]×ſׯ_T*ÕÑÕÇSƒsîd"O9þ­VƒÏçëh­e‰ˆ§3ÛˆIài·ÛÈårÐ4 ^¯õzv»÷ß?, Wy IDAT ®½öZlݺ.— óóóðù|Ï;ñäS‡…nÊœƒl6 §Ó)À©`0Øqê8p¡Pýýý¸ð áñxÉd°fÍš½=:†­4¹—›—›’½ò¦‘…KøÞÌ{e|†é” 0ò=ä®?¦krÊÄ×É÷k¥Rß™ˆ4M?ÝJÈtòý“GµÑiÒ¹²1«R© Z­Âét"#‰Àï÷ vqq“““xì±ÇìV«õõO>ùäí;wîüøk&"XXXÐó›ßà'?ù Ž9"½n>ŸÞ”-µN§³#¤æâažK𦻷x7ó~¾–Ý…œ%@YA¨··F^¯³³³°Ùl¸í¶ÛðÎw¾6› étZT%º»üäð÷ÅLUÕŽ&~.y"Ïš5k033ƒr¹Œ|ä#8r䮺ê*=zT` ɹ0¹i™ÒPi˜ÕâL³ˆôó^hš&ÚuåëE¦Q¬­SÄív#›Í¢V«app¥R ÙlVh)’è•Édž×u:À•"nXâðå /¼°ݺu¦WuD011¡ß~ûíxøá‡¡i<h¯5™LQgÆ…2ß %yÂñ"W*•ðŠ œeR©Ôá<¸È“ó è©%X,Ñ‘ÈÀÅîp8°mÛ6Ôëu‹ED£ÑŽÔCŽø~rÉs%„¼§§FÅbÅb&“ ~¿_8C»ÝŽcÇŽ!bÏž=8räˆpP¤(Óp±2ôeŠ#Ÿä²­¬ùGбŒetP«ÕP.—Ç  B×uär9ñÙEA­Vƒªª"…¡&`7OáŪ§3:`$ÂéKt”2§£P¦s`šäp8Íf …Dãeæ²”HI8^:ùH$‚‡~ØþÌ3Ïô_~ùå¸ÿþûõ‹/¾ø?ý~ÿÇ^uÁ7¿ùMý‡?ü¡ìÎd2¯×+7¼Øò鯲‰DÇÙéV.—EºV«‰I:Ìýâñ¸h±Z­¢‹Ž9CCzwz¦.— ËËËØ¼y3n¼ñF\rÉ%‡ÃXZZ‚Ëåýr¹³ôÈ%H&“â1wT½aŽÎ2ÃN2}>¦§§ñýïÇŽÃc=&T<ªÕ*&''…ƒä4Ž#¨É4ƒŠü}åÁ`P8Wæÿ|Mw½_n㥒–äЛå6öuØívd2Á|¤sæ)Ì yº“šyèdžÁO["ݘ¨¼<¨à$3Je’©*ï5׆ÏçÃöíÛqÕUWÍ\tÑEX­Öà+>"ø·û7ý·¿ý­à躇ÃV«%Jpr¨/sá ¢Éh<,†¿<Õe°„CÖK…2ñÇétŠp˜Æh€aº è]{íµ¸ä’KN§Ñh4D}™½|?»¬úCÜaiiIœ"N§½½½ùg˜m±X°¼¼,ÄN|>ŠÅ"~ó›ßÀjµbûöíØ·o¦¦¦ðþ÷¿»wïîJ“ÕxK¥’à$p2Â"£NUUA€’?ˉÝyóJ DάT*"…X³f 4MC< ¦œvÈ8S¹WBV::Ý&˯u§)&“IÜ ™{Á艩×UwdÖ­ ½RÚ#÷žðše2ìß¿}(Â\ÿéOúù«®ºê_EÉ¿"ÁSO=¥ßtÓMÈf³ €yS¹\F4í§åS‹šÈ2kàrát:Eÿ >ÔKÝŽ' ¢‹|š17n4‚^Z,EùÀ%ÿ.¿V–#;~ü¸pLü¼rí? Š0[î70›Í(‹Â;ßùNìÚµ ¥R Á`õz¹\®”âõõûýÂÉÊ .Fùw°ÔÅïÀhŠ!rµZªîò¨L0¢3YZZB£Ñ@:îèæ”)Õ< ÄÉÓ¢Ù(óAN·C{äI&W1Ú’ñ§n¥g¹RÄÏMÇ(;ƒî2) IİX…ÉårH§ÓÈf³x<þÎJ¥¢ÏÏÏç×®]ûµW‚#°$‰õ_ùÊWòÏyÛÏÏÍÍu”‰ºòôa`wY?V«UÔò>1n6›P¥CsŽ›šÏ¥Wæ)'ëÙñ³Ôj5áéeE_92Åyç‡ÞÞ^¨ªŠÞÞ^ÑkÀ›È".‡Ã!(É==="$Ö4ML?žœœÄââ"’É$Òé´*£ŒŒà­o}+Nœ8_ýêW¢š‹&‘HˆMÜl6E„P¯×áõzŦ’)n’r‰«ûÄVEDJòâç¦öx<Â1Ë…Z­–prÝËpL‹x¯ånÆn²ÑéL ä”­»›3yOxoù½è ™Î2ºàÁÐÍú쎨¸ñyxÈÒëLAÒét,‘Hœ_«Õ.ý⿸ùë_ÿúþ[n¹eUGÖ¾¾¾ø¯ÿú/ý‹_ü"¢Ñ¨ˆ¸1‰P³ƒK.Wu/4Þ$¹Ý–§1Ol¹”U¯×Åâey Œá?Á36 ñ÷ðqæÑN§ËËËxúé§qß}÷¡Ñh`xxXhòs½ÐM€x<.<~0Äš5k„X Ç‘ŽËQcœ:ÔjµpâÄ lÙ²×]wvïÞÝ1îlvv@@ ×rË0¿‡vË×›š§–Ì£§s®T*ôZ™$G ËËËx …B«aXÍ”Üe)k vSœÏ„œ×#YŸ¡»d¸Ò ÏkÞ-Ç¥$î.•²ôJ'®P:^â*ív; ë:fff>ºyóæ79r[¶lZÕ©Áøø¸þ¾÷½ÑhT¨óð”–O„nU™é%ÓaåÖW>¥>¿$'@F{yƒ»Õudù.þNÖ”y“¨ ðïÿþïÃ?üÃ?Àçó!—Ë tX%»[o ÔU*d³Ùç9ºp8,úb±b±XGCP&“A.—Ãðð0¶oߎññqAô‰Çãèíí) 7S ¾§üȧz÷B炦\‰öÛÍÀcU†`Ó â"uýÈê?[7‘§û3žNc)´›J£3#p*G»ʵäv(ífPÒ‘P*On–¹&lÌ¢LÝââ"&&&Ö§Ói<ôÐCúùçŸ_‰F£žUéî¾ûnÄãq aaaA@È‚á–| Ë7DVÑ•=¤œÏñâ3 &q†‘Á)Y0„‹PÖìãéÔí Úí6€ø<`†q¡Ê¹cwk1S9%áÉÈϳ¼¼Ü±ˆ¸ zF"LLLàç?ÿ9|ðA‘ÿ;Nô÷÷‹J7¿\…¡ó”K_ü¾üžªªvT­R©@Qq²È]ü>Ä<OÇpUù4gªÕl6:‘ì´Zs-ÐñÑ1Úl6á˜ÉcH&“hµZ‡Ã‚sB$³G»ÿ½2ÏÔp%*³Œñ€%˱Étb92’£;27e–Q'£G~F‚ápV«‰DB0Ze°\®<ÉÝŽr‰š‘áÓO?ááaëôôôù?ûÙÏFýë_ëW^yåYg'ZÉÍ_IH³;Ìd«1»úØlà Í—Ž}³¤GÐEÌƆ °uëVŒŒŒ`Ó¦M£££¬Y³æz¸ýöÛ_ô õ÷÷‹©BÙlV ¹E¡Py2µ |>_G$ÑÝ3ðB@­<¹h¥Ô£û1™¼ôBÎ¥;¼çó˜¾Ê Ly<<×/ÉY<廥ÖWú|ÝŠVÝ<‡J¥‚……äóys¥RqG"<öØcú%—\rV•ª>,+Q¾»[¦‹¥N¦Ð_GR‡ÃB¡ ôá89ˆ@ŒËå¢hiEUUÅjµšµ .¸@ߺukó/þâ/Ò›6mzðÁÿØÐÑ”L&õ|>/Ân¦+ìG'Þ¡ªª8iYgDÃðÛãñˆ’#A<âÝú‡±X ·Þz+î»ï>ìÚµ ívûÿgïÍÃÛ,Ϭñ#Y–m­¶,É’,;¶ÛÙq–’àl@Cš°–eJa(Ó¹èÐ_÷N¿¶Ó™–n×´ÐýZ méÊÒ6…„%-  'ÞwY–eí’åE¿?à<ß­7r€’@Rü^W®l¶,½ïóÜÏ}ŸûÜçÀív#‘HàÌ3Ïć>ô!Ý_ÿú×Ü׿þu<öØcÉyóæ™zzzt333x×»Þ…gžyFt†1›ÍêÓr¤ˆŠTä‘à.ƒ‹ì›ÓŠœ•ìȉÔh´X,Q¥y‰DB®ä¦’›‚›Këi(ù³Í Èù®Gùõ’W [œˆ¦¢¤ÅË×dO~9”ºŸmÖB‹ÅÈ’Iþ"»1‘H¨5788ˆ_ýêW¹M›6Áï÷ëÞ¶Œ€-?-p¢ýP?Öëõ0›Íª~—À Ñy“É„T*…‘‘LNN¢¼¼ÕÕÕ°Ùl¨­­íniiyzÙ²eÍ~¿¿º®®î£Ñ¸ ¾øÅ/¾éåñxtÀ+®I4GaË ‘D!ªKméHÄô[:9—¾ 8N§^x!z{{ñ¿ÿû¿°Û혚šÂæÍ›6lÐÀþýûýµ¯}­ydddyII‰áÙgŸ…ßïW?—)/[{Ršu17®=ÇÇÇó„ZXbуøëWù™(ÞÁÎ`A,„ŠJË“““yüh4ªdÒ8rNUaN§˜}2û,´ÙµˆBl?-p)µdÚ.±–5rÜ]ë2J¥`³Ùò¾XzÐçRKž’¥ Ÿ‡¤/Ë."**uuua``½½½8|ø0þô§?åÑØØø–SwÖ¯„$R* #\œF£QùÐÕ××# ¡¿¿eeeR5Ö%—\‚+®¸âùeË– ù|¾˜ÉdúÀ[õáL&†‡‡UýGæOO9¹È #;äù³oÏt›€'>¶àr¹T6199‰êêê¼÷¶|ùò+à3ŸùÌó·ÜrËŠªª*]4…ÕjUâ,ÄXxIƒ¹‰¥ ÛŽ’‹¡õ”rf’”Ãö—$äH³Ù)I¥RªãÀŒ€r‹¶ÙlJÃQvaÜn7&&&L&Õ ˜vã¾VY @ZJN— üé÷À`ÊŒ÷Lº5Ë®ñá=ÈR™³ì:$“I:t@‡ƺuëpøðá\ssó[ $·°æÃ—®7\:n·[BèìëëSF.— —^z)¶nÝšõz½!‡ÃñÇó“·#ݡȥTN$y©"kt­¸$­PYXªäpcP„„Dññqüîw¿Ãüc•] ôôô|ßþö·WÝrË-‰~ô£æòòruÏ™açi4ÈÚ^[Â1PQP•ç$Ñt<Éd6Ȭ„ ›DݳÙ,B¡ò‰äg///W¸Åôô´b^ÊûLàRº‘Ï@LCRʵ@b Út[vxXJiç$Z,–‚ýé<%iÖüZ–Vò^‹Š¬%Ûi™|Oü¹™LÁ`‘HD•xÏ?ÿ|nÕªUoI00˜Íf%¥Eþ¸\RuX¯×# !“ÉÀãñxÅ4•JañâŸüò˱mÛ6œ~úéºoûÛo{K„mF¦´œNÓ \Ø’5*?·™–œj`’N§±oß>|æ3ŸÁi§†•566*2•JYM&SžãG?úQËÏþóÁk¯½ÖÇ´zzzZµ‹‹‹UjªšÒnÙÓÖš¬ò³ÑшM2‡‡‡UGÀ³\.‡¯~õ«¨©©Óé„ÅbÓéTY‘Á`Àèè¨J«³Ù,Âá08€]»váÅ_T÷VÖøÒÆN*SIÄ6Qû;ﱩðDÃZ9ß"EpØ`7‡%Ÿ 1'®íü‚–øUˆÓ!¿Gº$qMNN¢¿¿O>ù$b±üñÜYguƒ Çl­VkaHÊKÓ€òÞ‘H+W®Äu×]‡ 6 ±±Q÷å/ùm9Ù’É&£iŠÜ(ôЦ«\¸à‚"÷?“É`Ñ¢EQÁ¦±±1O…HxmÙ²åܯýë7~ýë_¿@v]ØûN&“Jm˜ò[…Ø| ~ ",ý¸)r¹œjÿ‘Ô%ƒÉW4‰)..Z¹r¥ó²Ë.3¾ûÝïÆ²eËþ®E9::š›˜˜@GGÚÛÛñÔSOá™gžAWWW^ýM»²Ù˜Ÿòÿ ],ûø5dr#²KÆéC)àÊ ‘ãòlñêõzØl6èõzµ>d Öyi‡›´|Ù*%þÄŸJ¥N§ÑÝÝD"L&ƒ'žx"wæ™gžÐ``àŠÇã°Z­êÍUTT  !‰Àçó!Àb± ½½f³+W®ÄÕW_k®¹F·{÷*yøðá Uià!§ %!Fk²YTT‡Ã¡¸R‰H2Û¦¦¦022’çjÌúÓétâСCj!D"eE~¬ËëõîpáÙgŸ=øì³Ïú<Â`´ÆÆÆPQQ¡ÈLrêS*Ë)Ež¾’‰IJ·ÙlV *gÈY±bEöꫯþÍ–-[ž«­­ýÁßþö·7õ\\.WÁ…¼wïÞÜž={ðÔSO¡££#±oß>Ëää$Ün·¢yÙ§7…œÉ¥‰´% Ëê)p3r)cll,Ï,¶¢¢333 7…e ¿úÒ>N["hÍjX’ÓýéOcÛ¶m8묳t?þøI7ö±±/|á ?2™L_|µ”p˜L¦ð‰x^+W®Ô Lç[ßÿþ÷[¿øÅ/®ëïïGee%6lØ€¿þõ¯hjj‘#Gò@BnrCJŒi7 Ñz‰’¥J°Në@Å /'[µ§¼ÌZŒä,Ž$²—/4/!'[ÇÆÆ011;ï¼3zÕUWÙOH §C @0DEEÆÆÆPZZªè¨}}}øÚ×¾†‹/¾K–,9iuÚL&“zo½½½9’s˜Æy½^UÊŽL4U£¹¾’#ÑV«###8pà€"ßÄãq ¨Ú¾µµ5›®?ÖuþùçÇ>þñ[&&&`6›¸I•dÊMÁEEš¬$ÜȾ}6›…×ëÅðð0’É$jkkFDZnÝ:|ìcËnذa/ƒÀ«÷4ü=»ÏöööÚ Ãm_úÒ—.ãØ·ÕjE$ÛíF(Rõ<gÉSTT¤X€rŒž­N9=I|‚,ª´„&³p µ-™°=)¹ÚÒAD´4ffn’Hú}ii©õÏþsÿâÅ‹X[[{Óq¦n¿òCN'Òé4öìÙƒsÏ=‰DÁ`Pyþà?À 7Ü ;}þ·êb´—z ô>dAjÚA•M¢öT3¶Ûí°ÙlªíjµZÑÐР8û###p:ªÿüZׂ ª[[[sÏ=÷œR,b½OPWÛ›–‹NʨiZ‰qpðIФ®X±ßþö·ÑÚÚú¶ºÏ›7/àŸî¿ÿþ§¯¼òÊ5CCCÊ3ÓãñeS/?#«x rËÈQvþ™<fZ©7yb“—!Ë9%Ë2TÛÕ(¤­åçH0Z¶i‰m% èî¾ûîê 6ü;€ãø& XLOOã¹çžCss3\.þò—¿àk_û.¼ðBÜpà 8•.‚yò!(“‡2%“æ¨rŠRöëëêêò8õ<…öîÝ ƒÁ€{Dååå ›­}Xèzßûއݻw+fÁÂÙ6r¡j9 Z¥fèïïǼyóˆ©`ÅŠøò—¿ŒÖÖÖ“&Ó{ï{ß»ö©§žúÙ9çœsµÃá@WW—jj™‰ò9³Ý§5?!ˆh³Ù€åï±,'åÏ"¦Rb]â8>B´LDf©ÔËf³a6§«ªªòÝ{ï½ÑK.¹ä¸• ²Ðz{{ÕðO<Goo/œN'Z[[ñüóÏãø†††r>Ÿï”‘o–ôY)²©•6“*G¬#Y>h[T™LÃÃÃ*ågë0 á7¿ù öìÙƒŽŽ•nÒ‰·££ãu¿ïõë×ÿ_ƒÁðoä)¤ÓiLLLÀn·«Ö_¡þ:O}Ù”Ì:~ ‡“ÆÇDZhÑ"|þóŸÇ–-[Nšç:44Têóù2gœqÆ5Û·oßô‰O|¢ŽÊÃZh퀒ßï?j4XnÊX,¦ÚżWf³Y1e°åæ—§¶6„$@K£m6Q@,TÞIi>>WÒ¾Ãá0, žyæ}*•²ÏƒÓéD}}=ÚÚÚÔˆn&“QØ@4…ÛíÆ¿þë¿âsŸûÜI¿ùûúúr’ÆÊ)IÉO/øh#ù°x"„Ãá<´—"£}}}èééÁÈȇ#‘HÁæµ.¿ßÿ£Õ«W¿çðáÃu<åµ§”¶?Íl…ÁLº6K}”úúúà÷ûñÕ¯~—]v™îU€ø ƒÁðÔÛý }>Ÿ‚þ·mÛVÿÝï~7÷©O} >Ÿ/OÀ¥%]ggçQ&:ˆ²Z­V_ÏAa{¨IÁ2PfÒdUf\ZÄBÄdp–Eòv8 GÌÞ]]]0 xøá‡1<<œóz½o:ìv»nëÖ­¹¶¶68N @§ÓÁb± (];›Í†›o¾_ùÊWr]tV¬XqRf@@-~›Í¦Örl Úíö<Ÿ@r¿µ#ÉìÅS¢—Ýn‡×ëÅK/½„ééiø|>,]º.— ¿üå/†@g¥®®®×ý<ÏøêÕ«±gÏž¼V{Ú…ˆ5\¬1ÙùáI%½:::P]]n¸ÿôOÿ¤ÔS'ã3ݰaC€:tθP5I²1YH ¦í à<ãkÐÐ…Ä­ ‹”E“Óä£PßB^…6¼Ìø¤d°c»ZüØJ~ùå—QYY‰xÑh4g·ÛßÔ~4¯P…ùæ8 ”[4…Ãá@ii)vìØ]»váÿüŸÿ“{ÿûßåË—ŸTAÊžI°'ÇØØ˜â™sQP¤¤¸¸X9$Q¤CêÊŸAë±êêjÕ[¾òÊ+U Ë-·`jjJy#Žajjê·ƒáŠ×ú ÃÃðÛíª íãµ£µR$FÊÉÙl6å]YY‰¡¡¡m æÉACžXK–,‰|ò“Ÿ|`áÂ…_9•:@7ÜpƒîÝï~wîÑG=J«!‘H¨ ®åòšW iŒ%!éÚ±X ápV«µµµH§Ó˜žžVYr:V¨eee0y.ÊÒXE¶7™öϦõ('µ"+Ú¯£>g\âñ8²Ù,vïÞŽŽŽÜ‚ tw  •9¹öÓÓÓªÖâ—¬} ÆÇÇUZ´sçNe5þüÜå—_§Ó ǃË/¿‡À+ã¨p:êÔ6Jj›7qdd/¼ðBN¦zœ‰w¹\0?8GM9Ï@G'9z+‘[ŸÏ—÷oÚV.Ñëõp¹\(++Cww7vïÞl6‹ï}ï{Ø¿?`ãÆ¨ªªÂ‚ ÐÝÝ{ï½7×ÜÜœ]ºté1ûõñx¼Ž ”ýkiÔ2[ 0™L‡Ùl†ÅbA$ÍfƒÕjE__>ò‘dOµ À몫®ÂÓO?±±1Å­Ù«öÒÎËPÁ‚“œ*}õÀQ]šp8¬0fEEEªüW6Ô+d—JR¾eÆY¨5);ÚlFË •CTÉd¡P ,Àèè(~ñ‹_¼¹Ò€d£ÑˆññqE¶`AªSÓnff¡P¥¥¥˜7o¦¦¦»Ž&cccÊfùòåX³f ónU| V+ÅA´n"‘Àää$ÚÚÚ°sçÎ\YYìv»b† tuu)£KYp¤WÎÈËŽâÈÉ2…HåDKK öìÙƒ}èCŠT4þ| ¢¨¨?ü0JKKqÝu×!‰àðáÃÆíÛ·çZZZf-§T»“ŒØlA€àíݨ 533ƒ‘‘,\¸pìCúPNÑkË–-Ï·¶¶®zì±Çàñx066¦Naò´†%Úv u #‘ˆÒÕ èLuu5€Ê 7oÞŒóÎ;óçÏç¡ØöÈ#Ô<øàƒf¶ƒ©Ó˜ÉdTp‘œ-G¥ÐI/Ÿc¡,T~’ÊÜn·Nr»Ý°Ûíèèèø»³•ÈõÓJiÑh6›MµnJKK•Î?½ô8éÅO[­‰‰ ŒŽŽâì³Ï†ÍfƒÃáP-iÐ)k`2ÄdTd]/)ÂÀ+z÷r؆£ÇL•™ÆSxC¦n’Âh¯Å¥¥+’l=ñ„jjjRrcÍÍͨªª‚ßï‡ßïÇâÅ‹íííj «ÐÕÞÞž»êª«`6›ÕÂbûïµ2‚©©)¸\.¥Sèv»188ˆ\.—½ñÆ÷^ýõ˜šš2 †ì©|>ßê/|á ¹;v(åkéÒ,4^‘÷'“ÉÀëõ*º²²28Nd2ttt@¯×cýúõ¸ð ±eË´´´¨M555µ´®®nÙÕW_}Á_þò—÷ßtÓM€ßï‡ÙlÆàv»UÐÖnüټ俋žÌƒˆ&¸ìì¥Óiå0600p|0Ž¥J’ ÅFFFò4éàt:œC%%%JÀ"ã¹çžCww7¦§§ár¹°lÙ2´´´ ®®@@8Õ"®rs+AÊRÓè´¬¬LeU¤'^<?Ê]Þ|i$ª,¡­9'Øhá‹ÅPVV†ë¯¿‡Æ_ÿúWx½^|úÓŸFcc#8 „A"‘á÷ûÑÙÙ‰¶¶¶ÜÂ… ó"x0T“†<Ñ*ϲMJl„ô›7oÆ{ßû^\ýõ8ƒ¯Õ«WÃd2©îtÞÖ’§do_f~Zy7 N§×\s ¶nÝŠ7ê>ûÙÏj j/x Ào\ùôÓOç~ýë_ãæ›oFQQZ[[qøðá¼,@›êKá•Ù.ä{— Kd¶šL&e#h4ß\ ]ÒÚŒ"¥ª¡ˆç«H8***PRR‚ññqÄãqõ:|s|Ãv»Ï>û,, 2™ Ün·²+'¸eµZónA=)o.ë{iÄBB3z0CÇbm §¬ÓéTœ¢°¤ «×ëE @<Ç‚ Ðß߻ݎÏ|æ3ÃwÞ‰üàøô§?»ï¾kÖ¬QßO܃cµ‘H»wïΕ——ÃårÁåré(áe³Ù066¦RüB€vQQ|Ãh4*Uå3Î8_úÒ—Œ^¯w Nñkýúõ^´hÑûûûQ^^®:QKõ!mÙÇéRÚÕñžwuuaÁ‚øÚ×¾†Ë/¿\÷õ¯ýu½—µk×êàOúSî®»îÂ<7¿"‘…?Vf  ¥Pìôô4FGGáóù‹Å]Z Ì–e¾Ö¥€}ûöåN;í48Äb1•žS¤Yúêõz,]º@UU•RÚµZ­ª7Jæ½ÿJKKS\\ŒÛn»MŽ2 ¡‰Ña¾Ž¬ë ÕYü7 OH;$Ìf Æz\{²Hûw)NÿCÞ£ºº:<üðÃøÐ‡>„w½ë]p¹\øÏÿüO8NTWWcpp ,P~]]]D,ƒÅbÁâÅ‹±páB¤Óiôöö*eàÁÁA„B¡£RM- i0‹Åòƪ׬Yƒ-lñV^÷ÜsÏsW_}õ*fœÃÃÃ*s´Z­ ;p8˜œœT›ƒõ¼ÍfCYYFFFP^^Žééi\wÝuøŸÿùŸ7u»o½õÖºx/½ô<ÊËË122‚L&—Ë¥TÂív;JKKÕ†f ËòŽ:\ *_ÅeË–¡¿¿MMMÊ’N¨ˆápáLNNbllL [Фx…‚M³šL&ƒªª*F]4]i·Û÷ž Àår­’Ó…Ô? @@ƒÁ ð§Ó©p#êL X^^Ž@ €åË—¿é÷U]]]<ð@îG?úvíÚ…X,¯×«´ŠŠŠÔZ …BH&“°ÛíÊÄFª*qÄØ@EE…íc±ü~¿ú:³ÙŒÃ‡cÛ¶miPSSsÛ»ßýîM7ß|sA6‚qRêZJK…¶P(n›ί•›€Ô `੨¨@,ËSá増ãÇLq„k2)LIàlºw^¯W¥sÚ`!çø™<t:z{{122‚ÞÞ^Eáe„...Ví;¾Žwww#Âãñ ¹¹›6mÂc=†‡z~¿[¶lÁâÅ‹óZ´òÞPzLÅ0+£7ÃÌÌ ºººrdÜ…B!õ=ÉdGŽÉ=÷Üs‡î¾ûîÚH$böz½Ü<¹¢¢¢A›Íö¿óçÏÿÆÉª««6›Í"ÛÃÌX¹®Ø^c†HFÙ{»yò®X±â¸½¿‹.ºH÷øãNMMùvìØ¡fOHÆ““Ф g³YÅÕf{²ƒÀR(‰(J;Í÷ìÙ—Ëõ÷ƒÁðä=÷܃›o¾YÕ®LOÈQ×ëõ(//W–é’-ç¾™†ËHzÔ“Jd]öüÃá°zM‚vÒàTºúª RÊÑ[éߨ×ë•Ô•ÿùÏcÛ¶mX·n]^FB¿Eþ’"«.—K/·Û­&Ç£œˆÒÆb1TTT ¡¡auöûûûqøðad2],«ž™™ùÈÏþs·×ëݵeË–ûßî@°`ÁëÚµks===êáÂö3;:œ' Ö#³RÖê¡P+W®Ìë묳Ϊîîî¾ïöÛo¯»ùæ›—ôöö›››CCCJ,Ʋ²2ÔÔÔä‰áPÇõFÕ@EEü~¿°a6›ß\ €U«V-\¸°®­­Mµ«ä‰E²ÕÇr¬7¢šrQ2ݧ’°ÅbQõO.—Ãàà †‡‡1þ|¥ÄCNµ”T—(j!iÉ!—òäÒ»OnrmÙ!K ¨øÿäìó~TVVÂï÷£µµeeeèêêŠ+`2™pÑEaÁ‚P¸G6›E?jjj°ÿ~5I¶dÉÔ××£«« MMM¸ï¾ûL&qøðaôõõA§Ó¡««K9GÑv,‹!•J!›Í¢²²‹ñx\ùL2@[­V¸\.¬Zµ ×^{-jjjàõzÀ˜J¥ÐÒÒ‚††d³Y`醆†|¡PèÚÁÁÁKó›ßüçòå˱dÉ’Uog0hnnFgggž31Oy®–K\ ¥¥¥ˆD"ÊÇ“ñË.» O>ùäq‹åÿ»ñƲÙì¿ýøÇ?þïþð‡•‡‚Ýn‡ÝnW™±ÇãA.—ÃÀÀìvûQ#Ïl‰ill„ËåBQQ†‡‡÷áŠ+®@uuµîM‚úúúÕÿñÿ‘kkkS-BÞDÙIàð #°äkSÏ€›ž„ÒO#$„Hs f$ZAH9c?[z/ÍUe@âæ–i´¤òï2PH+,™°ÂZžƒ­­­8ï¼ó`4QWWÇšµµµ8räjjj0<<Œ††<ù䓸Æ7¾ÎÎN\xá…p»ÝÊàÂï÷ƒó÷¤b§Ói…Žk[LòýssÐ@„§ '2S©<e9qÉnÏÏ~ö3”——£©©I¦~¿_ïóùlË—/·=ýôÓþŸþô§èééÉÕÕÕé¢Ñè9v»}Ç[V¬Xßÿþ÷ª«ÃVw,ƒÍfSs\O¯²5Õ(:u$JJJpÎ9çœ(,càÕŒøÿf³Ù3o¸á†÷ßtÓM¹þð‡èëëüyóàr¹ÐÑÑ¡fD¤` çbÊÊÊPUU—Ë…ÓN;MíÅÎÎN¥®är¹pÞyç=ñßÿýßo.#€ .¸ ç׿þuÝÀÀ@žH‚V ‡è:{õ’zLðB2àè|#[`²öfäõz•*‹œ¶“&Z£VI¼mi.³*ó¼‘K~î®®.+zu4ÅÔÔìv;ÊÊÊÐÞÞ®î×àà Êš8áX__\.‡»ï¾ûöíCII –-[¦N5žÌƦ§§166†™™%8ªÍhd°Ûºu+Òé´j£‘ßQVV¦ôúÍf³ ( ìû÷ïW%L2™D @WWž~úid³YœqÆhnnVYO<ñàí°xñb$ •1¦ÓiE–$2²ålH*•RVn X¼xñ ï¨Æ÷Àç>÷9Ýßþö·Çï¸ãŽ3ï¸ãLOO£¡¡åååhkkS 23iYÕ××Ãï÷ÃãñàСC8|ø0’É¤Ê V­Zu”AïßÖ¯__饗þ,›Í^Íö–t ’ª=\€<½¹YÇp30“,½êêêpEÜA«9/­¶´ª°…NEé!(Å%ûúúòèÃ<á  æÏŸééi5šJ”eeep»Ý* 6X?ŒF#nºé&üèG?BSSúúú`·ÛQQQžž…üK5fK$[j!òjkkC<W£²tò¥ ^¯W€(ÍLØÂª¬¬D&“AWW, Î?ÿ|ÀwÞ‰gžyFµ“½^/n»í6Ü~ûí¹k¯½ömiKVUUåmp’‹ B¡ *++¡Óé044¤ð²5¹®•üü[u­[·î¬T*uæ† ¿í¶Û°wï^„B¡<ŽËää$L&œN'ü~?|>ìv;žþyå,VYY‰©©)ƒA444Àï÷Ÿu\|ï{ßûè5×\³idd¤NrÛÉ{ç˜2Û$qÃ3ÕçfdjC¤uœÕjEWW088¨² 9¼QQQL&£Ún\ÈrhƒVFZr \¦¦¦ …ò˜Œ\<…²rö%Ñ#“É(þ7Ê`0¨ÐiÉ$«©©Á÷¿ÿ}<üðÃhjjRÛápÀï÷«/–eÒgåˆÖA«°Ä G >²%ÙÙ)))ÁÐÐ|>Ÿ¢Ãöôô ™Lâž{îÁý÷ßE‹aÍš5Èf³˜?>ªªªðç?ÿYQ===Èf³¸ñƱuëÖ\kk+ZZZàv»Q[[‹·BÎŽ¢/\‡ÕÕÕÊç’YÂøø¸âx°ä‚ÕjEII âñ8êêêz;™Édz€îÖ[oÍ8p@u (5o·Ûát:áõzaµZ …pðàAU"’8>>ŽÒÒRe²{Üßï¿øâ‹OßsÏ=/ÝsÏ=çS·Ÿ)®×ëE2™TTb.Ôd2©&·ÊLA²ÿØÆâä"Ë‚zZ$ŸÿöZÔL™Æk@–ìhhµê‰yHq‰B}Ê×¥0iÕ<™xâNOO£³³?ü0^~ùe•ù\uÕU˜ššÂ‚ 088¨X’…Üù¤éŠ,‡´”T-½•¿¤*Ë©ÞÞ^øý~Äãq<øàƒxá…ˆé÷ûQ__¯øø333ˆÅbxæ™g°gÏ`.\¸çœsN®®®.— n·555¨©©Qb/ìš¼ºþ® ÑÜܬ[»vmî…^@ @EE…™å= —…Á‘tùWq…¡¥K—>òv‚ž×_½nÇŽ¹ßþö·øË_þ‚U«V)U°ññqtww«LœcÑ”â:Û´i.\øÄq ÐÒÒò~‹ò“Ÿ<óï|ÇFáõzÑßßǃÚÚZ5H9/m?Ÿ€7`qq±r‘áƒ#¿€ÁFòÿe»P;k^èÒ-ˆ¨5)dm]ˆ±'媴fœÙ3¹\uuuسgî»ï>ÅC(**Âgœ¡ÔÒé´ÊzŽUiñíû×fBZ._7 *ÿJ>ŸÃ‡ÃårÁd2©6h P [8Fuuµ¢jËg%j[[öìÙ“'àApÒçóaÞ¼y¨««Cmm-~ô£å,‹šíw8j$Ø`0¨6¶Ñh„ÇãÑE£ÑÜ«¼ÝÆ‘J¥Ô´ ÉU‘HD1b¹Ž8¤D/ŠW3çÒ¥K›ßÊ?88˜«®®Öõ÷÷çöìÙƒçž{¿ûÝïPRR‚sÏ====ÊN£ÐÄÆèÆ\^^®:6› ï{ßû`0Î:Çã9Àú‡?üáWŸÿüç/Ú¿¿yÁ‚JXdffÝÝÝjññÁ±¨]¬Z]=¦gÌøÈÑ_í ,£}!5[v ´ž…\ðœªÔ2 ¹ìjGYyÉNƒlOòAéõzTUU)¢Kqq1‰„Kfmʶ¬4&‘j6òþRä-”5È®Çl¾ ,ùdË”vwHl …BÐét°ÛíÐëõJ™ê”””Àf³¡¼¼\Q|9;"[uV«ét»wïÆ< îÅbAUUêêê`±Xòº3ü97Þxcî¿ø’É$n»í¶ÜÀÀZZZ”-Ñô`0ˆÑÑQ¹á…l½W×1›Í¾jjªÙ`0×9Œ¾¾¾\2™T™h4Šd2‰»ï¾_øÂrßüæ7ÕóE¿Ò=àû”÷@'±/2Hëêêðf”‰^W àuþùçÿósÏ=÷óK.¹ä’ŽŽsqq1V®\‰¢¢"9rñÃÒFŠ2pSÁl6#¥ M&df¡EÈùr2À†ˆ`-§ åÏ•øƒ4¸”[œ2`pš™ (°ÊÊÊ”aÉðð0.¼ðBÕJåûF£G `j­² šò=JÍFj1È€ÂA0i¸B‡Wƒ?†‡‡UêYYY©Ô­Éú” îÄÄ„j=ÊR-dµÐ^%ǤR)TVV¢²²RY¸Q“Âh4bïÞ½G=sÒÕKJJàr¹Íš“‡>ŸOñRÜn·ú³ô°ä}¢SŸo[[[e8Þôûßÿ~"“ɉÔKŠ»Äg$Õ^êf°‡ÇqÓM7©ì¥3¹ãããêu¨À{ÝÑÑ¡x´Œ…Bªë¤×ë‘J¥àt:111Õ«WãŽ;îÀ[`õêÕW9rdlûöíïùÔ§>µø¾ûîÚ5k°`Áttt(Ì€ˆ?OFbyZóFótbZ)[Ô“éo¡ÔWž”¿%Cž¬2+ÑzÒr·-„0Uã‰([=$îЃ–죣£ˆÅb¨©©ÁÈȈ"+ƒT¦µÚÑÙBÝc• ìCk… $haÏ]§Ó)Õe¾²Aé–M € ±L»ù|å0;F¼‹‹ˆD"y²liºÝnŶ#E†Òé´âªP.ãÈ‘#ŠÈÖß߯6 [ºò~Ö×׫Æb±àÖ[o…Ñh4òä& XJÃsvarrR´d†*³Bò?8[Cì)#‘H(y5²¹v¨‡ UNâ= cåååÊà×d2áôÓO?.Œá|qSSÓ'—_ýõ×îܹóú;î¸Ã¸oß>èt:8N*õæ¥ë<%šÍ Â…•H$L&Õ¦ç +…Iä >›-™¤þ²Ã¡Í ¤MºÜf³YÕöǺøú|m¶ªxjQK"•n·[:ÿø|> (á?³Ùœ§Ä¤%µ]ù5ü|¬%g£J“f ápXñ;B¡*++‹Å懕eGvc±˜¢˲Êl6«nQ8Î;99 Fî?AUnžX,†D"¡´ùï”I$›™™ÁÀÀ€ ^ zì¶PJ Æ0ð1è¼üò˰ÛíH$Ê̇Hii)zzzýòpÁ—ü™9J® )ìR÷R®·ññq˜L¦<£U¶ ù3i‡^RR¢fØ…ãæÚ:^3†7ú ÕÕÕû||jj*zî¹ç~ùÅ_Ì}úÓŸÆÎ;UÝÂH(pii)Ìf³JƒM©h”N§U€`ÇAÎvki—³ùP´@Ÿ60i³‹×s©Íd2ˆF£Š Í,¤¸¸N§¡PH11“É$ÆÆÆÇQTT„åË—+ÁêèG"Äb1˜L¦£@nj½^¯2ªóh»$Òš‹÷B.^—˥ƙ¬8ºLé.éüÃ,%‘H¨–ݦ½ÒYš),7*³»’’”——# *ÞˆÌh¶Ž©l‹)=_[–w†av Ed \"Â1keXª1Ø•––ª5)3XjÊÏË Š÷šÓ”¡'†÷‹™€ÙlVï}llL‰Þòy“ÉÖ/K–ÓÓÓTuoK 5ß—_í0è>ðäL&“Z@d°1Bg³Y˜ÍfŘcúèóùpðàA8ìÙ³§Ÿ~zž„¬ïe-ÏM¡M“¥l•ìÈzSúçI@'ƒ¶4ЂˆR-‰Qoà•1Ø‘‘TUU¡¿¿_žž¥¸;22‚3Ï?mvËõÁ¤å¸ÐM«¾¾þä µµµŠ€B@ƒ7(‘H(Ú07üÄ攦¦¦àóùòKH×eàªvQÈÍ"¥Èd¢ z¡ ¥Í ùÛk#¼ö!F£QÕºÀ‘#GT*)ÄZp¶€t¬va¡]H#Ÿï“`-ÿ® ò”– Zb$l{2­f £M!†öóIзP (”ýÏÍ?[ùÀ@,[Ìrš–eQ—¦«òýËû × ¼Ç’õ*õ7¸6ä÷ðkÓé4¶nÝŠùóçëNª@°nݺîuëÖÕ?þøã˜7oR©”¢zJy(žúlË„ÃaE§¬ªªÊ#{P«ŠKß IDATž5OÖ‚Ú@ÀFÕbeT•\ŽTÏ–~ ZÔ][&0Èi•›Ìf3B¡FFFÔ¦&N ÄÏG†æ±²c•2Zfa¡“”–)*ÓZ‰Ñð}ògòÔc#(ÆçÂÀ+±-¦"7øñÚØ…¨àÇã5åû•X§;‰þÓ4E¶“eI*{¤26KXf Ì ùld‰rá…*®ÂIæÍ›×pÿý÷'|>Ÿù®»îR€ ðŠkðÄÄ¢Ñ(†††`·Ûáv»ár¹`6›ÕØ­l{I‡\°2ÝœmsȉCø»ÅbÉÛȬo_«mXèšžžVA€ïÓëõ" *…ááa…xó”aéÃE"kðc©×šCÐ. B56/¦ñ ¼o³qxÈäP[†œGaj,Kª7º ÕÎ…þ­P0x³€©¸ö}KÚ7$?;f¶.¥ˆ$¶±%.ï§\ÛÚYÉya×-¢¡¡­­­Çu°Ëp¼^è½ï}¯¥¯¯/ç÷ûñè£bß¾}èììTýÎ7ªi7¯×‹¥K—Ân·Ãáp(ip*!sa²­#5%u¹Ð‚γÒ0…_/¼×?~->¥Õ´‹”ïsrrR)iL)1&çä&*„Yºfs=š hc àbå{–å ƒ•œ³Ûíª¤“ïY*Gb¾Ö†ÍD"î…˜žë8^™@¡×bpzš”Ic \[óËìL*uÉ÷,»],´[ò=¤Ói¬_¿÷ÝwNÊ@ð*V €Ç{,×ÕÕ…p8 ŸÏ‡ÒÒReÅïr¹”#o”ËåR,6©Q eže•QUÎH¾._‡`_*•Ê#{H%`yi¹<(KÍ A¡¾O2ߨg O³c³•)Ç*޵I m89ó. ³0R{ù è,IE,7Ø'!Œ¯£-ã´€æ±JžÙ2€ÈîÌ´¥» étZ1& e@Úñxv´ÁY²e6Íç$ïŸ^¯ÇÚµkûç6œˆ›yöÙgë ­­-733£æØ©#OÊ%‡m$ð&û¸\X¼©”A“ CË/àd#‰:|¸Í×Fy™9¢Ëö!OC—Ë¥Øwååå(..VÆ%^¯ÅÅÅxðÁ•3ÒÈÈH(ÄÀCñ’ÁÁAÕ–{=AË‘›Rº?sR5™ÖlN§SM·±uËR_í¦ ¶¡Á`P¶o’³1==ááá£ÊÙ’NÚ…6Z¡Ï­ý¿ÙÔB§ùë_?VÐäÚáÏ–â9Ä&U›zæ{â¿3ƒª¨¨È³ñãýôz½j±ººZ)ã[ßúÖߥ²õ¶^ .Ôµµµå8›Í†––9rD- vئ¡;Q!|¶’VnœìFÖå|€²>VÍ-YŒÚ!‡x‚Á ¢{2å+++ƒÍfCGGžzê)ìÛ·OµO—/_®ØlÁ`mmmŠdãv»ÕæíýqÃ÷.ç%¤"Yvd¤ikÜ©©)Œ£¢¢UUUÊ|ƒm2­Vü^–e<í™u1E–´néÉ@KÆ©VDF>ËB£Õ²¦.$Õöz:)o€(——¶ Ì|ß’ÂÎ{Af¥¼/²Éy™òà£ÿÆøø8¦§§Q]] ½^ÎÎN,[¶ Ÿüä'±eË–"úrBƒÁÓO? øë_ÿŠÚÚÚ¼¶ o>ÓPɆ+TO²>›x'é°leiäka³ÙTkmÔ³Ù¬²E'ù„™O8Æ®]»Ô‰Ç‰»¿ýíoJTtûöí¸öÚkÑßßÁÁAuêÉ¡-ЩízBË}>_ÁVX6›U"0R–ÁH ÉÊZYK|ât£Vo’1Ù•'z!å(-c´Iˆ÷¡P×áx– …ܦå3`v© vr*U[ 1€’;BB™ÉdRs¤¡ÓX˜¼“L&ƒêêj¬_¿þ„·$¯xÄ8p ×ÞÞŽîînX,TVVÂétÂb±ä¹‘„3Û%)ÂÚ‡$Qyí°Çlí¸B§J¡–ÿf6›a6›•e鞬“‡‡‡188ˆññquÒSÓ°½½‡===Ê#Rç%%%Š#/ƒX!ÿ…ÙNÃ#GŽU›Êû .YëRã°¤¤D#óuÙUѶoå„Ô iˆ<í¤CµM.Ê:µ³$Ç 2£› t}#Ün`‰U1(ÄjéñZ nvÒµ”=[mm-º»»áõz‘Íf144¿ß‹.º—^z)¾øÅ/â”°lÙ2Ý«)T®««Km8·ïr¹`³ÙŽ:1fcÔÉZ^êh[7²}½=äB›©·ÅbQ| ¼<ˆýû÷«)2’o²Ù,|>_·LÇc-ÈÙˆ4³I²ÄÓ¥B“É$²Ù,***ò¦öÌf³Rc–äù»å‚'ÈRLKÞÒžøÇjSâ†Èò½|}í¨ùlÅë¹Ø”\~>ò}É{LlŠ  $ÂI‰yQ†&»Ý®Î;ï<\rÉ%غu«î _øÂ ÝŸoY 5ØQO¤¯¯/‹Å0>>žPÍÆú“´Wínyyy^­É¯ÓR•åïòßeÛ¦X˜L& áp8`·Û•]ƒÀ®]»ÐÙÙ™· (ÀâñxðÒK/)bR2™Äüùó‘Ëå0::Љ‰‰¼QèBI«Ï ýZ‚±Ú:›‰ €š™§X$Q³ ’A'Ç»¥0 OznN²BeKMn*â(Z—`¹ñÙÍ!ˆ¬e9²¥\¨œãé=µùõd|}mwJöó ‰Òm‰÷Œ¥ƒË'‰üFR×âÅ‹•…}cc£î'?ùÉ[²/Oi‡Ül6›cà`ºF/‰‰‰<7Y­ÛñlåV@TÎð¢˜gqq1Q]]P(„?ýéOÊ›,0¦Äáp¡PHHpþùçcÉ’%ŠÃ^[[{T†0[ê{,EéÉÍF½»Ý®ˆ/ƒƒƒÈårxøá‡±oß>ôõõ¡½½]© ñsÐP”‰ÜôÜøìvu¨ÍTäÉ/»>òÔe ÃÑ_ÉG'[ef!3 €eV •Í;V¦T“"7Ú¬R((n"A@yob±ªªª`2™Ôø±ßïÇYg…w½ë]øà?ø¶ìIéŒFcÁ›ÖÝÝcd—jI,<}Wþ?ƒ8AM‰.¯ø98p@ÍQp2³¤¤&“ ‡###H&“øÞ÷¾«Õ ‡Ã¦¦&\zé¥Jhb6ßm»P»Ð%¨É÷H0§Ó™'‡^RR§Ó‰ÖÖV,^¼@GŽA8ÆÈÈÆÇÇLJ‡166†åË—crrRÙ¬qÜXRʵi¹œÑת0ór㌜S@ÌBÒt9+ñzru¼“øŒ– u¬1u«Õª”“ù,’É$Âá° È©T .— ---hiiÁš5kpúé§¿­‡ò)f»¢Ñ¨Z,l’ÞYhó™ h5'''áõzÕ÷ðO¥RTjÌܸf³½½½¸à‚ pÖY¯ÍîÛ·Ï>û¬Ý\¾|92™ ó6¯Ôwd@ŠF£5yÊ HÖÕ2Óàéd·Û‹ÅP^^³Ù ǃE‹© ;11ÑÑQ (óÛ½{÷bÛ¶mhnnF8Vó÷”ß@0ÄÈȈê…ŒŒŒ(c‘£d‡¼z–,-(¶Ê`Gu$Ÿ³Õý aVF —ê'¼“ôsI¾’Z…eLj¸¬¬ .— Ë–-ÃòåËQ__ùó磢¢óæÍ;i2òÈ@ðf.™ÂRyH^ψF£J—À'ùä߯_¿óçÏGoo/âñ8êëë±qãFì߿۷oG,Ãàà üq¬]»&“ >Ÿ//ÑH•F(Rÿ@6‚‘òÔ¤j’ fÌ Øåfãâ¥zñé§ŸŽuëÖxÅîmÑ¢Eؼyó1•qR©TŽ3 dòÄ&ˆ–J¥Ç‹Å”¨g6›ÅáÇ•Á+%ì‰b±˜RÒ:uKnƒÉdB*•RA_ºaK;yÙ&d ™™Qrrléñç‘À®•ÕjEee%Ün7Ün7L&V¯^ ›Í§Ó »Ý“É“ÉDbÐI[Šþ‘7³}#ßË(ŸL&óÄ@9lC>I=6› ápX¥¸ét+W®Äôô4ž}öYÜ}÷ÝH§Ó¨¬¬D]].¸à\qÅ8r䈒ä- ´í-ŽòtgZÇÕÐNQQZZZpÕUWÁçóÁápà´ÓNS(?Z8t¢Óé°mÛ¶¹È{œ/ÒÔ¥˜ ñÙne'@êHêt:8p½½½¹¹@pŠ_@ G7¶†½–ÜëI­ò1EFÒé´ò°Ùlj±UTT¨ï)))ÁÖ­[iÈív+W@ N‡‘‘,]ºMMMº¹­{œ´^•+W¢¿¿_¹gÑ·‘DÙFäú næÁƒ1>>>Wü£…RõU¦öZÍ~‰Rÿ=ê† Ê±–]‡™LÍÍÍj$8•JattmmmhhhTWWÏíÚpUUU)'j)¦•/T r„=‰Ì‚Sýbt—a6ɯ×cp¢ý?­Á(³þìt:yóæaóæÍ¨ªªRˆt]]1!¦0wÿËãñè>ò‘ä$}™‚)ò Ð ñРÕ\ øR³_¢ü¤Û+È…Q¨„ U’R e$---€(J*É/Ž«9ÅÜ•9N5ŽÍNÖ…©23FÚÊÍ‚Sø’ä­´·TÂÕ g2Þ(„#H“y%P‰9Á`P¹APŠÎs×ñ¿¨© y³ÙÝiKÅÒÒR5/0NÑëÈ‘#9bÚɱB£»…2¤‚Äh~*jyíÞ½mmmH§Ó°ÛíX²d l6›êåF5Ú;w˜«²²”(»5”¯ãº(d›WRR‚±±1¤R©Ü?uø¦¦¦r‡.¨Z$E>¥ § ]êÒÉÍÎY~íÅŒƒ“nR?‹©þ4_óx꼕¥³5éÓ Ÿk¡C‚ë!¿ã:ÿ0À`0è:;;s±XL!ÄÜxr£Ï&L¢U –sóoä¢0 Tt:ÆÇÇ‘Édàv»ÕìÂ;±}«.‹Å¢6:ñ™BŠÈ…®ééi¥Ü4NÑkþüùºþþþ\0D.—Sœ~jƳg\QQ¡Þ(íX~}(R§O__†††”Ïa:†×ëÅÌÌ B¡‚Á .\¨HHs׉¹óø ärHÏGi1.G’M&‚Á ÆÆÆæÁ©|É,Í'¹8LC‘ ަ’ñ§"Ñ^ÜäÌB<Ǿ}ûT6À©6£Ñˆ©©)õ÷`0£Ñˆááá¹{‚.z6ЫAú-PS¥¢ô­”kFkÄ2N±k||\EéN+Á@©.Ë™t.mé kÈ\.‡ÊÊJŒŒŒÀáp¨¯D"èééAoo/, ìv;²Ù,ÊË˕Ĺ4---ÅO<¡¡¡œÏç›cçËd2éÎ;ï¼Ü“O> «Õª‚°Är´z|æ âœ. §è‰DJ¥TŠRÐíHšop8…õ¡´`/$¥R)¤R)Õ¨¨¨@ee¥’4§Þôô4ªªªÔL0DYYÊÊÊÇÑÕÕ…Ý»wÏíÚXüùÏV^ìÒH|@‚†Ò¡‰Ä°wÒõ7k@i.)Æ!l³Ù¬}þ¹ººóçÏG}}=êêêPSS³Ù¬ Yéê\QQ’’’ùäøúõë+æ¶ñ›¿¨4DU)£ÑˆÉÉI59*/í„©Ìæ2‚Sxð'sF«V«‹EÕ€”ÒŽF£ÊȃÒÕb™A½üP(„þþ~X,%bJŸ¿ß¯lÑ—,Y¿ßÁÁAÕaˆF£p8p8ˆÅb ;°X,xöÙgñ/ÿò/å×]w]®¯¯/7·•ßܵwï^ôôô(ªq"‘ÈC–cÉÒX…Òs¹\.Ϭu.#8Å.žî…Ä9™úd 811¡˜gì p¡h]os¹<25 ðz½^±#߸q#üqFÔÖÖÂ`0 »»K—.…ÝnGGGb±˜š‚”Š9ƒƒƒØ±c-Z„ÑÑÑÜëUí»Ž¾ÚÚÚTFpØf³©ç,ËAyò?⯹@pê‚…y(¿*‘@Û`M(Ë„Ùxé©TJ)[­VŒŒŒ(kkk+úûûÑÞÞŽ††ƒAD"•ž&“I¥Ì^µ^¯‡ÕjUÔÖo}ë[(**BOOO®¢¢â©;øf¯§Ÿ~:osóžs"T»>¨)‘Ëåõõ:gÏ•'á%lµÖàüwcP¯NjúK¬€šv4Ñà÷$“IUoVVVbbbápˆD"xÏ{Þ·Ûx<ŽH$ǃ’’D£QÕ­(++S`&ƒ—Ãá@EEJKKñÙÏ~Û¶mÃ}÷Ý7·«ßàõàƒæÚÚÚ`µZ‘N§ÕÆ&˰½6ƒ”kf.#8/¹±¥w $‘Äãq•2–Z´XëvK¾Àèè( <\.ž}öY´··cÛ¶mX¶ll6žzê)Ô××£´´###(**ÊËZ*** ÓédzqffK–,Áää$>ö±¡¾¾>·mÛ6œsÎ9¨¯¯GKKË\†pŒëg?û™ÂcÆÇÇáv»‘N§‹Å`³Ù”1­Ö™Ï—@áßãƒ1NÂŒ@Ë俳N$Èà!7»œH”¿ôz½ò7”$%›Í†™™”••á…^À¢E‹ýýýÊPƒ¿s 4Þ,--U½½½0 p»Ý0øãÿˆ;)D\pA®¥¥gŸ}6Î:묹  ®çŸ>·yófÅ Žc0”9*×…¨Õ– ïÄë#ÓdZŒ@f ²E(³­9Om[šL&D£Q¥7°téR¤R),_¾\eóæÍSc­”4/**RÆŸ 2V«333ˆÇã°X,Êù8•JÁf³Ñc=ôvìØŸÿüçhmmÍÍŸ?K—.ÅÒ¥KQSSƒt:‡‚¿“füqå]ÀR€ AéˆÌ/Ù…Òyz,<Å/)S¦¥Ž²\  ¶¬ù½\(Ä øK¾–ÅbQ4b޳Ò¼¿¿«V­‚^¯WÓ…6›M‰a–”” +…"#>)ü€_Ïv’ßïW‰Ã‡㥗^Âï~÷;LLL¨¯µZ­ðù|X°`>õ©OåæÍ›‡ÊÊJ”””`ýúõ´üþ‡ /¼ð*** ×ë•#r:†Ñh„ÙlÆôô4L&“ ú2ÈRêYÌ‚S#˜žžV\ Åãqe÷E”˜›_ë|¬‹]ƒL&½^ǃ}ûöallL‘¦¦¦Ô‚ÃáÀ“O>©J‘\.‡D"¡Ønüù™L‹E-Lf&ÝdŒ‚)<µ¤ÛõÞúûûÑÑÑí۷秇K–,Ág?ûÙÜâÅ‹áñxàt:áõzQ]]}ʇýû÷ç¶mÛ¦$ɨ‘r>+£Ñ¨ü'%YŒÔóT*³ÙüÊÆ˜ËNþ+•JåÂá0FGGñüóÏ£¯¯™L%%%ŠË/Ñ© ,}(´œs*ÛHl@Š`2Å'°H«¬x<®\v^~ùe˜L&Äãqìß¿_•ü­Fb!ý<­ ;Á,ùuòÿù{QQ‘*]˜êò3LLL ½½D*•ÂÔÔ, |>Î:묜^¯GYYÜn7jkkQ]] Ç¯× §Ó‰ººº“&XLMM-1 /?÷Üs¹k®¹&¯üÓ¦ýZ…")['Û…œK™Íj~.œ×®]»r¸ì²ËðÇ?þQmB—Ë…úúzœwÞyy_OpŒCžrÓHŽ9ƒ3-‡@jð{†‡‡óJ’X,—Ë…l6‹Ç{LƒÒž»@%n¡V—œ¥× ¢´à(ƒ»"Ôa,--Uir0D Pth~/g7¨£pÁäšššÐÜÜŒêêjÔÕÕaÉ’%ºWÁÚKFã=oÙâ5^¾÷Þ{sgžy&‰ü~A¡­P­¼§ÜürL™övsà$¹rãããøË_þ‚Gyçž{®²¯®®FEE’É$Î>û켇ͺš|¶…éYH¾äê"dÀà)ÂÙ…êêjµ¸/^¬æP__X,V°ö”¨5…–Áú_ÎRh³mc9Bþ<ß›œ±Ð~æÉÉÉ<ü¤¬¬LdF<ôÐCêD€¦¦&\ýõ¹õë×ã©§žêéîîþ]}}ý ͢ѨÉn·§^|ñÅÜÇ>ö1”””Àãñ(j-@ëþ,µ&´,æ2‚“äjkkË=ú裸ýöÛ±gϤÓiø|>TVVbjj ±XLÕóSSShmmE__ŸêÍkA@žÜÜdœFÔZ¤I²ÜhrqMLLÀl6Ãf³!‹!‹¡¦¦‹/†ÉdB @cc#ÆÆÆ)ˆS‹RG¿ÐëK`PRaù÷Bž òÄËf³jäšX‚ Ô÷—­Sb d?ÊÉ× ©K}}½ª­™Iüô§?Å­·Þ u¯ÁæV¯^––,^¼Ç›.m·ÛS‡Ê]wÝuøÛßþ¦ÞS0T*ÓÚN°\Z‰{þ¡á¤¹@ð^Ñh4·}ûvüéOÂ’%KÔF¯®®V)/HÊÊʔФ^¯GCCƒ æI'¼–0"I#Ü ²ã ÍxIçœââb%r¹qãF455©1dv÷Þ{/ª««•*¬B¢©ÚÔ_[æÈ@2ÛÅìG¾où™Âá0JKKa2™òJb(F£1osó`vEÍ…’’Øl6Øív•áÅ_ÄþýûqçwÂl6céÒ¥øøÇ?žÛ´iV¯^šššãn¿ýv ¡¦¦ápn·^¯7/ëâ½”>ò—tÄâ¿Iqš¹@ðŸü/½ô{ì1lÚ´ ˜™™Ýn‡ÙlV`Qr£Ñ¨"¬uÏ9çâñk¹$SŒ)07½äPˆ}æBe7[Rccc˜œœ„ÝnÇÖ­[{mzzZ@ €úúzŒŽŽÂjµå¾$79;ZÚ«üùdÆi7:³Íf;ÊÕI~MMM:ÍÙe‘)²d>_¡1ˆäB"-³©l6 ¯×‹ÒÒRõ½hkkÃí·ß‹Å‚µk׿l6°zõj¬Y³Ë–-{]Áᥗ^Ê8p?ýéOñÛßþ¡P^¯µµµ8pà\.W^ê/1­Ï¡¶$ãï%%%0›Í +™ 'øÚ·o_îÖ[oÅÚµk‰Dàp8àr¹TêZVV†P(»Ýމ‰ X,Õ4H$ÐëõhllÄ'>ñ  „Ãa”••å‘$ÈÓM¦‹L£™EÈ@PHŸžzƒ™LFQ…—,Y¤ì. IDAT‚öövÕ®ŠD"øÃþÇ£6 I.ÚTTžRd.jÑ~p___®«« ¿üå/±bÅ LNN¢¡¡Ùlf³™L±X >Ÿ™L¦` káµü*ø9KJJæÁ‰¾¶oßžû¯ÿú/<ú裘žžÆ‚ TÚÊ‘H$TO—™O)ó â²Ë.Sô\ bTbo=›ÍÂd2©´^v¸ð9w ­×yIg]–&“I®UUUH$Ø¿?ôz=°`ÁX­V´··Ãb±(’ÅbAii)‰ŒF£:m¹ùs¹œÚÈSSSjFždöÉI‚ŠÅbH&“0›ÍGQ˜Íf³Ê6Âá0, , ÆÇÇUÆ =11¡Ô—²Ù¬ÚÌ£££j€Š ¼åÉÊ †-S¾#5c±î¸ãÜrË-X±b®¾úê\SS¢Ñ(þùŸÿû÷ïG6›…ÃáP˜›Ï™b/Ç*ùL³Ùl^f EnÙYš+ ŽóÕ××—«­­ÕÀž={rÛ·oÇ÷¿ÿ}ìß¿ÅÅŰX,J:Ún·+ozmLJ999‰ÒÒRƒA¬^½UUU*‹`J*2n,žü rÑhûÎÇêÓs³¶&5¨×L$hjj‡?üaìܹO>ù$€W”uÉe¨¨¨@$A €Ûí†Á`@__ŸÓÆ\´’ñÆÏ699™G‘¶X,êT.//‡^¯G0T4fʪ3•••©Ú˜¢œÓ'ë‘›X{˜}È÷R24ù9ÒétÞkðÙØl6”””ààÁƒØ¿¿byË #P›ÊkË,-KPò@ Y¢óßd‰ÄLl.Ç«¶¶V7<<œ{衇ð«_ý wÝu—ZhǸÇÇǪ¡ù€dßžžv[¶lßïW”R«ÕªÒZùúÌ&¤Øˆ¶>”@ò´5:O_"î%%%Èd2˜žžVŒÓéDee%.¹ä\|ñŸ÷Þ{q×]w)Á Ž/‡B!¸\.8Ntww£ªªJ½'v5ø¹Y£ËûÔž ¾ž …X¦¦¦TÐ¥â2³ žÜBI\***B:VY…Ôt­Hù¾ä‰,ÛrÒ’ï‡à.ƒ¬ËåR’ñ,;˜uHë²BA@þYvJ Þʳ¶›ÃLçtpBu*•Ê}ï{ßÃw¿û]tvv"Ãf³)1žªæ rÌáßF#ôz=ªªªpå•W¢¦¦¹\ÑhV«5oF€œ|žÂ<¤jQ!Í:íÔ¢Ö$•(:ëéd2©íϧ§§100ƒÁ€ÖÖV\y啸à?ˆææfìÝ»ÅÅŨ¬¬TB¦,äl$Çpãáçg`‚ÙH&“ÙlVMˆÂá°¢-Su™þ ¼ïÜÒE8‘H NÃjµªòDžü¼/—÷Vò9ÊÊÊŽÊ(äi<66½^“ɃÁ Fˆl%£PÐr+´ +;D‹µµµ¸âŠ+tsÁqºþöÞ<6òëº>$‹,Ö¾o¬âÚd‹Ý”Z­^Ôj;–%;Žã@q<_vc’ù2‰3ÿ Á$qfË`3Ad2‰0ãØc$žÀ[Ž-ÇR$K²$Ëê}!ÙÍ¥É"kaíûÂ"ëûC:÷»õek‹c«ë ©Éf±–÷î»÷ÜsÏùÔ§>Õý‘ù¬®®bpp¹\>ŸO@?‡ÃN§ƒB¡ .Bz£õæA¢%Fô^“OômÁZ”Â¥š›ÀÍìp8Ä[1•J¡X,bpp@?û³?‹|?þ8~÷w­V @…BA3£”ÑzÝÔž¯—ÁJs#˜a°,ÐïË=¹ùjKOLêqmh>ïƒ&Ë(M|2Ž|3ë ¨i6›W!@ùjJÄÆßk´>7Ru9£Ÿ3»~ x Ö¿øÅîýÑáÙgŸ…Ãá€×ë•ñ[FfJwñkÉic”×ñz½Žh4Ú3O`³ÙD/@w ø!k€Ð(Q®Ûka7âúï‹E„P‰6³õ¶½½­­-Øl6!A¥Ói9D±X ¿ök¿†v»ÿößþ‰Âá°è» „LÓÉ dúÊMLMbÁ`P0dTræcrà‰ÃTûûûh4rXø~àÔd"íÄ_×Þ#0Nt >̵_¥n§òß>¨›rÐçyP—ÅÈÇÐÏÙÈí¶þI‘Gy¤û§ú§XZZÂüü<<šÍ¦Ü˜­V µZ f³f³Y2}£kyinnJ]¬_µ0 ,9ú–ÕôbcjȧIFz“0˜D"¸\.©e- :ÖÖÖ088¯× H$D4•‰ÃL&ƒD"_ÿõ_Ç_ýÕ_!b{{N§³'ka9@@ÐH6Ò’êÆ›ŸS#â<صZ ÅbÕjÍfSHBŸ—¶$ÛnV«Uq®p8Œr¹,r÷µÎ¢®ñ™ºkJm7§™˜|ÿôûIBƒ•΄ØÖ|µßXÓc6`œTÔ²ÛmùŸ,l·Û¿½¼¼ŒZ­&‘œ€˜Ëå’”77#[€ÜÌü`˜*scf³Yx½^?~Á`ãããØÛÛÃÍ›7qüøq¤R)T«U1CµÙlƒbLZ¯×áõz¥Ô7*A32‰Xë´Öf³!"N#‘H T*Áçó¡\.#“ÉôiÙl:CaÏ>ŸÏ —âÃþ°Ø«ŠÒŽÍfƒÛíF¡Pè9D¼½y³ë`çt:át:E •Ì?ÂóÐZ­VX,q ægÄ2ŠÂ­Ì|J¥’$b:,Ëøx žf³Yô( ¢ƒ„V†Ò ¨¬eÀÖ3M#Ç@_˜u ¢3 üšL&œ>}ÿ÷ÿ_úà ®µµµî'?ùI”J%ù€ô´ž1‚$IÏ "þü }>‰Ž;†»ï¾™L­V N§…B@€ <(•JÈf³( H&“XYYÁØØ˜mÈ`´Z­rð;, \.—0µù)[~T8Îf³ÒϧJñÀÀ€˜xhyšÐíµÿñÇêêªXv  T*¡Õjõèè÷Ö8ÀÇe½Ïò€`ž±eª›‡`¢‡»XèV¬~Mü/ç-x€9›À竟;™‹l-ùº­«§u0Ð{I¿Fã$ª‘÷À Áù‚‘‘;vì¶ oiôüóÏcuuUÞT‚KdáP‹þŒ$«Õ*ÜÚ1#h·Ûðù|R¯ž›=N# Šii§Ó‘‰4Z–ÙívÙn·‡CžC(’ÛŒA‰H}·Û…ÍfÃðð0<”<,qÀjµÊMÍš™‡ÆH'ÖˆÞápàOþäOðññ@ €H$‚x<ÞóšX¼°ÉˆKwNŒ‡Ì„4ÖÌC_*•¤=jt ¶Z­ðûýÒέÕj=üµñ4³Ïøžeå"zipP_<¯6¨¥„þyº>Fð&Ö—¿üe´Z-I95úm‰8(ðÐ럞ÖcJg±XÏçÇáñx`µZ¥ÅăÚét„­¦ÝpÃá°Œ*ÓÇápx‰Ê¼³³ƒ½½=”J%é³óFcªœL&%ø´Z-T«UÈB €ÍfC"‘@¥RA³Ùìá¯ë©8í¥@pñÔ©Søÿá?`xxög†`0ˆ'Nàüùó"´rÐÿA]Í“0J½Sr 4v288§Ó)ÃWÌRHSÞÙÙ‘ôŸ"¬|¯¨äÄ‹Bk+0X讄q@L«´;ßWf]Æ!3㨹~íÚø”{WÙ~ið:×ùó绿û»¿+Óoz“jËi]—ÔofÐÐéo‹ýý}øý~´Ûm9rÁ`/^ÄÈÈÞùÎwbpp ¨ÕjÈçóRbTÄŽƒÛí–MJƒ×ív£^¯£X,"›Í jΡT*I “2åÜ`.—K\ìv»MdÒíK#ˆ588—Ë…ÕÕU¸ÝnÜ{`˗/#ŸÏ#¿"P²ñýd }}ú )GÞÜÌ€ôÁ"RáºT k°\.KêÎÇæ!'Xª|]&ð&g&¥ÁBÒœ „²³Aÿè`ʃle5R«5›¡fYêÿç¿)•Jò=¢ûÏç¥;Àl‰øK<ò4×ã  =(—ËõŠAO™’¤KOݾäû¦ƒ„î¾°$ì—o`e2™î/üÂ/H”e@Ь1ÔS#:\«Õ„tÄÖÁ¶jµ ¯×‹|à0›ÍøÆ7¾|>[·n àà 8ÞPÜH|\t-ßÅçµ»»‹T*%}óááa¡×ê!¦T*…D"!þ‡NGTŒ>,úˆ¼áYóuhBަsƒ‹E auu¿ð ¿§Ó‰ÿøÿcF6.ÍÉ02#Ù™ùvl<Í.d Òm9â=šÃ¡G‘Ûí¶8Qó³ãçÀ1f£:”&ñ}!F¤žÄö÷÷{(Ñ:;Ò%¤QöMg_ºDâïæ÷jµ¶¶¶º±Xl ^ÇZYYÁ“O>)‡kddDÒghFgÝ >¤b¿Z dè òñ xþùç‘H$P­Vá÷ûaµZñÜsÏauuããã8|ø°tÌf³d ÜÜDÓõÍÀT7 IÍÏv7b¡P€×ë…ËåÂÄÄšÍ&677E”D›£°­ÇI@Ò«@nqäš<ûjµŠ;ï¼úЇËåðgögrØ„ûûû°Ûí"é­Û°<”:Ò}w#^sÐÒ3<ˆúFågÏçÅnĺkv"üÍ7›Í¢aÀK\!™L¾cà¡'ØÈÀKN‰qU3Kùø¤¢sÐ>FðÖÔÔÔoõ«_•bå߈º_tíº»»‹\.' ŸÍfƒÇãA2™Äèè(þàþ333^²?wîÚí6r¹Nœ8§Ó‰gžyó7ƒn·‹………-–€B¡ü~¿€M‡»»»Èf³h6›H¥RˆÇ㘘˜.ÀÙ³g…;À.CodNîñæcÚÎÚ›œcß›Ïmxx…BÃÃÃ8{ö,ªÕ*žþyƒAìíí!—Ëõ–J¥"Ù€& QÆ €¤Ú÷Q»>ìÕôiŒõ\ƒ–ûb6¡±­þ¤o^f4‹Eæt$(Øjµd±\.#‰ôàZ†\glÛ…`Œ™¨žËàŒƒÓéÄää$>ýéOÿ—~FðW½^ï~ô£~öAȳPá E¥B®Ùl†ßï2ÃáÀÚÚfffðßÿû—(=44$2aúà/™Zx<x½^1+e›Ôdz ò ÀjµZ(—˸zõ*vvv°¾¾.]ýý}Äãqéc_¹r¥ ƒÂÈã#§€²^‰Dn·[<4uX×âFw# òýú¯ÿ:êõ:þ÷ÿþß"«År ¬tïŸYšV/Ö9†±©klcçá v?ãÀ”Q'’¥Jþ ocvj¬V«™z½.åš.“XZh€Ù8R~'¦^NG”§ûÁëX›››X]]…Óéì!ÓO¾ñºÝ622·Û-*5ù|^ˆA“““Èd2¸ûî»ñÑ~‡G;SOÞÀ¥RIÄ+l6›ôÛYð@ܼyétZÆ\ÙÖ«T*Èd22ŠJÆa«ÕÂîînÏaêt:¸uë|>œN'†††àr¹N§{Ä?)¼244„Z­†jµŠR©„p8 ¯×+5µ¶d#J~¾oÁßú­ßB­VË/¾(¤\.Ëô&Ÿ3ƒ [<(‚å¿a6@©2–)NböŸ™&Bi&¨>dzFÂVj5e}‰hìBó˜i ™™K½^G¥R‘=Àçj¤Ä›ÐßßÝÝÅöö6®^½Š .tï¹çž~ x ‹2Òf³Y¦Ü´.œq8r ˜ZSY'‹¡Ùlâøñã¸xñ":„óoþ Âá°˜V«UÙ°»»»p8ÂØãÍNª(}ùûkµÂápÄ-ÒB±…F1==|>ÕÕU$ ¬­­áž{îÁöö¶¤Û¼UK¥’¤£Z釷ÁºÍÍMìîîJ Êï龸ÑŒï#AÐßû½ßÃ{Þót»]‹Eø|>är9¸\. ¾7&P788ˆb±ø €Qó>t¹ÀÔš‡Ù8€¥±Þ¯Vû§ÿæsÑYËM&^Ä6Ä–4¡ÈŽÄÂÔ`k©TÂõë×qíÚµ~FðZ—ލ<ºk`T Ò©öÐÐÜŒô*(•JH§Óðù|øÐ‡>„ÉÉI ˰•Œ(´1==J¥‚±±11» ¢ ™u$ŒpƒÑ݇ÅåráâÅ‹ØÝÝFßää$>,@T½^G"‘ÀÄÄ„|Hÿ¡C‡zJ#­zD\$Ëïe—ƒ·4Žþ9Ýo7¦ÛüÇŒñ/þæææn·»§CC}@f Äõz]€;<=©¨[rLÝÙJ5²ñ^M¿ÀÈê3 ½š «ÃÖôôÑÑQÑX$ÎR(¤´áœ1=ÂmÌŒ¬Vý™Y­VÔëuÄãq\¾|Ï=÷\÷äÉ“çFFFNõÁ·YTÚÉd2ðx<2¡¦‰&¬—t i÷­Ut r¡P(à#ùÞùÎwbdd~¿_”ìv;òù¼€´…B²qN§´šH‰µÛíðx<A<Ç­[·¤×ïv»áõza·ÛqìØ1™˜l4ÈçóBi&æ@ü‚à¢ÍfƒÉdB,“ÚRwôØóØØZ­–Ìè¯7«æ:hæ Ǹ‡‡‡qêÔ)<üðÃøÅ_üE!Gq ’CIœ¯êÁXÓ”ŸšŒÄÇ$>¢oÚƒn^ýy¿n¼…ššDd,´]œQaȘI1#17c2 Ú0)—ËX^^Æõë×1::zG§Ó9e2™^ì‚WY¡Pãããxî¹çF‘ÍfexÈìïï#•JÁf³Áår!ŸÏwS©T€- áÌ™3ø—ÿò_bzz©TJÄL–––¤l`IQ­V1<<ŒJ¥"a¥R]¦ü,)˜.f2lnnbss&“ ããã…Br˜)/FY®b±(F nÓÓÓò}.ǃD"ÑÓÊ;¨GÎÁ)¶‰„P¡ùïG|÷÷÷…ùöÄO`jj ÿú_ÿk<óÌ3ø»¿û;ñ*ÔD(Îo°fÖ³šU¨Y–|¾FåÔ4%ØŒšF\àÕ¾¦KãMΨ‡ŸÈ(äX4qmRs§ä«•¬üz±X”ÌâÖ­[8wîö÷÷íÕjõ3NçI“ÉôËý@pÀr¹\ÿîßý».ù•Jv»]'ÚòåS¶=z´sß}÷]¾ûî»—£Ñè}gÚãñ`qqÙl‡Ct£Ñ(âñ¸Ì$ Ñ# *@ÝnÑhT%«ÕŠV«…L&ƒíímìïïczzZzáÔJt»ÝØÞÞ†ÇãA0„Ûí†Åb¬`eeCCC˜œœ€z½ŽZ­§Ó‰••LMMÉ!Ô¦J¥—Ë…‘‘lnn"“ÉÈè®v;>`ãTãÆÆ¦§§…pôðÃã?ý§ÿ$e@¹\F6›ÅÚÚÖÖÖ¤äJ&“‚…(Õl6eÐÇjµ Æ£K>‰ˆ1è ÇƒÅ>=Ÿ;_·V ÒÜ £Á ûù ŒÒ¥'>™EhŽÀAÃ]%]²pHmã . R© •JÍe³Ùv?#ø6ëïxGO«*‘H ŸÏÃï÷# ¢Õj! áÇüÇoÎÌÌ<ùc?öc¿¼ººŠGy¤çqÎ;×Íår°Ùl•9ÎJ-‚«W¯æç籺ºŠd2‰³gÏ¢Ñh`xx?ù“?‰_ù•_ÁÄÄ"‘ˆ(Åb1¤R)´Ûm´Ûm8NX­V!Á´Ûm,--áþûï‡Ëå’:Ôápôd ËËËBPÚÛÛ“ù‚¯ýëxï{ß‹T«U,,, Ýn#NËíD§£z½“É„ééiììì #›Í"" 2::*tWê:Ç€©ÅàõzñZÍGoܸÑÝÞÞF&“A2™Äõë×ñÜsÏáúõëÒÐv¬V+ …Ün·ÍìííÁétŠ@:–9 lÎzÛŽF–é·“ãAoµZ²7Ø©"Ì@@——ÓA¥—ñ÷óñišÂËkee;;;H§ÓØÞÞ^øÌg>ó¿>üáÿ¿ý@pÀC @<G4E¥RA¹\F"‘€ÇãÙlÆÂÂBõ£ýèáoÓ}X|òÉ'{ŒHGeÊÆºÞn·£X,âgögñû¿ÿû°Z­p»ÝX^^†ÝnÇoüÆoàþáàñxàr¹0??/}ÿF£H$")¥Ëå’ñÓ©©)©áÙÞ4›Í¨×ë">ú /ˆÁ‡n1f2\¸p333h6›¸téæçç‹ÅÍf{&í´z3AÍR©„›7o ¹&‰ ›Íö€Yz“êÞ=‰Z¯u>|øãÖ­[Ý|>J¥‚D"Ë—/ã…^Àòò²Ð§Àn·‹è §8 …‚€¬ì>èî„f8jôŸ%ñ’Yo/×üªå{¢\­î<莳¶huæ ‡ãHY'XJkµZýWÛÛÛïŽF£Óý@`X“““xÏ{Þƒ¿ýÛ¿.;µZ>ËÉdÒ‰D*Ÿ;wnž.Ãzˆ†íÉ lmma`` §_>66†‰‰ ¬­­¡Ñhàë_ÿ:Nœ8½½=¸Ýn¸ÝnlnnbggGÀGà%#‚RÔ$€.Ì ‰H R­V{júÝÝ]lnnvvvdŠˆw*•‚Ãá¦Ú¤2W*$“ILOOË­f±Xd€ÇhÃÅò‹x{{»FßPß{jjêÀŸ[^^înoo##“Éàoþæo°ººŠt:Ý»‘L&„Ãa”J¥e'ÞÈC&êo2™^A奭qS}íÉ=¢ñ]’ê/­Bm”¶×åöÏ`–‘Íf‘ÉdàõzñçþçSçÎ[>ýéO¿xüøñÓÇ( O”J%™·/—ËR[f³Y¬¬¬‡‡åÖ­[ø÷ÿþßãñÇǹsç°°° Â3Ï<—Ë…~ðƒÒ[æíĹǃññqÑ$™G+épˆÀg¥RA«ÕÂÕ«W#ˆÅb’޲–¤ /;¡PHèÌ Ò¦ãÍÃ!ªô®®®Ê- qüøq”ËelooËM«7¾ÑW¡Ûí‚sß­U¯×»[[[ØÝÝÅùóç…™·¸¸ˆt:-´îf³ ¿ß/¸ot=Àš_¿&]Ôj5‘š³X,Ò *ÇÆLEk/r/³=£ WŒZ–œù ÉÎ/ÿò//ÎÌ̽í3 Y†B!LLL`ffO=õ”|¬Ï†‡‡‘ÏçÑl6…˜±¶¶ö™`Ãòù<Ün7jµnÞ¼‰­­-9$|œ`0ˆo~ó›8~ü8¦¦¦D“°P( P(àìÙ³XXX@<ÁÌB¡€‰‰ T«U¬¬¬`iiIÈ:SSS8|ø°€sv»½Çd“B ‰Å ¬ IDATDBRv¢ìår‹ ˆÅb¸~ýº ó´p›ššB£Ñ@.—AQÎæ³O}ÁH$‚  `ee6›M\œHIfùd4sm·ÛH&“ÝH$ò] V«õÛþ®gŸ}¶ûÈ#àÉ'ŸÄsÏ='ú…¤“z­} ŒîR,ä­ÍtŸœ ‹Œóì Dn2vؙКˆzpŽnÐõz×®]×¾ô¥·Eyð¦A<ï²V, ؤS8*år9¤ÓiÖÖÖºW¯^•Í`6›EÖœ5i:–Ö9𣣣p8¸vípèÐ!ŒŽŽ"ŸÏÃëõâW~åW0==-ƒ)³³³p:…B°X,p8¨ÕjØÙÙA©T’Û`mm ÃÃÃ2ÅqZÞ&ì3eª˜L&áp8077'ØYív[J#‹Å‚ÕÕU:t¨g£ñõ±Lp:ðxLOO£T*!‹¡X,bhháp÷Þ{/žzê)Œcccív‡‚ÇãbÓ­[·°¸¸‹Å‚X,&illL| ØþÊf³ðûýr›“É :??/xB,C¹\ÆùóçqäÈ !‘HˆN)ÓZþ»V«‰ÌÚÚšTl;’û åÇtÛmll +++ýs/Ý­ØÜÜ,|îsŸsò“ŸÄ… ä¹çŒæ.ô¯`YEæ#±Mq§¶!kýÑÑÑï ]û®4½Ù蜇…Còvñ@xS¯‚Óz¤¼f2qØ¥.?-y ^¸p‹‹‹Ý­­-¸\.är9x½^9=öVWW111ÉÉIlmm¡Óé`zz£££H§Óðz½BÆ1™LøÂ¾€|~¿ÉdRh¸Õj_ÿúבËåÇ‘H$d´ÙétbbbV«±XLʇjµ ‡Ã\.'ÊË¢]ÙÖÖjµZ­î½÷^d³Ylllˆ`F ÀÙ³gñì³Ïbpp333H&“x÷»ßd2‰jµ*¦!ÜÜP¤N›L&D£QØl6d2\»v wÞy§¢ô7åÝjµšÍ¦¸.}·K„׳&&&<L&_|ñÅïøÛ¿ý[ûßÿýߣX,JŶ®Óé”A­[·^Â1ƒÁ ¨d×j5”Ëex<žwhM9æþãX3;72ùèÁ%Í¢A0”Ín·cyy?øƒ?xû‚¯ýëÝ?üÃ?Ä×¾ö5±4kµZ8|ø0Ünw488ˆjµ* :¦Íõz]NµZE.—C*•B¥RÁ]wÝ…Z­†ååe„ÃaƒA´Ûmé&0µo·ÛÒ ÜÜÜ‚‰ÏçC$Áöö6666°³³ŸÏ‡±±1)Ø·Ïd2ðù|°Ûí…BÈf³˜™™‘6qçY__—þr €ËåYu¶¦˜þ—J%œ:u år×®]ƒÏçÃââ"¢Ñ(†£ÐDS:%%ØY*•°¼¼,AWks^la×¢Ñh|Oƒ—[²§4ÑéÊ•+xôÑGñøã‹–™¦Ì¤:ŠÅbDšÓéD±X”¢UŠô˜µÖzÔ¢¥š E,€\-·6>>ŽL&ƒL&ƒJ¥‚H$r{‚K—.uú§KKKâÐS.—1>>ŽÅÅEÙÀív[¤«Ivyç;߉cÇŽÉ›ÎêÖ­[H&“2uØh4„¶ËÛ™NI£££¸xñ"¬V+Âá0Òé4"‘VVV0;;‹ññq8Nlllú>44„x<Ž{ï½W伈ZS ‰Êf³!•J …÷SŸúÂá0¢Ñ¨x'˜L&LNNŠè‰ÉdÂúú:ÆÇÇeªÑçóáüùóèv»ÂeвfZŠ\§¢âÜÄÆÆæææ`±X$hh¤gŸ–(Ó½öï‡e$:­¯¯?ñÙÏ~ö¿ø‹¿ÀÚÚšH¤QS¦­VK†¥´Ó³žbd¶ÄN‹§jéýý}a‘j±^HÃÃÈÇã’åÎÎÎÞžÀd2----Í:tH8ß”à~öÙgå¦Ö&“yzè!=zTë¿d2‰|>/³çÏŸG4ÅwÞ‰­­-$“IñÌçóBY¦w@0”^ô]wÝErH‰³ßl2™ …àõz166†l6+4TN áÚµk¨×ëÈd2âbðÀ V«ajjJ*N)RãÀn·ÃjµâÅ_” Ôl6ñÃ?üÃxì±ÇpýúuD£Qx½^T«U9ìÃÃÃ"®c8100€b±ˆt: Ç“É$S™Ä˜²ÒÍçóadd·nÝê¾Ì²ü¾Ù˜žž~žzê©ÊŸÿùŸã³Ÿý¬¥‚ÏçÃèè(2™Œˆ²°v7ÎP‰¼v¸7ŒJJZãw“““p»Ý¸zõ*òù<, "‘ÆÇÇç¶ ­Vküøñã¸té²Ù,Ö××1??/æ&„—ÎM=00€™™ÌÍÍaoo…BAh¼¥R ÅbQÆ—)‰>==-Húää$œN'Ö××±²²‚ééiìïï£R©àرcÅ7ðÞ÷¾~¿/^ÄÆÆ†‡‡Q,Q*•011}èCÒ¦[YY‘[€@%S§Ó×ëÅ3Ï<ƒV«…û￳³³8sæ nݺ…P($4ãýý}IS9ªLbT&“ðÒdâ±cǰ¹¹)tܵµ5ìííÁãñH Ŷ˜®UÉ÷§R"‘î…CxóówsCk'i>ßïÇuÿý÷;J¥Ò'~õWõÿùÄ'>1wîÜ9áu„Ãa„B!lmmI Õ˜‹î^‘ÌÄÁîæ3P®Ž ˜žžå¢d2)n×/“ÐÞµÁë¶E?qâ„ýÁ mmm Ÿÿüç{RPèR‹ÿÌ™32€Dšçàà òù¼ÔtLÍ;³Ù,õîèè(ÖÖÖdD˜M©°R©¯×‹ÉÉI\»vMÆy¨Ž9‚£GJZ̓ ÀÛ—mC›Í†;ï¼ccc"b²´´$í®l6+r_¬éyð˜%¼ï}ïƒÅbá“ .à]ïz~ðPØŠýn·Û"xª 5dæ½Ü¯ª2g 8V¯×¥¤z™‹Å‚‘‘lll|ßzy¹\®ß<{öìá/|á ¿ýۿݾï¾ûÚ;;;¸qã†øE°$Çœ¤­ƒ$Í*•JOÀf³Éx½×ëœ"™LJ6Ûh4`·Ûár¹~ñ¶ yãM ”b:4‡Üçóá]ïz— èPlsoo™LFl³èÊK&‡L666°½½ “É$Á$Ãn·#‘H`gΜA"‘ÀÖÖ–Øž9¸Ýnœ:u ­V ×®]Ãèè¨qø|J¥vww{†ˆ²Ù,Μ9¯×+ôÙr¹ÜcjÊÞ´cm4XXXÀææ&Ž=ŠjµŠÍÍM!>?~Õj‰DB|Ün·Ff' Lš+`2™‰Ddã2…¥–#Û¬œÔjÒüþÛaýÒ/ý’>ó™Ïl<úè£KKKX[[«­®®Z=Ï€vG"ˆK.ÈèèhÏcñ}¥ñ-U•¹Ç9IKE§ÑÑQ Þ@o—5øF~èGôGáñx¤æº÷Þ{‘L&{n4ðûýD$Áôô´(ÿt:T«UÑ,ÔîÃdÂívc}};;;‡Ã¢ü»°° ߣ3ˆ—OP*•0>>ŽX,&] Îükp®Z­ŠÁwÜññq¸Ýn¬¬¬`ÇŽÃ;ßùNƒA<þøãr9ðC ǃpóæMa»Ýyç8~ü8–––P¯×±¸¸ˆÉÉI¡E/// ù(N÷¸FSꜽnÒj©´K䚊}qaE©=ðr+òmãðùáxò¯ÿú¯^xá…ÿóþÏßÿþ÷_¨V«¶vYBY,–Jà¥ÉQ—Ë…H$‚ÇãäÉ“¸ÿþû1??`0à%ç¦õõu,// §CcápømÞPFà÷û…Kÿ±} 'Nœ@¥RÁ£>Š¿üË¿D³Ù„Íf“ZëèÑ£h·ÛB–a0(—Ë"]F½€V«………ìííaii årY\$Á‘#G°¸¸ˆýý}„B!´Ûm?~¹\n··nÝ‚ÉdÂüü<¢Ñ(FFFdF;g2áø‡B!á°7?;;‹|>jµŠ¹¹9 â+_ù ¾ùÍobaa B4r8°Z­Èd2¸qã\.œN§¡&“ sss¸zõ*fffP(°··‡“'Oâk_û®_¿ŽÝÝ]Üyç¨ÕjB0Êf³’0Ø-·ÙlØÚÚÂÆÆfgg199‰F£v»‘‘x½^˜L&$ Dý~?-âÞv.>>øà‡766Ž9räÓ{{{÷ Ћ±ÓéÀãñˆkµö¾´X,°ÛíDÓ·V«!à=ïyÆÇÇa2™„èÆ’÷¶“““ùÈGº—/_Æ}÷݇@ m—Ï}îs²ñ¨x311n·+=p"»Îž=‹»ï¾ÛÛÛxüñDZµµ…ññq—Îårðûý‚!h´Ÿ’k7oÞ„Éd’Ùˆølä›ßü¦L'îíí‰ý)±œÄ#°êõza±XP(ÉdÍfEè„]âÚ¹ùå±íîÛ1üðÿð‡Ïž=k»óÎ;qöìYœ>}GŽÁÌÌ ¦§§Ñív‘Ïç±¶¶†ÅÅE\½z×®]C<ð–¥jÅÐ4èÛ:#€ÙÙYìííáÂ… p»Ý¨V«"#E’ 9øG|"¸ÉdCCC…B=rß·nÝÂþþ>€HQM˜4 ¡ÙlbllLø÷•J±X Ò_f‰ÀëëÑÑQQðÕ¦¤Lùx+s^assívø™Ÿù|õ«_E<Çòò²HŽ%“INþ Q€xx½^a¥ÅãqÜu×]ØÚÚÂéÓ§122‚Ç{ CCCØÙÙ‘çF³Þâ¬MɽçmÅš˜B«SÐ*¾$Ò}3B&ßK«T*=±½½Êçó_üâmëëë’ PYˆ6säIœ‹òkÌ™ ’ãÑl6‘Ïç{Laûàå[Þápà+_ù ÞûÞ÷Âb±ôø×[,4 œ:uªG—†\.‡P($T`«ÕŠf³)ÞvŒÊ¬×øañPÕj5Øl6Ôj5a=zn·[êB}PH/eßÞhÀ¡£¼Ûí¼@›©$“I ãýï?VWW±±±ëׯ£^¯‹'c:~…½LJ9¥h2™péÒ%a76 ¼ÿýïÇÒÒâñ8†‡‡E^Ý(µ¥E>I8òz½h6›( ˆòõQ ƒÈxµZE(€W¢¾Õ«Ýnws¹"‘ÈÀööv7›ÍÂårajjj ‘Ht766dT›“œlé‘ðòãë2‘HSYàOüÄOˆÇ$ûüÔ6(•JÂËÐ,r ø»YR±ÅHü€¬S»òý|;•o*D£ÑŸÿùŸï^»v ÇŽ‰o¦ÙüOœ8!·&)òÀ¡¤r¹ŒX,†R©„H$‚v»-2Å8Hý娲ËåB±X„ÕjE*•ÂÉ“'áñxÄm˜¿_O§‘ßÏ4›ª9l!iµ Yd2Vá&õù|8tèÆÆÆpþüy\¼xñx333B-&è422‚@ 䫹¹9¬®®âرc¸~ý:Î;‡ÉÉI”Ëe;vL˜”ä0 ÒäfLýÉ-(‹Èçó^jOÝPúÍÍÍî?•Éúú::nܸÑM&“r;ñ‹_ì~ík_ÃßýÝßáÊ•+p»Ý"*Kû¹f³)Ÿ!ƒXâ±}W¯×…Â×év»oâ壃 k{Íц©ì¶p–„´•Ó#Íý@ðò Òï¦ÝYr¤ÝŽË­ÊÿÓP2åxƒQ¹Fkòó@h÷[’m¨ûÇB[ka ºåðgµA‡!Ýœ}pŽ“§ñV¯L&ÓM¥R’É5 ‹EA†F0f 3==ÝÓ%2jjh>.ªU*yŸ¨ÍÀŸeÊÏÛŸjHœaáìU´É>4›ÍÈf³X\\ì &}°Pµß÷¾÷ajjJn+x”¹æp¶™"’O¥c~dã„S8âûûûp¹\r8h˜J-C§ÓÙ3JJCΑƒ?T ,6 bbbBÐeÞ,ÕjU0„l6 ‹Å‚ù‘Á‘#GL&ñâ‹/ŠD}âñ8 ƒ--"ùÔbä¡™…Éd’‰La´k°6$!›Šr¹,ã¹z²ŽŠ–^Ô€` ÿVn*rxh˜ÆsèŠ8 Ù©dVÆb±WxpphóN ’­jôgdБ4´u¹\¢•A1¶^wwwQ,Ed†>+++Ty!õ z~v»]Æ6µñæôô´B0z7›M$“IѾoµZƒ¢ÀL½ŸÏ×ÁiòAý:—Ë%=t‹Å‚r¹,#£¼i¨™p®V¯åæaí¸µµÕÃðc€âì?SS8uêzè!øý~ܼyßøÆ7SSS‘ßn·Q­Váõzáv»‰DpóæM¤R)LOOÃåráôéÓ˜˜˜Á”tq8E»Ýƒm®J¥‚ÙÙY´Z-lnnŠé+Ùuº;¢­×Ù~|«‡€P­V±··‡íím¬¬¬`uu.\ÀSO=%àÜîî.N:…B¡€t:-ìSlÉLËùž³sÄ×GL‡ûóü>J©TB6›•–7Ë.­›ÈÑæp8ŒT*…d2‰+W®H 7:)ÝÖ¥×ëE»ÝF"‘à‰y‹W*•ž)9²èœN'öööàóùd؇l0ãì¸Nqõ­Îž»±v{5]º×²ŒöXúqõø0IR¤±>ôÐCÒ–úÿã  annÁ`µZ X]]E³ÙÄÌÌ "‘¾õ­oagg_ùÊWpÇwÀçó ZÍVêÑ£G‘ÉdP(¤íIOB¦¸<ØL‰K¥¶··%CâħžÏçÍúV„·nÝ’¯x<Žr¹Œ¹¹9!O‹Ex½^ ãäÉ“‚g0è?CýY²d4±òP´æëåûÈ AN³*‘ÔJ$®ãr¹ EÕêóŸÿ¼Ìž0 ¿Jƒ7fgg‘J¥P­Vø£Jð’SQ}óRò+Ãï÷cxxXqxã±>g„g:ÆQßâìVèƒj\o¤¦;(«`@ªÕj=­(8räâñ8®^½Š›7obaaøÀÐívqèÐ!GGGñŽw¼+++X__G¥RA(‚Éd½÷Þ+cÑôc  K'Þvúõñ=ÏårB¯%VÂô—­D†R©Ô}+Æ”©°ºº*ŒÈ“'Obyy›››€ÃᱸçÜ?­âµ,?;f1”Á;ÈÔ„`.¿§µ&YïóBa¹ ­Úض—,¯×‹/|á X]]Å‘#Gø&&Ö/ ÌÌÌÈÀ QW¦ÏÀK‚Lóô”^±X”ÛÝétŠ¢Žn3¶Z-Ûˆèówè1<<,5ýw²Íz­‡ÿ sNýÿ[àMÃv^*•B6›E,ÃÙ³gñ|“““X]]Å'?ùI\¾|Yð>w‚§~¿©TJJ(—Ë…w½ë]0›Íxæ™g„tE^¥ÓIzáa PHoCí!ÈA*þ¼E=}  tüøqüÕ_ýR©”0.«ÕªŒõà$„Ÿµ–£gË—¯‘þ’PãkÕmUÚÖ3Õ 6ÆßC¬…¤Ñhàù矇Ûí–¹mŠÓ/u ö÷÷‘Ïçqýúu\¹rE€–<œ”Ž¢_Ëå@Ïf³‰H'øJ¥Êå²¢¸FóÌááa >Èíö Ûí× &ÆqVþ{v4ßâ'~â'pÇw`ssÿøÿˆ‡~O?ý4|>fff°»»‹r¹,­S2766àt:qæÌt:1ä$yK—üC´mW–iÄY´T¸~ o‘9J—`ñØØŽ9‚z½Ž/ùËxì±Ç¤ÖŽÇãX[[ÞËCf ´º|µçÌ1míLÍ›ZK½u»]¹Åuç…ß'㕪RŸÿÒ—¾$“‡Ì@ Šó»íKÖ—ñe ‹5*o&¶w˜²v:9üº?®[;4ÑYM²1™L‚O¼xctþN@ ]¿Î¿k¤›6oÜ$ GŽA4ÅÓO?\.‡^xù|óóó8|ø0b±àðáÃXZZ’Yxˆ™™é>™,ä×.H¼¹HÒ¢³Ù9¢éZ»ïÍ®t:p8,: ¡PßúÖ·+I¥Rðù|òÙ’ùÉ ¡T*Ii  YÚˆD÷ÿ5FÄ[ž¶i9\ĬÁjµ > Bfä4?~ËË˲¯M&“έV SSS"sÛ‚L&³}åÊ1% ƒ¨T*x衇Ðív1;;+ªºDxÍf³ø²6cN¥R"É–—Q¨Cˆ¼5–±}dÌ ÞäÕÀB£¾¼œžžÆÚÚJ¥’ȱ/!xJ5Þ ¹å)Kp5‘HˆëÞÞ:„n·+¼ KKaw„Ú‰V«U¨Öô^¤¨&j1³x9Ñl`ss"ù–N§qãÆ œ?¾G¡‰œ†%šñI¾ÿ«•uìÔœ=èóÕòcššÍìIû1r ž|òIÙ:@u:Üy瘟ŸïÖ±LC›Í¦lÌûoÿ-ü~?šÍ&–––dÓ2+ W};ü~?âñ8Z­–dú7…¶ªbúË@ðjë̓ƒÊccËˢÅÐÐ̲S(¤\.ÃétÊPÔÖÖVWW±¹¹‰|>`0ˆõõuÜu×]¸rå qäÈX­VLNN¢^¯#•J¡T*!chh‘HDzßì‘·Z-e¦§ Öü×Ö_ühþñFW­VC§ÓÁúúºØÊ/..âæÍ›€[·n! =˜‡Ÿ K"íttPˆ¨¿ ‰1³ ­ö]´Ùl¢6Ä®”Ön á¬Õja~~ŸûÜ篡œz±Xºñìì,FFFúÀøøxôóŸÿ|wppøÀ$µ%Å•¢ÀKŽHG¬®8›P.—#àaÖ´RVp#1Pär9Øív¤ÓiŒÉÏñ18°CÎ;•:yµetÞÑC=Ü4ä̳Tb°"ÚL»øX,†X,&}öF£Äãq 4 ábŒŒŒ#±Z­¢X,Ê´#³*Þ°.— …B‡¸téb±˜dSþ2™L°ÛíÂä4ª÷¼&a>Ÿ—À^,…2|áÂŒŒŒ ‰È6yV«ÕjUÒyN‚Ð#Ȭ‰GLÓõ¨8Ë«þ#ÐRåÌXvòïV«@###øÌg>ƒT*…p8Œ@ €b±ˆb±ˆ½½=„Ãaüþïÿ>î¿ÿþ·ÇøMcDúC¡ÆÆÆ„ˆA¿¶ixXHeꪥ»ùA1ºk#M$á¬'ìxã±½Ç[ßzèäŸz½Z»’5q.—Ö¤ÍfÃøø¸ ÷úµ/--áĉ^²3 ƒh6›¢:D½>íâ«Ûo|O˜‚]†u[÷ð-H:϶$M¡P@©T¬‚Ÿwf0|mg '^Dnß„ ö¬û†âð}¡†Ù¨ülÄ©éØét°²²‚øý~ ,//cxxï{ßûðÁ~ÇŽ ·~ 0lx¦…T×á@Œ±çÎY­«ÇUSIùáé ­‡H4M˜€7ÐAH3?tÊ›·‚ÀAÀb$‘Î ‘r²"- Ž9"z†¹\‹‹‹¨×ë’2Sɉ(7%Øh®Ê÷‡ÁÝšr¹ ¿ßß39w1çõ®­­­n©T’[˜iÿÞÞžp ÆÇÇ{ðJ®±TäD*‰gúFçó£2¶¦ƒóõjšøØØ˜ÐÚ$ÀIDAT°7Ùn¥‚1ç=ˆYé,Òy”ÏÄéÓ§ñ±} <ðî¹çž/ùËx»®7æææúÅt:+W®`vvív[9©ÝÇ´^‹–hc Þ ÚdÔhÂ[Äí†XRé`ÁÛNÿ®ª¥§1# PG޹é*•Šè,¶Ûmi¯R=wnnFG2)šÈ/¯Ý~Yžñ–J%ÑâÓ@¿Oûûû¨×ëÝïän¬É@Ìö´,üÅ‹EkBgÔ„ X çvwwŹЙƒ‘Uʬ€€#÷³B#?€ ÊZ­†ÝÝ]¡>s|}ttSSSrW8ÆÔÔ"‘Âáðnƒõ¦ÁÌÌÌ/•J¥‹‹‹÷\ºtI†MHÕfŸLûXÏ‘åÆ”•”eÍ3'»P«ÑT§·Z-Ôëu1ÿà&z«{寷,0v´Â}ø˜úîíí!‘HÈûC›ù .`~~^X€|_9PU*•à÷ûåÀý¦Ë7ÖçÚPN¾×4Gy-kss³Ë²€£ã<ÐÕjW¯^•ž¼61òø»õaÖºúù±k ÷ÛÄHôA’‡ÏçÉ'pæÌÑzœ››“Ãþ©O} ·ãzK¬\].× xâ‰'ºétZÞx—Ë%à”®ÉhµZ…ÅbA¥Rç­d´¬fº¨'À¸õد®w¿Ûö_qå¹a‰© ¸¥eÍ(¤ÁšÚï÷£Ñhˆì9¥Ë¨-@áj=ð½ÓïýXk¢—‘”ôZƒe*•êj5^~&›››bXË ¬Ÿ³CÖò<Ô úš½ÉÀH‡«z½ŽJ¥"¯[– ‹^¯GŽÁáÇqìØ1:t÷Üs&&&þçÿüŸè¯·8p=øàƒÏ<óL7NcggGúÕ$ñ róIç8n$‘”™%7¦š/Îz”È7G޹‰t¿ø»aÎÆ›Y?wÎ ðk¹\Nf)˜1…Ãat»]¤Ói™XÇåË—qúôia.òv$ÈEÜÅøžQ›€,Mm zPöòZp‚N§ÓM§Ó=#¿ü `—.]걫×ëp8‚ÖsR•ÌQh·ÛÝcWÎ÷‡æ³/^aeŽ! ÉÜÊÜÜœØÄÑçvIï¿güÀüÀÀ·¾õ­îÆÆ†Ôü%ÈçLªl­VÃêê*öööpÇwÈ÷¶··a6›177‡o}ë[¸ûî»åP0íe À,LOãñ°k­HŽåê!©WË`ZÛÛÛÝx<.íQ–l|,Î?ܸqCZvTŸ•–2g"èŠÍÁ­«W¯Ân·ãe¯Føý~éHù|>D£QX­VƒAŒQÚý–Édšîçï¡@§OŸàÍqíÚ5™1§X õ 9J‘HŽÌòF –µ ôÜvjµZ( 2ìâr¹d³’ôÄÀÄtØÈbÓ┯6ër¹P.—¥nµZÑÆ«º{À^v(’ Z­&ÃG”6géL&Å(u``@¢¡Ç×´½½ ¯×+7¨¦r{<”J%¹ Žiå&Þ´º¬8hÅãñn³ÙÄ¥K—ÄEÊ(åÕíva·Û±µµ…/ùË…BA½^ÇØØr¹ÆÇDZ¶¶†S§Naww÷Üs~ú§ZÐ}2 - <Ï’Ëå:Ò?¦ß§@õÌàüùóÝl6+hm¡P@¹\G¢p8ŒÙÙY¸\.‘è"MT÷ÿ)`J.¥ÊôðKÊq±=ÉÇ!·%ƒn!Û~õÛÛí¶Èn Âçóx‰úêóùDgÁØ¢ÛÝÝE>Ÿ—Ò@&Qt…-PZ|“üäv»¥¯mµZ‘Íf%àEGoíæÃ4ƒÃáxEI`ì hRÑêêj—3 ŸŸOEf_”£/•J°ÙlX^^ÆØØvvv044„‰‰ äóyáñÏÌ̈~áŸþéŸâرcýÔýí¸^¶Ú‘Ns•Ëe±h†ÂŠÎ´Lµ¹í¿õ$"KQ¤£jÖ×Z¾Kϲëºú à@Ñ$f4ÄC8ꪊ:ýB¡P€ßïpHM†D"F£!ìÀN§ƒÉÉIŒá…^À=÷܃‘fLH u$‰å õè@P©T°±±ÑevE>5ܯ]»ÖÍf³(‹¸™]ºtIÈOìt4 1„¡3Õ}÷Ý×ß#ë»6PÍCJ¤—5³ž 'b|„˜Vá%ˆ‡›A„™AD-AÍ À¤³ndfüº>Ÿ¯§õE.±X”¹wöÑC16›MLZ¨[ ƒ%Ÿƒ®å |>ŸT:/if.“¦’pÓh4$ [œº5G­ˆz½.*GÅáÇ&&&àŽ;îÀàà «QÊ•ËåDõ7—ËarrR¼$s¹R©~ê§~ªo§Œ€Ö¯¬‘)Igc=bʾº¾½94C«*Ö¸4,ajÌCßn·‘Ëå„xÒn·‘Ïç%xpÄ™‡Z§ú ^ôàÍNúªd°"»Q—˜!ÐUWOOêŒZ­†P($†~¿ÉdårY49· ÅòÜçóõi¨öC‘úF2øv¥xßÉøÄd2 <ûì³]¾G H›››2EÉ9»Ý«ÕŠÅÅE”Ëe´Z-Ü{ï½øÉŸüÉ~6p;‚h4úÈæææV*äÈårrƒSä’Š±¼É52ÍÉ!Í'H§» 9L£ÉMZvÝHæ €ÎŒä‡Ã!’ç V *:@™{œ-` £vçÚùzÙ aà+‹ÝnG4â Z…BAtø»M&¼^¯dáp…B@@0íôÃç877‡×Â,l·ÛO\¼xQ”€Ù™¨×ë8þ|{oo7nÜ@4…ÛíÆ™3gðó?ÿóøÒ—¾Ô?·S 0™L\ZZÚ®V«cétZ¤¤ˆ¸s‘7:;Ú£@ë²0¥´Z­žþ=Ó{¢ÜV«UvlÛDaÕ3  Z•†·¿Vjfö¢[ywˆD"H§Ó=ƒTÃÃÃ’¥R)™ª¤7…8)ÛM‚Ñ\.§Ó)$lŸÚív¡Çb1 …߃¦0_+½xddäÁÅÅÅ.yü^¯;;;˜ššB,ÃÕ«Wetwtt÷Ýw~îç~<ðb±ØÀÿñ#•J}$ÿeÿÞ&æçç£Ï=÷\—&':½æt¹\p8=­=Þ¤lÕ‘LìA›VÒ¤B} IYÕ·µnCòßò{œa w{ßœ`#ÈɘP(„J¥" Ìzñ¦N§Óh4Ò$ ˆÈ~¥R² Ù¬T*H&“"ev×]wavvNG¦ù^Q„2nóóóÈf³=·ÿ›Qyf•˜ÉdB8ÆÎÎ~ã7~>ú¨t="‘~îç~³³³=A¦nÃ@ðò‹/"Âb± ‹áÆ^²FK$ƒb#ÎÃÔn·á÷ûQ­V%Ö58-ƒ3 ’$$ÁHcFp’ejïé ÄTžŽÊdÈ1 àÁeC‹®òµd2”J%1zD"^åeK”];î¸C,×b±Nœ8ááa;v¬G-Úf³a}}ápXzXfq,—ô\fY¤'Ó ¶ÙlŠík],o4î‰DÐh4ðc?öcÈår°Ùl˜žž~Eè¯Û8ŒßJ§ÓSì/Ûl6„Ãa±C§çðð°fô­Í9uv´óNáø³ìÐèDgšPÄÏßËô]Ï=ø|>©éuû’¸ƒ¶%ÓS•J»»»p¹\˜ŽŽŽ"ŸÏË­Ê×ÏL$‘HÈóÛÜÜ”ò¦T*¡Z­"›ÍÂn·ËÏ2{àóe`ÑYV÷!E›-G¯×ûº>O¶d)K¼¤KÁRˆÖó|ŽýÕÜxÓ›››]ÞrÃÃðX,b@˜†D¤ÙJãfæ¡äAÕ€žQ³‚$#Ý»×h?€Ñ#€Ã]’8eG&‹ÅÒ#Å­ÁC"-šÁàCé0`QÔ•ïE©TÂÖÖœN'†††°ºº*„,–)SSS2{ÀÃÎ!,fB6›M²âZâüõŒ³Änƒ(Õ™l6iÁýl z×ÄÄÄÀåË—»ºN&k~¦¯DÆu¦ é°LÉYßs]ýhmCЧè À’A(4±ˆ€úög€ ð žnMÒ³!àâÅ‹"¹åñxàp8$8Y,¾á{BÕ¢›7oâðáÀx<.NÐd+R΋C\Ì,È_Ð_'VCu¡7á llltuÆÄ®L @4…æôW?ô¬cÇŽ <õÔS]nDÖ’¼ÁI2¢q&ÛSDµǢQgÐÈ 8¨…ÇËCÀÌìÂòi<}—Ë%_'VÀà¥éËZC®P¬ã%J¥R‘àÖn·Q.—Q«ÕÏçÑétd\»Õj!—Ë!‰ •J‰Öž÷f·ãÍÚÓƒKlCj–ãë]”Ós f³¹?ñׯm‘Ûjµ°µµ…`0(òe¬ÙiHÁIBÞмquo_t¼é9 £q 2ò¥Ô0h 3AH£6>Ë ¡kÐrjf³Y°rL&“èZ­†\.‡Q >tèÆÆÆðÍo~Sº´ðr¹\RZ0«bé288(_Zñ‡"&‘Hä ܱ±±D"Ñ%H;99Ùý@ðÚW$A¡Pè±9×dJÖÛÓ 7z¶Þè:Do=­q@>o{jê¥;Z=xI¥˜Ï[w4~ÁŸ×åŸ?-ä­V« ìäV°î¯×ëH§ÓB§v:CµZ•Üår‰¾q™¿›AAK…i€ƒÞh0è¥~ xCk~~~àé§Ÿîîïïczz›››=™7¯¦í²u-Ï–¡ÞàlÃé[ž¶ZìL0³Ð*7ü/ÇaBË™â·Z-ßFFFÄê\= a6›111x<ŽR©$¥å²IB>Ÿ—ȼ¼¼Œb±‹Å‚H$"¢œ,( ΠÈ[Z¿§š›Á÷äÍ‚þúþ_ÿ¬‘<“Étoܸ!üûb±(í'’Qè¥888(8‚V?ÖiüA5¾‘=G&™<è,3vvvzTnù˜ßÎç®Ñh ›Í RÏZÙf³Áï÷#›ÍŠ¡P9Öðem6›âøÔh4055…x<ŽC‡Ál6ãÅ_D(„Þáp Ããñ`ooO8 VÄW¢Ñ¨ð šÍ¦´ é¬|äÈ‘þÞÏþùV XZZêf³YAË[­–ÜÔÆHßemÌ[RÓyuÿßXãköœî¥“Cæ!x½^yÜo‡o°H´||påÊQÌ¥åé€ÐF ZF_³Ûíp»Ý¢Zìñx°¼¼ÜãdµZáõz1::*¿xi¢T*‰LðÒ@“&Ui%à·“‘g}Ÿ–—/_îu®T*n±`]Ï[U§¶:u ¬AbÒƒ‰è‹ àö¬Ñ´±+m¾m6›\<|œ’ÓõºqâPn2 åÍ›L&E¹—_×"$ä%èlE?ž–:×ÁŒ¯ãÃÑhÏ?ÿXTÒä%¹rVÀXF•÷ööP¯×Q­VQ¯×eŽ‚³ 4$ÑíAÖýd*²DЬÛíö(Þ' õ×wZ¦ïõ'Î;×%G€ˆ8oøf³Ù3&L!ý°ÆÖéx»ÝF½^—C¯]¬V«Ô×ü¯±æÖB'º#@ €ÁGk*òÐ’ÌÇ`Ùb·Ûa±XdQk P8Ĩ¿H¶ 3!²µd?ô×Û"#àZ^^îÖj5ɤÐG½^—AöÓy{ Ó>@@nQàÿ—Aç¿Ñâ£FµcÎ? PxC3XÙl6 áaf‡ƒ~‚Z×P·4IÒ–ïY±Z­Ò¡`)¤U›‰•p† úëm^¾É»Ï?ÿü+<ûX*Ði‡z¤üÚív™hÔ‚#Ä8¨³»» ÇÓ3ÀdÄŒÁÃ8 Dõ¡ñññöa>Ÿ+xR™y{sQ ^¯£Ýn ˆ^ ,#´§ƒÆ3¨ …^·iõÁ÷ÕÊd2Ý«W¯öl)Öëuär99ØÍfS予ƒÁÁR¦à÷ŠÅ¢¤óš ‰Ke \^¯6› ±X¬GÔdccCF­Rêºôèt:‘.ñ]Ž0xè`077×ýõöpéÒ¥îúú:FFFDûi=oÜz½ŽJ¥"³ú<,‰DBúïLÏõ ¯)ÀFÛp¦øúàÿëufZ-‰Ä'#QIƒ‘Zcá@PGé24¤íã@?ô×íêõúÿºzõê¿Êd2ÒR´X,ðz½¨V«=~‰FT7,mÇjµš° yÀÍf³Lø1PX,–¬AcšÐ”Ëå¤;¡y Úw¡ç8 µhT]2–:0q† ?IØ_·] Ð"Ëjùi€x’öKæ39ÍIh[Æ€¡Ë ‚væ˜UhoÅ龜 ±MèÖ¢1ËГ—T>²Ûí‡Ãýá¡þ꽞~úéîÎÎÎ+fý5^ oi=άÓp– ÌŒêA¶éP.—_q‹S{cé¡§ ù¼ŒÁ„XLLLô@õÁA b¡PÀÚÚšxh]@¶ä²Ùlà+ACjon–$d‹FÔ_±Ð-Ac9 …Èàágö133ÓýÕ¯eÅãñn&“A>Ÿå^âTüeûM[¬s¼—}þÑÑQ™T¤²±‘ixPÍnTOÒ-H—ÆŸåÏD’‰Q±X¬_ôW?¼‘µ¹¹Ù¥tx¹\Z/ëmÍ*ä4›Ír(™ hz0~z(I§ùzèG“…t† KÝJd)Ãà1::Ê ÐýÕoåZ\\ì’äÉ=¦áœC0¶öôÁîyó Fª¼ñµ ¹m ì?Œ4Öàt:ÿ¿vî@¢( ÷?¡â¬ÆL¢µ!æ¿#XŒ"»“j­  øZDlÕ’÷ÞÂÁw |÷߯÷ôöWXøÀ‘o.jXkÒ¥”ÔZã³ÁÉÆÛ;tv÷®Â·BU„žhÂQ] ÿ€ ø‘µÖVÌ9ÍGúá˜sæyàXsL†N-¶N{IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/arrow-right.png0000644000175000017500000001751012412506713021433 0ustar sergiosergio‰PNG  IHDR<<:üÙrÓiCCPICC Profilex­XgTͶ­î‰ 3䇌äœsŽ’£ aˆ’“‰‚( "Q%ª "**     ‚Š€ ¢Hø¿µî½?ÞýóÖ«µº{wÕ™š®Þg¦ö>°Jx…‡Ãt„„FGÚë‘]\ɸI@ Ѐ p¢%*\×ÚÚü×¶6 ýÁÉý¹þkØÿ>@ïãE²F†½}¢(!nB°%<2ÁŸ,Ž``¦Hä̵ýÿÁ2ûØûlð7ÆÞV‰qOôòŠô€àƒô“Rü‘y`B}C +A°%À g™@b$BBÂÌŠF°¨÷ÌãÿØËËû_szyùÿ ÿ³ä“ÈF…{Åÿ½ùÿ<…Ç ïëoÛëDßP;äÊ€\@„`äˆd`Ü퇬ý°ðøÈ@ÿ€h².Â’¯Ù4”"%A–“‘•ûœïǰbû—Kˆeðß}”%TùÀõý»/YX½¼½ÿó:Ò‘yôŸùö_#À E²‰ð $Pê@3`ì 8 ( „ O AÈ9à(A9¨5à&¸î‡à)è}`¼“`Ì‚E° ÖÀA8ˆ1Bì/$‰Cr ¤B-äyBþP(%BéP”]„®BµÐmè>ôz½‚Þ@3Ðô Ú„Q0f‚¹aaXVuasØv‡ýá8΀ÏÂ%p|nŸÂ}ðkx^„WQEbAñ¡$Q*(}”Ê凊D%£²QŨ Ô-Tª5‚šF-¡þ ±hF4-‰VG› Ðt:}}]ƒnAw¡GÐ3èeô.†„áˆcÔ0¦gŒ?&“‰)ÆTaš1Ï0¯1³˜5,Ë‚Á*cM°.Ø#ØcØÓØKØìì+ì'ì*‡cljã4qV8/\4.ww÷7Œ›Åmà©ñ¼x9¼ÞŠ?Ž/Æ×áÛñÃø9ü••••U4)4¥4-4Ã4ßi©h…huiÓ&ÐÓÞ¥¤]¢£¢¦Ó§ó¢K¦+¥»O7N·JÏH/KoEBš¾Žþ9ý<ŽA˜ÁÁ‡!ƒ¡’¡“á#ŠQ€QŸ‘˜Îxñã,–I„É”éSÓM¦¦efffGæ8æRæGÌÓ,(aS–`–\–;,c,›¬Ü¬º¬¾¬Y¬·X‡Y×Ù8ÙtØ|Ù²ÙØ^³m²“Ù ÙƒØóØï±¿ã@sˆqØpÄr\æxƱÄÉÄ©ÎIáÌæ¼Ãù– æã²å:ÆUÉÕϵÊÍÃmÌÎ}»“{‰‡…G‡çO!O;Ï/#¯o o!ïcÞ¯df².9˜\Bî"/óqñ™ðÅð]åàÛâáwà?ÎßÀÿN€  "à'P(Ð!°,È+h)˜(X/øVˆJHE(@è¼Pк°ˆ°“ðIá{Âó"l"¦" "õ"S¢$QmÑÑ ÑÑØ*‚\:0$‹)Šˆ•Š ŠÃâJââ—Ä_I`$T%B%*$Æ%‰’º’G%ë%g¤X¤,¤ŽKÝ“ú.-(í*'Ý#½+£(,sMfR–AÖLö¸l›ì/919Š\©Ü¨E¾Uþ§‚¸‚¯Âe… EFEKÅ“ŠŠ;JÊJ‘J·””•=•Ë”ÇU˜T¬UN«ôªbTõTSTªþQSR‹V»£öC]R=H½N}^CDÃWãšÆ'M~M/Í«šÓZd-O­+ZÓÚ|Ú^ÚÚut|tªtætèѽ¡û]OF/R¯Yo]_M?Iÿ‰ÊÀØ Û`ÀÁÐÁð¢á{#~#£z£ecEãcÆOL0&æ&y&ã¦Ü¦ÓZÓe3e³$³.s¢¹ùEób‘m–°¥™eåÔA¡ƒ¡ïY+S««wÖ"ÖÖl°6Ö6¥6_lemm{ìí<ìêìÖìõìsí'Db:iÝk× œò¦¥“œû\8\]Z]q®Ž®U®«‡ šuStËtsqs~˜ãpðáG´^w=1žNžužÛ^V^^«Þ¦ÞeÞË}ÊyÊ¢ŽO¡Ï‚¯¦o¾ïœŸ¦_¾ß¼¿¦ÿB€v@qÀR ~àÅÀŸGLŽ”Y² ªÚ v nÁ‡x†Üe í ã ‹ {.ž>¡Q±iYE¹GµF3!›kŒh̉˜™£ZGKnÄ:ÆÞ£ ë‹ÏŠŸK0J¸~ }Œr¬#‘/1-q&I7éj2”ìÜ‘"’‘2›jœZ“FH J{y\æxþñßéNémÜ©ŸNŸ¨Ï¤ÉŒÌ?©~²üúTà©,ù¬ Y»Ù>Ù/rdrŠs¶OSN¿8#{¦äÌÞY¿³¹J¹—ÏaÏ…žËÓΫɧÏOÈÿT`YÐRH.Ì.ü]äQô¼X¡¸ü<á|Ìùé‹’Ö ‚Î]ؾpñu©^iCWYVÙú%ŸK×u.ß*ç.Ï)ß¼xeâªñÕ– áŠâJlåÑÊ/ׯõ\W¹^[ÅQ•SµSZ=]c[ÓU«\[[ÇU—[×ÇÔ/Üp»1tÓàfë-É[WXrAcLã×Ûž·Çî˜ß鸫r÷V“PSY3csv Ôß²|/àÞt«Kë«ûf÷;ÚÔÛšH=¨~È÷°ôó£ÜvB{FûÞã„Ç«OŸ,=õú©Ã£c²Ó¹s´Ë¦kà™ù³Þn£îÎݞǽš½Ÿ«=¿ÿBåŽ>¥¾–~Åþæ—Š/›”Z•[‡T‡Ú^i¼jÖ~:b0Ò=j:Ú÷úàëWccãnãÓ>óo‚ßü|{ôíÖdêf*ûÝ»â÷\ï+>øÐ0­4ýhÆ`¦ÿ£ÝÇÉO”O‹Ÿ£>oÏf|!})žã«—›¸`´0ôõÐ×ÙÅðÅ­¥Ìoôßʾ‹~oú¡ó£ÙyyögäϽ_§WØWª+üîXµ^}¿²¶µž½Á¾QóGåOÏ¦ÓæÜVì6n»dçÀNÛ®ùîÔ^ÈÞ^¸W¤×_-€BΰŸ¿ª ¹À8„h1š4ÙßPˆ¤ÿ*v "@+²§;A 0 |ʼnz€ŽÀ¨aiqÔx.*sB6õéÍgºteÆ%æÖ8vCNW'O™“¯A@Z°Z˜(â!Zzà•8ZB^ò°Ô9é.™M9)yo…ÅgJk*ªnjYê-óZ,Úº:ÁºEzíú †ŒFZÆ“3¦Ífæs³–s¬æ¬¿Ú,Û®Úm:Gœ3“ ›+ß!a7qw©ÃR’ž’^bÞB^v_z?‚?ð_ X\<2ô!ømÈxèë°Ñðሱȩ¨™è…˜ÕX8Ž6žœ Ì4Ñ;)!¹ ¥1µ3íÅñÁôÑŒ·'f2çNþ8µžµ›ƒ9M{†õ,9WüœRž^¾Es¡OQTqêù³%eê/Þ/}Y6}éO9óù«ö1•e׺¯ÿªæ¯±©=^×T¿p“÷–}CVã“ÛëwśܛSZŠî5´ößÿÔ¶óõ‘L»Ùc¿'éOË;îwŽu­t3ôH÷Z=}‘ÝWÝÿìå—AüÐ+aÇ‘Ñã¯óÇÊÇoL4¿yð¶c²gª÷]ßû—†¦GfÞ|œù´ðùãlÛ—¬9‡yžù/ õ_ƒÅ–Ê¿Ù~Goüáüco¹ü§öÏ©_±+ô+5¿µ­®n¯å®ó­7nho üqÿ³´¿…Û:¿-²Ýºc¾3½³‡ßKßÛCøG#zVØ"*°b‚< {0œ‡bBÕ¡mm4Å ã×rÔ§ˆ»4‰t4ôƒ˜É,ØJ9 8¸Óx9‰oÉ?¡ áó"¢ušÄ:ÄG%楀4£Œ¨¬žœƒ|„ÂÅJ¥GÊoUVԈꂪšVZþÚ):º×õÚô_Lµ_5É6 7s27°²d=ˆ:øÃjҺצٶҮÐ>Ã!ÆÑ×ÉÑÙÄEÝUꟳ;µûÞáYgž×½2¼½)Z>œ>¾ã~Íþ…G]h “‚ÿ„| ëïŒhl‹ºÝsûè•Øœ¸¸øÀ—c‰šIòÉ¢)\©Li„ãðñ­ô•Œ¥3'N¾:Õ“Õž}7§ætÅ™ú³s_œ›Ê[.@rÉ[œ*ɹpûâÛ2ì%¥ËAåׯ|¬¨ ¼Öt}§Ú°&¢öT]eý“7Wè%n›ß ¾{®©¥yê¦Uö¾g۹ݷÛe¬¸òt¼c·‹ç™v·gOFoíó?û¹_ „^†F”GÃ^׌}žxãû¶zrrêç»ÍÐ4v†ð‘æé3q–ðýegnu~qáý×áÅÎ¥–oUßK~d-Çý4ÿÿjY úÍ÷{bõÌšÞÚ’~¸þ ofoénmlßÞ Ü%ïŽï…ýåF+’& œ/ ,t*GÔy¼€ŠG³¡_b ±Q¸|"Ua’(NÊ£Y§  ŸdÔgªd^eUg c/â¨æ¬àÊåŽâ±ãU"3’ð òß8'-d'¬ Â,²":~ U¬HhœÕTלÓ*ÐÖÖžÕ9­+¯ûF/E_P¿× ÔɰÍÈË˜ÊøŽ‰»)É´Û,ÓÜ‚d1`yæ …ÞªÓ:ÙFÉæ§m½¯=¢JœXœ&œ/¹øºJºþ9Ôå–ínà¾}¸Å#ÂSÂó«W­wE”²àSïâ'í÷Ë¿9 !P-pûH{Pr°vðNÈÃЄ0•°õðÖˆc‘:Q¸¨Áè’Ÿ£ò±èر¸úø´çcr‰¤Ä…¤žäë)™©”4ƒãBéØô¥ŒñO3N^9•Ÿ••‘“v:íLÚٌܓçróòò/\)¬,ª*®;·dôÂïRæ2¥K®—Sʯ]鹺RÉuÍèzlUMõx-©Î°>ùFÛÍ? êI·ßÅ7Ù7W¶¬µZßox@ÿ0áÑÂc·'£¶#Ϻßõz=_ê‹~ NѾ*}ß–¾›Ñü¥Õ½mæQÆõNúnÔsÖ~ÃÁ“ßÇÌÞŒ¼óœ¡þül>sÉeY`åûú­ ¿ÿ,H…Áø#쟷À3ðü€Ð$pï’¡¨j‡F¡¯0³Á²ˆÏ÷…ÓàKð#ø¼‹xyTêjFk¢ãoþ#‰Â4!Þ[›†íÁÑã\q×p¿ðºøsø*Eªlª‚:¡˜ð‹Úšº‘ÈDŒ#¾'#œËÓÜ£U§í¢³¢{CïO¿ÁÅÈÃØÄdÉ4ÏœÎÂÇò”Õ‡Š­Ý‰æhàtç"r=å>ÅcÃËÃûƒÜÅWÆTÀVPNˆ^hYxD¤E´ø@‚˜›¸¦Ä®ä{©é«Ó)r‰òÇbã”b•UUÓÕrÔó4.kÖhµjwëLé®é“ Ä MB‹LÚL‡ÌÞ›¯Xb²[IYëÛ8ÛFÚ°/q¸éøÈiÀù½Ë7×M7Œ;ía6²§°—¸·EÉGÝ×ô/Ë+G$ƒÂ‚C–ÃÃ"FîEëÆ¤í£Ž·LÈ=6˜Ä˜l’›:rœ5Ý5£ìÄÇ“ê§*²Ñ9§ÇÏjçÖä1ä§,Ùw”È\(¼¸[|i¤\ãʵ beÔµ7UZÕWk©ê2oˆÞüØPq;ð®bÓ^ËDks[Áäö'ž‡º<º)½‘/’ú‹j†º‡ç_7OäO†½·˜Qþ,0GøŠZÚþñûׯêïÝm†¿üÖH%)4‚—`‚!.H ÙAü¡¨ºõC_`æ…µÊN*| ©ä¬¢øQ¨³¨~4-Ú]Šþ‚‘äa†°‚Øì0N —…ûŠ?ˆ¿CÅNu‚ê'B¥6¡n'ªïdIÍ44Û´utžôlô“ ŒáL&ÌB,xä·<Ã6Âþ‚£‹ó W+wÏIÞh²?Ÿ¿—€¿`ŒPºp‰ÈmÑÞ³â@‚SRAÊJ:@&K¶Gž¨`£xAiZEL5V­[ƒU3Xë™nºÞ¼£a±®Éc3}ónKÓƒ/¬-lì¬ìûÍœº]ô]Ÿºi¸ß÷PölñV <ôÕôë ° |dÜjÖ¡Ù-SK—ÿë˜wâ»dÛ”¾4ËãCŽ'Þþ¸Š¬»©rëBßÛÎwš›¨š=Zš[ñ÷Ú*|{¤Úžú¸ó)¡Ã²3¿ëu7KGïÕçŸúDû#_6 왽*þ4*õ:zìþôFïí‰Éîwð{å~Óù3÷_²;ËþEzNoÞ|Áæ«ÍâÁ%³oªß…~¬.ülü•±â„(ˆ¯«kQë ëß6ªþ8mb7›¶\¶v·+w wæ÷öùò“—Ûß=DÔCÊï÷öV„‘úe>;y{{[{{;•ˆÙ˜àIð?õÞý`,R/;´žØw¥î_ÿ³ý•)cžT 0IDAThí›KŒGÇÿÕ¯éyÏξ_¶‰°q‚‘Q0ƒãÞ E² qBnpŽ"Á Éœq‚$8ÖŽL‚E‘0‰ƒ1vbŒ±—]{ö5¯™ž~Nó¯^ob,{¼uÖûI5ÕÝÛ]ýýêû¾ª¯ªµ" Cò"Nß—ð‹­K_¼¸ç¯Ù¢Ú2?œRG#{c |¡ìˆ–zq}i^÷–gŽ–øR©TJm:¶ÀÀ£h,b±4‡fkz´êÎûÝ̯la`¢UÓ¨-:˜³§EÉzûÐBýƱ¼ôݾÍ@ÇØÂ Ùº‚rYàZõ_ð•jåË­ÒŸ"ð†§©ËòE½*PªÌ‰TUy¬]«>û'wlÔÊñn»ð–UTÊ-T½kЊ¹¤Hޱu€%‰ë 8>|+DÓª’}Z2‹±GÎõt8öøsbp=Ðñµ°¤.-‹Ûg»°ýL3…Á‘}(æôž±,õðä¤P× _`ǰۀïWO)ÝD>³‹VÞ‰\6½7°‚gÏ.ãC|`ÌÐç¾*>×J 7¥(¦FÑÛ÷Z¹?a&•£nOý¦0×Ífî.û#ö§3دrÆkÀ2K·7ée<¼ùsÛóÑn»v§Syß­÷²ÍHd-¯? ¶Ø‹”ƒD1D&¥CWuhÂ@6ÑžÜ.ôŽ c~faG³aMÌLã¯|ê­¨.?]Kç{>¯´¿/mø„öRù­BævêjäÐÝÞ‹ÛZŒ¾kðg•Mºf$òYÙˆ<—EžË›dC²Îðè³è“Vî1-ÂÐ è¨ LÝ@>;„Laz‡f”fÕù´eÇ>öñï¿¿Vùô]å6õþ÷¾ê¥‘>Tkûà-Á(:Èf€ž=, TP£r•¦‘žRW¹•›MI`ù5G2tdÍÐç ï±–…ƒ1ÚôÞ&kù†ì±›–e£ã\.ôó庖…Å.×TÂL •ëEq¨ˆê|¥Ï±­cí¶v†Ož’¯d¹£tF»À éJÒ¼e$;†óìqÈòRšðf "Iº[‚× /5UoZ\vA½½ àËxð|n`¡íúL™§Üª,„µø”ì•Úõñ=Ãi0vMtDj"@[‡eÔ §;Hæè0`5¬vÛŸøÂ÷Ä…W~^¿#-/vNФ2™±²p«9Ô8ñ›vz¶-ëAãr\M†Pèb ÝMèY.I(Ja4S¬K“ŠŽËŠ46„×`r#’ñ!hUAPÕH´udì„«Á÷y®ø´° %êœkÑý˜ÇÂ] D™tMø4š´(4j.½Vް««õ­¯$l$²&pTä1a¹K÷¦OËÃkñ=4•ÇÀõùîÌÓÉ~Ü€‡LrWúÿ[¿dx–iö4AmÔðóË@­ƒsvSçŽóö.ÒØ[˜‡;ÿ7¸×¨$G{…­3#8ê ½VʪEWë•«ïÿÞ ½z,ÛÇÁÍ^M÷”aÀ,cdjï€Åø^¨VP^zùôU„F™žFXöÏB…Öu°h)8‘ëàL5šÞííGÝ[—_c“ HÍó99ßAV•—õ*ün‹¬zëu +EvÉ{mñ Ã¸ Ó_ç òUB£ÝÊ Ö¸–UŽÂ¢NØ o±†Žåâ µˆ“ÕŸ‡÷ü$Ó8üå›ïRYþï"&?“IJ8y:E×N¡ekh;^4ŸKëÎ3Ò8•M¦‚6.¬EIñ”Y©ƒ\ŽrñƒP…×QàÐ3Z ù*ÇÇÊ2œv€Wƒ^ òê½%¾ÀcTž€QŒóGaÂ!8/ûôö&Ñ–8~.ÛxG$0…^\½7êÊñ‰¥vrŽã<¦+§ÁO•«Ë¨[NÒº¯‡/H7X›Ä˜G3!­ìòÐe»2 Wj¹¿÷––Ɖð'!ç˵K¼™§G+¦£FÂ¥…WÒ‚º…Ǭ©žœ];êÊñN1O”* ) LîPop‹ËÁëZ//¼6·°´̶”¦VajÉI—#471¯¸*þøø0é H¼-,ƒVaÍQ1ãÈ)Éâ:úT>Óo~'dZ¶~éšx¬¿¹ûü„Nõ¸OÑ%;7mÏ'8 ]ù¶ÜðÚ˜ÄÛ¡OÐúŠunÏ¢ÌAkj¼€¿pKa5 ]7uŒ-ÌTË×¹wUÅ@¡ÕÉd êâäž ¹\ظÄÖÂcã„ÒP(t¸ÿœœMª˜z4‡óG]y2¶g˜zy}¦[ìUK§Žr‘kÇÍIlÇÆf‘hrÿ9uÉÐ÷8|ðkW6‡ºòtlÁ\ztt¨¡i…—}óÐkÏãyΛ—ØïbOxýzálÅþÙG8·yÔ•b;haד¾¡‹3i-yÏÏ'ëé ±ýOëé®à½ñuéÔ™ÛÀ¨ccÓì¶…ccФÈpp´¾†BØIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/statistics.png0000644000175000017500000014121312412506713021356 0ustar sergiosergio‰PNG  IHDR\r¨f /iCCPICC ProfileHÇ–wTTׇϽwz¡Í0Òz“.0€ô. QfÊà Mlˆ¨@DE €£¡H¬ˆb!(¨`HPb0Ѝ¨dFÖJ|yyïåå÷ǽßÚgïs÷Ù{Ÿµ.$O./– ™'àz8ÓW…Gбýx€¦0Y驾AîÁ@$/7zºÈ ü‹Þ Hü¾eèéO§ƒÿOÒ¬T¾È_ÄælN:KÄù"NʤŠí3"¦Æ$ŠF‰™/JPÄrbŽ[䥟}ÙQÌìd[ÄâœSÙÉl1÷ˆx{†#bÄGÄ\N¦ˆo‹X3I˜Ìñ[ql2‡™Š$¶ 8¬x›ˆ˜Ätñrp¤¸/8æ p²âC¹¤¤fó¹qñº.KnjmÍ {r2“8¡?“•Èä³é.)É©L^6‹gþ,qmé¢"[šZ[Zš™~Q¨ÿºø7%îí"½ øÜ3ˆÖ÷‡í¯üRê`ÌŠj³ë[Ì~:¶ wÿ›æ!$E}k¿ñÅyhây‰RmŒ333¸–‘¸ ¿ë:ü }ñ=#ñv¿—‡îʉe “tqÝX)I)B>==•ÉâÐ ÿ<Äÿ8ð¯óXȉåð9€¢yPÜõßûæƒâ›¦:±8÷Ÿýû®p‰ø‘ÎûçLg ù‹kâk Ѐ$È t!0VÀ87°ø`ֈɀ2A.Ø @Øö‚JPêA#h'@8 .€Ëà:¸ î€`Œƒç`¼óa!2Dä!UH 2€Ì d¹A>P ECqB¹Ð¨*…*¡Z¨ú:]€®BÐ=hš‚~…ÞÃL‚©°2¬ Ã Ø ö†ƒá5pœçÀùðN¸®ƒÁíðø:|ŸÃ³@ˆ QC â‚ø!H,ÂG6 …H9R‡´ ]H/r A¦‘w( Š‚¢£ Q¶(OTŠ…JCm@£*QGQí¨Ô-Ô(jõ MF+¡ Ð6h/ô*t:]€.G7 ÛЗÐwÐãè7 ††ÑÁXa<1á˜Ì:L1æ¦s3€ÃÌb±Xy¬Öë‡ebØì~ì1ì9ì vûGÄ©âÌp‡+Ç5áÎâq¸y¼^ oƒ÷óñÙø|=¾ ?ŽŸ'Htv„`Ba3¡‚ÐB¸DxHxE$Õ‰ÖÄ"—¸‰XAàPð4Ð407°7ˆÔô&Ø9¸$øAˆnˆ0¤;T242´1t.Ì5¬4ld•ñªõ«®‡+„sÃ;#°¡ ³«ÝVï]=iY9´FgMÖš«kÖ&­=%ÅŒ:Ž‹nŠþÀôcÖ1gc¼bªcfX.¬}¬çlGv{ŠcÇ)åLÄÚÅ–ÆNÆÙÅ퉛Šwˆ/Ÿæºp+¹/<jæý$.$…%µ&ã’£“Oñdx‰¼ž•”¬”TƒÔ‚Ô‘4›´½i3|o~C:”¾&½S@ýLõ u…[…£öUo3C3OfIgñ²ú²õ³wdOä¸ç|½µŽµ®;W-wsîèz§õµ  1º7jlÌß8¾ÉcÓÑ͉̈́›È3É+Í{½%lKW¾rþ¦ü±­[› $ øÃÛl·ÕlGmçnïßa¾cÿŽO…ìÂkE&EåEŠYÅ×¾2ýªâ«…±;ûK,KîÂìâíÚí°ûh©tiNéØß=íeô²Â²×{£ö^-_V^³°O¸o¤Â§¢s¿æþ]û?TÆWÞ©r®j­VªÞQ=w€}`ð ãÁ–嚢š÷‡¸‡îÖzÔ¶×iוÆÎ8ü´>´¾÷kÆ× E ðŽŒ <ÚÓhÕØØ¤ÔTÒ 7 ›§ŽE»ùë7-†-µ­´Ö¢ãà¸ðø³o£¿:á}¢û$ãdËwZßU·QÚ Û¡öìö™ŽøŽ‘ÎðÎS+NuwÙvµ}oôý‘Ój§«ÎÈž)9K8›vá\ιÙó©ç§/Ä]ëŽê~pqÕÅÛ==ý—¼/]¹ì~ùb¯Sï¹+vWN_µ¹zêãZÇuËëí}}m?XüÐÖoÙß~ÃêFçMë›]ËÎ: ^¸åzëòm¯Û×לּ302tw8rxä.ûî佤{/ïgÜŸ°é!úaá#©Gå•×ý¨÷cëˆåÈ™Q×Ѿ'AOŒ±Æžÿ”þÓ‡ñü§ä§åª“f“§§Ü§n>[ýlüyêóù邟¥®~¡ûâ»_é›Y53þ’ÿrá×âWò¯Ž¼^öº{Ööñ›ä7ós…oåß}Çx×û>ìýÄ|æ쇊z»>yz¸¼°ð÷„óû7)bKGDÿÿÿ ½§“ pHYs%%IR$ðtIMEÞ βÚv IDATxÚì½ieçyß÷;û¹ûÖû6= f,$H ÄE Mjs,YNÅ.ûS˜Ä–“*ÅŠ>I®$.—;q*ò»ÊVYrXŠhE‰$"."‚³³afz¦gz¿ÝwßÎ~N>œ{nßîé€ÀÌmºÿª©™¹ë{ßåyŸçÿl0ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄC 1ÄCì#„Z­¤ÓéÞžç geˆ!>‚àÞ+ïé3EQD‚ À4MdAß÷©×êx¾‡(ŠÃÙbˆ}>ø²,÷ÎbA€ëºAðžÎhô™LEQ‚ •JY–Égó{Jž!†b0‡_$IÂu]êõ:¾ï£ë:ñxY–{‚ º¼ßµº/†A¥R¡P( Šb("©’Íf‡+0Ä‹›\¾|Ãè ª‚1=ơǘššBQ”÷ô¹‰DÇv°L I–#©#IÒpÖ‡boþHµ/‹üñ}•#GŽpü©'QdÏ÷)—˼úê«LNMqòÄ ²ÙlOcøQ ÉÝï†+0Äûß÷Q±,“ï|÷{;õÇOAü @Qd8À‹/¾ˆk;|÷»ß¥Ñhôø»÷bf¡x¯ŒâC ñþ¾çm“îÍf“?ûæ+×–MJ”WX[ºC©R£Ñ2¨TªH’Ä'_ü$SSS|ùË_Æ4MDQüÑy»îËåá2 1Äþ :ø¶íðÆù‹\¸p‘7Þxƒ綸ñÊy\Û HQR¦È{‰Éù£TÊe.]ºÄùóç9þ<óóó¼ôÒKH’ôžÌ¡¿oˆ!öžëÑj5)‹üáW~Ÿ¿xù_q8Yæï|v’?}ŒåÍ6wV684fqDý[¯þï|ãOÿ„÷;¿Ë‹/¾Àßû{¿J»Ý¦^¯÷TûC `ˆ!¬ö‹¢H¥Zá¾ò¾sî g²[üÕÏ=I:ÂutßçãÏÈ8Æ4MÇâÆê$_å«üßßü*?sVæßþÛÇSO=‰išhšF*•zÏã €!†Ø”Ëe®ß¸E2›§!‹Ž–( 86Ý"“ìpiy…ÿøò÷ùOßÜà×þú)þŸÐa䣿Éñ|†òÖ&.\à¹çžë¹#“"2C`ˆ¿”‚àGfÆ÷úŒ½þ}ÿ7¼»ÏŒæíÛ‹Ç{ÑsËËËüçWþ?~æg>Àc‡ñÚ›ùã7Ihq~ÿŸÿΛ!&Y˜í:í¶‰m¶ä$±xEQpY–9tèãã㨪J£Ñ Z­òÊ+¯L&9}ú4ãããÛP ñ¡ºùK[EnÝ^Ķ …‚ 2;;G2Çó|$I„ Àóý^ô«ëºÈòöQpl‹kW¯ñÄ“OâX&7ïrâø1è °mUU{‡êÖÍ›ÄSi&'Æ·MáÞñ8ŽÍ gžbr| ×õÉæyþÌT* >1=ó‡ðZÍc¢J>’â #… B’ˆØ\ªª’ËåÈd2LMMaÛ6kkk¬¯¯óï|‡gŸ}–ùùùo(†ø (—J,.Þåø‰“Äbë›È²Œi´©Õ[?~”õµêÍççYºsËñÈòÄt™ÙYn\»ÂÕ+בT Ûh³¶U&¦©Ü½³Èìü!’17®“É29V`qq‘7~ðC~ògþÊJ@Øãö_]]å/^ƒÓ§O£i²,"Ë/|ä#¬oUøæ+_c6¡3™Q˳¨·:Wn±¥<Ç‘ @„ðóÏóh6›¤Óé^PÐÌÌ ³³³ŒŽŽòíoUU™šššC|x!ŠáŸ˜ä¬$S«ÕÙÜì ©*—ß¼ˆ¨j(’È×¾ú2z2C6“äü¹sÄâ žzê ^{õUdEesk‹ÀóÈæ2ll¬×uÊ›Eηۈø,’J¥°Lƒ›7Þfñ¶ÌÙ§Ÿá¹ `çåº-úoÞ[·oó?üëÃÿñßý=ŠÅM …<Ãàöò žËA’ÊLÖdq­ÌÂR™õªÏ·[|ü¯-ñË@H¥ð}¿GúI’DZ¿ã8AÀÜÜ•J…×_Ïþó¨ªÚFQôïÐ 0ć [››Ô-4Uayù.f =¦£È2‰d’ѱ1E!‹S(ð\‡"ù‘1œçÍ‹o253K2穳Ïðøã§PAI$S$ã1ŠÅ"®ëã{¦iÒj5)•ËïÊóL$øÕ¿òŽ>@µRcáÎ]~í_üs~÷•o2UHó~sƒ_øȷ߸EBêð¹ÇãüÃÿ1Ïgç_¥R)!Jï÷’ø"S¦Ÿðó}Ã08zô(¾ï³´´´§92Ô†øPq3³³8‹‹XŽÇ‹Ÿú $QD–eÖ×Vq¼€~ô£¬,ÝÅtþ¿wî2‡ÚWøŸ>m3þ‹/I(袃"xÂ<—^;ÏÂë?äÐñS¨šF«ÝÆ÷}b±®ëÞC^º®‹$ILOO³x{‘ùùydYÆïã?†`ˆ¢‹'8~â$¾ïï öúËÞ~ì(žcóÉO½Ä¹9Þ4è…Ø–·h¶:dÒJ[[Ä’IrÙ žçáyº®S«ÕH§Ó¸®C6›`}u™fÇ$™±¹|ù2™lŽ|6C«Ý¢X,’JçÈç2øžËúƲ¢1>6ŠišÄãqlÛ&™L¡iê}4AI¥R\¸ð^þêïñ7~åo“Lĸü?äcÂñ9%Nû(^ àxÐ6<w,Rߪ3îHx×.Òþ_þgø§ÿóGŽK§q]Ï÷ü Ç A€çy;2÷Š €!>$6@ø—ë84›Mñ[Å îž_cþàAßcym•‘Ñq’ñµJ…F«‰ªÅøÔ§^BQ‰8N›v§M­ÞàúµmÃ$‘LÒ¨7¹v¹†¬ª’ˆ,Ý¹ÃØø8ÍF•¥å5^øä‹ÌNOîæwë*X–͵«‹<õÔY~ú§šso¼À…oŸ¥:–"¨.c½ý¯K”AÿÝT~õW9ô7ÿ&ñ'Ïu÷¼ù]×Åq<Ï#N‡d2j(Ãtà!>\6@—dK¥XY[çæÂZ"ÁÄÄ8›ëÈŠ‚ïyÔêuÒ‰¦at5‚X׃  (J¯—ï94MÔXŒD<~@,ô,ÒÉ,çÑjw%‘x<,‹´š­>yìYhG’D\×å—~é—8{ölÈ[Ì`ãô'8xüº"ѹñ‹H—® ,ÞA9l ¤âp`éñ'ÐNžDÊf±m›Àóúìþèö÷<Û¶q§W_0òôL’® €!>ˆÔÛx"ÅÁùy*µ:““t:-ÖûÌf³Ù㆑€Cüåã …ý;üÑ÷G7µ¢(ˆ¢H<ç'~â'0M“W_}•jµŠeYt:DQìyQp¢(H¢„ï…ñš¦mjQdmm×^{±±1Ξ=»Cê À¡0Ä %*ây?üáùú׿Îìì,ããã½ÌÃèùd2‰,ÉX¶…mÛèºN«ÕBEÚ6åR™©©)žzê)æºANýZG£Ñ@¥0«p¸C ±¿Ú@Ô ºÝÏž=Ë—¿üeZ­§Nâ7ó7{áðáÃèºN@@:æÈ‘#œ;wŽ/~ñ‹¤ÓiVWVùÒ—¾ÄsÏ=ÇÜÜ\bˆ¸&ÅéÿÉŸü W¯^¥Õj¡©'NœàŸø§OŸ¾ç}•J……[ @H.ž>}šOúÓ½Ì?Ïóv„DÀC|@€ lllð¥ÿúKüÆoü–eqíÚ5>öüÇð<I’z¼üòËü«ù¯øÇÿøS(ØÚÚ¢\*S(Ä·üšC ñ‚®ëüí¿ó·8qâ¿õ[¿Å›o¾É?ûçÿŒ………žÙáàÁƒŒ377ÇïüÎïðÛ¿ýÛ¼õÖ[|ç»ß [މ÷i& ÀC|`ùèóù<_úÒ—¸~ý:ÿäŸü“Þó‹‹‹X–ÕyøÜsÏññ¼üòËüú¯ÿzï5Õjõ¾õ úHÏx¿e”‡bˆ‡ƒ‰‰ &&&8xð _ûÚ×XXXà‰'žàèÑ£÷àX,ÆáÇHÄÌÍÍ‘J¥øÄ'>ѳýwgFÍH„Ð ˜L&ÙÜÜ$‘HH$†+0ÄûF€ì ìé·ùw3úQÐ^¯Ý ¶mS­VÉår!AÝü™L†F£ñÞ»1ÄQ`Oç¿—;¯¿âoäIˆ¢w¿Æu]R©ªªÒét¶MMÓÈçó½ÒBC 1Ä@!èúñEyWÍGzêý}^+IRÏ4‚¹?™¡¿ÀàC ñᆠÈýÙCžçõŠ ñ»  «âçù½n5Q!ˆPò‹a~9ìx>ðƒžë§ß^ŒTÇÝ&_Ößg/Ê‚‹ž‹’PöÚXC|0µ Y–{ÍDƒ Ø6lÛ¦^¯÷lŽ!ð“Ö¢ˆ$ŠÔªUdU%¦k´Û®ë¢j²$áºîŽÃçû¶í ë:’(âv£Â*•2‚ ‘L&zñ呉6I=>HQ”PYÆqlÛF–•P |¼¾ö[CÒó¶‚ÇqH&“ÄãñPˆ{½^'N£iÚp¶>`R;:ÔϽÁ×¾þgLLÏòÉO¼À[×¹vã6SSÓüÔOý*>ÿþ?ü~òó?Çáù^þÏÀÊZ‘ÉéY^üä'Éçr\»ü¯¾þ òÒK?ç˜d󣌎ä{ßµ¼tÛq1MƒÜÈ8…Bš Ç6XZ^Eê­6ÇŸ@W•ó¼»;íûR‰øpñ>€ˆR‰mÛ Áè‰~©ÝŸ/<Ä O;Û}æ…^õ:>G„eb1 ç^ç;ß[çÉ'ž`¼áÂÅ üÊ_ÿen-Üààì81Má•Wþœ£ÇŽ2?7ÀÓyžK—¯råòeyŒ#GQÈeX[[æÚµ+TjUN?J®mbvÚ¬®o±¾t _I‘Ëœåø‰“$“1¶ŠëüѾÌOþóŒò,ÞZàµ×~@&?³Ï}„T"¾³5uðæ`ˆ‡¶¯ú×¢ÿ¬Ëºu†Ø'!°ËnŸ —Ôø¿ò‡ˆK2!™Îòü§žç™'O³¶|‡ž»À~öçØXßàÚµ·/þÜÏóô“÷>smm =ž@S+¬7É$“¬¯­±²´D¡0B"‘@×u¶6KÈŠHLqèÐ!¾÷úÍ£(ªL«Õ"DÆFG©Vʾsüø1^{íuJ• 3Sã;÷‘ðÞæ`ˆ‡«IF|¯<ذ È»·ÅïG¬lï[áiÛ_Äq÷"Üóþ]-œw?·Y\ç{ßû>S³8uò8[Å &¦g‰ëÅõ5“Çb³¸A¥ZCÕ4¦¦¦Ñ5µ×8£\Úäüù HŠÆÓO?M³^a«\EÀ0,ÆÆÇ‰i*«ëkŒŒŒ¢È2Å5Ú¦Ãé“'¨VÊÔ›MFGÇÑU™‹/ÉqôðA®^½‚È™3gHökÝKý~Þ†óÅÎùëÕèî‚í:}÷Êa(Hîƒþ‚ Cðþ¤|´%¿'"ñƒLr1x0¬ð.à:¶ã b7XJì¹ËÇ}ÇÓ–e¡ª*ÍfÏÐTÏóˆÅbÛÝ\;MGת՚¦“è’i;yàz. ôÊ;?Hõ0Ó4QU5tªê=¿Ó$QÄïFŸE0Œ®v™‰bE|ßïÕ´ü ,3µ‡0ŠšTô‡³öG·…D4Ôë t=F<Û)ä<Ã4‘…À÷Ñ4DZp]¿» ªÊ}mÝ!öÆP<èvꪯÍfƒko¿iYd29TE&™Îp`v†âú«ëEò…<ªª’ˆÇ©×ÂRããÔª677q<Ÿé©)Ö×Öˆ',/ÝIe¬£ÞhL$Ø,®3:5ÇôÄw—– Áµm Ã$‘LL§-(—6Y]+2==C§Ó¢^«£ÇâärYlËÂëK †Ïôô$—.½‰,+T*5>Œª*´;mFFÆðl“KW®’ɤ±ƒf1-‹‘‘1šõ ·ïòä™3T+[ܸy‹d2I&v©™œœ`ccƒ£ÇŽƒï²¾QDQd|?¬eßh6™ššbe雥*étšt&M6“¥Q¯"Ê*ñ¸Æfqχ|.Ûëæ“Íå‘E¸víFÇxöÙgqŒWß¾Žªëä2YQ$™L`©t†ññQßG ‚w)‚¿ ØËþ°ªk÷Ø—}\”ešØ¶ƒëØlnn199†,K´[M–––XßÜdaá±x]Ó±, QVùøÇܾµÀzq‹C‡Žàû¢,Óu<fg&±Äb:Ùl޹™i,£…¦Ç0ZM^íû˜¦ËÄØµz™ìÈŸ~éS]Bo…7ÞÆ0mÆGÆð<‡rµŠ®Ç„Çu%™ÑBEUIgÒH\»rQTD×6ððÉe)n¬Sª”%™›o_%72Æg>=…®ëLNNÇX¹Û²,âñxMèaå!Œ6\_]áëßø&æçI&¬®®1;;ÏÌŒ„m[llnâûëëktÚm´˜ÎѣǑe‘x"I­RâµW¿ëù N?~†t2†iZ†AÛ01 ß¶»ÁJau\ßóB ¤¯”v‹¾ûñ.Ô,ér@÷û¼wË#'# ÑlRèrQBdWOÍÛõ܇ý‘l¢(²YÜ Õ6H$⸮K:FETEf³X¤Õé„„”ïÑê˜ÌÌLa&S“STÊ[XŽËØèº®r÷î]Çcl|œl&M§ÓÁ¶-Ú­6™\žT2eܹ{—D2ï9t:&º¦aš®ï3>>I2¡S,nöJDÅãqÛÆvEée„A@*•BQ4]Ç6MjõšªcY&‚(’J¥‘ UV(•Ëa:ªïS¯7(ŒŒ259A£QGVTâ±·oÝBÓuLÓ$™JÓ54Mò-’É­zåÕDŒÇõnwÝ,£##Ôk:¦…¦(t ×u ŸT:C2‘`ee…x< 0'LLËæòˆø¬mI&8ŽËØØ(µjËqQ$ IQ( aë,ÏC‰Ä;æî¥×¿Þ;÷ÐíøþÁý¾g÷¾ë¹~BaO°Õj‘J¥p\—˜®ïùÆwÊ5þq¿ýßi²ßÍïw]÷Eÿ2b~ îú ²Ÿ¿-ðýO²ÛãònÍÁ÷²žýùú?*ûÈIÀè6Ÿ·¯]¡Zkr`~žT"N¥ZAQurÙ ›Å"Ív‹ÑÑ1Ò©4ÉdâCc4êU.¾y‰xš®x^È«d³èšö®Uô½P³Q§T©2`žv«iÙhšÆf±H2E•á­KWxòì3´j%–VÖð<Ÿ’ŒÇ$‘NÇÀèt(‹ŒŽO0>6ŠeYd2Ydù½]|åÒ¦í13=I©TBQ<×¥R­‘Ëåplƒ·¯ß`ffŽ|>¢H¸®‡ïyH²B6›y´@$\Ça}}VËäÛþ-FGóH’D§c ‹ ùB†o}ãOÉÍòKÿÅ/iÛìÇ)zk—¯Þè´ø¿ûIfff˜?|f£Ii³ˆ–Lñ…/|³ÕàÂùs¬®®Òj·É¤3ÌÌÌЬWX^+255MLW(7yá“?Ñý-œîÑ6º‡«?Rn{ó ¬®,Soš¬x&_yùefgçX[[gdt’Ÿû¹Ÿ¥Q«ð¿þ£Äg?û“òY676dI¹qkÏþçùüO~¦Ë¾¡/}Û+¿mŸöÝm;ÜN:ìMçû,ܼ‰$Ê,\¿Â¹7/‘I§èt &g2=5Iqc?úÚŸqøÈc¢ÌÔxõ J[E~ÿÆãLÏÌâ;—/_å'?ÿÅ^°ROuÇÖ•ºÛçß/, £Í¢ ò½o‹ÕÍùl–Û‹Küµ¿öËh’ËW¾òLÍÍc×Kü›ßþ¿PÒž|â ¹T IËñhÕ›´Úu&g ¸.+ëüò¯ü æ¦'·5Àà÷V4µj™¥µ¾cò{¿÷IçGq,ƒvÇãW~å—‰k" 7(•Êl‹è±ÍFÇñø+?ûŞ؞—÷¿ßû .¡Ñhñxœz­J±¸A³eàû.õzƒ‰É š:µz“l&G>Ÿ¥¸±†Ì /|MU>@§ÝäÜù ¾€ªÊ¸¾Gàû´Zmò…{ì¾çQ.—é´[¬®oŒ'ˆ'â8ŽM³Ù¢P%“IÒjµŸ˜bzjâ}kyé+«xTª5âñ8†i291ÅÑcGñl“óo¾ÅØØ®m³¶¶†$+ÈJ˜2\ãñÓ§…‡²påÊ%ÚmƒN»å8A€¤¨LNNqèànÞx›z£ ÀüÁÃ$—.]!Q¯×q‡¶a255M»YgbzŽÇ{_c2ÍW®\Ås}~W°‰’ÌÉ“§ÐU‘ Þääé'Ð$ /¢Æãˆ]Ó.•J‹Åi6H²H:¥¸¾F¹Vç#ý(c#…÷dT+%®^»Žª*] ÊŠ'’œ>ý8édŒM:KË+€€iè±8ùèGHìr‡> ô÷ìr:Ífƒt*…çûhšÖ#$<Ïëå•÷ßP&°ÿ7¾ëzÈŠÜ›ƒ¨XJ4ÑM¦Äv / "ôróEIê¶uþ7M7º-ºÝLÓì%pôµ?a·fñ(ìÊþ3žçbÛN/·¼?•BŸ¿ªi¸Žƒ,+Xݹ’e£Ó¡V¯‘/Œôâ!¢¬Ô÷bVFSì86®ëõÚhmÏHÒvç¡ð}×óQ£”çn­YVúÒœ¥PxþkÙ¯ÉX¶M½d»ÝíÀB ‘ÐeÊÎP݇ŠõïñF£ÑKûšÍf‹ÅzÒ)œ€í‰‚L‚]îŒÝ5Ç~œ±›mŠ]ô ½þÐ?7ý‹Ù¿X#'^E”nnþîÏ‹ŠqÜ{pBÖzeé.­ŽA,ÞºSSÓX¦ª˜exI/ IDATÍ­V‡ùùyL£ƒø‚H&›Eè ¯ MØéõ‰*Gí.ÍAô\TkèÕªÛÍ7D‚ãaÌWõ qõwÚí_ûíÇÅîa ×_D<ß{Ïõ1¢:}{í‰èwGcÙ!´ƒïÔU?ðI¥RÛéÀÑàz(%E©· îÇØâvo˜Ý,qÿ ·×ó{-üúuwÛ¼B_ßøþç}ßC×c”·Šœ;ÿ&ã“\»z‰s¯ð¹Ï|š7^ÿ>SbwZ”*M~þç–µå» ˆ,.ÞBÕŒò‹¤ÒYTE¦R*á /|âÆF ض}ϾØ=OýÁîµû·ìæH–û¶÷ýáîÑŒöZïû­ÁûÕ¦vŒ«ÏÅ×ÏõósNöÚ—ª²ºÃ_%Ša§ ï:øý2ìõþýŽØ¹Ý^˜Gµ ïÀÝìqhökß\Åâq’‰8†a‹'ùÅ_ü4YdîÀA\Ï#-ðüÇ_dl´Àæú w—×H&Ó¬®®bêÕ*¥RÛ²1 ƒ±ÉI{ÓŠ‚°c\»+HíåòÚ뱇=Ÿ{ÍÅýÆ5ȵÜk\;öÖpކؑq™[[[;â²÷ÜŒ{| $I½Œ­ ð$U)Œ­ÃÏíªC„±è}·ÈýêÖ½ßã%ô[Y–zßHé?ôÑœDüÑú훽¿<›¸]î¡ß̈\ýJ’$ZÍ&Ó$wƒgl‚ ï¤’Éí´i·;$º¯Ú,®³¼²ÎÑãÇɤ’¡ý.Iø]îaÛeÜ•ëNðçþalèþ’ØÛ<…×ý-âŽu}4{éþ¿OÅÞyǽõˆÆÕ¿g#Î!N‡cèJ$☦E:~GÂ%²S:†"Ëx¾¿ƒ|ÙY›nïRÅŽmc˜Vo‘ôX I0L MUñ}¯«B ï=ã´ÈNm6(jH\%I!Àu\7LºI&Ýb›^RGã²,Ów<ß'™HÒn7ñ¼UÓ‰Åô{ëÅ ÊRo¤ÑaÅ{7]$Pv¯Ytˆ#ò1Š*Œ„‹ëyxž‹(Ê$“qšÍVèãöƒ¨ˆõ`5ê5––Vh6´ ‹³OŸÅslõ†ÑA§8yâØÀMÜH ÈA@ï¶Y_ßÀs]Þzó"¦ab|æÌSÚ,²V,òؑǨ•ˬnùü¾€kÛøžÇææµzŽÑAUC7b*™¤¸±¢é¸F‹+×Þ¦Ýn#J2'N&—ÉÓ5îܹC©T"?2‚ÙéJehÔjÄÒ™0=µÀyØj#€e…Ñu¶e°¹U"—N!ÕFz³ƒçù ðPÇq_3K-B£Ó¡Õl²¹±E&Ÿ¥^¯‡·œŽí JÊÞ\ Â=zp¸×þDØùå½n¿~Íu:Ž kÓ3XÅMR©­f“R¹B*™Ø£°Ç÷g£q9¶M»Õ¢R©Q.—1 ƒ-Ë ÝézÃ4Ñ5õ‘ªÿ÷ì-Ó¤Õj±UÜÂÚíÉX ßó{:-ÛESåG¶·úM€h|;*Åb1ÊåñD]U©ÖjH’„ãØx^@:¢ÕjÒ¨×YZ^&Ÿall”|¡€ØµM³C­Þ@U5L£ƒ“ˆÅ¨7¤ÓiŠëëø‚D.›Â²l ##¨Š‚븦çºÜ½³ÈV¥ÆsÏ=‡" ˜–C¡Pxä€c[lnm¡i1\×!Óc¾G£Ù @`lttàdd«Ù ÞhöÊrÇ :ív¨’».z—ø¸J[›¸~@*™"‘ˆS­Vh4š¤R) à —Ëß“Ïÿ¨áy.¥R¹wxt]Ç2MÏCWU×cdtE¬gY&åREUq‡T:ª¨øžK£ÙDÅï­FW³ï  9€\.2DZû/^­V#žH *?B``;Î=(ün®vt¾;6¾ÉdbOÊ XÚ~©_|­û½³ÐöâW:ª>.§Ÿ¨Ý«í¾xnÞÁd¿‹Ý¹÷W—üÔ<Õëõm`›s¹võ íŽÉÈȺ®A†ÙAQ4TUÁ4Í.cG×u<×íE꘮Ǻ„Ù½î*Û¶HÀ¨ªÖ•šÖ@&#Ц³LƒÅ;wP5Zµæ—û>®ë¢ÇbÌÎÎ’N¥¶©ƒ @U5Ê[›Ke$A Ùjv»þ„ÍrùÓSSÄb®ë Ì­¥ª KwïbZ6¶mõòñ=×Å`l|œÉ‰ DQÈa‹úæ5›unÞ¸‰íxÈrØ$E’e&&&Ý3áQC–e*å-n.ÜîÙ¾¢éÌÎΒͤ÷EPúÁöwÊу¦aÐlµ™˜œduéõfË4‘×õÂOÏŲâqJ¹B*“CÁñ78vò >úìÓ€ßM@¹7rð~cÐIÃDI¢^¯ c[›[E¦¦æÂlÀj…Z½Á“gΈÇîé¾óHoQ TÚD–5ÚÍ*¶ÉÄè¶csãúU:†É‰ãG‘¡5¶#p‰û—w\¯{i»íömwlèºõ}•ÕÒ©L7c±€*«xžÍå­b˜e77óÈ7wÿ=×cey‰r­‰¦ª ydY¦¸Qä‰'Ÿdb|ì{ï‘™¦ÉíÛ·p½€d"N&“FƒJ¥ÊSO=I:•èž ‚`‡?_ŽnîX<ÁØè›››¤29ôx MÓÈå²=Û?3:J:• Í=ÎÈØ©DœjµŠ$KhšÎXWúû¾È½t@¸ñCI}èÐ:ƒF£N.—GEææNѬW)n–wt¿yä‹ÕUUɇ¡ÓnÇ |ôX’™© VV–1m7`²šR»Âj\"@ï=»ƒúÑ2>1‰ Õcjz?p(7‘D"A«ÙIJLDIbvf†·¯^AVc¨ÝnCAÿz;ǽ?k¸‡*€ ^+xÇqÁ¾k+;’$Iî¹KBi%öŠ"|X¢$!KŽãôTÛ^>»ëöH­ý€,˽BÛ¶}€ëz÷Øó‘öå7xÝXþÀKf¯¯­‘ÊæÃt˜™™Â¶,:†ªiÈ’Ô=¿–e÷zßáyl•JäòFG X–µ+ÌøÞq òf‹æ*š·®ëö¸“A+ ©îß[Ñsƒözõk Q=€Ôu±XŒV«ÕëVcšF7Ù#ñcoÛ?hÇ¡Z­’Íæð}—F³…,IضC6›E×µmÓh`:$`[­&š¦ct:¸žr-¢D&ÞQñ&"ï-0Ú-޵+ѧ?€'* Û•- Ü[¥lµZËrÈfÒ´Ú-! V4l&s)<ˆ5ô=JµB<žDQ„€t*ÝmRât %I¶,jõгdÛ&ŽÑM¹Éf2=Åi ž Âþ ­V«ìËZ¾{›ž¿Ä©“'±ÌÕz•‰™œ:~ B26ÜÌmÝãív‡r¹D«Õ²mÚ‰TÏ÷ñƒàG #í¯h´÷–}ïdEczrÇ #½@$“N3>6Šï{;j)‚]÷»s! åR ÏI†½ÅP»sgGY·AÁ‹Ö&(7Å×÷‰‰"V·}[ÿ¸5¶¤d?H$°ÊF“t:M£YG”ä^ìn63R£b†ý¿ó´]¬!Ú0»ëÌ B]‹L€Z­Ö-(ácY6Éd]×Qd×ón?Fsh,ËÆõ\DAÂ÷Ãzñ¹lf_òDQ ÝîôB¨ëf8W±ñX Ïs´µ™+õZèBs\‡ÀUÔw`Ðó޵¨×Ã"œ–e"I ²6_Íår'˜EQ¤Õn£vM€^2P»Ó!•LP¯7Hg2!!´Ký»G¹a/¶Ý /ú A>¶m#+J¯‹Ì^wN*–eõª¶Fßëºî=DØ 7µëy½ânw^û‹x쉴;YÊu]lÛF¥®9Ø—1…Uš•nðÚv‡¦Aßü» 7Û¶·+wµßz¼Ä ÷UU`9"œËâNi Çñ¸þö5ÒÙ<ããcN˜œ#äsyt]Ãèt¨×k´Zr…¹l†z½Ž¢jŒŽ°xëMÃåðÁt:‚ÀG’ä7|:Æ0:l7ÉçóH¢@©TFÓõ^àI"‘Ü‘ø¨P¯UY¸u›¹I%tïÜ %e«ÍÉS§ˆéÚ¾øm×WW(n•9~ü8«Ëw±\I/8}êľy&–î,"(*³ÓÓ,ܼŽ/H˜íÉLžCósûÂYf‡k×Þft|’˜¦pçîz,†¦jÌÍÍ¡(ò¾¬a¥¼Å»Ë3¨ªÂfqƒb‰ÇŽE<ÖÖ7B’Õ˜?p Ì0‹š_ h\š¦Q)—h&¹l†å¥eôx‚€Ba„x<6Pb+Ú‹Žm±°p‹\a”T"ÆÚzØýW%ffg‰íC0—¢(ÔkUî.-37wßsX][G’ÂÔù©©)TUظ¢@ þvå=`aá:ÕZ;ÌùÎfpl»ÛMìµUŠbÛÆña´Ç :S3³a±`ÀqVû™?LµÞÀ0 â‰#£añ E–º1!$´ún¨ª†Ü­¿¯¨“I,Ǹ ôí1ÏóH$RH·6C×TEô½z: ÚD‰HÀZ­Vùõ­vEQÐtDð›6œ+‹ÅÛ·ð987Ãõë×XÛØB×4?ö'ÛñúA+ð²(>Ò~r÷ƒ$I¸¶‡e‡±"‰xÏs÷…+‰¾Q$FFFð=‡f3ìN3³³ûÒ<%‚¦éŒŒ0:m¶¶J¨ZŒ¹™é° ûŸ]» ÐnéTkuÒ™ žët‹;„Å!rùB7ò,T™;°Hûø>¦eѨ×PõScaÆšçòöÛ×›œb¤3Ⱥ…$,ËB×c蚊ݭ7彇ÝzCÓD’¤6+yXªšã¸¢ˆ"K´š-<ß'›Ý¿ÍcYað®k¸ŽÛË,“uàwúÑj… JUUéŹ[–E2™Ú—À–þ[7ÌK°p­ÛŽë" B7´w»*mÏ® lê!JÒ=-˜¢b”ý¥‘îGî…G••»6 “X,Ö[¬¨Óí~'9Žƒ®ë¸®ÎAàŠ¢²ä±$IÝôèü³,+,·ÝWlt?È6 ÛÇBéex B˜°¦ôu­ÞÐ4ÍÞeétS“=ÏCÓ´“ÌQ2Ð=|Ïã¹s4;…\–dTEÅóÐã dIÀèX¤R Íf M×pl›F»ÅHa”Àw©Õë¤Riâ±X/ฌOPÙÜ Úh222‚ãØ”Ke’©4‰Dß÷Éær½$ -òü-E¥RÚâêµ·™›?„",ÜZ säÈcd3)lÛݳU×£ºÉTUeñö«kENœ8ÁfqF³ƒ$‰¸^ÀÓOŸE‚¥¦õ˜$IÂs®\¾ŒˆÌ˜áî;8އãÚŒŽOräÐÁ^Â× ÆåwÛÒwÚ-.\¼ÈØÄ£…×®^Űlb±Gއçù÷¹ø>)衪ê‰Î±IL?®4îCð øÜ©ça¸ABHI„3O‘ ?&°‘™Ž¸ðø‘;’çOþ! ‚8J™ï¿IëŽ÷uB^9þ\ÏBrë86qR»’ñxVD D¡yÜDe;; "ЉÀÚíÛ4Û]Éç³#6\âìM*E–èÆ.2†®Câz>ét QX[½E€a@§×gqq‘R±iÜ †T*•Hk ÛçâÊ ª"ÓévI¥Óž‹íx˜¦®ëÔªUTä\ÈñégŸ±|îBÄ.ô¼˜ 3ðýMÓèvÚˆ²‚ôû}tÃ$•2© ê:¦iF@¦(¢Çdš~¯ËÆæ³sóHB8*Ø%‰……E4U9“A]«îS­5¹xéžc±³»‡çºhºÉ¬;4L IDAT¹sKg…µ³qï.¡ ±07ËíÛ«ˆ’Œïû”§¦©œQI°ë8¬­¯Q®Lch ëëw¨LOã:ÅRyâ<€äêvZlnï²´´Œk ¸»±‰išÈŠÊòÒ²»úæú:ýÞïÿð‡]Æ?§Q¯³³½ƒªjô;M>øàC ù—ecs“ÁЊkNWŸ ›Ré4Åbn§ƒ$ËȪÊÜÜ—.^‚Ðgkk;U„ÑÜ”š ï·‡:üN ‡ï ã°/$›Íã{n—0 Éd²”ŠEfçæ¸páϳÏ>K&e°±¹m;g¢=qX ÐéPÈ籬!®ë¡ë:¶m!fÊŒ˜iVTÄ“ÄÒ–e!I2º®Æ Òˆ!«j4Á;]TUC‘%,Û>tÝyö×ÝBƒA\‡ 2Äæ²,£È2¶ã i:®cqýúu ¥).^¼€ïºOóŒ.AÀq?ˆ>7^A “Éà:NÌÉOB‰Ó>n'ƒ!iWT‰)Æ•wþ¨˜Ê"°6™ü’xÔmi<¼–`*AŒrä’$EŠ?cÿ>žC„ÈÍ©×ëÇcDe8¢Çaa‚¡$ŠÁ†¡Ÿú€Oév:ˆ’4âØ;¶÷Oôû ØX}G¤G`ÑëõG)çd‘ò|Ÿt:=*\2 cDÓ=ͱ•‚$<€ÑÐh4P㢉d‚ŽÀ0ßW<(“Iœ ªäßÇwŽP$™ Fšr€®qRÐ8øv¨tHòH~ö\7Úý¿d¡Ç8¹(ùÜq©)Q’âSN0¡:öÆqŒCé´0 ƒâ‰œØLGŽÎÑŽ“J™‡Ç÷ `hY¨jT@Ôh4BȤ3hšǪCÇÅL¥P$‰þ`€º>ZØ“g”Fácì— Þd‘œ$a) Û3+ @‰ ËGU–&q%XÙ¸#óqpPÅçfýäº.†a*%G¨n·‹ï¤'qèÇw‚ðfž'ÙI?ø 7NË=LMð…ïHv#é¾Ýî«‹ÁïwÒ=KÊæñ¾¼¯]‚€, |~ã™\´®²º¶Ux:[›[\xæYÎ/Íó«_þ‚¡ã“Ig˜š*ã¹.FIŽjê]Ç¡Ýi!)*ùlŽÈ7¢K±\ayi16T ïO^ œˆL¶޲=ß³iӱ𔨶<¤&L"ÐÜŒOòý@ÑQªí£üü°/ðð/&ùñQ ™ñ¿ßùN#‡{\[‡öyBìò|÷ΜaŸßýáä |7 º»ƒƒÈâü,š¦rgó¶e³³µÁæÎˋˤR*›wÙÛ¯ñìåK }î:óó³üñƒ÷yá•7Y^ZD„Ø–üIžùäúç‹ÆìY>3áŒûê`ññÈE?Âwóã«éñÓA’lŒV¹pÌE8$ü±m‚³—C9v4:"±-z¨µ±Äa_G {P›$I¢ÙlP­ÖF1^tlÑTI‘)‹Ôk5†¶MÊLÑïw 0uƒˆÿáºnDò |<׋­ã"¬fvvæHXv$üz„SÜ$úêÈ) Ný<=ÏP8’Á8‹¶È²ûucªÀÍfÊ<;dÌq„(ãû#ÇZ96IFBdÊÅ͉ÚORd4Ò ˜pœø°øßó¼û€¯ñ‚¢³“Ÿh‡}OLr9÷8ž9Ò’¦N"=ÝwT=òs$C†!~\W?ž»¯)9K×âñþ>ÏòŽ|FD¥‡?ÃÓÞè,ËBÓ´C AQºí&·ïlðÒK/FÀÑp8Úy fÉdh5›d²y$1 ûއz½>ssóXÖO?»J¾Pdii+6ÝH¥R¤ÌfÌÑ>«˜ZQ”H¬ñÖ*KËç }‡Íí]LÓdÐïsñÒ3ò9×=¢’|ÚíRU•F½ÊA­ÁÊÊ ë«·°\ßsÉæ œ_^ŽOTÛ ÜD™ ö|=šà ’(²v{•îÀfåü2wïÞA£ŒÄÔô óssñ)rrŒ;YŽ„kÖ××(MM# !×®]GÓt‚0deå…B6’|›°3РßçÞÆç/¬P¯î±»W%•2ñ<Ÿ•‹1uo‚¥ÝIa_rÅÕ€Ñn~g}Ï®^Çql½íNQ™™™¥ÛnÓêvXZX¤Ûj²µ·Ï÷¾ÿœÁ‘­»Ü^¿C.—£ÛéÐë÷øæ»ß¡œÏÐétq‡Í{ôú]U¥ÝìðêëoðòK/!žç’ËÈfÒÇq"²ËÖÖ6ÅrCSØÛ?ˆ‚A:µ³q,úìî°¸¸„c h4[K˜žšž˜Ðìø5. .‡16ð=VoÝäÖÚ]ffgɤ"ÓLóúë¯Óï´q½€VKàúõÏ1Si<Çagg—_yóKsܹ{—Á`ÈÞÞ.Ö`@à‡ B¡TæÍ×_?Â{®¤-Ýv“þÙ?ñê›ïRD®_ûœþ`ÈܺiR*ä'*Ú´ë`o‡Ûw·É¤Slmn²½µÀââ<ù|U‘'–M=·Ðçãÿˆ/ê¼ñêKìíîpkuR¥Ìüâ"ÙÌ¥/jסÕn#+2ÅR ÏbçQBɤ® ©LÏ`»!¶c#)2sss(ª‚¡ŒE|Õ}%ËQA—c[ †¹|Ãõ䣓•)Ã0™ªTèv:(²H¡XÀó| ÝQ¹Ï\D×u:¹\n´š†¡Ëòôûý>•V&N:Z|´JbT€Á`0*ñýI’ï3yZ®ãÜìÃx[Äõü3;:F±¿÷Ÿ8âUÄ”¿ûŒW&Ú.×ÅkÊ]×9»7…gÕq'ª7‰•¦“"!í ŸaضÍxB„MD–ê™´éH0ÞÐáp€(ʆ1Á|ßǶìÈÍT’•HÌ "öh÷ÃÇ%“¹ß 8rr±,ÓLJ‹!r’¤Hd¤Õl`Ù…bC×G‡ Ð4è÷ñü€l6sêßï#Цià86¾"âzÞ]XDQÄs]š­ù|AˆÄD“ª-k8Y“MŒL†H²Œçù †Cò¹Ží`y’(âÅ€’¦é#kîI\’$1´†„±Dy¿ßÇ÷ýhœÄÖ庞TÜù™øIÙñp8ŒÅId¬X´6 Cúý>²¢ kú‘qwÊ0^¸}†Ã!²¢@ƒaY‘ñ—áp€$˺q¤.à´AÀñÅY>ÔÛ÷¹úÙ§´:}^xáò¹ ûlllÊd)òÜ»{T&CúȲJà{é Ë‹ lomR­Õ@Éçr£›aÔëuŠ¥ù\–N·K¥\aóÞ]AD–"]|iŠg/]àö­›ÜÙØâÂÊEtM¥×í†él–å¥E®}ú v—¥¥e‰B–$Zí6aSS\Ç¡7DÒ‡’̕˗1 ×u0°U¥V;àó·XX\B•nÜ\ED S§×íb˜iVVV˜žž¥¹N[D”DîÞYc{gŸË—/S¯î³»·(+¨ŠH¯?¤X,qñâEò¹ì©£Éa + ¶5äÆõkx¡Äòâ<ÛÛ[ìîî“/°­HõifvŽ• ÕwN!÷žDÙ‰3P§ÓæÃ?bfvžLÆdýöm,ÇÃ0´xa9á óqvàtŸatjØÛÙâæíuÎ;úܸµŠ¢¨hšB¯×#•ÎrñâE*åRÌ´äTAîsißI2ËËçh|ü ëwîpñÂyöv·Ù«Vyiv.ÊÝw;XŽC:¢Ùl±vû6ž¹ÌÌT™Ÿ_g¯ÚàüùeövwÈf󾇄4uJí.¯¼ü"ý~N«Ã­›Ÿ#**çÑî´™w|çgÉds,.„ìïn³_­2]™¢Q¯¡¦²ÌÌL# "Š¢P«Wñ}ŸA¿Ç`è „élŽL*Å­›7QT ×uð<—òÔ̈’yÒR9ÛB¿×ÑE$Q¤ß’ËçX\*P?¨róæ-2™ ™t ×uObIå,1ÿètÚØ±,»m;äóJ¥ ÷îÞe]’xéÅFf*_6 zÐkItRÏá{­v‹ 6ät]—òÔ4¡ï±q÷.ºaŒlÂN-÷>Þ¾ÀG,kDåë®ë¡j* ‹‹4ë nÞ¸A&›¥\,à“)¿ ‚Qè÷zˆB´Ù²¹ Å"{{ܼu‹LæµxƒòNulÈÐtn§C>Ÿ£ÕjaÛÙl–A¿‡ãù  Ýn#Ë †™Uv:tà “NS«Õ"OEA‘#øÄl3ÊB¡£^«a»ª]“t£¦ëèš6¢·[m,Û‰pÏQ¤T*1èõBåȹÇul<Ï1):–özx¾®ëXÖYV) ˆ‚p„q˜äe=׉ôä2‘ í¸È’^• ý^—þpH¡P@×´ÓÝmcp4¢(·hµ;d³Y,kH´p‡(ªF!Ÿ¥ÙhâÓÓÓˆ‚02ž<‚Æ„¡“È& nåõ}‚ Õû'ú‡ B„’(rpp€ãyd3i:.š¦aYÅb Y–h6(šN!Ÿ;"ÔyZZ’$ßgÿ`YQQd‰ÁÀB–Eü ¤X(>õFƒB¡ˆaè#¡ÚS{Œ1EÙ¶,öö÷Éår¸®ƒëùˆqÈZ*—évÚX–C¡X@SüS–“$‰N§ƒ¢(GAšÍæH•$!*@$>Á˜+ÌI‚ ã䙓Ð÷ñ÷äÑ—('+»ÿÝøýŽR&Ö ¬¾bá޹°ŒVF5Ù‡u‹¢$©o³«K±hÃñïw除ŠòxŸŽŸDQIzÝ.AŽì¹³¾Æ‹}ÆÓMIÜžx²¢Ä _0Âe4MÃsÝQA—»ï¸Ž{D´$!»$ŠQ£rí1â×iƶrŠ€]E‘GÀj2tNë)2V ;^4udlyRLÈñ\w´9æÉ$)Òuý~AV«õÀûêïWâÀìqENLÕi‡?9}uLø!ÒÙ'uøñÏ<^þ< )|„Ï÷<>üðܹ·Å /¼p$¯œLß0Sf$çÕéF "0??ÏæÝu>¿µÆìÌlâdLš½~RL é´[ -‹|¡ˆ¡¸®$+LMM¡Äd›3í«/’è©i×1]üIµ+YPÆAN’Ý:º<Ò<Ÿþ¨+Ú‰lyÝ3ãÎ?éÃ;km€ã±¥¢(ØžK½^CEvw¶øø£=ÚíN$vª*ˆXC›ÙùÙˆái{ˆø\½q›¿û»¿Ãs]î¬ß¦Z­¡É2ÕÚ‚¨2=UäÎ5¶·v)–‹¤LnoÀüü;[4ûÿÕñŸSÈgqc*øÓÚWãKéSÓ®3[ã’àG€ñFœ(TpœBÿ{¼žü$“Šã& \íž„¢uÒ{Æ_{”{ž°‰¡Ïˆ¹xäs‹M"­»—_yt:ƒï»ÔkuúƒÁ‘:AŒi×õ(‹hŠÌÂòy²™4¦&óöÛïÏG(~¯? N£© ®çráÂERé4ª*3蕹™ilÇá‡ývz1õcƒ[c¡±äÜÄYSãcëâÛ!»’‰»QPÃ4G©•ãñâø Žø$€Ç¸ ÃIÊ'‡‚Á({Z®ñï*Šbô¨¶ žò5ÝÆ\e)sï˜&ß8H÷ 4ÿ¤0kü»I¢D'*>wLDi”ãÿüI [žÜ_âÿǨç,wýñ±5ŽSœ…kq¢pD4 vvöö¹xñ"QÊé€ â]Áu¬išÔ«ܽ™‡$*‰Óƒš¦†Aì0 Š¢`êSR (c û¬®Þ¦X®6u6w÷Ð4 ÇuYXX$›MOÔÇ=Y¦Q¯²¶¶Éù + û]º½ˆt“˘›9RywÜ é‹JŽ@Æ“dªôLãG‘{÷hwûœ[^â`?ˆe*åÊÂ>¹_–<׿֭[ä‹‘áææÆæh¿]XX$“IMôB¤’Õëv¸½¶ÆôÌ,ª,²³»{Š,..¢(òD+ÇU’`L$ CÖVoñþ‡ŸÐëõöû#AB¡È°ßÇrl¦§¦èuºìð­wߥßnP­UÚwÖnÓë÷IgÒxnÄZ³]—Ù¹Yðªµúý!sóK¼öêˈ§–öxP$’ÓâµêÕj-281L*SÓ¤Mc¢¥·aä+…€À`0Äsö÷÷i6[4š-–Σ\.# ÷c-I©ðCó ÂÉjÏ_tE2Ö:¶5Ķ#^B­ZIÁ³L3®k],d0èóÇÞçÒ•—¸òÌ µê›HŠF6_ •2c¢Íäža’ʼn¸ °»³Å/ù[ί\`zf:2-ONä¤pi”°­!z*Í_|óz½Šª’I§ñ‚b¡@Õ±©7l»Û„Aˆ®˜© ¯½ö²$²»»}h:}¯OÈ’D³Þ@”$fgç©ìG&’±FÝ—ø¾ªÎ‚0Ò8ȦÙlÕQdÏuÐ4 C×Gº‡kgʼÀgiy QŒ&Ÿn˜,˜©QªN”„ÇR: ÑN~ýøÏIøœ‘B$¢ê ù"½n›f»Ã3Ï^F‚CL œŒ4èxZTD—–1t•½ý]BAäâ¥gXÃ#ß› Š–&GýJeÓÐØq®<EVDiTS3ɱõAV«E±XB…ÑQ)‰é¢ø^d8èsçÎ ¥òè¸?.0™Ä[÷ C„„¡€¦©£4cÂ)8ëëHn6p}ä tÜix’àQ‚C$FãÆ*a’(œ‰þîx9ŽM‚sÎ"¦MK£Dha01-Ç-¾‰ «çù£q!’,U¢žPÐív‰@N'4M“f³¢¨¨ªJ¿ß•Ãôºj&•Ê)Óà?”+iƒÀ§^oÍæEb;3×ó(ÄòÉE‘ã†9¶E«Ó¥\.c úØŽ‡ €(Jd³™É÷WÜÝN×(ò´[-QĶmÒ™ÌhÌL:[f“T*ªÈ£Š7Ï÷Éf³£‰7É0.ù¬á0ÊžžG0ŒŠò…ü™(ã±O䉃ÀçÓO>Âv:­&s KȲĹóçéµë|ôñŸ™™[ÀÐbe`QD–•7|jj ÛÐjE¼õÊÔ WÎvF’|Šü’±p°·Ã¯û{Þ~ç[(bÀ«Ø¶MyzŠK/Eòg„“jxܰŸ_gíÞ6ßùËwÙÛÝb{{ „™Ùi®\yE–Î`¢ù¼ÿþïÐRž¿|‘Í{lnî’Íe™[Xàâ…ó÷M€I´Ëøãïså…—É*úðCÌt‹Ï<Ët¥|&XS·Ýä׿ý-o|ã|«ÇǾF©TDV._¾B&"Â3Q£0ªÙϤÓì­Ý%JãØ¢hb[/¾ô2étšÕ[7©7š(ªˆø^@£Þto IDAT  Å<;Û[’:ZŽpž3#ùT*E·ÓFS%dYÆqÝØr‹‰è# YFSÍ®ë¡(2ŽëŸ©¢Rø†‰ç¹´ZM"¼R>B žô1¢êÉ\.G½VEª”1 ƒ^·G:“:›É·Ë¶m  ÝnaªÑól·;LÏÌŒñÎnWŒŠ4n·K6“ÁvœQª@’e$A!JÝ%qß`0/ÉßyŽƒ$+d2iúý²¢‘N™ÿ~„A@;.‚?% ÏóÈçógÖ.DZé÷躎çºxA€$Šˆ¢D::³v ú}×Å0 ú½ªªá:©LU‘Ïlaêt:G!&=E diVžñ¢iY®ën$‚@.›=“öŒ ‚s¹²)—ÈÇg¬á˶Éd²%’yÖÎ?ºƒxž‡ªª£B›Dµå¬Àʈô@WbUUqlQ’p]Q”Fmž\»"U"Q±- YQ‘DÛqF–å‰ëÌ$û-ù¼ñtZò,£ÿG <“O9,PY–F§Nß÷‚C‚’¦ë8¡~êt:#U`ù°¨ÄåO|ARéw»,-/£È‚(‘ÏçØßÝâ³kŸ³°´L©PˆÑU)V~Éf³¸®M¯×éí—Kŧ†~úøŠå2º®³²r‘|.ƒãx;JFj?µƒ}6wvÛq¹téÛ÷Ø=¨bšf$²²2Òd&Ð_š¦qg}n€mY©4 s³|~ý:CÛA×u—™› ðÓ "€Šc[Ü^[Ã0MÚ¹BCW¸yó&’¢ IJäe‘IM„x“¸;u»îÜ»G!_`ow—åó+ôÚ 6·w$‘\¾ÈÊÊtõô‚F¥ÓãD ä¢$b[ÖÖo¢k:Õj×q4o}뛀@¹\Fn~þ9­˜$$Kèû!³3ÓØöQ’ÙÚÚäâ³ÏS©” ŸÂSÀh'ˆé­µj•|ñSÙÙÝÅõCææ°mAÈMéþ:©xmœú|¥Àãí/ŽK^›ô;Hò»÷î2Ú¨ª‚ç¹AH>Þe¬aŸÏ>»Šf¦XZ\D³ÍN„tMG”åÃ%I"•Jñ´_ý^—;wﱸtŽ\&ÅÝ{wc <……Tål$Í«û{lïîóü Ïs°·C³ÕÁ4 Ugqaþˆû$¯½mÚ½Οcg{ QVðÝȵ¸R.Å,¼ /J¾Ïþþ¾0ô)•§Eݽ½¸ÞCdaqmÂòôŽcS=¨"H"ý^Ÿù…½.õFQÑ “ùù¹û@÷Iß# Y67îòéµ›,..Q,dèõ¬­­óúo"­fͶi74[-DIYf8´¨”§0 …V»Ã`ÐC4Þ{ï;˜qÈÓât¼3zÝ}ô!>"•|š¿ÿ‡Ÿ²´¼B¹T$“ÍR)M¶`#"g lnÜåƒ>cjzšÕ[7¹v}•åóç™™¢R™B×”‰îhÉboÙAb lom²»_§\)1ízTÊ¥#;Û¤ÚP¯W©5Zˆ±®£ÌõU,Ç%“ÎQ(–ÐÔÜ„dÁÑÌÜæÖ~Ìø ÂÏqX][% B––.P(H§Ì‰Œ±ûJ¼»Ýnhš&µj•n·M»ÛG×uòù<ÅBÕ[·Èæ ó9<ßÇ4MÚ­&ÛÛ;€ó¿¥‘0 )W* =úC‡W_yI|ú&þøe \»v©™YLC£V«áººa°´´|f¹ííMöökÌÎÍÒm·è,E&›Ë±´¸xfýÕh4Ð ƒÐ÷ØÙÙahÙˆ¢ÈÌìåRñìNrýÍf‹Á`0Ò¶èv»q<.sþÂ…3y–Ífn·Ïp8$›Ëa‡ ¬!ÉæX^ZœøóK|2„N§f2®ë’ËåâÜi8L’•C¥{)yýx !ª¦F®¬±GúÓŽXÉc(’$!JŠ,1ZQX£*ÈN²’,±âö<ÌÌAŒS®Â(ÿ?.~4Ä},ŽäždÛöXJbïIõ×ñܾs"åè4•øŒÇâá„2'Ég:¶ƒª©xž‹ H‘ø!Zò,O¹MQi²…ã8”Š%lÇFh·Ûa6y½÷ûý1€"³£: ¢Œ÷I *…¸ŒõéÌžÕˆ%³ÄûŽ "ápF’`#‹ëc K„á©çŒ%†· Op ³õ¢6I£Ró$ ÀHž^΢¿„‘ŠÒñcþ¤„J’Å%“É Ër䘔l!¢(’ÉdŽ0÷¦‰÷PÖx†ðTÆýêámÀ³nÿƒv«§ÉaùélÓý'¯ŸåQy2A“ ·¤qgRÿþõõõõõu&—<¾ÓõûýqâëëIŽì"ºa –eŽÇ‰1Åø±ôø©ã$#•“:“U<)ÄJÞÕ DØ@To™~ŒÉä×pügY–#WÛ>ô*Œ¥Ó±M×uï»÷¨-ñk‘¾„‚çy£¶$÷¯HB×q¢ô똗àÃúáëëñǨ$Idã"¤0 #o@€^¯‡ãD\ÇîYDI"|®_ý/xöÙgè÷zè¦I¡PÀ²,UE\׬™e×uñ}UÓÆ,I’plA”PU×uG±bâ ¤ÄN>–m!a°¿¿Ãþ~•©éæçæP ß‹rP’$â86‚ÜÓ‰‹dôpô#@¯Ýj²·_gnnM¨Þ‘@l¤ Õéõ(—ˤS)<ÏK•#U Çqbå‰z-òTœ[XdyiqD>Iƒh!è´; ,‹©©i -âÄ»®‹,+Ȳ4RDŠ,¶£ß}}=Ùå8Ψð/ â5 "¡É Šþ‡výî7¿âOŸ|†©ë´ÚmÄÐÅCæ·¾A6“¡z° LMUôºì4š”c•¥ÝmBDfçféuÚtº}æççp› Jñ„ë´üÃ?þßûáOHw¶wYZ^ÆÔ†ý.ÿöÛßà‡"««·yýÍo°¼0†„ôúCææfG÷¬LMc›èfŠ\6C»ÝboZ£ÅÔÔ4õê>Ù|ÇêóᇓËçÑÍÓSÓìlm"ª:3SZÍ&íN—©éiR)“A¯Ë?þýOIçK´:fffq ×ñ]‡?ùÓL!²¢`¦Ò‹%ªí^³3Ó´[MZÈMZUdv¶·IgsäsÙ¯Û^¦iR¯×G'TbAYúzò `Çöùå¯~Í¿û/ÿk.,ϳ»»Ëï÷¯üáOŸ²·³Í«¯½ÎµOþȽÝ:ß|ç´u>øÓǼýö;èªÌæÆ]öëm^yñEêµ}>½v¿þ›ÿ„½Í»\½q‹ïÿð'¼ûÍ·èõº|ðÁûLÏÎӬﳻ_cqéû7a@§Û¥Xš¢Ýjòo¿ù5¿ 2Ù,žksãæ*?þÉ_³¿u—ë·ÖøÑOþ —ßþî.¬\@Äçú竼òÚ+ô{=~õËŸsõ³«¬\ºŒ* loïPžª05=ÿüüg´ÛM†NÈ Ï]âêÕk´[-.]y‰¿ýë!I®ãÐh¶xñ…çØÙÞäŸÿñ§ª‰¡©X–¢Hˆ¢D¾X`aa_ÿêlmnàßxãn¯®rppÀüÒ iMäwü‰o½ûm~ôƒï‘¿ÿJNR’$1šñ_wä—^ âØ÷8R×Èâ<ܽÆ]l#ƒ’ȳàêÕ« m——^z ÓÐãû\»ú­v‹Ï<ÃÌT…~¯K£Ùbaaqôý“ò$¶ÞƒLN“ßÛ–Åúú:F*…=´X>EŽR§µê®03=ýð1:Æ ¾wg;÷69¿²ÂÒâBäksênÒ×É=dz’$1èuùèã)MÍråÙK„A@³ÕÄq\|ÏC’J¥’$" ŽëŽô&Çï;é@/[üøÃ©u‡¼x>»ú)¹\×qq]›ÁÐâ­·¾Å…óK_é!’$p°¿Ë^­ËüÜÿö›_±Wk“64övwøæ_¾Ç³Ïv_ æ÷îÞÃ$ÞÿÝo‘ Çu˜››C×T¶66%…ï}÷»¤Sæ‘Éxüj6ªüÿÃÏßügÿ\‹ƒzíÝm^~åu–––Fÿèñ/¹çîöÿúÛßñÚ«/²½»ÃüÂâ},ǹ¾çò¯¿üÖ7wX^Z¤R© ir¬Ò¼½½A¯g±°.z½.f:=`¹?þñHÇ {üQ G 0š¯‰Çàßãƒ?¼Og0äöí[\~îEÞzã5|þðûßÒîÙܽw|6C»ÛaffŽÅQãøÑXøÂ#ñø‚'®ëðÿïÿM «~ÀK¯¼BHÊ4¹³¾FD“÷™+Ïó7^=q¡‡›n~~>ú”ÕµUæçñ/ÉeÒô2é ­v“b©ÂT¹@§Ýå ZG–EvööøñOþÑ·ùè£X\>ÏîÖ=julko™¹¹9lÛBD²™ ½ÁUQØÛÛçÍ·ÞæÒÊy΢PA>œˆ¹|KÏ¿Œ&ø|òçOX\XäÞúm>¿}‡W_}MSOŒþ¯iõÚW¯]åó7ØÚ­S.dp|X˜›=òÙ_Y ‡N’$\×GáÚµÏÈå ô{]Õ ¥Ëüþ÷ïóÖÛïœx \÷îqñÙçØÝÞ¤X,qîÜ2¶=@I@óÎ=W_}ž†?üáw|þù ^xþ ò íCƹÌìì i{»llnS™™åÅž£P(‘͸4kUüJ• ÚŸ|ò åéù˜Xcœøp„‡t^®Pâ»?xíÍ;¨²L§ÛÇÐ$ffçYT îݹõÛäËeJÅ2ÕZr¹üXÏï$×cY–™™f}k‡©ÒZ ?ô¹Ñh055M§QçÓ«×)MÏæÔÃæ–¬j|ó/Þea¶ÄÚÚ†ƒ·Öî±¼8ÏÖÎù|žN»M¹Ü ºŸa¯ÆòÊ ¾7äÓ?ÿ™·¾ù.‹ÓE––ÙÛÝfõf$•óç–Èçr }ºš®áÚCþ|{ 3›ÅónÝ\eqùB´ÂÄסÛ턆aÒlF %ùB×P­7( #à&e¦0S&¹löTBÛ²¾¾Nˆ±ÜT‚€ C×"F]¬Ñ´·³Í~µÎÜüÖ`@@ÈöÖ&él‘å…9¶wvX¹xMUúý«1ˆ R)—¨ÕªÈŠJ¥\þÂÓH§ÓFÒi3FÑ<ûì³'Äá£Ñ÷©Öª8®‡"Kôº=dEE Äq]rù<šª` ­È Þˆd¨{½.A@d@úˆ:z^¶E¯?¤T,0è÷b ¾€B!G·ÛÃ0 ZÍ&ƒáÝ0"/Ã*SÓ_ZÂ÷=jÕŽëbš&ý^×óÉå²Ôë5Òé Žm“ÎæF%_„udó$Úí¾çÑîtI§LÚNdçF@åpÐ'azf½ý—Pe‘Û·o£›i M¥?’Íd°,kä`Ê$®~ú ïÿé¾ý÷(dÓ¤ÒY¦¦Êÿ~€€Œ}¿Ä¢ð¨ï}Pl(œÒÊÙívÐueLDâ4AʇaOUéK¶ó?vÏp0 ÛëQ™š:{oÀžIù/|éTÆ£¾÷DYãÑç…)Àx5Éd²£ðèA"µX}AOÿýiL0OlÀ“pÆ swBéï6Ö‘s}ÔÏú² Ò£¤ÇS€†ibÄ©Òñ±u—œL¨×k¸®O6›‰­ÁlÛÅÐ5zýH*̶,\ÏG–EdEE–"ŸsÛ¶Ñ ã±ÝaÇ”õZ=z¶b” 4M‹l±üMUètºÈª‚((ªŠ˜xž÷øPc©z°O€ÈôTe´šŒWÂ=:¨éÓjµ) ÔkU\?ÀÐuEÅ4®I? }jõ33³XÖ€N'’Û–e…R¹tä­É{|ßc{kÇóP$iT8)ä ˆ¢€a˜Žò•’Ï­ ê&¹lšÝí-úC‹B!"?‹…1–°°OÀÌÌÌ“5!é;ZÍ®R)—p]‡¡e¡kú¨àèq¾§ t;mlÇ# <ÚÝÅb‘0¶ˆ;8ˆê!J…<{{{Kd öªT¦¦Ñc|ªÛéÐŽm·dE¡R.s°¿‡¤hG¤Ò’Ìš(ˆgN¿—ÇðÕƒ}vö\$™ù¹ºÝ¹l–v§…ï‡(²ÄAõYQ(•*ØÃ! ‹K4”§ç˜Ÿy¢†XƒëëkT«¸^À…• H€¬èHbH£Õ"eôz=ÚV¬ú*¡&ÙlšV»Å•+/ ©n=îø{gí6–™ŸH¢ðÄb&ë«·øäó›üèûßãã>DT Ù,¥Ê4K¦ñ—á赃ý=n¯ßEDú½6;;{4-R™4ßùÎ{‘h’@á'·nÝÂñ|$!Àó#g!?X\X ×íqáâ%4MýÒdËñ¾ýý¿ý#W毿ÌÕ«Ÿ‘-”©ì1´\R1©è¹ç_ÀtY¿sU‘q(OM¡Hâcï¼£¾ >üãÔ»ÞýÖ7©îïqo{›©Ê³3³,-.D€Ú|×ñÏÿóDzWo3[)âø!µêÛ[ÛLÏÎШU¹üüKø®Å¿þæ7¼ýÍ¿@•àæÍ[HŠJ.“FUU:Ÿ}z•‘™Ù)‚ `}m=•"_È#©h=-!œ4(\Ç%—Í!>Ív—l6ÇT©ÌþÁ>„Ëfñ=‡r±„(‰èšF)—#2‘¥ÊHsí¬ýÅ# Çqe…ùÙ9Ú­&„çÏŸ£×íR­2LR¦Ià{Æ ²¬ŠÙkª¦"Ë"Äõöí’†äry‚v/*ÕMvÊÇM)B].äé¶Û¤Ri4=E¥\FÓ”Gh[€¦S)\'*™Íf²€{ðx0dii™b±À°ß£Ûëãû­vUQ™ªTPc‰3áIúç„çÕi5YX\Âq}š&só ,--sïÎm¶·×}ŸÁpˆçº¸¶ÍÁþ3ÓÓŠ%”qoÉÇhK2eƒ>ùB3•æúÕ«(ªBJ7èu:Ø…âáæÿ÷F›OŸT:Ëœ¤"+ W.]¢ÓjúAàså¹¹tq…ÚÁS• ®m$’N§QÏu‘Ĩ|;—Ë¡ªŠΨª‚©ˆO66O+í&Œ²‘1H»ÝF”%dE#c mEQEè÷ØŽƒiF3É«ˆ¢„aèñ "ˆôàŸpeZC–¦ªxž‡¦ë誊ëyôz]$IAU†ÃaŒÊº¦‰*Ë!„È¢ôÄ»[oÐ' û¸î:¾‡ïûøž‚Ù>…áhxØåz‘iFÜžCEIÂÔNfäùa@ˆ€,$ Œ¶eÑ H§Ó(²?›¯n9®‹»)'â’ àú>¶e!ˆ"²,v;×qè†IÚ4¾Ôg{¾±9J»ÝF’eTEÁ², ÓDW”Ç:éx#Ñ×Çõ05 ? ˶Ð4‘HÀ³×ë#É2‚Ö0šðI¿vz]‚˜¸bè:ƒAEÕH=ELÆwàû²'Ž'[Ÿ`… Ãá$)²GiÇy…'UŽíšG÷{âUZˆSÔÔ/òLðÿ¿½÷þŽãºò}?§ruwunŒ"•eÉã0öøÝ™wßûÃgf­7s¯Ç–e*’b&b*Ç÷é*4@€D²¥YK¦ vŸSuâßýݯq0ÿûê;’÷äqº¤Ûç•ç¬X‚³ å4..Êý¦ƒ´zÏÓ¾¯Pyš¢Të±\WEž#Ž{·¢ÿ¼¶J–ý$䲯Œ‹ªÊ@UøPUøæH’… Q$³”‹W(‚"/ä( 9xe!DqVw¼$ˆn—BŠÉEŠ €Rö‘•°\%ÛŒ&]Q£<òü|W¿O>›!¡kçc³Îs È|\UÓ^A ¼öÉÒÑëɦ&û(ŠzÈN-JöâCc—¦`Yà8d{{(åûgyަ($åBVUõòTÏ,C4›–…˜Í M@“æ²x—µ"Â…¹d`âõ‡Ü›ÆØ4¡Ý&ÛÞ&ISôN»”ÊòB–°Ýš¨Æc0Ï#s]2NeM{õÉs²r£/Ò™-ÚóE~¤Js!yÓÁþ÷’4…n:(3*œ“¦ì~÷-y£é*;“)ýv›¹ç•/ ®HÞ;ÓD‚V³YÖƒ·t;ò4¬‚SžäEJ½,ãé§Ÿ’fªa2h;LÝ9 «A‘gøqLÃ0˜ÌçÒË­ëõº¦F«£ªªÈê4‡O–ÉÐu¶~øñ“']§a7¸½vMúŠS´Sr¡ûÏŸñü«¯¹÷Ö[Œ÷ÇxQBž§4·ÖVeŸ¯Œƒ #„¦1ÏxöÙ_¹}ý:~0žLåI­iÜ\]•°`Y:ˆ"ŠÝ.Išòýý‚aY²¶ªÄ1ËýY–Òëth5›R ¹ÀÍ[„!byO<þì3ººIÃi¡—™?!yþlÓ¬7´…ÕsÛm’<ãñ§Ÿ¢ H²?Šè—-Ë’·ÀyUÑʳn˜$y“ٔO·v¹¾¾Ž) Îrм}‡Ñ Ï¹ü¼ª*´ UQhØ TÝV ]ÕHÒ„†aÒo6ËñÈ.ÕÇò7;Ê5¶8b>›f«ÅüéSú“‡!B•Þô¬,ýTÙYu™£ÒVªbч’F„àTÔ>¥KÁê*™¢=.ÛSTŒÒÓšE͆«* éBz¦¦iÒgP>UEMUB¼ÁöÏséÿX[#Þނ錢´™µE»ù¤“}Ñù™çpãÙtв¿O¡*åš(ʯ‹Ã¶ø¢J\Ãú:Ež?Ž®ëäùÁ9YC’«ïÄ18ÅpˆØØ/má<Ë$0H“åÜk\Ãy@‹ÏÙïS´ÛˆÍMH²rsjš ÈÜQ¥¸³)“9Ë3e)4[°¼Lòð!qÓ´(BæåM,ªA;šuÔ_tý:Åþ>b:…²Œ] `*Ÿµ*}^,ø’,+Ah¢VÿRJ«7ù¹@®•f7o¢Ú6JQ”QÛf¾³K_=r“+G)rsòä.@gÏ| V¶˜i"4’˜’&æ°­¼8¸ªzðqšÓsZ¤yŽçû†‰mè'Î…(ãîyQ`œ³ •ü($Š천eYåøAˆ¦éXg¨ìG!išÓh68ú­üÈÚŠÓUÓЀ(M04ý¿¥î|^X# /_<Çb,C§@!Oc&3—á OšIÖÙÝímö&S C§ÝÑÓɘþh™ÑËCWa.>çþ×_‚F³‰Ój1Nèv‡(BFò$âù‹ ²<£Ù”ðKÓ4±-Ïs¹ýÖ] 1=ÇbßxþŒ§Ïž£i:ýá€{wïž-¯ ”‡ß}Ã,Hø‡?âËÏ>Å :N ¡é|øþ{oÔÔv¶6xøãÞ}ï=Üù„-ìf“wßy]S_»8 ùê¯eîzº†ªëèšJ§¬¯¯ø×ÖÖévœKI|BàÎgEfE–•‚$‰_Y(o‚¾hY ¡ç²5žq}}…Ù|ÎR@žeh†`:Ù—}¥)¾ïaèE–£ Ìœ,OIÓ]5̈78ï^çºøžašDa@'X¦ñæ°æ¶Ès¦{c677ÙÝÝaîE¤QÄÊÚÚ«ècÆÃ÷<’8bow—0ôq§S¼0aõš,Ç¥kjÝ_õüI"«ñ ‡CÒÈg:sÉM“(Žñ=4NÉKóAÔFø9TÖ…>]wŽ*MÛâÅóçlnn1ZZÅwgüëŸÿL¯ß'KV®­ù>~ü Yäñ¯ÿþ¼ó¾‡ïù˜Ý¶ Ûªâµã"}<ò ËrZÍÎ.-CžòðÁÚ6ÍFƒµë+56@¼nÜ… K²¼`ÐëòüÉcž>AËiáû¶mÓï¹s4Ma¼7FS4ÜùŒ8ðÈ’ÏóY÷ñ ü„&Ââ><Ö@ÔΪno€Õp0u§íTd÷dYB'Ìg3œŽ$æÐ ƒN»ƒa´ÚMÔr(îûF$_ežä\[¿ÁõÛºÄTwû zâ8AÓUìFKòôi:ëö â8¦ÓíÑlØ!pÚÎÁí¨œ²ïêòÓ²¸{ï‚Ý´ê ¯SÝ– ŸéGÍDUUîÞ{—(މãø0×Âk€)ýÁ€0Nq:mLSÇ´äû©š~iy$ÕU7 >øèCœV‹0H³ÏuÙÛŸ0° óÈwÏk(åͱ´´‚çxAÈÍ›7h·Û´œ6¾ïÒh¶P5 ]×±,ÉØvbCãW¿þU¹Öº’ÓkǺt¶^Þ|ÎxoŸ_|òKú½.Q²rm ði¶ú%¨êuk±ú›¦|üÉ'tÚª"XY[—ÆD}®+˜–‰¦õyçmƒét‚i5°L(Í‘yˆCL\‚qz‰‡À1ûî„ Wr%WòßK^!ˆSñ¡Ÿd[/¦Ëð‰8ŽðõXÍ®&–P”csÝ«^«šïâ5¹ô’wQ;ÅíOQç®/¶•U¸ýs¶sqh–eÇÍÂ8ò¶(PËø¾ïû²”{ã!íN§nh:™ÐtÉ8ÑlµPÌfsœv«\AeÙAŽeIŽGU£í8äyö“š‡ÇòX<áž?ÆÖö.í¶Cœ$´šM\×òL’$FU4Ò4f2AÕ4ú½q±zmÉþƒåUÖWWɲìôžø¢@ÕTÎwß}_†Ë3tC'C:Ý!ª’ªS$1/66 Ÿ^o€¦©X¦M«Õd6Ÿòö;ïc[F :i$PÁöÖ&3/(¹<þùŸÿ@zÊ2Ô··àëû_°±3áÿùŸÿ7[Ï™ûiåð»ßþFÞž'´£* Û[›|ûÝ|øÑÇdIÀ—_ÞGÑtz½.ï¿ÿ Û"/oœêð\Ÿû÷¿Âó MEE×5Ò¬àúú®ëqëÖm––†$Ira2 EQPüïÿõ4:C~õñ‡|ùùghVS×QT Ó2¡€µõuÒ8dk{‡0H²œ_þò—X¦Nšž}Cȵà‹Ïþžò‡ßÿ#;[›<ߨ`82ŽXY^.!ȧÐhK-óë/?gg2gØu˜¹í¶ÃÞxÌp4bãÅ3nÝ{—¥~—û×ãW¿ýMKçëo¿å½>¢ßí iÓý1;»4L“ç/·ùͯÉ7_ÕtøèÃÑÊÃù§uïB"'‰cZN›Ñp@ÅØ¶Eò™Î¦EAE†N³Ù,oNvÛÄ4MÚö«ˆ³Óz–óÓ²i9M\7 Hb¼ ãÖÚ:Y¦©²?Qä¹LDR4]Ã2-ZÍ&–m‘“‘ù™–ÓÁf´;\ßgBV(deÀinLQfOJÎ=‰%˜Ïç4[Qš#òŒ(ˆ¤ ùº6‹B:$M“ ð }»Ñ@Ót”ŠA瘾ó<§×pëv‡È÷˜Í]„"ð<Ÿpš-™$udœE¦iL&û†‰ïÎyþü9V››·nóäѾúö[ýs×e¸´Œ?›òÅ_rûö-ZN]×Èóó=‹¤Ms‰Ó …Œ¿üåS<ß'Žb4Ý`ii$5¡,ƒ_Q”í„q‚(2Â8åwÞf>›2ÞÝe2ÙgýÆmîÞ¹ÃtoU×ðŸ"7JSÚÔ–Ý ÕncN§L§Sâ(b2™"M“ZBûICÇrjÎçó¶möÆc<ßC(­f£ÎV…À÷™¹sI·†%ø®@Ñ4œV UQÉòEQkV E¿Àk7`­Æa@EL§3Ú­Fƒ$IQT…8–óÙ|†eÙ2æë´ËPäE†¡›hšÍoî»2ª:zzI,Ñlµ Îo:DÊÏèºÎt:a:Ñjµ$‡b1›Î°Mý^2zÜ&6 ÏsÙÙÙÅqZ¸®‹ªr*ËKKÔ©× c—¦ii6™$qL^¾Çt6§Ûëaèú¥˜UŸš¦ø>9•ªw–eضçºÌËthÉi!(p]×óh·; J¬Hu …HQI’' ‚‚] ìÉbÚm§]ªÛ§›û0 H’ 4ë÷{D‘¤P÷=fË¡Ýv˜M'Œ÷ö%͹€™ë±¼´Œm[’&Ë£«4¿Š¼ÀõæXv“á ¨šÐß{ãWó®i¾ï×û»ŽÌf3ƒE‘ºýŠ’ùGU•Cì/‹Ž­ÃŽ’ü\(„RŸÖªª’çù#®>½Ä¡çȲìHÎyq®¾è¬[´]ÏÓŽªj%B5«m\Qr&¼©ÍjA.–¤ZÛä“D+s»åx)¥£ŠÚU9‹Kº}ªç¬sC¤ãÊ—UsZýýýëêœFûä„6Î[çàuóp±w¾|màUF RöÆ»Ì]UQ°ìª*ˆâË0ðÃfY…E6TÑËtIÛ¶ ûѤaŸï- C¶wvꓵí8%¹MGˆ’äb‚¦ËDÃ4e¶›ª’$ Ý^¯†|ž5Ü2›MÉò¢®>t(Vr–v¦vÆ{\_¿ŽïÍ™»>B@£ÙZ †>¹]ßsÙÞÙeõÚ¦¡±»»KÅ ¨\[]yeAUÅKŸ={F—HAEÁ4t|? ßï#„„W[%gÃECQUlksÃjÒë¶yñì)nÒï÷év:õM} 5æ¼|ùU3X]Y¾À¡/Ÿ~o¼K’,/ˆãß°,ÃÐëø,Žàéd_úòŒýÙ\jÃY†¦ëlmnÐéô:¼xþ‚Ñò º*ØØÜbyeµ®Úä{.aœà´šÌf.ý~—/_ é&K£áÏ«Jq$ P9ã¾ýî{|Ïgu}^·KFeX^¦â ö÷÷QUÁ`H†’|›ÁÒµú8mˆ§æÃ|?ú‘—/6°6ëׯ£A'(ª ‰Ó²*mÄd:a8ZB ¶Ý Ýv˜Ìöi´™ÇpŽJCûã]öç¾<.ÀÇ›¬¯­³½½Å÷ßýÀt6ãý>>Ä B¸ží­M~xøËnâMÇüù‹/¹{ûû“)½~Û4^©Æ…< ÍrrâT†¢ò¼ Nb¼¹Ç·î–áªËÉ€œÿõÿV{À?þêc¾¾ÿ%Ýá2»Û›¸~ˆÓjÇ ò ;åÁOhØs?`0bèêÙiÁÖê§ú#»³€ÿëŸ~ÇîÎOŸ¿`i´ÌêµUnݸqªÛ|kò×Ï>ekwÊêRŸ•½ñ.Ïž>ceu•Éþ˜÷>´Pò”û·åwøgœ†Éƒ?`X6i³iY¾Ç“/yƳ;üË?ÿSYŸE¿ßG;gžÊßÔ$¨Uº<'NVV×ÈÓ˜(MéF؆Îöζdã5-!Ð4oµ FƒŽÓÂ0ôEÖÚ3¾e’ĦÅ[wïâys„¢qçÖ &ûûÌÝy™mÛ$Ôel[UUZ-§ÙB7utóìY‹‹£7€fÔ¶ÜyE× Þyçò,Áu=®­_§ÈPê)‚R˜–E§Ý&Š„ª²~íº®Ó9¶èÉÄõÖ·è÷ºž‹ëù¤iÂþT:L¦SW½¬Kh6rûî=â$e>w¹~ëׯßàÉ£‡ììþˆ¡ËlÄ,ÏÉÒ×óèv;tuãÜ; Ò\ßg´|î áûï¿Ã0Lº®„A§gA—Ÿ ƒ€^„ÝpP4{wï2ì£i:išðá/~ÉÛ·ïn³¶~AA’¤8í¶¬µPdYŽÓéÒ÷¥#{y”㺶eÓl¶´~^²@ >ÁÐ M+Óñ %Î>Ib‚ ĶméeFF„P%>]PÓ‚Ÿ·ÒIa\€*ÏnQµÇÙ2 |?@×uÒ4ŲltM-c«Š¢{WÎ#MÓ.4 qKÏ|’à¦i’Dõ4U“²4ÁõdE$Ë’Þe×uË:Ÿ½(qE™·G~Ðh4jzîˬB“&I ¢Q„B^äµ-Žã°EH*oYéÉ’’. YšÖ„#óù\¸hq,×£¡½ÚÙ\Ç)–eÖ¦K†è†Q;fßGÕu Œ"Ç9äø¬ÈC²4%Í2¢’^ßþÙÑ‚¿RTÚ,—ሯcãyƒ*~)ýŸ±êá?”CQÑwŸò¨ÖOåƒI“„QkŸy–‘fYY$§Ì)™™+äƒùSùgß¿ _ÿT‡À"àX€%ÖuÉÓ UÓȳ”ÉlNò@Qè´ÛÌç3|?@Ó4Íf]VËugtº}ú½.yžÕ Å)ÂfÎêòøÉ<ϧå´Y ØÙÙÁ²›di BÅÐÆ{û’éÆ00 C7BIzahj½NB’øƒ‚'1›K[=ŒbÞÿ½²ÂK~ªX5¸/Ÿ³µ³Çûï½ËÓǘÎ=,ÓÄét¸q}½>dŽMÓØÝÙáñ“g¼u÷.qèóbc“†mÓrÚ¬®,ÚÈUÝù(Žøúþ׸¾©ë„£i„aÄÊÊ I’0évÚò?'Uõâfš&_~þW¬V‡·nßàþ—÷ â”~¿O§Ý‘™f¥j.}< [›$YÎÝ»÷0tµV½O‹¶,ŠEÑÐT…?|§¼ÿÞ;ìÇìO§´Z-š&†-A7'¼g-׉"Ož< " M°;ž0 Iã˜F³Á³§O.¯±º4à›o¾åÖ»˜ºÂsëöú½.BÆ;ÛÌý€nÛagwŸ7Öùñát«Áí[7ëCã§ýUc|´Ô mýÝÝ]â0âÅ‹ôClÛbo¼ÍîÞ”å¥%:ŽÃx¼‹ªëôÓIaž7G3-ý>Bä§Ö®ªS8ŽcvwvIÒŒÙlÆt6¥Ój±½±P…ŒF(*E‘1N醨B¡Ñhâ´[ÌæS–²U,S¯³³ÞtÚVõ*Û{cã%KKË4[ŽÔDN™Spð9Á/YxüøÛ»û˜†Áhy…ëׯKÚ¹“ž˜N'ìíLF$‘'KQ Ašupñ&WU•$ŽÙÛßGÓu|oŽ[†ÄÒ,ò-¢ ÄqÚ‡yë/piºNx|óõW(¦ƒŠ ñ][¿Áó'ø¯Íz½.žçó?þù_ðg{üåó¯X»¶ŠPµ2ÿÿ<¥Ð%,ŠC¾¾ÿã™GšÆÌ¦^ll2ìY¿~»oÝ‘ÚØknÜêrR…8 ùöÛ¯ÙÙ›±²4ÄétÙÝÞâÁƒ‡Œ––(Šœ·mÜùŒ¯¾ú »Õ¦e›ìïï1Z^!Kc,»‰Pã½]^<{ÂÆæŽÃîxŒÝŒHÒu,]«×æOq7Öµº½~„Ât"ãÖþï“å}úý@ÐÌR,ÛF0 ‹ÎÚ5,»A£a¢éf­NU5ɲ”¦ãÐét˜Ï¦ØM‡ë×Vq]—ÉdŸÈ´iµZ¸óƒÁ,Ëètº´šMI Þ´¥ÚgV)‹"GÕt–WV² ÷¹ÌI˜±²²Bžg¬\[c´,“£ºýª"Ȳüµf©ã´é÷¨ ÌBYnûÚÊIšºýµUUy÷½÷é´ÂÀ“´à¾ÏÞþ„N§ƒ9aWID— ‚ À÷þá7¿#Ž Óä½>bii‰VÓFÑ ƒLŸµ VV–ŠÂ`0I1çP‡«÷Ž£„÷>üyž±¹µ…m7y÷íwdm@Û®£Zâ´íÅ1wß~[e-ÆÛ·n1›M--áû>£¥Ö×®±½µÉ‡~HÓ¶P5…^ sQL£ÌžuX]YEƒáœ$Ié´;4v­™þ¤¡ÿã´¡* 0™Lh·ÛÒže(ª†¢@’†EVöy5€‹6Ðyì›E¸äb¦Z©­¼¾…hª"sª*4-ø H¬Óª*+»@VÏZÌ¢²Õ㋯•ïT9»„¢È“¯ñT0Ó*’P™Rš¦•,çÇ Íü1‹ï”eY™¢­½)¾è"ZÚ—ÿàQHÓ¬ö©Ä±ÔâÔ3uŽDJåû”QDzð©ªÔ¾“Óún€2%«µ£lî^ù†ªõ_EŠªv³Ò×R­ßêß*xrZBÕ«ˆÈOéX\£¯äX¦Åt6e0œÙºH¾@‘Ÿ;ÝQ='CìÑx^(ò"‘ÅùÀ²Ç‹,>Ûiì¿×¨'%“Tìuct™¹Gû”y êB©ƒâÈŸÒÄ\Ì XüÿéûMá½ÓÌÙQ2ÅtòÅuqÜÜä¥Ó·Æ)ˆÃÎÊE¢œŸƒ¨Ç]8«Ä¥dè‰â¸Î"ÓuÀ÷k¯f] DŠ\zGÕsÆšëA*iµuÃ Ž¢:I¨št H2%Y¨¦×i®‹“u^À"ËÍEâãI–a™&aIæQ9ÂNÓvžç„aX–—žõšä£ô®g{¸®[/¸Š”"LËÂ4ŒKÇÌç3’4£ßë‘&1s×Ã4MƉ7|•ÏŸçkÏu%}ºi’¦)v£QóÀA€ªjg¸®Kš¦´ZÎ+žò꯴ ]׉GyndQËüYÉ!(°"ÕÔ—/ž±?ã{s²B¡iìíO±,ƒ,‡á OàûL¦S4]£Óé‘¥ KKËLöÇ –VXÎ¥†¾Ç³çÏI’„½ý)ƒ~Éd‚ªJ5¬ÙjÓ° Æã=âD¦º^K\wÎ[wßF×Î1]€ü¾xþ?NyçîÝó fÙÝþcâEüú>áé“GìMftÚmzý!+ˣ׆e$fƒ‡?>æ½÷>Àïóâå&EÍV‹÷Þ{c뾫D!_|þ9sÏÃÔ5TM.Ì8IX__'ð}ÖÖoÐë¶/ <ŸNxôø ¦mÓj¶øñÁwlîìÑíti·å&Ò4M‚µtF£Aø¸žÇ|>TîÞ½sƾåtùžËƒpÚ¶67ã”A¿K†8ŽÃþx›Lüão#iÁk*¯ãß%ŽB>ýÓŸh¶;tÚmZ­fi~IÆà¹ë²ºz'`‘A¡IDATØmn^_ãÛo¾¦7\âîÛ¯5…øyW ÐÃa’Fj“Éþ„ÉlÎp8¶L\ÏeggLt;Ý2./o;YkN é*i–žø`ˆ‚étÊxw›ÙlJ¯7 ÏSvÇc67·¹qófiKÆÒÆ –!JÊ,!5í|'­i̼àâ2Ea6°;£”díV›¬J=£PÂRÀ<ËÙÛE>¡ïá…)fÉtdSì"I„¢²vm8ô™Îæ(B& aRde<š‹CQë:¢é4l›—/ØïqmõÞ|Ê¿ÿû¿Óï÷IkZp>ùbÎÿþÓ§üâ£_ÈÛššò3/GQHŽ Ù°ñƒ¥å2ž={†ã´h5[ܺy£^ oZ†Yš¡h:£á€gñÇgÏi9-?Ä0 Ö®Éð­;w‰§>NÓ®sÿ†ÅÀζ^%ÐÂuç´ZMæ®Ël2%ÍsºžçÕvQ«å…Y^ D¦tÚíš› ªúù!Eë¹xžÇd‚Óé¢F±\!B¡Ùh0Ù—„ 5-¸mA™¿o7‡êÄŸE¢($Œ":íÎ…twg›élN»í0ŸÍÑM‹~· BH(ï +¦¾YgS66·èÄ¡dªQ(ªÎõëëǧÆQDDz\{(+8{ɔÑh„iHöš*ણ€›Ç‘d·nÞ$<šM‡À÷ØÜÚDQ5Y¾Ý4ÑT•v»Cà»ìOft»TU£Ùjžió,Fmž=}†ŒFKôº¢($*£V‹n§ó†wññƒˆ¶Óäå‹ÄIzÈ¡¨×VWÙÙÞ$GÐi;lnn1-1¸ôìß[N€_Ñ‚_É•üŸ ¯Ð‚çM?ŽÈàuÄ ñr Dé‡8™PãÄP_q@ñ|^Ê¥EZéÚC½àÝ=K;‹!££°ÕÓ  +§g¾@5}Ö(Àq•“óRÔÆC´àišÕaÛÓЂ_”kÑ¡Y%O ~úw©Æðu¹G±Ž®“ÊÑwøÏEŽ¥¯^po<&É2L]g6Ÿc–é½’æ8$IÒ:³L×t4]#ËRU«É&Γ  jY”ø>Yžáû2‹-Š"EE &BÌfó’¼@7 ´2î›å¶Ý¨câgᨠÈi–‘$1Y^Ô•eNcãUÉ-š¦2N˜Ï]ƒ!aà“­f“$Mi6'Æ‚ë(Kಿ?¡×ï“D®ç¡( ºnÐn;¯¼ªª’¥)[[[²¸ªªÒ§áûŽãHò]Ç0Œ Ç¢«¾ Cggg»677žãÒ„j·šµ¢6¶6wQ4^·+i¼„8³ PÅÔ÷öÆd9 ú½C|Ž'…aOj¯*û=ŸÍHó\–úò:%/„°¿·OÓiÓj6ØÝÝ•hMeîºtºÝšga:™% ý^ùlJZ®£¢ +ÿÔ¾‚iÁE%Mc¾üâ Ò\¡Õ0™Ì昺Žëù }LÓdo<&Ís†ÃY1ZY%pçØ6wîÜ*VÎzËÈExs¾ûá{†ƒ!»»»$q„ëhšBØݶÃl6ÃõæôúC4EÅ*Ù„g³)o¿û> Ë<ÿZu›lom²7¡+‚©ëó›ßþ½Lîáb "R}ï¾ÿžßü¦ËÖæ›Û»äYŠÓð»ßþš( Ol§¢'_¤¿ÿâ8¡Ñrøýï'߯¼UjZðÀç믿ÆBtUPEB™óZðÛwX^nÇñ…’R&Ãüñ?ÿ»3äן|È—ŸŽÙtØÚØ!°,‹¢(¸yë6qè³±¹E…„IÆ?þö·˜†&iÁ…8WߟÿåSö\I²½¹Éó— ‡CF£¥2}ºt!(2¾úò¯ììÏõÚ¸~„ã4ÙÙÙa4Zb{ó%ë·ïñî½;¿ûýï¡L…öô1Ÿ<ç·¿ù /žFò±œ³Ÿ àXZð*'Ö0L‚™Kf,†„AÈl6«óž›Í&yº®á8 lÛÆTUjÉp?³TOMÓ¢ßï¡i+++ÌgÓZœ’¤)žçÒëv±l US1tÛ’!(Ó6Ao.äyÂÆèôºxaHày´;tU£(²ÓÓJ•ÿ«éwïÞCs×Ånظ³YòÚöʪŠbÍwgtz=’0$LÊ$ž*íT¼Cžç —–évhÁ\ÏC( Ýv­D§]-øt¦Ó&ŽC666iwûܼu‹'ðÍ÷ôûÌ]ÕµuÜù”<äÞ½»äH’óÒ’ !ð=ÛÐùì³ÏBÆè···±l›¼X®¹^÷ºU.Høä…ÀÔ5Ò¼à½÷ßc^²;{wîrïÞ=D‘±ZVYvgS ]#Ž#Š,Å´, Ó„"Çóäø•ÓUü<"'Ò‚[–Ål:%Ïsü@ªï×›Ã0M²T•pUpU“Üë jóyì¯ †A UT•ÀsI*(©¢`èó¹¬ ”$ ÍV ÓŒ,yU)èkñ›ú®L€$Ið}ÙlŽe7$7Â)ìÉ£Ù€žç"•4‰÷pÚmœf“8I$@æ”á"-¸ï{ŒÇ{4[M|׫!ÙšfÐëu¥à.šqšb†d. ‚Àg6wét:’èE•ÅB.<j·R£-ÓÄó˦2P× ’òÝ÷%od¿×=óZYÔÒ4!IdEêñxŒ®›†FP&=É8~~ê¹ÂPjUEAÇt»]â²B–ï{4-§Å|>«Í¬Àˆ^¿‡mÛPšaÓj5qç3„ª1Ž(òÒOpvžÙKõÙTkôU(p™ 0 9â…BŽØVGÕì*¡èÌðî#ØòC¾€s?ô\eRË¢cë•Ú€gYTB©oÖEè³óȃ«(͆ê`«nþ×U,Z\Š¢Ô|U:®:¾ªO]£/Ë‚’C¿Ê¯œS—Å iZ½Éª?³,GÓÔCóY•ÃZt¥’?k߯Ђ/ÔEE ~BÐÅêÁjÉyq`Jí6I’ºNF=×e®@åèS5 µüªÊ2îñ%TbºLÀ±´à§ ¾aw_av,/ça"ºŒçzÝxe øñKëÿ 8‚£žÿÅþ÷f¥9Z³¡Þpœ§7ÑxŸ—l´:@ÄBäåM‰f§IDû©Ù€Ž>ç«Õ…Äýon¼$ËÁ*!·ÍRuuZiáz¾TëJï»ÝhG!†aÕêóN¦7Ÿ±½»Çp8ÞL’]èºihìO¦õéoFùo²ŠO¯×G×/ÆåW·Ô5õBÔÕ»;ÛÌæ7oÞ`¼»ÃÞ¾¬£ØnwX^½ñûž;gsk›õë7ðÝ“éL‚›•õõµCgð"ÏãÇ £]Sªô‘dà…‚–㜊“ð´óå{.[;»8-˶Ð5½$ìPëŠÅ‹8ùËÜBvw¶ˆÒ‚µÕÂ0Àó|l»ig>t…ìÇqŒRäìMf †’\7 6_¾ 3±4èóôÙ3V®­!ò”­mnܸQrîîlãù!ëëëìîl§9×××~ÀIÏ £ªBG|ùÅçÄ4,ƒ¼¤qij/yëî]º6;ÛÛ¤YÎÒòI²¼ºF躘vë•Õ.J„×óàÁ^¾xŽøšÎt:#Ë3®]»loíÐéõiØš®ÓïØßcÚM:¥}{ž¾Üù”?úÍv—ë××èõûg¢¯$ð<îß¿O0$M^¾xÁÖÖ&k7ï¼ö¨žeg{‹G?>Æ´(¤Ü¿ÿÝnŸ0ŠFe)´ÃœaðèÑ#Y²­ÈˆâÓ²Ès™Xå»’Ü.=󗌢€/¿ø+~˜°¾¶V:Ä(r¦³ë7nññGpêXêú.òŒOÿô'vg>øýoïìðäÅ –†K¬­­qëÖͺ¬Û©næ"çó¿~Êæî”kË„j0›îóøñVVW™Ï¦¼ßê°³³Åþçò?þåbªß|ó-nÛÐëú_}ûÐ4¶7_Æ9ƒá†e^„iþo*šT{¤3iie…ýéŒ~¯‡ª(Ìç.Š®Ñrš˜¶É`4 ¢®^ZÑlµp6…PÍñ™’i…ü¦ÕhÐvBe}°F’¤X Ïóéöz„¡ÏÚõu„"pGR‘ë&¦¦¡ªâìýÖ®û’jJÕX¹¶†¦ëض¦&NÛ®@ T…þ°¸è¦Áû~€e›´:í-¾8.€@`Ù6íŽCšÅgô ÓÄjÚ%“ÎÂ3-DîÜ»G¿×Å÷\|ß'Žcö'Sì†M§¤¯>ëû¼&ÜnZ|øÑG«×o0JþøÓ´X I“˜¼ÈŒkñÆö‚0`¸²ŠÓë#„ÂÝ»÷˜Nö0l‹$Џuç—ܺqƒ½½nÞºA‡è ‹á°/ÛW$­å8,- )Š ÍÐqLý 7E?ƒ 4úRû<×£ÝrH’´®o¾˜½H¶XHž{±pº_0Ó´Èr?IJ$vqÐt ä!ÌJµLÓUÙwQö}ÁEzBQeƒ†­Ÿ«ÈÉsÐ ­öºÆa„¢jh¦zêq0M³L?-‘jªŠiŸ€å¯Ö¼ràeÎâ” dÈQ«Ex™ÙÀe%d J2•ƒHPKÊpEûÛ\yEVÚé75û4•¤d':s¿™ÜÄY’¡ªS²8“ãWŽmÆu6M2ì†Uk§µéEBQäœýÌ2†f³9Š"ÍéBù”AP®§¥fÅ9Ž'#;²/VÊŸ‚œ²Pî 8ò<9yýÝ¢ü9¯((¨¨õM 9)Ù…Ú©Æ£ @E¥ '-²×.Q¡¢ ê9X¼ËŽ8-ö)Žüääõ—v‹,ÎÇA_Eý»œœ¬ÂQ\"õúbßÕ»í÷,kñðËu—‘Õë½ê+%EAAC«ûSPÈHÉ 9îªPëq¨¾W퓟Çý/Ç˹‡€ŠPø,ÿ ‰ÈP y E¥å 䪦’—´ÈuõSE=tPœu2zôÐÐØI¥ê(äEq¨¦}'¨º^{i«*¬ÕàžXRMÔ€{ñÐU½†±žéB$g‰%ÜÌeÆCÕk;³¦Š*Çê¤qŠ!»é® ³eyyy‡BiÕwRRllÚ´ÙŽ·É”É;¨*I$ob]Ó(Êr.Ý|  ì±GR$¨B%KR²4G344U“G‚!êCí"!'Ç¢C‡b‡Bä”WTÛÓôQ­™Cæ¸xxrC'©Lo7*.giŽnè²ÀIž•hÄ DE!Wµ›—¼Š*?·êþ)%%¥G!C´X×ÌŠ”ïž|Ëæx›V³…a¤qÂ|êѶ ½Ã2(òwî¡iv«EŽÓëàÍæ8ý.ÝnûÔ'°‚BPXÂ&»üùùg WìoîQT,CªF§×b¶7—*že`Xš®a5,ü¹Ïhm Û4I‹üÔ·Œ(Oz•&Mžm=áû͇|ðɇ˜ºFVä§ËQ/µ†Œ ‡§ùvçï|ð6?>Çb CÅnµ¸vsåÄ *"¢ÁlwŸŸþ…›oß" c^>Ù”ã^ÀÍwnJ‚‹²OTDtE%|vÿ/ìú{4u¡©hšJ% W‡$qB©ã´ÈŠôÜW±@#9u¡ñÙ—†¶É[7oðí7÷‰âœN¿M«ÝBQUA7 Éò'L÷¦è¦ÅÊêIq¶ø¸@)Žp°±¸ÿð Ü(æî2Ý›0ÝŸÑt𨭆ýÚ5Xi Ð-\\¾yò‘—cè‚ýñŒÞ¨G%Ø-›Í'/é¯.3\îòðˬ¿} SWyúð9ëoÝ Óq((˜îí3ŸyAÌÍ{×yôõCÚ£×Ö–_ÑšÿÞ¶LŒ†Æ€A}hiÕ BÁHuv¿ÝUËŽ™ìÌ茺d³KµP…ÐIvc £ÀÊ ²8E±UÔP Ùµ(8]&]¥5èhD© Ù‰x±ýMÕÑt•7QM õÎ5Âíµ§‘ǹ!A7Â%R±L‹„ôÔš€@ªPÑÑ1…AÇêâèMrrÎlF’£¡bä:áf€?ò™>™0Û÷qúm¬õj¦¡«*ù‘Ñ©nKdšíg$“”í~›¥Ë´ï¶Q…ªùqðW¨ç@GCÉ`ûÛm¼qDo¹C§ß%G<ÿþQMÑ8}ŠyÂÎ7»ô;˶A>Í)‚/ñ0›6¶b³·?¡Ùj0ÞØ'%0/ðRmMGGÿÉLÊLÓÑëqˆR(  nü⺢¡¨ ½õ!q¡:­N EñË]†-ÎÒ ƒV{ o妊¢k¤$§Vä %´¦AkÔB3 ÉôâùÜîÞ&MR:áë³ÜY!Ï2í&ÍvCƒ:Š!HHÏdûÉ[ ;Ðl•î²´ÛÞ`«wˆå¥‚›+½µ¨£ÛËt®%Xm¡Šcíøê0ÊEÕµhZ æ„qDkØ$ìv ¡¤d¢ôTˆ\Þ*šÂúëèÔOHâ„ЙíÍiôšèËzC#!¥ç÷ÕTó•“1÷þé=¼ØGoÜøÅmº£.fKCX¦mÒ-º èMƒÑí­aK: ‰ÉÏøQ¿o'Üøä-Ö‹„ñÆ>fÇæÆ ED-ƒB¤äõ8¤T&JǬp‘Bšä¬ÜZÁŸ¹tVz„žOgyÀ¨?d2së—·0[:Š*hš˜-Ó”f£ª› Öû„nHwµKš'4Gm4S/ý ü¤@5w‹Ï æóyÑ´š<=åI÷ ‰’ Ò¾V…Bšg‡ÐdGËo) ¶øy*"b…tt^æ/QéHÉJ[«*>YQ7×TØçð9œd¬±Æ¸ã ·v¨U22®sy>g=tE?o®|-'šD¬±ÀF¾‰"äm»øùE;²²Ç[´2d“Mbâgf!©®TåBstœÙ£G»h³-¶IHÐÐJõ¶¨mòÊ¿’“•Î5åBŽâjŒ›4#6ÄKyè–·¼ôê\ùÖXcRL˜  µ~ÆêÆósÿÅÄ,±ÄÙ lÕ¥8ˆìÍ÷0úÆ+“´¨.-zEÏâpy“cÇÀ@A!!Yð,—1ú…­~{Yíª]“´ü9o–ZA…ENNRjAGÛª¼ô'ƒ‰Yoìã›GßYF ÌRJë ˜“×ó¢ïpŸ9: IݶŠZo˜â#ç²ú–ƒˆèع<íº8:÷•翊 T¯~—‘ÖXª:òqp´¸NÅ/ªË”ʉšÏr´RËתÕѥʶ³,RÉ\ÇÙsÈÓ\z7•c¦fA‘“å¶má¹ »)ñƒXtg;¡Aä…DqLËvÐMíøµq‰óÕHl9$ºr9í§yQÄ’¦Ñ´)²‚<ϧÑFÑÅñ}‰cæïè|ýŒpsæ?›CéJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äJ®äÿTùÿ9ÀöO×…IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/prs1_60s.png0000644000175000017500000023714712412506713020555 0ustar sergiosergio‰PNG  IHDR\r¨f AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs.#.#x¥?v ³iTXtXML:com.adobe.xmp 1 9/2 2855 0 0 1/3 2 0230 0 0 0 False False 0 2 False 4 0 5357/1482 0 7/2 2 3 0 2855 0 37/10 5 1 3647/2301 2 1 2 NIKON 300 300 COOLPIX S9100 2 Adobe Photoshop CC (Macintosh) 2014-08-25T08:23:57 2014-09-25T11:00:25 2014-08-25T08:23:57 400 Žô{‰@IDATxì½Ù³$×}çw2³¶Ìªºuë®}{G£±5ö H@eQ34=Ö˜z°Ãáp8¬Á$üàp8<~°cG8ÂcË#==ž€HŠI¬К  —Û}oßµêÖž•‹?ß_Þ `8’ƒ’*»ëVVæÉ³üÎoÿýÎIçfÇ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3Ì 0ƒÀ 3üÛðþíK³+3üfC Ïó#¼>úþð€rÏóò_ø,ŸûŸåÁÏÆþ逈žÏ'`Tú”._¾\¾ì\ñáüðz 2*ÿéýß}$3 üÝa7{òc„À‡X8lŸ‹ÎùŸPÞÛ úý ðç=Ãñ¬ÓÉãF#­O&É`°–ž?ïRžËø|¦5‚ø‘xÖô/Cb?"t=ttnß/nl§K%P.—ªAP*A¹×íVJœ£î›–[®T’$­LÇÓƒx¡R™ Úíø¤s u‰ dŸU³`Æ„N³ãüsÏ=ç=óLÓ»|¹åo×j~½\ö×|ß î}‰øvۇʃédRN“¤’g¥j9 ª%߯eYVõ\ÉO’ÄùY>Müt\ö¼"—ËÃîx<¹°¼3xÓ>‹L`Æ>Q¨ÿÙëÌ/ªò"øf³é=úè£Þ•+Wü0 ƒ^¯T–—ƒx4*µšAOèÛq\ ¿T ÒrÔª¥ «¹, '“IÔëö£½n¿6N³ Š¢¼½Ðž4ÃÊ ì]\€RÅëæAÐÆãQgi)>¨ |Ö˜ÀŒ|öhîcñ/<ñ.^¼èW.\ðjëë~ /é¾1––Êå ŽËe4÷rž¦’î•°æ—3ß/ÃÊyæW|Ï+O§£j¿7¬u;½°3Ö{cLý ¨×jÍZ©–*Õ óÓxR/»ƒµ¥ön=*íäY¶ãÊå½d2é5Ð:˜ÀùÂ$ø,1øXÉá³Ñ¸ˆþ;ú·Šáz/¾ø¢ßjµü*ýÁÁAÀwP©T‚²|Rš”’¸\*—’r––!zÔøR©VÊsªáæ¯%Ói¥ÛU»ƒÊ^ç z0™V¯ZóªQTëõJ­V‡‡ÔqïÕòt$É4K’ÉØK“Î|Íß9µ¶xk¾YßÈãl Û`7ÎónÁ:0óæø¬0ølÐà¯u”¿(åEð!*}„J€JI¥‡àù”¦Ói9)•pߥåñ(“ã®Âó|çÕ<¨ÖÐõC—çáx<:ntkw/Üïôj£Ä¯ºZ£Ri4+Ð}ºj^®@bóGiš„0 þ=B‚yFŒpœ»ìMb»Yñ7o;¾|£]nÄi¶™ÁêaØñG£áÖÒÒäÂgÈ'0c¿VÒøt6ö‹Ï(M­Çöö«ÕªP>ªýjWãR¥Ô.e½^U¿<Éój™ÏÔ¹îûj Cõ¿†“®Š½_Û?8€èûán¯WïÓ(.…QPƒÚë ª «Ø —§•4™¢)è;­y^Vͤ-x^%wy‰¾øy†±äßyýÜy{Y2½U¯x7ά.­/4ë„ 6r?Û‰³¬ûþ0ý 1øtÒäG:ª¿‰àeÇw É5Pë¡Ð×Ǥü0VÊ*=íw> Iø Ó4¦q FáÞîn¸½PÛLB„|è#Þ+õfT Q¥\ Öò,©$ÓI%K§å,OË~îa!¸²ç{%ÏÏIøÑÇ•Ñx‘CÈ þ©ï¹!åHÜqYºÑ(ûëgŽ-_o5ëëýt:ÝõÊåϘ1€”T>•ÿ_©xfÇCì5Ôúj\-IÊ㯃î±áQÁ‰±UË¥’:¯aã‡"x Æq úýhg§[ßîv¢Ýî(¦Y„õ°VŸ«ÖêMÔúj˜9ìø,«%YZË“X¡=Iûò¡t‘CèØìÐwõh+±¡y’€ð?xŸáH§i»,Ї~…m&PÜúÙãK×›së©K7Ó©(4 óé÷ HEš3ü›@O†ÀtMÂShneeÅÇÎ.þCŽ;Bn%ȼò“ʤç®êù“ªç•ªëÃÞ@U!8ѼôÝhsk·Þéõ£þ$¯ç•0ª6æ¢Ú±cáR¥Â:ª¹©õIu4ìWRÎó¢÷r1¤¼´‡èsÞs~ê2߃K è+åÏ'¢ÏuŸ¢Žä÷hYÆ]diÊ)…¹àêKøîNÒüÝõ­<;ž¹V#òàVªä^c~Þ‘Nìä„ ~*“…ŸÙñ‡À/Jø¿ŽàGxêCw„ÍJUœwù`?@«—£­ Ñ»r U>Dõ7µ^~4†»N´µ½mï÷¢>L /£Ê7碰ьªµ(¬J­—g?«8èªÓ$Æq'õÝáp%.ÄXJ³¼•ŽøŸˆ›>ûω˜Ôû_òõÁ*¨@Q 6&ŠÖ)ªNÁ©çßˤuà[\ÚhøÞúÙµ¥õv{îul2ÖE’ º½…ɧ5D8cBÏÐqDìßùÎw¼ ØìËËË–xCÂ' ßívÛ!ñQ®†|Á·K#¾Zɉ½çÏy"øj¹ìAì՚Æϼ, 'ÏG[;{ÑöÞ^´?ˆ£4@ªcÃ×[ aXo„8üCD4Ÿ`ûO«8î䩯¸,/§YV–:OŽ‹u佇rýqηÑ3Ö;‚ οÜÁìôhi7y$#ˆoî« =®3=ù€CПRb#èÓH‡;Û^oF%ý¶ÇÖ—æš7XV´é»ÊŽçÝiÓ¸½=˜À§/D8c†"Ÿî?"ú_$xÅá···ýz½nžz¼âñI7)¥µ5;/#Í‘Ây%Á+1U+"xbòP_˜¥Nw¡~{g‡Ï^´7F£ÌJá?…õ¹°†5¢ú5œ|hq ^EcÃ+Dç•¡Iw|–•RÔz®KpëSЬ}Õ£¾§FÒ¢­åËT‘`ÇÑgd®{z˜+6©b ªÓÁ~k¹ '…¦<:¡¦>}è2¾m¢›õ’ãŽ3ǯ/εÄ6xjGŽÁ©ÿédòìø”A@8$}¿oÃ+,§Ä;ç$È$¥¬Fò|J‚ׇòeþáaÏja9´$ˆ#DÕG¤Øö{Ýpww?ÜÚÚ‰¶º½h˜¤‘_kBë Q½ Áã¯Ç"e«i–VQï Ëá œLIÃÏKåJ•o¼õ²É³ÂYG»¢N p©ïФ$»è´GAõ"m•ÒeþSX%8á¶aÜ@j‚s€À ÐXìý±ëºÁ@¼Ô#œ€J0¡áË :išïàØl–‚wž9y}~¾~ƒ /ªl{ý~—œ…-~ª4#D(gÇo( †£yÔ·÷œ{ÎÛ~vÛøá‡QéßB¥oø[±+5Ó&®!D‰+G$¼RjMÊ㱯–J^ ÿYm„ßïvÃíÝÞúípko?êÇI”•‘ës-ˆ¾ Á7B"}ÄßýmWìxèéžÐŽÏÂ<­Õ±Þzyè u^¡yõb¤ÏZËŸq*ÊÖ$ˆü‹òí#Ó¹E1e¡ÚSžŸvÁ˜NIþ!º—aàôW- ù æ€1‡ÜÑ'U޳(cøÞ$Oó!½a@¾í’x³Y-¯ß}öôõ•ÅöºË“ ØÉŽ+•:I·;¤êO ˜E„o¿a‡G*ý·¾õ-õÜRkeÃommùÍ~Ó_9çüæ¹säÑo#å—Ñ_³RO+1*xxÕ,›Z 6 ŸZˆ ¿iVQék;·vý½N¸µ³ÞÚß;ýaHÊ}T‹æÃFëX¸Üj‘´Ãs™Uè§šÄq‚.C§Äå½2†»–ášj §¾ât9bX†€¹g®|¯$vA´‡t.¢¥x–Šà!vcœ3`©ûÒôCßNø‰?&M‹Ð‘ü°‡« DŒDeíÙLíòD¦>RµÔugT/7;“‰{ëÊ5Á×-ΓUL½ÜÏçææòý}?¿xÑåHäÒott@Ðû¬šG'ú`àßâô;‚bö…?BŽ_íA“Â?5}Ø®]°vŽîýu-òÀaùïxÏ>ûÓNÄ~Ï=¡wéRÈŽ¯×§|¤nJ5ÔzC{eÁWÓ4#´F>}Ƀ/±gFJª¬‹Pë£Á`îBèÛ[[µíÝÚ^oÁ—k^TG¸#åQëËÕ‚ª¨Ï˜2í*PtÙ÷|³áù.’n zF'¢B£–þM~u">®ˆø?€Æ_¨åœ€ÂDd€!~ËvW9ýI«.¸‚1 ý±:(¯Å!' sñtŠ&Ñò¨š.¥BP!1µ¥ ÄK¨‘vˆ zn ‰vè÷>ŨzýÂm§¯·çÈô¼›i.Ç`¯Ûh4øPb©¿ÑK‰ v¼Oç×D$,y‰¹Ï2Ó¶wõjûuë–Á`uu5'ÖM–j/gbóo~ó›oήv?ÔÏb‹/³¶Ý¹_lZ›jë™gžÉŸ}öY÷Ío^¿Å§8ôÜ/zéeÃ_ºt)H[iМ6QíìhW¡jû¨¶¦•qi©^ÁÕMzN Ï'°ÄlÿúGãkð‰¶v÷#ÒlÃiæ…UœuJ±šóµJجx¨õ,¸ÃL s•ž¶,Ö ú¡*|%eÙ‘x#*F«6*—* 3b.¨Ò„·$qBî”| þ&bD àƒ† 2ô€©Ú_)Чx¾vþÒ“ü1Mà¨Ni0>4ò~8'Üǽ„ô i ÀDµð¼êP‡¥_øšï„«¾ÜïÒÙmõ¡^—9°4?w†7Ò_ŽÁ9Ò†™€I‰xþøýq"þFôôo×É÷¥ü1QþòòÀcÖ‰Ö[>9楸–øs®IÍ=7®–²y¯‘ Þ¥Að^ú{¿w,ùÎw.æÒ ~™‰ñ ? Ü‹„×Ö¼0|êP5ïûåÓ´v9â<©’8•râåùwVÒ7ßålp‘Ÿ;w.Ãw É5¼ííy&á<ÄQr;\Œ'ØðH_>8®ª~Õ¯°zÏk^ /{’‡hϵ”ôZLÖmä›ÍèÖövtõ8Í#Ÿ%4µF=¬DdÜqZÂ@s¯ ¼êó*l¦S" géµ@Yv‘.#11¤Ñ Œ@3r~Lº?  4 ‹Ì -û'b׿÷1ŽèE*µë( FÌ3(ˆÕ.ÎQ:Ó€nîIÊ[]üÁj8¼_0ì{ñ¢Œz£‚š0¾ôQÁüâ0JLðH (CˆÐm—òìæB½º~ïí·_k/´®³qÛÉK¥nÓ󆻻»Sðì7’ 0üßôÃ¤Ž©ô«CšZl[šæÍÏ÷}̹ ™8ËÿdK8ü\)ΩŒtÕj@ú) ÌåB.'qàb7J' ɵkýéþþ~²±±‘þµLüB@ðGñôw½(ZFRK5ûÓú\à`6ÚØ"I2ȪÌ5}_ËÛå„÷›~Úô]²³3ɪÕQ–4y©WòÁ±\6 úHøI0S?©øÓRɇ Ñû¹v¿2[)Y‹“4ŒÇãZ‰¾½½ííìÕ¶ww£ýN7ÆÔþ2‹hê8öÈí±B¿\­úØ=‹:ñþ{6|n„— lX’žä;‘ ”/úVæ­Ý ,5Iª"QuHÒŠÒŽ¤¸_´(*Ó™ˆ”~ íÄ$¸ !1ò³8-ìpÕ©r²åõÐÂUåU©ˆ_~¤8ÜÎêTÝꋞ³Êä$WÐ:J´¯ëÒ¬1êåI«N|ÌZ6ûÅOhwÂïƒÇâÏÉHo.·›×ï9ûµ¹F´Ó0&P‡ Ð×Ñúújü裶³Ð/%04‚O¡™ø:˜ÀÃ>Ø&¾„” Ö7½~sÉoôF™ ˜{äR©ÇI¹Ñ—Ê^¥?%¯<™b—Q•KJZg”І¼d ÏôËå°ÇýÑÂByüZe?ùÃGÿPv^.bÿ0“ÑÎ5²ÅÅdz½Ö¡¤Î‚^î—€þ(Fmd‡ÓVRN ²ZÀ¾5` À¯Dþñ1¶³‹'¸šý©—"ˆa )cdAŒjϘKc‰¿W}|%Lò4LãiØöÃ}Br»,‘ÝÚÚ7ùôú=ÂuÓfêdÚ5„÷#­°ÃKIP*W¡[ª‚à‡@6è§#â"obàÐ:(ïGÿ }Qf—ˆa¥‚à”„¯‰IéGžˆ’UÉ{RÁ©‚úðçE|‡ @O[ѦQ¸(Òê<$MãV¹=eNDˆ[ª—êÖÕÞ¾E蘾ªâKUÑoêサÉo5ǘŠfõCfˆžä`dÚGŒ%Äh.؇Wmã ¼q|iáú½çÏ^oEÑu&p3ÍÇ»,4>†7oÞœ²“‘á ýQ“ŸøC£þH÷#UØ{ê©ö¡ŠÜ÷××]ÐhÄ~-4AÚ‡#m‡ÄõY…–BÙ’"ÐÍÆ¾ óÀÀðˆdpˆùåéxL&S0µ<"Ãõëy?‹³Ž«Õºù(xÞx’¦K‰Ôó{ïunkkÀ^t0™FÁdjµ5DO äPδ<™嬔U !òeËHêR•ÄÖZÙÃyæù—2¿Ó<7.[½,d™§½é¤FŠ@ÌÈ–¤/8¿Cð£ÁA´»OâÍön„ïI‹Ì»N'Y κj­Ö!rײŒ†ïyô„ùJJ–J "±Ž1à”ÓÉŽœ“x.œ÷ÊŃ) 5ÄP `ÙÝ’ðh ꢜBl\°ßTa„øÑÁµTGDI ê7j¶RFlÔoßöx¡–ój%ÕBå Y¶º÷¤Ä€Dà)1k@÷hK$¬¶D亇‰ÄÙ!óQ?T—îZ}Ü¡  >úÊ?Uømlƒ•Êž|}žÜçîN—›'—Û×î9îZT)­“š´É ¥ÝñxÜ´Z#÷Æ>1 ˆ{’°À߉ؿùMçä4{_•ï#e[c¿>nùÓ¹=¤»Ï§‰„Ÿ@èD¦­ÙÈUp‹Aô^'v¬_%ÍŒuN" +Цq}:Ž£†xg¯ííw+;{{þn§›œ9ÿôéÓµåêv#Œ¶¦^²›O<Ô»|H†lŒÖOjä¼Lba½Å¶¤æÇvø˜¶XêZrxʉ££µüª.ÃÁ–…ãÁ¤&OûÞÎ~Â-Kkèt²)¹°ÿøþýñm§OŒ¥ P p“ÉÐϦy5 zóúÚÖÎn¸µ¹Ñߌúýpšd„¢Ä å«xè}‹áC®,ÀaÜø@döÖ å ¶<,•².IäéY™ô;Ø/Ýž[Pžn!)•‘Ë0E,“ü~Zôhçü1¢ƒ‹Ù£sˆX±²|×¼ï,Ù5b¦m#2ÉFÕ¥ß"OýaÔ'øÐaä«Â*oþ1‡#¢†Ði/GÛb(† ‚q«NñÒ¬4 > ÷ˆ pÝŠÀT—¼Ø<66U¹ŒŠ9ËÒ Œ)×'oIæÀ«’ÖO­,_¿óüékQµªý6™ç½|4êáÛªyRÏ2C—³ñd:½ëî;Ç_ýÊ3„Ÿ’ ýL°Û"7ÙÓ~T^Z^­¾òÊ+µí›7k'Ïœµe´Rn@R ÄŽ~ªjã xÒ@-À·>BËð"Y ô^Ûê„u/™¦¸ºñŠ—´¾†Ð#ý€X IÍ¢y“Äb…Ê^\s ] XÑßœpˆ)˜=Í 0ºÀuIf&L$ŠMQ6åD˜¦%¨ì¡SNõ©Â#$TI~Åâ9å£T5*Â6žQ\ã¦ÊKN[ìžöÔ¶4GįsÓ™¨‘5Öúß0>Ö6õ)cPšX\–'b â0æl êÑ“=1 wëçO»vç¹Ó×6딿%&–J½¾›öòåé3Ï<ƒ‚0cšƒ÷_ ü@žù&*õLÚñª°Nì˜\ÒPs`¿§e/ž–ðWüZ^¨ôI†ß[R¾\ezÉ1g h¾?ÖúµN¡×Hhá|?”cŒMᢜ+¨Ã¢bòj,…©È_íâIê~ûÿxwumms¡ß<{|ac4ïB«P ytÈuY¼ˆUTg×Áh&,…ï“<£Ù=9à,Möà ¯Ð[(íC ¡£ødÈùJEû –OÇI?úØã2îâkW. 7…ëPTWŽ*kgo«¾ðW߯Öý¸º¸rææ)½¶ hÊ0ú9„^?¤^`/Rœõ¤Ë‹0QXð$@·cEÚY1¡>½Ù…î"zyWð~c •E™=Fø”„[P‘•‘" Í Ðìr[B™ 昣1»%JçcmÉœ8$j#}]WSvMÕˆ+Є,b<ˆÊ=€Š""Z=&€}ÀŠd #kUcL!¡}æ#MÁ²?`ª†Ñ»²Öö›žÁÄ-pÖúŽDù˜qôxtý7Kyrãî3§¯?{úî“ôüûœí¡’b2¸1»'Ÿt&ðkÍñommM„dØÃÍröÊå¸jžy#ö çºrÓË•Âσ”›•*juî[KqŠ {ƒÚ’¶{0ªí±ƒÌîÎ^¸ Át;5œ`µ)Zâ¡>Õ@î*hÁoÇ곤6!7]¡.¶Š POs¿Rfƒ™Éàç—Þ¨¬ž9]êNâÒ0NØL¶Ú‹û%¯#9=™ãÁ°Úëuk{Û{áΖ<í;áþþý žN›å ‚B– /ç˜YeÔ$Ϥ˜ 03ÒÛDš0#ð(H ’é»ï½;e/ËDñ'N@.{ÁdØ/õ†ƒòcOývùÿý“?.WÃf©ÑZ(aóƒ¦DæY1ç£¼ŠØQÞY„æÃ J¥Á ‘Ác,fJ@,’À%TcÖcl$bô®ëGmŽ@]WߥEÐC Ñà€^ iHÊb´P˜-Bâ-r/F?{ó½uÂÆAvû™SìFÂâ7Ñ‹äz@ôçïS¢Þ}‡Fúk9Œø±ñ_üú×BkÂ9ç,E±”4OBrÌÌQÆó ¨¡£ÊóÍ®®¤¨Nkýî ìt»µý}ˆ¯Ó©± ¥¶wpއc4-8Éñrç8Ã2´‚„PYBz*>i±ç$ bMá.­+g­¹6‹„>„;HÇé4NKQïëÿặ°´´ÓÎ{;+óÍÎp8à#À†÷vvöÊÛ[Ûµ} ƒé#Õ•a' ¯AËdÉ©ýPÍÑR´¦ÝV¼±etV;¨Æd­v°KEX±ÔCwE æø$ê”JK0)‚>÷Å`ýÚµàg?ú_ý;/|‰è]ÝŸÆÒ.E´¢’Ú–ƒoWW•ÏV›HQs´#XIeú$­À¾%HâBT>jWøðS´¡j™¦MqR’›\“Unå42¡zìØ“HTA±&t±¨ôC$‹?’ÖÔ¯‚fì/Ïè§¡ŠÙ{Þ¨OíXzPÒ>Ô}[[ªUì±ëº˜ÌÕM»VuS‰ÕÍ.÷­ß8 {ѱxšƒ#&ïæ»ëeÉf-È׺ûÎk·X½Æê¢›xno¥£QÆ Mà½nàצÈÁ÷ôÓOûý‰¼µkÁ4m¤¬O©4«s„œæ`¾ v~‰†£)Ä5¬õú“*Ž:Ôø½ÚÎÄN<›ëÕñDËJS“êL_•™ç“+ÝÕ6‡Ì²X1=¹ªùf# üÌ8‚[*àØÈBÃZ›Wp¨¼Pj:èxï¼ùºwì·ÿAéÊÕð¥ý¨}pÐïíígãx¬ÝdH llþ@‹f˜ FÒc!™(07ù”” /CØOL|UÂ)ÿD´t¯À?(^b(O¦ ÒE, ´Â±”’ Ò²9ÿ2ûæßõàÃÞõwñö·¶¼åµSf»3fútèÀ¢°!0†7€£üFL‹9“M@S¢:(-@6º¥çsIõ(s.`Gvé5â{!¨¼ê8ì©Ý炌ÐTêÎl7ˆJÁµvìyF… ]T£ò2¨‹qÂ6¨Uƒ‡Õ«óö­£Ïè 8ZÔÅ5• txX;œ«w”´õWç µ`|"pÁFõS/竦CÏéŸúÁeÙûÒ”8çš42Í…——Œ˜%à2=xTt#LÒìÕ7/KH//áܤäa²ÿR€÷°nàÝ -f–Æ?1ǯ‰䤵>ëij#©°(¥_wåJ ýqi0,uzã…ýýÎ<žñ>DÒ¢ÞTãx¬¤"G•sp|Ùžp•8cжВ4çH¼Ô€”ÍK<ÃÔJ@†`\‚rÆLšUÊ XÊlDÐ$‹:²éÄUغîò¯ú÷<ø(ûWÑ‹¯\7ë!›I¢eØõ‘ÃlÐxR>òá¡Óä°6g”.¨¼„†¡ÅfÒÑÙ  MPH õÿƒbp.ž$é+Õi †!ÅqØõö·¼ÝM÷оìýÙ?û§®17ç¢Ö¡*/„fœ†?’ôR á%åD.& iC*8i1\O;ÁE†:C0µ[ 8t ºÕ|…§ôŽ/±2êAp~ž›ÒŽˆ>‡ÊGž6ÊÈî73šs#nÁ\·Bbô_5£†ËŸÀ yš£àÐÜ‘¤–ùaéæ¡=xMOëq:iã Fc6bê›Æ¦õ¼H]Zƒ]¡ŸEAšVYú%¦(¢Hñ ʲqIÉ€ÙŠá³ X€{ôS´™-åÑ$}í­·•a–®¬,àoÅh`¦e«óó[£çÊø¤1_ `Ž-¤Ç×Ki³ZeNëÓ4Yغ¹yìgo¼µvm}wgßÂx7™´ƒ•>±½á€0’=Sœ$;’–….Y‚JM´×3¦s$:ðÛDx|4Uà-~mè_˜3³Dt$­Ô!a oá'Йv$]woÓ¿vùÍÒÒò þÈhÊCJבÒNcìVöBFPÙS¨ ŒBG4šSû8ÚhO¨A_é]>qÁB7xRN1òN!r©Àæx£[ÒIpÖYYHÒB\z䮼uÑ=ôù§Ý£_þ=wùÅï¹3w=s`3žaÛÆ9Ô¥gDœ8h_!çú’”¥7ê‘íèº@¤¡ÃŸˆÙ<ß‚uŠøÐ0ôíj8ß1O‘ªˆ^á7¸a £Ý-·¹ñ€ õ†®‰±èzqˆqÑ„ÕɆ |óƒg¬§bRÔÍc|ërq_mHs|6sê7½çŸÆ¢²‡Ï·Ô8õ¬Ýã[ó¯~é ØÇ´2ú¦¹1@pÕ˜Š}S©o¨øðBÌ}yÈÌvQ[ºÕ¤/½y)y¢tµ~A`Ó”ìøñã9LÀ}Ò˜ÔñÑ ŒvžAýž°Ók­ŽÃi¡»½½úâO_\‘YBÓ ¹ku¨I݇)˜‰ÃX(CŠ *c"}¾Á9 À³Ü#寣a¾°ÐÒ6+R©00Ëé¨ì¥‹Fök@ÎR/&1•|üÇG®|ûÛßöŸ~Ú‘=·OÞ ®0^¹ææÍ­6ÙSKQ½±:šöMÆÃÅÉpÜ”óŒi0B†Àj”x“B ¡þƒ™Lè †òO“#—Z˜6­šBî Æ| Ñ 5¡\Š@óÒÎå!à&’7ØÝôoŽú¸§™Za­¡Œž¥Fý¡ ¨‹j_m€’®Âê¤Â}F¼Ê¶UUR%O»–©Ê!'b¯Ôneù˜k-,º8žºƒÎ¾ëäžMišL:lq9Þ„r²E·o\qË0ŠÇŸùºûÞÿþO\­YwÕz¼gPˆSÒÚðSÝÖa’W(›ƒî;R…@hˆM#g›ˆRZ‡Ú&ZWo ÒÔw»GÙp,­OF8ŒvÅœxNŒqÍš—´§N²¨ø¦oZ@¨²hò؃v…?&¤ ¦$xį¥jçú­‰³É³ ¦ÖoiRB>ê…T"Íú!íÈz¢çD¼4(ÉK‡ñ«‡:ðиå;У‚•N”$$sŒ™f §rMÆc:ÕÒè,áCÜK¹—\½y+Á3<}ð¾»§sQqB¦é3z|!;{åJþáAðD2µö?®?g þ«Órî%ó â(‹O¿··ÿ‚½ç.(ìWñc–· â³ÁD“ùnAmmŒö^ñØ&ãz‘äÑ'MÕMá©RáQ$‹Cc„gíeaòsëXFâ·™œCŽ® a !tO$ %=˜G~ é¸"aËôæRâ¦Sm¡ðœÊÕCŒñudÐ:œvöѵÃÂö\Œ_AÄO¨ ‡nJ–\{¾áº½׆øO¿À ý†ëím“8qQcŽò1¡¸1„­„2Åíñ@°°æÞyógîÁ§¾âîxüknóíçÝ©s¸J¹FýP[.÷ã’Cò¬WcÅÉG“õÓ®it0Å¿º¯-ô´PÌr=#F$Gtk’EK‹g™ ª*€d28Ùoú«š9Ó1[HJ/¦"þÓ&„ýŠ eÀkâ¦À`<f㟠ýfÅ}*Èâ§oìODúïA›"¦X5´®Šõ7ƒóÌaÔ$("s„ ¶6ùCIJ€7 Gö¢º% F%äý¿‚ Añ*KëB€,Xñ„–øƒ¼‚ÙIÞ¾²>­„áô¾;oOØ“íX¶úä e9™‚ÂFýøÃƒk@§=ýѺú'žX ËlÀ굺GhŽýÐûÞ÷Øo½»Íµž×n¯ùãñ~y4b]z2™z-¯\›gíù< [Z„šÕʰí±b-c§Ø?J •Ï9P7¤-¤³MÎ6›s$,"LC9ñ#›P}qE\ÛÞ Å”ÙÄi*eoCB6>¿ù¢|ÑŽÙâ¨Ý{ÚÈÃÎñ O1âüh0æ’T#ñ£è×ÕžlG¡ˆže¾Hô+"qCTBè¸ñdÀó©»pþ.wâøŠ[ßÞuûÛ›nܸVkÉÕZ‹®1Ý à¼ý=ë“$‘†„ëAÆ9ç0ê¾~ùmwáÇÜ»o¼àú½]×^8få§0õÅúJ@¤Bl!¬‚Ň˜f†Â…iÌŽÀÚR§8&D,PI Á rb¬4cˆXâ§ò>Úœ0ó€1èqà¦þp‰UÝ47ŠÏÓB†@p”H&0œ±›À$‡]7è웸˜LF<)sHZ‹ ÄÚ‘ µyȼ*‡‘«4Z®Y57¿È§íX¥ìG›Mi"Zá„Ø•‚WÌ·õØÐwÓ:ËIÒëŸ|I"|d!{Ý€p­ÐÒÎUm2èðHzHòêÛo'µjyz×¹ÓðR‡ˆ4£ d¤¿ä¼pàñ¾¿ñ³ÜÖGâÏ?ï‚ííRinnEi«ä=ŒÁ‘ DKvþ$f<<diºnÀì"Üv-$КÒb½¶+ÕÒöq½^«ÖúÕRe2ÖžLos-°N/$¬L¶¦Bø‡<&DòG Ǭlñ˜îkRuÓ<îBdI¹d–¤·SÏ*t%¤0˜çTœ0Ÿ!¿¾[HÒËy'é •U†|DðÇ{%Ý$ŽíÚh8r,J‚èR·º²àNŸ\æû~מ«³*H„™ºµ…–ÛÜÚp¯¿ú¢{âuvÑõ0ÂúReжv‰øÈ‡‰«²ÒàÖÕ÷ܱµãî‹_ýºû‹ñÇ. ¿Ä3m<÷𠘈 xðÎ<`…ô6€€´0(å½Ë»¯1XáàJIFSÆHÿtd—'EDÂ/# 6pQ †‚Þ"#NFðåKs—4«#‡A6DL¸‘rÇFÄSˆ~ÐÙÁ» ñ÷HйɯþkÞÅH™ˆî¨«ˆ’À€U±YŒˆF¥ý©+ß¾ÅV¾„‡ÐÂæ¼›[Zu­¥%×Z\ÂìB;Ð| Ÿ¤Ò3Iz!•41òbÿêçP óü‡a ‹ô1_ s+“Ä‘j2ÅNyƒ®S¿òäåW/Nq|%·Ÿ:© ?«¥¼(‹ñ|ƒ¿48"þFc“•vÇÊ 8›ÈDÕ¸×Ã×1­¸©^ì™0Få>ö%›o(ë %E2XGunï_!¶»VÂE$M‹œü:켊×C—Ç~@Эpî(Æk‚àÊâœò[ U4a:gŠ)bþ$×õAíÓ9D#É®CÎ7IÏ÷r Y C…³PŽ~ñÍê;TGðÑiÕm ѾpŒ4ÒBR|9ÑÐǨîñtlÄÀ‹­Üü|Ë={ÂÍÏ…œ·éU@ˆ‘¿t‡§£FŸj¬Ï»üú]{õ¤»û‘']%¬»ÖÊq·³µé¦»ÛtŒ1ÓMõ[ŒûDZ…ãmîç_s$¹Ów}Õmm¼íÖÎôÈG"ž0¬BÚ¡wЇ¤—HÔ4‚ºn¶­`,ŠfĶ¡)™V"p‘>Sè(469Q)ÀüH ê67%Ù¹V0g׹īªá6ÍR°ÂÔÇÃë¡ítw¶ö]4€ ý`Œ0Ui¬é0•üðƒ…Ú)ºs`~V_3&&#s‰‡m.õÀ°³ëz»;nëÝŠk,,¸Å'\{í$>˜¦Ùö<,Ôs:¦Ñ ÖGþÿè°¢âÁÂKÑ»„ž0¢|ºÑkû3f™°5  œ‹4ê´3'?yõõ¤V“Ó+ø¸x•‰ 4øXÿø0ñÏMÏTA7d©m#âš1ýj$¼Gâ ±p`­C‚P“Í6U9Ù|ãh´;™ëâ…ƒîdyg¿»¼³—Ï¡-„,‚«„lhs– ´ÅAœK¦¦‚¶M³$/¹àHí•WÆš™9/[Œ@HªC6¤êò±õÊ:ÙÏʘcÝ yàe“.’øSìðÑh€ Šú BŠðt>Bô#]CÒÒÆ<’ûøJËÍ·N»9¼úRC-"2‘»_ ÒNa1ùët([h'ÞµýÒë/¹cgι…åe×lµÝ±FT`ÙÍØ.>Ûü6:‹ÔQ“¯_[w÷}á)÷ÿO/¸ùÞ>÷AbÙϳ¤¬y³˜½)šI±4`1JØðölrÑÄ4¸.f%‚‘éi•ײBÞ§Ç|H ç:¿)aåeihž4Øœ1‹#ìyRÌvÊœhðìL27Á,êíl»˜ï‰/óIS$_ # ¦A]Ƭ4gV5# ïꚘ¼pGÎU6:qóÍEëÿέuçúnÆÊŠJ• "œ¬˜\ÃNÇímlºöÊš[Z[Csjæ mHÛ)ü Å`Àq‡iFü”à[ŒOŒì0½ ” ØcX(dÌ“¬Tu6Jh)H7özÉ_|- ?WNV¥øÀBJ)áÁüãjÊþáès¥åå Tý({spͶóãæy¾ä—›¨™¾RnI~šNý Fo—:ÃrwЫìvûá°?iÊšÃFn3ió€|ž7¼²AÞ”×D•+¤õÝî7 ÐÌ´æ`ò[< ç©€${¡šÛuÐM¿ igpE¨Ã5©«0 –ñAô|p™Wš:¥j3.sÂI…„Y™Ä—3Naê(aH«iŽ˜üÂ|u¾I•5“m± †ŠÇ+–mÒOÝå£þèP<^ŒÊ]4.õ ²Ký—!äG¾òûîÁÏ=mýìîï¸+ï¸Ík—]ÿPå,X£&LÌHðéÃŒÿíßu×ß»â.þàOܹ{Å&¦ œÁ& ›ÞZTûôCqz2"0/”Ô#D6f!-IeE¹<'Â?ê?Zcæ…gÅP­11ž•¹&†%³ÊXØ.I XÌa§Ð^_6þ~ÇÅÀ:AÊóÒ˜@̸p–â PF"©‘Ti_Œ—>+š#&¦>* IÈ1·rÒœ¢|Ø­.­ðŒs»hOo_|Žòƒíöo¼çؾœúä(úMŒ±ìšKËnùÔ׿›üj˰9c@2=à64õBL@s('«i>‚%\@ÿ¤)IÃ$ä‰U€››)¢s¼iÜg ±ß†[Œçƽ,þÜ£]k4¢ë~êo”ªþÎûã>Éßxˆø¹É&šÌì/³?]„ˆŸ#¬³Ä¼®€ì«ZI;M懣¸ÞïO«ûÝ^‰Œ>Â!ô7Ön<¤ãN+$˜TAVÇi7Ú¼N½u€‡æà…¨ãèíÄÞ±X“ã ‡Bk)BaÂxP’]R]8hÕ=L–R#écj ÎKi𳑒@ƒ¡Âu~¡Cؼ¿ŽÏé.µ‡ÐC$/P!~?‡”n6[8êæ]V\T«¢º£9@$GfD–úKݦ[KÖ'Ù›é—T#!± r•Wí4‰»qk×’¯ýÁâV°íÅŒöw·ÜÕŸ_t»7®™””C6¢õK¶±*1U@îû}ÒýÙŸþ/Žƒniõ4c„È)lÍa~¹±é~k$NKÊ&AÂU¥ ؉è9£pÁ̤U™™¤ç5ý±{…6%¸KrŠoÈY¦Hƒžç*ur]¿)/Þ‰?‚ ùÑ‚‡0߆/­e‚E„*i=E+4-\ C Á‚øÌï@_iëüý¹'Ÿùš»ë¡Ï»e´&åWÈÉ+;ž[îúÕwÜÿÕwÝKÿú»(©¤‹ÀlümŒô«Š=uÊ-?Î.ä ©Ÿ"| Ñ&T…U^ð)ú ü3¦ ^Ñž"Hsó“ëZ¬€‰u¼ƒÐ•úàï>ó·E^áGï¿ïêÃÜË>•uL£M¶ˆÚÍGeöp#öŠH~Ý; i:ÿƒþJü žÖèŸ:uÊ?ì”¶Ùpr:%sßÏ{ýþ±[›ûÇwÆ'z½É±n··pÐ6Aº*›nlt#3»¢æçØFN«áp*wŸÕy¬™k°‚m·YLB¨ÄŠ$„ØBxI-A_“%u_BF¿e'j’Eèš)…©d·ãH°P¤»T{='•Q6»ÔLÞ6‹Ý‰?è£Ê Ùq6sgY¯PÍ…µ’kÍ5ø´\gQ=¬rîÒ¶%´¥ÁfVÍ2(ú%&Åusq‘a ¸/"Syýf$B”C   iÄÐdçö`Bï^yÏÝñä×Ý“_ùš™ìþãn^{×­ãñ?ÀY(‰(É\eŒ#ü"&i0»ÝŽ{àɧ̜ùÿóí.Üÿ$È^wS”L€ˆ‹vB?5¤ŸœÓõÏaôÑÂ|ê“%x‹Éò-¢§ëVÎ6ÿ€qè·MõI*R“i(Å£RϹ"­$¢Ê° |"]`P5šÉt¦}ÉÔbå£E#Ò1áOækš°üi¯vÅðœ›jÈ¡|þË¿ ãû¼åA°4Ã͵—Ì|ªÔ˜wþ±êÓ´‹>¦ÑþüŸ»¿úÞÿãæ5duòÇæDšŠB¼öß˪[>}ÆÕ˜{ÍŸ˜£i€Q P×4^áÃ2&a,X‰éhÜTn‚ V›¼y¥ `E©‡g7½Å”­ñ±G®Ý{áÎklá´JÜ"}ì÷àYy?ú£Ð]içˆðµ©¦¼üZ§¿¼Ü. ûeXû_T¢Š7š÷òòrg¿¿ú£¿t¢7ÊOB«k Òd‰1Åâ{Ù‚æ7SA‚ŠH8±°ØÂùÀK§äzŽÃL*€+ÎÊb=lqöÑà‹ë"«Ž‰eÿ&¾ŒýÖÙkxÆ«¦ªŽϼâǬ%á6îëq>S–š 2‰!„5ßÍ‘I·´¸èš}Äþ=a­bD‰IcÄ]¼ $FJ‘2Ïg6Ðeaò«Ã˜XHÀ·î E`FL|ñ ¤3,æJ¡±@Ä Œü·ßvÞ½ñ“ﻳwÝãΜ»Ã˜Ùþ€~‘Oè7Œ•$ä"!¦"M¡‰íûÖ«/¹/üÖ×ܽO|ÃÝzç§nõø9ÆQ… ¤%ªª ¦ ¨ãŠÏ©;úpÍ"¬„Æ#MAj-£Ôìr¤7s¡D˜¢ÿhZ<ˆÙÆ{¹õ€ÆK•;EÄä kù …6ÀBD'Ÿ‰òêý ‹6aÎÕRÝòP÷ŒÐ´#Gýgåuˆ‘X“æÝ7æO›ê55»/ùkî¾uSL AoÝEÀˆ]Í]†yÆÖ'Œ]h›ÏÆ *îÁ/|³`߽󟛟/ w™#E9”#ÀJÿέ[æ‡X=}Úñ^Cú¡920#ç30+FaŒ Ì_é@P àÂ/U PX;‚sÂSkÁÅ˦é /¿šFQ-½ýÌé¬Rfó'Ò‚ô^¶Xœ={VSƒ«ê)l]~~tÇû @v¾VëiÁNöY_¯DnÂÊÆ¼VΫQgl»WZj«s­¹¼áùø~÷Ö^“ÚàRÄÃŒ9×ô“´ƒºÎ4’&¥×à`!SÂP\atœóŒ.kº™þŠöù˜¤1B"„€$¡³ûUñ‰d¿À¥:"ɽ=‹¡zˆ½g×”t#U_ˆÌ®÷¨óêü"êü¿Ë®)õ–Y‹S¼øBV9êĉM*ç곬žY/Iì5FUd÷1ÏÜ‘–¡QÇPaŠò,hô*aê0Qö²ê#“t‘¦T4X<ûaÓ-7wñåÜÊñ¦DM´‘Å×'DÙ›Rý’}¡‰pE  bwíÝKîþGÇ¡ø¼›öH(’“³LtÔ#d%‰fL‰¾å¨Ôº'‰&÷QFdŠG[Dlv½´1b¾…ðbü¥f\@ê¿4˜%lÎ4õ‚å ‹¢i ]D›Á ÷¸ÀF0þ8{þ§/g¼f=?}l5#ï>4…Àª[Œ£Ü%ù˼‰ú& äûÈIf&<·½÷îºË/±ü¶:ò󨜳auÕo1ŽEú°L–Ø*>Í5F}éuŽºÆk W!žEFN|›ï'† è½sìKc#~+ªàSäé&üN ™Ø[`aÔ´¸&ÔpÔ1‰l|áZ¨u Äp›ÄÇ•!'@y½ïv·n¹Íë×p€½ã®¿sÉݼúž»µqÃíá@ë+™† Yl/¸5RgÏž<áî¸ýŒ;}ê05˜€ ©ñ(l(‰ÞÀѺÞ︼YswÜy7‚ éΡ•Ñ£Õü:Šˆ”•5®d#…|ÙÍú/ÆléØhU˜Ã€ä¬«—^pU4™èš‘—üüå›(þ-kf3˜’ð xPFã#£ââCYK® .Ò|¬O‚§®ò‚!Ü.¸\I ਓ¡ÌøÇžÌÑc«+¦&%eˆòÎtrvxôôÖVƫ۵5µ}tG¡|^pÁÅ‹äI„!zúK[æÑ8ÛÉ$kǃñüA¯Ó>èõØg~ig¯»|0-³am;Nع°T6±ÄkX9˜M¦’£ „CL’DÏäK’)¾ÍÆ–Fô²áu®g…\¦2Á†pweȱݗy‡¨öcÙ]N$9ëêQÕ-ÏϹv«éZMÙL"¼Ùu€´u—`"ØÄÐ-Äi³WL¾ªì?$#€ iVz’)cßpzÏ9ú›)4‡Ä¬yW2‘Pd—ÊÖ—4V¡$£º/¡„F(Œ‹ú-É?¤ŒlKeʹ‡4LGnm)ro¼„`M¹ãý\¦’ö‘H™¨Ò"6ø›ÙÇbH""¤‰{óg/»G°Î=Môà:É/Ä»M G]ˆ+¢GªÑ_i%ÆFJ9"@IDAT›Íú ¼R“ªfÚ‚ˆYãJèL?UþÐÆ‚óOb„˹‘½=/ò-P“-€yWçW]cñŒ 5Ô^ƒåÒÀ¸?Ò]è3–Eò'Èh­.»ÿò?ÿÏÜ—>ÿ9dkÙý·ÿÝÿs˜†Å\ù–`¬Ì ߥ㞛ëxIF©DÙ$¿¶±³rscõ ?X âE¶¥n÷'M¿ÍÎÚ-¾[ì‰Îkuðâ“sK'ðÚpG @‰€«‰4d›•QéØÌnNz¦ìz!¤&€2²QÙÏâï#Ôx9ŒÆÄsõ=a&x沈Wñè6 øcØÈs²ß±ýBLûבGl„Ke”©™#!6ûla;¼é">MMq/s=üš,¹ˆ©L˜éhž²òöa óhbX"~iÊ@q(iE´R¨œ8 Y°¸€Klo-%å"ªð!#D _ìS"··CZïâª{ý­—݇s·ßspÂlÁ&írœ H–áµ)fCµÖÚ«EzÛ[hEïºÇ¿ð”ûÓú_˜C+*³ùà&§%tÈbäê·¢"ÖGÙ,ÖgÊñŒ˜›¹˜#Í!Ï2qØ%+!-TËÔ@$%®"Xh!~5b{C檵lLY›‚hg‹`ÅB4r˜ fN{qŽd©¡ûƒßû†ûþƒ?àÅœ nssÛ}ï{„ôÐúê müDŸxÖ|?àÙ ÓµPì4HÜÎÆus”Γ“Q…x{Cm²ê¶’®Fxþ¾Ç\gã-—zV‡”º*“¦GL[¸ÓÛß5¡Ô\X•¤`(Œ²ˆƒ½9tí.ÒúT’ Œ4Ê1.¸¿pOM3Àþ°¼TBúÆåËI½Å=ðÀ”æ½5¶‰ŸâÈNÏ^¹’¹³gAáÎЪ;÷ÜsÏñVÄí h“¼Ä m¶ö;­þðùåØo/Ukljs.AU àB3Æ :Q<FLœÞ/»ß6á`R$D€ƒý1É("GS0‡]d6é#„„8'x|-ºÒ?ÇcÔ]m”eÇ®½€+ó‘{ùÇßwÇÏž6†6¤'ÂÏ¡$åü ™¤þÒ3ŠÉn«¹·_zÞ=õ;ÿÐÝ÷ÔìÖßø ê "BT`lÄÊøù'»=­õJu©FÀªOü¡¨Wý–Z.º‡¸‘ŽlÂ>Pñc-4 1EiŠläÌ¥ C8¼~Å…h2’ÙƒùK@hHBo+…ðи&¬ià¦a|ùÑ/ºoüƒÏuözîŸÿÉ¿tßý—ÿÑŽ®[Yš§ÙB°È/0¤cì £Rÿå®»­ÍuÌÇy×l¯bF4܉S'Ýøî‘0€Á,®s«gïw7/þæ!lÆ'È/#F 'À_üJ[[PcmB›fêV´+¸ˆÑ™ð2Xðßšð_¦×ûtÀ1l´'˜ïŒ@ Pe0M¬®|úÒË'­zc|ÿ=wŽPWÆ£<'”–%·ÈÊâ]äÙ«R}€µ‡™ö†›Ñ ?ˆÉÆAHâ…hòYðJÕép²F¾û2›f΃(¬å·;z%Îka‚W §åèæè0 Œlvyêõ-)B¢‹WðÈ‹ØqÎ),W¬úšr3ÀÌÛé‰nmmÁ--´ÞR³ë¤’ÉŠ.6Ö“WLœlwI+ÃD¦E‡žÉÊ™êÓd©P ƒP[¬-ôÇæ¼HæHj¦&9¸$P±yf SÒ¢ž.™dCb̤â¹Ê¤G=gÝBŠ[7®»s­À(dXÔ€ö´Y€ŠI2Š”¾*„CT$@}nà”dï·º¼„ðy?ww=ð0RSÄ3ƒB ðq·ÂxЉ¥x¾séMwÏùŸÿìyúÚÁK.­¨Ó.í(;N’Z¾ i4|ñ,¨Ïœ‚Tjœo1 i>ÚUÌž÷ Áy“IÄ Ó@ 1bJ¸’§ñ+¥ZÉR!™4èìôP PWÌ AcöeîRßÄÝFvÞýwÞéþò‡?v/¿rÑ}ÿG?tÇ×–øÚ“&ÈDCÙeÝ„|¨s­–ëKƒ‡hö6Q"ÂymOx¤4c¶w$c³M®Åi·ýìGQ¼_sÁG8,e0» ¡âqü3¿LIJã’û–Œ]&Œ^ bL„$ÜT§`§_îZišOXBÌR(”T®MGl”ñü ¯ŒÃz8:w|øg2Æõñ8q/f/²Ø£È õëWÍŒ¼ûګhS CPž[l‡§Ïœ¬_¼ô^‹=úæA†–Ø l}Þ4ö[85ˆê Eðò£$–%<å=®`˳­A÷Ífï[zëÕÞÂrHP­û®~kà?¾²ÈäÌ9eÚI½g`SÀ&m”å«¶„ÓK _b1â3 ’XãL}€`%¹å1f[&µÈ,k ! › J«0D玤•W7ÓÁR}åa:Ý!jù¾­JîoáGò3T2F^¥Ë3ÔÄ¥ÞÙ¾ŠÔXÃi©` H žs³ÿÑ „ \RïùHb@0‹$‘L ÁLH~ ¤õÇϻӷaÓ’®*»¶Ñ $¸ƒf$Ô2DááÆèDÐWß~Û?}Î=þ[ÿÈýèOþwþ¯˜¿C»ýˆO‹«Š˜<RÅÅD”­~ BRaA9¡4p“O¤@f‚ò\Sû0þˆY˜ÕæEƒ“_BšZ£ìÄã‘ØÂ$ž–¨eÛed fÝøfÜsM~Ÿ]m™¦Ÿ7ÝOÞzÇ=úù/`jŒÝÎúu3É”’¬.}dí±jPË­sÆÝÀ̉šÔÂ+n…?í%ÌB|ÒÇ–»6»Y—CÊ.Ÿ8˦ð0€˜¦u×F)!#³Q*|ÅcWdHMÐF«˜2‰bR8§òSà‡/mˆk2-5¿EÅ|œd³SšÅäÇQî…pf²×9˜üä'/ê_ªŽŽ-·ÇTÁ+hâ$/±uæ‹/fl%¤†¤êüJcªQ^É(RÈŽ%M¼×nqy©\»v£2Ç5¦ŸÜfÞtÃÎ8ø*õŒ ƒÁ 7ÉXP ±ñQ›ÙÝ‡ÍÆ€Qi‰¬Tèˆìº3çŽ;^[±GfÓk‹%Õˆ LÜê¼Ti©dr¾ÔõUÀ«=]•¤–& 3!s†ÊËä‚p ‹cêQËÌ 9 yI'ôÎ z<VÙÄé÷”$Døþv÷±µ‘JOeW^$&^dÆTレµ(2ÂT[`#¨ÐwU ¢lol1.– ò[v¢¶ú¤ûlÔÉ1,©LÊŽ‰ÐRÚÆ$;³Ùœs·dÔ»Íw^rï^zÌÝGxO BÒ•vj8ÐpÚ¦!(c6œZò‘¼ùÊKîÁÏ?åæoÿ"ã¹Cð4Ä “€È%wdr¨uÍ XßOÅêÕ_1ßÂw“ÂÎŒyÆä–˜†&†ahM¾˜•ÙÔ‘«& ÓB«œ#Gù –þöy¹ÊƵ+DðÙ }ΑºÍëß]ŸùÙÅOá,¾íÂCî­þ{1f@Ñ_¢ÒEÔp8Æ\,¡ð*IðP"M¡ÏbþTJS©h‘” ý6å”o1c9€Å aë/4CQPc“ÍlY/[ÇbUu)¾vóæø…W^?ýù'ÇzmâûQaO±fzÀÙ³g33þ+4Œœ;·Oæ© CǬh`·«V3ÊdÃu:Ix´Ed+hóÄPM3¬á Iü´¨–ʋ絛 j=Ĥ4ʦ P‹aLÄ’;uz¢„SRFÄ ûÆkª•&µ¿<_#ÎQ´@0µ¤I¢MOaAÝž¡Kð#0mR) ¡8¯@9kŸŠ1;ˆ8÷ñø“ÄÚ7ÆþŒ‘B/‹qk`Z"yùæE…¦i“gEØ"Eêh 4Ū­güîîÜpÃãh ŸùxFRR|ßÔbIFúl„¤«˜ Š6Ì“$êh·îÖöŽ[]\v?û«ï»3çÏãèDŠ’PÃ驜^JèIj¨¤2µ 16¶3ã;pû{nûÖu÷ä—Ûýÿýåî©/aŽÍkÑ*°–¶$eSݤè®B~…'E"R~r™1ÓOù 47¶æA˜ÏH$55&q ›9/wt›úÄ =§qŠÁhY²Î”ò› öIÍ\½œºÛ/<çîÅŸ½àn?½ä®ýüM7O9j±õá€piLÎxµº²bsyÐÝ7!Âû]_@“ÜÙ¸éäÀk-€;´Éû&\a3ÂÅK`ÝÙ»v7.]tcòx'¤ÁÐ&Xƒ·‘|¡ èïs4íH¾"#d¶Ì*™ª_Ä/œlÄðdæjŒP°Pö‹:飦‹è‡€†=^Ü*N™¿ø·ß›4¢Öø‰'˜Ô¶ÆGÀk£Ò°Ê/ÿÊóä½wôG䎛æÐsIÒ~©³¤5^\jM7·¶pK0JÓZ…pBx0@9âø† E.²wR NžZv‹ KîÊ»×Qý7 *´T² ¥†²‰ÏH`eHF j…ÊI)¬Dëü5IÏ9XL†®lˆb´«ä€6q‰WmÙ½!¶;q×>öû§]Ì·Ökr|$»vÓ©à5–qQ³1Ñ4ˆ­Uƒ¼«—&hC£æšâû¼rÏ2øÔV¥®ìfî—§n¸Ûá¢7ÐrØßÄRM)+ä ¦þBg"@njhš¨ FDˆ²îH´hëú[ìôº{øsO²œw$]o§f%ýCÈ1Š8+¼Ñ \˜‡&Ø[/¿ä¾ô;_såßuW_ûKwâ4±^¤é(Œ]Œ‡¹ÃA'Æd1m™NÐ!,ÐB³LX°gð˜lh*ܲ±p‰)™éÃ!¼4EYIAÁJ{%h'_•Õôiܪ]ŽBIÍê}ߘ!À+X¾k¤Ü¶7§“ƒ`æ¯ÍOÿ_æUϨ*Æ Ñ©¼ ˜°I\W ä“&¿IYKâ—_ûÙ¸½Ð?p×¼«‚×Ò ’$ ÙS¨µœÞËã¼d HY=L=B"+ËoEX¶º€Gûå¿ü;w×½¶ÃM„fQ± qoˆA“~Y]ÆPôÇf ¯÷ÕË—Ü}<êÞzá'fâ„ôO„/ /¶®Å"TþjvéNS1ú£~))F̶°ñ…tÂYÁÛ¾¨ƒç´KZ„eRR)Äh" mþ‘a òdžƒ‘MA0Xò 4fÅߣ•î³RPéÑ}TzsC€ÒêØ@Æ-£ÝТ!ü)šãF§ul'ø´ÎÜp Þ¸ÁŽB0Ÿv»NrÔ’{â‹»›7®£Qý+öV|×½qÇîÂc±YÈ ˜ÃÍ4 †%MÊœy–¯VÁ?™FräÚx¹R,o¡ ö°«ÁXdÂZnÀ´}Dü"[I Fš*OŸM[â:4ÄÍ:œ@á±æÕõ ú-J[­k¾tj\¥JÅ|v¸ÆMœ“ ñÎnoòü‹¯Lšsõɱ…ù˜Ûç/AyŸÜ¯l‹q›Î{ï½×ÃIâ7›`5o°ÅNŒP\çÈškñrÍùý½îa#é´E®¿fðå(²µäôJ%IG³}!8ÙVB–¥¥#¦½=Kê¨T,¿p„R‚Fø M‰hŽ˜)6!Ϭê3 Ãq;„®^¾ì¶®^uûׯ¸!ªw>êPõ„.Ád”.*‰'F¤›]çžÖT±ß£ˆo>ÄF†Xº²µ'! @*¥êPbꑚ. Óliº'SÅzLßm¢!„þ`b[YpƒˆK…ŽÌ¤‚a"7xå·*²6Sƒ#ítº{„¼jîʵëî› (»RÉLõ9p@YuŒÍ¬¸'|Ib<óûøNn¹có1K|¿ìÓ’ûÉO~ c˜2Î=CÁM˵ëäD°ÿŒL¡ÌæB¯!ïž}‡\EÎ¥Íõñ?…h`„Í ²*›¤–K3|葇L`ì`ª[;ánÀ0ÄP´‚TÄmI<‡ó,¼\´¥»½‡•o<ŒÀÛ¼ ÷¥-ÙÆ-À]cþBòB+oßôߘ‚8Ÿþ a¨_õÁ8Q¤e4h‹ªj­¦ÃT¦J NÁIÈ1IˑώÃ5ä^’_ºt);{ö¬ûö·¿­Íy NÛ?¢(÷­o}+_YYÉØ†DñÁ$ÆØW1û›Çµ°’ òèÕGt"Gƒ“ä¶HB@ŸIՓݧÍ$Ô†x×åa_ ëÔÉVž÷ꑈ£TPJaϪ.;=J Ñ}M´”ÎòÇœ*”yâñÝrÒ"$Ù("W"Ô§E'z&`ïÅ o¨²Ì·ÊwsŽe£ìËךg­çMn"´’Ž59<çñ˦,cWx¦`…÷Z2øØ¾ÌÔTiA¶ç€$>*#ØCwfüeç°‡]ÊM%,Tnú,Ô@ªÁB˜|ÎsA0”ƒ X¢‘ÆTe«Dvjë†ÔÝvo¾ú‚õmñØ ’p¤TfIÆ$'Ô&6i³c;ù€lZ,³wóªë§'¾ø4k'^ÃñFÜš®ÁTšˆgJ/ÝbòÓæ¹Ð~ŽúÊìÓßBÚÉA¨¹A™ _8a˜aš„pKˆ¸ßßclxñA!ùÔŽ˜ƒ*cŠM ­Ý±»qùUªÄRl"ÀX+-=›E_ròN€QK}› ¡Å*Ì`o{ÇËn²¿ÉîÊ[0 2*!xÞÏ‚`>+n{‹ýÞ»æN²ßÂ]tC?KsÁV‚3ØÃ 1ðOÁÉ3çšWþàc¬_mÁ®-Ádò}LkÑ$ÇBSйL|Ì1 `>u›º¨OlR ‚½ÿ‡ $G¶à4Àò.ó YW€ªêH¼ V~vñòñW/¾u|Çkààr2ñÚXM´ÞZõüùòsî9u¦a,…Ó¿Ý¡‡é˜Ç ½< yŸ™*Š‚aR ’…åv˜úN€–´&G†Ù0RùPSâ âèŠ2í”+5Ž—XâÞáÈÓ6ïxd ä¦Ä €¦Õw$ ˜]$犤åê‹›zëÝd|0{à‡ÄAÕvØ„ÙE’A€Â<Ïû„A–ö†eÛÌcâžkñŽ96óhsÐ"+­AŽ=Ÿ ù%ì}Þò‡Op ~&‰©6É)""¨^;á% @ÚöžSˆ&\’{à ‹žÑ><,m,Ls0¸1 (ÂQ—µ w±ì†”—]&rdJFr-RñmX^ùþ÷1¶°kÙàra™þ×Éz,A<ò1€l ') (F]š+^{lÑ˯½â扑ßþè7ÜÑÙÖÚÿPD%íCH¬ÃælUŸyg¢x²Í“ð›ÿÅ}.ÒH]´£ë*™Ø·æP„¯ƒ"qäuÝ (!_Ÿw°1×à ýqÔUÆ1ßn¹KWºîæ;¯á íÜ…ôŽYÔ´n`*Ÿ õLã˜o…„ y¿°’=zþÑ{Ü]O~Á=ñµßwOþÎï»çîu'︟Í>ÎcBLÝéÀñî9ûî䙳–/Àö³$)UÁU`ŽßÂRÓ§Ì4m$£¥Ä\dÐÂAÆÌCâò³â¾ç2ø®Ôj12Í›VŸJrƒ»„¡ÙÄÕ'Ê£„' bð*ê¡.` ­Òò>¬–Í„ü@/³ÅÝOô/n‘áÈKrÒÕ—_zýø{ï^;AkÈŸe–L·+­JÃ]¿V׫åçžû»3C‡æP’PŒ.‚Ëe‹¨Íi£f,ýÍoބ䤦Bµ"T1°ˆÕÛF'B$’Ô­1vŸb¯³J|ÒLã'ÖÜÅ7.¦ÓúpeJ†©ZÕ§šø%b0à5×T!çjOįä&š4Ø]w°Ç¬±‚¼ôÛê‘Úo™n䮣Òï^›l™ Ìcdcž9vü¦[¨Äyw°·ëZgϹçýŒñ eŠ×ÿ†›’ë¯ÍE÷§Êîn’{Æ&³¡Íæó„ý Øôh_/l±°²1{˜ó¬þK¢Ëá'†§I¤ *z¡q[nŠP¼ /˜?Ë­Ð}`%ôåQúP”‘SÕpF¥¹¦MSt_ì…È6çý44!XÒ $½á$ý«Ÿ¾”ηZéÉcK(‡ž~.³%¾Ž‰E†%L`úÌ3ÏÐ]kW“òK¶Ý´ªlÚS²»ð°¾•·[­œôXêÆ¶¤›†/”¶í´…ˆQýœ½Y¤×u w³Ö̬½ª«º«×êÝh ±+W°1dÌØ¦ÃŠÊŽðŒF33zö;¡W‡ýä˜plÒ1RŒÉ%J”9"EØ7bë ½TwU×¾çžéï;7 %ÕÙ™ùÿ÷¿÷ܳÝsÏ=÷܈p@ Õ‚n·mDŸ=õ´²ºŒ >”N:à× «%±¦'ïa&Eè(ZVÉDô€~„ 58ÔÄT³ÚH$‡ûxËY+ç?8†I7IÈ,mhÒ—pæõ—aB6èïqÙΟ°ÔH ¡b>/¡aî~M|¾]R3sOFpÅÂ5fÇTGF½ã™ –..ߨ­GáQ h…¬Ý½ “³Ƴš¾ eœkC tQ¢Ç3ލ1 m“jYhi Á¼&Õ!àžM‹ ·Ó$ `”Cn[å˜âdj%½ìmFœ°"˜‚Å^ êÒ3&âÃwß`Œn§G¾ôߥå;—™ ìÑ7—X.ÂWsˆºb$ã^X¢×d5,Zÿ‚Kq±{˜ÕZ6ö'ÔŠ-¯"ðžaí&ÕX«¿{ë#ü˜Ù4Àõ„÷ æi1 ;þÓžÞzãù49XI¿ûõ™z‡Ië=5Æ´Êmà,ë-£Ì¶R¸]Åñ{• Ÿûù‚I)–ѹsçÒC>žfŽœdäïÀ:Å®Â>ˆÃs'Ã/ÄaDâóaº8H&f!t3OŽc!fZåQ}àÖ. 2ÜxÐ2 ²£ô»P)Jûp*#Ô=à) cžÓ*S`@!øUE¨T¥«x£F?¸wPÎmÃ-‡¼ †Ëæ–&Ç™›‹Ë‡_xùÕ£+ëÛG‰9L®¡Úœ@ Äìpÿÿg À¦¾:…ßÿýo÷LNžéÝÛ¬áïaØsœ=SdÀÖ Œ²Žîze?f  œ 8dM§yæMî̘J-sMJÏ2ÿdD»zå#‚„8ÇàæÜ– æ PdDÞbL!P°ü/”˜U *ھβžßO°ˆæÜ¾êÒq§à+F\GÆ .J4+ðŽÂ¾èe[nšÈDµ- JO¸£thĶNˆ ä}繌‡óeál0T?B:F„h‹{ÜÊýS-ØO¡^Gø„w†Ç²1ÑöN°Ëf5à9uöÞpl®â> ¥æ2°ÚJÀ¢²£o6e³*9ß[Ä3 àôºzér:qÏý‘d›k›l]€çÝB|(c·ÿ~w—¹WÒ‘'Ø8½‹ MpùCyØKq}ÌýôùÜwË‘ŽU(}vÅ@\+¾ö?U‚¯E£¥&2´LÓf …;öô¡èàC¦*û÷ lGKM¶Àýôo~Ä&žÁôÀ¥Ï~ñ©©?¸u‹W¤²ièÄi›,…C©\æj³Þi¡¼X–i Ãùø•‹Óã.]þàRZ\YN—?ºB ¹!Øñ¹Å^wý?~„vŒ2hô`R÷`!¸„,îÌSÒQ ùãº4–÷%’Ó?_b!R„Óg°N ÞÜŠñÒ2 ½¸BQŠ¿,ð> GpY‰Žš¸A $<'ÏI2HÏÒòj­&''1˜c‚b‡[‹™ò¶:ÔfÛzû™gžùT+V¯o}ík…·Š›}lV6#Ç >Æq’®M"`ã»»ÕöU³ɹFìh¢çôCPÕø„JbÊ9REg» $j4!cä ;*„38w»ôá¥Xz1‘‡ëï:Ä‚ÑdЦ ‰ÔЦÖǵP$|1˜l ZƒÎýwH8I6ʨ|2aöçùaÆ µ˜$ÓûÑW(0«ç¾ÍH›}½¤Ê§ nE6&[ç>¹Õç'ä³î²Ñ„gÎ…qæ`‚CTrÔ•9úKóÔeHç£Ög¨ %\0‘ÎSÁÄ—}ÊxÈ0zMQÔÚËTbžøÀ}‰\üé½7ßH7XJ]Z^ÓáNJ7µ 3ÝÚ±sL+8â‚-Ä&Uí畘J6ËYR^±|F_€9zøÛï* ïç2àDY1ÃuoYo”³*þ¢Ž@”¼äE$[k1GT  ›XçäêvïúÆvÏ¡ƒÓSÓS˜¡Cœõ·È…é;² }%ð±¸ÿë_‡ß·{Ñ|1[†?±YûØ ØË²Cs%0²°p§„'6BàTd°*ÿÁ¨QaÉób‘ä; ŒƒÙ‚¹ª€uØ 0K Àpº|é*&m…nv0ï9Áý̹x<ÄƉ¥~…0æj©ž¦¹¦§Y¦6%V“Ïóòñ\Èn@¡€ñ~èP0ܰ1Ø3£Ú¨f&=V ²±£¬M;²:5‘ˆ*?-ÛyàØ6ŒùYm¢CË3©8A0Ê¡£iмóY *àœÞá“ð!:]߀¾èP‹«°zD¯ZÅâtf“ä†,_¿t)9s+à(Jaƒ°ÙÅ0¥M^²Ïh¡ ¥ÊC¦ÃÍŒ »O`C3fÙ“q*ýüǚƯ/’ˆÒGú!vm2FsÏç)‰ÐJ“}…ÎL ‚Wàµ7Y¡æžIC•†|¥•¾ Ìvsø è„↩ b|V‘å\Ž$œûùWéí×~†eЗNÎL=ôpúÒg?ŸNž>KéÙ—ÞLO=ýtšfñOÇÎ’nŠéæ4åÓç69^Áê\b;q5X}Є²qš0uðŠå˪,Ê’¤JÀà²VB ?Iì¢ ÚØHNw"VBŠ7}Ç`ÇûâŸÿ¡$×UŠñvʪï$+Iy-ó¡É]ãüÔ*  (q&2püq ƒº§‡eôžj­Z˜=@1k?¤ªÀÁØl²]¯¯ÝךŸŸ÷БöoŠøXp¢oÏÄÄ…œÑNJ6 F¸ÆðJ±d7Æ5¼´¼RÚØÜd GHsÆ;˜7Ø  ò #“($yŽnhe°¦þ0[['ÑÈk1 ¸Á´€ä %=Ã>a?Å£qjÖ‡R*ø]¶>‚Žœ"Ì9nƒ ÏÎSÌbž…ð8ÂJŠœñvß/!kªTT6¶(Ö¥œâÉgÀ¢cLÜÓNÜ·VJ—ó~™/hÁ'£O‹Ò=Eו3Ú“úJÇ$Ä•ã7ô®»4LAp¦Öƒ„˜ó‡fgH²•þì»’n³*ÐÀW`b’“'æP¬3é{ÿÇ¥{.ÜÃîÒ3<’qXb$¿««ÛéƒK¥nÎ3 $œø“ þ"’\yí§/¢L{ÒÉ{ï'Wñ„I»­ÛA Â¥Ù¨TDZ–O`_àSÌ3HG_Ñ*ðÆò+¿ã*åÅ¿/qÃA¿‹7c(XkCq7ÞòŠ o©”+š:I. V‚)´³Ñâk«[lSéM‡f¦ÉâÜhÑ3P¨jéëo0 hÿèGg¾óOœ |¬î¿ÿw#ÅKv³ü4ËHø0À(ªÅÓ|†9Òº´¸°È™½æDDSл,M'¸lWìI”PÐ\+§)§ÓimkÀË»ï~À¼dì ”²œJD=¨#q Á—Û"–šú‘63Ë'qgt4šwÀÍ9* ¡%ú GaOý•A5c…2—üf\Êß…9ÚVpxVE&Þ-Ì[ZÓ³RÃñÈ(_ QéL&bÎr¬ñûΧ×ÝaÈ4ÇÃFv`<ÁY¬Ó%IA—\õ¢è¯X†»¡x€Â¯þïGüot¥‡^¸yiþòéÀܹðž›ì¬¶‘3O}î©Bžh[\‰[ñª`v!WDæÎÜ›Þ~ùg8À¢2àˆVÜËMƒl5°u¿wéJU!üÞWéø[ÉÞáÄs(#·ÜÓ!î£ úîé¿ÛkDúñ°‰` îÉ£«uÙkU"û+ß=tøHºŒà¿|ïOÓþüÏÒýŸßL[ø>\!zóÒM,­ãø[zÓ›ï]I·î’üÖRš_âÜAbÖMâBh¸ˆ÷L@-7žx>NcúBLÑÊ ±ÏÂê6‹U¶Ö˜’desvè%4ñϰÎÔdt,g> $€úæÛŸÖç¶Ÿ0ùƒ¿ì5‰Këã¿©6t6K+/D÷¹ï ›­¬–CE¸ÅÍ·-‡®`ÉqŽEûÀô¤Az˜NNãì©#· ”hséÀߘXôcðì³Ï’KÿYi÷’´©Ÿx’"AJC˜ÃÌG† N®W꥛7o’ÖŸ’(áõЇ ®Ì®°ÓöG2„Ƴó3‡!±®™UÁ$fxýå-J¬Yav•l`ŽÀZ`IgÈD«šû¾Â\®Óf0#™ Gñ×k±ÁÉ—Â2È&ê>QóÀœ_ôAG?÷ªÆªãáÖ0à(ïa÷5pÙŠÉéJAØ+DØáÛÁÛ]‰e7#ù}£U‹X&¥Å¨>+Å4÷5”’]à2ì¹ háîYV<:BÊÔs¶Æ.·Ó÷=ÀRápZÁ h`4#CÍ>cå>Xµ Çþ8ž{÷Î<3­w*-}ð€þp®-h‡ž¼iN² ²kð84r™0¬Œ\qîWÜ”ÂÒÄv€kNªœÄ:ú#ÔÅŸÏqÍœ[˜áD¡¢€H_ÆŠ‰ÙŒu"‡õ¤/ZêÀ<ÀTeöÄ\œé7Jdée øj ¶P²Ós§ 74§q“Ì ÚÍùµ,<Èå½JŒÀ‹?þ g'ŒsË?å`Ö#AG-6ýÄÄa¥(3YW“ ·Pl™ @/ðŸ§5° =“¿ä)ÿÏ ß¾ÆUÊ*±”~‹S-LÅG¥Leñ¼üªÜˆ;of`gŒy’Â*ªÇŠ)ÀmVšcÃø£[u”{ݳuŒÔFËpáo}ë[f¦ÂøúX<óÌ3…Ã/\Kös˜w­¯Ue‡R¡]¤Ý¡»GØ X*ß¹sw°Z©›Œ‰ ;;B¿+ÀÆ(ÀÅØL€ÓYæ\2¯½2¹&ñÍ‘mçÆ[øFØ æÞ€è3x¥ZëËÿù%ˆ—ïrƒëY+ò Ò €üW­°+ 'ø‰‡BÐøóØx2*æ9„Laâš„°)‰eÈn•ø]ÌDpv›•LKΛÄ"æ˜7Ç¡e¥‘£ûÛw`2S—Ál˜é#ø5ÌhdbM\ÍöPh´£°š†6ß‚K}nµõ¿»x”øY¬¤=:Ú0¸}XÀ,>@´Û‰“g"-Ù:GrBìu¼¬’·Ïªô/:õ1ÇÏ3çLW._GAUñg äà®X¿ö1Ú˜>ú8¾S/#Xx±Å4÷rýÔ)óz¤‘"*‚ÿ5w-Ùt(ãoçäæU¬à×!çÒ¬«=XS9Ú2/Áš|³‡U‚>œ}fK6ê Ù’È °rõGÝ`Ú…)O ÎñW¶Ù]8õJzãÅŸ¦k—ßLŸ{ú³é3Ÿš¹ÿÑÈÞdè·›ÈÖï¤u­m-ƒ›¼KÑþîQBa=›*Ñ>„Šû¶#Î¥±<˜Mû¬T|ò1²÷B!:úGßÁ£Šº´¤Bqò=VΨK¾PÉZ–7¨˜ÃÚ°VÄ­ÏX‡›¦š3glç¶8ެ§V¬ãWk²ôÙúñÜùί™ Ø›xQ|F¾Òüo­ÁêT½VìÝù6ÚèïÛ "i³<\ÚŸ^^^ã˜{Ž;q?³pe…Dx &D•{ eåF$ƒH¦…„»`¶ƒ²=z$½üÊëæYeï{?›rÀ<ˆ©"<#@A¹($Úò¼e^…CG£sHóÆoo’ðyÑI2†RFo.çS:*­Ë{Feëºq•`tSO·û˜ xSf-Ø4· ¿DîÇʈ6”°›CœóqDzÒÙ4àèc†%ÇÇF i¶àyG&ÚEø*á64F}:•rL‚)p¦@ªÌdýâ—É ãéæí…4ÁçkÏýM:qúLLo~”6Y_¯qÚ¯£­ÏfsSø mu{àRËäúo±,x2]xâ©ôοÉq㣴YÄ1®D5Š$²NÄ`p)”˜ð„ ç1ÝkòB01̬àè·Pˆî°ì ýþ3KC~qÝÃIj쨡vI|2Í®Ç)¬9#ø&€›•:Þ{,-‚cy®OZ”'¦#ÜøÍïý'ÂhýI¦ÒÓÀÖ´HÒáƒåtþ¡ éìý¿C¦¡¹P ¢xËu,õ…[œ|#í¬-Ó¿¼’qž €¦'ðÏtðýŠHI±l'ᇠ±E(ã >^¡ùÞòýd*òTl~ã–”/W \‰i:‚“ðQѨq+üq‘A·M:¡Bg€€ -Ž\¾z}rfb|÷É'Úì-l7:õÝ~R Æù«{õS§¤dœhå—ÿ}¬º—:·n ¶ÏžÅØhU{Ú…„y³o°°>0PÚèï¯ml1v¹p¹L_IÞ„¦œÿݺ>0,ë0v”Õ%Öœõ²;2«‹½_eÍ[—Ùd§Ðwš¥Áµ=kwVðf,<©¸Ó[`f JeÃw `­$~òò?Û÷#+*ý2’D·>òyí=Öø¢œ(1twˆƒRJ¥M¬•fº{åµôá;o§‡?û¹4;w AXf ¨ÿ€3)+£…`:úÒ^ ‘/Îɇ˜{_~çõtî³_J}Ÿd$Æ‚b¿Ä ¾†È° L&ÄÈ 8Ô Ž`ÀïÿzÙUzYa öC\ØÛW‘‡ß°ÄeȵýÖ2PᇯÁ:q®ÖjlÚå8´Í¥Ô?ðè7ƒ‡8{“ÊÄU¯#§Óã§é7+!  ¼LÜÉçf¦q&eêy8Öúa0IÌ&þ‡•ÅÛì¸ÎÑáw˜ó³¼H\¿ Šß*f»›ž>ÁCæ,°=ñ—­7x !utXè%xdÃÿ†WKæ Ïù+óõÑŸÜż*Z䢘ÖR6ê Ds=+šf(l“Š?Õ‰"[ÇØÏÞþ`otj|û{NnƒÛmÆÀzmý…Bíìöv‹#ÿ¬¥kò­ûúû €xê î6‡ÛCÕ-ŽêEj7™Kl°Þ¼NÍ&K3ãÌׇ‹ÀÎ~;‡Cñ“…QÁpÑQ~Ð{ט{aH<–ü›:VØx,‘|4ýâ혎avCdL7ð ² ùpìÖc2Ûé áŽ4"Ùn`ö±>ÁîERC¯1‚q%3¢™XÔyIÃZ' ÅÎ?7óИÄ0Æe¸=bæ ÞQðV“ȽäCE3™#PO¶„68D&S/(8›~~ú.F*>ÝÝ&!½f”ç˜S:Âïã °.y&„úüæd:ü~á2£Øuœ`Í­ùÛ0ölzõoÿšãÁïMÇNžNK·çqt±|北ҮôñùÊ ®À!ÑiÕj—ñ&Y×¾ay( Ð0'¥lÄ è å(hV ña WXÞGüií²—¢ÃêÉÀÖ]vã(‚)œ®d™.ŽÓq|ÐÆ:ÐêQ¿¸6c#\bp›ò(8Ï$4˜TpÛnNâ©5Bª7—|²Cá7µ £$ "ë (×Ì]¨5 xá ]±#ö/üæ|ÀsáOQ1ÐG§™bGµ˜û/îì©Õ 82‚¢u·©Ui=X^?TžbÐ ø¤2À=FäYVÉÐ\×#Uޏ~å•·§¦FG·æŽÜ`z²U* îl˜ÿlf¦qjdQ¡¶˜; i~ýŠ𦅾ùÍo¶(j ÷ôUj=­vom dx6&F‡'Ù”0¶¸¸T¦ƒ$10Õ-ÏѾG­ù.,ÿÔ|æ1p¾Þ ÁØË}—r†Ÿ*;F;™ÀMPú-´x‚áø>Ê zöG—è'\¦ªÉö9ÂOÁå° ±\…ª޽ž>xóõôÄSO§c§Î¤-’¨ÂrbäÐê0r2Ÿñ'cQ§J–{%æÑW8`ô¡/5M?ôe6Øà—a)ÓÑ|?œU†²“"§B¸Zküò«°ÆmÉÓÒL†Gå¼J˜‹,ª0qyÒç¬7ÞÔè+|w• /=ò½mÖZq„PbR¥k¹é#pŠ¢áphmâ‹éCàÝ,£…B¿²ÂÁ*œ(…¯Á£×w95XCÞ’Üå1­3Úujæ;ðHË€…>ŠKF€€Žn1(ÄÂÉeÞÙÚ‘7²:п8¢VÈŸû ô #Û5m8À¸Lž?,n§´ã;e­?žEŽ[…F•*šLþ=d.ôŒÞY¸;ñú¿ØÙÚltj[l ÷ñfS¼›Zà÷W”À¯(Ûô¥P«Í7GKCµNq—è¬-4Ø&Ç+o–ÊC;L* Kd âU´÷ÁA¦z¬…ò+Á5ÿÀ\ R§‰JÚLV–7bÙn†  ã·].#õ<§ Adðœ½×D4NÀ¡ÓÐÏÐÒÒ%RàBÿ÷žóëIΟ‹üõLb%Ž&X­bôU/‰#X*Ä9G E˜’zÏuÔM’:Ú­Äž+sqÚ“àû+ŽÂ!Þ|J„µËÀ¡¿B… ƒ“è;œ—… øÕå?‘|“2¸ò¸ŸGI—‰¢3!p>-…†$Å]˜„û2цt æ V›˜Š›·æcÃË;/þ$¾—-°‡¥EbåtäÙ#zÐ A®4¨ÊÄ•-ªÌ4y#$—|+ ó¬©?˜žÿÏ?I'9q·ŸísŽ|Ùsmy•œHg,¤^•ˆ? jŠ‘úÚô“ ô5Öµ¬(¥©¬òÙx.nó,Ïô€ç,üÜ´FŸç3æ×|W Äyš‘Ÿ.r:Tê¬ç›ûAú™´C åò¨ý©±úRÙ`ÉU¾ t¸Î2`Ð2$ýP©„÷wý¬Öl[Bª<„WE{4ŸwìžØÊëp’»›a•Î*> SMðƒ}Å/Z¿ê% gýLÀž±ÔPêÛ 0lkªJ¾:Y”[PißÚ¢ø²ÿŸVÀ{&L[­RïPìåUÜGœFÑ»ÍZí6ò¾s`zzSØÅmX>à/3sØq,>J‘( õ°çjæ ØCà= kˆ]ZÇŽÆhÔgÐrX`Tæ14¼‚ Ô‘7"Ð*å¬3Ö—Á–F*¤?8ù­€Žëá&‘XÅôcmæ°ªfœ!8çEv–qe‰X­Ù/´=Í„'Ö¶ ¦è]Èœ…7H©b€1ºr #›ì<&Ÿd/pdé@¯Å›ßöˆ‘Ý~ør”WÖüïÀ…J,†Pú šòœd&¬:¸½N†Û÷É=é(ëû%kG¡à)†ppµZlÁ…&®&hɰE‚g®¿ý#k)}ì¿Å~“ë& 9F Fõqé ž€Ïä*|_šò´hõÌ—µ<„¦gTårÐWšjÎFbGIëãO²žYùä2uAcÛêjW7ӹʀÁ!3dtÞq9€@IDATÞ\Ĥ_ —à S—I̺œ6ñæ/ßúˆ¤ªWHˆr5m/ßB lDßÝŸO+(?§D¶CÛôÅÝ“zë;¼>ðSL±{â;piÿ@Ðx^ü…b~¿s¢ôON²X%0ž”…%óô”öÄ£‡éÅ@Uø¨T.ÒÛˆqÂp(ÏžCQP#þ¡ÂÈiëýõfeûÆ\0þÒkoL^¾qsŠ´>“<8Zlñ¥©©©^²ÿðˆœ•_¡TöìðÞ{˘ëÃ=Åön_µS@ÃŒ¨·ÀŽÀÝÑZ­1z{þÎH£Þd‡u€hÐ YJÒY‘¤à8ÂE[2þïJ€1ý”bÎÞ—=Ìô ‘>xŸ  Ì6ò¡c®3g–_Ð’ ›ˆ†‹™Ð‹õò["Ø•¨™¶3“æßK(—5–<-V&#ÖÀãÁˬ ›÷ÏÑÞÍ9? íeØ hl)ø’ØM›Ý‚dôk·#f¢º„#¸2á¨aUT‘kólÀÏRžëáT¤X˜ ð|8U0ÔMÑèœýtŽmóýh,G]&²oùñ>ãç.Dx«û#¶×9N,LQ4µJÅ>Ѐ[_c<´ å@eÈx<Úѹ¹ôîk/a™af³rG¨‹xºÒ® J?Œ{t¬æ ëÒÔÏŠ2”¡(€ß¶‘pªÉ Àï5Ú·/±ï $MÐ ¼ØmБI$ÂÄ¥ŠT¼‚!Þâ×é òö·Lÿ˜ÒE¾Àש+^ÔªŠ‚ò¨™’¥‡´”Î~±™VÒqÿAoY(÷5* š0@ËûªÿEk|~¬|Zpßi…”òÔ"‰d2¼¹Ú³!ˆÏ ¯ð ·¢ A }qç„Bi–ÞÚÅó“½zdöPe¨X®’¦V`½š=Íååå!Ÿ:ü*ƒX7,ܹó"ކ1–ëƒ$ ;Z«WLj“_\\ÙÚÜ#ë%y—gè}K 2Wd€ øb8BÚPÂíP/I;ÜE7à uéÒµ`´2;»ÈLœK Ê»_ÛOÈj…Ô-"AGÑyy‰ëR‘2[`¢ÖGY;¦«xÒMîa=N4Ý­>¦6LôZ‡¿2⃈VÉoŠI6»ß¼—C?DFþQÀ¾Y΂”‰Úášfø¾@åùžµZ»”¶¯t<›Z^.ëóZÍD–#¥,Ó*¢ 6á½sgÏ#ì d4$Û+Û;ƒZV§+û0æOW…¸JLÃab úG¦Ó•‰08eë8»âhC‡UÔö“þ#„Žöá§°O⨠哖þÉü^S0¬CüøÎ×lGðÁq(ÿÈ b(¦[Ô 4¯€Ö€‚î3ŽÖê \«<"‰«•ñOØ¢Âgþm~ÅPcÀ Y$‚õ1Ÿ±°Ê€6âyFã˜Z¯íò¼Ø?®Y_Ü’^p`³„Ê—G€Ë· ÌúƒoT <(‡2£^×ù¹’ëã·ð鑳À«Ð×"&C8Ñ^ÈXcéÎÉ}Sõðìl¥¿Ø_a¾^mT*Œµæ+¯¼ÒÆ ˜Ôþë_ä "O`¥=Ðé'-9p]w,6šÓ¦é·\¡SÁj4%]B´˜°ˆ™& vN„è¹eáª;Û|k˜ßìÌÆ Æz¼N-!‹Q .ŠY@€Äõº×4°äšL,ë e‹¬ß‘ïO?˜3LHŒ¹ÍDdKhîˆxç(ŒXô7 ï[pdIGg*ÏeuV¦Ø…ÈHÈHÜg )ÅÑ5v%cjÂ#¨m§%!Ð=ô mŒfefÈlnfí!h¶ŠÄOþìo˜™¹Ñ÷­O cš­2˃W9Xtq~ž .³,‹L$³ÁZÐÊ:wà‹ï2–¸tWAÞ¼òa:züXj²ö¾Ã®Ãlúp°½W)qØÍènegâ§Ï¿8yéÊå Rž²] L šú¦¿þõ§Ÿ¤ðÌŸêã:¢=èä³Y,5™s¶fØ„€Ù"šè¬s¡¡%6-9"„y 6@oàÕå3ç v¢Î„èî#w²Ûä;xæÍ&¤n“Ô‡"€±Dz6å\§Õ»JYþùæ<ÒÌA‰‹šSáe«CFQØ4§Et˜«º0Ä —åLiÎí2 -·õƒV:…¹2>‚OJ-ùöô ò0Ÿ#,U±Ï\ƒÃCf& éqììsâ™!³.=ïN „³¡‚ÖÀ+²”•¨_ÅÞ~û<¡d^žóíý`@pm†%¼½ì‚;ļØÔa»éLxqxøØi<ú31·×9V$XIBH9Gõ¬<é ´’ÑÝK1åÝp¶yèIƒïS¾ŽïÅ2ÂÒ¾óô}¥œ–¹]•YiƒÒxÉ Î_ *>qÀóØ‹JPÔIËÁ'¢Ex å¼Ço-J`“z1àY£^”ö¾_B«CçZÕš€‹¯3x»ŸÑR!‚‰CààtG8Dqú&Ÿ†bCIWs/ïq!‡{­+Ä(‘¿B6!œÊ'oÒb»2×tð6h“ÿƒÅ”˰ÂXqè #½{dtd0w›@¹Ã§Ò¹3g€ÙFDµ§´lr_C?ÏGdE«@dhKØ}»[ÛE–O‡ë{;cwoÝšxåå—Æw7·Ç:µÎðêî.ÄO}•ü ~üè’ˆoï&JzM€<€ö[¬ tÚ,­Æ¬·Åv­QÎ](vÊÌ¡çè”O1d|„#ˆÑΣ›lÚ03®03>2¼Ì"\xn1W=õFŬ½¤Æ6*M-î¸/Õ´ …u›©Gn’E>žؾ!( œzòò™Wí2ÌÏÙˆÊD¦U‰¸mÙ ê„ñ#ÐI îtaCC ’ñý}}x ‰'hcQ|Í6ÓM¸·‡æÞƒÙ )ÎòšéɆP ŧ@‘ŠŠz *Òƒ¬Ùîþ÷ýO‘9L· ÃÉÕMR¯çíÜW0xEY¾ÆýXQè'ÉNMð¢/àÒK?Mw®ß ÉâÞ£¤HvA_tt‰,´(G'”YËzšpÌ8ÎÐùkï_p€-a§Q*dóEŒáÈðÉô € M¦ŒqVÈ©@ ñ F5ðÊ2 “Oþ–`½öCÅ ãz@%Î…ÁP9Q‡ñ›zU‘d†R>­2qwàqjeQ°Ê8 åOƒ ªV h†Ë3<ï`eyr´TB!Ð_ùGvv¥[ubò,|I{¡> „” Txc€!è ¨ÂŠ´ÿÑøÍ$£yó—åEV ð¸-ùöüÍtgáF:rô`úçÿâwÒ?ÿþÇô;ÿúß§÷=™XÀ‚‡åsžáIwY6oò®±ަaÔ=l®ê­loõWwwJ•ía°8ú櫯]¿~m”Ó†ñ®4ÉÚ=–@S«$üÚWg{û,Ç…muvw÷˜ ®-bŽú‹-E-ÖÌÛ¦&Û««Ë@åÚ®ö[†‰RCx}…Ù)Ö¹>:MŸy“œ‚Õ€UÎ `™‚´L‡Èw‡—¹ì(i»õ¨gÄF%RZ­GÔóâ· õ‹ühOâ‹?ì"¾†˜³*ðÑeF!†ó4QÃ;²RãL€ÀRC›cÍ`óð%È4Î=%B frϽ)Í6I¬±Í4ƽãN{̵cC>ˆèÇa¶´Ž²¬ÖK–X ƒƒ9JÒ.=ØÂô[ûsϬäøŸ±è£p„àƒ`ÍI6zÑ1û(ÖÁ)eUrzò9œn"ÜÏQïüüyvÑý÷éЉ{˜jÝeå…ӄܰÄTA«IÜI®¨<ІقWn_OM÷ÞÿPzço¿ŸNž½A³[\_‚£[¢‚›PÊà2‡<;Š#(JÕó¡9ßÍŠC“–²\×R‰2A×,ôŽºûVŒ x1BkøC¡bL¤ ßÒ±äë´Ë=sN$n()„3Ѷù åÃóq쯀ÒdôÏÈeP£b°V tÚ"¡«VÓ4©Ê~ï_ý¦ln#Ç>ÅŽÒ=îï¦{ÏOï½óÊ”ÈN”·]÷pø™§Z]XeÔ‡#‰Ì`ŒÓ8FKý=ý„í¯ŽÜ¼ùÑðùóg‡˜š«xóûkµ^öâ„4|’°©q§Öé+ÕYºï µ&k¶Í2~€ÍÞBsjʬaF%*mÝ|øR#‡ÓÎ[a»eaXyO æ ŒÌ–Ù奻|ôÈ¡t ÊrÌuG/ùMEKxòLµWES“¸bƒL~U¤¡ÁYŽVÉh<=;»_{ö{éÔ=¤Š„ez}ñ XÄo°zàÉž £¾uò[пBéd³«ù>p[âR+}°Î¬‹ßZÝø@¶ß|xf¤l@yoé9 +DœZm+žN?sfg ÎsÖE[*¿ó:3L’$ŠR‡õ ¬;â*éÂAÝâQ%}ÖØpÅtq~®15b¯ËÑ“‡Òïþ«ßE! ’†ì{ŽÐÖ_¤ÿýýŸÒ#O^ŒÄ$ówn¢ ×ᓃð¶}”w[ N†AsŸFZÆÐˆü‡©ÊñsÕMúˆþ"Ÿ noï NLO÷wØAT©ô\[^.<ú裟8ˆ3òßäÌŽæÓw¶ ׫Z®õ Ô&&ÆÄ£·*wí=¨ ì€`Â; ŒHBˆrK«;˜C»Ìû=¦{‚=Þn^ZZg¿@ ‡[qý$jιf¬Ãó“CÌé°È‘P™aÂ,aŽIFËa96Ê5§š”Ž<Ä”@ææ,t¶ÈÜ'åÂÂ*£9s``^]Û$/ÝùôÀýçÒ‚ô³çßIp’íõÉγbåõàý§Ò“O<š¾ðå§ÓçŸüLš›;‘¾ý­o“"} ëÁcª™êpòO‰‡ø¶Qzæµêñ )—áºB÷Å+}·Ÿüvä\2adá`ÑŠíö»/§[=‘N_¸ÎOÛä hr´¶jà(žÊŠUgaÈb¢PÀ¥tó£ËésN=Eø,ÇŠ±Ê`| ÆÌò—­.t>ïÀjW¤5u a¨‚4ÛU®‚¯ äÈ+øDÅ…Oe]¤ï~DzBL/³;¢ÿ²]›#€ËÏŒ'eøIû´¸¡œò.®ôÈ6dQ…?-ÌKXD[âE#Z˜aEpR‡— ý¼m·C€Eóg:~å‹’¹x.ý³öߤ±‰iø ? ¡Ìï¿5-ÞyˆE+¹÷Qxh5õ×6Ó8Ù´Ûc¥Lü)üFTfÁ^;ÌñEí+ZxC0Pºþ¡ãضDzn¦ðý;•>üC¤“lâ?í+ ã"à8òË?öòÌÀ©“'{š=uÏÉd´£ÅÁ!bc¤dY]_+q„8KѸ2¢B"g&PЍ<÷ |ó_f ™&¿ñNp—ŽÀ]„íÆÍy˜5|<ënì!–ôt6B2qºí¨;>I¤lÂe!šì‡VjbjªuÙ;êd| ŒuÀœ<ïæ TŒÜ—¶ˆ ^ZæQ7qo“j¼ÿHzð¾3(…•ô÷ûéý+7±púp´ ¸&ˆi˜Â—1ÉÇÛÁI–l:éõW^Nï¼ñbúÊW¾É-çNÝ“^zõmZn O.Q‘ŽüƒàÄ9õWçÒ:"ƒî3ЉËèXXF2ðŸxTFôˆë‹°à"Â>DRŒNɹ?LøªyîØõ¦0kµm1ªd,ZWgì’¡œ0?}ÿ/Gž>ëÖÊ †>}pÿeÁ+0YŸ² dPGcß1úÇ ;“ibZxö[!÷!ûäõøäš´çW0¾o®Hþpvk‹g¹æÃ”Š:@x¼„ϯ¾UJ¶N ¿îoê!¶_¶O»aÕ*xÞãZô_0ˆµ8úg%ç2ÞÔñôoÿí¿Ž#ÙòK סwOzöÇÏ–¼Î˜7Óÿû_þœhÅwÍìP*Ñ|œ=ãløš";Ö³SDZÊBÏg(|2ŸÑ"“"³ÒaîßBI×€må±ÉCk\¸oõàÌÌ:nA× #yãž?þc†ÑOxøæ›ÜS.÷õrZÓþ´sž‘Þþâ Œ‘œp„¹îÐí; ÐÛé²êKMŠÁžhObÌÿaŽÂ^Ó …î6\S…Ùr›s¥3k·ŸG:I§«Ãi׈MÁlÍ2+ ÛZw´%ñÛÑ Ä‰?© ÑȶÊs2Ï#ü*-vY2 7í·9;–Ö‰¦;Ë\ÿüÜÑ´°ÒH/¿u5ü‘••º}Þe:>â{Œ(0¸–†9ìwHá{óæ]¦ èã4žÞãéÏIv9}€}î¾hÇ©[pÝ‹ ‰iØ4µØÑ7@ΰÛ^´v }ÖÍ‚–ï©(Uœ[ìzkà:ßZº‘†§çÒÁcsà•ÌEøÌè–Ø``0LíÔL”ùÛNñR`wH«5{ø(ËNLU°t4kÊêâ{_@ƒù)/œQ•†C9ÿ¬×"´~h¨ÉËkÙ'S<Ú•ŽyÀ. ¯`üÖבét‡ÏÌ %¯…bñ¢í}üFxùN%Q§¤h¸”{Hí´áýPd|†bð%ù™q‚c'h.pI·LpK"ˆ Þ ìü?üûÿxø1³$"Ýí¤ç~ø×˜öŸÿèØlµ¾ûíÿŒ­4‰OÈŒE2"· \±0ç¡+D L7°ì›d$”>Ϲ±Máwükž¦Sp‹@«Æ{§Y«¬3à®>öØc+3³³«œð³µÓéTæfgëĸêýë_Ï<óLay™êVÛì  7@©Ðl³I°0ÊJÀkÎ#µjcèÎí…"{ÿ°CHÖ|gDK _À² R‡›ahˆD 够Åx$QƒÉ6 S áÏxÎú]S¶ŸìþQ­5grøÍ» DƒxE¥£Fç3Nè¡„žoGNŒH¼ò$ÛÜòüyC]É ÀºúP±“9w‚Ã%Òso\B9pHÑŠ:€Âw@gc™&ê·ÕÌlt+›óíèÓÕ®¤W_}#ÝwþL:yú×{Ó[o½MŸq¬‰Ÿ``˜°¬«ŽÃEoô>ž¬5Fi/‰?ÞÞ\ÓÙY|ˆ ç¸ …‘r·î„"]g·ãá3ç°ØvÍæ˜]”C>~›õj-5ˆõXµtá{>F$vVz"ïÔôÁtåý÷­Øc…S¿C¶ç²²PÀdÔìø£2qÃÛß:ÿTVZÑœBÕ¥¡xŒ—íw¿f¼x5Ó7>¹/8×¾†¢°=éÌËuó¬,m™®y7å9yÍ?oò _„!üÂ*Ѻ(t*Ó¨öÌ)© G1Ï©-¯ÆRê!qVaó•[™;•žûñóéÅŸü0½ûæÏÓ«/ü›·†±ªö8Ÿðœz,é‘3£ÅZ~DO"ð&›uzc=\}¼2]…]Ü(ÄìžÏ,øùT+qÊn˜’­÷øêj{¤[Ûª²Yb|tlù³O>¹|pzz• ![ý££{7/]jbỲúë_ ¦Cìpg§´ÞÞiëúmÖÚ}ṁ½ ó­=x¨k_g÷ Û “X Æ¥˜`È.áÃd’i¸çÜÛžLâ[?A&[__Fà˜ LãPÛaîÍa 'æ“(6rÙð¼ÑX§ Af¢*Ãy]Çh-M9‡}$lf ±¦]ÊF Ò>Ñ}>‰ÜdôwμKÞThÀ[Äa'N̤©“,ƒ|"­’:Ê|4”I·¯ðc€½ÏLÁý`rMsûkñ/¾ðóôÆ«?ÞËkçÓú¶s;×âa1ºçÚ·« ®Ã<$C9`‚BÚ²fY>3küFBûæÛ:„@ÜÚöØødšŒD—…´uûÃtí½÷y™²:†gŸóõ8eWLŒl"’·Ï©XÔ nf‘^ƒå´pû#ÍaÂ÷áÿÀß¡…Uæ‘e‰6Å{Þ1hUÔçËi§Âæ«Á2yèÏÂ(¬ÒWþðÏa{¡Ûï˜çÆbÞψ;1Z@ Ž‚ÊW^<ÕæíÏ“cÓ’¹(ìô4PÉ:ö·0[VzªÐ#xǺ¨Ór~FÖ…^•'|G_µÒ¸ï¨oÛ™Ÿ›ø®Šé¤[ÿ_þço°Âu5­²IkâÀX:Œ3¶Â~ }_{^­m£\Yǯ±[“ó òêý¤®èŽ´ed÷€’8°” .¼wÔw†éðúèk WE‡“–:œ­Ð®brö[goGu…Í{8ì+¬þà­OÍRµÚ^?µž›àÂ'¾¾þõ÷ˆ!¨µ þb­·Ý!«™&Ú½r±\)×&§8È”!S\BH*–Il‘€šõ¡)‰Å§‚:X†ƒq ö*YN€Îrs `ÂPG)6óR%ÏRµ£u(ÈoؤsvaÆ?ÊøP!ІעÝ|ÿ]¼úe8Ù}è(:Þ¯`E ‘håíÈ”§%Ü.#¶™€è‰thGø~<™»—d–ÂɆL?ÍaÓu™nÜ$©ƒ(W%‚ɑ̨$Û”#–\ëßx¡´:•#÷ú ‹Îá#8È“8H²Í«¯¼ÀJyF'™c· É5HÂi³xŸZ(h`þ‰7v j…åÚ#„¯°F- uµí |G@N‰ ³(µÚ¼SRÕÌsô#6ÿX¿íÐ^À }„…kY)¨VšÅzu) öS¸œ«üžhÔv³šÌ}°NGêØ°ä}Þ y( ê¾øÏºø¢Éõ0;g2Â¥E%NTÐZ<ùEYê5‡$+›àÁ§ÁŸuϹ3,ŸrÜ"y‰žeÔ¯GŠ>%#^k¤6Ó«Ol íå8iI¡pl3é—rÙÒCOÈ•¡àK/#iMBëÉJn÷ÞÙÞê`yÊp#IgC2p³ÃTbûô½÷ìŒMí5 ý Ø ¦îí³Äø8À‹ýßðúF‡³Ý;½[­VoO«X¤¯ÛÊa–kS¦ÈEΡ¦’LÚÀ„¾õ¢Ú©Ð²ŒÜþv4ÈÊu˜gó§“61›Ø±g¸MrΛXÄc ·žp¤¹Kx ßãlêÎèÖ`f# q—úUEQ $“‹gžsÞÏfFx‰tÔzý1r"Ðâà2º ;žš=Þï[×®¥ƒl³µ•†S™KÁs^jó1§ŽjŠ2zŽeÐc˜„?úÑ8馣$9Ä—Œ*¥i“?F…ÇU`3ÈZ<•ÄÈâv_E]üÚýØ4âÈI ;*žCù!c:é—c”'ƒ ý#6aíZºòÞDspLÛäÁHŠI4'~”Cd,†\åÑÚ:ƒvÐÍéÄÊÂhëäY¬’jhôárªׂgGËŒù˜ñü¾P«µ€بzª9<ýf_hT\ÜŠ:Ìw`x3„ä>ßùí¸8û B«7(Ww‰™úc` P48y|Û¾’Ès}   „V“î¾bì ¬ƒC(Y`ˆMdð©J#²|Ú5ùVe¡pgå~îK»ì”ÍZ{5âZtºzªŽW­=ûÙ¶ð¨þ°Å膋‘¦$D….±›•OD•A\ž¬´ë›U™]RÄcæ“ým‘ó øV(¡:A;ô× u„´—5}ô mó¬‡ÙBaÒ5™3<Õö0à?â \X: Ëã0¹ðêÕH:ÿîÏÓúâý#3óáäÓ?D VóÛÀ 4 ÂÁ…˜S§í²ºŠOá Ó­¥H.êè<ÙŠs4Ì4'âL«¦K’à ÍUaϤVã4¥Qàˆ+Ж:»ý’Œj -Hßê×(C%ªM¡2’¶.Õ‰?¯ú¬AM+û^|)H>­_vÊ—Þ§-Ø8[SZòx Ø|‚¦¤}fëV˜–41ã&!DW'kåVý-,‡B³œíú¼ŠÆTqZZûÛ˜ÍÞ|èÞƒ3XúG.àå”`¬GS!žï [½m…@šÂ†)(šLEjåâÀ{u¶&'&ÖÇÇG×.>uqíø‰ãÈÝ6rÞ„¿s~¨žËŠñÜ×9ÊÊo§Õ×l÷¶«0#6F“¤ ½{,_UH©Ž‹X0¨ÆƒûH7–a'’·#¤#4:ÂfsBtƒV‰ˆ2÷Þ¡C3ЂtN8áöð8¥Ð¬dž‹ÜÈTç D1}S!mˆ\Ú ¼žÖý£¶eа¨6à­Ö‡møYX-¥ÊÐË­…¹GSk‰5ÄÑãdKS3Ì#¤9?†´-MMŒ¯ÖÖ³##õ© ;Î)×è‡Çh¹ˆ£“ðN„j+ Ù.ucçÙ‹Ò~SEäH ‹ªË¨&•÷4ŸcÎ(®êÎïèRU§Ä¡%cqrn„,o­¤›ï¾E@S5rìNÏâ ˜ÄÀùȾ­­ ôúÀ§V_íÃ*jÖ{+`™´n1 €AK`Ó?»×B(.áä žS:àU¡‰yʼn¼µV,Ê‚z¤O¶ …A¡± Þâø?)"è5ƒH:‚B¡h?‚£€A¥b¹àIhdó¶ìŸüà$‡– "—áU,þ¡\´K´ sy®Ãø™œ|1¶1r¥6óº66:ºòäO.?þø+ÅþâFµÓÙ¡Õ*û0;RëßøF`â7*aU[l,öµä[­7똺¬Y4M¶[,—÷Ê¥áêøÄtMæÖàÀH–ásÌ=ßAX`Z È$&{Š@:HbÄ•Ø2ôšÍc´¦&&ˆ”%*\¢¨¤¹æ;•>»¼hÆx÷Ž{üÅ–‚;ÕCxRq2ÛãÚœ6sä !µL%!h/<Ò°#†¾AõVÊË0æ)x—¾Wö³8¤ò3Τ¥’„âÑ=h:hH0»ϳ ¢SŠöqÀdeõè¹Õ§qæ^2Ó²²ñÖëo“‹Ÿ©u´éc½]Ä4‡è0k;½µ ± Q ^¢Ó‘™þÇôE Ç1ªÑûÙ‚º£¶J–‹q_Á%o<£‡oÐßùKo€rìpT÷Ô!¦(‘”™ñ²:Ì sŠAÈ££ hæÚ2VÀ4‡¼vúG P8‹‡H!Änßu®NQðÎUSÐå‡(Eý(Å0Àm/ÊÙ5GS¬ƒàJúçuÊÛgÄ7¡¤bÿRuŠáå.Y.4$ŸRaÑŒWºÊˆºÎf`!ø#ן¡£Màº-kÔìK Pð 4qeÇ]{.£šLÔm½‘©á××þyŒg@x°%„ÅêÀb¸¸&½~š<@àÛµÿN'Œ?ñø43«á3h0µ£-*¤¯„ø øý@i†Þ˜œš¨LMØžšš^+ ——Ž?~÷sŸûÂݱ©ÉêÜ ;0ñv•úüü|KyvþPÿùe<À³o½Uo78?±cW0fÛs”HÃQ–ìF˜¯-., bJŽ„ãtŸBÅ)o‰Ë64 I ‚¤á™ÐÙiÆ6Z˜ÑS`Œ»w»°)¡KxÞÍ ”!* >I,MUdÚ ] ‚k%¥B­‘ؼø/41„² G Zd:(÷ö;rHdžȹ–N0wÏY"ãÈ KhðD‹>@´€Û¾0ÂèÖ\4~“uH§ –‚VÁ&Úû¿þò£d#îMßþæÿEˆè:^xÖÔqðÈÀõÝ5vÜe%¤“ÇC@ëf3Æ? ©8†“n¶éDϹ4d¾gó› žÜpôU)ÙÇm­úeNæ˜ãŒþžÐgÅF¡*ðE*ð^ðD¶f?}ñ3ÚÅá”Æ&§X^œH·¯_ EíÝp®QF“¿tdùµ¨¤ò‰´à*pÅKFíZq\±]™%žå'õXBzk)ˆ+_ ;ÚQʤÞ²Ž¬>K9aWaúLÓ}Þ:>e-Ÿ KÄz0êVBî{’‘J ú€_"PÇO¥l©åNù¨ +ÚPÞZ¬-4õƒO(#ìÖçM2Õ:ðé|¿…“0¦T”­Ë>Üt†X›&R¶Å!4„äUÙœ·=T^EÙßì/ÞùÒS_¼57wêls9[ÇšÝa?.çÔüƒ?øƒO ²ßü²& l²Úß@³UÙ„Á|¢º‡Ù»7X*VÊÅR}xh($LüŠz­VËPYDïmG½zOÉaæ¯sW§køDèô4›#DÏ P+ÊXÖlE²S0K0ŠH”ù Âép\áôžs>õ¿l?e®Ø\$Ÿ KZyϸ𩉹† ø$½÷îåtóÆBäÐÿwÿîߤ_¬p6DtÍÞ>ù¦ÁÈ'€Ä3ñfz`¦M¹0©‡Sn§§.NÓhýWž+Ý"”Ø)Ä6’wÙ˜ãþ‡Í]ÌêUÌs¬¯áH27œ‚mž„wßý0½,×n.¦ëóËéöâFZ^ÛåðL”Ôn‹MEØ=˜t134`Åš5ð bÍ>|$F*wHÞ½òéÃo†C°<9Ægpäa¾X, &æ¼A´KϨX»Kii‘¥-¬´>Ž«ì! NöqLKƒqŸ3nÆÊ¤ ¡Òg˜¥?[‚ü¢”yHM¦2e¼zMʪ{…]+ËQ3ØQ¾Ùgdr!P]4¦ßöÃ*QÚiGþŒÕžÏå¹`÷ì%ÄìEY+t®Æ8øV8Ï;úG%»*ý5ýõc8z‡"RÒjl’•/À—rਯOEëJ%(Ît *ðÆ›¸áª¦ÿ@ŸÇ’Á“ò–Ÿñ0å2obcñ¼é¿ú›#ãUòBî`æ¯Ó³e||‹?öÈ{î=·HœÀR_§oƒŽí"‹µõõõæßýí1à}Š—) ¾40ÕSknáîñP2†ßð`‰ m»0º¹¾1¼µµQâÔ_¢á„ÐoYÈmA©Y³+”¹]2—…gá[šd»&øüümLb2Ý”9¼#‚‚‚:A—ì>ŸcÚE4,‚i7F~;W“èÝÒj]_Açð¤–Öwº¹¾J‚¹ov˾…}øvqÍ¥/>öHúé+/i·)Ǭ+æüÔmÛ±‘5‹cõÕ‹_Nß{OÚ¬÷§¿~å2+Ìç4ŒbY‡Ñ€>˜¶º^Ù ÆPñi ¹BA\Y^I×®Ĥü¦?;L'¶a–M¦ÖPÝYE˜åÈr•'í¿Â”G™èÜÔåÖ~¦K ¦CC$ )3ÕÒéTc·c•D›-Ý]rA$PsåšÊ¼—­Î±;åÄQrî_¿ü:Ù—&ƒÁƒ¾ $8‰‘^zðguZâD5œ+¥ àÍ– ×x£È-«Æ;ÁùEÒQ-×g¸F3Á+ZC¶ëã>Ê‚r¶.æ? p ¹³RÊFáP"~ tbp„ס'¾T2H^ác×ò*,NkÕÌç-/ð<`ÎI¦+íÌ Z·ê2Ú¯‰™/yȉ#½í‹ãð%ÉS<ï®LëÑÊÓÑJ6ëÎöæNg}}‹LoÕÚÐðð.Ѳ¬Ã/áãYxòsŸ½õÈcΓÃbãq¥Ploï­¬¬Ôï÷~¯uñâÅG±ðéŸaðÊåï±™®Ô;`^ïÔSbî<2084ÚÛÇ4`wod{{ghiiEõD¸3s(Ä€™ã3®È:ª‰| &Zœ¿k)TàÀŒlVÀã>ÆYölžYÃ.rÍ9µ`g¡vîÛ9­Šç©… &Ø­.ÓÈñ¶-žã»íè  ¦ê+ƒÔ&Ó œ,ha-ÃxÅE¾N3§ â_üå÷ÒÌÔLš&rïjú'O%ü7nÝ 5~ß.ÁX,2 £ ijé©wž·ß¿QÚ•ð* p›îÞ]aÍg’L‘Úù'£Å?}ú‹X+“é¥_\ÖÞXÜh¤õãËQRás4aª†â+“L‚ãÔG9_S^eëÒ×ËJuM.c…ÈB#TÔ—ÂS?f£„€ÿBl…¦œ‚)r3M-M5³¸¶/´ÒÞû^ËÖª3UÛ-{ᥛµ,ãKVQ±CüqÏ;Aaš úƧ#m ^‰byyCÜÆ@ĵ̂9q‰KŠ®úÄ5FsM}ñeöN-hËwíH¸P쟂O›ÂÃo×î mw¢—_ø|η©ðl§©ÿ+"œ…ò±ý£¼ô1ƒ‘~ÞW\ßfÐp›94msÊt£4<ÄRüÀ¼¿É.^üòüãO<1OÖ§;pã2Ç|¯cìVŽ­Õ[Dþ^­å×§WÏü\¡~‡ãr§ŸÜq%̼aÒ Œ2‡Ç / |÷îR‘}þ ?l½A-GdT JLzQ¦žøƒQeªg(„ÃA€‡»ðøÎ`Ré)x=ÊûŒjPhT@O tMzFû¶Â)ï J ¦ôW˜÷ö«Ë¯4 P-Â+Fz/Š@8¥›á#  MzAѾÛNh4žÕ¡,îõűc\sjB _¾ñ0NA(CÜM›Ä¹­R¹TÃêÜÁb]›š¿ûÕòÕÛŸyøÑyμ¸²ÅпÖ(7v¶—·kc˜/_ûÚ×pÐÿªð 7=øt/&Sp§4ó^k =NbÒÛtšÜ•áâ¨AUFïÈ`¤HF9 B‰@H&(ÈáOÄJ½ â¼;#74,ƒÏÎ&ó"¶Æz’ð#Yýò{ÌÉD’¡"ãrƒ 2…s@F8È,äša¾¨U#sM”‘©|Ñ ‚»ŽCÆCÚ&#¸#¾‘Z[›ÛaÒÊ`yifgþÜ},î¥ýÍߤŸ¿ølúâ翚Ž9”Ο8@ù±TÑdlW¬NÚXÙBȶÒGœXûÖW0÷qj¼Í<¯Ê<]Ó? w6É5à¡fK6m×`‚&¥Ö 0³ç1z•i‹#¥ áŽC÷tË›«QÇöSܺ³‚¿béÓB*Ÿ>ƒ™ï¤Ò¢&êAŽg_ BÍ©ÅæÝË‘uœÄœœTIã3Çãxl©‡_\‡Ð€GPÇ×À«žýAbÖ8[ïø™ó„s:ñÞzL‰OëVå"¼é©’çîk_I(¤t2^aJ³hRã²A¯˜«sâ1^ÂLQ·LÅÕ<ªÃÐàB85—-¬Y­0öꓦ2§†&Ô ÜkÖó;„ø´ £ÌÇßùEYù5¿ø x\*—Z‘Þ¥~a÷Óß åeHêÔa¨r†Q}Ô–é ÃØwÂÊ}ԇ㠀–§ŠZ«ªˆ?I4ÆÄŠíÈþ7b 6Ÿ|ò‰µ ^XîéïYn7Ú«¬:m¢4X?O5¶×7ž{î¹öÓO?mçþÁëS+Ÿ4,ø'ßJí…ÁÖi‚8“%U©ˆž!fuhx°^$Ê7C‰Z¥ÐA‚‰@c(´ò„ñøYÔæû¦RŽŠÛdW•{Û§¦ÇÒëwP(‚Çs³_Àå?k±¾`™ù-H€ \—¨Â¯y ¿Ñ„GæÀ ó ™ L@êË)Ê¡‘‹a~ë}Õ$SƒÓ(Žà€¡þvôY188}€]~$o  çržs°B6  ~SˆWü÷ô#Ëôqt•‡óJc½ÍjÓ`4—}äú8Ň.•iù®ÂL·˜¹]¹Á©À£é©§ž aQÐM­öÆÛï³wa›¼ƒC9®8öXJ*묤ž ]Ä™4{ôpº…3±Ì*À&gŒ8ˆ"L#“Ø+À¶l–!õ%¤ŽkÚàVZ1ºiþ¨ÿÂRÙãŒGýs§O§w_üKêcÚ÷é EóT ƒCÚ'aù€CÈ&¿V/pŸ)hÊÏ‹Ü ´À|êÌ‘_¤-7a›xE®ˆø&ðüð||AÙá¨Ã€%ëS1íoº £^íáuÿ¢-[µ]SŠáµ|'êV™ó¼ý”FŠjø „“ôòéÈ/=ÂÇ­´º„„× >dóÉ~[ƒi›eÃSŒ:Ç£WðélW+»›øÇÖúÊ«,§¯ú ›´¿ÃºÊÔµñýï¿íšÿ3Ï<˜ùûÿýV ¥ot–‡þ°=»›šÛD<Ð=Î )ì5Zµ½Ry¤R* ×›ý-ÖÕUVLÙq8!IÏß÷µ-xá^F²H’ ¹40› 6AÈ kÎ7®ÏSWq~•1kóüQS/Æ|r\D±¼L…û„“x2Ú¢·C)ŽP6!òÝgê¯5¶ÏÎÎb†¹4ÆV]–ä0lò&%L2a娴ÐÐwV7Óœpq¶õì;»b;'†&:•bž`2f¸ØÌD÷³{± éF“)H™Ñ‘%â’æ {Å Ñ¡$^þùëX§¾^‹eVP{Va*ÿ;u³§íÌ+/ª²Â²LÆžjK×ÓæÒ)N"<™`§É™cœ-¸LÌ7y>–pE— -NcÔV~q÷öGiîÜiìèý¤»Ë^òb¸Â£%ÞožñSº+$a2#anLʲe >E°‚¦œ~Ì; $õ Ûñ²-¾§ëd‹½€æj’4Çzè#®ŸçåÅC­‡ZöV­FÛy0’·äj‘xHäkV>+Ï©L²³P'žýãS•–òN÷ì¿>ÛsÔ «‚/¬×¼îôsС®ü4–“[ýƒƒ$î­±1h©Â6UlÂ^k^¾ºvþƒã##!üõr½Z¨/^la!þƒy ¯ûßo©8Ú{}¶3È‘cX$„§k§4+ÍJm¯80^á°Êêpi¨Ž¢U«º?È—SŒøÀ­&»žß@"¨Èÿ²¦a¿L:#Â4 Cjbœ“|Y0%—#š§ü˜\1(/ád 4|(;F=n8ŠuQ@9‡(„°†—1h»I¸qŒÄ˜È.]©É°›7o2ý˜À8̴î€Q>yIHS GJÁ—KŽm–ôdtr]WA‘GÂBáYù!Úvá»nË(’6ÓBË–ˆ”Iðiÿ¬}—>ï21hÃ-ûÙ¶µ:n\»„¹Hº×ÔÄêã”X²x{Ò1F&ù¶«ÐR‘}£aÇଘ£³'Ò•ó °ÁnÁÒ8VJ­Èa “‡ŽqÌÖ"»#UIàùvÏË:k´)­ŽŸ<^ýÉ/"ñˆ–ñ©¾BPøÌx°ßªá&™>0J´áuéIi_¼ É'þ'ñ}‰Ía¤ŒÁ^N,áÆNy@¾¥­ÌE>ñmGlO…Ê@¬›¢ûÖ…µÅwñ¥ð#¸¶ëˆísÖKÇ®Ÿ•OE%g…X>ÍA>6ùGßG84ïCðùÜGm×Zj³ Èw ëŒ9kO ÿá£=›4¹Ú_XéYÙ©TÖØù·ÑÚi6«åz¹1PÐÜúDáçþ§÷XÂëh÷”Zíþ|ZííôsÜÈÞÞ`§½GŽ» áˆõñ‰Ñö^¬gâTà( !ƒ¨O‚HYBzAHí>j`Š›Êø<ö{aai©1«u˜DM‚j¨s:‡°¾Ì\’["Ë´Ââú1êmL‰ŽçxvB…€™\z1Ïßµ«×Ó¹sgq ‡ð™†YsÑàž8»À„"¨Pç›Æ‘[f–é#z!z+aq`¨­m»FÝÆ9$Sõ±ò¡¢Òtœž$£QLç®°-x`˺Z`=:ŒvˆIءߊ•æ¹#¨Q‡ÆÜÃÜÜì@ŠZô…C+råªÁ©ÃÀauñZÚfþßã°ÅW›IÃSì$di2ÒjÓnÐMÅ ìÖéË~ñ¸<ÿQ:}ÿÃé詇ñVß`Ò¡ ¥Óª˜zñŒtöWòÊ@ï2룟n»¥¬ÜRw ŒGƒnލ¹½ ¡¥€”‹ñ ˜¤b¯s¡ˆF ˜mż¯ÊX ªezÙžMćtÊ8‹²\ïô7 {þÔ‡@{Ô8n¢+*s§?<LäTÀ’ª³²âˆÓ(îàÉï–ƒ‰ºmÀµŒ=vr†àCûµÝS¥Ç{˜ø[¡­³Ò¾„U¸@ÐÒ#?°2<>¼ ÷z«½õVO«yñâÅÔégþîë·¶ $øò 6õš}ƒ}5‚cg`§UÝe”®°.Yá(²FßÝÅ»˜Kzs^ ó|”ù]A…â^­kÇü0¢Ìcë˜Â®sp€yöm…T™‡{”¸nøÿγĠõ륵N<4v² :á T#É\˜ñU/í•qh™÷Ÿ-ÕÀf^oº Sëp<Æ €ANdhÄ…®¼¨„·ý :À‘)èK(¾Û¾æŸŒkH(ú,cÊ,ž‡è}—âOÐñãáTebd(=~á4)Ê`$öGàu³Ð.ŽAëÏJE“Dý%;½ÿì½8 9â[ä`ϲ«Ï( ±]˜iÎu–'edèpŒs”¤OÅ!öcô,/Ó€n1³…*úž1P!ÅÕ.þ‡cgîM/üàMV+Øeȧëã±&ÚT3]‚öâE|ðAC¼¡KüGˆBÀ.~¹C!wÊ)õ1·§D<Æ1*s=ÓÀú쥺ě>’…ÔkTŸËñ=+ñ¢ZäÏöâå"<¹®PÖ*vx2œ†ÔÊ„û>#Íí]¶s{¸Ó-«r0È›Œ#q0”oú"²Õ²ò;lA-Àü1ÐÁ?Ä»Ÿ <RüpP*ôk¥AæíÛªÕk뛕Úꑙɥ'{xñÂÃ,œ8vtko‹m€•bOOýúõë¿ìp·G¿îã·V:¾ûÝ?lO¬÷4wÚÕ:9Ȫàe·Éa냬rÔw@ëô üG<€’Ç+# vaA8DcR,×q5ó˜ÂÄ›{Ž.»ÆA³JÒ8ãÏ3TÍfC”ÈîŒ ˜ÄÉÊ€ë8°öHæÐm_s0Ç Äã·t2%¦¡þV:ÀYT&³²ÿ#Ú«E¾B­Ž–!ݪêù~=n=ŽN0ׂÖ+Q»Ý ¸¡%¼QfqMf*0øHR¨@IDATOäqøð‘ƒô•£¼@*™—ˆU§Ôudö‰JሑÓ<Œ~r`K|×ckÔntèSü÷[+ët{ðòrµ58šê=mØÂËF{¥‰=¶Ëî1ŠíV+Íb§Uàô`d­±.’ù„¶ûB""‚<¾ë°A¨¥Y›äœ†™*€³¯«"‚!ª®0Zº‘CªjÆ Kz9GÅo¾„±„Â#— @LMo-m*€Ó%ûLw×*Üg>Ó—ŠCL=²C’|~žÄ«)žG@<¸n:’qôI¬ÔNæ6~•Ñÿ¸'œ.õ!ü8{dŠ2G|Ë(‰8|d6¬—àS„¿ËD é)²cO—e`º<íÆ©¶bPœ‚~ÌqWúQ*¢Fá´¯ –¸71É.¾ã t²ªL31z™óßJR•OH=cø>pT*dÂë謑xöÅ>Û&_¸î5V:ØÈµ¹¶”ÎJ/¿ó|GØÝEyïKŸsîR´çÿûÊ0*¤ÁÑVVìnË%•€eå—¼ŒçoA·ÿ¹.¯u em#ÌQéo½Â-$ÐYì´“á,”¬Ï›\&Ëèœ~1½R ¨€TÞ†«»ŒlàŽí:E“¾ûÑ>X°>wêoqºÉÔ°X+ÂÜÃqÌá;}UÂÔIãÛ¿Aj·Ur_®<òÀ‰å‡.<´4w|n_¡þuâC6Hó³1X(loaþWÖ×ë8Í[/¿ü2õ…ªàO~ýÖ ÀŠHÓ?ãˆ?2±†Üf•v³²[h7wG†G*c£“,Q,ÖèP?D ÿŒ£qP¸dÊüƒÿÁJÑ#`‰Á¨Ü!SJ½ÎÚ9¦¥ BLME¾À*&p•8Z—·ÂÜ ÂCTˆÏR©š<ˆ'©:gd&ti.Â7±4t½¬pŸ$ƒN»¹˜VÝ9ÇhCÏü‰uu›å7,ÁjFñd=>#¾)¾œîåvì6/Ô3Øï¶Ô|9ëC¥åá¡ââ“O<¶øÈ£/’ah‰6VµÆu“F¢‡TÝ{ìÈ­*üÝXÿO\ö‹þÿÿ~kà³úž˜<ÙnOí68‘´Þ7ÐS!.a4G{œï‡#(%ø¸·ŸÜ'5Ñh÷´$€o5=đؗ#[6—e Œ`Ê`E3Zö´OòL´§ ]Ã<âÇ|Øú5;ýM Dœ!éÄe>‘U=ð¾}6°€ÈDÖÍ?ˆ¬­§Ûw·y¢ÎÀ {äYs!àÆ~ä¨-çíöE¦¡ ù‚Ú‚qøO†pD±¿qÏÑ­oX³ë¼ÑyÊÍL‘/ŽãÃŒæsEBGž\1|…?c¬V‰¥Á|Tj_d,èFÚ0—ŸLéè¾Cº¨M¨éÖJ…D?Œ"ôÍîî€}€ìµEÒƒ9oß¹{-UVپ̼ž©]Š>ä~ Í)0¹¿Ò(üÁ»ÆŽÆ-R‡Í?›®¿ù¹ðT Xø2ćô‰\Âs!×»=á’ô±ûýÌS:‹*F}W1ø{·|µªxN¥.ÿ„ƒYz€‹°:m׊½FɬL¤•oéÇÕ®& Ð(ç ¢%˜ó9ä(?=þNøÈüƒEeµ†°‡'%¾.Úë–_Ì¡bÐIQŠàÊÍ>ôŸµr7ëém2®2%Ü%EøÆÈÐð»þ>óÐÃó|ðÎ@¹´Xm5WàøuàÚAA¢ÅëµâØé¿MG~ä2„ß:íå§y9qù­_ûÛƒÛý("¬ÔÁÞÞb“3 ½C£ÅòØ(óô‘ù…ùò§‘‚$9Á9¦ºHöŠ$Ï„€` ©èà2FF{É Ä(sÚ!bôW9ï~“M8Îc‡ÊÅš\ÌE}”ýÿÚ{³fÉ®ë@ïäœyóÎU·&T¡€Â@ªJ¤H‘”ävÈBØáГ"½)‚OêŸÁŸP4åËOî0Ð/Žp„Ֆܤ¨¡[§‰ T¡Æ{oÎãÉô÷­YU´Z2I€"xν™y†=®³¦½öÚkûR}£¡Pµønòâ3_ˆH"6¤M7×/Êv@H4€¨*Húzìÿ§çžFE;[ÕÈC=:o¸‚O=ÇäJg¼³ uX¤©SÃcd ÁÒfçƒRK³§Ÿ~2;súd¨‹"‹uËôܳÎ`Š´]Gž`nÜ‹ƒræŽòT YjEú8>ê²nà6ÚÒ-`eàIÚ¨/C©!@¦ ¿`²La/¬\1(“áw>²&`Œw!Qn„ °ÅèAEþ'Ø­ßY\Ch¤[·s3;sþ"›Sme‡×¿~¶Ï¥ÌæñÍ{D~!!!RO0}Ú  Ä{!9©VxiÔóZF¨8Ìg9ž%"NE¯‹íŒv¥¶ùÌšS}©.#4ŠuAæûqöD‰¯]Å æ‘ècóZ¦e’Jz÷°p*ÖèKQ%eYmÌPN<ãý;½›p“°6pw4}°?8sêäñîö6cûÚ{ŸúÔ§ßýÔ§?ýN»Õ¾Nœˆ›X ˆÆš£öôÀC+Ü»woÎäßøÆ7–Úç€i. –ãÒøË/ï-Æãnβäéb‚(™/ðèZ['Û»{£íöî´Q¿7Wf,¢òm%â ù^8÷ ¼À‡ÚÌx,<ߨÄñ“ ߘk=Ö °è.KPoÞ¼‚ޱ†³J¯@¥t,ôˆrT¹$yŠz(SBç•§ûœA9 Þ€ÏóÜ ¶Å±*žë䉖p qu,ó&VÅÍwÙ>,Ôðƒ!­E µ\Dq}C+dð±kBÊ(í¨¡Žô F4—ú”æ±½V ïÚžA‰Jù8’«±i õþX!7S•¥Ù€PMEXT~‰GxHÇŽŸ…­G0ïGíü’WĘnC» çŠhXJ/“¼Q˜L„/AG)+X†AMâÆÛßÍ.Ÿ|"ûµOÿnvóÿ#¶€ç€)ýã½lè·ö‡x%´!^%ItI=O÷[|?´Ågž&æQzÛ¤Ô ÓÉØÁ˜I¤“©È¤ìyÏSž¤ùðTµ]æeAÂLGñΨ?25K—Sƒ0-Ë -Ï\ï=ß?ØgsÝý)ö¥)¿!S¥=„±•ܺòë—¯ú7>}½Qoß`Xp Žt¯Æ˜¿ÓaLVŸöûwò?þã?vLMÍöè?~Ae„È._f/bÜ‚—ìåÒh:_ 46Z»£“'Oëbè³™ì¬Ði“?¥“ OÀ¶ùŒ"â%Æ â%ˆ\1†ƒh S-!+ét¦Ø† w˜ ¸Kxëo—)³ .°*ÕD) ”²<­¹¡F3æ7ª°m‹ø0Î4ý ~2iÕ8³‡;'mÑ'¡R/SÏ~lˆñÄi–æbPëᬺ=B+0¬j?FùÁ<@UþMÚ{öÔÕV )6ðhT‹ð剪ªÕAö{ŨŒa¨ªk Ë´=J >ª§»ô¸4x€*u’øÒ”0܆õ23‚è„L0îZ  Ç%‡Dà}îqD.LLŒgÕÚëŸÐJceŸsíÜ óÚRKäzÞc‡Ûg§.<½qw†ô4æy]}gûœêõÝ: œ”²xçÖa{Ó‹Lïº#õQ?ÑGAçé½ÊÄâ‰FdØ¢TylõÙO=ô|OA¸Ü·††“Ø%þИÈ/Á7ygJtó‹;V'ìÍëÐÆ©ä`þ’V@û¢ 36u¿‚£^‹)ºÝ)³YÓÍ Œ‚)ôÅ—Úþ|–£ÜýµËŸ¼yùʧnÔ«L7ߦ”Ã2>ÿý þlúâ‹/†u‹¶D¯£Â÷ñõ 3Ç_ýêK‹;¼êê¨é²—qyA¸ðÉ`ÐÚ<9`ßxgg{Êx=g´»xM¾ÞâOU+©¿Þó%¨‚‹® Ét Q"/ (j„à>þí{LQíïcœcÕÆ­m6•Ð×Ä.Ì×Î' 1hˆ*Ô”RJ#€‘"Ëœ—m%KôHU²2Q‰c¶{uvýmSßÉÅvL幯ŸC?"Q0*1ÚPY ë©3k–á:–¦ÌPDs%&èhÕ&d& …ê®G¥»$'шR’߈d a)©’$¦ð$“‘P´5äésà 8É Ï­*à@*§=‡ùMíA¢9‹Ëñ€@c°õþ[€ïKa- I #ÝÌn½óöM<—]üäof7ø5´€gÉ“l%I:›ÆG_)$ú`3S€¥ušÞ_zâ“ø‚ ¹oÒ?«´ÞŠîÒù`¤Â<úËÛä}ÿ䔽ƒ[:ì$)¤=éeÞ¡Æ‘Gi«vÈ@Õü4ëÌÃ0@ Ù> \¥e£ÖÈ·¶Z91+e·'0“16Vñ-ãɬ—³3C¶ÎîÎöÑóÏ?{÷©§/ݮ՚7óÄ_-Ý«/]¤›Õ=zâN¿0½üò‹ËÖѕŬ5Ÿ±%!ŸŽ1À –!A3˜ Øž2F"\q~Æ;ÁDt_¼\T+¨\“ €ç‹3^RÛbE§ãF,Þᮎ ÁJåÍxi]¦¶Nâ:‹½.ˆÏ¬| –"âÅ1U³`È­x ‰„༹ã¹i02s‚4ÈË2Ë„pJ,µÞ†>&U X_Ôd§db «’!\äà¾Ì œ¡ÿ”„'Ò$8p7Õ¾'C“ ¡”ô½ðíg‹Ú–`Ál1•ø=ÒQ¾pŒz„£; ¹§ý.”qŸ;f[1³ÐÇ rߊ …÷¹S¿Ó«‘ØèÄcJ‡ Vé³è'0à$ú)«¶Ô(,úÄEüÚ¿‡iÒA‚š#µ+´’ÈžÚ„Æú4þj¼ Ü‹f¦±=æs˜¬Þjp¸IÓg-ùδ˜6Ò‡ãõøœ7ãY0Ü¢UÔ“(4yA̾vΔ1;·ç,ìr‘Í—†À¥Çø¿ ÓÆŸ?ïœ>sæø‰'Ο;w‡lvH\‚{ÔÄŠŽî´UíCüh%¾ðŸÛÈ—:ñÏÿ À"¯]»Âtà½|T9A¸ðé”°ÒD¥[ ØþxÈE¢”žÀ`Q¡±ò¾¥ø1ß饊œYLa¢ '¡€|<“Ck]—€]™'Ñú˜õ÷{&«TÔ;°^Û@ ‹¢¸ —ÇË*!¨„§ guŒç˜óÖà¤Ä I¨¾ ‚DL{ª_KSm"¼xfÈqô¸˜Îq—ᘛVêYÈΓÔ»òØ žÄà‘lÁ¶’^³×°4Ò¹ÆAçŸ âæ ª®2¿ˆMç/#ò%»€BÕ?.þ‰ôœ[žÓÞC)èÇvhé–ñøR{eZIbža/ öC†ðàW©jZˉ»Q¯’VÇ*ëö®ß•Z;»ýÞÛÙ)Tÿ½sÏ1|y/šØ/ß­Ù#íê+iéf0gK‰òÒ=‰Þ™OäaÖÛtÿþ…‘nEø&÷IèÚFœ­‰•ƒ”¡47¾£0шw¿\Zgy²âæ³ÀÉv U3§´†N±·Ârkk3wJnwgë|ûaô‰)ƒdN¹Ô,fǘŎÎ=ñÄÑ3Ÿ><Õ¿Y¯d²Ú!Ž@‡™`æ¼=ÄàD«5¼uëÖ´O¬MTÇü©ÓÑÂGóõ¾€Ã€W^z‰@ú#L`U¢Ý-Gv†„JÔ››Ã“'NM66¶flNNø³v0wõâ|Y¾}Ð&^æ îé%®;¨§ȶ¨3ÈH[!¹BÏLਂAÌaQ|Â^à+sªŽßµu8¤ ° ãÕê&È"òHÕD*H‚_ð˜ç¿e¬•ÏÔ^%XãdúãžJiñ$¢3 ƪO4˜é£UwIVG‚“ˆ6¸ÖAo<û2 ˽’>‚L3 .R­Û„Ä@ÖÍïÔ½º·‚å*é<Ôrì›D‘ÈÖËu?ù\ÕfZ[.ÌÁiîšÆ>„,÷I » 1¨nÇí¦³M‰ðâ’k‡`¤ @®òÑW^vn!YY`u{’µðb¤Ö”ßé_bfžjQz[±åSµÒÿ I|n=â‰I¼-Sô°ïªùŽñǸ',%v§î”ö2xß- â×þdŸ´Öí—AëEºÖ‚9Ù(î«öC‹£@[,›­aäò½Ým,ó»3®Y¼SS׈¾ `64«õòÅQ£Õ¸÷ÉO\>üį={Øll!í» #»Œ÷r™ç•Q™È £Q{bœ/~ñ‹Žù?â^åW®^]L['qb`”N µJ…íƒ&½a«µ3dU` e•ƒ{ù¶…"ÿL~ á/Z+ÄÃxñ¾ó¢IL¾4¥¡v€M,è'YÉöÎ;ï@83æêìžG^$b ë¦ qPF¨¿¾tŸ‚1ò¥U σëÛ[aë  Çu¡-à=É£¿ðh¨ˆžÚ.A‹Ê^igàýp/‚t/¾‘2ïh½ï1e ô 3š¬F;lôC ¹ý $¥"¦ˆ˜€!Ð^Ÿqž@É·H à‚L,Õ:¼¡dNRÝFIâp"0-7 ²Ð(ú¤¿x›TOÄÖ‹úÉB™A¤Ôµ&Û¦f`õd£_¡Ž¡Ì±x©wmÏEJÉ’Ö¶‘ÚrÜÙÉ?ÛꟇõG?m°L n«1GH0±K<²< Õ#ÁŒ,À4͆(ñÓT­0SÚ³ˆöø¾ÉM¹ÑW˜•pŠU™À!Ù$tr‘FõŸ ÿAËÅ’y ö[\líl³ofcÞj §Ùž4s<›ºdw9€Ñ÷GlÌȦ2Ç„ð>ºôÌ¥Ãgž~æÞþ‰‡0bBÞ¡à>qö‡,þrÛ® ªÈ¬zöìl‹øýý~¨ý©ÃÑ»Gÿõ¾€Í¹sùòòààZ~ç­É|£º1)±/é|‰‰œ… 84ŒöðTz‡;.3L%â*)rK>¼Òx‹é×+äÓí½%Þ{n%æ‹ÇÙõ˜Á$/‹EG¬Õgjîî!ce§§¬ÉP‰]`Á+„·ˆbªÈTΫþù6Eš°<ƒ8"ŠÈj)ªr ¥ ûÌÔª«Aêf´´ ˆ.PØ'ã™’ÎOšD¸j'¬Õõ¾Ö{6y@½—hì§S‘>q~Yg"ËNsüT´‚ƒžoÖn™Ÿ´9L°áHÇDLôLÌ)ç‰e‘$ZŸîÑ}!DfH-\Ÿ…£é¹Á¯ÄïûH°ñ¶L×ô4%Ûœ`’Þ0 ÍGæh2žÅ{“”­ÆÃTí×\FíjJF`¹4 `³S;ƒÉí° þüOW!?xNÿýom#!‘Å%òøŽ5ê ÓØO‘{ò»39]W-Š…’vû© DM ˜­Ïm‘¿¾Qì+޽móÐÅæF3ÇS/'šÒ æ‹GU6©–«#6Qá3ìS~&Μý²Ã<ÿñ'?ñüÑ…'Ÿ<ÜÚn5ªÓ˜N;»àç€ø>ã16‚ê C‡ùœm»r±yÇ/âØ“`õ³¿o [ð‹—//7˜° °:b㦧,ÞíìOªõÊœm͆¸D/þX‹mMßÝÜ ÒâÅ™F¼ö¥ñ‚Î˺OS*1 8"¾¾«âzØöμ(_j~×T %¢yŒÛc²‰t‰Ñ„Òù„IõŒŠiC¯£)‡÷øUÏP²EãÕ4Ð8üqݶ`ÝÅãÎ1½–ûDŸT{‰GP"…ñ `/CEV8Àx$¼`:< bÛ|ñ<úGýqß¾J´ôËNÛ_®Ó£Õ=k°>·ÝþðÄ·l'2<Þ§Þ‰{žÓŽ5#°˜`ÊÜwæ$%”Ì+y<`V¾a9‡Ã·ýmòÜÅ/Æ2££eÙÏ(ÄÄV@[^Yx É:òÚ¾E úi_ý/©š“ê~à ùBÚ‡³Ž’œ—jYѹÄ,Ü—AÂWº‡MDd#Il#ýâë,—ìÔ¼`KŽm+Ç€°\öXÓåˆ2¼ù>îð=ÞowÞîþÁÉΓçŸ<:{îÜ1ëXŽ«Žñg‹îY½z©>˜ôØä«^Ÿlüxóæ¼qÔ°Ó±gßšð¯^½Ê­öxß ÀÆþéŸþ鲕²²¹œ¶YPž¤;$HÁ®6f÷™)ãt–›2žY®aÉ!œPG5 ‰ G¨—\É @cKÖ‰Äñœ!²»YëÔF,y-WßaîÛ{8$Ìöàô"w*'x¹È Dˆ@hêvºÑe®I}—°%` –©yXŠÄ¥a ̰M´uVÂÓµ“r0.MÑ@º½QvÄrb£9æ4Ш'bêôB´äh+X¬I$ŒY¶‘r‚èVߪ£ÁU¨EÙ’ ‘>®…$\ä÷¹Lı½6¨é¥À@|‹2Ÿ÷9wŒìóp†²ãjK&父‘NÈ"¼vÑŠi“5< Õ$÷Ì”#,ÃôërÖ÷ÔÜw±Æ¸|Ä»ˆa…§¤Ô¿jnHYËáOx[VHy‰Ÿ4Jè4Tñ™öá©A/1ÖHOXù®-/#6½G —(Ïr\ÌJp_ø»@,Á‰c@â1[oµ­f-giøœðgS´ íw|ãÛ¼OÑ=v(î’±K$¬k::§OwNœ<@úïtp%î‚æÝY)WÕTòê¨_¯Lˆ=ãÆ{áSŸÊÿè…?òå«eð> ÂQ{{/ãü£¼žoΦF+%l³5ØÇ-xoor÷î½9VY‡rÒ#!žgYŠåÇ – ¨ª|"dïñ2yAî£>gýúȘ|<Ýcú݈0¤ КgÍ4aå¬JZ \HÈ&ÒÔG"â•FÍ’S¸¹’Væ#±kÑB‚¨BKÑX‰dTÝ ê”ÜÇê%N{Hzˆ>\Eí)Rm YœCe%ÿÙCÎP¸ )êŒVÀâG˜ÈÌ ’º˜&´x»Rcyî\´©Å»¢mî‰ü2ÐÔ§°¬îI(Ií¶Û@ÙQ5Ø=0•æÜ×*3³ÿŽë%êhߪ 7¼´~ °˜‡Û²&:Ëq‰¬,Ü­_´ûú=Å5m‘ [f=ù‚6¢¬·;‰0NÒÞö8X«ñöÕz„uÙà <’±˜úTußÌ\­E45øK¶Ì °à®f`f¸Êcôã}3ßãòêµåÿzq3¯– Ö5¯·¬6̇£\ŸéÀMÜ‚O²:ð-ìFÁÊklÊ{A™æ-bƒTŽñ»Ç{Ÿàƾ8Ç—p´©Á¨æ¥øêxSá°Ïâ“.³¬€Û[Ä T›•Ì"¸‘dÜ6LéÈ ÉVb·VêPMµ®øã7\T§1¦™ViÁµkø{ŒÕ,¦Ñ˜×a•⼄¼®µwLRBüŽC%€d‘VÂÒÚcAþyÈVBÒ¯® m‡Íáy8EEÓ@Ø ‚„¨éÜt<¤¨ú }j7è¿Ï¬SâŠt&„€BÓà GÁàØZL²Íxnÿ u%fÂѬœSF¨íæ.P^P=×0š¸e»ùKÒß:9§Þ0ÞqîŸY$H iÚ›Þg¤¡O ®ír*T-ÐŽ›6­Êô‘Öº"µ_tŠü‰à)eõ<¥“©Z®y"‹ÒžYšnw¿¹ \%ŸåîþrÞ_ÎK}¼QQãËVk7›õã­­#æü7w6;ÄîëÎóÚà R¯Œæ¥íѲæÔx6=QÙš#ñG” ÷â÷ÿ÷?0Ëþ}ü 'ï›D Ú/½´Ø:»3ï×Ùgg6M&X5¦,Ü<ÎkÌê½–OtµòÊ0í œ_bç2ð™WÈzAœBô0“ô“ã³ÏžÖ¢{.ñëªÕ.{=u°‡ªiZ>±ü×â@0Æw"ƒá¡U•c<Òúþeû‹ { &§¿4bÉSBµÕÚ 1Áÿ¢S#‹–Ñ*Pëq[ìaÌQ–x†þ÷7BË0†»;¿$‚xcˆ`óDÃÄ×Äê xÐÛjx’àT €ò ééšÆ<ûÓYRÜã>'Á,¼Á×”L`uÎJh2JÇ”LC£H9BʚÆHôþ&NåÅ0 À„jº>-Wë¢ß–—àïo"\È“’±Gyô16Ú^¯¿‘×ú(+˜ceê“ïd=2á*ÁǼ}ÀXØa«a)q ¬™.X¿‡} ÆïxEø«'as±>hh v$={.±wqÅEÖt–ßO‘GcÖsŒ‰;Hˆ›é€±~…¡Ó¨UX_;Ÿ+õ:Œ Å§Ò%Mí 2*•šø¿T\™Í÷ªùááÅ¿>:Z\c/><ø‚ð?LÃ^€àgüz$ ÀºVnÁD :5›ãû€Þ>šc™#FÚ€Ýb†§Îœ7ÞøÛï¡T£ŸtðgQj²ÄÒ¥¬ªì¾ÒüÁÀ_±„±ºØ&\¯C:®VB nرO@å&‘m‘ÜúПØÝ¨ºL0]%"'Éèb‘' Õ¹›Ž†Ã>î·]âg O„UÖ/_祿†0:–ۆԺD`!~Al.=‘÷¢+B÷\pÛ‰ä$±’/’‘3I/R1óv‡ÐIr “D8fnLG¤{”g>Ë÷°­z\ÑW¶[><“±yè%IÇ)î˜b&°âÊL~§ó8³}<ãfz²NgYÞKLhMˆ2AïšJM¨ª§^¨7¸`#éÑËl“Äw#XŸ D"÷ˆú) `÷Öp´\ñ„‡|„¯-÷€ñl§F-gO‡âÁL¦hS $—c46pZ åÿ>0ì×Ê•~"G²ãš[>fûˆ¹Çc¤‡~ôh{¿Ñ¨ #æxºnL5Žëʹ+‹ìDö *Ï+¯d+á@ùzd àK_ºÊtà/Ú÷د±œ¢°+‹Ù€-§Û'™<ÁòàúƬR&dòV4¹åúI0)±•>‰`}ÛŽÃ}§ Ò êT`¬Ã×cN¯ÀJ7ÃÀ8}"’A1ÆíÀœqzHˆ \fÞ%­°3œ˜±ñdÎÇòIô”ïn-úâ;Ÿ/2ªúЧkcRDa⟈¦— x(•è5göGÂÕUc—HéŸÑ‹€Ÿõp •Ëm:œf.R]–èøY¢q!u"ïBÔ+¡NáTXBxžH¤$I€DHÜS®r¼çÍt­<ÈIÈc‰QØ–È¿éùúY -bÜ-Ž6%·cûlètÒ@:43-öÖ´ü˜b„™ÉdMkáeR¥‰ÚQ8p x³–†:½†Ø£;d€y„·ÞÆFÂoÌÿƒ9Ù”¤Hz|óKË p@Д‹Òú”ÙÃð×ÇèÛcˆ^³Vê––Õ±û:•f­K{{år}@kzËÞ¾“Æ”YöÇšæðj>Ä.°~¡Àkh~Ø¿Œˆ/ï1¸Í|ÿ|Ö^Ö™6A  Ë˳ýû#¶»&’É¡Þ?àb w<ÕCÞ/B‡8á_dö$vº›ß‚´"„*¹S̨DÌ~vKåš -™êówg‡%–E5¦ Ý>«Kz™žÖAà–—œGŽj¡®$udAà"`¯˜Æ;öcKiwœQ‡Œ"îÓî$ÙUAi¿HéEXYŽãÚ$ÁR!æÜñ½\tPûª4M˜myÔI»“¦¨¤aÚ6ÉDŒA¸É$¤|ñœkËôÂt÷¥+ÌÎ~ɸåE«=_ô¤Ê(ÄbìGôžßÈ}KÄi¹©oôšH .¸UÜp †b‡Á¼ÎÉpƒÐQõÖ’?à•¹†m„:Ó´(OÄ;ä{^uˆ)¼¼®šßlæìžK@šÞz¥•´'xmLáa°›/»ÕåtÛ*^bê®ÒwÇ]¦Œ‰È[Â9 X<6 ]ð3$îNÛí;øœÉ‘ú‹+¨ùø‡˜j+~ÉŽGÆ|/.¯D” ÷ðX”æ“ze9œÏð JÄ?:8u0¹~ã'¾ð’7ï.¢XÝ–êb­tQJwAEŠ)}Æ?^y ýƒp«U Àx2>Àù§‘ F€»úº•²ñðD Ë`½w±+ µx×À®À ?Œ{Ô2Raq8Ê_·î¤rzÒ)ºIÒSÉ·M}šˆŽ„àCËô'¸ƒ»bzBp&‘–¢þÔÑ ZÛ½¹Md:™ ý â“FŠuíà f!ƒ Qrü 2¥"ݪÕ)=p´?qdVE‰©½QY<æN™OV)¬—þ¦ÆGûﻌ ¢Õ>’`g{påÆ[O"#}b@2.Ï5ð³0˜—Ã=˜@bœVŠúRy—p«Yq2xüò‚Í\rÂÈÍ( ƒ^‰‰aÂÕ-—£%¾éhy˜=Ö|Våe‹ÎBŒ€Ç vÒ¥­½êrÑ«,–` ÁcЫg£Æìi¹2n·kD0Ù^þ„Ÿ-þìϾy^yå•piç/áñè_G jo͇δVÙÀ+v6œäD bóÐ3Ø‹Ì0`ÊT9oSxHJA¨@ ªˆ%Rð«¤â“P׉š¨õÝi 9C‚ 1îq¹Ì~ýÊe|š}ÿ?ÞÛo¿”%â©2ÇtRøÜ§h®JF«µ~?Šàò©J2UÚø\bKÄ,‰p‡¶)™“;«íô¹-¡®¥}¨£äU¥MÈt%¬Ê±¨ VÉÍzâ'€Ú£\Û$A„.È’<0h;à‹gÁ7Ë”,$¡­;][v"¶uyÜ ‚´´ ÀUl‰ Þj7:þL¸NÌ…ôQ–m7 }W2¡¯‰Þ{¿÷É B_Ž´I†»­5ËJG‚±S{Þ2x¦  iõ¬Kâ·Á<‚ßSÇ2îç0lŒzµš„áµ0è-ÙTC§¢í@øh8åäHûE—Ýœ;Œé;>Ù;øüôˆíÐcÌ0Ô–ŽóÚxÚhìÀ­²ù‰a}öÎIþüó‰ðŸzê\x¾òÞ×_õá—óç‘2Ý‚ôfo˜7µ)‚–G6 'p7Ü‚w¶vqdŒv  Þ Í˜„ˆ”f „¯dR‹ñ L‰¤ ¢f ·À;î訓}æ3'‰PÍÞúñ[1~¯:Ä¥@‘Ö9{÷csœ/á¬IõN'p¢¿ˆ™›6HËüJ€:,ù\L)“T²,RÉ ü´^{½‰>ª¾GãH˜L<^ÖËSúó÷AÌôÜÞãWciÁUHî™Þ²¼~@ì^§b%r5¦H´ª)ý¤|ë[²‰.µËsg'L£†”àbôÒ ¢_Ù7Ô˜BúSPº/ õ ^ûCCdÜÂ,| ‚ÓÈ$’6¤ÿÄaÉÛ»,îº{¿üЬC Ò?â±@ƒÈqÂaξ_Ïg´ G³ú˜_ö©Ì12±(…q½„LÏW:Í–Sv•¼¥C­Œï1æ±µ"KøÕe>*Õ6'9Sx£Ñî쀙ٮ+ñÎçÏLï,ÆË/ùã!ñãµ<ôõH/8¢š_É{åé¬Á¼¨v€ñ¸78‘U¸ã´O(ã[¸s‰YñJ1%Ì ¾@Zß·=DK“€T`“H j¦JíRvûÖ{±sÏÁɃ0 ê·®ÊïRPÝpÍ’ND‘’‹à"ªÈL"êKˉˆ¬–oíAذ²EYâ#˜H‹Hl;©¢Œ _'¯ÃÇ?îG÷¢7A‘b²tÓ™ŠK„f]\ƒ Ø”+ ˆåµ¶†þËÂ&B>Óë#aûã›çd^•›î%ê±É\Òr¬ú LãÏæG_Í®an]F´OmÕVZSh6´Ñs ŠÉ–ÃP ­HFNQ0-µ·sٮє€;ù…Š 3e\ëÜ1[îápÕï4 9 S¢_ •1…W›£±Aô%ö,aúE>&ìÃÌ|€g_£q±Ô/»¬ì6ØO¯É/ë9ã£ê3¾/-jý¼\b'Í“Iµ¹3mmTgÙ»Y¾yþ ¿ÃмƒìüÒñýzaŽpþ8” 4¸ŸÏÊïÍYx7mÔ:ê çl²µ½5"Òäí·~ÌF»L¾dìýŠ€8 ŽÖl/ýW∶^À¯#^!Å”0ú€‹="…d_ûÚ_±wÞ¹Ø6LIDR“–s_^lš‘®‚ˆäªî"¯©-4ä^Jožxéh$k¿ôuzËw±‰3à(†G¶#r°D,‰©iDyü$Äñ„÷£¾ 9Ò–>@'TÌo¢_û*!'â‰tÐmS«1Ob‰H%.á‘p¥òYâ7`¨Fmò¦åH¸I‘Zw´rLaëü÷HÚÒš;Hz z%U|¼ò².žzHûj·ÆBPÀOŸ9üA1þ|YÙ¤%¿ÖjM«ÕÛ˜¶ò½7o/Ž.] £ÞU4YÊø>òpø¸~­^ó£ëˆY"JP-kŽZùNi¯R¯ÅÎöôÁùËÏ·Ú'žÿÖ·¿sé/ÿòÿ9sóÖ­]–pn€x¬à•Âýçãi`0ÄÁëº+ŠôÞÇe3Ú{"¨‰õ5‰OæõY”ƒ±O#¸È!!Kw‰¸C=÷†Oø‰*©ó>ÁS†¸¬Ô—nƒHSYªå‰`D#:bÃÐSÑžÏî3—àÕï^ ¦#A’ÓæX½-ˆ6#ϸ€8´Ô;Ïîo4DÂ&O w`ö7ñºò¬Çôœ6UàsÛ™ê¥LáçÁgë>x%ÜÌkÿLe[~|¸OúP½CÒKà#•!'Ë=ÓÃäaÔç¯FÚ4Ô’‡Ï6ÑÙȹMŒµa[±.¯–¡Çf0älËæppÙÜhy­ºdS6…šçl:3‡ùL±¸±jűýÂgúnÒE °%vÑ—«UíTKyM¡C Ç·2¥ÇÎéYeX!V%Èãe£4iNv§¬D™³¥N#çó ÓÑÃ’>:ö+ôõÈ5Ñâ Ã-x«ÇÛ&þ³17ö‡íÍÃÝl²³5»{x»ÌLa)ŽŠfÐGBÄ Ê@Åd@ ü’  ÝoEh·ôVö0t·£ë¨JÔDlaÙçäKù“´K×Èo:?1~å$˜€òªÆ»‚päz!6ZIû8ÅVå¿õÛŸŠylÃp_¼x.;}æ$6ˆw#l·ìpEbK\˜ªë|#¬üè€à£±^{ž8€·¼¯ÚOætŸœ©ûöϲô3jŒ¾%Ç%ëPCðˆ_ž5˜m€?\Jv`,#XÃFÆLt•>†E42µQÛ•‘R>žs=djU-Áàáñ(W4f±$ZA}‰o= €Ý—ÙpžrØ?póXß—K&|çDY YlÕgÚ=Ÿæ£Œo4²£zâ‡ðVtqðéãŠ>hVاbÑc«­&Õ7§­ViOõ­ÔÅ¥ö¯0gŸ)驿îãE>¢¯GÎ|·áüîù¼R1¸9An:  ÑÝ>|DH¤É»×ßÅ›BS?o]Vewܨ d±ƒ ‰ˆ§äT½õЙO\ÖËÏýýDJóëúî¥b–]âå^xZ%ò(Ô_ËäB®cù ‚ëØ ä©•^Ýnq醙p8ÚÍžzêl„#»wï0ûÂç?HÏCöÚë?Ê@(ö,ØÎ:ǃäã.aG»hmòV„tL} ¡ÐlxB¥|i-7]êƒw’ÿ'”—˜€júc—"_zF3É 8±ŸœÅï:]>˜oõœá t‡Þ|È+áÛï4‹q™Úí@rÓƒ`t¶;EÞM0m„wæêHçó¦­Q #'Þ‡m,-ñbÌÌתAô¬Ø$‚6Ƹf.f–)³ªÔ%¸‹¡qóY&ß3Žkøâ3ž?nVGì®Õ©—*T‹ |z1BúéÎt¿¹7=F$ñ|s“H;Ùå•´¿ŠòM?@ó+ýõÈ€ÐÔ°¿oq©ÚžÏðOÆl†uv4`ƒŒÑ«ñКçºÖ¶Â2]!®7Dlα|rš¡`°Ç±¼«Ø–HTI£—`F¬~ ±hšð["Oj­hiÞ)<òù¡܇cz2eGlsýŸýLxþð‡¯eÿê¿ùÍØ›ðø¸›:y.ûÞwÙȉhË7¾ùìþþ»´™&Q®¶Š ‘q­}I†ºDà^Ëdñ“RŽÀ³ Æ‚AmZÒ‘IµÚž”÷f¸üçgnï,+ƒž¸Ì iïçŸ~} @4LnÁ5ÓOqÐóÙ˜¶7ØÜ?=@U9ezëέÙ¡ ”ÿ Þv"¼Xî:ú%&n‰œIZÊ90&™ÖJÉ€WÜS¨#ýÕ "½ßJ=T{Ó¡FÌ8sæ {òâg³÷n¾—}á ŸŽgß}õ5ÆõÏeo¾ñ6–ëvvùÊ%Œ¾ŸÝxïF¿6³ wbh ÁëÉ‹ÏÄ”£uXn;èáðÃþĹ w‚ ÓÐÀ{TúM'^Klkt4=^}¯zN51>‚·¿ HL%ôÎQP£2јq“â9Ìë°ÇG¡ösß–GR!ÍIšL„C(ï“‚¶–c¾ëþ–`>î©ý Ü—e— ©–NÝQ&Í"´k¹„·ÿž»˜6-6Žxì’3AÅ_ fDÙYö˜9Âa‡w\uKË®±òÙz®GÕ=T ¢ìT†6¦“ù¼:Ý\–gÙ^—黃Š/üO,Æ‘èUñµâÓÄâøg!ð01á¾[0;1žžÎ~4Þôûô€½ý†û'NNÚó>Ár$à*£H "‰S1ˆÔ"©„¡4W 5÷´¤;„G~Çóº®SOUR•üª¸W‡Œã›Ù'?y‰ûe¬÷w²Ïþ³Ù7¿Ú¯—}îs¿™}óëßáóÝì¾ñ Ým±È4˜iè÷î°Y5ë'8‰›6Q¾±þ=”†¯Ïý$‚Lš É‚!xŸ³ÌÑQ®l¬tî! M@ŒZÏÃÆ¨…X{”C}÷ë baDLžà ”M„/C <Ú"¬¢^é˜|¶Å¼jÖm-øW‘vUŸð Y‰Q‘Î[fÞHz~–l›nóò*⚘ælc­=ðŸäDR!±„v9$)ø° fn¸år§…%µ¾‹ÒÀFNß-{ä'ÐFy@q˜÷#ßCÞ´ÜîLwêpà.Hc{¦ìpDSÕ·‘Åñ³@ ‰…Ÿ%åÏ™¦Tz¡Ôæ5–· Wêpðkƒ77·No5[›ÛìtºuýÝ­Þ ß@’ʈH§L±SeàœÇ\³XÆ‘ŒW¦"Iå"?D#' É-ÏÁ6%^›m¸OœÜÊ~ëw>MÔ “DÞÉ~ó³ŸÊ~ðÃPRƒ‡Odÿþ•ÿ-;8q6sœÿ·÷w±)¤›QÓ¼œ´R‹wR³%b”Ǽ¿zú9ÞOį*îǶEëIŸÚ<,˜ï³ûil7ýP[¡ÝÖŸ`"}•ÊÜÜÄΧvÀ8i—cy*Óˆ§Ð/=D©[V3ŽŽû¦ñ°3“G\ø á;”â¶{ ?æa ±¨;µžG‡XcÏ/Í•uÈ—pÂÃ÷“5ÔÌÝO!f\kQÑ “ :hÇhÿ÷~>v›.Þ‚G¼·Ñ*ßh7+7ÚõæZmy“)ÿ[fév¹^¾[YV‰ã\j×zͼ:جf£þrwrñ"ÓKõ‹sÆö‹?ù“kAøv£8~>|` à+_ùjv'{¡4\0'4ÈÙR­Ú TX»ÒÜØÚÚÚßa…ÞÖ÷Þmw:GM$+¾ð{è_ZÂbÏüÙD´@\%ºŒ¤—·„œ’`qDÚ (u*¸Pí?“}âÏfßúú_g¿û»ÿ}v€ïOÿç?Ë~çwþcÿìßýïÿbÛÑ×ÿá[Ì[ÏpHÙŠÕÆ’—è¤7Õa­ôNá… ßÕ=EŸ É©ô—Ë'ÝIDATÀ¢’‹Oþ5áú+¹pƒ©Î®©Oæ•–SÁ¼ì'cªm'<ç¢|U5"„ŒHÈ4$Ú‡˜F”ÃÃ`ÂxñÓ.ëNõËdÑ•$|)žƒTñ8µ‘So'&…RÎ>¬µwz×ÇLÕ^%h¡sÞ„#æöh-=Ú~̳Cl¥w™¦½µÿv«^~¯Y.½×®•ol6+ïµµˆ›ó½Å°á΢Ҽ×l4*K´ƒí~©Vmlw—’ÓG“yù<.ºÏüåŠðï/Ú]|ý|ø`†´„IÓøSã0;#Žò„!\bP>• à#¶÷šÔ*UV"ùWŠ…}H’IÒð^xšÉq•^œ‹£|"n€DÅ¡jj9¢ºÌÀsÞgÏžÎþÛÿîÌþßÿ5Ƽ/  dñ«µê¿ñÆ[Œï[Ù©S¡RÄzU‘Ó4޲ðذ£‘øU—%E[šÚC®cèÂ-‰(>¶™¿5QI¼qP®D»n¯%QF4¾£~™ˆuZµ$éž4¥¿|<Õ-¡[N‚MH‘zMBÑ>ë´$E}ˆpÚ¸j+—<áOΕ:Ì€„ñóu|OÙ€™µsxeÓ@fdÝk}ÉNfxEÚ]n0.Ž`~ö%ì1Çüç’_ÛÎÇ+Œ¨Ôï;±<†áž±‰«ïxSî£Jü¼å&Áê;bè-+ÄaÉG¨r|ÊCô–>Ì…q<ãzáÀ£ôØÃ ·è²ësÏ|}›0¦ü–³ñF³:ÎÙ7¤ÖŸÌóýùæ™dÔs ïå—¿J½¯Aôá¸CûŠãQAÀ÷þâQ‚˜ i´ê]\}ÎâÆùÔ…ç~ëùúæþóßúιô·ó7ç~ø£ì!;Z ‘¿0Ä¢!hÄ_BüàÜÓàǘڹ>*Mi¿ÄBz±›s‘_¤&_"~‰EBÆ4º®ãr˳™ ¿HZï­¥}£ê>{ß²@¥ï×k¥a³z¼ËsÝFmÙ-Õ+=´š-Á=·É'³Z«1—FÞáð‰ýSÃýÝýÑþÎþ”UðñdÝ ÄÈ™h{h>ÔQ%æûKJ¯ßÉ•ˆÞç”i%ÕaÇîFþɉB³Úœƒ˜¨=#¦¿D&)8Oo˜ªÙç´€Dl$³| ‚,b Â%¿Gu9ôHDœò¬ÓËBÕ'¹¿iÙƒ„Ç F£i³°Õ¤“èóðãs(7x"t ÙÔé³ê¸ä#ÓÂïÖKpß´ÓØŸ(2=Tš^éW4‚<@Mï)7ob¤rÅùËís±Å„.¼Cbè±ë-C!ÖÑ»Â.ï7k,»mTûÍF¯ÅVYÕ A5QÿQ7ˆ¬S‡,Xv[–Z¨øM–ï—hãy매ý'–_þÊ+àÁ7CÚÛÃâø`!ð2šNTÔU” io†Y‹a@ Ÿ Ûa¼„[ðöˆ„'ìó7Ç(ý@NÉâ"B'|mÜ“xû{¨$¢ójMä&7r§ë!´à 4¿‚ËÝ¢…x-áÊ,¼vh±^XvÔÄo¯’d–à%f 7Í•›zuDCR[$B¥µ‡ÙÁëœ?i‰2£»|Y]’ü)çjDN&i lƒ%&ò÷Ú»V áÇ}™ ‰|‚?¿1! ¥êt@á– OƒèRÔ\‰žbXšY惛>Ã|Y&.ÞRüAypÒ© Ý+]«­écï0僰9¬”òᢴÇ(ˆCÖx^_Nëõñ¬z{g>?ÕÉŸÀaçèÒùX·vØIýZµ¯øùÀ!ðA3€%Zk]Üš/Xܨ5Gx‰ çÓÑï»±'øÌîܽ‹¸_‘˜‹s@ ~8ü€¼¢õÊH@‰yÁVÇ®ìAÀ‚Lb^λ;MãêPëÑbÉã!jDôÚ81܈Ê,×+òòÂëÈG‚È#IŒ‘ÁââÐ`)i¦Fa{¬Ã",Øs+fÔüå7ÓG#ëc¬ì±ÆÂgN%ï°Æ¿ËlŒ4‘øÌ×WK#؉kôYX&Bl6ݘ–§êVwòƒù… ½ühsµìVÿ›…Ãoé#;ÖXú5äÁðoªgª»Íùbc'›æg{óéÓžùìs­ý3ŸxíÚë—¾þõ¿?÷­o}{o4m@D†j”$Fcøéü⎼"üšhà ¹%^¥8(/á*Ue!AœÞçÔçÉÏß{¤‘p˜Þqq" ﬉Ê2,×¼)uØË^—)!Ò*3!{—Ök~ žúMaV‰©JZKóÆØ>®=Oóö2†T.7Ì̤¸^j÷öÎÇ̈́4Ö”ìæ0#À›õAò´HuŸÛò]¨Üé¾zÏ-–Üá³—]6@Ã0üé“k½±ð³›¯â¥WŪŸuKŒëéL¯QFâ³à«T+×cœigVÙŸ²âg“רÉG£óXó5è©âS¢­(ޏÑòÒ_^”®á'3 H>ÛH–NÿpÔÞ;5b`¼³»;Ã+0g€DsXBÄ¢(UýEr‘;0è)I"tx À,”vi¾œ|+ ~.D¸V¹…x"x‰åñGY’Ò†¤o]ë|é=­5ŽSŸm¢«]X°yüóŸ‡éé4οú1˜#®™½V ƒÈ-ès44ŠBÓt¥%b°¶¾Œ> o þ>„3W¤'Ê:Àa³ÖsVßá!íê»åp3Ÿ0®¿ÝÛY\jþ”Š_Lßñê×ãCa/ÑûËílQc]ö;^ãÙ¸7û#vVŸ7emÀìÇ?~›(Q"íŠ"!°œ^BPÊbK§Aðaðã¾Ä)áÈ`|“ ˆ8WbR0Ï“„ô®©“ltXˆ;13=`¦´œ5¡%fCe1,HåÉÖëÌÓæ´Á|ªér yQ lB[¢6Þ$+™ZZŒâi^}„¹ w\ëfð颞[‡ú´-q$Ê’[ð±kòEzÆ%vJ¢od,ša{#à¯iØ×>ë°T§ƒ"ÀÆò¨ÄÂwÄÁmXFÐcÁî‡~Âi5F•zy´`ù캘Ž+͘º›0uwñ¡©»‡âD;‹¯Ç¢à~@x÷íÃqm:8;Ì'O¾ðÉç÷N_zþµ×~péõ×®ûÚßüí^¯×Û`´ZÅ*UֺΌ·ôHž,ôJ|‰;mH8ñl÷¾´DWk©º @‘b8Ö A~#áù@FbIQ…¥¿UZŸ›Ïâ¬zÁ¡¾Cœ1M'A¢ )˸®3í˜r&@n‰5êÂlP¨ƒŒ)iÏí—ÕÆa«S[ N`´gU=Òj‰%Ê'#ó ¶Ã*GH-@ÇN8þò˜i£Z%?lTXgOh-\¢»xLõ–åEŸu•lêRËsÂ>ª“Z™–ÓùÅþüüùn~…Õw¯ãúÕ›øåüùP4¤WØ:ã¯/šãé¬\­ëlª8ô†§k•áÎ&ÁBOšž;{vþ_n.Ø} f:.,ö.°‘(!ì ú8ãKœWˆÓô¥H•èdÒ‚äË-Ó™7ȃ§ªü鹿«"8I‘zbFŽõ°BF`o+‡ãß±87¼gêt.á:ÎGÞò _)AsmºÐVVëRF5¢é8 @¿cG{fL’ß~Z ×6Š#Zn@ ‰‹,³2¡”cÔ‡àó‹wö%¦ð2Ãj9G0Ìå>Ó%ê~§VÊ«56¼¬–YxC:®±KR¾ÏÖÃR³`gØ(³!6ÖSwbê.½„Á÷‡Â„S²€DU–À¡R+ÆlЗO§ÃÍö¨½µ5¹páÂü¯ÿæï{ûì°Èö~šÓOÄŸ0Hb‘¨@ù\'”äC€ó+‘»VeMø¦p•ž4“ÈÇßtp—“•äçÌ' SëS;–/Hƒ¡·CÜ+Þ¼¡þó< •äy{Ú§Òncú’«Hëwê‚9)çA>[À€!úÍ$í÷ÐØÃ[ÆÁЀ㺳\{è1}gTŒpZÙ¸\ÊG0°é†0Œ{å> ŒØ£‚¤ÏŽBú—ËÇ„Vë°UWˆ‡Ãr-µËɈq}µ¼I€'°ñ bîÃ*þÕ«Ñ´âë—¢â‡r€³¥W^y©VdDíÝc\|n0^\Ú;ûÌó“Yé¹wnÜxúðèøì¿ýòÿ²³ÑÂ3hžc œÓ> Qò]Ž™94Þy3Ý ‚[“uö¸P•)néqEдgU ÷ø §ž¸“î'i¾>‡t‡âM9‰‰¤Ða6Â÷²yÔ,/* ¦²n¿Ad晄È'QÓŽÈn}¶—4¶Ï6Óh,îÊÿ¤Rè¡GáÜ |Î"Œüƒ^i„qÿz‚edË!*Ô€ O8" ئ ë½V}6Å(U;äg.ßxù•^N”]\s‡õ|Ò(·g Tü ?Øxa`ã!àÄiñõq€€˜ø¡âùW¿zµr‡x­{³Ñr|fQ«_ìOJÏ Ç¥ç‡Ïtú“'þ¯?ÿ‹}vûiCÄüv.LªUÕÅ;Úš,âœR¨„Æ3~Cµ—ü¤#i0>+¶@édÂy¨á‘n%‘!]“Å<½ôUQz0€õs!bcÝçHûíãêÔ¯Ö™Î+ÍDã´›mvJ-³Ù-C…l0ïaлSw)bîýFrR?|hCiÎhÁGG{’·±TÇ ò°ž-úo¾ûÞ`4+nvÇÄu¹Ã?&¾ |u_Ž EN¡ÉÁûHU_ÃàŠêHµvöIyM’Té(I¦Á'$vph+TvÈp]U6Ê„2Jéd >WIOÌ"ʶmÊdÚ ¥Jòt ä@Þ‹éœdXõ“qR†!cK‡1¬Ë ÃÂOnbõ³# –MkÅy{bè…—^ð0__êÐC<ó ”銻ªÓy=þ÷Xð' Î1D•5¦³Q¹ÞeÍʸ5!äáûðÞ]þåÅW’/~CoõV>î?«åÁùQµŠ59—Æåa£VíccêvúÄËFn ½4‘ ¤4å¢Ä÷D"Vâ÷ãTƒ{ê¼ê}"pŸÆ¢¸‚ÃuGý¡Hà¦1/gVÍßÈ 0$¶e{'Õ¡B&ã M1žöHì0†Ét8h&c{Ç÷r ºc@åw R?+Ïá Xð„×%~z Ø»>ÝtQ:nzI°Õc¤üQ ¿|­ûUããgù°œ5Fji‚¯/RÞ]@6p•œÍ&Û¹ãûb /ÞÁ¯üׇªí½½£ÅÍ£sùÞæd² Lèb6ïžÜÛ=ÞßÙ:¾Ûw¶Úͼ·Z¢F À5Q›Æù+ÊYûC¿JíÄ‚Œ© "„ÒÌ¡û­ôæãû kˆ_Õqµp™‚ç1mQ‡Ž<Ò¦Õ¨Œ8ÌXvðG¿š eÛR'F â2Úe…©}AðXþh/™0壺pqV°xBô.ÞƒRÉÉÒ[\t˜CÐH{#ãVðÐcN­zܨ/;À©ÓĪ?Ë1ì]‡ôLï —µÚdƒÀ™l•5ï”!úÞîâ>ÑŸ7F¾›^^¦ÙïâøÕ…À‡þú ÙZ~årV\?Þh6³ÝY¾<]ÍšoݾýÌß¼þÌõÛ½§_ýþ[ÌÌö‘…îU‡ˆ?4*%†ð]K|_ç2?>ôGK½„ˆ‘{2ÓHÔÞç •8·K éyÐðª‰ßÚ)â÷°¼(Û òÑ®h¹dñ1­éB¬›FþÅ•–  D:@Áqå]iŠ0Å2šaOu¿”!õ ¶‘•0 *>s+G­zý¸^#>~¥Þ¡ün=›÷òÊ’Ýn‰_ªŽ&•±+ï¶Pï+Óý|@(--ùicŒDoÓ‹£€€HXý!‚b6à¥Ê;ßè7ªµÙf¶(Ÿ„Pž@Å}êõþäÙ7nܹôko]¸sØ;„ÜÁ*Þ‚ÆjæƒÆ +Io \âã ”8½cBˆÁ¯àaìÄ »Ë­é¹Ÿ>’.¹` N:–²e 25„HK>ž¥?ïø<ÕÉ'ø˜œ'#sú–àWrõCµ7äN ÂgL:„È.cÉ'ª-Š¥·h<£‹lHÓ¯5+Ýv³z\­WÙ£Ú©,ˆ­ÇP€É§ö†¬¿WZ• ÛkNºì}×l^š»½õ /Ów¼ âøÿ€Xü¡/¿übåæÍ3Õ­¼ÒjfÙ.¾æ§ ‘';Ýñ¥W_ëÙo~ïÍ§ÞøÉsÄ Hj 5¹Á¹r8ýÓbˆƒ#qÇíÄ‹ç&×áBÚ'õÜsÇøAü½%¤Ì»~4Ü [*I /+àª'§í" FaZ—(“(åó¹å¤Cî¡ó=J…Îä-á̬ñÀÈš.¹—ýéKì€3UwÙ²êÆ}6É4Pܪà†[©õ˨öåZ˾¾ùµF½A#_§DÅn7¶§LÜÏ ¦ ¾Jõ±÷ññ9_wiլ⧀À?…€ƒãý`:0ýù×ñJ¹^UZ†È#z^Dd%_óöíãÖ£n Ͻ&4]ƒžÐÖQâ¥_èL¢V°Kø†þvÜßÜØiŸ*V|ãÛÇs½uÍL"_.(PÊq‘Ãr= ã©ABÖã¡6æ>¾ýØìÃ(™ÒÁE43tÜoÜón9gwd¦íTé ‰E’>•t¨ñ1Å]ª½Eá7iã CeïlÖß#LöMbêݬ6*·ØPóv£Ñ¸]mÖîfõÒa½\;®WšÝlk6Ø]8¥·5ݹ8œÇÆÇ¿B˜ì?)âãÔâøÙ! =|$ÇÚ½9j[ãZ^>…ÅúÂh6¿ô·ßúþ³ÿ÷W¿óôd2;GÀI¸É‡¸Šy¼Ü!hp''®¶sŒ/#àQ0‚ ËÐéC†‡Šm"œI a+ÝRÌñŒé•ü «ØÕÛ“d—xOâwy’þIæ »=Ü)!å)àúE"ë„/¾j>  L ,ùŒ1\… ˜F¥Ü!j;ÜVŽÕãžÓw¬Á/1_¿œãA.¦þZ 6Ve ¬ 56+³Íu6+Ôüe?–•~t jzå•—ËGGÙØ›4Ú“EyÒ9Wo4žþÉÍãgÿýÿù•gÞøÉ­‹¨Ñg€ü.Òµ…ÄOv;ˆZM€[Á´ô«0¼‡n¾R8\@Wmô #‚èÕªò‘Dí¡ ˜BÕ"8)*ú8D@«à¹™‰jì‡d°(ÆãÌUDÂ9ÂŒ©I73D@êgøâ/YC¿témŸAL¸â6 “ÝbÉ-1˜Ãg\_Zt`Nxè5Y}Gpjiº¨•X½ÇÒ >¶T1²Ž„Os 5 Ç£À‡> ¸n¶ôvõêµååìÜ|ºŸMØް Ó^y>íœ>±{üÜÅ'ºo¾usPoUÙDg˜R©$f³IÇôο§9øDÇJù4^w·`í…þ¡=ÄtÞJŽÇø]­Áu<„ʇôÚT)dT&Ñû(¥qî_û @ncÐ'…¦Bø•‹Ös‰GàL² ñ\€àqÏ]¹æ²MVˆ9ìyW'¤VÖme³#Ën³n¥ÆØQäe¬þ9Qu•˜¾cˆŸ·š‹ñ|˜_8Cd£A6Œ¿†cñ[@àý@@\ÿÈiM- ËþS=ë77Ç£üdi–Ÿg9ð3ßùÞ›ÏÿþµgG³üILo§Ðþ·ñpkà×ÎÈ-@¢Å_ ^ ÅÍ?çæ°”sÉ ³ðž #± ¯Cæó+³ªç7’®`á©IšCßph·@æía3†)@ÅÇ#Èz¨é¬Ìa#­øŒñÙ¯žšôe¢éÔ®Qé5šUxÜgwÛ2†¾¬Š ïrÐdiÔ¢’³A:6˜¾Ã+â¦ïÜ ç¿2}gÛllqxdøH€½Àb]¾¼ò `Ë="QŸ-W›OߺÝyþ?üÇÿôÜ;·Žž†âÎ"°w‘þ-ý*Ãl‡èPƒ*¹óë†ÃjTjÛ) hì0I’P‹½îÇ|2ˆ8€¬ î„ÖWr®b ,–P¨;BðÌâÏ vƒ¡Þ—&ÔC´Ü¹ qÜì¢[Y²ÍU£Úi5*xéa¹‡ PuÏxz<ê ÚSw\tåI©]l³½uš¾3}çöÖÅô/¤8>$|ä ¢L«¯Ýnâ÷³Í64§ Ô‹³yùÙ¿ùú«Ï¿úúÏ̧Óó8Íœ`ç®6ÉëÀFŠ.LCžSÐ,lÒØ^[¡$¬z/±3p‰.-kã‡#¤|°Óâ’{ð;ýF³WÚš.æHÍóìÿôß¹ùÌ×þþÛ—îvÎCÕÄÄ߯ÐBůaÀ8!Ñc· Ô w¶ Ã^(òXë }v§€Øcn€ßÕ볛غ˦ŒíñÅ'¸ÆäÔÝb1Bwà_||ík¸äJð†Ê®W˜F¾*[cU §K.Qs˵Ѣ²Ä WCÅïÍ66³öƒ¹þøÄDŽ©»ÕœèòGñ²‹: ü!ðX0¥{ðàZ»ÖÞÞÛ`ü.›Ož!‚ÎÈõÒ÷øãKßþîµ ýÑôD¿1oBxMèZ—<˜á2Tûuä`§+$¿»]•ÝèÎX šûuÒáwÁ˜¾Œ18à ÂÏ*ì„ã\}ÎzgBÔ¬¸#”V6بaÅoT!øê=ª}µÒcòm²ªCF,»Åi§U³ÕÆt\/ͪøã³ñ]þÛ¿=Ê_{-­¼+\sãµ_!Fèð½yµ‘eíÍùr~Á~–%G“ü©o½ú‹…ÞÆP°8Íx~zÞÄ}¸Á˜œ•‚zèÈ ë¡ãàŠF­'9DoÄ\ve->[±úŽ4ˆ y;ãùEaÇ.·ÄÁÇ÷¾ÕhN«Î&—ðª)¬†Àfö¾#´sö“E{²Ùš²™=Û`ïÎÛ(ÿiÆQ_ññ‘önÎC0¢Ç÷•-+ ð…Ðæ8põê•åïýÚûoL«Ù«åÊÇËê²¶œÎj'÷¶ëŸ|î™Z8¨vûcTÿ°ü…zÏF"nn[cäÀ.àxçñ”i;,ø¹1ñ ¥Åê:ÆĽì¹ó ¾øŒé³N«Yc{ßU¨øµ>yX£äx~É\?ëôóÍél2œ5«øç…AïI¼ó2èÝ®ñØðÓo¸8+ ð/@à±ÂX´ôÒKWKÌT³ƒ¬Þ™µ·ª;Ó|zŠ5}熓ٓ¯^ûÁ“¯ýèÍóÓùì æ{‡m,úÌ­ÑKâaÓ¡)Ò}ï4êJ ÍœÍð |y5¤{¥×nT»¸Ü²Ã-;Þ²'¿6C‚gÖÕfu\›.Æ9Ä>o8¦ßff¢<¯¼3½`ã!gBÒÿ ÈUlä¥ÑŒ ÛíÉtÜ_ÌÛÕSói¯·øé¨:E¨ìÇ¥‹þ<xl†ëF;X._Y¼ò ÁðgX't‡ŸayYP®lïl–ž}æÉåñqoÞc<€äßb ¦™Sà”-0‡,êoÕý&*~³†=Öù÷±öñçà¨3ÀF0Êjuö´oŽ«ãÅd֮Κò|£ßšWb¾¾¹¸ò¹Ï;ïK˜‚O¡²×/©øýØ@à±ÓÖ]kƒÁ•Zv|LÜúæl>Ûæw@$½Ó¯¿þÆÁ÷~ðæþt6kÏóœ©z¢‡°GýîÎÖps£–üj¹ÚËKy6› œ‰~y8]Lð3ª"»1Ù`\硈:W¥•…/þ¢_·§ø- ðq„ÀcË6ª@é«/½T¹³Ý©Íšæd4Ý\,†D ®íõó½W_½¶sãö­V‹åv{»»‹­ú´Ý® ™4øF8 ó)v€9ûΖ“i6ÇǨ2ËÇ}þ|Þ`¾~òw^1_ÿqDñ¢Oÿk`Ã]-ÈÌ@ùηa“qsÞhnÌgD ®L7GÃÑF§;là\nV+zðϦ“éd1›Ž¦ó|ÌîØãA'Ÿ¶2ÐÏë³F9ÏïV¦y½ÞËÿ5~ø×}_ßà HųW<ö `=3ð{xó¨ Mëì,ž7l*ÔÎ+õ|Y®Ž§ƒòl‚ÿ.Q²ó„<›–fËigVçÛùæÝiž ÙÝr]n[¨øW„.úõóAà±gvça&ðÝý{•ÝÉqµÜØ­Ü>V R®×g¥ét¼œ™Äᯒ7çƒÍJž½ÆžÑÿ|Q¤þ•‚À/ðÈøÎ^yåË×®”þ*{­¼¿¦´uH ‹OeÙÛ?Îz÷¶–‡'n¢ÎßY\Æ3O?­º+<ó~¥°ºèìÏ _ðp4¾ôÒKÑö/}éÁ“—^Ê2Õ{Ý ƒ[çüNÁ ü%ððظl'áÞɽ:l•@RF€!‘n„À( ó€Ô±€Û%™M3H@Üs`:ûߎTÞêáá±á5Šïî 8¶ÅH#¡`‹„{ 8LÀ‘ÎÝ££ˆb\;€ [º¢œìAÞÆC@ Á””äo™É^9ö‰„9àŽLY˜°G‚ÌÖ¯NÒý¿‰%³wĸ±‡ü“;¼Âàá±–àƒ„kd[K0Áà^`‡€û Í=pX ØtCØ"H%{“É+¬ú0Â~¼T¶{™Iú½À,°7Y×H˜®I${%Ü"áÚ}1·ýfù0¯ xx¬*¼àá±Â¸þHŽ [øýŽFpßpO#º¡H…{蚨†Ðw-m“ZƒKQt|Ç$[Æ$ÜNÊÌ?.K`o"¹%k½Àm÷»­x‹‡‡Ç2Â+Ë„_ɶn*Ȥôü}EJÍŸÀP¦X´`ñB^Ô÷~Ûƒ>š'Ü/”qI©Høp%†bp½W <<– ¯xx,??‚m öa*ìï/§0ÁŽ@Øv°¯ôªß×Úï3ÁE“Âj=¤¶0‡«Š %·'ð+ WJ¸\•±äº;bn¿Û-Äþîôðh¯xx4ÀuGrt§F‚ÃG 89na¯¾ øý,{õXÛ]ªà/Æ×㬗vÖ@ eSp-ðŸÀÅ1\÷«yn»g <<œð €‡‡×ÉÑ<,œ–YøŒ£e^>šüZ¡ßDz¯îN 3ÍìL9™FÐK³öJɯ’”%¸TÂWnéñÛ»ÝâíYáá±ÙñËÔÂXh|5(/ê«)ðk…¿Ÿ½Í*·Kø•”\•ÀW$|ÿ—ó콯g<61ü#ÄcSâçGpt$RJ_À£r©Ã!ðM~_?þ"¾0fªŸ¬ËƒDB·I¸>‘|_Ây ürd·ú«ã±™àŸ)›¿8‚£CÁCx\(x`£HSïò<ö@8,|°ò->üƾpMЕJÒ[çOeø3I’ÀÍÀ×cÉîÌ]póq> ÐcƒÃ+צ¾ü‡ð¸ ú¡a½K¥öÅ ‚^h‘öMƒ÷ÖÎ _gµzñucÉí®•p^"ùÖ=~|‚ðØ€ð €Ç†Ãu¹Ð›À·öö¸òN7û˜õ¯x¬+üôŽnå|yª^v«T¾jíÛè}»•/¬Ô¾ÎT)~uD\˜Ó­NÀ;øLÓ~‡È¾ÍÆä"ßWûþÆ_úà­ M%ðã>ŸHÎíìaŸ©ë^ðXó¸r'£mÁ#CÁé<°•§ë)B~qÖ¾èïϯìSþ¯0êñ.@ 8®­.¦Š¿l¸OÖXð–"½Ò1n=Ÿlødÿ¯Üì€Õƒå«HÉ ßHàËó’¯ìÑZ){x¬)xÀcÍâšÔÚˆ€—Di-€Ïúÿ¾p|lµø«¼Ð'*â!Œw Cˆ K`›@Ž‚esÔ]éÚ/cŒ10¬yé8§å˜¾ D͘ôo\%Ø•+$|'†OµoäR?£=Ö¼౦pÉ(Ý‘€'…‚ÓÃÌÚÏ«ñb14¿(×-A|å¸!àÕ1§ K  xåÛX÷aÙ6¾`c÷@+ô!«€®f‡0/Æj„¾t(.¥ÁõùuMvÅ ú‘S‰ä[þu^rÑðŸEà±6à5«àèžÁÿŽ«^ÍÓpÐü…¼Ž”>3ÿ^-þ„Bí›ëÊ{T«]¨_€u¿ò…lã¶ý•±AÑ0POö³ÒeͶKø;Ž->ÏÅ&Èf߯ßß:ȵYI¡Jt\–À'8·u£ð8¸ð €ÇAÅÕGðà^ ØRR÷TÁ_ëß7¬wÕ¢7ƒ÷4‘¯lkû M"(U ¡î«øŠPuV?ú9Ì}uLêûmÈÌ}Ù‡b—uÛ²^²~]:˜€Šb  {ÙŒY¨|GËßF¿ñ:Èå;•ã§ÉεGJ¾ÃWf¾ºí&fýÓÀcµáUÇîQºÃOŠà1¡àOÛ‚íP }-°ÏÔ',þ~Æ×Òø*B>·ütÁŸ[ûA¶™}“B³P}Eø«Ç`Q0Ž3¦   $ÕÝu¸“æWÆeàÇ!ôóã”uS!‰r^›b`*®mõoT)è·oÀã—ª¤ï¿0‘|pArQ×»JíZ¸®c#ÈÅ¿U?~”|>wG7r£‚x¬¼à±b¸r'GG‚g„ð·‘`§؇áã7„¼îóZ¨.ÅÂW—¹_æW­|Q*…·Zþ1†…°)ÊF Õâï7%¥å˜~ùó5©wý”€Ze N°íïà ¢ä®›’Ð(ÐÐvÁú¥JÖý ÷® Ü(%çÇð‰Ö\æŸ(Ë ¯x,;rÁÀß¶;C…êWé~]ð‹J]~¡¤ã©~|Ó¢/| ùð­Š€P÷©ÂÝ¡hl€è£àŽpùÕLGÓϯåó©c50¿¬)ìcøæ˜EÀ›çèKýcî¶÷É„æŠAS…@½&²AÚ`ÍØ@)‡‹T$û|2†‹¼"ౌð €Ç²áÊÜ)Öº‘ýþ åÑ^ðhŒÿ†¡mð„ÖἸqZÕe{³<½V¿Ð­}òu#HOP ò"˜/P~`øÂòÚº"à›}kU¿lº¸,üŠ|_DcŸAf£^UÎØQ7TC_× Öf Pà X„~¡$Õ€¿~ŠÍÿßoÜÊ(JA­›ÀvMûùþ]‚¾aùã:·B½"p’Oõàã^ðh¯x4B"åƒäìÌ«ö¼ùMÿ{áMo!82üU?¿‘·/Lš_µöKK_µìua/AXU‚aXüа‚>ÂßPÀЇ;w¿X­ ök0¶( RÇÞ$èZÖíÅ(e ‰ Oj„¼s,iÈ Xgz¡y¡ûUW4s¤&Ö*¶ÔEÛïdýØ+€7ˆ8ß?¹<êàZ,,,œ†áß !þ Ø_{-{îwA‚ŽnñÁ_Òü"óççQûk¿°êÃŒòKË?Pö¥PòÚ¸¨Òþ¨)êÃ`ÑüЇâï3¾Xô-Z3èû, ‚”5ûÍŒe\}¯lPEÐæ"¨µüm @Ò`Ÿe¼¢„$v‚+X°N©²Ž5išd+l{¯±nÿØià|$ï7r¹’yXOþxØ033³£ÝnŸÁK꾉ˆg=ŸðNe)ès@¯Èç²ôUJ_aaÝ—–~ní+4¿*è]Ê€Mà÷£ø]KW޾˯¿Ü³ªQÛ&程è`ŽÉš€·Š‚à*„#íO]_¤$5Š@2˜2àlpÔôwq0%•’ÊŽ´E's`œß®ì>KÞù@AûËãDÇO‚à•ÀiÖn¿[vî$Ø¢#Ú_§ø…Å_ |!BͲ¯Z÷Ùz–´¿)ô3¥ ´ôâ·¥ñ;š¿oÁQ3[j£†=ý° ­èš ZƒmcƒTT×]±êX† ‰ qý¤FÀƒÔ”"ô·q•)¶\ƒ&ŽœÁ†Öþ¼÷MÀ‡ ÿ”óp=²<6)æççOŠ¢èl!Ä€VݱsûgœIpç@³øµèý<¢?óá—¿iågë…Yü™Ÿ‘- ¡¯ZÿÂðçêÎç¤ý•)áÜn2V Á¼t|œløµdÓ×16Ë޹ߕ>HÃÒÁ˜•$!(ÆòíÄrŒƒ-¨Í(ÈÿVËßYëáºÖ®¦Hf¬B‚»I’ñêÐpôQpÕ„ïB\äŸx^ð`jjjG§Ó93 à ÝïÄÌ cx0òç»–Fñk>ý—oZøUa/ÂPó÷—Ö¾iýÛ|ÿ¢a@Ÿ¡X}ýË5=ä2O5¹‚S¶.¸¬O…»ºÀÁE)ùÒVUÁâ›ï³±†Àæ&о{M¬¶ÍƒKH,Ê€#ƒ¡Nø pÉn8åTHÕoBìóOÀÍ ¯lrÌÏÏ?( à ‚à´ßüÕ¯°ÿQ&¼k×ðÕ_Xú¥À7…~Éô~¿?hÒ¤‡úe±ƒÍ¹Â?J"A¬Ä´–͘Ùo\º•‚ºC6…ÀY˜ ú?Ij”S1pĸº6ùáU¬ DBµÚaR½V¿–ðº×À®7›Ÿvð.àx`“bvvö˜(Š^†á³€í‹=ÏôSŸDïëç¶]øj0Ÿ)øCD ‚Hcp*9ýØ­ýº¼.A/›š× kÙf¤Xóº4‹&­…ë ›Œ7Pú.ͪ‚Ôb@÷@RU Š1+P“rX[MÐò» Ñà;Øi*‰-XH`Oßßö±ÈÙ¾œ™^ÏAºº”F©‚.W€£®@bQlë¶Ì3mÐvß9ÓU .ÔôBÈ^?½Þð:8{×R~LÏlpx`cffæiQ½)Š¢ãVüÃfgé=èD«ƒhw~UPrøý‹õ¨ €•Šw5Åib©.–Xj%ÀA¬øAéÿA‚åz4Èv7hL䪠­Û2Vt)*+Pÿ¸ž°’îûÐÖ}ÒTlÐü¾S·B{üô¶åø=°á€ ˆ‰‰‰ívûuQ=/ ÃÖª}ðç‘üŸçw/Eè[”W`Ÿ3ºê‹õ`/—ëzÐÊEÒÕ+9õš{±ÌçèI°ÂÌ@]¥Â%+M_‰#.@UdUØ«Š@_eÀåÀÈÔ§µªHu \v\ºN>u9oØÏ'„ðå„7¼°Á055õ(ŠÞÞn·ïP¾À3ŸûöB«•Yù¹`«Ýo)Ïëþ¶»¶‰õh;¦1Ðð¸¦Ók1ô½XìyòKTÙ`X:öÕj˜™µñ–BNEÀT⚺‰=þ¡¸Ä¶Ž•ŽX7_O~ üã?­Äì¾x™â<ÿ¤Ýð ÀÁ­·Þ:´uëÖ·Z­WEQtÈAû"ßú&œóJ8òÎÚ¿Oñž&Mx ý~V¤å'–avõ³òîozŒsH,ñi1è#E6ª©:hþN¦Rà l ˜ …WÃ!Cˆc»R` 4»ª—Òâ®Ù{~r5Ü4Û]Ú£öŸvy—Àú‡W68pbEom·Û ‚àà¡ç?Æ÷C• @­•o)ÏkÞNKÞÜvXU‹Qú¶|]ŠÏ@ÝOP/Š)X¢B°ä¿].þÚ÷sùÔ±ƒf $IŸª‚Æx… ˆ«.S¡¨¤bÌ€Bà»jbüì*xLJáŒ3Wc–x—âBÿ^¿ð À:ÇÔÔÔ#¢(ú@»Ý>nÍ|©Ë.…7ü=¶C±Zhàß7êÀB_]¯ (ÃöU4m´³Ø©¶T¡½\½Iÿƒ¥ôHXÌSFöÙѤ±¹Ý¸å°+=Pº %Ž*ƒ6E #`^C“0aÍÍ@«ÿd5gúð!ÄùþI¼>ùK°>qË-· mÛ¶íÅQ½²Õjº¦¾ÜɧÀÉ÷‡ë¯ƒ¨¥ ÿ~UúT(ÜM[ßaé*û4øîº¯]{ТýðKa!ô› |±¨‹²„k›Ý%Q—Ê „rÿˆ,K¤® På”Â9ȶe;ü¢ $A¶” ÃTèÇÙ2 K%@¨q¢P ~ÌÿÀüoÍö_v-\zÉjÏôC€OJ)Ï^è]ëžX‡?>Š¢w·ÛíÇDÑÕánÚ¯x)l?Ô]¦× W)Yéðs5™ÑrY>~yfOÓT½‚þ–*ü—Cð7íW°¬?N_& î~1ï­³œ €£éÆÄ›l@\u)˜÷¶ªDçÖÿÞëàñïx÷Áœñÿ ¼UqéÆ~ún,x`áÀ‰¢èºÝîikþË~ðýi:R§«Üm5ùÌÅ¢à¤þ-ûÍcêà…?KüjÛp¾º§_çÂÅ(0˜"Ø‚šfCy¯\ °º ÷@å~Vâ„€«{î€C;Ø3þàLïX?ð.€u„ÉÉÉGQ´«Óé².¾ðs΄]lTï3ÑâDø»Üê·û5†X¦ã–¢Ÿ¯D7Ášó6üb™ÿ¦&—¯ÎEàrˆÜ9Ý_¸‚Ì e¢oË t®@W„«†åý~ÉÏáCX Âàpà#RÊoBì_¯ÏÚÍϬìß¿ÿˆv»}vEÏk·Û­uõå/8¾üÙbìUkß|ÀÙŽ1ƒ¸ŠEƒà?êrÏ]ÓdYŠò,Å‚_êþ€¥(«¢฿ú×°Mê=´X6ÀÚDHÚË Ç±ƒ°)Àì$´ºpùukqæx®bb=n7<°Æ166vb«Õúp§Óùã0 ×ßpúãá¿.Ê,¤ ¦ ŸËРU¬ú>s½æ£ *ûÖ€®Üïk,uÿŠa™\}Wáv©©3Öm•> X ³Ø6@ ,€l[$zà`’¤ó# E p(Ùg^ý[øáÖḛ̂MJùnŸ*¸vá€5Œñññ‡GQôÁn·{ÜšÈï_,þß÷à£N‹“Ø»˜K[ðÓ J€ MÝM§ËZd*CËhé/Öʯ úì*Và%ë\Mæ1ýš®Ô@[§Aˆ«Œ€Y\è¶ŸÃéχw½w­Ï~Ÿ*¸†á€5Š<5 Ãèt:w^×Â?ÇÙ¯†ññìîô®±F‚_[)Ñ—Þ_â”Y²°ˆÜýõ¦¬”rÐô˜âçïÃòÔ¹T…@cMZ kJ€¬é*(«õbE ÈÇ~y\}+Œî\³/ðVà£>UpmaH–…;î¸cäÀï ÃðÝnwc€§=&¤ë}…Óv®(Š€áû×J¬:J­. F¢÷=vÀR¸ØþÙ瘺ýýöÙ¾Šlôç6»F4aeêO KÉÝ@Ù,ãyyë¼ÇE˜¿ÂòEÙz‘¹Ì^aTn«ëQ+}µŒåÍWÛþe½€À;I×Gó&gÖÆÆÆvFQô–V«uFEláŸãÞ ¿¾>} Ú,þŠRàèú–í^TŽÿJMŸ•pX‡V¨Úßb¬þÇa„û:‰áÿ3 eó}Ò¨0e2®¦C²¦b``º’f§Ó¿ïۯק€\Cð ÀÁøøøÝ‚ øD»Ýþ£V«…ð§¹åxÕßÂÖm‹˺±,‹(ëÛðÁgÄ*Ä8]B>Ë¥ ¢,‹ÂÐ`ß ¨(¸4eÀQNج `Ë0•k¯€ÿÜ÷÷Öó“àBÀ®xÀÀøøø‰a~¼Óél\ápä‘ð‡„¹¹Š­X0¶m¶ã<ý^¶áZX܃ký ÙðØ~ÇÕ]Ÿ>ﯻ®Îñ&Ç6qyÔ[‹&…úPÿ«SÓ‰¯Î- [tÃÌ[c›¯HqDŠË ‹ÂÌeÂäœñòõ.üü»”òq›ýٰဃŒ‰‰‰‡AðÁv»}\EWøç˜Ÿƒ3ÿ †G² nº1¾é嘋m…+–ó=MÛ/²¡Ëú¯ojå¯ÂØ’Ü `U^¤eÝ(hÆ·4aÔ“ðµo¯LfÄÁÁ>Rw€Ï8Hð ÀAÄÄÄÄÓ‚ øè¦þí<æqi@ ÕâG¯è§Yýý‚ý–&ã@C ¿‰•ßð=Ö`>éþnfÄu\ÝçºÞ×ðúÛ:Ú¹Æ1°V4d¬/õ0“-À@h²AΨl@PϨ‚cwÀË^µ‘„?Àa¤ž 8Hð ÀAÂ^*„x{»Ýnoá¯âÌg+”k?ÿ€þú ˆ%õ±_Ì9ľ‡p×AdõÙ¶Yó‹:Æq\£}ýî¯E Zƒm3F`vŽº¼û}õi0œ¼H1¶QÿȵÏ8pà¥A¼­Ýn·7´Ï¿OŒíÇÞÉÏÅPãƒf0¿”‹È¬±¨zoõN_ƒ˜…i¿Ž•ÏöߣéXKPadŸ(|°–û•ƒ´~‹7Ô×Â[ ²F\€ ¤&1ãð¢—mä§Áð àÃ>MpuáK¯"öïß?EÑK‚ 8§ÝnwÖl+ßÕÀC_úŒ¥ô¨«ž1¼)ªÊ)ÝE¼W}¿ ¢á9¬»ûåÈï•Õï¢cÛoÛgüVMƬÇý·h[ÜYÙ^óï–ë±ƦAçêòwý?/¯0,Dú·˼QQ‰RŽxfý88þn›á©ð¤ô'–ÏóLÀêÀ»V cccÃaþs†Ï‰¢ˆVk}õôY\y¼éœ´D04 ö[é<ÿ¥ÐüË8ÕÄ2~†ôïlàpŽ Hõ²&_* IDAT=Ð{º¬×gPeмG-÷®-X°Ö5¹ffà_?µÙž Ÿ¼° ð À*`|||8 Ã÷†aøœ0 ÙÔ–¿ŠûüÜë>ð«kÓ@§r‘Ö¾yÈ¢à ,ûå8ï’¯i†#êÎUÃÔ±6&Àlá,ÐèV¿ò‡eÛÜ_gñ7eÔcsa*ê¬òÅtGj@ ˜Š“ å߀²"½–iKíÍϬ| À CþgäÂSúü]8ãL¥D°Ë/ì`úåùKÃ׿(48ïj¿úÆ6Ø2+°_+3ûB«½ÐpœÛÔí¯;Öu_(¿sîÀ¼Ú1fÀù2k ˆêxÝ+ψ{pÜñ©«lsâIø˜€‡WV^ø7Àÿ¯4Ò9G]™m__,%ð¯ÁyWûÕ·xÕ€?YwŠË#ük·›î3ï‹~JqïàØçü]—.¥À*øÁÉÉÍjý«ðJÀ ÃK£ÂÄÄÄpï¢èŒ ¼ð¯Ãô<ë©°e«AÙ®F]ÿ墸ÈÃàÓ¹Iq!Ñdßqæ~ÑïX‡¿¹Ö͸€Ú˜[€èÔ¡&M°ÄÌLé÷÷ @ °Bð À `bbb8 C/ü›bxžø”´Ò™i®8ca7(]<§ïü*ƒ½j>¿®èR¿}È%G³òÎM-ÿÊ:Í×bqÿ™õƒ\î›k¥¸Pzá¯Ã3+/•–¹ðÃðŒ Ãpãuõ[)<ó)%ª¢Ÿ2°V•+Ùwàà~¾¥Ž›XÁÂ0ô›Zÿ˼¾lÌ€… ¨Ýv]§A™?@Òz°Tᙀe†—LˈhÂ?y4Ä_žcû÷÷۬Ε„ÍênÄ,â¾dÍ‹zI)‘ ð¹ ºNýz¿ý1&ÀR¨D³WÎôzpÌ]¼ðwÃ3Ë Ÿ¶LÈ}þªðÃÐ_˜Að' _<ö﫲Á¦ˆÁϱ„ø6’KùZÚÈr<ˆÚ+\S‡¯yJœra¤ Ê&û•RÓÅznÅ7Y_ì5¤‘TvÀÔ¼ìïüs >EpáÍÓeÀøøøHnù !¼ð_ þê ˜X‰y½H¿|ßSÖYþ Žu¥¿õ±ê—PkÐ;ö59>É?'iüÙÕc°Ä`g„¬Í£š0 g4a°KÅì,<àá.wõÏ€þðLÀ2Á3Ëq£èí¹ðÃÐ ÿ¥à~§Àñ'ÀÞÛ—È,3¹"Šÿ–tŒl9ˆ ’MöZ­^›5lZÁU«X4ü|ÕõnþٕЃJ¡'Û›Œ»Úqy‰Ýš±AXâÏÎV´ËPW Ørƒžý?ÿ›Ã3ËÏ,SSS/B<Ï ÿeÄ3Ÿ ãcý­êåFOÞz¬ÃŠ/Ž‘õÇ8¬aÛ{›XÕKõÿK™ Ûû«ãvv@9—•Hú»ô¸Ü™4ØgZþ6`P† rC ˆ< `rÿD?ï‡g–Ï,SSS/B¼-Š¢V®x,N>î{2\÷ ˆ²ž u~u[ ú:,¶‘Pe¾¨}Ò¹« m[²ßqM®•¥„nq&Q½„Ö¦<ú±¢îû48F/DœZéB¸þ8é`°7á©c´‚AY>Èéõàè;Ã}àß"‘3g !öûË1|à"‘Yþo¢¨“ Ÿë¿ŒøÍ¯á…σC?8Ÿß†wKî¾ãÚšQ€FûŒ‘\Ò²öIàj&Ԭ鎨ÙW®«Ç {1 aÛ— DZêg7]ªß¯2V·¯Ïºv)ûƒW½Ž=ÎÏù¥áBˆgûË0<°LMM=\ñú0 ;yПþËŒ» {\ü?Ðé®Îg.Fè7“Îqé¬ +ûôM÷Ÿ–Ö¿6'|MC"·žÙ)Œ†<& ´šu•HÏ$¨g²ÏÎÞ'«_ز*gªaŠïçŠhA`*R.V`vþà^ø/ž(¥¼@q¿Íá¥Ö€È„ÿÇ¢(::þ>×…0yžñ°uÛòûiZ_ Ñ¸»ÉŒËª—αjĹPAÐ×ü™µåíÅs*Ö~MAÑǺÖ}n&@X>OX¬|Ûq‹bê¾ÿÀëùß"a~ÞõÞµ[Èjýað\!ÄùþR4ƒgÀÔÔÔ‰BˆEQt4à…ÿJcËVxòÓà?>Û¶/ý|+*ô-”½4Åp¯S¤Å²ïgñË”QÙ”f aBi,‹ö¿T#îkÇʥȖR¸¿k`cšŒ•rØÑ~W]š–¿•´–€%V`ržüT/ü—‡‘)ä•€Ág¾‡ “““w ‚àQýàsýWORÚ%m e«©c¼æ¸…~ÕZWYÝô—Fz)õcªï飸X‚A}ËÜZJû ÷˜pYÑV ]d›6 Åo¼·Üv¿g ¥ƒ¥Ð÷û+×…4ðï°Ãᵯós{e°x’â[þR4žù.LNNAð™V«õX)¥þ«‹.„÷ücúд޺µÑrÔ)ý…;Þ&ð AqŽF‚ß®˜ Æâ–4Wææà¾÷ƒç<×Ï镇oÔÆ{ÔazzúÕA¼Emîã…ÿAÀ¥—À9¯Cð.ÁïÜk²­Y÷Ò¥H»ï#ø5÷€Tiþ~1êg;¯FŸ'‚è3Ö€ö®PðæÒBÿ»„µ*ð]lA…9Ð-~s DS×À2*HXX€w¾<ƒ¸ZøOÒÀ@¯Xàƒk0==ýt!Ä9¹Ð÷Âÿ â”Sá¾§èÅj1€à¯õõW×¥¶.«‚ÝT²Ï诔Õ礬~7i©D'm=ìû„?Ô*¶zÎ:†ð“å˜ÈÓ y¡lW»žßeëéB ®z*a™Õ(òDÁ"Ž!Šk]&憌à?-NШÂú3óÀ?/üWO¾ ü³¿ŽéîQÅÔÔÔƒƒ øt†>Ýo­à××7(ä~}óõûSþ„½ë¸ìó4KÞÜ®œ§ú=¤éã—–p?[ª¡1í¥+9Ýšþ§l;× Ûe)[¬uîW}û&C œÃd 7B³óÕ¹Ì}‹cÐ¥8 ü;û?WwgúÌ€*<`ÁÔÔÔñA¼Ã§û­1{\Zèÿ]£8PM¹ÝÅõ©ç¬üa^cìP‘¨|v±«’oˆ°ì±\š¼Úªv¢V0ÍŠ¯Œ¥XJ ;P¤ÊRðZ·)Ï­¥Ü¥cZ×`@æ…ƒÔK&BJcŸ£¼ð ŒÀä$¼àÅ~|TJ9á3j¦»Ì&Ɉœ›ûtE•R†¡þk ðÌ'ÃÖíz¯w¤¬Ùv ~](·¬úék•€:kß#`e Œ}˜ß =ËÀòw6ÉÐŽ©¸¸Lu«-Àc÷)ÆŒ”=ÓOoXÿV6Àd–@?õë`a l ÎÍÂï Ï}žŸ¿>3 :»=TìýÙ5ïÛö;'¼@deE}ºßħþ >ÿ™T °¢•oU§÷¥ÒqÎìâçöÕ÷gûŒs˜AÒÒNöqHG• i} (.3 qJ\5÷Þª3 Į̈*V:ß%ô ¡­¾Te@8EC—Ac%@ ük·ýÜ=ø88K±Ï_ ðÒMÁàÅÓ7ßôêÎ=îvvì jµüEY‹¸Ï}á‹YÉoaÔ¨ ð³÷U—M¶&¬ AoÒþ²h,¸jË[\ûòõ$I[é&YÞ$k­›$ d’¾ÈÆ´í¬¯,ÆÓó•/YŒ§­{õ¢¯:n¶öM4eGs¿pŒ›n£ï`‡rnÛ¨íœÊ{Ša_Ggt¦ û¯n99 Ox2œpw?o×NÄ®]»¾é/…g ìå!ÎnçàèaÝõîüÌgx­}mâ¯Ã{Þ‡íÈšåíW}üu‚_¥ûÔåõ<Æzñ™–sæŸk9‹ihΔcúšå`Xÿ²R«»õ«Zã&]_±ìE5КâWÆÍ] ê]°ô1ÇŒïk|§jŠ ¥AïëÅpøápÎý|][ð=ì³sb÷(£¾ NA° ûaÇ'>ÎQO~2t‡üEZ‹xÁó`¿Y¨P_Åêׄ©ié«ca¯YóýÎ'«±6@%胠ýmf™áü/ÎäôÎ~ö†y¶¼ÿš ¿ŠŸ\8„¿êתÛá×wÑøV¡E0ݶأ@Qs%À!ü…([ýÞãž~®®=ìþDñãÍ|6½ðÃQ†Bx_(x½±†Ïz.wyÍßÜå®~ʬ5\²^ÿj¥8Ë×_G÷7¥ø1è~,4¾jÍ—‚ÙFë—BÝ û•ïaUÔÏÆpQdš»Q™0X-ÿ+¤û gn¿ÅGo¶vk=°î:‡¯_ØÏc±ö›0¢O` «¤1³³p¿Sିöótíâ\ÒôÀM[$hÓ§†ð’@ðœ|  ‚ Û!¸k‹…}„›&&8æ]ÿGå§ÌZ©§¥Å®ý´¢š?³úé뵂¿"€U^~†)ÔËeRw½* AŽ ü}Òl6T[ÀØÕ§õ¯ü'MÁo¡î¥&x)·3Ë_*6]OŠu!‚l) PÖ‹?%]ÐQÊ@Óy”lBý/åK*‡èKµ˜P^(HæÅ޲Ô@‘§&"ÒX !àYéçèÚÆ)àÙ›õlj`÷(à³àP ‚ AD¶ £6a»Cðë=´ñgþ¼¿¡ógòÓf-áW×Á ÎTй­}*‚úZÜ&o£ë5Ú? ’+õ*Â=q+N…¤AýòqõâHk»àBèÿúc@ö)ñ››Ýû,l@Å—ï¢ïMw€ÂêvmÛÏ/0¶÷ Ñ` ÖtB+ ''ñ4xÄ#ýü\û˜ž!„¸`3þñ›6 `÷(' øl(8ŠBøAD ÿ¨Cµ Ž<’`r‚¹ >Íð ¿‹8á?mÖ = n¹®¿œÐR…=–`?‡Õž[µÐ±ûé5Ë>N#ï“'Äe4~>žäÇ(Ǫûe•¯FøçQüE”¿’ ³,R±HŒm=R_+÷I™ )•Æ×YFJvÕ,i\S÷ºzý)ÎWÆUèûKˆÁ,¹ËG¨y”_]ÏZýŠ#Ž„ç=ßÏÍõ6ðˆs:Ñ%»¾õíë7Û¿)€‹GŠàß#Ácd.üE@Fˆ EµRáßê¶³W§KØj.̳íYg>û9ùBŠkccðô'ÂÖmå-m}«eíCBNš>Iá•X¬þDW—ï?)êw°Pý–à¿J  Ê ت kO€jñi ø«PÿY?¨øé]ùüÖà?ÃòWãD ¼'(ß+Šuã˜Z& hfí×-³ëa@Œï'|õÙpÒ½ü¼\˜›ƒÿ÷_ã.ÌO µ€nâ.ýt:¡o¦äIk>>Íõ «=·ðãº7÷™ãź´XÿªÅŸ–½ÉHýx•2Vòùãb¿úJÔí쳓ÄÌùW¶e¼b¹'Å5Õ¬}rÅ©dtE +  ÕMÃ=ƒ¡Yâ8À¡Ô4= ŒÕmS97KxÚïãíçäzÀ¾÷?¾÷c8Vœ»ÆÙTõ6°{”‡p~ 8¤þ"L­ÿÂïßÕ€n—¨;”*Ý!¢n— Ih7x⓽¶¿ %<éô,¦+ÀfõÛ”gž)ô +_'+’cZüÅ1ô ´ÄhÅ…ŠÀäÜo– VSµËRWPècfú_1f÷ÿ—qP\wkT~% PXÜ‚·±Aaí«1åºÎ”1:+¿q–ЗXX |÷{aËV?×:¾pœþ¸[‚ôf ‰÷!9SÜÀy›å2l*àG£ì àË‘à4©ýÖÔQ„¦t:DCÙð/€¨Û…v’ÎxÜóD?©6¾úä;ß‚8|´"ðÝÑ÷Ôꩾy™X•+YõÅ÷ þÃæ0¬bÌ%Z©º ¥ÀÒäØº®+J>¼²íNTñ°¥ÿöà>§;@ Š@¾Ïp hKU)¬==gÀíPMŒÓzÚ³¼õ¿ð¦sà Ÿ…‘m09Óc0? É$ɯ‘ü±¸›6Ã¥ØT À%£¼?ü ¿µ [ÝÒêϨÿTà,@.üEw(­íÝj¥Âæ!ƒ=ØO®ƒ3ÿ öí-{¾×Ñþ¦¯]±âUÚ]*ÁwÒ¾«²ª…ïÎÐ2TÆ@ ¤ÃÁ`*ŠÐ·UÎÕ.¬vT}.*c¢’û®Ä –`Y AoÖê²W-~•(×s%@‹° öÀôöã´±^Ö ÷€W¾ÚÏ¿µŒÛn…úGØ{;LMÁØ>80öÃÌ8,LB²RþG’ðìðFf6ú%Ù41—ŒòDo‚Àôû‹°]Zý­ìÕ6…ù ºÝÔ×Üj¥JÀÐÜðس~÷Þ~¢Lì<‚äËçÃа!è±Óþ…¯XøZ´~l÷ã'ñ@qfÜ€LzŹ¥Œ«ëÅÒðÇ+~ø„Ô½äÛR"³±ü_±%Ëã¤Ì=òú?Œ¾ùú˜’]@RaTÒýI%QÏJHŒ±DËØZîbªÄ gGÆ1ÂÖc@-™ öÚÖ!¡ ÙT'91Nôœ3áˆ#ýü[«ØýÔö¢ô•gËÄqzïÅé|†dr’\³kœ«6úeÙ À%£ìðþPpL™ïŸ ÿÜúWÿrº?[ªÖØJ…»]2Q”¢˜€›n‚»ÝMIIóXUÜùÄO®†ÛnN‹È8¬ýŠÐ7ë£±Ž–ÖWSú²à»T¨eëš¡üByP…b{Eàgiv‰T…ºgˆñ4,OyU³æÌ#(„=Ê>­ÈžR©)šR ,q§JE 0„œ±õpÈBk$­‚^ýs„«’K(Š ºIRÈ™º÷ÿCxìãüÜ[«¸èëpã ©¡VÜ/fS¬ĽtD åƒÏÙÎ7vsëF¾4›B8k„§ËJ¾ ‘ûI­þQñŸ-Ã\È”ºÔ÷ßjA«V ‹"Ât{j~x1{lÙâ'ßÁÀ±Ç‘üǧahÄ]‘Ï&ôÕnz2Òjd~&°õct@&1Ć…o¼ŠóJEð“hÂ^ìRbZ‚=öæÒª/Ôóç#hcÅ@º¹¢•€¿P¼Çá*1; êKªÕ¥¡(åãÂâ ê92äA‰ZÍ£òhýX”ï‘$D¯|M)\<Ö¦&῾™þNQK¿òû-Ž‹l✈AÆÃÀè9Û¹p×8sõmxà’Qž(oˆ@duþÃÜò[Šå©iÝß*€¢“þå–ný‡!„Y„r¦cW]™ú.ït´Ÿˆ«ÃwÜr+É/žÑ}F¢·ÈÕiúÄ2givе_¤î)Â=Ž5«_³ôs…AMÓs |ª½Ì…z9–ëôú¦àÞ§9*cm› }Y*E‰lé…êR?W ¡2•@©ÿQÆ……(‚ûòr—†dbœá¿x:Üïd?çÖ~ñ3¸òÇ0ÔMŸÍÂøõŠ”Ó\ðgŠgÎÈ OBró®q~¸Q/Ó†V*Ô¤Qÿ™ß?ÈSþÚfÊ_—¨Ó)ƒþ:]Dî÷Ï}ÿªðÂ"P©0! -S»çFŸ&x0pÏ“H>õ¯ˆNGIÕ³Yú‰áß· o»bÐCÆqå}UšßÈÅGÏ/×UÊ^ê‚]ôª°O …a°æXVÐǵ E@XK€¢¬°6aN©Ö˜û¤¾.¥eŸþd/ð„5"RVÞ*Ì:¢ÆÐëѺ׽ ÏòÿÖ¾ö¸coÚŵx6gšzZuR þ8ÞBÎòԌخ€ ­T©ÿ°(õ+´|ÿ6Q§“¦ü)‘þQwˆ¨“ýu3Ë?·þUáoT@Ëï°0LoÄŸÿ Ž:Ê»V##±$þþwÒß.Ñ ßT½Z„Lj(Ü¥¥Ÿ ’t¿Œ•òºå’Üâ‡*­oøRàK]à¿úÄúïϘÛÂúÕuDù÷Ø3ªŒ€”Õø{}†ÄÒA¯è¨$2–K-V ¼=ªl‰‘Ùº0¸r|?ÃÏ= ît'?×Ö ®¹Î;7}·;©¦ (µ Š{­`Šè)1…BЙŒ€ÜyÎ6.Ü5±ñ\VP©-å/³üƒV[/öÓÖ-þ\ø‡Ýnà—ýµ[©?) 3 Ó.UÁÌžÔIzÃMOÃÅ?Hã¶â'êjáwïMòùÏ¥ÂY îÓ*ïU-yd¢ ö¸— û^æçWùòW.è ¿>š¥.J_ìÒ¡ô§ù]Ö—h¦@F@‚ßv<¨)Š®ÔÆRm@:‚¥Eij$i‰v,¡GñK'q * zùƒ¼ô1È©)†ù(‚?¬ŸckùüèbIŸÏaX¾r KÕÊ…'J@`—1qœ*²$'ÁÆtlH@£þÍ”¿\ø·Ëb?‘Rí/Ò2:e¾¿õ_ÜXF[Òœ¯Í¶db\ò£ô˜cóv5E„[¶±pÞ¿Á–C­V~…ÞW#ñEØ}½ªÐÏú@oª£ zitYðq~ëäëè¾~› Ôê”(¶…¾Ï¶^ŽU•£f¡ÑÕÐ\âþ”>Š@ú\7šA™~Uaº^¯=¤J@*,º¯ß•²?¹ ^ÿÚ´ÈÈHúœ v6 ²e˜¹òx€ì·N#+ÀP’í Ø ÀY#¼½BýgA"¯ó_(Ý‚úœÿ Oùke–îûW-Qö/M¯¤dò*ëÎ5?McN9ÕOÞÕÀ‰'‘ü÷ÿCŽïW*ø)ñj€_Nõç¾ýÂâwDõkT¿‘_/Ñ¢õíJ@iéÇà´þmÂ~9\‹eP—¢f_±Ô}ŸQ®ÙˆpW<´)ý@³öEú…õº‡BÏ6Å@Ù½ÿ¶>ãو߻ŸŸ[_ý2¼élÙ’g"(²Uë¿`”X5(0ÏQS—Ú˜E!(âî…9®§jJ‰ÖP?©Ôc¤¡PT¨/õ£%Ò¢?ÛþîU0êçëAÃå— ςßîí‡fîW%ûªð÷‡v@–Ɍ·8.•€8†…ù²J ò®çlç?woŒ2ÁJxþÏ/Ó©ÿ2ê?hu´´¿Üú³’¿­¡,å/O÷S£þ#SøŽSÐç%&Má¯2AÿýôþÂâ/Sù(½^ '‘Ò™²g ùX±þcªt¿¢>u1Z€>¯¾ÇÖÓxD=cPøé ®$襫µTV£2¡Q›@‘øzÅBíãÕE¶^nÉã ?út¢Gÿ¹ŸL ý0¼ïÝi™ïv'û•¹pWY 0Ü·* ©€ª÷²>ÉÑ¥mð†Q.å¤@ðÁ"(¢þƒ‚úïdÂ?RüþÑЭ¼Ì¯™òWøýsë_õ™Â_¡ý㤬5]üq™oš+—_?ÿ9üñý$_)ubz’…ÝAk¤ú¦ c¤ì¹ûzE¾Dª4¿tGí›A~5‚ß*üeCe€Å¹`0 ò9¢™Áæÿ7K×)é{Œ@@¨WÀH1TâÀÉ€…þïňN—­»Þ˜2ƒ«‹ÛoK)ÿ«®H³¨„…Nr±šõZ\Ay#˜\œÅË"5ðwÏÙÎî]ã\¿Þ/í†QÎὑà«Ô[£þÃN·Lù.êûGYµ?lQÿ¹ð*õoø% ¡×[ý¶ãZ­´`Ð[íS IDAT¥—¦•½K`enöN`f×;‘‡v3Ÿ.ôUᯔé5‚û +_)Ô£úåmþ}›Ð/ÖÑ›õ_¨*‹Qj™±HB4(´0 Åó\è.‚|QÏWé~Ka!£W€Ö Ys èJB.L´0›oä°Wž¸÷}ü$Zm\ýxË`~.}6¿£¥šSíŸûþóØ­P cNéÛ±êXÈÖR€¸ òˆs¶ó¥õ^&xC(—Žò`!8[ ºB¡þÓÀ¿ÔòZ½ÖÿPñ?4DK«ö×…N»¤ÿ#%…DµüÕ2¦¦ßߥ䵦+J‚L•€àë_†{œè;‹­9”`Ë0sŸ=í:„¿.øS¯[þu.ØcCÐÇÆ¾:ËßFñ7aê %Ô+®ýÎúÂþYÐ\‘ÈØÎþB/DT­åkZú¶*R±òÍ~h‚DVÜ93MûÄü[}|æSðÙO¦‚?2D•Uø+m©m €ö W€ú<õ‚@½¬@P/S’üpëz¯ °î€Ý£ ‚÷…p/”‚?9õ/2Á´ÔÿC•ŠÁÐPJïu,~ÿPÉ÷Wo>mTþÅ%ͯ斚Jš‚‚L?û›­·Áýß?–û†¿ûÝ™þÌ;ñRZ©^$å¯PýYúžYOݶõ™lK¤Jõ×±6Ë?q¼âš}‰ã½Îï ܬö]DŸQÓ”H¸•í  ¤nñë¡ÿš•¯79Ò‹P™:À޳ßGå'Ïjaßðoƒkž¦øŠáeØ”úꢮ @d¸"KWÊÂ@y W¯W þœ H²ARÞ# œX·ÏÃõ~¯ä B”Â?·þ;]‚V7-úSÐý¥õ v”j­–Rí/*ýI4ðû'±^PÂ¥§ªmR‘2ý?ûiðà‡úÂrbx„è°»0óÉ `[ Pþ¥Ÿ¿´ô½† Ö¬|CЫÖOVÓýúZÚ²™`qÄP/üë‚ܺoÄ>ˆ>Y ¢>ŰN°>êí{5Á^˜ü‰RÈÖîÈx³ÉÜq+COy6Ý'>ÉÏ›ÕÂ>üÁô™YZÕû¡¨å#íÔ‘æ Püÿa¤× Ðê¹ ¤r+ÆZØë• AZàP`a=®kà’QŽ  àP²À¿0PrþÛÝ"ð/Ì©ÿ,ð¯\*~Z†õoË5ýþf ÉbÛFý'zûÉ<íĪtà××Á%»Ó¸€Gø‡ÃrÝô'Üéï}yëo¡P„¾bé«t¿ÃÇoó÷J€º-ûXß²jÇæ±Ò­Äس Ô}u¯âXQ=ŸK‘0•W€à@± ÞCeLM%4B •ºÅÃ]SìX˜ƒá-Œ¾í¾‡ÇjáÓŸ„ï~†‡3£K…Éht¬þ›æ©NÀ`E(å•€í…ù2+`a^ <ñœí|}½V\× ÀY#¼%<"óÀ¿0+øÓéÔÔé‘ò×Í¢þ»FÔ”EýõŸßhf™_µ¯)–ãŒ6¨ÖW» ãð¥óà¤{§…ƒ<–Žv›ö¡;˜üØç[LŠ_·úå"„} ôpäøSMûÓ±t x3 ÐâùçªßA=¦§Û³œ¿â¾ úýû2 ®Ø¡³ù£Û*ôE}Z¢M.تûm[j©‚BSdÅ\þ3û§¦uÚýý|Yiìßï}7Üx — f&€Aãä~}!jX€ÐxÎ+±ª+ V­ÿžâ X™ ƒÞ5ÎëñÒ¯[àÒQN‚w İPËýFmD«]Tú Úi—¿P±ø£¡²ú…õß2|ÿê?¯óÂÝ)ü-Ç©7˜Æ˜¯ìFowÓàÀÛöÂü¡`,ÇÂÝ™þÉÄ—ÿ 9,Š2½ƒXýªÏ?®q$.:_º¬4¨ rYêùþžÌ^À‚²O]7_¶sÄRYâ`Ê5®À` \¾~›»€J: ®$TåA¥x¯ÁX ig¹ÿ&ÚOx*‡ýíËÓgÇÊá{ß…ÿkúŒl›½,Ô¿+ÀV…ª8G ³QX2¼Z•@5È[êY[y`o¡\{ @Ê»Ÿ³«wóóõvù×íÝ-¯a‡i“„ˆ B„AÔ"ˆòêm‚v;Ure k¤¥úµÚF±¥i„L”ß2©‰ø7„¿:žSÿ¦`sä¯@À¶Cࢯ¦2ox³p,aÈ!/| 7Ÿ÷EÕ–»ªŸ¿ŸPãˆ0‹÷T^–t¾Är¬:¦YÒfßÉDÓÀŒL™ý½ÀmÀ|þŒ4sÝE9¯rù|„€!!Ù!`è ØвŸšù ²—P—"-±[ì7¶ócÒñâÜÙX õboÅûdQÚ?+ŽK»ø )YG¿ôœHß'$B&éKdË0"25‰n™á°çž•fy¬>ü¸þWiaõfÌI.óД·0Ô³>¤™šÝK)û¹Y˜5Ÿù-XPÙÞLhµ¡“Yùó 07—ºæfavff`~6}%ó ãaù÷ò.|WÜÀØzú Ö¥pé(OžMi„(…¿ÈrÿË®jç¿ò%ÚíÒòWÛû††O(¿á¤a±Ç‰¥“”RàÇý/ë…½¬¶?-m‡À%ÃK_g<|^ò’ÐyèÃhõ\f?ôä‘ãG)¬­¼e\-êW…q58ÎqŒ©„Øê d–·”ð[ 7JÉu ìn–p«„ý~L%0 È==¦?8äڜՆ#C‚­Ã!t…`8zA2¨€-Hî)à¾BpTCv†o&2ý5WL%!W4…r,ºÀ(…¾*ø¥ñ>U@¤”*ü“ì©!‰$å\KB ¿¼™‘³_Cçä'ÈJ᚟Âç>›>‡GÐóú…E È­x½:¤¦›‚%Ÿ!â­Yém·•J·À(L÷u»i/€ùY˜IÏ13 Ó#ÙØ Äói}1*R>xÿzú)Äzú²Öûç…ðHYTük+Õþ†ºC²ÐOkx Ñð0íáaZÃ#´††R_ÓÐRï_-÷›?^Ôhÿ<˜¯WF„£,£zq™Cj ªìAÁ(¸”å†Ïoþ$ýwÀÛÞ 'Ÿâ(KÀì%»¹á´û#w€ -úúùXV«üYöH{Ž¿MÁ(âRaK,™”ðƒv'°'‘ÜÀ ßžcï%ƒ ö寶ÌI†#èwp!¸Ÿ€ûéöÎHèJ¦(ëÂPòmaÙÖ”ã•](·E¶.²ó¤YCBé+2Fì™å¸_]GxÜñ~r¬¾ûøê—Òֽ ô3 üHKÀµ–r»}ô2IÏ•jwÒàÂ-[aÛ6ض=]nÙ’¦ ¥)àAX¦ÿÍ̤=[&&`ÿ~Û{o‡ÛoM™Øý{aüv˜‡Þ$ñn$_O,ÀºcBxb”ùÂô•[ÿ­Òú¢Výßј€‚Š¢´Ìo%ß߬qªZÿFI_Wµ?'õßÇ篭çÁ˜ A‡ÿ xø£à¥/÷–E¢{Ê©t_ûj&ßüVäU:?¶¬›cj J×»,úØ¡`d>ü›øN,¹IÂnà» 0óÆ&×âõûë$ÀdöÚ ia”· #¶ìÇÇ’ûJÁï„p„&ÈÓyÈ–…b …!»V«¥*’*#PnK™Yþù±€ )Ønšcû»Þé…ÿŠ@‡>¿¹>˪¨‰è²º_(®ÐÙQ „¦Â`ThíõÒj‚s­ÔÐRÝó¥P]í6ô:)0< óó°e¦§SWÀì ÌNÃBî HNCÊgï]/¿Êºb.e4|5„S¥‚€0l#´ÐOÐ!ì t»„Ýá´ÊßÈHfõÓ&Nµ½¼Û_§]æüçå~óV ø‹{º¦YtŒ²Xþźbý›1ªåïÊ ¨V)©b| îÿ8çþ³H¸ê*~óG÷!!iW-}—ГFÀžCè›Á‚ùØBhwS ÿKv/ÀM|ïœn߈×ùuCˆ;EÜIÀ#œÀ Á}#Tk>¤ÊäŠn† 0ãŒcÊuQ®‹ÌxKLû)Oâø÷€à°Ãý¤XNüôjø/Ëžç°×tÒ7*,€¬ºWs6@ÍÓÏWHŸéQ” ô¡¡* °ukÊ ¥ná0*Y€¹Y˜ÌX€ñ1Ø·öÞ–ö'¸coʌݳã°0 I|=’‰س~šuÅ8=€Ssë?ä¾ÿ¨þEYð_«¨û_øþ[j‰ß–¥Å¯Ñ"Œ´¿¤jÕk7£ƒÐþúý›H›c\úCxú“áe¯€SOóœ1rÏ{2ôº`ìÿ9jøZAY¦Û™û‰Ã= ÿ° ¹)–|;†ó|ïõTà›xà ¸ ø(ðÑÙÊH(¹w(àñœÁR‰ È™€³ñPÏœ<ÊvÎH%Ž@ilŒÀÖ'>Ù ÿ对ÿ‘Ö2ªþJ–•–ÞoÆÙÌÊU<ôgfhTI© ÌϧֻÊ›-ßsY†éwît¡;óÃ0<—*ÓÓi<Àì0ÌmÞÄs “ãòEÀ+×Ãϳn€KG¹³üOˆ¸«ÌÒþ°Muí.ag˜ ·þ‡†i ÓÙ’Zÿ™ÿ?J©œŽYò7KFºŸÖ¢—„håŸïOb]y }ÿùÍÝôgLËâîw²ð4D’¤Nô±ŸýŒëŸùdz×]MÒ²tŞ&g }Ó-0/aRè/H¾÷ÖÙÍ!ô›â½[†G Á#€?à‘`§iá›ì@(ôýZ¡°d$`2n“tŸó—Üí]}»ÿ1–qÞýNKŸµJ¿²bÀ(®X­¾Š°PÖð—2c²ÿn·ÊlÛ¦°Ý2ý3îÁì\ʘHÿžýJ,ÀÞÛÒçîØí0½¦ éýɉ¸i­ÿLë¦Àó·ðäžI¸“ýÉ€¬Û_Ð΋þÿº]ZÝnÚT¢ÓUÚü*Zoèì?­ÔoÞ:q”õ• € í_ø†QÿÎ|V²ïˆôï»ðËp»¯ÐèÇ$IB¯×#غ•™¨ÍÔy_%VŠédB¾§lÏgË©äÚgÛ ¤¯9 3’›f$_œ…]=ÉkÞ0˧¾Ûãšÿé1í¯¾Ž¯Í#¿8Ï/ÎqùçøÜ£Ûü{Wg3ð. m¦Jj͂Ժ0fí¡O)m rŽ|ß¿°å„Ö_TôZÄÕWÁÞ_ZÚ?P±)ú<×”¿Â~šÊs°üÕí¦òç¼Ö$(³ü£HÏ3먮ทfôÒe¾ž–>„uR"x]¸.åÎÀß‹ì¦Dý¥?\Jý·íA»­½rú? úÈhÿ¨eäü ½¤– mKïë“ÿ¯¦ü%å þÃú ¸;¿÷ƒ¶ }-ÕT_ÿÿ0r Žcí•HÉö‡<”}òP¾ýmâC”‚8hô½6¦* ™µû‚äë1\° ùÞ[¼¥¿(œy€=ÀÇ€}t''’§ð°@pr¤0.¹Å_¬g®²‘êÆv²¶¿ùMl½Ï}ˆ{½ÔµáUEáóŸƒK3Ê?j-à •ÏB °¢¸OÃôùfÛ±Ô;ýÅF@`ž Ön)iQ)rW@·“ºæfS&ydKæ ˜ISçfRW@²²÷\y>+nàÇkùçZ €<2€»–E¢,ï?+øÓj#Z©ß?ˆZ™ß_Ïý×Rýò8¯ö¨þ$ŒˆÿDoô£¥¤ÄŽVÀñ9þ}üþRŸ •Éa[ß~(\~ <ë©ð’—Ã)§úSñ¬៿¢ÑQFžö &¿ùí4hOð  wÌ󒛿%ßY¼ç­³ìöWzùpÆ——}dáäOø«@ð§-ÉHQeP–Ùy­€@–ë²ðÿ+JÀ^ˆ~ÿ~ú˜ÇB»MÇA€”’ HƒŒ=â–›áÿšÒäÃ#}èŽKÊ̬Â(Ïj©?¿‹A‘þ¬·k§Öz^ —LXÈjÃA)#òºÝNZ¸hv.Meœ™)˜Icægòâ@‡ƒ|¬m`Í».I}ÿ‡ a^ò7ÌRý:iÍÿ"à¯;D«höÓ¥ÕBt:J½ÿv•0ï6-ÒÔ ö­´lÉõ·¤¤ØX­‡y~·+7~íº/M¥Õ:íô;ýKpÏ{Áî´éŸQI’8…¯×K]‡Êø­73wÙÏèu áÎBæËŸ/>³¦%ß“¼|^òš7Íò©ÿéñ[/ V_œcá süü‚9>÷˜_O`&; Øfº¬t¿ÐK Ëi8ôoá°<)ÝM‚<Ðÿõ-øì§ªQþÚ3KÔUÆÀ—hÁ&«M òFAª+ ²¸"£(œÄp ÇezáBsP4 Z™Üãœí\¸–­yÀôýÂ?R€vÚö7mñ;L««×üO}ÿ£ÖX¦ý [›ßXOõ3;ÿ¹”3ç¿Öÿ᧪þ•ùbþêzÖ «Ó… ¿ ×^»©[ ›Â¿×ëþÿüµ°°€Œ"FF;ÿZ0/Ja?/ ß>3’sg%¯Ÿ–¼ù-³\ñ=ï×_U|aŽ›/˜ãÂÇtø¼„=N°]ë3 úþ…+p´ŸöuÆ™Ý.2O³M;!¼àÂ'??}ÆÚ—¯ßw*Ê€pì/ZS}nJ£”{ù£f/W,@TöÐâä–WœŸKƒÄ{ ©,¤%‚%“»Æ¹h­þ|kZP­ÿÔ7 ‚¨“ ÿÒú††µn©õß-©<ÕÃeý›ô¾øgý¹€ÆÁ~WæM,õIÑW0&IÞ{h~}=\ûKxÐC6Ý3ªÎâ7€…ùyä–­ŒÏÏ2µû*æÚ©ÀŸK­ýÙYÉgg$o¼®Ç[Þ?ÏO¾3ç¥ÀÁÃæ˜8Ž‹Oïpn"¸1É!,ƒòùs°ómogä¸ã+–¿”!Ò6ÑÚŒóJ@‰› ïÿg¸ù¦”]u]›€µãDƒ @K6Aúcf @ö*e1bj÷@PØáž’ 6?—¾z½´•tÞ.˜äès¶óù]ãX‹?ãšVTë?!A•Ö»CÐN€ ›*ÑPIÿ·º)#PXÿmCø‡ÍNQÿ=ƒÖcû+‰õ”¿¾QþF›£¹•û_ŒðWÇ:Ý´Ýæ×¾w½+µ9\M…ÿüü<óóóÌÍͱ$ÌoÙÂþk~ÂôþýL3’ÿœ“¼ê ³¼ã{=®¹*!ñR`íàüLxL‡se®¶Æ¡ªŒÁÈ«^ÉŽG<‘ùüeÔ[¯ßú&|öÓ©±ÓЍÜKUŽgŸ#þÉ ‹›µè0¥°yŒX¤´ ¶)Eºw¬dÌg¯ôæËŒIo­f¬Y jý‡©ðóšÿÝ"í/ìt áßBt»YÚŸâûXÿqë_í`kõ›ôQ¤å†tFÿ ÷$¨S4…@¤× ‰S—À=NÜðJ€)ômÂaaAþ³³³LOO³Ðj³o¾Ç¾]öݹ—_ŸZüë®ÝçfÙ"ð¸.ç&pc'‚íùÌ’c ~ï$vþÍ‹hïØŠðD Ø”Š@Ãÿ.¿T¡ü+ü}¶cm-+ÆŽÛÏ(ÙU¹ Ø  ¦*ÆbQ!6.ë ,ôJ wÄóé5#¹óZeÖ¬ðü-œ³¥YÃÅ÷ßî–¾ÿn—0ËùÏ}ÿ­¡¡´èO×,ø£Ô{¶ZÿyÃÃú/¬üÄ.ü ß¿¬÷ûcÉ÷ï+üÕÞµÞ@ø“(H•¢‹¾–Æl@—€”RóùÛ,~Óꟛ›czzšééi&&&ÿéüðÐKn¼è¢7¾«ÇWz‹]áü9&ΛãâÓ»œŸ¤É' Áœ…Cþî•l?åTd’T„¾º]'ä7ðÛ›ÒÜþ;îHŸMþö¥(Ö€@»i=±í©ÿÀF,ÕXËŒ1¡(N> ^söº{^5‰ðWýfffŸ™žž~ÏÜÜÜ»ÿ?{ïoÛU• ~s­½÷¹÷&ááM!ÛÖÒ"‰ ñ@c@ƒ@J)lí¶ß¶ï¦T´-µ¬®îj]‚oÁRT@_åO ¼•nË $¹Ü{“û8÷ž³×œýÇZs®1Çc®µ_çìÀ÷·ïÙ{Ÿ}öcí¹æx}ß7¾ù›¿ùŸz»x1ɾ覛Nø®·½ímopÎ}×ÎÎÎWx'NÛÎ9Ô¤5&µè}Ÿ2Ê¿ý›À{ÞÕ:2©ä?в·“’!¯Há»W ûp ÔlÈíyÓ:û½‹­Üï…αÏvúé±>#†;³³Ó¯£ÇÚ‹ ïö;u@Ø›*ãnðúmùª·.0ßV÷·!ûŸt€Öù›É$ÈþÖÓY+ÿ;%ã~}ÉŸú­xɈõê³£~=P rˆ×ÉŠÄÒ?; —Áðë@?Gà=ï^þãÀw~Oªêµ¥¦9ŸÍQ ßîî.Î;‡“'O~àܹsßÿ’—¼ä÷?5víb‹Ú~á¾éoÿöooðUU½x6›Ý:t-Ð0Üçìü9à•¯îøÈ°œïA›ªèX`úÑèœ? j?' Ž÷nïæsàâ0#€‹­£ß÷킘Lza¯8{ìX 9ÚÎó €›X÷õØ¢`«BÖw^‰k ðXÛ!lC@Kÿ´@Êþõt 3›ö|ÿÈùW}TÎXο‘+I@ dÿvŒÞ÷£†ýäú[Êïvþ´|ÖýÉe÷Þÿ^àyϾO´4´?úùŒÿܹs8uêÔîéÓ§_~úôé'ç_싾è‹NÞxãßÙ4ÍWïíí½ÁÏŠð¥}Š#‘Z´ à×â" ­±w½øßªøÙ9²¹×Y{õ€ róâ>Ø]jæ¸Â_‡Þ¿ØU|°·ìuh?W 2­Ÿñs|à«;~úìQ ÞL ·¸‡á‰ÛòµoUÀO©€Ë]Èþ§mö_ù‰}öï³þjÒí_gÀœr’ù+’Ò¿àøíРŸfýªÙì·ˆóÏõôvŽ´‹úe? üà7ܸ•{–ßp9Çß;~ß÷'ô¾œ?þûŸÿüçÇ_,²G?úÑozûÛßþçÜ/L&“gcŽIÕ)×þ}j¢àoÿðÞw·ÎKDù›ñûÖ¨=m„9,Fó£Ã‚Ò@[%ðÁ€s]à¸*®Ð6¶§ô]¼Ø4žuRòûû½OP˜±*ÀNW¸x˜O3? ç¾À›·á«ßš À;º‘¿ˆ²ÿÖùÓÌ¿ ½ÿY7ùo†ÉlÖõþ§ñ éñÅ%öÿ<â·ª$(‚ý½ÿQçP «‚ý”^¿€ÆäO,ƒö˜ÝÿÀÿðã?¶u{ÖóßÛÛ ô¾3gÎàĉoØÝݽ¥8ÿbšÝtÓM§î¾ûîÌçó¯ßÛÛ;I«K¹j€¯l}%à£~ú'¿ë°(NÊÕA#ØÀÙ IDATñwÂc¥íÌDW6c†Î 0) ÐßWw•€ªŽ«ÃtZ`À\ìe~½ÈϼˆÚç›ÔJàh˜ìõ´­<Æ= [¡Â¶5@eps|fÄ™Þù3ä¿éFþVÓêL<ò?ôýë”·)‰þH½ÿ ØÈAü“îdÉß³ÿS†•¡öþé .œœUÕ¾ øñÿ­-‰mù2­Tò÷?www±»»‹S§N힊ÝÃ\ [Qxç•x8€Ç¶C;ºÒ¿a¼ÿzÒcð¯žvÿÓ©Ìù§e)ŠÊ·Žeù . ²ŒœðGëþc3•ëOo.DgìÅuï}¶\z?à¿xËá)Zj4?Ÿùû~ÿ©S§þüž{îyîsžóœâü‹-e7Þxãɺ®_Ð4Í ÷ööNKAI`ku>òaà§_üýß‘’ÿŸk´‰¬“ŠžÒà À¨RL^€`Âe¯WúóU/ 4>˜ít`ÀY')Œ›ŒÁ͇½$¶¥ð#5pE þ3}é?íÏø·ÓÓÿfíÏ ü3™¤O¿ ÁŸç?Ó éËén yDöŸÜÇ~Ÿ`ŸôDípL9Ëà^öCÀ÷~ç/¾ÙJ’¾gÏžÅÉ“'óÞ{ï}þóž÷¼­RÝ*v߳믿Þ=âøÝù|þM{{{'ÇœpèAÀ›Þتú]Ø%%ÿ=}Œ,ᯠ,Í 0ú{¡XÚH˜ÒÈ_ô”ÀPØëñ^hÞ‰Æù׬kV @w™ì Õ¸« ¾á°×÷¡·]kZáþós˜»Œ¿ ªÙ fÚ¡þCößõýé”?žýs³øÏ,ý'h+;}¸¸€³ÿ$`ádˆzdì5Í@@ƒ'àò+·ý5ð=ß |ðöY'œîç9þéï…}î¹çž—ìcû†ç?ÿùw~::¬b›±G=êQ¯jšæË÷öö.`L%€‡b¯üUàÏÿ¬ÍJër%PqòQ 02ó_$ØTñ@{¿Qe¸ê«P]€.ð@À½½~èz^˜Í€£^–¾cLwhàÉîaxäa®ëCǘüwy”ý‡þ¿þÍz ÀlŠz:i«S–ùÓìŸnÈÿr`@gG¨þ!½ÿˆ9máKåzþÀ¹¢êŸ$ ›ÜÏ?­”ÜÿÀ{Þ<íqÀ/þ6ðØÇol8çÔ1¾DÕïü¹sç¾õéOúÿSÜU±MØ#ùÈw¾ûÝïþƽ½=Ìf³gö{˜ÅÄû[êáL1ðC^õ[À¹s-"=Ú+¤=Aؘ†’>WEû½´.œù»áLJíË´}ÿð95,@Õ‹щ®àŒÒ Øé°“Ž8ñûmŰ3¡ p´¥6×\ çž à݇µ¦½àÁmöTÿ¢òÿ$ðý«é¬kLãÞ¿„þçëÖÙ´ÇO3y5óQúOÀ‰3 û/ž€Ù©WCà? 8h2'_ŽÚÈŽËd \õYp_÷$à6×j—´ÚiÙÿÞ{ï½ýüùóÏ{ÚÓžVœ±Ú#ùÈSûûû/¾xñâk¥RÿÐÌ€«üÉ¿ôŸÚ>ÓY¼7d+¬ eÿÉ>5”õ›áçXÕ {ÏZUŠ ðL?ìÇœ*ž °ß Ù.`àU€i `W¨g]À7ÏŠÃZχ¼óJ\àq®[@úWÕ½Ú_Ý#ýÛ¬Ò–ÿ'ù/€9¼ñÌßI²¾¹V 2èMóßßGÂÊÅ‚=rbÑœ+cåÊÿÑk°cª'ŠFB3o÷k1ú3€ýÚ×-¯Ò‰~$ó¿}ww÷·ÜrKá÷;»á†N6Móâýýý×ñvÀç¿Qzà©“À/ü<ðÖ·´§ªã=Æ(X îÿ‡unðÏa¹Ãç@ÀH%Qé  ÃtÃø Lü#”@¯ŸâÁè¾ p¤ÎŽ´-€Ù‘^xtmð¤ÃZˇxå? ïÿ›ªê³ÿz3í*ÓªÙ4”þÍt€d\£´Å,–£þÝpÿ?ÉŽ‘Éþ£70°xéI èA‹âéI—üT+¾¶p¬,×: ø 7ó¶0wã¿ÄÞ¯¼ö_¼ÿ}kY”wM3ÿ .àÂ… ¸÷Þ{oßÝÝ}ÁSŸúÔÿZÜR±ƒ´G=êQ'1߸¿¿ÿûûû§| @u†Ä‚ÖüÝûá~ê'Û ~GŽdNv^æú;©*°©&ÿXA5) ¡A†ëlä/Åx&ÀaÌ› PÕ}uÚ!Š‚>˜øÑ‹kZp[§ügº/%ÿyà¤o´½ þ#™àüWÂÈ_Þר˜+ÿsçLï_Íþ|òjÖŸò­  ”ÿ‡½I Ã#×:ÿ¦ÕÍvó90ŸÃ5s˜ë†ý?y%v?ÿ €7¾aµó»C[S®¿ü]¸p§OŸ¾ýܹs/øÊ¯üÊâü‹Š]wÝu'¯»îºŸ³Ö~Óþþþi^ àU¶~ÿuh~åáŒar¾NÈìý¾`är9Ý#¤L_Ëþ%@q ,`k› 1¤yÄD3x€íω2 ÌZ;Gz‰õé¬eT^Kàð”-èÀŸiaå?þ¯{íÿNØ‹ÿôÙ? Ù¿#_¢c2¾Ù)€™þ?ÉA‘ýÆÏü1FYøJ¹_»n4É`VæƒV!á³Xöo{çß:þýîÒ¸ô ààÜ“Ÿ÷ï®U[Â8âŸöüOŸ>}ûÙ³g‹ó/¶vÝu×½ºiš—Ð €W´VÀÊAÀ]wbþÿ{oü“6»ô·ìÞ£`‚¤6€ð#r­>«³‘ByÝœ:`w½æò töY+`¯—nšv¯z¥Á)Á©Mg¤ 0k[ÕÔðÌÃX»‡ð€ŠLý«&-ú¿ž´´¿0ügÚ÷þ'ÍÿÈù;Aõ:v›I 0BðG’ý·jåE¬õüsY?½žEÿgÎÎûwÂq‰œ?ùÙÌÛ˜®Î|ûwàü7¾°3º€qÀÍüï¹çžÛÏ;÷‚§=íiÅùÛ»îºë^m­}‰V Ø(ðMoÀ¹ùAìôÃÀ‘¶¥à\·I½HBœkðò?/©‹Uå6ýÅPE`͉|Û>?m˜X¸Òª{1Ð_%Ðch`Ú3<pâÁ€µ“_ýK—à€‡$à?þ÷ €IÝeý¤ÿïe€÷Àù{ à?—JùÚA@Cj"½vvu+|ÿèdÜ€Éhýç¨&¦%tI':_þ÷ÎßÙöº³s87‡«j˜k ö~óU¸÷«ŸÑ¢’G˜ß<)åïâÅ‹ØÛÛóhÿ’ùÛJ»öÚk_ÝOÓ>ÿ˜JÀBx€ »8ÿÓ?‰Óÿé?ÂÙvºk,œž1ûÎ`Šój,€ЈÚÞ”îÊó²ýNeÐV@ÕW"&™é÷B*L/ó¹0€0f à/“©àÆÇôš=¬ ÀÍ=ø¯Íþ}ôÕöþgXuU€6ûoAQö¡?NàùGÙ¿(ÿÛ‘Ù?Y”Úù¬ú!ûrüô„3F)ÿƒŽßAîýóãõþ[ L(ýÛÖù·?ÛÈÀÕÀümoÆÝOýJÌ_÷ÚÁ…Á‡ü\¼x/^ €¿'?ùÉÅùÛZ»öÚk_c­ý5ÍÑç*£‚€|§¾÷»±û=ÖMgý…ŽŸäˆ÷•$û‡Î ½Ð=iL5€ïOë$%RŒT0`1°1`ŸUæs¢ èp·¼†@Ú¸ À×ôz=” ü#sÿÍÄ—ÿIö?Éðþ%ä¿TÒ·c@VûiLÈ'\vÑböŸsü|ê•t=Zÿ&nù†gþœ5áËüô×;þ¦Ëþ÷á\‡ö$ðA€Ûp¸û™Ï‰oýàcíùSçöìÙÛ÷öö^ðÄ'>±8ÿb[oMÓüU tÎO\¸ 0ŸãÌïüîúŸ¾{÷^`ç(œwüMÓ…ëö-z^kÛÏPÈüÇ:~¸zà²Ì ¡ª¡ëXпl`?íÇOlæÀÜ\oa ÙNø íû{âŇâèA®Õxù¦N€j_úï€}ÿ_(ÿ'À? ÉβëFpÿ9ê?CŠk0£õ/^RÑ£÷å'é è†Ï0D‘þ5!ëï³ÿ°ûmöïšhŠ.;ìþÿîú¶ÿ¸óŽø¿MÓÿ3gΜ?þüw>îq+οØ}®¿þúOZk_,Éip›ß~;îú¾ïÆÉo{^Ûv«kØù~ëøC0ÞµºK ¥…ó\ÚØþ’8G0çÈ­€ @l ¬ÁLNˆ ªz<@xÿ®ß £*À>¡vm¤m€)QœÎˆ†M$ ôÈ™9Ø6À¸¹¦ÜÿªnÑþ¡üß³"çO§ý%C2â?¡|ÍzýN¹MÛc€bö?â(Пjö¿L€œ¤ Ï% ¢'‘S8ÿê¿]èõ_ò½ÿ¾ôßÿìfkt×q°÷ê×âC/|>ùªßiŸHFûv™ÿî… ¾õñ|ù)vŸ²ë¯¿þ$h%€Vxà÷äëÿþºç`÷•?÷‡Ã: »¿×^æmõ­Íþý…`’ýÉ)[Ñ@ *¡CÆä‚‚pñíÚ"hxK J« #}ut>ï«û¬ 0Ÿ“1¦§Ö“¸ã+¾ 0iÁ€ÆLpÀl€ÃhÜ Âý7¾÷èuÐý7“è/ð@^þ§_ž˜ù+=m·€èsúàŸ1ÙrÒ!¯Ê·P@BÿIù?+ý 3áÚÀÉ—ÿCößUlÓ:~šýÓÒ?½¸.à Ìßù—¸ûkž‹»~ý•¸xú4k1ïÿ/^ÄùóçqæÌ™ŸÿÒ/ýÒ"ï[ì>i×]wÝIçÜ7îïï¿€Ðj€sÎì}ò“¸óW~ÿª¯BóOïŽ?n¾»O.óý8ÛÀ†Ÿ¤ f(¼RˆñZ¼ î]¹ß ¨ ZãåàÛŒ¸Ï(´ ÐP6€¯<@vU€  ضö° p @Tþ‡iUÿ:ô?& à{ÿ!`¼ÿŠ!5”ÆÆÇüRçÆ¥9Pâý'ÊìÜÊ9ÿd¡+峤÷†xÁFϧœtáñÒKšô¤‘%9_úïþ¼¿î:çN@-ýÓìŸÝçf€{pâë_„|é¿Á©÷¿µ!8sæÌoœ8qâG‹)v_¶‡?üá§æóùOìííÖ*Áù£ N½û]øà|Nþë—À]¸£l}³7߇óίm ÌY€ƒÅýˆí I)÷Ÿ·+P®¯ÒXvÜ0Òê©/©¨`@tö  aš¾¢0é…ë¨Lp=épuhL° p /ÿÃLýoÚÉÿÖ¨HùßL&¨§³”ú•hÈ‹DA€•©‘£_¤€ ÷ÁÕ(fÿ‚ÓÏ–þ¡zÿ´$(rÿê>œ(ý‡Ì¿+ýCÎþ-½ìîJàü¯þ>ò£?Œþ‹¿Àù{ïŹóçßxöìÙï»õÖ[÷Š )v_·k¯½öíMÓ|• æg æ.àc¯{->ò‚çâÂÿýËÀƒ'pÓ#°M'¸5ŸÃÎçmÿ¿ ö»*@ãÁ€¶k4ÀÌŽy@JDŒ^ „ÌÔ JK`ÜÖ™nfÃwÅUäGGꀴÅL(¡ @Ä€< !š `@& 4!?M`hà [¤ü_õåÿI\þ7$óŸÌÚ@!‚â¼ýoS;/ÿK ¿àü1Ìûçã-ǪTi¼|‰»Ê+‚kxù?Q¾€ ÿ©þøÞ?-ÿG¨ÿyëüƒ‰Ëfÿ¶ èÏÆö `÷þ}úÓñÁ_åvOŸþ¦'=éIw×QìSÅþð‡¿Ê9÷Òù|Ug Îüãøè+~Ÿxî×Âþ¿ÿwe מ_]yßv7µö:@༫Ìû@ÀzV€ÍìK™6€¾¨3"´ ¥™$Æ ´VÅŒá^CV’:`†ØØ^ÀWö»é€ó†h êª €Y ¬'Q`ï€Úðò?|æ_M€zJzÿ>óï¦V„ª*þryÛré_é>Ç0J¯?7(»ø ûá½~¥÷/!ù““ÂI9@ýƒÆù§ÓcçPÿÖ÷ÿ÷Û`À÷ý‘ª!k÷Y´Ž¿A{Ùw@sؽçîþñŸü_ó„'|¨¸ŒbŸjæœûݦiÂÁ–YfqÏûÞ‡¿ìGqêÛ_ w)``Ú`Ú9X烀öüó¨ÿ¶ÿOñ¤ `c] µrû†‚ä À8\@TõÄg°}3úì•\à@sO œÏ[àß>aø  éü hÀ'²´ ÐU¼*`ûžn˜\kò +1ú?Pÿü…j‡ÿ´U€:¥þEô¿ä,ËÐÿœ,%ûË^s좓nh‘7}€Q*ƒƒøË ïÝ2lD‹þ¤à?JùóÈ=û÷ €(ûG̻ˮö¦øÞ¯^W\E±OEû¼Ïû¼sóùüEûûûo6U…ý³gññ׿w|ó‹pá¿w9`´át{®ø ÀvN}*Ž]ì~7ÃÚž @¨HÄ™ht: L†&ˆ‘-£o˜FBL¯Ãø­ P+`@‚‘ ­€^'¥m4Áÿ÷m"<›õÀÀ‰×¨Ðý÷ű&,0¾üDåTÜùOZð_í«õo€ûŸ”õðrÞ¤îÇ©n$â_ÿ‘“]¦ZM@(7ø‡‹ÿÑŸ&¾Ø†¨ýí·•€¶H9*ûzÿ$ûŸ£­\tø ~±¸‰bŸÊvíµ×žBUýìÙüž;ùq÷‹_ ûŽÇç‰o´m çº6€mU8C€²öç½ P—ý[Q€î1ȳ¿ðÓ µ¿.yÍÔ6ìȽY¬lŒ¿ªdŸÃÁ€ó9S¤8ÄEÍæx&@5¡¯ñìß{ÀægHÐþíÄ*"þS‘Þ´ÿM@þ·€Àhìo„þ‡ðÉÜÁ©“ÿrà¿nQñ!£³2ÃN<±l?bw¢ì…Œò;^´ÿßðÞ¿ÿizä¿mº €ë>¾‹ž^ËþýÏ}ö¿ï€óØsøÁo9ƒýâ"Š}ªÛ¿øìÏþ£;þãø¶{~úg€´l –µä|ñm€7ÐÓnÛ*@ß pá眩R0 …. (‰AFúk-)Ûï[&X£á® X mi@PÓ6¡ú}ÔY†¨b=›@¬c: Áç>ó~xð¦ÅÆà˸ø†zõ¿öz Üÿɤwüµþ“zõÖÅèQ Pqüȵ°„ð´MrþÅ7ŒÞï7F¦æ²~ÿ¾³à¿FÿuÙ?šNê×;/8ê†{þ´ì߸>óßµØÝsø¾¯½*®¡Ø§‹í¾öW×=¯u•r¾8__óç”ëÊùMû‡Ï´z`Ó«:«ËóH¤š-€L ?Ûp0„L(HqFB`?jš^ è6vÝÑ'Ó@ªÀU¾bÓëð`àê~±T„úG€úÌßÔ5êzÒ©ÿÕqïßH“ÿ•-Éþ…2¿ez÷böTì'‘þúà¹EON8^0Âóˆ`Èâ?®«Î߉Ã~¢ €”ÿÛì¿ÛšüÆ„LùŸeÿ¾0wÀ^{ù÷ÿê4þKq Å>ìé§p®^2Þ°"#âvYì±¶Ãx` Ý÷U€y/Ä‚€´µ $,$±ÿÏÁrJ ™Pši$ûẂ7â>M¹+Û‡–€Ðð3R¨P2!б6­LbA pø…›^‡Üä°éú+†gÿL°šMÛò‚ü¦þùŸ‰WþWõýɹVð_õ¯eÿüä”:Ä‚IOúç>ò”¿ü×Äù;9óÿøwÁá­ ðSÅût´§ŸÂ ëð²}‡{´ ÚúÑZ];ÀãZÚß<R<@h$ólDÎ¥GaÆãükJåØ `Õ‚ØT±ÓçlƒžÛÜXÐ4½ñŸ‰Ž®)À}Òfÿ¡ ¸Å>Ç7¹7tô¿Çûá?Aù/ ÿûŸôWM‰óçà¿j@÷ß)ã|y–?FöWÿ þÓVjÒ÷G~ &wöba”Ê2ÇIàý[ü#åÿTîW‡ è/ôÿì:œØwøîçœÆéâ Š}ºÚÓNá5xE¤™Á54B àû)€®i©@P«8O˜.r¦ìOšÒ_âäÙcs¿$­Ñƒ˜À«BùßTrÀï©Ñ˜`* Ü4Á¤À¤ 0éÇ£ ®6Ÿ½ÉO¿ñÀ7W¾ÿXÑéußðc'Ôâü}Ĥ‰ÿˆhv'³ø´?k§_àÿKô¿¡ Àdþ:òÖhèÈüÜèi5ò¿KåŠcDDr¿st@êüI $Ûûw ùßþöpÁâ—Ÿ}ï(. Ø§»Y‡;wx/ºsÉ9äH ­„V@Ót¬€è# FU-È)þÖëü!Ó¢Mn/aKçfCt@R m¿BƥDzÀ `%°¦@ÀI/ÔÇ €goríD à™‘úŸo„ì¿î²ßÿ÷ÀI”¨ê|öïFÙ¾àø]à´ñ¾Bª»ðâb M ŒòÇZÙ_׈ÏE[B»„NüãÀn“é+^_÷),@„ Ì9-ˆ‡¼LðºLš9 M¤cƒ#0`·Îà¹?^¼’Þ a!Àxê¦Öܦ€[ éÿ#qþ6  FÕ©ö#¥þ¿Ií’ÉŽéû/’ý#Sþ—ràÜâ2ú &z“§ÜH@jÿŸ½GìØŒóo˜ów´€,÷Ÿòý}ö±þô³OãŸÊV_¬˜lÖá·-ðƒ<Àk´eýy¨„Þÿ¼ úB\˜W4  Rê×€TÖ€äü3-€•̼íŸ0ȃÙ´@SõtÀ0Ce.TšXÀQ«¸à/ý^ÿù›Zo n»Wxœ _zçø;dhTuú뀡'RÕLù1úÒå¦ÚqZ Â àÙ¿¤¨.žœó× üÂ]£².¬± ƒycø{Ú_,&³… IDATüßY+ÿû1ä>ûßsxë‡W–-¾X1Ýžv »ø™¹ÃEa +æù*€íD€ªÚ†«Ò @Ùj0¤½ü/b4Á ,XÒ $qï4FÇ00à>©ÌIÕ…†¼>€´Ÿ®ÝXÖ&¶ªxXƈ¾ÊJ®€ €ÀšµjúüÚÄ'Þdð̨ÿß•MhéßT]ÙßkÔ“¾ÿ_ ò¿ÔÔ‘¶9ê—ÿ… ÷/WYHf ãÕ÷G "Ì)ò·-ŽJ¶±ÓoúÞÿ‘Ž£~¤¢ˆ8øÇÿv÷~åûÏc^¶öbÅÆÙWžÄ;Ú–´À  àH  À~Z ¿ÞDÊ€ItO1™6{ÜP @«Œ¢®x Ý‚¿K>{®`2lP&€ïBÒ ónLM&xÄ&ÖÙF€wtüÿ¾ÿ_€ñÀ‡0 xBÄ€¸ãƒþÏõÿä»Fó“TmTô¿r¿Ábd–¯™p"åèœÿ/U;xùßÚŽîg»Ò¿ešÿ)ÐÈsÿÐáw¿êþ¤léÅŠ-fø¹¹Ã]¼íp0®oÄX¯~˜—å i'od9íÿ¬b Ò`ÀH‚CZì}˜Ã¨™Pep„ ÀÊÿó˜NÝ¿{>J÷‰skŸÓl`.ÀF€:áÿWý®PM˜`wI‡ÿT²ô¯ÿ)öÿ­’ñóˆ×éSòÑÿíÀBU #³‰_«FÇàdÝò 9õ™Ãu:ðÇÇ_M+÷{÷E‡_([y±b‹ÛS[Zàk¥åÆ(ÎÕ?Š˜{À~[°ý”ÀX˜ ~F T/G±´-w“eéýj8:°£Ð +Vk„c0 ê~ú`5¡ÇìÊÊà³Ö½Æ6ÕxRàÿ‡ÀU¤hê¶`&qWþËéÿsd«Ô ÈÐÿøâÈ•ÿò 4YIC—¿W§ÿA•þnpê_C‚Þû÷ÕG€ÎAíE’Û4û·ö?þªSEï¿X±eÍ?;w¸ËoyáÜëúÿQ+ÀúI=ÀΛ¾ Ðøo¸í=þª@÷“ªCíN± ,¬¸ÊÑeÂçJ&št: ­nc Ÿ ª9Æ Æd7ÜdÈÁ2ei€Âý'÷ËÙ?é³h¢6£Ðÿ´¡šN±å‘«óáqš˜{œt2ñ·Õ …I‰ ¡†¡?=úŸú¨;Â^Âÿ.8ܽçðÊ^¬Øò櫃`@_Ê€dŒ·4'`Àîñq»”ì3~/“8þf¨U2µ €T P7JaŸ4—½©›ÑÅh‰>¡:]Z·8® æ À(xö›Žc­=MW{ýúÿ„îP÷x€*Êþ+Yý/Dˆü‹T€czÿYúŸ¤ °È‚SþÏÈû %„ÐüO?“#BI‘â¡þ)è΄èJs‡?ºådÉþ‹[ƒýlã±àÔ[òÏãœíg<@¯è¢ è¬À0y$~âø…,_Üï 8~þz#Ñ÷2Ö‘ÖÚ %{Ò © 0'ZA€J3¹á`ÔôÍ|î—[ï\€µï¼Wxl*í?Eÿ›º Óÿ< Éþ«Jþ’EôÿÀ%BìØút§?¦ü/Iþ.ª÷kL¦[)ÿW(íMq@ˆLmÇý¤Jˆ¦HËÿÚ Àï—}»X±Õí)màut[ Œ~.:J $C‚š&(¶`Àn¶‡T=õÊ€tŸ3€À1-Ññgqk€‚ëʉ“ ÇdX¤P±*µØQ5 KLýËTF.ÿW$hŸúÊ ëŬ=0à@íJ0íýOPÕ„±úßå‘ÿV¨€¡ÿÃ)54ío‰ò¿¶˜‡¶â!EÎjÏÍ(IùŸ÷ý… ýϨ~€R†D_˜;¼ú¯ÎÞ±bë2¼bìB8%0 —îûþ½<°mæ‘2`TI¥û_NêWš8x!{ÖØ@`€ï‹&ÝsGV{.z[âãýsRzõœ z¹ŠPY‹Á 6À¬s]m¢ðYȪzçßµL×PûÿÒ—¯õ÷#ž»Ð€ÒôÿyiLí˜ìÚT‘ü¹^—Z0yõ¿ä½ HžñÛX,7í !O æýïµ·ë'.Þ±bë²Íñvçð–°õÑmÏèª6jb m$ ’¶'A/ÿõÿµÒ¿æp£}•;I£¿¿µoÇjl ¬b=>!0Áãmrø‚ Lùu­‚@›nê€ )ÿW±Ó‚€NPÌþä?úìù+ýÿþÉ! QG:jíŒ@õç~7ª0°Ò£àÆ_·‚Wþ#ƒØF òÿ‘¶ö,>pÁá¯Ê–]¬Øúìî…³ÀžC©ÄQe@Q€»*€mz&€:À(C~´ ²ã‡9³½WS÷Vº_ޱT@´¨P‘Ql„©€ô­¨BC‘°fA M´¨°îUý( °2­PMz)U%”ÜÑÎÞæ¿Ôÿ_iî/2½0a­š“a™þ?¿CÊþ#ðŸL¢b#ôé9Ù;ÿýöúÝrw—-»X±õZ¼Á9¼›žæqPÞwkÁ¼¶Wt]æOU]ÓUüh€î"è.à @Æñ'šü÷lï‹öRáͬ:@¹I^€]˜d&€  è÷×Ds…í·FQŒª >çâÖD@ƒ¾üoL $ZÕdh‚÷Ñ*KþÀº±¿nqÐoDÿßåÓýϵr€¤Ï¥ ðÖ†ÐóÆ"{j )Ò¤ýß´½ÿ;àÍe«.VlývËIœuÀopENˆm׃­Rþ÷XGûÿ.ÝŒT¦7z@ 9~UÛCU€U´‘ˆÞúÎ!U!PBý“1†ÿ¿hÔh2÷*ÿ+¢H2æè-›‘àèˆJ›ý¨¹ò¿uÀE‡;/:üeÙ¢‹Û¬YàHi m Ú&ªxZ ˜Nž¨Ñý0007x°%ŒÒX§e÷yI†ÝÄT½ˆ Ðý—ÌæÓð¹0 >ƒ¹®¼îà‹ú5ãXœÝ›ªRŠ ŸØs+ù—£”þ‡Äœ@õK*c@nmŒPþÓ±XþÏü=§&E£7Š:I@€”&Iÿr-úRTügßáמr²”ÿ‹Û´9à-ðÞˆ¡Ì¶Gx6€loÛþºµDXR¤û"ü“Ó4‘d³`æfðëËQͶõHÝÿ´^8`š¸€¯5m…Í0Öüõå¨|f`ðqúa@Ÿù>ø ú‚… ]åRé:7@¢ùIÀ—k‹G£ @¨pˆ^ óÚäsHŽŸ¤ÀŸlùßÅ•€¹ÃGgÿ®lÍÅŠmÞžrçü9?OãñÀ¾ÐJ` lvABšRIÞl5KÿlÏ“ž±{ß"6V˜Ï+T«  € ŸÄÈË =XŸ³·&&ÀÚ€£Wà¿0 i “þí«ýp *š},,¨d•/@„SZûB™Kû9´6è ’óH½EØhLÀhó´õ Š„þÿàGf @:4ÀŸ=öDÉþ‹;(³¿7W†uó@ ¯°@Àúv@ÓS¥ù'F› h2ejâ¥U€ÖXX ‰U ˆX\ÈjS)@:ÆxPü÷ëXGk ŒÁe.ém²~SÇl€T”ÿ ÿÂÆôýÝxvî¤20f­HÔ?}\o¦,ø@#,lÁ+M( ª‡šö¿ï°ÌÛŸüW¬ØÁÚ;¼_ÓíBV¿¥™›ýj ¤ÒÕmO` MÔ&Uèk®ÛIöÂ{1ùŒ¾î¬<‡ÅÙ €?WEQUW®ã¬Ð3 º’?pdbJ WäQޤª}inù çù/#4vŠSýèM^ è¿&³šs˜+ôŸ\à#³ðìîp‡Cÿ+vö­&À[£3žõ°@F ´M; ÈRL@B„Ü0Úd@e[Â@ Ep4%p‰*À¢5HQî“ô¸ {#—ÿs€Ä´hïÚºàCÕë˜~(PDT8ý/3™2Öù“o߉gËr+e”<%]7Rp£õnjܳ°yäip$ÿq2 R»4À;¾´”ÿ‹;p³¿×¸´n™ªzÅ¿ž÷ŸÎ肺ÇBÑB‘¤Ú³,@Ì÷ÆR…?[É4ÌW†æ¨=R:`#² ì´è¹+Iá ëXCë âß!£T§‚@È$¡ þñ?ƒ£—Tþ0 À¿dAN#;cèø2äÇè'BNòZ „ˆÒW8vÚ—=?(à¼-οX±Ã°x‡ÞŸž¹ŽÎó$t@‚°½óo[€î9f‰ ÿ[mŸË`¢½rÌQÙ ]0ÚÃ%öƒ@açL¬Æ26Ç’Qö¨Ë{Ä/_¶ú‡]gðPIןó”™òŸÊªˆoCÂ@ÈÁ°€¶ÀD "ú#-Lqüå0y-nPäømzxÇ/®îéöÛûþ¨lÅÅŠ¼=µm¼ƒùŒܱ¬Xôƒ\†ˆt_ËMluèýÔL럇ÞdíPcèˆK@mò*i˜â €4”- ¸4"ú;<äy÷ÇÑU?ÑZ€¿i)€ëßXÆ·ü@? €´RiIò9“1tŒçŽÌ¤¿Ug, Ä0ÿ_¤ÿñ‡)@m¡Kçë`R8‘†˜øñ% ŽþwÇÄ”þ±b‡eÎáõPÜì·ÈàP\þïY Ý»Œ°/eAqÝž–ÅpSÀ€CJ¨þýŒ?‚éËY"b„ÖIJÅi¬ŽLdâK`¯à£3ƒ#«®Ÿµ;§ üHRò7]´dªjx¨‚?ˆC¨~ð§T§¿Ž²¿ºZ”…)9w…£Îw…QÇG |rñ?ýÞòøÒÿ/VìÐÌíОƒéyKq®× ´À¦Ç8Q˜F›‡"í[&„Æxên/J \õÈ-b’\qô@ö_‘2­´Y4 4%@x¼Ï]ÁÖôÀþ‹¢:±,p¯hRðßà÷¶0üñ!9CëÀeÁB+FAÊJ 0)wioḏ Ž_¦üŒÎÛú_±b‡hN8àƒÒ~ПÙ1”œ¿@t=xˆ˜ìq‚óŽšÓXÇØ²º/I…VÀÐ"@2’] üƒÉ^n¸þ@ÿ*lIÀužè5| /ÿ›Hþ×<@ªÈ¿¤L9[bÁr'H¿í$ëwë•æ+ErØý/‡О Âç Ÿ•‚ÿºûìÀ?ú5 Èÿ~Ìú_±b‡j_u s¼ZvA˜DëqU* l…$‚íCþºäüM†~ïïóûÙ€@ï ÊcÖbŠ~ÇB€µI¨S—Z‰2+ú¿‘Äpç,ÉøM:1ÐZT ø+%ñ®]õ#¬­àèQI(ˆPÿ†3Â"‘>¥S„€ÈÄpêûÛ… ÿbæÏ¯çæÐ?1PûÜá³t ;ñ¢ÓÀ€@ãp¯n+[o±b‡o·žBà½ô<¥×#q €*F€MqCŽÍ«—»tFÆwd`!™娀CL¶ èúÌQÐe3Õ—è³o ð3¢/ÄÁƒM AÊ£|b ßëh àª32¿4r–Z `± ·À/3ÇŠ8³çJù¿X±m1¼ËeÎuNd ´lR %LUDú‚ ß'øim€‘ŸT«,m#[¤c¨€0º]¢`KeÚ8›ö\uñ·ÿîÂ5«^9¸í ÜÀç%žéW†L”*“ù fÀl <ðE]ˆC÷'À=q¶%[Ø&¿àZï\aÊ žÒ¬$á/ßò¸¤çX¬X±Ã¶÷4NÙ2ý•0Ø…¬íÚ„&(2¬ˆIÂmüwýò8s•ý4‚Àž>ÿú Ø:*ÁD€95Õñ[¸>œ˜© vVY4+Æàx €.âKÐýU§g\1ÇŸåÿ+¢?Z™Ÿ;ødÌ­“u«&#Ð/¡öµ…2XÒâ2ÀÈtØB¢okÉÂ_’s‡;Ë~[¬Øö˜EL\aø½!Œ &Ò´Î Ôai* ý鯆¿3©®~¶ä¯mNKL”l-‰ ‘‡$E¯£Meuòl7x.3À嫼ûu´.3è5‰ ^@2þÀ¨<(Ã-ú–¸ªŸppæì•³bQ  &R¡ÜìÿFZ¬JT0¨ÈÛüc-3ïÒeÏ*d€¿-[n±bÛc> t鹳ɜ€,84 #ëïÍ`ÈuÝ(`ϯ0¨4ˆ¢³X,ò*À8:º1+âÖ\D‹ÂSÑOü3šžtrPA˜ ç› "_(÷›ÕXq]¨‹TJQ#,"¨Œ ë±5Fth;>\¶ÜbŶÇn9Ùµ“·ÝBmä䃀:z2¡qݽ= UŒ¦õ?³çp$¼7ÖŽ®HGA€Ó5œ“_¿Í¶WbTk8$Âôÿ¯id¦I%*~N–KTA€JÀƒ[7ò“J‹mxu* S(ë‹kRêéÐëhïyàÄpaŒ™ò± øhÙr‹Û.sÀ»¾ûI`–aÒÌÖõ€@ ;í)XcÀ(Ì'­œª±ªÌz¦f¢+0² °ñÏå˜eX}4{ªoåØ*Ÿr€é‘Ùɇï.34A;þNñ‘Û²c‚ù MÙ–]Dçï»ên ¨{%9àuWÓ/Òø,ãUÕÿ¤ÃÁ’N²ä¸9C@âþ¯ú…g×VnV€p}ìb5Ò1B¾Mÿ!¢ÈÔ,.,@Tï*[m±bÛgç-θKb÷W\øçq´ôïœÍh­tû…(€ã£ÿA 2KHzÿ€ƒ_« ЪÕà UÛ?¿(`gв¶”Èú¬‡NìßùòM§`˜Ó1FÐu6fø‹pBv/R]fñ"pÙ/[\ÚíÇÂH×@R–“žØd¿S~ˆlû£TŠÛB{F+ ü~õ„Ñðw:×ùRÐ$ÒÍÀÈòQ z_fÏÌfDÒ³¤-=i›Uzrz¬ƒc)àá€iYxKÛºh€éb YgúY ÷“ÿ":„ –¤‰IGn#x¿œ³_¦&Q$G–»Œ°(锪¸ í7Ö¡q…X¬ØÖšÎŪÒNèz€îvÄpŠó§;DÔïÖö¸ëwž<·puôÔ@³æ£¹¨%̼é±çt@­÷?ж~¸J€.é?.ôa3’ ÿâ³ŽÈ ,(T~„2Ì~ù±¸é£.’ýè eò *6d2ŽÞ(ºÒ&9,üÝ’<e›-VlkíŽü„s¦•ÂçP~¶]ˆ48èm^z;;`@(§8âîÍZfo² QP g½e¾ õÏ^²ü»]G°“?Ò2\ 6é”iPd€“¿)´?yÏ£ÆYÑ\YÈF~m­÷_ùK•rT…ÃÄG›ý³s‡³ŸÖÛk±bÛm÷ÊwÇ•T×í£ @Ëÿ´þœÓ%i_äKÿf ñ' Ž0³ð/äÃ3æ¾äé5q ©ªÁzÿNrü PõcW|ó±t°Rð·W`à —~zp›(û‡SÆ%*>ö)ßV¤]í¾í5Ltü#ÊöªÀñcM~r`ôž(è¯ê.zÕº8³ë°[öØbŶÖþ¾!',»Òß•æÆÌFaÞ°Q(™¯X Ъž &`k̉!9<¹ûĉ€L È9e@Pú>LÏ^ÊV œ£žT’>Ž€Ã©Æ\ï^êƒÜï‘§|8·Æ"6â‰;¿Œòw™‰a/úÞ¿aAù¹ÀIf€7²ÅŠm«9`wxè'ÑŒè€Ýï$yu3PN˜éC¢ç ÷§Çª®pIJ÷­Ë186@ Ä€'¿íÕc Rü ZµêGRP²ú/ÖŒâhf¾˜¨"0€êß´Úß(Súø ÑTþ6T¦sUœ P‰ï͘áoÅŸø4ÜS‹»Ï˜îpNý½Ëh t{©¾S (~ñÿ¯°_.# ¼V*à:ŒkâÖGe-€D€Ncty@{{ï1¬0h¥`fp)Æð£ï]@?Ž4á/¡ý©+xà6p €YòÁ¢xP&0Ê‚3R€ÒXΩŪÊX±bŶÁ `œ²¯Ç[§0nÝ?*ÚwGŒ4¯œªš.Á³U™87Yûýâ_FÚŽæB@Pð}ð]«‚ €:z[FP ߦY? UÿË}¡x®e>îØßK­€%Ä÷ùId”׈Jp`U€ª»tο’VŒúôe@±b[lpÀnv‹K°Òžû/œñÚN jáÍ%‘œûˆû5¹_BÌÐh® IDATеÂÒW®­Ðû—.ú{XõÐT›8\†ü'æ–fpEIäætÍ7bM¢°Ì똡¡B˜eS…1Ìá§2›aÌ;qÛ‡Ê)V¬±¦ .Œ}¼o øºŸ<›qþHÏ•úmJ§ ¸´_À¹^ï?¼qƒQÿc^öÁÓ\÷ÂXÏÓÈ1FLNRÞû§¿â@À*i$/¿åäR+VlØÎ8!hxÈûË &J“ðÁàdpP+nȇ¶Ÿ»q¿KXÐ:ÙùçY+Yµ©Þ3ýÂRÆàã{³hÿ#~·o•ŒïKI”@±—¦´¢r¿!À¿š°Àq)€bŶÛlôC;w5åºÌ8_µ”Onaúhôç¿´Àª¶ê̘U.W︭،"àz­ÚÌìy[pÙ¶‰Lß“¤~|+n¥ouA3›ýû!PxæO@€Ñ¥&¿T¡‹7+Vl»môG[}åÏ…¤MàÙçÄÈÝ0¶VíoÀ–b‘ ëÀ¹ÿ™@Ñm¬Õ­¹€Q³æ#ÀÉ"ÑÍ&šÖò¡•7´IÆAd*€ëÿW&¸N@· ä¾½+¶Ý¶0d©ÛC¼6 © ÓjQËZ @þcƽۥªëÜ™‚ú WxÏe4’~¿¤`ßÓ*®p#4ÀÀ8t`92rð‹YåK]ñéÜ:áÀ<€ôlN$#ÈpJ5Éþ+¡ KÅù+¶ý65 䈆!{¨4xê—°G+l f•?^êÅ6`ÜÁ1Ú„ˆâ'ÍÑþT%ÀmÉâ.þ]BãsÂýN~áxÇ4@È¿ÉuaV}Yíõé‰Ê-ûµœ¿)q@±b[m©:k2üS@ú¶¿3©ü®:ÝOù)2 Þ?ðûÃÞ•V›ÐÒVV)û[¹üŸ>³YEŸeÕa@úa‘K\ö'OÀYôɇ|Ö10b#‹Ç-ù»EÎtMü‡`ªJ¹Ô1N•ªÍM“ \ói½»+¶åVµ¼::y©IB?~¯@׌ÔD¡Ý¹lÞäJü[d£‹ÎŠ ˆ”ðŠ<ãðC%€>“çÙj…Öj£Ôñcæ§N96”B˜|$𬖸%°fǨ@âôkV ÚâXïîRmj½+Vl]–¯›òg “Ö3ä~S1)w££ø6»s ê ZücŽžv‡Ó¯4V¹å4œ< 0гï¸Yöã®c@ÚÛ@|Û‘¿“ú Ù7¶÷1„·-ö¡Äd¨ƒ6hÄŽt wö5ÅÔDˆ ‚>h°+/+VlKÍ—mþ:6h©¯¯=L©D~LÊú•Ìß Ù¿Ó[8`w•ŲsÝp’:Eð€ÊýºÜ@Ÿ!ìã"‘©YÃÂdŠsÊÅ««¦£›$-´ŽF¦ÁᓟUW2G§Ã+ûk±bÛk¸ÜGSלöý=àÏ„ ¢Š@¤­FŸÎ´XtµR;F)oì/Ö±Wk¯e{¸x[ÈÚ©Ó‡ ðç$Q ›Òå½k˜þÈm¥ ÀÅv:ÜÅä($™|êð`ÔC;ø¾d Èâ2e9C$€%ôÍôa ÄÒlsyëñ+¶Åve²©³ÞOùëƒY ¬ûcq|xn¼»öÚÈÎ7áe/ç~LzÂ$8°Â…?F(A„]á¬üŸ„pwt ö8‹xCÐÇ}¡ì–܇aÊÒÔeËß/ýnì¬k“+é_@ÀLú€¬4qàuÛ_,V¬Øö™ŽçkyÛ††]¢ÖKTEO •†öÓÔþx@0Èp™)€NоIßÑ26YÃᨠ¸gý}BýsÖ¶ñƒ+ŸjÍ’_ðê“Hå¤\9ëרè)˜¬ ýj×;ýIwñÕcúVXŒå¢ÛG'¦ÅŠm±]Nò³Ï‹zçïé~¦ªaºdÁð ¢f@÷ÌmêI…–.ÍQ# ;R\Û /šèÒ¾ÿ8À|oµ2¯Ûtþf;‡Ï>¨¥‚¤|଄$ ² UaÐÅÚW¢;¸+U¸PÈþ'í¥ªjBh©òc £îg€«Ë[¬Øvš’M‰XŸŸ"ÿ}; ªy;ÀÈ¢@ ¸Íý[ð4#4î?}¼Æÿg³`©ò8ñÀ;耳ñœc «t(G88Ë3Tý-ìcªÛ`舘Õ` ÝÏdzÌ¥J@ôÊð@ëD!ް?÷k‡Ê £X±b[g•w&øc Œ©`^¨ êZ(ý›Lk•TQ‡`N÷9,—¶ó2óI¾8ÕOÈô} ´Äeé€O¬ò ×Á¸Ã;ç¸@wÝO8²Œhù<—:1qpfevÕªS_f±IçœYâ¶‹ÿ„1B  Wò2ÎE”Ú3S€bŶÑ^û@Tú䧉¦øõ‰’ñm€º’ûÿ|/¡l£AÝ%2ð…q~몶J‰èè§9vžý‡Ÿv8Ppø8ð·uH»Zõ‹g`?çúÞ¿S?,2“—1bìä¨ç\R‘Êèc7fõ/`ê$@Âð8€zL¦];€J§£I ¸±lµÅŠmŸ]VáJÓÍë0"E¿-ó›.û-€º½C5Dre-±¸¢ßon²Ýxùúƒ#]\:Ï&Úë]¾*¡ZÚ±¨ü¦œcøm€³ô¨¤=ð_Z‚#‰$H™ºã NKÿ¥IyÂCǬ¿• ™¬>Š0ÍB ñ ÏüÞ_·¶¯L&íÅÕíP *>¿M?nª›2RÄ€ŠÛB«€Ë`pI8í»ÿ ë?Êî ILÕ¶L]µÕA© í ’-ŠQuÊß/«%0ôGF½)¾%m€(øCþPÒ÷FÿÒÀ’óW?àJ-€uTN¤_Uçü‘rÿ“Ìßj @fªC—耹~À˜¡A ®¡¥Ï…¡aGËŒ9Ö*•àüÉÅ?†Aœýwm€•­¶X±í3\WÇLfo SÕhŒéÚuÊà@ÀÑAÀÀÃÆH£ŒÞÝbs+¿ ñÑLÿfHðgHJ @–!¸s•5³ŽàîЈ¸þ’£oA€=ÐÊ-`¸ü)Ta˜ hï\<ˆú>#Q¶7¶¡Ã(šÝI 8Zà8°  ?ÿ?÷„ãe»-Vlëì y{0}SÏ —ûíö‡ÖñOÚV@(ÿWzö¿Ô>¹Š¹õ>Þ­òœ\ ÈRÿ0¬÷¯ÚÀG!¶rà‚±0äÀÚ¸ÿïKÿրʹh5C‰@…±–‘ˆý€j…Yf ÄˆßI'ÁJ‹Ž@†µSà„Ói T4è™t:`\ ƒÏ*{m±bÛexD¾³­ÆÔòŸTꪯTP¢ìUÙ„Žü]Râΰ ÆØØì>«ï?t¿‹+9ô¿µŠŸ³²ã—ØÊçtTˆo [‡À‡|Ò¿#—”ü»LßzF€êªÖéUéÕÆ´¢;”Çò_/J­ì;àð€.8ÂÙmÒqÀ¦b’¿D`Ò9ôA€éI-€©A à Êv[¬ØÖÙÕÒöÐçMýøoc|ß¿ H…ó@`ìþ¨:ûa‡6òÎåm©–oÕ:eÐÀ4?‘ö')ŽÃt:¹ÊáX½àpÀžzíà`“òZßf•‚xpÂFU®ÀÊVÜÑoD&`¨·¤=v ÇãF¬Z#œò´”Wñ*À˜N€é,‚@ãLÔíåQe¯-Vl{ìÍÇq•ë¢ý€ì †ôú )ÿ×]ßßkx Jëÿkæ@Žù´h0ÿ“å[ Cï‘ÞïR ÕáÛá²?¬P $€…÷i{ü«¬›•€8àD¼éïû^¿ ×½ PÊq¥6@‚øP ô‹Õ ¿_sàÎÉ÷'‹NzZå5y #U*V˜°ËTªÄt@Ѝ€G”-·X±í1\jL;¨‹"xüàŸ~p—ÿ»ëUíÇ×1%8¤Èãò½Ë ˆi—˼ôÛP^ëzŒÄVÈ”ü­]¬" :!9ŒßÖ9ÛŽ^ÚVö[¦ß…Àh‹²xÿZàÓ°cDô¯Bè3`>à"³¨G˜Kpús'ÐØ§’¤ŽÁq0mÿl&uÒó‹ >ç½W `±bÛbxLņÒÿЖý}é¿î³_ú§´ÀHN\¬ššñ›“нmëã«·àÃs>?õQÊ Ÿ±Î?<±¤¨¾Å3s·¼ 0°†àKOÀøûä(E”¿¾Ôï,¤1ÜØ’7ØX\ hô„H hhÑŽ}ŒXPZn™‰£ÿÁàû]D_Wi`:k/AhÒg  ®Zý€œdðZ°#­ ;wZ>ûÓ;(í‡ òeÿi—ýûjÀdÚV © ÅÌ êi+¶5f€«¥ª¡‘Gôÿ};ÐÔ˜ITu+Ü·`ø½Ê £#Þ¼,Ò]ÄÜ:þ˜Q¥¾¥?3¿,8Ð21!uà'°¢­+ø€#_”COñ£XX×4p «Xစ§SD"ÑÄÁA˜LùJj¬ÉÁ*ÊB_Ðÿ'Ÿ)©PVјN{*àÄÓÀŠ µjS€€ÅŠmƒ½ù8®ðX@ÚÆ úaÈÿºîu­Ó—±­Žk§¨øÁEZ ÷òï“þŽW4ÑŸ\oŸƒý`•1Àü ‰ƒ€>¹êÚYWpwôeøLßóýYéßó".@M$_`N‰Ê0‡/€V$ {Š…ËÉÐöž5ààB׿h`@ÈŸ×FgL&-`¶ÓW&Ó¶ àEHÑ · §TŠÛ3À—Õ—ÇÅúèþÀÔ)í¯ž„ Êþ“ù “Ø[ðìråÿ\ÅtÁÔ}厀…$>™:l(Õ€ ™@AdˆïôîU?íº€î†þ*`_þg Ÿù7M Ñé"rl¹órTÔï7¬ € yÝñ¾Èr,6Å-@\¤´@8€0¦èƒ4©0‚A{¹áÂç—í·X±Ã5\-2ÿ ¼úŸwüÓ)ªI§þ7i+!9àà?mÄzDû“Nyü€“[GÙå’¿Ð뇒©‹,–ù[+óý)``7X÷=«®µÎáNç½3s‘Ê_/ÿ‹ ØòʨúÕ~J|&‹ h¬RÞ’{À* 8hBø{õ˜Ç'jÈ~R÷ÙþtÖ3< °ªã*úþ¿ v .=bpSÙ~‹;\3ÀM¼ÞÙw}ýí²~ ôÁŠè† òÿ³õd¯’°Ò:'?^ÃŽa Yvf çýCÎìm#dþ}<Ø.€¦^µý~9[Oì:àB¬:%@tÈR h34°¶QF¢©©T¢Â,éÿ„~²èþ1L'ð^— k9°ëõQ exF@ š>›@»?Ô˜˜2¸X±Ã´7Ç5x<êw6âøƒóïÕþL]£šLPM§-@Ó0Cû$w^È´´Ì_Kv¢'ÁâÀ%[™²?}¿dÖµýÀ¦Ž5À½nE `MÀžÃ?¸=:ZŽ ÙÐçw– êµ @ú’ž·‘€Y-¤ízߪæ”;’Á 0¤‘@oM ÿÍv€Š˜utÀZlEsËß•Á@ÅŠšUÀ;ÿðBØ÷Œ©‚Ãoƒ€ª-ÿw½üŸqþú>íQJ&?ªÒɧ¼Nú‹ÕªZöÇpÿžgý‰Ü½úƒ0X;&v®q«‰uëgu{L«ð ¾—øÃ¶úÿ6à"«Hg¿`JqCºPÙøºa9`£ü»H2pÚu¥,†a Èü{PÞ;W :x¤ý9™õÁÕ$¡VäçÔàêK+|vÙ†‹;4»Uïÿ{ð_Õeý¾Ü?mÿ„k6><ÛPzà|sÒ€œâ¦:ÿsêƒëD˜+ýÃE .ˆÜ}ïø­¬òǤ#0ø¶Î꾂­ Ÿ ËS0dü¼ ÐÀÙ¦í¨Âð?$6¬ðèUkDw™Á#¯.ÄlÆŸYœC@@0buK”À¤0vvº@€hÐÁÆDZ•fëðì²+vðÖ•ÿGOóè”7&Òÿ‚?èO`„þöÿ‡§hKÞ² ·Ý†ŽÚ"m'ÿ]ŽîG@ïñ…9z8Y`üûû»+ïÂùUÆ:€wF‹€ŒÞé7]Ù¿‰*Ðè€Ñ÷àÒ^?W«RÑ«¾ÿª%' Eh«[xüX  N7*&džV¦ØÓ¶P{J › `z@àÌà‹ËV\¬ØÁ›éÊÿ@*}Òý©ÚÀ³ïÛ]ÿâ­ÿLùßïan„ â=N*%ï倃‰¢'î×xÿt陵¾eÕŠÐFýJÓ‡&ÈÀ®¬7xíŽT{œ\?ôGêÿ7m @+Q E,+Iq®¿id0 1iÅ€+Û« cÌÉ j0ªÕú_p@Rsh]G‡U¦S`6mÿ‘#ÀΑ>ˆ4Løsʨ nøàƒ °X±C°[{„ŽßâºÒ?ú@‹öŸôºÿðÏWà€êZn${ GªC n³½L… e^_–ô£&×™ê„Ôš•ZŽÑÿ‚/kò-( ¯R qk¢k œÃ]ØuáÙ~•¶ðÙÓÀ’Ö€îøI`.ú“ôû5k#<É¢L€a‘†D6È´øÉ¤Š€¹ì?G¥¢øËÎNì¤ó|€‰í\:1xBÙ‹‹;8{óq\SsÒ"C¸ÿ†ÿê¶ôœíõÿ;çŸ Ê¥ÿtŸ“œ?FôÿÉÞ5X Eþ} âÆÜ¨»Ò×Þ#ueþŽT³sã€a•a@å4í_ß±Žu´¾ØE RMcU*`ÓÀ6TXªðoKrÜ|"e©bŒñ‹Júý  i*ÇO2õÄ„L)¤@Ýiçß±f¼ P‡câ15ÂåY?ttm܉bÅŠ ˜!è•þGÿ‚öÿ4èø@ ïÿ+SéÍtN·E«ð¤D¥K/L9ê.™îö¾É/žMÛ¼tlªûÎȪÆá^ëHË}[[°çðq¤LG+Á±7 ØDA@Ú;±©£“Ôór?ŒÌˆÎ… °Šîun!f³¶ú’¹ €?™¦"(j)™à€>ðX€Zn°Ù7¾èþE¸X±´[éô?.ÿþUÄùwNŸ–ÿ–ÿõÿµ6çˆ À¨þf”×”ÞâØçÏöå1À?Ë©¼ ”ý%ô¿æ/Ú›g,Vk s €÷6¸Ĥ€m4–›”N¡ªr®?”Œ_¡ŠÏ¥¼ÔèE“£q eÿÒ ãò8t#ü…•ºÏµºÌÿÈÑ 0Ûé±I`B k\V|mÙ“‹Û¼ý©Vþ7=ò†Œúíúþ÷?™ šLG:#ïyCÀ¡ @®`ÁŒ8\òæÆÞŸyº÷Žõ%°6ÍüµA@Kˆ9àí¼sõA@ÀzA€ð.ÿÕ8&Cœµqú è‚­(Eªü7‚ °¨$°Ó [½¼× ÀéÔ—‘ãtÒÉ×ýÂËÓÉ€xäHìI5køËÔàæ>;e{.Vl³V •ÿ#ðŸ—þí?¥¶èBÿËi$Àœó‡îø‡Z ðOØó\f\¤‚>¹ðy!;þˆ¹&µ°Ù@ !*áÈ@`] €n-­Ï\Ë€c3§‡Oñ6Ë  ¶î¿Ù/©š €ËLÌ.°©_ºxé #V P3ŒñdeoL{ò‡©€³¾;dLðDÕ˜6À“Êö\¬ØfÍHå2ø'Öý÷½ÿ ÌtÖSÿ¦STÓnð(¡ÿU6„½ˆ‰å€}«ôÿ1VûÉ`¡‘cP¤¿êüY)PÊþ‡Ý},²°î €Ãs~F±¢a@MÓõÿ›¸ ÐÄU€¼ Œ‘Ëú@š$HŸ/zÞuêkŒ~2å˜tjBIÊ}Niaÿºšíô-€ 8Ýé)U¶Ð°c`jƒ•í¹X±ÍÙ[râ?ÜùSúßdÚfÿÓög5öj ’0tïI¨}È—ÿ>½¶7.Ûÿ_Ôшñ=X”–úÿŒ `% %±g Äï¾`ÝzÀš \°çß¹ÏþiÀ+§ß¶iº €R¿cMÈdô¬…ŠA®04 k4½d€qJÏ+©n9'¬sT>Ÿ¯tX_þ?ÚµvŽ´2Áu× 0“D FP|̇¯ÂCÊ6]¬ØfÌOÉ‹ÿðþÿ$¨ýUÓøgïüBÌmy#Ëÿs@Ü•} PNÝWù&éÆU’8@©ÂJ-^Õ’‰€ôòæëaknº§ðîSÑ9yçúV€ ÕÊÈáø £0” 4é)7Ú¤(‹ã²HY—ÁH'UÁVAÕ:wÏ8z8z¬½9Úë°6€G“*Àƒ'À­e›.VlýöÆÏÀ5~‹ÿxÇ_ÁÀ€9ÿ‰GþÏ:àß4š*úWpCûÛ¢@`÷ß ì±ÞƵc³ív':Ðè "#û;RÝÝgš51€õƒ‡Û fÐÉ1@'´ì €‚˜(N =Ò €„+ O7°®ô΢8!ú„“ûÿn %U¬B9é ü2Ø·ŽíXGû &ÁÔjƒ~ø*-Ûu±b뵉Á̓ÏÒò©ÿ?A5™…Ò¿éúþ~ ¨ ïý¶¯9—fñb“íWIùß骧‹ õG£»Å©€*PÊü‡@Òí €R•nMîúÓãkb›üŒb„í†5A1"ýkÀ1F´>Ø'ÑG\à†~9¤ èäò™xÒå(„Pún¬\•¢¨&@ô,ìéuL¬ @)ঠðee».Vl½f€gTˆ·0C¹ÿù¨Sþ›¡ò¿ê þUʾ§pâ£}Ë¥ÎÊ&fýñK¨BCÒûŽ6F „ÎpRÆïúj·èøGÒÿ„Ãb·¯sM­=pÀ{špƒ £Á?Þñωм«t8€fÀ·‘‚(t@d*Ë,pt€¼¸“æ õ×´ë䱪<¥ÿˆD`‡TŽë°Gã!A¦R,À¬MBþ—¿¾¼P‹[—½ù8žPOteM·wS‰ßÐÿŸu-€é õtŠzÒMûäÚÿ•&ÿ ¹Ü]g?ÇŸ¡FWèÂvšÞ^$ûW€×âŸsù5ŲѾ?uüN`C ,ëpç:×Õ&*ÿ˜@Dôüø_×4pó9c(ª€9=# AÉþÃ/é¡ &ÃÀ"’N–À)´~Á #lµ¨<:ñˆJ•¯®øßô”@;·vޤS°«<õª ¾¼lÛÅŠ­™³¤H IDATÇ ðmµÁý#r¨ô/Ñý¯&Aö7ôÿ§SÔSŠþçοJǧ;ioÙÿƒþç{Øhù_ ýŸÃ (÷C—gpS6çüÇïrA½Bû£«fÿŒÿï¸ó·©8$öãFpÿ…ÜÐg/ºõ _rs¯ñï¼ö2Àmy¿‰¿%@;Š¢4@tF¥ 0Œž  »Ï }Y#§E,ãíkcEÜ€àp)…c,àÚãRWí1›Åm€#žà±]૾ `%ð+î¸ (Ûw±b«™¾¯6¸’O0ÿDοëÿO'ÁéWþú”ôÿëº=ߥ¡iÒþ–ËþEçù¶Fû³a¶¿¼—AËГÀ‚ƒ®% M©†Q×ÃþÚèÔ?)û‡ü¯ºkË€ÎþÆFÚˆ¦Ÿ`ÀœÑAué"£§‡aó4 DT™K˜©J mhŸtRIœÔè)…Rʤ2¦Cþ#8ÿªêGü¶åÿYpúõlõlÖeÿü§¨ÿ‰T8ŒÃH,€ezþÉþ:¢ü¯j¹dû~ÇÕVEÕ?Fÿk¥ ÀІ ïCúØÝźõ øGt8OŒ†yeÀ¨ïßýœSµ@:MI‚0B+_þ#µ0Ä`xéú¨ÅÊ#JiAjô>èA dûZ €¶„ÅK[,†i!€´C«µ 01xf©+¶¼à{½îºÕT¦êûÿõ$.ÿwÀ¿èËÿÓ¶ÿ_Wý00Ï໸¡#’cH{—¦úç´=+}[Éu—ûeî.îˆ%É_¤à¿&Óû—Ñè_©ÆN Ö 6ì;|Â9üS$ ÐtÁ6Êü#=€1³ IXòª£¹$ÁtØd,1P2ymÁIXUHQ¥‚æì…QÓ¯nè±õ«¢j3|¯ è³ÿc—ôíÏ`X€Š0Ž\61xiÙÆ‹[Üþô8nXöß o ºÿu?õ¯šNaf³0ú·ê®›@ý#ÚÿAJù_ôQYÚD÷;yP™RB÷Æü<¬(賈ýKúª½ú»FPdœÿ$hqÙ4îhÜz€À†€/éFû/KbÀ+ÿ5sXư]% FU*Ô `\Ï_ÄHâAÈà26¨º|q‹Ž:ÒlñJ'ÚPÿ ®Ÿ}àXª @°~QU¦­L€õá«psÙ΋[Ì ðÃS%ûïÁ¾ü?EU·3™¢žÍ:Ç?C=uåÿŽ ¡ÿÅò?÷±*ìÀX&Àè=Vðð¢€ô8dî“úÿ@£düÄ·õ²ëlv‹}fò×vù]8±î5¶) ZI`ºPhÀF€ 8ïƒy4€cY*—N&B™ög£³È˰+ú7Æ-/i©m€d-¤žä¬ÓU§¨HEÈìÛ @Á€Ç޵€K.í´ŽÅ`@V¨»ÅµSáèÔà»Þ~EÑ(Vl¬½©åý?5ì8böß–þ+Bû3SRú§åÿ)áþ×Âä¿dúŸ"€#î-™=G¬xJûV¦Í m°cZÚmmãνg ÙC©ów6ˆÞ‰RÀ9ðŸ"uиõ—ÿ þfì¶‚ò=þà:lj5¶JhkÔ“ b@þ§¿T‚* Ñ mlð0 ½î2¨À,'ýÉ~æÀ€B„™ú>VC¢Õ†–ºÐ¥ð„xìpÉ%mpì’~XÀð «îÚ3ਗ਼”ÅŠµø7ÓŽ÷Ï/<û7ð/ôýyö?ö½û/na9§Ÿ¡'K¿ã€±Üÿ¤ü/í½¹=XÙ¯¥Ò¿–Diüÿ†UQ鼉à2ºÚG0wëWô¶±`îðNóGÎ 5pÞWB´å O…Ê)J’À P0;ˆ¼Ö¹1P8±C9ºÉ:G²ºˆiéŠRiÀc.i±žXu¬€›©©€™Áwýãƒñ€²µ+–·?=ŽgWÀÓÂNC²ÿ^ó¿J¨†ÿ&SÔ;} Ðfÿ’ö%sÿUñ~ò €ÍÏe.Év)%FÂ^«êðÄ éxNàï ÿY²‡&â?œÎ8¢ŠA¬îpÀ_lb­m,øâ°pxŸé¾°v&€ 8€P°>ãŸ3<€íÛVB¬3£R¾R‰täe¥Wrƒb@8}ô$tF@®÷?¶ èX“ `>ïƒzŒMW˜QeÀK-C+@®1xôQƒ”í½X1ÝÞt—W-ïš ûA/þzÿí¯þ™íô€Ù f6%ƒx}ÒÄéPi~ c*Ri|ˆû?”ý#½_ãýk ”€Q²$a%@µœ{ÏÑ#ÞqüÎõ÷ÿͶà€Ûúï®=Ê1Ð&2À¾ÍðåêHÈEQõ•¦½ Íè_TþƲ‹6Š;±ès pkªÐ6@·ˆç ÐÌãÔý˜à£mà’KI ›Õ!À¢´À‰¦ß~çU¸ºlóÅŠÉV_÷˜]}Æeb:pm7ò×TmᅳÂÔÓ¸üß!ÿëYÛˆËÿµþÃvn_$¡ÿE‡Ï¶DÕ‰¸‘Ù¿Ó¯'{³VИS¶O˜¢Ê)k£FÎ_ jTùáôcûæAã6ãü ^ßDsú¨(TB `NÄ€æp!) ¤3ƈñ*ÀB‚@9lF >¥ì_ÓÐpN¦Ód«”ÓJœC·´ŒL°Ç..½¬ Ž^Ò ª;™`òN ü,cð²²Í+–ÚÿüÏ×}Ö/üŸ/}à¿ûTÀLÓ‹kÉߪŠ&þµŽ¿Ëü§- ¦Ô¿IGý à?ø§V-•žÿ˜K.ûWñIJ‹7ä÷©Î_àý«½; þ“.®aÀ\ö¯ßåßÖ¼}[´©5·Ñ`ßá8ü“ÿ‚{  Z­ã'ÒÀóþ>ÛÌÙ„@aAiÙ^íûTDA ÚŠ \æuJ¿KáôG'cæ¤t "k£~aЋf”pɱ>ð•€ÙQ`z„ûcX£­Ô˜_sÇUxFÙî‹cÖ4?t¿‡=슫¿îÄCÿð¯qéwp0w“©†dÿå/ ÿg³èg-ÉþÒ*€DÿtìÝ]”œ´<‡üÊ>ª)ÿ9Æ—ÙŽ“ÛBÒþèbp_C*§" #ÿ+$y›;Ü1wøËM-¹_rC‡ð_œ‹VOœ‡ï±¶™Ãþÿìw¸,U•ö{WuŸsÜ ÷’DÃèè˜Ç10FÄQTTL€PFŒcED?1ŒiT‚¢"¨˜#~ú錢H¸Àåæ@º'uWíïª]½k×ÞUÕ}ò¹µž§OUíªîÓ]a¯µÞµÖ»º‘• èhgk†Dd@_HÀ>È}nÜv6­‹ßÚ¥´ñä JXUŸð¿™Ø÷òºÝ ˆòA¨N“—ÀÒ¥½²ÀáÔ‡@¶ 킲„ÀÅ-Á[nYÇÊfÆo¤‘Dn»í¶Ap´Šc‚v›åÿ`îuæY{é%´žòψ- щrÊ_jè?lõ”þÐPBû›&f‚”ü'%ÞÒ¿*$ 2ö_ãó óhI-¿}pY KùW…9”ÁF9Jÿ"O ¾6ö5bÿ*wÔ5k6ÎßÀ·{¶Id†º=>€n1 çjÕ­6™XõþP¢ümÌSˆ§°ŸµÃ%€ù9c@ùËj\7tìHrÉyÿÝ^8 ³hÉ÷0s–,1BF»` p$.<²ol¦ýFõë×(¥|O†mÍî‡R´—.eÝ3âàO~Šåýäâ½·!¤Nü &ü?”¬'±ÿ¡$y×öþu´k^)ƒåQådmï¿à,ýëÇûw¸ýNåOñ{çgã_ ‚ ÓÍšU«£$ àxÍ„•ؾá»ù„Àn7ox ‘L,v£ ¥K†AK{ ÁPä 6ÀÒ÷½›Uß¼òàEO8ü#J©¦4°‘/·Þzë?K)Ï Ã0§üƒ èOù›ò¨G¼ýpÔ³äN)ï¿Cùƒ¿D¸ŠpR1c"ì×û÷)õÂç:Ž3'ߪä?«wMoìú¹ÿ]Duu¼ób¸fŸi,ÿÓÎà}I¤8%MlM/@\ˆ­$ID·‹ì¦!£0Ž"dC O¶%‹'¶n@‡b "Î+P©ù¢ }S Q£ÔâƒWi?X¿+{(ãæÆäºÃb@ú,þb‘Pu%Èn ¢- Òs¦ uÏ|Æ'’åÄLŒCw"½¶)L+¸EÁZh}ç§ðØÇéo÷\`=pV£"Y¨²~ýú5RʶÛíå&ôo+1h˜ñx$\v lßž teð¿k.ˆ§8°Ÿš_ «~Þ«ô•ÌꨛüçlÿÛ5bÿfç?ï—ôª‹ýoÚá˜!€äÔ\¯`3XŒ€š0—eå€Êxi#@E®jÕYÉàh$*š eŸm-ý—·øÀn|(o–AñAEÕøà®8.¾4ÐIóºŽ|è1ê„À%K{ :`hq (îÀúN{ ¬5•¿–“”RMÛàF¤Üpà ‹‚ 8§Õj=2™šÜÊ¿oïß–0„ãžG?'y;òÌÛ(ËIê+ñj@ÀâÄãõ{ÿ\e€Ê]E@ÝÄh«Ì/²€Ì2i3Àü~}zÿ*…ÿã€ÿa €GmcpµÌ®±‹(]v{%=F@cݤdÌå˜gWTdü»Ø-’ŒªdÀ2 À•ª|þ%”‘>ü €…¸uÓÇ.Ò öÒЧãÉPùnÃýP€™¸8­ ¸}+¬W‰gòÑO$¤AEY \¬”zr£.YhÒn·_†áËMEAfèå”ÉÚµp̱ðЇöža{r*%÷©™XLÍW™÷ÅïÓþÊ*ƒûs°sN´˜fiÙÿZù«j¶?—º0ÙÿVÏü3h¤?ìŠ(7&šå€©’Éñ8Èü ‚À«¨ É}Òa‡ËÌØ¿`Šð]VÊotßPSó=œxظÊsr€Á|e#@WHQì¸t)ìe 7þŽxlÙ Ï®Lø_ü›RjïFe4²Pä–[nyaï‚ —ñ?eЙ<èÁpü aÍš$<Åžä¿xÀ’¿>s˜¯îßó¢Æváý>æ?c®³¹QJ=3ñ¯›¯ÿ¯Ãùï³{HþuÊ 0#ð?̼ðs¥Ø˜…2R £Ð&2Cš°ko7áVè¥ ®fAvÇ@»$°ª{` …_Zˆßúv†p‡*v³ôÅ dëÆ¹Gô¸tUÀRØ}7|è"øêå°Ï¾uo•g)¥’ Fæ½ÜrË-‡AðV«Õ6³ýMå¯ ƒi•'>žyT‚ÔOR¡ûØþ|ScÊíöxÿe\úʳ4?ÃUªXè‡bÇÿ­†?Q‰àíü7˜÷ßUlˆ™øfØxÔ66ߡT¾; Í hqÇL´!G&)šß\©~¥Ç-€K86r7tî¦W·FÉqe½ºëŒ™MbGE€Vþv(@#*Mœ ‚7Àâ%‰A€‚}^zâ ·ËqÀ4꣑ù,ëׯ?DJyn«ÕÚߤøò¸]Y²ŽüxèÃ`l4y޳y€ùjÀý>¥¯eÏÙ|YýS PÂSP§*v)þn±üO9}I€¾é›ù‚kVÝ>3ð?̰þÀ+¢ò”oÜC̦@”®èv‰º63`äˆgëÿè‰ý»¨s½²­÷ûzØ(€±«üDøÊ`Ô2¦‚¥‹;¹0—àH 4ã`ƒ ã@”Ê7 R1t/øÏ‹’‰fp9¶I ld¾ÊÍ7ß¼¯”òóívû‘6ì?mqÿºr¿ûà N€•«`lÌBQK¾šyæ=쯉ÒuõRÕXª2 Î'þåjÿ»ŽÚ]Õäðþû( Ë%ÿ13ä?¦Ìd þÁ?W°Q öë]%Ùÿž¹×W"û¼ÿ¸×%.iýkÖþ+›êÀ9P6Y¿fÍÆ™ƒÿa €ô‡~+N/L–-‚ã^¹Y’ÐAu’eÜÉWD9#À"±0Å¥ÌËŒ''޼×/à¡®*©©Ã¸UH„ì‡Ú3.–Æ%e:ÐéÀ]wÂÁ3þuºn™ÆhdÞH«Õú@«Õ:ÑŽñÛI³ý—É/?V¯†ñ±êªï\‚åO2ñÏ ýã>ƒƒS–÷¤_]—÷ß5¸ÿÍìÿ©ðþcfþ‡Y¤¿ýJðàäzçs¤@©²Q7 $(@˜aHE S¦©ÍØð¬“ï¢ý­ (òÌ€¹€0n\ ‡p¼7C%e4YýLO@9Ž/ øS¬°¿ž@j “†â¤6’"wnÜs{,Ÿv_mЄ™«rË-·¼N·÷5‰~´çosVžñ¯°u |÷ÊÄhµj(~Êáÿl׉¹9­_È«ô/¦š ½¤þ?Š<±ÿþ*l®«ØÐaøf xÔ6v+ø‰0OGz1 yv%€F²’@£IP; peö;˜¥£P¿ßÕ(3"\¿Ô¸ja‡E ÑOCŽJ¨OOœy;pÏ݉ApÒ+fBùki€F欬_¿þõRÊ„aز‰~lïÎË>û‹_ ‡£#½þý(} àRüæ<Øô_µÔëq½Ê§BÂ_·˜ è¬ý/‘’êï8ÿ³¯Ùw†á˜% •ÏGŠes¨^O Pis ³$02sÌA9˳Š ÆË|)P_1½ŠàB¼¿Ï,+Ó)3â# t`çv8ä>pâ+(Ü19iŒ€F本_¿þõ)ÍïPYÌN{þ.yÒ“áÕ§$Õ££éüJI˜Ñ3åæµ:ñüÐÿ I™Ò·—f¿¨k$vÝÉvÓ¤ü—öвᑚyøf)ÐQü¾%ø NNŠI ÜEÄa¨÷Ò!€VbIE€”A¯¡Oö X·Mó‹Í`¼7³E15 ¢ 0¯®¨ºŒð_U€ñT¿gÙ® _€Ñà(wÿšÕq¯Hu|<±„_ò28ì~³9-5á€F挬_¿þuZù›¥~6ì?#d?Ó!BÀ±Ï…›n„ï_$ü¶ÛÅ_ýÛ ýCcI¾Ø¿rtBu%z™ÿ€Þz H.˜Iíè¸ ^N€v@/)”ôîïÆ° (g ¬$ßp<Œ^/c;ö wÞ‘$½çœÙVþZ$ ‘Y•ë®»nÉ7Þø1)å¹aéx¿ËóŸ·Êß”Cî¯xuÂ!02’„k+~‹¯ÜñÿÒ@YhÀ&üÁøbÿ…~'6 P·Èüçóþ«ˆ_éùU‘âšý6Í<ü³øz¬ØÙ»We“g´X;^( ­ˆ"#Ù¤@Ž‹a*õ `å˜ ‚ìüÓ 0ÿG™X°.˜ÌgPƒ$°_*OOlÁwÀÏ€SOŸkSRc42+rýõ×/þèÐÐÐ)­V«åƒýµA0ï•¿)G ¯;=qFGòóm6ýLôo‡jÅû­ÿ_VÞœ%öÅFÆ¿•X€ýuí…÷ïú×ÞÂÿÿÙº”³jŒÆÜ¢àW2;•&Ðã J“ÿ4 p§CÜɳæ’£ÈÓ$HKI9 Ô/€y|nÝnÎ'Ê»aÜ-ÖíRÇ믢欢ÖëwÞûî ç}î;' ÿ2Y |J)õ¢›o¾yñ×?Ì¢Üpà ‡,Z´èR[ù»<ÿy™ôׯv_8åuðw„Ý»“ ¡l:òÀýP“óߦòõíó)«]|¬¬Ä¿8ÏñŸÕþ[‰zÝìècüó‰û×É >zïÍÜ9[—oÖïNW)ø:MçäG%@'ATV  Ãúbú…» IDATÆ寊ÿµs¤'àÉ0+jœÿCA V?_¸CËt ï'ÏbÕí&Yþÿrœù¦ù4­>ðÁN)µ|aϺ̆üõ¯=<‚/ =Ö.óÛ#•¿)ÿòL8ã°Ï>0²Û Ç÷÷ÃúWÐë¾²çØMúãôþKBqJû«®( Øu8*yŒÜ“|÷w½:Yý¦Sp,p¡Rjï=gömdºåÆo|Z»ÝþR»Ý~”™ì×(CZmxñËàèc“’AÝr8›ª`ýë ÐÛ±»ìÏKüÓÍgÿwÍ €n¯ñ³ö¿úwÅþ!Iþ[·qv’ÿ´Ì‰»TÁW#ŦÞ}Ò+ Ìšév9 Îèt‰ºÉ+Ö]ê"O³!N8ßåýË’Þv.€‰P/'@y¬bóæ*ÔôS¿ G™«¤!È?<Î=Ö®›ïSÑqÀW•RGìy³p#S)×^{í¢n¸á¬ ¾Òn·÷³3ýåïü¼õßáAŸT D] @ҿ±}Àÿv‰Ÿ·Ýo×hüc‘ý¸šþ”yÿ±§é˜ÙOþÓ2'îÔGmãVàj‘ž®^I .4;vz%è•Fi8 ®Ã h·ò­ Hϸ~?ù—þ\€/ǃø’KÃ%¯nvl…×¼NzåBš†Ž¾Ò´ndP¹þúë׬X±âã­Vëœ0 W˜´¾¦ò·ÙþIå™Ï‚W¾öÚ;ÉÐaºD>ö±}%þiè_=~³éO׊ûGVéŸËûw5üñAÿÊÍçÖQühd“ÿ´Ì™»µ× ÈF’<²Î€Fƒ Ôˆs=z T––4ûq6 ²s(GrÁº`§¿*£<)°”w2àîòß¹I'°…'ËIÚ ¤É h¤ùË_þrxßz¹Vô¦âw)ÿ™í?YÙw-¼æT8îy 0>žŒ×6|@M寪¼ëÛä?Ö?W×1=3ùï>³˜ü§eÎ1|W'&'-¹P ›*þ4°c š"¸«»F@Hÿ™Èçê(P€³*ò(‚ñãr(ƒëöðÝH5Ã…öœP0Ì7Çlß{d’å¿ÿ y Z œNR*øðfFn¤J~ûõ¯ßþâÐÐУ4³ŸVú­VkÏ)õ›JyàßÃ»Þ ~H‚DQ½ä?çzIûÌçý›þºŽÀX{ÿF@¿í~Þ¬ £Ø0¡f7ùOËœ1þq÷(;Ðft¡^8 t{A; ˜µ p•ÒÛ–²ŽŠWLDÍÊ€*€ ïOmÿHÒ¾÷ugÀ«^»'MAÏ®RJÓÌÆ¸ä›+Øç[ðñŸüøçº›6í/-ßEðÓ(ÿ>åÙÇÀkO…eË’j_‹àÒ€t» ˆkdþw-Úß  _©ß>€÷oÇýcuÐ…¸iv“ÿ´Ì©€•™ ˜l›(@× ²P͘½dÀ ÈÅ®Š-‚¥#æ/­„@¡+Ю ð1+Gk_óÁÈî,O2 Ëвk'¬Û.ú<ê÷Äégðy¥Ôç”R5³q#Z¾µ‚'‚+Ú+y-?øQëŽ|ÑéÐj·3¯ßÕÒ·QþÈÚupêëá©G¤ÕcBþæv\$ýqè¿[ÆüçñþË”¿qHlLÑã1Û"ÅùsåRÌ)àÑÛ¸UÁ×ídÀ„Xç˜MZà `ªÀèÈæÌÕòÛ¾ô#B”á Øÿ«Æ]”+C(ZÉq [7Ã3Ž‚w¿ÚC{òô³x1ðS¥ÔsšÙxÏ–ËW°Ï+ø˜|³ ’½`ä­oãÎ_üÜ ù71ÿ)’ߘô9ø´½xTòÇܶJþ²ä?å ýz‰9ú_Sù›mcÜ-ÚKD¹3ÿU’ùÿ6ñÛ¹r æbÊêG"ÅFÈ%]Í\€È`ÌW$=:½\€;`ìnZAͶÀ6'%aWI`-)CÌ!p䌎À»à gË^ÜL:=9ø\ƒì¹rÅ žÂmÁ)!,“"iA ¸ûs3ò·¿´ZÏ¿‘)”—Ÿ” Ë—'‰É®y¬VâŸùofü»¼£@+}“PiàÞQöWú7bÿ@GÍ~éŸ)sîN~Ô6Ö+¸Ü‰äºæÙ5+ 2x̤@¥ëWïæÏEŠÑÞÉT)3`l4 ÊçäøŒ0€fŒÌ.À Ï×ਃôÕ)°ä.S% úÖëv`Ëfxî áýçÂp£×*ä^Àç¸û®/Ü mNÇ”¯,cÑ7Vpb?j Nmi¯ß|Ñ[¶öèÓŸaû¥— &&š8òÄ'Ã>œ´¾û®DY×öücÇ¿,óßbûËéñÏ]ÿlÎÿXAˆ_~ÈVºsétÏI`{ĵ ®‘"9ÅŠ€nÈZ%v.€Ý.83Œ«&Jè~œuPQ4ôqUwQ¶î@|•wß•|¯óþžûüfB©/"úÌÅÇ Ã÷o]LJ¯Û—&,°€äòÖüxXp|K°,0”¾ÚÆ«%("EẀøÒo²ãË_lNìlÈ“Ÿ’„2¾wR-E5¼GßnÇ]û?¤?”zÿÆ?œ‹§vN×±üf Ç øZ¢Gï]ŠÄ³—A´­62l#ÚCÈ¡ECÃÈ¡aäð0Áð"‚áa‚¡a¡6­öa»E«ÕF„!A¯¼a¡—´+ž”…,¶ÁØêD¥ì:UåPæ%7˜pµ6–wßK÷‚zX3Y "߻иiO‡{V{DúR0® «¸j\qÁÆ.W>n{ƒÌU¹d9ûKÁ‹8½%Ø7 …óEw$Q;½”¤¯t] ’¨¤ha2çHÁƘÕ_û*‹=®9ѳ%¹.þTBf¶xI2¯šž~–Ùo°üu&`b&Æ¡3ž¬w& ;žéz4qÇjüÞFrz¯²’þÒù£›zÿãŠSöÛÈ'æâéœÓÀ/×°(€+Á“ Ñ€DÊ01Â6²5„l ¥F@bCÃHm ¶‡zF@«EØjA^<=ÅšSà–¥™ejeÊß…:øŒ%0¿ã–pÄ3á̳›‰aPQq+®–Ðñ GéØXjL(þÏÖˆïýã6v7'pnÈ¥ËÙO NàßZ‚}#«?0–yeŸ7„éR²çpÈM —­cí5¿NúÞ72{rÕ•ðå/À¢E‰#gÒøæ”§gdÊ<5&Ê¿[¬ý¯€þÍlÿ8ÝŽÒõQÅm㊇ÝkŽ0ÿÙ2§kZ³QŸŒsUnš0îu Œº¨ÈHÔÜF( 2º•‡@ø*< ÂÁ ˜l¯ì‡Àq÷ÃÝwÂ[ßÓ(ÿÉÊ{Þ•,—ô.›©4Ìxñ"K$G,’\¶.ä'7­å…7¬Õïld6ä²pù >6$ù‹ç,–ì3,`Ø‚û[¡þ–i$‘¢‚@HB) d@„A‹ h,^üÓzî|óY͉Ÿm9âH8ïãpÈ¡pÇå»eD]+ÖoÓýºÊþj(ò9ä9Úß^æÿæªò‡9Žür5{‚Ÿð%z(€”!CdÐB„CI ÕF¶‡m+ ®‡í!ZCCIMo»E¶’P€4˜þrW×"–ð6—Ða«ñP@ÿsY¸JÆ÷ºû.X´>~¬i¼IÉM7Â}MŠÍ§Ùxº34€""0¡PÅï»ð_‘âë÷Ù̆æ¤ÎŒ\ºœÃ[‚ÓBÁcÃê ÃM{õ†ó¡íCÞÓ7×ub±HQF"‚0™_Â62l!6ÜÀŠÿú6ùŒæBÌùãàüÀŽmIëa­ü3Ï_Ãÿéz'…þ#ËûÓÀ_ŸÐ¿²æ‡8#´÷pcLN~½†Kø\’/2+= ´A»g´´†R — ­v›°Õ"°sLÏ]yò”Å.UfäZSÚÊ¿¦ Ò»kóíðô£à¬77ýTÈ ÏƒK¾ ûùÆÂ|ÐM#À„øŒ< \+>÷?ãüá¨]DÍ žZ¹bû xb x–„§¶Ë=ůá|Óè)÷Þº†ÿ"ÝN—©âO*‹´òo!ÃVÏhµ‘A·ü½®ù3ÜÿÍ…™+rù¥ð‰ÀÒ½“ðn¦ü Ø?ýO@4ž*ý_ú·É~Ìù “Ì §ì¿inÆþµÌ àWkØK’¢$±º@ˆ46 dj™ë|€¶i,J€ÌJ“ÛY.€´QÓã.ä(?Ñ„mT&ê;©"`t$yõ¶„(£‘ÉË÷¿O}Ü;´²~ýõ¾.C@[ûz}<æž Å»ð5_?¬A&-_[ÎáC‚Ó†kBz‰|#‘Ïôö…c[+þ,¹˜$ÙO=Ÿ™(þÄh#[éüÒn'sK·CûA~ø¼æÍ%Ù¶Î=~ú}X¾*EŒØwÂðþ'’¥êä³ÿõÃ^"¾Ä?=Œ*nyØÁ›ç®÷óÄøõ^"á³ /·A˜ º* •<¤B'êÄÀÔHP€^E@†ØF@Á‹7Ñ€¨„|Â@ *“¡À7­×wl…û§½´—-oð©’eö†‡­ÒŸjÚÏ:†@WÁ„bC¤¸z®Øó‹‡neksâëÉ•+Ù_Â¥àYÂðösJßòôm¥ŸóüéÁüZñ'I€2SþY²Ÿ {pÐJæ“–b"h·c£G¯;½¹`sM~x |ðݰþO°úÀžçß™HóOüsAÿÔÞÿÄ<ðþa¿\Í")øVOÒ(€. ”2èa+}XÓ@»§üåÐP‚dem– 0úrWÜeøŒWó¡Š0€ˆãDù¿ø$xÑKšz*åÜsào‚û¯N'“ýËX«zÛ•ýë L$ A‰1 ¸BÀ/î¿¥1l¹*UúBp´$ñöÍÌ}æwÅõ{JÞ„ùmůýJœˆÄëO+‹‚0™G‚6¢ÕJQÅž´$@„­$!÷¬·À#Õ\À¹(ï{7¼åípŸÅ°×ÚÔëO €¸“qmïßÅö—ÅþÓ¥öþï=ǽ˜GÀ¯×p¤€Ë$ áLÔ‰:F>€‰¤yYY`»AbèÌ~êfxÀ‘àê@X Ù¼Þþø§Ç5ñTʦpÿýá{÷ À¨ãŽÖiâ0²u T —8HbÅUcŠkcøö¦.Ÿ²#ë²ÇÈ7V° ØK²J¿䔾³Fß¡ð±ãúyC ùëeêõËÀðüo?Sþa+ãI¼~,!Ziòp«•ÌããðÙ/@Øjž¯¹(·o€· Ÿù"¶ Dñ„ñÌׄþmÏŸ¬Åo†úiïÿ€yàýÃ<3~½†o…ð/6 $jØ. ?@–%&¡ˆ ,†=~G— \}§K½ -H¼þû=Þñî„»‘©•g=nû´†RHp¼GšM$X…¤c¦!`† tŒÐD”ž0`[¤¸iBñ —FpÃ-¶¹sá_[ÎÞ+–O’p4ôbúv¶¾©ÐííBÃNïx>ÖŸl›‰~‰×/‚VRM$ë=QÏ!©Ðj!Z­DÑk‘°•”—=àïàßÎlž¯¹,W~Î8þ¼YlÐþÚ¿[|п6ô#`4æºQÅÞ?ÌCàWk8RÂei‰¯e)„×ʨI‚ò¡€¡$  CaX €ÐI}†"}aWB '  Ò~Û·À 'Á ä?-òËà­¯-Æ5,¨ÑeÖ{ÐkÕ3i@Mc ,\E)vDpÓ„âŠßO(þ8sã?ï`ó|;Ýß_ÅJq@[p(p ð°P°$¬ÖMHgižÖ¯Rø@.¾ŸWüÉóœÄü{‰~‰Ò7¿öümÀTøÚÐ(@ÂØ(}\’XÚÈÜ–·¿Þýþdý^’É@ÿZùwI ú1Åñmâ+óåTÌ;à³{ÆøJϋр®ß5[YÙŽÈ¡CYb`/!°— †!2 v8»;  ÕÛF€òTx÷ß}WBkù–w4eEÓ)XR"¤k„5 ¨Ù$ tó‚/7À±©ÇlNp0‘sB1³Š'ª«Ø¡àW]¸Q)þ*Œ7ÞÚaë¿î _éËwW²6,m À*O°\Â#¬ "HgÛ³w)vi´ËÆDe+}s3Îa¤I~ä˜qˆè:ÿÄÈ”~fh¯?ì)}[ù!2a{Õká°û6ÏÚ\—[ÖÛτ/}ö†JŽu”ü)+ñ/õþ4ªxöa›¹s¾œ†ygüj ð= ËÁ( Ì[%¶-~È*Úm°•¯ °¹²@P\ßpæ¤ïß¾ œÑ°‹M«¼ïÝðë`xQÂÖé¤@Çàïô¦`Æ }aÇf6ìjê(#²·}!…ŽBŰ=N¸ÆüoWñ·î–ð§Žb,†í FFbÆ&wÿeN»§ž±pö0ÁÚÄ+öZ BX¢`)°š„5aM  kHžÁ‡KXÀR!z-F+!{Ͼlb*ٗߟ챳ü1á~!_&϶Ißöü“¤¿ÔȽ©üÍWb@¹C­6¼ýÍó6_äÛWÀiÏ…›Æp6WÅ?úY5•ÿ¸‚ñ˜cÞÌeóéçÏKà×køh§e¹Pd ~€ ÈÁÐAÛ¤ FrF€1Ñ ýØc؆@zl·;¶Ãó_/|qó N§Üp=œðXw`‘+Ü4¢Žet=Â]åBƒ623TyÁgTt@Å ¥`DÁX£"1âÆlS Œ´§äç¤qvñbµ¨t)€Å‹ÓÎùUƲ ¬…{n[?§p¼píÆûMÅ/ÒD?i$úéüž0KôË<ÿ–Y=”O?‹@¤Þ¿QB<>‡¯xuóÜÍ'yËÙð¾$빟ÙB>‘8sÉæ.Ç?bùô³ç­ð«5Ü[ÀO8@a†L†@£”',†d{(—X Ô Ê€*#ÀxÝsWÒÄâÌ77ÿLȉ'$4¡Rº¹Âµ! [†jå¯9ÄíBí$A¨kà3("Šr¡êXsÜüZvFƒ²¿¶"oð ÷¤!<Ëܘðç\Z0¿7Îû7Jû2QþR"DäôbýÚ[™Â×F€°=ülôàþœò—½†bz®IòxþîAͳ7Ÿä¦á-o„¯\ û€r?w6ô?®ØÖQ<ã^›øí|ûÉÁ|½VpÇIKh xŠ=Idß c©ëEªØ… ¥±Od"çž8\• ö¸üįEôè‚s>«×4ÝtËw¾ß¹/u(lãαµU.ô£÷§lg‹fó´nH׿nø[ý¥repæË ¬Fú k›â>sz¶CÇ~×ç{ÿ77¿ñ›áYbÕúgçE?“y?†Ñ/ƒ¿?ÉìOÀ”Í/Jáýõ“æ«•´Z Œßj/m´ åoxýÒ4Ò0Àï~ |PÒª»‘ù!+V±σ‡>õƒË‰o`™;‡'6Ê{'_º×&.˜?yÞ"¿\Í*)øaŸGDÖÌCè\€,<ðYU€¤a»°¶Z„­ (ÉÐ %.Atàèhò:é•pø›‡m¦äˆÇ'‰à©ÖЈ@×êf½ÌÎa_@7_ÖÉ€ˆ½ÛÉöÎmϾ0^²Š€íé;øŠßKÿõ&:ãÂs¬mg ã¨Ôozý"ú1jû  ú׿Ã,ÙOç$1|Ûëó°¿Vú Š^ˆPм dr_¬Z ¯>¥yç£t»ðÖ7ÑùÀ‡’ûÿ€bÉ_”dýß6¦8üÐÍÜ<æ¼E>=ÂèIKئà(¡ÊM*"›0HKrH€ž<Ð(@ õ8CŽþt_×3Þuì·?¼û} ä?“rÎ{aÃ-‰Gf^c__SL@Z¨€´Þ«7Eˆ€ù6»ž" aï×H€°Pœ×myÙ.Ï;ç¡“¿éÉÛKÿ½…që;ë{‹ì{÷8úeêñën}½R>ݱ/çg¹?©Ç |Z="Ÿ =”…z¾åõçBÛëÏ`ÛHƒ;ï€ ·Áƒÿ¡yç›H OyÁóŸ[7ÐýÕ_QC‡Ý70o=d3WÏןÎ÷ëtó_?¤Í±ž—LçŠXD¡”!b‰¢n²”%””( ¤ Nd!{F@,‘†“»"ŸºLQW$:Æ0ø”¦¶¦å†ëáÊË`ßý/_øø½…¥]µÊÒ»Ebî ‘y¬„8Uºx–¤ Y¥÷½{ÂÚt~%ó0ÛÃÆ:är ÌUÂ1æ¡1Péÿ­ƒô+u‘3¶o¡ÃpÚ`Bf^ºK=ÿ4ÞOVÛæãý¦g^¿à¿ÎÊõ ‘=«¥&2®Üð"¸á†¤äì^7Ïä|”û?€à«—³èkÿÍî3N ºµC¼šp«øqGñùùüóæ5pÉ8œ¸„õÀs 뉢xdæÐSôæ„.ŒeVKœ¯cÅ\€BB@"ã 9È‹_Ï|Vó Í´œ}FËÜMíÙè‰üØ! Üäo)ƒÜ­QTâl:ŠBàð¦Íã¤ãX1VŽA.öNq»ß—°¾o/¦Ï×ßÑÈÑ2 çÉ|³iyüºHhÖðe,~ùZ~ÃË/0ûY/;ÎoÇûÍ¥Ë(Cøõ/áñOHŒˆFæ§<ðA´_~*j|”ñ«ÍøÝŒv–rÊ¡›ùó|þY âŽüôOZÂ~<Úž[³8¡±t…„éÙYÉ€YH +àžèµì¾öY o~ÜïþÍÃ3ÓòÝïÀÕßNÈ•€Ù™•4 Åš4c@Çx áÐú¶‚/0ê9 uÛ p®Ûp$"Z6ïå}O ñK#¦/s¡¸Tég-zäEoÓ—²Ý£ðÕŠ?lç‰|Ò>9Åï5uýƒ*~!ó÷‰ àÖ[à!mžÍù,ÃôŽ8’ÅÏ8’©¾rÐÿ¡ùþ“æu )¿XÍ)ø~vrˆÀàûn”ŸCÝã[— Y³ ” (‚¤ôGOÙÄŸ*‘{î~<ç¸æ™ Ùµ^x,,[Ù»&…ŽŒ69“g=£q¶ù"÷KE½ãuX P2èk0äê;ÜÇïV%%}”ýãMœ‚©¦WDaöY†•†ùuY_‚æ$("HsÃ4Ù¯Wâ—%ôéd½Ü_¶m•õIið€q~g@:¬ý{Òåø<ôá ¸0d+»wÿ«XºôÚùþC &õéFN\Âvà(Ò܆ÒP&* Óa™Î?ÉÃ-„Ìñ‰g‰…f•0Ë'¤>O=¢yDfKÞÿ¸ûîd2·ÅÖ`BT@/Ž_3îá@lE€(2Úä‚ýƒ£ö×ð•:ÃäË…p8´öF¿ÂËDÑzp¿ÝŽ7)áÓµûAïk¨_-ƒ×#Lû|hªoÍà×îÁùAè¦î͸üÌ~A ܯ+€rœ ¾<;d”®·Bذ¹,[Ö<§ó[ÎCC—/„2ï“M¹+â’eGKxARú¤Œä(…RQ–¸¥Ò,îX&ꦉ€:%J¾{ IDAT@J"!{½|0ÂG9B$Äk×Á+_ÝÔöϦüî·ð›Ÿ'á—X‘\¥8ÍÖ …/òcR7‘IŸ4>3V=HWR%÷PïèeÐéI?ŽÓ ¼b‘þŸØH5¨{ôXfh7*PÃV)ˆƒ€Ç¦AP%©J>·¸_T m:;Â'¦ÇO.É/Mô“aºÔžz˜zøAqYðêÿ¶ Ê¿­ðņ^I¯¯¾ìí6|úSI§ÏFæ«üø¯…òcL@Ë/Ws°ü$€“¹F‡4aH®›å[eaý Ú­„0 a+í$'ot$ÉòÞñÍ£1ÛòÂc{zM³³¥³¹1r„ ¢|È@¹ÆuèÀdáˆó!ox °‘—)j¤jÓoAEqZ±Q^I®.Á-(}!³¬~„ÎÀ·¾4âô¸ß£ðe•âEV?»¼Ï ÷{¼þ\Hºœ˜H*^üÒæy²8R1ïÿ|²àÒR?=Â'.aHÂS² o†ÔÛæš,¤‘õß{˜Eêý囌€OàÇ“_ O~jóh̶|öb¸þ:6®Ÿy€¹ƒdÞÛ–¦øY^[Ge€/LàJ"´•F!Dàˆ ”ìêGÊ!|›#Ãq ù$¾Þ7׃bG>ê—­iAÊʉ|ƒ¨'ha~'±OÐ[züd1îïLô³Êÿ¼×Ü\CÀÖÍ ø6Ïíü’ !Œ÷ , E).ˆ à¨b( FÅQ Õ ]T”Xö*­ý—B dòŠEžk\ºç.=쑈W½öj¨>g]î¼®üfÂø§=k$È8…ìU¯“qÚc?‰ç.SlßnW[þqzÅeœ* ¥Çã< `¢"E„ÕdHãÆ¹äÑ2V!ßÃ1èIî)4Qø'–—[0l$y"% î—DÐ[æ°É˜£rpb;â[°Àc·³ë«y‚ÇIX™ø‚* gùéS)(Ñ‘"c»‰;c,;ó]¬:áƒY®‘9!ŸÿLÒµ«=D.öš0A‘óÈ ­0+ÒØ¿ÒžZlÄûcƒ ßW1Y¬ß„¿M4@"îíËU ȼ×r¬«ô÷¤KÌ&FôÖ³žà ò»z× m(ec®|ÆŒ"° Óû6½va¬ç’õLï_ÖˆëÛÊÝŒ÷Ëz0U¬ßÞ¯½þB€ÊŸgssÑ"øî·á€&`Êp¶býBý ® Ð%¿\ÍYàýƒeZ(r¥AÖG\mÄæMÈýögŸ_ÌÞO}Zó(Ì5¹óxÍII¿õ§¿©±¸ÿ•ãeµpÎJÍ2Ae(o{ÌUfèbTù@³1×RØj/\h5lý>g8 n( ,‰7‚áÍsp öRJ‡÷í`Þó*};Ÿ­Ü«¨{]F@)r‚#Þo—ìÉ9Û*NЋ³ÞÜ<×sK.Bœ¼àaü|5+¤à³aZ$ºT)L8ÇQ¨ # ŸðÖ¾áL?¤iå9'å=ï„›oH aSùÚþëà0L¾UTαªPü¶qPb(‹;Àܯ<€™ ¿sf ¤¿-w‰¢2Æ/<1~«~?*ñ…2JÖéõ×UþÒ¨çSüf6¿t ¹D?Oؤ:òÀü^À8¿Â3ÕÚ—dt>^~RólÏ ¹xÆBöþa‡´èP@WðøVôJ±HBoC{äCìwÂKV¯nƒ¹(¿ÿü¿ßÂ*›uÑd“±˜•š­ëä@Ó`H¡~ åÆiò_,z¯Rùíl]§Ž”(.2Î#9cÀ…èßä"ÒCU€KQùŒ€’·”xýÒÿûjîYBÂãúLâžD?ÛÛ—V…uzœž»‹QXa&;5·m|ˆ}‰†ÁM7À_¯ƒû= yÆgWFYàÐ?ž[zAË/WóR!øŒÉ.ÓV¿l‰ ûHöyÛ»Xóä§$ :ÌMyÙ‹’F.ÒÌaµ½ÿªe?ˆ€Ëë·CeÛÅîC û¡eé2ûù“5lOòÊÞ2¤¡H¥tÇþ¥(„<»O¡û’ø >²^ûB—w/*z9ÔõüEŬ⤙ØégÀ>û6ÏùìÉ9Bˆ7í ?t2~ºš%!|>£™âeì„ů:™ý^ÿö¾ßýšÛ.Ëç?ßû®#!ÓÑ]ϧü¡<ϘË`eey†>oí~ùß&l%í¬•,—:1ÿ\ø_UÞð"¸þ¯°þf8øÞÍs?sòÎ=Iù÷q—/<ùÝk^uþþ¯xÕ©K=4íG.‚ ) L[72‡äª+áâ `ùÊûs½¤lP/íÌ{ÓC/Cœh+ÁÏóYæÿÂó=ª~cÕ#ïËeÊv;ÜštÇNÀ“— ?[_]¥ï¤tv5†ªÈø/óüEÙùdªMï™»ï‚÷ž“ò\42ÍòÅ]»v½låÊ•=éGï±À†ßÿnåÞ‡vq å³â8FJI™ò׆@#sD^ôÜ$î_™q(Èlá1À èe §€O‰+U#î_óC!áÏkÔ©(‰K—µ¯u2ß•„œ(~…_Ç›w)#5”¿þMuÖ±ÎK-èßÚd†Õ—¯“¶>ñÍó?½²G”üáŸöLÙ¹sç#¥”W‡a¸\)•3LC ‘Y–ó> ¿ÿmö%¶nx•¿5æ2ô².:@•Q@IŒùŸ*Ëú¯d›¶¢£<°4†>P¥ìkõÔQþöw6»7îï9?“ñúEËdìG>Ž9¶™¦Gv/B\¾'þø=ºÖmåÊ•×îÚµëä(Š>%¥\ÇqúÌ ”Rhd 1fQnüüüǰr…ZêJ±Zéšyà¡l­“@/7 ÷„ß È)xé§~Ü_•°ÿU†Ê2Ö](@YY\¿h€¯™3€£3£s¼Êß¼~沯ûʾEì¦?%×@¹È|C*¡ ¾ö×ð°‡7ùÓ#gí©Ê¿Ï;~áÊ®]»ÎoµZ§ª´ÀF„0[rú)p×] /|_ÙÔ¶xЀláAÀ¯€KOù¡ ÐïóyýeŸI  \O»H÷yãßvY “7*÷QòÙ¸ó|¿ù}³±ñ~çù1Îc™×ßg´ª°‘Ùyq‚|ð#Í|0µò¥;ï¼ó¥Ë—/ߣâþ¦4l7@Çïìv»û…aøíù›Ò ³$W] ›7Â^Ë’íB6u?×DOئ¢7Çl`P±*Ìe©Q¥ôÅ^#@K‰ã:Ùªð¯ _>~e¯}®÷Q¢èU ô¡ü)2üõuÙí¬ûœ‹š-”gÓâpøÔpò+›yajäÇÀ÷dåß÷-¿eçÎK)†áþJ©\R`S0KòÂcÄ?—ú ·pü€láC\cUp}]ÆÂšÕ öºó·Tœ3o€9æò²ÍõbRdÀú _ÛÝÒíH”4ô±~ûL&ü¹îÁܪ±}Ï=ð¬£áñ‡7sÃäd«÷÷Iƒ¤²råÊõ;wî|C·Ûýd+L@J™Ë hdä?ÎM©~ $ëÖæ »0ûdûíÿ› x>×ÈÈò4ï€ê-shþ¿Æ?ª¬X€zuÿ®¯)ŠßÛ‰ØËªº¥íË{HxÊ ŸòÇñ=sËüåïO\÷Z‰Ç/<Q6à3@/†o^÷>¤™#—w5ÊÁB–]»v½DJùY÷o*fAþv=œu:¬ZM]Õ&s]ų́½^æ±Ê=çÅ«d¢Îw­ûÔ»:RRÕmq+ò¼ëüuŒ×g—-ëzý®8­[­FÂ_n¸Ä˜Ó÷Gœ¶~ç{šyb09ëÖ­gì»ï¾{4ô?3æ‚”­[·. Ãð ­VëÙ:à 4FÀ4Êë^ wß™Ä=íÛÔ™È6•·´# «ŠS` u„_§³ŸRLZ\Ìw¹Í’°€·FÞVÄ®±>HxJòøÖÿ3÷ñW”•ùù’ý&Sçï¼ßj##pŸC›~ýËUÝn÷øV«µ«9‰4!KöÙgŸÝ;vì8±ÛíFa>Ç, „$ДN£\ùmØ|{’øç‚ù]‰z®’¬ÅTF¹ x(_}ÿÒ ˜Åfˆ÷ºþLs;ûyª2¤ŠßYˆT)DÑG² 5ÉvÊ:îÕTôµ2øKÆêˆ/ÙOõÉð窡øõú¢Eð׿ÀÿþôàfΨ'×)¥^Õ(ïl׈);vìð&6åÓ% žÿXb%þy¬Lub`Åw3î±H½]'Ž_Û/ãü/=ž¤¶Ònw¢s ý—àÕ2Œ±Âg×ø.eë•^ÿ$<~Ï­4÷¯Çã8¡ ~ÓÛ`ÿš©£\¶Ç !~ÖœŠ¼4mYµjÕú8ŽßÐívïBÇqᥔBMÛH">7…ýsÌ=õ&Lßq>%¯²7Ød3×½ÛòŒíŒßË[Ôºzî%,Z]ÙãÕÏí·Þ'ìuáhå[£™¯¹OÆ·&—¡ €jå_¸†ƒŠÉÍ@í\ËÜñ&߃yo+ÏvŽLŠ|Ù¨I…Ì—¾ÐÌå²xK£üý³Z#%²sçÎ㤔A°($6HÀÉõ7V$þM%0 PéNUg\ÕCœ›Sel ÿ¹ªÅh®û¼ì já¾yDèCÕ˜s{d?ÑÿÍ2äo¯›ËÝ÷À¯9¥™CÜrŠâÍipK“P!+W®üÚ®]»GQôYSÉÛtÁz¬‘åc…å+Ò WkUQRú7%‚UÔ¿eñ[<ì#Šqý_«…±ù¹Í:¿¥äV²ÖõA”Üð½ƒ}‰‚ö1¶q`—}†èÇéWÌrLkÌ{{¨z—Ãul]Èß\wÑC/Z ÿû‡Ä€¾ïý›y$/çoß¾ýÂæ4ø¥ ÔN§óõ8Ž/w…´Є&!ßùlÚÔý׊§—l6ûª‹«8ÆzÙü󹂧AMY˜ÀÉoCý‚öK8ösÇÛáWÈÁµ-á Ö/´å•Ð>”á†ú³KUó÷£ük3õYÐåK•Ãýu ¨îÇÉkx¼ÿ=pÏÝÍ\Ò“«ÇÇÇß±fÍš¦Üo’3_#À¶mÛVApQ†G'óŒ»g@CÔ§Ä1<ÿ˜êÄ¿~·s›Uñt?ujô•sµÖñý>ÒuÏU„9ç1e-tëÂùUcŽýu¿sÕØTÞu’:•/AÔãù»¶ÇÇáÐÃàô3š9~Üív_Ðjµ66§¢\mUSÖ¬Y³S)uRE—ÄqLEN4 ‘>äì—ø7(à›I©JdÀf:¯¾ ažc¥6xÖ¿¨þßÞÆAPšP©ü­ÓìÕǘê/ÑÏx›³48º=RÒÊãí»¼•¾ZaRø¹Ïìé3ÊMNçÌFùדÆèCV­Zµ3Š¢3ºÝîí:Г¿\?½†‡“í•>îý¾±’¡JñV”„*« \a…)|å*|Fð+üÚ]üúTü¶n…Ï ë5ź+QÆ®—m18ÛAãßvJ¥ Þ¥ôõ˜ñZ¼~ô¸îÏ{êŒrcÇ'´Ûí†æ·é¬‘>eûöíÏ“RþŸ0 ——q4ဠ9í5pÇÎ"ãß@ðIf»o¬lÜû¤Ì³G¦*&îí Pg{Ðõ:^}X¿}ÎßRw_ ñq18C5’ýÊZE—æDp×ðůíi³ÉHÇ/‚à{ÚŸŒ4jY½zõÇqüŠ*Ž€ (‘‹.€M·OMâŸ3£Ú7fÉ Üù3!Nta*_SåÍ{ˆ{ð­3 ò·ÏϵœªlŸé“wê}I~6Ôž€r{ûö¾Øòøµ·;`× ƒúïÝ“f“¥Ôiòï_`@Y½zõ×”R™`‡# D¶l†+¯Hÿ|8þ´5½´‚  ü'«ÀË™‰ÒÿQõé©›_ÖiÏ¥èË.¾oœÃÚÊ¿ä l‹©FŸe(—E`ª zø“ö¨ˆñ»¿©äãŠ×ð"øí¯á[Wì ³É(pª”òÓÍÄÚ¿4À$dÕªU•F€~5bÈÇ?šLR¦ L±k¿­Âëï§eî b'ôM5¨¥à­/àTô¾ý®q{¬Î¶CñÛð?”+üJ^‚>¥,¾o{ûµ>Izþu¿r+þXy^#`éÞðéOÂÿ° §’(Š>*„¸¸™T“Ƙ¤Th¸Rùå/àÿþ–18<û“äÖ/3 ê 6™M?Ò—‚·þi©²w“ûÂ5 æÇ½ %ʾ°VÝ¥›UÛQUÉ~®X¾í廯«jûãØŸÝ_¥è]û¢n’ °x œûþ;•DQtÞÖ­[ßÑLªƒK“8E²cÇŽã„êÄ@_RàO|ü1I?ó tÜ¢ÆØdkpøxDÅãÒ×5$á¬ô}5ÿ©{Þ]Ÿ=M×fÐkWç: Ü Põ±Ï2: ‰~ª„Hù‘†J$Á4âÄع ñOðÞsÔ4Çñy[·n={ݺuã{à,:eÒ S$0¦”ò"{t¡ ? NšõoÆJõ“Eìí)D¦â’y½tçÁž}Ýã\MŒì÷â@£0F¹§+OŒßáí׉ûGQòêêW7A¢.,]?ú.|ý« fQJ·sçÎFùO4ÀÊæÍ›/‰¢è­è#ÀMá»ß‚%KÍGÙ±:‡€ÉXµåæÊÑ»k¡}„&uëzüïýìž}Ó©ü'!¥„}Säí›×½Ž×_ÉÞ×§××|åà~ííwóп½­Üü'8íÕór ‰ãø¼;w6ÊŠ¥A¦I6oÞ¼2‚‹Z­ÖÑ.$ÀDôrÁÊó0LHJハð: €Dûël{Ç| †ú¯Ú7å^¿ïWŒ×UþuÏ»o¬l¼jßTK-¯Ÿjo¿°îÚ®ëõ«žwŸ½¢4éÏðüm@oÿϵðßWÁSŸ6o¦(ŠØš¤A¦IÖ®]»3Š¢“:ÎåÉœ 2$ÀD|;á þº¢òG ¶ÃK7½ùœç®ªÉ~êxúç LÕõ“Û7ˆò÷yýP_ùW~åºJºOb&SqNIff‰Îî;ËëÇUÂçðö•kÝBúõúuŒ?2==Þñ#zÿ}îO;~ÿçÅôEÑy;vìh”ÿ4IƒL³lÚ´ie†/‘R¾-‚@i‰à‚êpû8õ• )ÉÀwâl–š ˆL:0w}¿ž¿ï=ý@ú“è¹Pe0̤Çïe ô•õ™±ôzýƒxþe†Ad!‘{_–,˜òܵ þá ðß—Îéé£Ûíž·cÇŽ³×®]Û(ÿi’Ƙ!Ù¾}ûqBˆ ƒ XT&.ˆÀ[Ϊ—øWk¸¬}2F‚õ§ÂPðyÇEÍß\ó=Îs8ã†ÊÎ]}…›tמrðÀ™ûQ¡ôq!æzÙXIm)ˆŒ‡’w-ˆ»†Ð…ÿ¹^s2|âÂ99uLLLœ·k×®FùO³4À ʶmÛ2² À™°`Œ€ŸþÞ÷X³Ïänʼng¦PÉO%:àïט!Àw¯Úç»ÞÓ&5=þR¥¯—S¨ü½á_ì?*Ùßíyþz§Á_¶Â®ÃŸ8§¦Ž±±±nÛ¶í¬ƒ:¨QþÓ,0Ãb.ÆÀS&ø¼£SÆ¿ªÄ¿š·fíòÀ™ Ôôük#bš<÷ã…}Sáí{.x¿J~ £ F'H½S•U(î§JÙ»Æê(~—r¯@t®€öüµÒÏ €Æv¢nqã pÈ}f}ÊPJ힘˜8ûÖ[o½à¾÷½og~N|óK`dëÖ­^$`ATüçÇáûßM»ýÕ¸ÕêÔ¿;“Ë ˜)t Ÿ1Ÿ0ãp¿ëwz.Ød<þªÏž2)ƒþûŒñ×É𧤟@¡„УôU\í¯lÅoÃý‘õJÇT *‚›vÃËN€‹??«SFÇ#§-Z´¨éê7ƒÒ³$[¶l9NJù©0 —Î2Áy™xËzxÝ«‹‰UI~µ†'K4™¾Ó¥ôûTøs!¨ÚWgÿTÌRªæeÿ”Äúím§l)¥<ž¾/ÁÏÞoT Ć!  @éW ^?|Û›á]ï•)£ÛíŽLLLœ¶dÉ’Fùϰ4À,ÊæÍ›ŸÁ›Â0|8PÌËäÀ³Ï€›oLºýõ¥<.סÎñ†²ý“õöçL˜À7>Uʾ}…Í~‘Ÿ)Hð³VÇx!~ט­ØÍ1¿òÏ)~•*è:ÙþƶrÅú-OßTþ)0”¿"1:”R¨[#‚|žôä.ºÝîãããoXºté7êZ辌€> Wî/SúÏß7½ý(*ÆúMÏßTü¨t=ùŽ*ý ˆoS´^þbÄEŸ¼mrM¿zttôU+V¬¸yW³(as f_öÝwß›6m:I)%Z­Ö³u'A›P+ÿ8Žç^HàcçÁøxRó«üä.0&\½CãZ™ž›Ï°ŽƘ2™=¦Œÿe|?el›ëˆÞD_µO˜¾^ÂÞ.9Æ9–~×ܵ5¾¿°Î…wÜVì5Çísè½&%ûÍkìU¸¸U×ÜíóôÍu}¯µ4}6æóøc¦ÒW5xÿ•ÇÓW®X¿Céçâüé±h?ïõ«ô7¤þ²<&.þSŠhp<ßú MêŽÝ411ñoË–-k2ýç˜4À–-[¶¬. Ãð ´¥ð¬T ÜycG>¹|%BJ„Hÿ¿ù=œˆxѪ,ÿáñ*Ãa€gŸs{: M“ÒŸ …oŠ·Û£±RØvöØÀ€ƒÀÇ«ôK’þ¼ë*¯øs .åŸ(þbŒßLòÈõ¿**ýœ!  º–žᩯøŽŒŒüxbbâÌ+V\ÛÌèsO`ŽËÆWJ)/’R†IÎfFB3atßýN&¾})rÙJ„ìyÿBJ¤ù\/0”Y‰’V6á BáN÷Œ‰:Ÿ;•ÆÀ4*þË1ë¢u¦˜Œ_y6*Û8;Ö}Æ€Ó(c÷£˜ØçTü6ô¯ê)ÿìØ¥oBü±+Æo©¢w)~ÈuÖ.xÿæ¾.Ä[`å7¿Ï<ª¿¹¡ÛellìKccco\³fÍíÍL>7¥1ælذaI«Õ:ø˜¦ö%ÎX‚àÕWq×k_DpÐ}SÏ_¦F@oiBÊÁŒ€JÀ÷žmç]_·ÓàÐ OI˜ ê@-[Áê_ÿV¯©uõÇÇÇGÇÆÆ>º}ûö?ôÐC›d¿9,0dÓ¦MÏ“R~0 àš>xÚЀ;ïäŽç»v ÛCÈÀ‚ÿ5*‘è@"Àj# Ö±} }#öv ¼?Yt Ÿ±Ú —›)¼Ÿªëíûle?P#s½Žâw$ü•…”+ÐÑÔÇ•ØgÐ÷öbüq_Š_ï3¿9§ÇÄôNG¼‚çÃêÿ¼V­*½¬###Û&&&Î^±bÅÅÍŒ=÷¥1æ™lÚ´é !ÄGZ­Ös á¨Ã8•FÀîóÏcäÜ3û?)Sã#[ö‰GLƒ Ÿà@Ä °¹/„P3™°Lù瞘~rªöO2WÀuœ÷7ÖÙ瘦„´§ úWåcöþ2/ůß_Pú–¢¯ý›ÇûŒ‡âWQžê·ã·²úUÜSô“Tüö¾˜¼Qm„%ç~€g¼Ñyù¢(Òñþ7®^½ú7ÍL=?¤1æ¡Ü~ûí«¥”o’Rž¨KíÀt%ª?þMOý‚u‡!‚™ýß ‰ýg@^é÷þ¿,GÀ Øëævƒ ìsúÎ/(ƒÿ]cÓØ–ØwœïØ:ûš2TýqýeœþuüonöyÚ÷:a~exÿŽä>eÖó[±þůO“Oñ›Jß4â.ÄÛ`Ù—¿Äò矻D£££ŒyllìÌuëÖ5ñþy$0eÓ¦MÇ !.Ãp¥V²uó2&&ØøÊ‰®úrÕ½3ï?C °”}•7ÒÛ³4 Îx]âN>A_ù"®1¯²/y¤«®÷t&Œ–yÿJÕßÎístðs.f?Š™üUÞ¾Kñ»Œ¯Çç3øã|&¿>Ve%}ʈõ»Êú(&ùMâÏ Õ3ât;‡x¯½8à{×2|ßû¡”bdddËøøø»o½õÖ úЇ6õýóL`žËÆ&¥|kY²¼€~ _ù2»Žá}÷˼}ÓÒƒ侃»T0w:LÕ Ü©;ß×G¸ ð´ ’pØŠPFðå†4\³ƒ2ß«òŸ­úðúsl|ø?çè«È}|µÿeíy3Eo.ÅïB|ûs­}#ÉOê/Æ÷{úrD>…ì~²m[ñgë}(~¯ò"Ý- ŽzkßÿAäýe|tôä}÷Ý÷gÍLöªt³?ߊõª¶¼¾v¼•Ké;<þ*ůlÅKørÍz …_¦øí:ŠßÜï„ú)÷úcÕSü03ÚQœ?¢8çÈÜÑ̰ G`Ëí·ßþ0!ÄÛÂ0|¶VšU傿KJɆÏ}–]/}r­4àx ÍËœ1ÐËô—†Òw)‚,AÐmäÌÀäÐaþ{gkYuÖñ߳Ϲ Ã0–{ë±ÐÄD,ÆhHŒZ ÑÈ‹¦ ¥­¦Ñj„ú´‘Zð…¦©‰IcøbÚ¦šÂ(/S)†W1’~h1ñƒîŒ- Ðy¹çžýøaŸ}ÎZk¯µöÞ÷Þa^îóO:{ïµö¹g_z×~þÏÛ%„…" %ˆŒy·f@'±’ý ºŒÇžu¥÷´@{LtÑñ‡î¢>É­w5½AO*ôïüHÏØkÜøk‰:ŸkäöÑh;_høgŽL¸?ãñ——„yþºØÏ5üË G•×Fʽ׼mäsÂÀŽÅÅÅù¢(î,Šâ¾®š"Â`nŽ#»¾Ï®Oþ.åËÏ ‹‰=“I:>Eê–?'-ƒé1H ‰BAE‚Ô Ä"ßx¨‡Òßj¢½5ZƳ«÷oÖ£­Îp›´oÇy<O‹Ñïêù·t¸Õü^Ë_,¯¯¯_O?hãkìÒjõ;9ç?]VÀ'3+ð›ŠüáþI®ÿè2<|´ä¡¾Ã›ö&=3a``÷îÝ×Eñéáp¸Ýõðk)áPAp|ô(‹_üGø Š e¶³/ÒBÄxÑ€ÉÑ%2kŒž{ HÖD¯Éì=кQïSpY†¥~#KyU›ô¸X¥¨dÚûbÊ|D´ùE}àjÒÆ½!òãÜC,ÿæýþμÿÚЗaõ~ÛCüN¨?eøsa~w577w)@10 ØûÔ“¼}ÛíTÆ¿Öá›¶ãOþtÜ1`æ‰#~Dß[/$HLwŒEÜÍ…êy7ÝЖpÒ„)‹@iPÚŠûʧ4ºúµ‘ƒÌŽVý÷Ýš72ÑÕøC>¿?=öÜ™¯Ab†¾Ì€ˆb_¨ì×Èé;†Ý#ÚlãKÊõjÀ‹5?òa~w~5†ß ÷«pÿ[#å‘%å¯>dþëFÖ9/‘Š¢¸enÆG_g÷ÿ!úâKóP8FåD‡8…‚Žá/¼Â"ØDÈ!Ót@³mÐMAx]S2KU¸Ÿ, 8ËD:„ô;ïZ,ÁÜÇv¾Ö­};æô5y …¡ýع¶Ëõ¦D|¦c£OÙì Õ ØÒʧš5øñ|~9ý¾0¿OËÎ|ÑP®/2ß×ð‡j~eeøYV)n‡WìM¸>aÀÀ‹/¾(ï»ì²ßÔÑè3o~õ+WüÌg)¶TÞhàºúcŸ¸uÓ£`Füºç:¨h¤Bia§`°‘p¼~Ÿ4ÔaöŒ4» ÜPÿôÐ!ZÐåºuN:’„U"—è²1O£_>  A‹×Ÿõô# æÙG ¾/ÍëF´‘ÓO{û‘ªþœ iQŸ¿Ò?VÕ“ñ *ü¿7‚û¸Ì£·ï75¿õ #†)þãÏ>·åð}Ÿ»W6òÑá9Ì»†¿ =àE¢DÀñÀ©; üÔ€xQ_ ¨ˆˆy; "BU!b¬€ 5áF—(x÷Wì»ó_jlz™ ¥«é¿¾Zý7ð9Íþð3¹nZòú‘±¸Áw~ó¼Ù«öïùý Œû% >-Þ>ýôûcþÇ”£KÊ×–”?¿áLÃß`ÀÐÄ·ØV÷Ü4„HK4€î·Ð3°nø7 Ð$3Ñ¡@A0¹É €Ij€H`æùOŸÏ‰ø„`²|rE„­ûK°“ÖÇ¥ÛšöïÛ»ŒG£ê'¬sÞ}L’M´vðQg'=Of7 µ×îxõ¡—ß4ú ó<É×îŸÍ­VÂ7êo3üK•”ï‹“<¿ùº¾E ëÏ,p“ŸÀ¶ÚÈ×D  îýçˆî¸['<¼oø'dG¾¸£á£i¶3Æ"Þs:ÄÀ¯!èÓQZ™’_¶«Róë掭`ƒžØ1æ§cx¿iô=£­NØÞ5ê‘ó0ï‰÷xê|³gíbô»†øÝ¹”·MíþX{_¬§ÿ¸ò½±òÀþ’·ìc¿½Õ Á›Ä`Hãé ¸S„?À%u` `åD 9æ¦f†¸¨!) –ÿ/÷úõ 1!×ãŠs75àßSÏ;¿­ä¤†[–ãšiùÇBú©¹ýýîy®×?v_hÜë±–J~õÆü}óZ½V=¿G¿yÝ.Ö£4é6<ýúØÕèC¾ÊßóöI(ùùÕý{–”¯Wþú×d=ý†¯ƒ!…o-p©À§D¸kóБv „)gLܘ‚™á¢„†? ý9R)€XD ¼Ïi#ôƦ÷M~K¯ÂY†ÑZ‚µ^ªBûÓ!m~¶SÞ?˵ùiäœÆ&9ÍÜ|`¼#ûŸAÜãoðCýõ1bÜS㽪ü;äüS¡þ24üÀ±’cËÊWGXžßÐ#†^xzmÜ#ÂÍC8úÈ NŽ.™!ND@Âs§èÏS ”XZÀ2D¢ާ/NX?LU4#Ìîü *0½}\7þ½½¬ðWV·]oàÑ×çmÒ¾ž'nø‰yýîgg‚@a‹žoà«ïu~_¨§)ÒýF/?d£mšý1o?ܶ·öøÝ¶¾ãÕù£Ç•Gn´<¿¡#ŒV„§¸NàžB¸®–“ìC cTÀkÊ»Á‰4ˆ@!¡PdÒM¯¿Aœcèõ{$ÂùÇ¡Ž­—ˆ—D½`0¨™•žÔìŒGÛüZBú‡?5¬ï_s„ ˜SWõ8IÐÀËoz÷ÁwO~^ضèñîMý¶~þìF> o?ìç ÿReü_XR¾´¸ÌŸÛÏÓ§aô»(÷¹ç¹¶¾úó%ím}µ‚ŸÛÏ?©ìaþöHÉ¿YŸa%0`X5&Dà&»EØ6œ˜¸¨ÿøR5³ùfTâd`¶[¡L"¡ÑÆ„ÀÕðˆApî…ýiËÿ¹×ù kßHx'²¢<% ©À, Pÿ¶˜žDáÏ/¸ËÍùuR$Áõúç ·ÚmóôD ¿¶„þƒ{rm}žñoQð« ÿ¤²ÿµ1ܨdço™á7¬F k† lÀoHU#0%¦èŸ˜ƒÈ@l¬¾.˜qqº â×>! «~lSÉÐëZˆtD‰@î÷mº$ô‚šm„Òya'Ä|—u?oZ£Fß5¾ÉHx-uaÝ@ÌÈÏ>zø4Î}#!-Rþ‰ðKKéð~ý=©^þ”ˆO¸iÏÄãMáóGJž½iŸUöV#†5ÇS(àªá䯬èH ^4aú@snؽžFê(±ˆ@“é¤:š×³eçµ>:¿„9}‰,SñþQ"Ÿœ@gY€Høß»?)í ¾÷¯d cA½7?ùlÃðG¢|W³7Ü"½æ i2@“$sýߦ×ùž”Ñïcø+¯•Êç)Ïþ¶~Àá„áÉy6 …kþ €ë†Ž­sÉ€%€|TÀŸŽ¥ÈaªÀ©€€ĉÁ¬A¢m‰îyt TðI‘¢ÁésKœ ¿oã3 hós¹¶¿˜Ç?=ÍÕ4¯55õÔƒÐ*0ùœÏ£øˆÏl>•ëχõß׷ȯÌlÚ†ûÿ…¾t`Ì¿x¿~ÃÚÀá„ãÉy6„ë ¸S`ûPØTá°N -"Ô5E&n;áì{$rî Ÿâîm@3:àŽyEA €4µfÏí¶º3J> PÏwmýIIýz÷>u` S×ÚæùGòõ³@ƒÿ\1£>²Ææƒ_;[àçÜÍó“÷)[tû½-z>þã%ŒáËÊ?(yæ¶ý–ã7œ80¼«øæWp;pçPª ‡¢ÉäS!à{♹YÛ¢?;C Ü} ˆ„¢FÎOK´5<úõMs„ü‚®Ì”ä:êëh­@,Bài–8ã/ÊóÆœq ž¯!Gà=U<ÏŸÍñÓ=׿šÍzÂv>WÁwYù×üËÿ.ñøÝ‡­ÏpâaÀpR°³"¸e lu¿Û-Ö @ºÐýƒŽ‘‚lªÀ™oF"¤yDâFÒŒL$¡ù™X€¿Ù>Øoa7[Ihhb.îñkd̽_#ãþFžLÁˆ”/ c_ŸÇŒ}xÿJzûUý]Šû¨*ú—*ÉÞçGÊ÷îã{3ÞM0œT<µÀÖ¢j!üŸŸ êéRÒÂy2=梤 ©±8Ïã¯k! ñK”°„‹5躸"À¶Ú€é©ÆÇñsñ1"¡‰„ÐÛÚûI­†¾1¦-d€¸ÁwÇðØ¿ßÅè×Þþ$¿¿»„—”¯ßº·ìM`80`8%ðxU0x­À 7 3QNµõu¤€0üÃoÞë]wÞÿ~I‰’0òÐ7Hxöíˆl2¸âEvLÿiÜ¿-}oœ_´{¿& ƒ¡Ÿ~ÆK†ý;Fr›ô$>Íÿqe÷²òü²²ãˆòòíûyÃV¾ád€á”ÃÎ¶Š†)^›9çQÃ?B°›¯c€SJ†±4Bü»¥A*Âïðž/CR 9µŸÐÌë׎ÿohûœæç57›kÙK¾o+ÜpªÀ€á”Åól*„k‹IT` l8¸}ÉäSЇTÿ¦´ rÝ pž%þ<’øîüy×ÕèŒô½)~R‚lŒ!aäÝó\1_Û}+)ês=ýÐë¯þ¨Òêß3Vž[VvV^úÈ~öÚŠ6œj0`8-ðä<[E¸Yàæ¶ …s½ŽV²ù¿ºDçQ?Z@.2Ñ’¢ð»ÒÏ”{Æ~‹];¿´ÃI￵°/?—ªò¯Ïû¶õ…ü¢¾P¦WñÃûÎÆ<»Kxøú-–Û7œâ0`8­ðó(6üœÀ‡®‘‰Ò`W2€t Î}á"étÞ"\””4få¤$÷<]wî÷2ÐØ¡íîìXôZ»yþõy®ýoµ¹ýzÌÝŽwDâ_žxû‡J^þÄAËíN0œ¶x|žs Ø. ×pñ0S,èB-úØ3 Ëå·µ+æ ~Ÿ> ]×ìE }æ:„øSç}úüs‚=±V>7·Û‘o¤°{Jå¹1ì8ZòÒ,Äo8ý`ÀpFàñy¶pµ7 \/pñœcpÛ6!‚Ž²Ã´ÕÄV꺽 ™ ó\]®OÔK@;Žw õçòùáX_~·•/Ìë»!þ:¯¿¤ìÃsceÇq5£o8ýaÀpÆá‰y¶\-p#Utà'æ„A[±`WB;B¾5¯Kn¾K@ÛX}ÑöÝkýèdü“*~ñë®m|m;ô•“y7_ÿo©æUÞþžÒŒ¾á …Þç‚\.p³¿(°m›R2ÃÙÝ ''H@ì\ºyå]rû±Ÿ¹VÝ}^ ºÂùN¿Ë®|ν)ž2 ñ;×cçz¹ªÞgI«ð~ ;Ffô g0ŒÖ >ù©9®,àW›D¸\ࢹˆÌðtgŒػ€VÔAY]u×À6á õXMõ›Çß–çIóÖçã@›YaYÙ£ðìHyeIÙ3‚—>nFß°`À°.ñ?Fñž “TÁõWˆÌ¢©}b@'¹|×¼}n‘Št_Øk£G_o?”ëÍE%y3ýù9¡ž©—¯X†Cª<«°£„—n³>}Ã:„ƒøòfä¢!W ü‚À6Ÿ‚ÉJII·µB>t[ˆkaÀ{Ý+«ÄÄV[ÙŸÚ€§tÆCO߽ˊŽá ϪòØ^=Rrø­Oß°¾aÀ`ˆà‹›ËÎâÊbF> pY!\4 ™"¨Sªj¿w½€óÙ>‹öÝXÐ}òþá>+©äïªÐ§“þXùá)ü'ðØHy}IY¼ëoÚ_¶Áðî¾/ †Ó·ùÉ!ç¿$p%ð!©Š / EjÓ z‘åT¡CE?=«ø{¬l¡eC@}}’ž~[>Ÿf$ÀSé«·ÕU´„Ï-ÃU^Qxá`ÉÑß;È!ûË5òkß`0ôÄ—7Sœ?àüÞ'œ(Áåœ-°y …»ØZ„€Âñú3¹Ûe¯eUxOÃø·Hó†×¹œ~=_·å•eåÙ?7Vöÿµ »ÆÊâæÝ ½aÀ`X#üå9ÈûÏbKg„÷jE¶1I\( É´¬BU]±ñUVò­H¼‡üæv˜#OÍ‹7NE0ÎP|p€üÊäâ96N›¾2K1¸/ˆxŽÞu€Ã?-ÈÇÎAþäð´ýÞ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`0 ƒÁ`Xøq=sä¡ëÞ’IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/bob-v3.0.png0000644000175000017500000007313612412506713020422 0ustar sergiosergio‰PNG  IHDRÜÜZÏsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÜ/³6/É IDATxÚìwœTõ¹ÿßß3½nï…Ýe© R£ØÐh$‰Ä^ð&š`4j,1^£Éï^¢Ñ ‰5ÞD£WcÔÆŠb,”(*méË.°½MÙ©çûûcÎTf —$ó}½ÎÎÎi3sæ|æó<Ÿçù>R’™‘_ÍP2— 32#¸ÌÈŒ à2#32ãð†>s ŽÜBŒ®rµU> øx 0µ@1à¶I)Û3WîßèɈ&Ghc€KøkœèÇVàOÀÃðe—éfj€9ÀÙÀÉGà´Ý;þQcA«Æ‚;¤”¡ÌUÏîß d§W§Ùýíçt:9餓0 ´µµ±eËÚÛ“‰K¯×£ª*ªª¦;E(…%}ÀjàI॔jæÛø'RÊÌ2À”¯r°å¢‹.’.—Kº\.év»¥Çã‘G>ÿüó²®®NÞ~ûí²µµUúý~é÷ûåÚµkåYg%E‘C9?° ˜–ù^þy— à Ìj€75‘#u[ØívyäæÍ›Û–ú8Ðÿõõõüñ¸\®¡¼-p‘”ò…Ì7ôÏ72aþÁV ¼–6‹ÅÂ’%KX»v-mmm´´´°~ýzöîÝË™gž3UUEJ™ô8Ðÿ£GæÓO?¥®®Žû￟––B¡{÷îå¶Ûn£¸8 ïfài!ĉ™o)ãÃý+îy`aôùÌ™3y饗ÐétI,—޵†Ãn‰ÿ´î®»îâî»ï&áûÚ LÌ*Àý«˜’_DŸO›6¿þõ¯ýj(à hƒ=BðÐCñƒü ñ­n>Þ^Ê„2€ûgÜÏ[ Û¶mÃh4Æ€ðe±ÛP@7aÂêëëûóíîRöf¾ÅŒ÷Ï6'óN8á„$¿?ÿ,uh[û¤{žºîºë®ëﭛ“2ßäÑ92©])Àb"Ù"ˆ&L˜€ªªIªdL&¥LzL·-º>ñyâÿé¶'®;çœsxá…˜4i@€uëÖ±aÃÂápô-—/ !¾-¥\Ÿùv3€;ÚÀV ü˜‘n{___ pQ¥k €õ¬Ts1`ý­ËÍÍåoû[Ò9ü~?çž{.o¼ñFômWë„«‰(­ÖJ)™[>cRþ_‚­X“lBt:mmmC2!ûÛ>”°@æcºué¶›L&V¬XÁ7Þ˜ú1N~®‰*„w !Ì™Û>#šü_€Í¨Ýˆ1°•••±lÙ2¦OŸÞß1C~<ÒbÉP¶ !8öØcÙ¸qã@}p®”rCæöÏî«ܵÀ¯£ÏçÏŸÏý÷ßOêõˆ>Ow† 8 ®tû­]»–Ë.»Œ±cÇâv»©¯¯§¹¹9õ­wS¥”»2Èî«b·´,’ã?žgžyæ `¥[nn¸ *øÒ-›7ofÞ¼yìÝ»7ñ-¿+¥<% ྠÀ ¬ŠÞÄŸþ9YYYi™m¨ÀKÜv8æäPÀu¨à›3g«W¯Nü˜§H)ßÍÀ £R~Ù#g«¬¬$77÷ 0¥Êó©àêO­L·ß@jejdê{éoûpÆ;ï¼Cii)­­­ÑU×À}…ãßU¥,IœEQP%éÿÄ%º~¨ÛAz( åP•Êá.÷Ýw_âu˜'„¨ÌÀ ¸/{ĤqÇÓ/Øú×`Lp”ÅRAw(ÀKÜg8@Œ·páÂD†T€ë20Ș”_öˆ%&ïܹEQ’LÇþÌÊþÌËLËÔÿ“&#bRögNF—Ä€ü`#ºoôÇ !3åûÚT¤I)›3È0Ü‘Lf3£Ï{zzxóÍ7d¨Ca·Î‘´˜-HÕ”Œ SV#‘´¶÷…ùHdTÊØœKd~[yê>6›>úˆ²²²´Jä@ eje:vKeºÔmG"0”¥©©‰‹.ºˆuëÖ¥‚ïcà„Ì» àhÙÀÕÀ÷€A…“ÉÄÿüÏÿðõ¯=-Èvoûœ—ÿ÷÷„‚A–Þ~BQ héÌËþ€w¤Á—È®B¶lÙÂ7¾ñ ÚÚÚ/Ť”Ë2ÐÈn¨@«!"w_ ØÓl'??Ÿ±cÇbµZùàƒp»Ý!0tÌ?}ÇÏžMVví­-üã“õ|´n#»÷uÆÎ1¡¶˜³ÎœCQq)^¯›¶ÖÚÛ;p:ÌúÚ‰|}þ%Ãb·¡/— ÔçC]êêêØ³gOôãùˆÌ$ß‘Gp­–H¢î‚t¾iee%çŸ>—]v‡;3•+W2jd5w}÷4² ùó?xcÍ.ú|Á¤có³,Ì;¡–)£ xC|¾æý]ºÓÏÒnfÒô“q÷vÒÜ´¿ÏKmÝ4Ìû bJ*k~ °bÅ –-[Æ?þñÔð!p†”ÒHp©@Ëî®!¥ª±‚iÓ¦q×]w1vìXÞ|óMn½õVººº¸â;s¹þÜZŒz2",„Ãaê÷´ÓÙÛ‡^'(ʵ2¢Ä‰ˆA©â †hítãñ …ÃHUr ÃÍŸßÝÉûŸH ÆÂ Ïüá÷Œ?ö„AÙ.uûPÍËÁX. ñç?ÿ™_ýêWýÍOdºß?Î/¸h>䵨’ ³êt:æÏŸÏwÜÓé"²ø¯~õ+zè!ÊËJ¹jÁt&t0¾ºD Q¹íFWÕÈzUEBªI “Hªv\ü±µÓÃê ûÙ} ¯/DŽÝÀ'Û;Y·µÚŠžxâIFM˜9 I9ðeñù|<óÌ3,_¾œ¦¦¦á\êÀ7¥”{3pù7œbð06•ÑæÌ™Ãý÷ßÝwß\.K—.eÕªUœxÂñ|±q]]ÝœuâX~uÓ¼8h Ævh€Š+ZÈ3tR°*R•€v¬ ƒª­×ö_³¹…Û·¶?§L¯eáÂs™{Þ Ó°À7ðY®··—'Ÿ|’Ç{ŒŽŽŽC½ä[)RJ_2ÿF€Ó&OÞܘê§M˜0x€êêê¤c¸ôÒKihhàÞ{ïeòäɼöÚküúב™9V³¾^ÉSUí†:í9ª¶?á8˜UIÇDzg7óêÇM„Â’ª'ÏüéYªÇLnEèA×ÞÞΣ>ÊþðÜîáY„ùùù±iÓ¦ÄÕ÷I)oÈ@æßpý±Znn.>ø ÇwÜAÇìܹ“ .¸€ÎÎN¤”Ü}÷ÝìÝ»—Õ«WS__Íbdù­ó9ijMhdÃŦj¬£¦€.Phæglÿ¨9ª"Õ8ј°£·_<³™××à´Y£ùãK«‡dV¼ÆÆFyäžþyáUT°Ûí,]º”ë®»»ÝÎ 'œÀ'Ÿ|ÝìJ2Áþ '„¸¸'‘ÕEáâ‹/æ'?ùIzhëV.¼ðBº»»c7¦Óé$ áõzWSį|#+òb“H„ŒîýOwó»ÿÁºÍM‚aŠóìœ6³škΙB~Ž¡F˜/î¿%€O¦3-5æ#"²„Õ0×=¸žuõ¬zóFŽ›>$€¥f¡Ô××óÛßþ–•+W&¦m iF.»ì2~ô£QPP3K{{{©¬¬$ŠÅÁ¯R>‘Í¿(à„¹À€¹‰ëkkkyòÉ')++;è)%ëׯçšk®Áår%Þ,Ø,FþãüÙ\¹pfƒN3ûâæ"DÒ§þëÉUìèr°téRX¶l 8¬F¾ą̊+5aBµÓRJ p‘J)Ãt»üœ÷Ÿb4èùÕ/Î gœ?,†[¿~=?ü0«V­:”ëË‚ ¸õÖ[©®®NkšžsÎ9¼õÖ[ÑC–R~/›Cú£lÓ€ç‰T Šýß~ûí,^¼8¶_0äã?fíÚµ|öÙg|öÙg¸\.l6ªÿ¥Ï˲±hÞ4.={&ù9¶¸É(d $B¤ªòôÊOyêÕÏY±b ìÙ³'i‚ªË`ɽ¯ñ—ÿ>—ªgTD®"–y.$B $„¤B¶ÝÄòïËeÿµ–s/ºŽºš»8cÎñÌ<î$¦|íë8s ÒíwÞᡇbíÚµ‡t}O:é$î¸ã&Mš””­(É!ÌiÓ¦%nt2ÿ‚€B\ü†„¸Ú¸qãxúé§ÉÎÎÆårñÆoðöÛo³zõj¼^oTy¹L›RǤ1•ÔU9yú¥ÕŒ­.âÄ飘uL‰HÿhÌ*BD@â „¹ïÞ' ñæ›oÒØØÈÆùâ‹/’Þ£×äíu \qö1T@DÀ„ˆ€MˆÈ© E{=D˜BQåþtÛLžüÛvpóèÓ+¸ïw/#¬úÛ Œ=f6áp˜W_}•åË—§ C'Nä¶ÛnãÄOŒ-d©À®yšÿd€BÜÜšè«Ýxã,Y²„uëÖñ /°råJ¼^/‹…YÓ'sʬ±œ4¥‚š{Ô®àÌãFÅâk‘›]DÀy%Õ@JT„à“MMô¸#ê÷ý÷ߢ(ø|éÕð¹ÇÒðe-RžPB© ED@Ib95¤ë:bÄn¼ñF¾õ­oŦ#õ²ÄukÖ¬IœÈ~ ¸ æoÙl<ýôÓìÞ½›‡~˜íÛ·£ÓéøÚÌcùö7¦3wf³ŽUìÑÅ3>d<¸!75¦B¢™”HÉÖN_ò\ÿ€ï·´ÀÁ{^¬IâÂI8²N‡â¾\¢b÷÷„vœTU:zý|ëÎ5å:èSÍé*o iäååqíµ×rá…Æú# ”™’ø¼¯¯ªªªD?ø)å}Øü“1œž˜.¤‰#/³£ëjjjX¼x1×]wäæä°ôêó¸è̉åšã b¸¡™Ž€P5†“HEc;)Bj13@HJ ³xü?¿ÃUw>cºtÃj6DX U3PEDáŒM@Ma9TªÆr jÿƒ@hì‹ôxC<÷Þ>ÂaÉîý‡F*V«•+¯¼’+®¸›ÍÖ¯Ÿ6I¹páÂTÑéÕ dŽR†Ó*c¥`$ðð)‘Œþ·ñÑêêêl߾ʊr®^tçÏ©ÅbÖk7rÔÿš”rÑÏEˆ™–ɬFäFWã,'¥J{§›?¾ºŽ]Mìkía_kmnÂjä¼f£žÏž½Eh*§ª¦ „cñ¸bQ'£s!#꥔*-]žz}~¾À¡ùNz½žE‹ñý¼¼Ø¤Õ¨*9PÎet”’óÎ;÷ß?ñÔ/H)¿ÌQ¸Ä2tý ¶ü/0/Q‰,..¦¹¹™Üœ®»ül.9sFƒˆ(Q ÉÈÿ" :ÒX•‰¦dlB˜&”HU33µ”,ÔhV‰ñéRbl=në6îåµ÷ëYñ÷zþ¶ü"*Šñà¶TµØ\ÜTŒ„ ¢æ¥fFj¦&2 ¨ìÞï≕;xõã}„ÂòP¯9óæÍcÉ’%úúú°Z­ÔÖÖb³Ù*ë0й¹sç¦ÍÛ‰ŽÍäS¥€;x‘H±Õw€V`PŒÓvëÑØM—xÓ!¸æ’|wá1dÙLZ–¼V’­–ÐLÉDvp±Ä䛉XÌMÕ\:5-èâ~U,Ô0‰×ë‹0®T‘Ú:T5‰ÑbLb95ÐM»;ùÝ_ëyû“fÔÃøŽ?þxN9åÞxã Ö¯_c4ˆ$rO:•‹/¾˜3Î8cH3 ÆŽ›Øo\ÆdæÇ}ù€[ ùUáa‚ÍNdªÌO F£Á 7½^³gÏFJIŸ·iÓf0~ôX‚¡Uµ5|öÙ'¼ôòËìØ¾ñãÆðý gSàÐqÌØŠˆœ.tš»#(1“Rhòº”"å}ÈX j^ÆLFUc;5?3çÖâmß]Œ‰ÔDA$QÜPc)^1%/Sb楪ÆÄ“µ›šyô¯[øhcëa}y&ƒB8,™6u2¯û”üü|Î<óLFEnn.íííìØ±ƒ×^{ŽŽjkk¹ùæ›9å”SÝM7Ý«D 4K)K2Pùò§.Ø÷àÇz½^žxÒ)æÂÂ"ý˜qcÉÎuâ´YQ%Uà XóѼûúë¨R²{÷n ò²éíéBJÉSÿï &­ÐÀ—ÐÌÉ㌱àÁ ¥Ô@©Æü¶hfId[XD†Õ Ið¹d4“$1]KVÔT$€B dVªá0«þ±—G_ÞÌç;;ëK+Í5ñsK(ÈÒñïW_}?üá èõú˜µ} …B¬X±‚{ï½—¶¶6-ZÄ-·Ü‚ÕjM º 6pÖYg%2œ-3SàËW)'â™ èÍfˇÃYSXXÌ„ñc™vì¼^xéÕ?óÎÛïð³ŸÝËŒ)“É6ÚÑô¬Y¿†÷ß§ÍBGg}þ`lÓ ¡D€&"PŠùv Ф$ñ¹$š‚)P‘B)‚Rê@ ƒ B‰ÄƤGÔËX–HäQDãkH-î&¤PTI‰Ñ¸œBK^}'½²‘ûzëËʲé¹òôRÎ. ³7À’åÛ°™ôÜùŸ÷p΂s5 Z¦RÎ>ûl¾þõ¯ó“Ÿü„§Ÿ~š;vð»ßý«Õzb9yòäÄÃ"M*3ÍÒ°€ ¨ eåÛ*+«FΘ>œ¬\>Þ´“×?ZÁ×CŸÇËß^ýŽòrDU%jFá,,¢¨´”ŸNÇÌcF%€-Êj"Á¯#&¿ìÆ%VÙŠÈÿˆhB‰Nˆp$ø-´´,¡±_ÔdU‰É÷QUTHV,OK Ôè:Ïà…·ëyü¯_°¿íð&L› žRÆ%§•`5F~,þóÙZºüá±eL?i~Âg=¸{b¨à—¿ü%ãÆãž{îáúë¯ç¡‡бb"èRŽ­Êîè\ì¼¹ùe-m-úƽ{pKÁÿ¾ÿ1íÍX¥§æ¯o¾®¨„N“žwÖoàØÒ ƌϋ.dùƒò›gßã{ß9E»¡•H¨LQ@OD4•JhâcT@ÑØG3,c±2!ˆÌqK`-„ŒMh±±ˆÈ"4>Ó-ãÒzäh¯­FÝIàòùãÊÏùŸ_ÐÑÓwXQ§æ_Ì’3+ÉwbAñëÚYSßËWÅÌSô ²Ô#ÑçW^y%V«•Ûn»›nº‰eË–%Åâ¢Ó™FF09ÊW¢9¥FE¡¹µö‚{_#v%D–ÍŒ!(ÃXÈÃŽÖV¼Þ>Ž+)¡ °‹ÕÊ/_A]m §Ìª‹MDÊl¢ì–ÀoBc8HŽhPE‰ƒNQµà·Æ‡2ˆŽ°f8‰0£@¤oÉØëJ¡ÐÖéâÉW>ᙿmÄí=üξ§[È÷ÎɈBS,Ô€„  ½ºE6®¹iY’¿–:Ò#Šþ¿hÑ"\.?ÿùÏ©©©á{ß‹Oøío›x5¸£pç“u:]ŸÃauõ:ú!D›I•¥Ìš1¼ü™xŠW3E„ŽÜ8¢¥Î5…r< ***Ú¦Í8Îjufc1šÈ²[(,-¤ªªšºQuÔÖÔ2¢¼‚é'áS‚xú\B »<¶íÛOaE‹]Dw¯‡[þûYÍ·Š2[ÄBA(:-…*y!¶MóÛcÇÈþQs1ŠŸ„ìe8Ïö'®„ ÛÚ¹~ÙJN]òO¯üì°ÁV[æ`ù¦óÄM3™T“Ýï~z·™ü,g_xÝ€½ã¢©ýR+Hß{l5Šþð‡¼öÚkœtÒIøý± Ïߪƒ^¯Ÿ&_õ {¹ôÒ+ÈË2ððS/—íäšÅs5ß, ¶è/¸Ö¤”‘mj8nr ´ wÔq“ ‚D|ƒaž}¿ùÓ»ìnj?"F§æŸ4’kL¤0×›9ÆNšªþ ÊÆ=nΘ=EÑ ´Ö§«èl·Û¹âŠ+xä‘G¢»ÍBŒ•RnÍÀäè5)ï(¯¨Äh4¢St¨á0û÷ï#+;RD§ÓÑÛÓ‹Ãá ;;›ÍÆþ¶ªŠŠ9mÆqôvw`T$}=.|:ÁšmÛñ#¨9‘Úª2–=ú{÷·i‚GÔlŠ!1³’J( ™' >YÌï“1SÓëðès«ùÚ÷rÓ¿pÄÀvê´J^þ¯oñ³«¿FQ®u¸JØÔà"R™5kfZQd¨ædjÃÇÄåÇ?þqb]3ðX"G)à„õz=5#kÉÊÎÆd2¡JI^^>ŠP0›Í„Ãa***°Z­äää››K–ÓA˾ý|ã„“qèô\Ý Ó…ÄãóÙç›)(«ÄæÌæ˜q5,¼æ‘d8zb ¦@€¢Ó>šHpÅâ1¶T«­»×Ã/_Éô?å?—¿Ls{Ϲ&ÇŽ)â™»çñÐNedyvÂ<¾á­e~úqs†Õ'ݺFŠp2[k`™Gà´"­W”””PUQ‰×롪º ¿ßÝfÃl4M(öùú0™ŒX­fJŠó©Y‹/ ?7‡3¾v]ím(„ép» ™õlÚ¾GV—^qßœ{:ûZ:™5ÿ†tºÂ0nhAs[7?}ঞs;¿|â5º{½G䢎,Ïá7·|ƒgï9›©c‹È9ë›<õ ã§œ8l¡d }SYnÉ’%Iù•™°ÀÑÉp—z!#GÖâõû@•c0@•جV‚Áf“žò²b¤Bj¡ŠŠ ()+£§½ƒs¾~YYv\®v„ÛM«¯·³aëV¾÷Ýk1ÚK3r ûZùã‹ïÄE’ĨѪÇÑdfA|¶’Ý-üðg¿gÆ‚ÛxôÙwðöŽÈE(ʳsï÷æðêpêôª~C;÷þ5eYMæAÖŸ9™æ‡2íúK.¹$ñé‚L+â£pZ§Ñó!Rôçk3§ÑÝÕMII)ápˆŽŽÊÊʃôú˜Ão³ÙÉË/ˆ§jD½žl“…+ΚOoW;„ý´uváÓÙÒÐÈãÏ=Çõ7þˆºIS0 üâáç“缩áÈ-îù ‘Ÿ×ïáª[æø…·ñÌ+'<2u6?ºd6oýæb¾}ÚxtŠèO><´ÐÜé§²´`HþÛP[[¥Š(ÑeéÒ¥ètºD_îæ Tކ»­]TVV6ãFDUUJKKðx< 1›Ì 99‘, ³ÙDQQpùÙ”•–ôù8yê4FV–áuu#!š{\¸€ Û#ýÌž}îy&M¬£¥­‹§^xC›¥­ÍQ#Þ8#Êj¬ÛÌùßû/N[t'¯¼µU=2³ÜW-˜Î»]Á’s§c1é5¶%©†ÊðñŸîƒ”¨Z{ü”—RÜm0ð¥“ÉÄÌ™3W]+„xOñ¼â<­ÂZf|Õ€Ó.|Ì™:qæ\>»ÝN^^.mm­d9íô:ô:…>¯/ædåädÇÀÐÖÖΈåX6ÌF ‹Ï< Ÿ·}¨.· _X¡¥­›‡~ÿ--ÍÜ÷«‡XöÈ‹lؼHž­Ê0[µŽ¹—ÜÉü«îaÕG_¹‹& ¿>‘·»Š[.?‰l»ùÐmÅD“éY°³7@0$)Y × IDAT//¶99T±$•ån½õÖÄÍfàD`!ð°]ñ}!D®â[Bˆ_ !þª-¿B,È€2ý8Ü8Ü@qTî¿ä¼Sit›±Ûí¨ªŠMs¾ssrðûü”SRRÔO¼(Â~Å%Å45íãÄIÓøSi)û[:q­tvõ’[RÄg {ø^Q1EEÅüê—¿bé Kùýóorÿ¸*@VU^|í|ò¯lÝÑxÄ/ØœµÜtÙÉŒ‘ï@|6¹FmO%ÔÅŒú”BFò沈‰ÙÜ™l]9bäA¦`q·|´tû¦Ž &MwwÚ2}•ÀÚ’n\ ´ !n–Rþ>áÚÌ'2¿®•Hq¢w¥”À m\ýgÆÄŒŽ ü½Øl6‡¯/2?¬½½‚‚‚¤åççP[[Ckg;UÇY³çðëÿý!Ÿ›vÅHN¨“ËÏûk>æ„™³ÈÊÉ%???¾¸ŠÙÓÆÑãöòÐS+Ø»¯íˆ_¨cÆ”ñã«NcÖ„ŠX#Ž#?d‚yZ»#¢ÎˆÚ±ý)ø†R *Q­<èÇeÎ^|ñE,XÀ„ ؾ};+W®¤§gHa“BàI!Ä©DzD|Sûv¦ìçB<ÜõïPÆáMJ!ı@l.þ¥—ÍcÅö¬Û¼¢Ãï÷ ‡#b‰Á@  °¨ ^Ž`Ŭ¼¬ÐÏ7O8™1UÕø<Ý•ÝøaþòÖÛŒ?–¥K¯Çl6òûçæ{ÄÁVSžÏ#?½€—}%³&ŽÐü+í3DA!4Q‘È^"ÆtB& §D‰È¨)úG·;¡•êqÃŽ» ÇwK5+oºé& ÙÙÙ\wÝu<øàƒ¬Y³†ÓN;-é¸Ù³gsà 7pë­·röÙgG”éøXL¤ÕÕiÀ`nV !ŠÿÕw8 wnôŸqãÆñY0ŸWV¿E¹T˜9n"û÷í§|DRU1™LƒAÐÖÖAaáÀ*seY9]í]ø¼>.ž{.O¿ö2³&Lbýþ&ö†Ü„›CÜ÷‡gøáE‹xáùgÙ¾ýÈΑ,ÈupÃ¥§òí3¦ WˆŠj!É AH*PDÔb룡‰Ø:‘,‘ÄJ°Gf:DúÕE^¡³7Âpù%•iYl \É¡°[Ç3}útÞ}÷]ìv;¡Pˆüü|üqæÎËxâ‰'8î¸ã’Žß½{7—]v[¶l9èœYYYŒ=ÇÃÎ;§ÍÖ!¾)¥Ü˜a¸ƒÇBƒ^Oõ”±¼ôÖ‡øšÛqZ­èt:hfÿþ8³²èîî&?/›ÍŠÁ04Œ×ÕÃírq⬩ÔÍ:Ž.ƒ ½ÉL§ÛCnV.»wEzµµµwrᢋ9䎔a·™¹ñò¯óþo`Ñ7§¡W"Ócds© Õœ#„``…ò0¦t¹ƒXL:ôzð„’¡2Û@þÞ©§žÊ®]»Øµk&“ «ÕŠÕjå?øA lz½ž¬¬,²²²0›ÍTWWóÌ3ÏàtÆ Íf³±lÙ2¾øâ ^yåÞ~ûm>ù䮸âŠTßð!ÄÕBˆ¹BˆÊ à"_Îx´^aÖœlvuwãvu¢ÓÍl¥×åBo2••E  ¤¤¡<ž¾$er@êÕë5j$¥Å”ŒÏ;;7ÑäîÅ6ÒâucðØžfÞ7Ï ¨°„›‰8 Ì :®\x<}ß_<«ÙùÕÖ¤ùX;âsrè‚ ñ˜a œ‘}E”ÜD"ÆÏÕé `·ÙœL®ÁÌÊDsà­·ÞBÁ`Àh4rÎ9ç0{ölÌf36›-VxÈl6c2™(--å¼óÎ#*¨=óÌ3,^¼³ÙŒÅbÁb±——ÇÝwßÍõ×_ŸøœÀ#À  A±Iq©ˆÖÒø7e¸ùQyÜ’“M'ˆN†1°éôzÜE¡¨¸€¾¾> =Íöhii9h]EU%{›ö±­~íûióxñI:ÕѨÐÝÚÊ?Ö¯¡ËçaÒ´YèúÉ¢̬ZpúTVÿá&îüÞ^á¿+àN0 dåe ‡Ñ!0ª FƒÞž¤”´··át:±Ùlètú¤@7Ô™¥°°0íÍàõ{¨ßµ Å`À”>f1®¼Š}û0uÚL¾ÍlÖl&Œ…Ãfú‡˜1†¿ýîz¼íÊ‹s´j]š_•ÊnÑ ËÄ›ƒD}2¡+ŠÉñ$0X¢ÿ6 `’^¡€ÇÂa3§-£0f`éÖK)Q…iÓ¦±nݺ¤m:®ßóDMH§Ó‰ÅbaäÈ‘Øív,KÒëèt:ìv;&“‰7Þxƒ%K–Ĭ›ÄÒ}Ú8x_áüwÜd½É„ÉfŽC ©˜„‚"! †().Äl6â÷‡ðûB}AÑúõímmýÞ µ#«Ð‡Ã(áH±„6¿—]x=nŠËK¹ûΟ°më6òòòøñ-·qÚ Çúæ'©àø.O/»šºÚÒ„ªÌ‘ç1¶QÓ±q &X¨ÑL—Tÿ-ÚÀƒR“DI)ñU6ËWÂlé˜nêÔ©ìÚµ‹ööö!ù~Ñs[,œN'v»=U¹L®Ãá ''‡;3?ü={öÐÐÐÀ믿ÎÙgŸ¸ûhà)!„^q²â‡Bˆÿ'„¸[q±¢ü_pš#[`±Ù CäÞ «dÛm  &…E”” ùhi9€Ë•\øéÀäääàp8xóÍìj<8þ9¢¨ˆïÌžÚçGgPñ©’U{hhm¦('¯_ò÷>bdMî¾e5èté?Öˆ²|~s×%¬xì7edrIóhÙóh+-s¥?vCʤ%ÞìQëJ—jz&™“êý7‰Äí £×+‡%Œ ´~Ð_W­óÚµk‡|ŽÁΛ¸]QG¬ÛÁ`@¯×3qâD~øan¾ùæTw¦‹Hw¦_7·iæÙ „xYQó¯Äp1 ‰tz £SÂáV‹@ ˆªªäææÐ×`ãÆÍ´´4SZV;ÛíN2Lf3°]»»Ò¾à¢3N§®°°×‹QÑÑäêå“Møú|”WWR¿­½Âj€+®¹ž¹s’òÉϱsÏòÞoæ[§LÒ,85¡Oœ¶¤öTj;¥ÌDQ“Pã!W'…¦b&úiš“ƒøo}þ0N»mX©Z‡°ÔÁ¨Q£b}Åt=B`4±Ûí8ìv;N§EQ¸îºë8öØ$ËÅ>Àýü-àBˆãþU7)§ÉqRh³!‚A,:#ÕeU|~^φ _°}Ûn&OžDaANì==®X¦I[[$P}Æé5 Ó¾`UY ?üÎ"ì¾ „U‚ŠžOìgw{ 9+¹9Ùlܲ•E‹.äó[¹ëgÿœ,Ó&TñÁs·qéü¯¡×) mª"L– ¶ø£LR5ß, »É»iyœI9¸9‰: ÿ_@—òƒa3Ûp º¼¼<²²²Øºuëa±ÚP÷IÜ7*Êœ{î¹)ª²ÓN;%K–pñÅS]]¸9øËÑ8­èPW35&ÔrÞÜoP•—È‚|¦;!@¯(lݸ™ÎövNs “&ÖÅn>ÐJiiñA‰^§#Çiäö§}Ñ‹æÅÂÙ§ryÐÚB~>ܳP]VISS+Ï>ÿgÜ}.<…¥KSV”CÃþ:;]ÚŽ5C”RZØ¢=¹SMÉ(˜dì±v‹wßiX,­9©'ÿ‘z&HúÁ ÆlGcÆŒ¡¾¾þˆ€y –KF£EQ˜:u*K–,aÑ¢Eœ~úé¬^½š'Ÿ|’Ûo¿{U«VqÏ=÷$N+*þ$„°M€;”L“دƈŠF׌åô½x\nœ6#>Ÿ§³’ìì**J©®;Ðãî#Ä.lsssRNeee!ï¿WßïóƒK.fÇþFÞÛ³řŖ®VVnÛJnV{ººhüðCž}ô·Züèx^{ó]ÖnØÆ/[Éò;Å}­X«á3™lÑ6T"fjj¾v\¤ƒj"»%ˆ, ¬¦š;íQ7'EÂ{вk”ütz]ÚÌþr!Sy ö¼?Ó2zþ‘#GòÚk¯¥ý^¾¤¦ž±óÚl6&OžÌĉ“Þ—Á`ˆÅÿ|>]t>Ÿ»ï¾;zšÓ€×µì•ÞV†Ë:º#kkiïñ²«±{v6(aBáF£›ÍŠÝj#''+v`gg7§#ö<'ùrùvjFæ¥6r‰#GrËÅ—PçÌÇàòÒ£y}÷^Y¿ží]]tU~ùpp›6naî7ç¡JÉÇvióåÂpD-ª‘F‰qE2l2¦JÆÃjÜä”ñ ®éÙMÆ$ÿèˆgª$›¦)æd” O›Å2lÓñPnòþFQQÝÝÝôõõ–¯v(ï5>°Z­±@{4ä`41 Øl÷òË/§¤$©äl-†—ûÏ ¸Â¨]éÜÌ–vÂBO®#EÕô‡c´nwD£ñ_|5ÀP(DVVVšÓ‡Xõö¦~_ü'žÄKoà;Óf’åîu“a”4Xùdk„!ë&Œãk'Ïã‡ß]LKG/_»àÿ%™t‘i5áXkádE2>í&ÒH#^Ò.fJªqÑE Än >™ÔZÇüAW'E´;k’9)c]{R3׎„™8œ?j‰ôöö~)l6”÷d00™LiC Š¢`±XÐétÌ™3'Ð÷þÑ*v(€Ë(+-‹˜…­mdÙÌdÛ¬ƒaÂá0@€pXM2¥”ñL®®®Ä’lqé~DèZšûï:ªª’[®¼šåKodRv6'Î,tw@Çm?ÿo½õ§z2ÇL=‘ü]næ.y(¡×¶ÖzXMízª 6ÍtLj7,ý¹?¯?vKðç¢þbb-–¸:©&¤Œõ¯.€†;ŠŠŠ’b§_åktþÄõƒƒÁÀÏþs>þøc-Z”¸}<‘äèYÿl€ ¦*¢ õô¹ÈsÚÈÎÉÂÕ×G0& b4ÉÎŽ3˜Çã%??.ƒéÉœ%%YìÞíê÷µ+++À´€¹§œH³·‡î¾^|áÍû:Üì>Ð ÀÅ—_ÅÅ.$¬J´õàñú4á$‹­EË3ô 6Ñ©¦dd¿xP<‘Éúc·„L•±$òC@’: M(‚ƒâ˜C‘óä°Ùl1†;Òjä‘<‡ÕjÅh4RZZÊ/~ñ nºé¦ÄÍÅÀ{Bˆkÿ™2 ”k ŠÝlÁb1ÑÝ݃A+k4PâŠÁ`0É_Kl˜:²³­tô¸|f“‰ýÛwòÍÇ3¢¸€-Û7¡Í]=ôx|lÞ²ƒÖÖ6{òIìyèt:Ü^??ZöR¼ªWÛ%$ fdÜœÔü½¨X"SR¼Rãn ÂnIÉÏœô¬Æ S)±šux}þƒæ« ;œÙÞÎív`¾lLº7ÌæXÿòï~÷»Œ3&Iø~-„xN›~ôNq¯ª*n_þöqF+6‡¡˜èéhǨÓa¶DÊ,è2>B¡p’9™Èv©£¼,Ÿ¢" {÷ö_ÏÄÈjŠÊ*èéìâŠó/ ßi'àéEJ•†®.:\nž~æ9r²””–qÆé§b³˜øû'»ÔÇDRMðÇ4°‰t`“ &h²š)dÂþ1“‘Ù-!Øž$–$0©Ý¬Ãç $)“ýUUîOÅÊ€&“éˆúp‡Àá£×ë±Z­(ŠÂÝwßÍâÅ‹c™MÚ8HvÊÑ8!„][În‚Å…Eœ0ûDtвsp8X¬6tŠ‚*ÃÁØ4Œè°XÌI±·4É©I£´4‡Á óÔŒ¬¡×í¢²°ˆKçŸKWwÕGwŸ‡FO/ ûöî †˜}âiŒ=Ÿ?È•?}.Iò—R°Zô¹ªUK[BH m|î S’X0œ„`{ì–Â8ûFü@§UŸ–á†Âtýi¸>aT¨ˆ2Ü‘Ìpçé åut:V«•Y³fqÏ=÷°zõjÎ8ãŒÄ]hSÍŽÀi”û_Àñ`¦¢×›jæœ@·ÍˆÕ¬G öðû1›MØv„Útz}üôv»-ÁOËô•åQYY6à>Å%Å”¨ ã@+‹¾ñMFãíé@‚NW ==lر“ÜÜ<!8íÌoQR”ËÎÆv›»ÔI5ɇ‹šBªqБ 6Í %QùL0¥»EÕLéb7™â'"%‹¯×ßo·ÁÂC×pý¿#á/I R°ÙlFœN'Ë—/ç˜cŽIÜåú£pBˆ*`9ðBˆï#q¢â˜)¢hÌxIúÜ}øì–ȲÚ"¹”áp«ÕÚ/‹õ§tʘ4qªT ü\ô­ùÈ€‹tŠŽ®@_Üùú‚ z=g>Ç?›½Í=¼úÞæ¸â¨‰(1Sãjd<¿2l‰ HGl¦@Ô”Tã~œLI ˆÝª¤¡­7>é@§|P<,1@×t¥ÌKº}RoúpxøE“†ÚùK¿É“ÉÞµ×&i&‹¿Ê0}?`› ,fêF”Ò"¬V%¿¬”¹óÎÇ”ÖR˜_ùaüõA|}}ø|>, V«•ÞÞ^>ýôST5̨ڑ̓ëoªFâhok'¿`hס¬¢ŒÆ¦FæŸþ þ¾áS¶4ìÁj¶J¾yù5ìhÜǸÒö·`ÉŠÈÛ¿åÌ™^Í¨Š¼X,,c‹²—I¦dØÁ¥5½ú1³‘¸))„h×â~"šÏ)Á±½ÉM}£‹­.ê›<ìØï¡/OF•Zèõ„jœÎOSUõ _/Ý1ÃeŸÏ÷•åËž¢(©‰Ðf"ÕžóUô2×÷Ãl·åF‹å½â™Ó§ÉPPéinÁQ˜ON–a‚§Þú ãjÇ3Ê™KWW;MMM8Ž;î8²³³ÑétÔoÝJýÖ-”••Q]]͘1£b*Ò`#¿ Ÿ={öPUU5è¾£GÕÒÞÙ†êósõ‚ó¹ãe˜t }!aâíwVQqþ·1šõäæ’—›‹Ž f“.ÆB"*hÈ„´*UÕ²HØ.H›–¹‰ÀJ0%µ¹u]½¶6v³µ¡—úÆ^¶6ºhhí°´?¨Òé ÐçéÅlu$åS¦úrý1[L÷UÆ÷z­Cñ@>lºÏ§ªjº2óˆ·ý‘”ò_9ÃEîtj(Tîik·ŽC^a1:¡Ã¤·"‚*KF°g#U㳑:»»éíîÆçó1gÎ)Œ3¤Êî];Ù¼e |ð»wïdÒ¤I”––éÍY,6oÞÂøñãg¹â"¶ÕïàØÉÓ˜>î>Þº ‹Ã? °fÛZö327Ÿ9À·ÎYÈïý-¯¼·•ï.œZʼ¶x<ŽŸMÆÁ–(ýÏ—TÃÐØêbkC7[övSßÐËÖÆÚºýÃþ’z½snïÎÍŒš0#­/—ªL¦²áP€6i©ªêÿ‰8ÐçÈGM·.úÞyç´’ð!Ä)å_%àÚ‰TÅ-vvïØÙd¦¬ªGv;öí¢)6³™Q#*1XôøÚƒøZ[øý̘6•²Ò¤TÑ+‚qãÆ2bD}}^¶lÙÂçŸoÂåòÄØn QTT„Ëíáíwß' ár¹ÈÍÏ¥¦²½½Å„Þl¢ ;›#jhؽ›öÎfæÏ=ƒŸ®¡ÈiÁPq˜ÔoÛAÕ¬‚¡fsD=}zåçœ5»–ò‡fVcµäé62i¶@|¿Ëùa¶7v±µ¡‹- ]lmèf[cß‘iÒ퉜gï®ÍÔÖMïd‰`J áøqÉ¿. Õ÷L Šn«ªªâ¥—^ÂçóñÁðÔSO%†;nB¬“R¾ò•NJéBlD8’BUB9ÅÅÆ¼²<~O…Nìj§ ¸ú-õtuwRQ^AGG'»÷ì& ÓÞÖŽÛ妸¸˜’²¦NJ8¬ÒÔÔÄþý(--ðÍmøì3÷Q]]ƒÅlaû®Ýôù|¬ß°¶>/;Ü:ƒ>²²³˜TVINXG÷žFfOŸÉô‰ãx÷³Ídç£tõ%$º»°ê ”––1ÿìù¼ôòKüñµÏ¹ùâã’€›÷–Æ_ëqùز§“Í{:ØÚÐÅÖ=]ì:ÐK8üåû5[7mà”y'j¨Yÿm(¢I”›;÷eìP•×tŠ¥^¯çôÓO}¦™3g²hÑ".ºè"vìˆÕ6ýoà•¯ŠáªTe5Ц¢eY0fLÝ^Ì:n·[+}—K(Šds¸Ý¬Y³–žÞLz3ãÆ£¹¥…Ý{öp ºŠ‚‚|F9¨·cÇNvîÜEÝØ:FÔVóÙöm|²k³FM¤tD9/þõY¶ïm¤¼ ˜–ûùdëL:y+ÍBP7q[³ ЉÄf²ÐÒÕM]a)}A?'Ï9•×__ÉËïÖ³èŒñ”ص¢[qVkj鉀kw[÷t°¥¡‹æÏÿ‰ÃoÐ ¶o«’9™¨f¦+ 4P ¯¿ðB”²³³¿ÔÏÙŸ y(¡tÇX,–¤Ïî÷û)..桇bîܹQ5v´b†”ríW8)å…§‹¥ªª~— Õ  â–*zTtŠ‚b4ár¹°;ìX­¦L™‚Õb¦·§ΈA¯0qÒ =;wìds § ƦM^ŽÙµÌš9GnŸoÞÄO=A§ß‡ÇëEÕ騾«ž™eÕ,>ó,Jª*iêéæ½Ï?á£Ûyèשՙ(v8ø<è­Yî^”Œèñx¼ôù7©š’ [w·³yO;›wEÀU¿·“^O€£eØÌ:¶ïl@J‰ªª¥Æ äË $ÌLBÄšz¤îpÙíËí`ÛŒF#RJFÍ 'œÀ»ï¾Ýt"°ö«b8€ÕDêÂËpXEQtèu:LŠ UH›b ìóÓÓÓƒÃn§½½¢‚‚Ø—[Qi|a³ÙQUIGW--­ÔÔT³fÍêêê(.>¸œüþ¦ý¸{zÑWèëqQ^RÂMWü.‡.W7í픟þ-N˜6êâŒf#åÅ…7n,o~ò)7ýæA&m6ª„Ý(F#Š[E Q³Ù‚ÅbÆi·òñçMLøÎã¨G™Ò]Y`âØ“k¬L©±òø›m|Tßœ8é&—¦‹Ù ÆÁ˜.àEø8Ò€ìñ‡½ž`0ȨQ£WýUš”ŸnÀôxðv÷ìó2¦v >—‡>kŽßOeE%ùtwuÓÙÙÁäÉ“)//¥³£·ÛEyy)^¯‡æ-ttv0qâxrs|úé§œy晽pGW¾ «•Ïë·ðm[ذi½Ý½ä9íè…ŸPùbÏnì63%¹äÚ”•ò×uSbµS˜•K—ÜA¶ÍA¯<ª§jD§W°˜Í„‚B¡^_ðÿ\BÀÈ+ÇÖØ™22²<»^+ ¹‘&ްðÊÚ.öíÙByõøÄRƒÊùCM (c¥³³3&dØŽÆðBÔ?M)F¬|Õ€3a¡(û›œºM6½Õl¦3'ŸÒ¼ŠõŠó ééîÂj13ù˜I477³}Û6ÊJJ(-)Âï÷ÅT½ââb‚A?{÷²fÍ:¾½ðöîm¤¾~cÆŒNœÇMPUy}õû<øü3ìij"$EÇÔQcPôz6íÝEžÙFnn.õ¢_(ŒŸ åŽ,Ž›t,O¾ö*v½™19y|ÜÜDÐh¢<¿ ‡Å†Él¤m÷NBáðÿ ÀE0¦ÜÆÔZSF:™2҆Ӭ硉´ON¼w&Œˆ”æXóÞJJ*ǤM(»äPMÍ(»ººp:ƒúpÃUÃe·þö…Bôôô°jÕª$kó«\6`‘ª*tSÁ¬ÏÓ#á0•¥e˜ˆäLV”•QXX@8¤ ?¼ì™ø|>üþH›a½^‰MÍ9ÿü…Üwß45ícoC##GŽdÛ¶Îl0b-/áÙwߥÛãÁi³£ª‘L~; {º;PC!BÞ>|z!½¡ªQ)¬©âÓ_à°[™”_I³§Ü}WäSš›‹Õf¡«³ƒ?¿ð<¡°ú•L¯Ôprì¨,¦Ö:9¦ÚÕD<™YMÉRQÕ„š–‘QUhÂnÖñ÷÷ÞáìÅKòãú3+ûc¸¡°câ9:;;)//?,¿m0° E09€å˜ÄZ;ÚX,„xZJùÎWÉp Ð>vâ¤Uz‡íÛ“ªj 3Gס†Â¥Ê±“§`6›Øµg7›7o¦¶¶–ÒâRTUÒÓÓC_Ÿ—Ë…Ó館¨ˆÂÂBÊÊÊØ±s7Û·ïdÊ”ÉÉ&ÛíæÀ¾ý”W”Ó×ç&³™°Æ,E‡ËëÅd1ãUî Šô9°)^ß´™0L™…·³V¯½N0‘C~NF£“¢qß#Öë;u˜ «³˜6:›)£²™XeÇbPÊ7„c…‰“•ebJXÊM¢Waæ­7#¥$Ž—²H x§ µîB¨ IDAT|'-øK‚Þ½{7uuuÃÛ`Á÷Ãì‘ ´ëõz X¸p!O<ñD"ÃýEqü‘lŸ5àÆkÛse[Çæ{n»s» „Æïݳ‡`8HEE%:Eaß¾}455 …hhh`úÔ©ø|>¡ðñÇkéî颺ª:6?iÜøqèõF¼^/§3ÙDijÚ‡ÇíÆÕÓÃñ“¦°µi/Mm­„B’lg6:ƒÖk¡SJä&õ«*„”س1‡ôìïóÐîíÆa±R–ƒÝjÅðòÁ»¯ÒÞuäÒæ¬&“ks8vTÓGg3~„ƒŽXá¡äZ))`S¤ÑöIÿ:3GÛY¾¢…úúzÆŽ‹Ñh<ˆÝRAw¨&\"øÂá0MMM|ûÛß>"Œr¨Lw(Š¿§×ë ‡ÃÜrË-ÔÔÔð³Ÿý,š;ê$RjoŠ”2ôe®ŒHéšM·ÞrË»½m‹Z[[" q8p¹z øýØì6ƌÎ;1¢‚ܼl\.f“…°¬ÿd»víaú´©„ÃaFÕÖ‚*†Ãè½’âœw‘å̦«³‡“¦O§¶º‚ûÿø$}± ‹¹o8H!ôFÑâ;zU€€€AE¯HB¾>ö·µáöûèr»˜T>‚l»ƒÁˆ§u7n:¬‹æ´˜R›Ë´1¹LÃØ Š aº+¹ 6í›Nª;Ÿy*–fä8J€ž]¾œ;x ɬìt©ù–Ca·T†Û³gáp˜ººº/]®)y¤^Ïh4¢ª*‹-¢´´”Ë/¿<æ>éYþ«/ pÚ<¸è¤¡ö>þè|£ÑZ[TTL]]åØívzº»p8œx½}ÔÕÕQZZB(Àï÷S¿u=½=dggó3N'¿ €ÆÆ&:4åÒd±âr¹1 I>77‡±cDZÿÀöïßGcs+9Å8gZñuyØïõâéë#ËDg1! zPD¤ðœÈP˜ !tF#>W:B¾ÃIaN. ~Ö}°‚O¶6ë"å:MLÇÔ1¹LKm™]ë˜óÿÛ;óø(«{ÿ¿Ï3[2Ù÷=laP© Å¥¢ BŪµ–kmë‚Ëm{U°Øºüô*mo­z­Ô]jÕ« ¢XEQQP"` „$„ì™ýüþ˜%O†™Ì’g0Â|_¯yÍ<û™óœÏù~ÏwõÄÍy}(]î ToVg·[fO°y9Zˆq¯’„à`xkE °nÅ ¤”Øl¶Ì}Í)„ð¥8WN+O’X)î¦þŸ&“ ‹ÅÂùçŸÏ¤I“Ô>—!^‘R6ÆŠÃÝì1ü9rór—ïÛûíìÌÌlãÙgŸCRRííítY, %õ |»wæ$3: // ©© “ÑÄ´éÓ¸ðü‰¾ât¹HHp§`h>ÚÌ A{üéÔÔd;£G`ïÞ*žYúo¾Ú¹ü”FJ‹«$—‚¥á(ŠI)% ]¢ ½NN§Çêp’˜œˆ"AA`Pôff‘™’Ê›¯.à7…씼ÌDÆËâÌáYœ1<›ÁùI Ñ]ìÃ…*̺sMz“uk l½ /v¥°½q;§ Á¦ÆFïÙC^Y™/x(;\$ÜÍŸÓmÙ²…äädN=õÔˆq¤Ê-A©+›·/t:.—‹3f¨— \ <ª9à<á9çU@Úyç]<ú´Ó‡¥$%cµZ©o¨Çîp 7hniA:]ôÚùìóÕd¤¥ãpØimiá̱c9íôQT×ì§²òRRÒÝ5…ŽÆÆzrr32d@ç±»òÖÖbNLà”Á¥4ÛZ¨:tµ{¶a·8¸vú¥dçd°~Ëfvïú†fKm-ngæ¬TZ,T6¤ÍeG˜t ,.à¹çžàåÅoì„âœ$ÆÈfÜðlÆ Ï¢(;Q•ØG]aÇå ,žìZþQÞÝÉ…<çzmiþ©|)+IÔÔa7òçW6‘#×èõüÞn祇bÎÂ…Øl6L&SÐÚߊ¢D¬¡ô„åååüð‡?D¯×‡Í‘¢ |FÌ dá¬].—/ ñÌ™3Ù¸q#¯¼â‹ÖùuL§¢f` Õf¹hÖ¬YJMu5](Šp×þ’.V«—(N'u‡Sw¨Ž$³¡ªkjÐô:TÇ¡C‡ikïB¯ÓaµZ)(È㜳'`±X¨Ù¿§]’™I^n6Y44T²oß· IÍ$ûô3iu;jkøhýÆÆÌiSÙwÁEìÞ½/¶nâõ÷ߣùèQ’’±(.†MMg†ŽvÖ¼ÿ.‹–ü£^Áæp›Æ”eòó ‡0vXy™ ݃Ôíð• V•òz⫸]·©J.äÀ@`ói$U…ƒÑ“ouÑdµòߣ…\!xãÓO¹ÝéÄjµöL¶$z Ð@ §ìUCCÛ·oç'?ù‰fæ-µ”Zh+½Z_«ÕÚãøïÿ{–.]ê”-„8MJ¹EkÀ5ë€ :nÉ»ï¼sÅС#(((D§(äææR[[KBB9¹¹¤¦¤as8@Jòóóiku+SÚ;:°Ù¬444‘‘IFF&ÍÍGÑéô¶n©dɛžÂ°¡CH0IJNF¯èij9JBB" ‰f†Ž)Ã$ëc‘’v)xyéR542°¨„öö.öìÝ I&L­z;ºÄF Fõê0«7|á‹„ÎJ5qÃŒa\sñnå…Ë[ÉÔxʱ±qžü‘=¸š*o¥o½v ·S‰šR46<°m9Ê’/×2U§c¼GAr©NÇóV+ÿ~ä.;×ÇåzK¿à/N…›JïÃ?DJyL6ãpEÃHÁìX(°…˽¿ív»ÏÃÄétŒ÷KJJbìØ±|öÙgÞ]ãmç ÏÙØNçøÔÔÔ¯¾©Ü}úE^¨ß¾}{÷³“ìì8t¨½AOJ²»v³N§CÑéÈÈHÇ`0á°;ÐéôzÉ)I 4˜ªªoùfßN&œ3“É@[KÙ9%èt .—‹ŽÚNššš0 Œ3’ÂüBò óÙÖPGAj»ŽaË{KHVô]n‘Í” '3¯g’‘Eðô›¯b²µQ÷ÕWÔ5¸#|$sëe#˜zfѱ óU·ñ––r±Ð\*Î'»ƒQ…T¯×ºA'TçD¶#–Dîzf#¹Bp³^ïËv>EQxxâ¹ç¸dÎÚÛÛŠ•Ðí¶,%C(·xñb233™0aBTÜ#N Øú¢<±X,=RQôÖ&?º±ÀBÍEJ)åGBˆ;€ûZ[[G¿¿ì]yÁ“¹úê«Ù¾}uuõèt‚ìì\*++9tð uB0`À0èudff¢ PßÐÀÎ}{)((¤0;›ôÔ4l+3fL§¸ Ÿýjh>ÚL[{›{]#z½E$2`` ‰‰É´wtR·ÿ0ƒÒsùÃÏgñÖªì?ÒDŠ)•®T #—?ì¬LV}¾Šç_~¤‡§Ç¯¦aúYÅ”&NUîU?yK¸•²CöTŒH|™š»×e`z€|LJ†0Áæ xj?-+ =*f Á•:ÿ×ÑÁÛþ33çÍ£«« ³Ù|ŒÈh³Ù‚:<S’xoÞ¼™¯¾úŠë¯¿þ#{_5±ö2 6/7 ç^‹…Í›7«w],„0J)mšÎC‡në:7mÚh¸`Ò$†F~~%%EØlv¤ta0¸o“œœìK‘—˜H‚AÏúظëœBaܨQn8ŠÃb¥eß·|½i#i©É$'§b0PúÈ´¾½Ø$ÆŸÉ&“ÉúË_þ*!%5C<¸Œ±cÇ’Ÿ“ËÁÚZ ³«‹C‡j}"M{{;éééìØ±½^ÍjÃf·¡3™0'&bÐéhjjÆdÔc6èz…²ñZ­X­6n`÷î]H8P„ ÑdÄf—ج. ²Ó7æ4Ê”’œ”L[k+½ý/½úIFØ´ç(§ Nç–KË8{T6^þåµ) w=“ éç¢*”x ÐŽý­»×kD¶÷6§óà+«£(üÍh$TBÁÿ¶ÛùÄéäoº‰KçÍ#55•äd· §±±1 F2§óþ>pà?þñÉÎÎfÍš5¤¤¤hÆÕ¢%#Qš„â|N§³GÊ¿pÚP]]ÍE]¤V¬œ)¥üRk×Ò Û¯¿áFó‘Æ£|Q¾š¶¶6J‹KÑéttvup¨®–ÄÄDJKK±Ûí˜ÍfÚÛÛÉÊÈÂd4¡7é±Y-èu’ÌŒtZšš±´%;7“Î.í+õGšq:´µ¶Ñu´•œÔ,²sò¨i8JÍ(f…ü¼ÆŽͨ²t M--|úþ"¶¹’×?Ø@K»¹W ã?/BaV"EY àál‚žjrß"Î2¡ª €‡ãáK$D0ñQ¨L¸T/Ê/é+¡Á¶jw½RÎHEá/F#¦0^àߺ\Üõì³drÖ5×ø‚EÕ3z0°ùsºúúzfÍš…Ífãå—_ö-ネ‘(TԜϿjS8ÜvÀ€Œ1‚;vxw´œ”r‡b10¯êÛos׬ýœ”äT’’ŒÔÚÓnÅœd¦££‹ÅFnn.)))n-cG))) >‚Šõعµ=‰F#«ƒôÜj4#«]²}gV«•ÌÌ,Ó éÔ5Ó`餫íƒ ²¸tÆTZL[ÛQvïÜBkÝ.v~]Îóo®¦¡ÙÂof¡$×Ì”qyÝÿA ¼Jé+å^kÉny¸™WlôíõçhЭîW/ÀUïc24‡ ;Ò¹÷ÅÕ U5 ·¬K2ð7£‘ßÙlÜ|ÿý<ÖÑÁ³g‡ 6õö–-[¸á†èèè`Ù²eŒ3¦Ï`ÓÊ,‰¡;Ø9V«µ×t½Ý/3³GÕ¢$"øð6à1õ¾I“Ï£lÈŠ HÏLÇa—mi§rw%EEEdfe¡( ™™Y¤¦¦ÒÜÖÎÁúFšÛ;iµX°Ûm B§#Ýl¦$;‡œô4½ ½£ƒ.‹•Üœ\rrÒÉÈJ!#9 sb"NK «?ûˆŠÕŸ±uÛšŽ¶q¤ÕÆÀ<3çÉáç”ëFÔÛj®%P‹Œ*nFÏ5š¯€Ê®†J™âýÚrm"ø¿µÉ,x»‚2Eáqƒô(¯–’yv;{\.fŸu¿Y°³§†C(°544°`Á^zé% À«¯¾Êé§ŸÞg׬¾l÷õ·ÿ¶ÕjÅétF nïï‰'R[ë«æ43Ú4z¡7x&ÔMFŽιçŒ'7/‰Žo*÷òúâ·xmÑ«Û,NeÛ7»v·v´NLH$55•šš*t¦Df½‰¼œwOr I& Bâ´´ÒÑvËÑý|»w'‹?ØHK»•AùfÌ :fžÏТd ³{Ò=~Šî^ì 0ÎTk²Þ€&TõŽáj„%B:¤Â£KaÉš­œ¥(Ì71÷ÁÆcþj·óÓIž^Ï/'OæÇ×_ÏÀñã{Ìáp°oß>¶mÛÆ|À§Ÿ~ŠËåböìÙ<ôÐC¾µx¬À¦Å±Þlvìn^åQ4kÆåË—«ë¸€)e½æ€3›Í×wuu=Ÿ–šBKkè“'Ç—_}MKKw ±òòUç³bâêóß“ºqÏž%z½~RZZjkB ×ëpùÍ…íÛv’––êTZZ*ÙÙY¹ tt´÷ÌL¼cÇŽ.!Ä8`Ðâ뀯yö#†f :]¿õTg9Üì áYxybÐô=ÃC˜Ç4à5Ä©«ò>Qƒ¬7Sëˆh.ïÊà±ÿÛ@³ÅÂÕz=· ±I €Ò®ºŠÜ{ïÕ h‘Š™Z¬ï"5¨¿{«'ßÛÿW…'Ÿ|’Ù³g{Ãv2qGÿ%Úw´%ö.ûiéé©gZ¬Vߨ.**dÔèž•lÆŽCaQ! &LdegR\Ü]çþûï·O?*»çV?þäÕÔéàª+øÍóihH—Óms¹ºÉtr¢.ÿ«þô8æ £ñ¦@ðÞÏåôÅ«ùR#¸¼yGœÝÏp¹<9"»cãÂÛ7MéÜð¿Ü÷ÂäÙl¼`2q—Á@‚§ócýI6‚¿ÿÝ—¾=Tl\¨s"Ýj­LÙ¨ ÑS ¸H¹òyçÇM7ݤÞõë¾L~AçR\iÖ.«±®î°gqLG{éii=”"ÙÙY$&˜ÐëõÇ$'5^v— lÎôûƒ)åÝàõÈŒT±íÓî^Ͻ‹iµª_€$®ž/ˆz€Iý‘jp˜º|°÷>NUXMdë´í™ÜùB×üy5ks¯ÑÈ¢„Æét(B—Oú¬Yþë_£1,.j0F¾PÀ u,‘3Úub0ºòÊ+՛Ä™š‹”&“iõþƒí”N­®®Énkkgõê ¨íUÒRIOKC§ÓùÂüu:og6'6Ùl6¦àŽ"PJù•ß_ãq%›ëY”š½ÛòŠj>\WÃ9§ðÛKŠ”éè)zDË€×£ãÕë^ïÝEOûœZ9Ȩ~ƺ™¼¸t/›j¶“&· üB¯'EúÕa‰‘·ÜBöƒï›EÈhÖs}I“§…˜¡<åææúﻀ¦k¸öåË—Wôúƒ@v eIqq!Í--$%'‘`òØ<º 67·”­@)ð"ðr°Š$ž‡? !×yÛ'¥¤|s-å›k)ÌNæÆC¸h”£Îë=L[)€OÆnw®è415m)|°ÞÁ»_ì ¡c;ÙB0×`à*½ž¤ã 4a2‘ùÀ¤ÞpCÌ`}š–iïb ¶`mó7xGÂ…ìÛ·O3À…0|' JM1¾‘˜h:ãp}cÀ‘3iòy®«÷i0ïàîêþó•íÕUÕÓ€5žEæ*)e[Ø b0wAã±ØÈ¤³Nå‚SS_Ô†YNˆ’äX\E㹕ÍélØî`åº}l¯k@ÎÕéø‰^Ï$î¸)DzÌžó =.Y}Z´EcímñÛߥ+\ ©×#Çét2mÚ4uý¸G¥”s47 ˜LÐÙÕ5X§S‚NÓ‡ëê9p ¶Çºîí·Þ]_S]3° ¥”ïF¡º¯®BÜ <ÌwÌÝœ9s(//gÅçŸóÁ*;ƒžÑ#†0fh§–è8%»ƒÌKßl*êrØ×œÂž.6m©§|w5m68EQø/ƒËôz Ž37SSâ´id=þ8ŠÇ+’5J_$@‹l6›-*°©I§Ó1}útüqŸÅ fG†Í¼ÂŒ¿˜™““í¨®®j–R:ÀÚ—$¥¬BøòÞzë­ÜtÓMÜ|óÍtuuñÅ_°råJV®\É?ß*ïVæde1°$—’¥é L$&)˜.Ì)÷ZÐ.V‡[ÙÓaÓÑØ¡ÐPo£±¾“C mì®m¤¦¹ÕÛ4!8KQ˜h4r¾NGÎw2]^ióç“8sfŸÀ¡…ˆ ð¢‰ôµNó~ÔyK"í ÿ¸¹¢¢¢«©˜îÜsÏmýä“Oèèè û† zàFkivi0®.ôþ˜2e RJEÁl63uêT¦Nê‹ãÚ²e Û¶mcóæÍìÞ½›ÍÛ¾ÁîpDÕ1BP¢(L68MQ8UQCCudúeóµ×’zÏ=ˆÔTÍ@) ´ʼnF¹¢þ¶Ûí!×i‘ôƒ?Ø„ìÝ»W½kDL—’’’ä~·"ìÂéiÍG[ª?D¨çGɪ6“?ßû]\\Lqq1Ó¦Mëqq}}=û7mâÀÂ…´TT`u¹°KI§‡' A2 é@‘¢':ú! éÇ?&é÷¿GÊ)šq­¾Š™Zœ`üÏw8=¢Ú£];†Ÿ'UžO€B”J)k4Všˆ­R{Œ5¢rÇŽÝ¥”-Àíwǘøw> ^~ùe&Mš0Ô¤·ʗ磦ëOàxë-¤ÃÁ÷‰Œ]„yî\ (E¢=/Và‹T©($ì&RQÒ»ÝÕÕÅäÉ“©«ó¥É¿QJù|Ä‚IoùÓŸ†GzÃíÛw “Rž‚Û}«Q£±¶Ñûã™gž Zz©·öÊò¢´”„‡&é‹/0ýö·èrrŽ‹ÇG´]J æë¯'ãóÏI}ùeôž8µH>Á€IýïH ß}Užôæaâ¿*—`0›Í\vÙeêÃÓ£Z ôÆX̆^µ1#G gì¸ÓʶH)µª åÓr–——sÏ=÷`·Ûê¦&õË……çÎ%qíZLO>‰~ʄɄÇ{ó»ýèt&L ùÑGÉØ¼óüùè† šPœ)R—®pÜ­B/”‡I8Ï Æù%pÖAº7°ù4%Å=t%eڮắ®×€³üü<ŸýÍêq§ÙÓŠw§¼øâ‹sóÍ7÷p' VÐÂ[]ÊI è§OG?}:ttà\±×G᪨@v§G‹=™ÍÎ?ý”)è/¼áQïGb¼ÖÒ£Dë\“¡ÀéΫ,9`ónWWW«w×j 8‰üoñÈû¹yÙŽúÃÏ;\×à]·ù›´.-ªà¶éùÈd2ù¸–BPÞ1œ”„næLt3gz¬Û•¸Ö®Enތܵ מ=Ћ‰$Ň2hÊg ;ã ”üeäHˆ2.N«ÂõZ˜´X¿…Zù\®€N_$¡ÖpË–-SzGs-åOz–ù7ÖvüñsݶXݹ²³0èõáî€íÛw‘••ÑyäÈQ³?84 ;pçu÷´ë§\~ùåÇth  2þûý‹íp!`øp”áûϷÙß~‹Vñ£^°éõzî½÷Þ œ,”F-×A¸J‚h´{á(´úhÕ†p´“á*IÂ}v eH¤þ±ÀÓO?í¶¥Ñ‚-”H9xGQ‚;´†ÊÊJÊ˻ݧÊÊÊØ³gC‡%--ͫ޼86ºIDATÑüîÜ%Ïj8Ÿ6¨¤¤„‚‚‚Ê‘@…+Ôò¿?—2™LÇÔ &Šú?#¤hdDÊíÂ@ÑÚÒ"='šÄ®¡ö9N‡æÑÑh$½ä—uºøÏ¾ æÞ÷–§ñUBˆeÀ¯>ùäÎ>ûlFŒAKK _ý5àN¶2lØ0oVî[€V!„NJù”€óY§ΞÁ”#j/”Þ¥Õjíõ……â¨ÄÌh*öU«ì}X_ÅÉp@át:ÃÊŠk°©·m6[¶ôÖæK)kû2˜Ãu üø ¹¹™¦¦&ºººÈÌ̤££ƒÆÆF.½ôRžzê)×àÁƒÁ]ù!Ĺî€÷Çž={hii *.†c@D<ŒÔˆìmC¬DÍp@£…A»71q²·>÷ï·P` ÇÈ®%Ø„¼ÿþû455©OÙ¡…º=œY…;÷È’%K–ÐÐÐàš5k¥¥¥Ì›7ßüæ7|öÙgX,å†nðr¤³û…#…è“Ký6ÜNÐØl6žzê©^g¿@†Ð`À Äp×mÑC­a"¿Öë¾pG»n 4!¹\.l6[ÄÀŠÔÎ)Ø.¹äƧ>íÎ>+#´Q\üàÎ;ïä¯ý+ ,`̘1¬]»–+®¸‚ÁƒóÀ8ßÿ}ÝúõëÁåè+`ŒR•&„˜üÑÛ÷Þ{/×]w]Ha°lM¡^@(mf(0œëµ7µÒXj™w2Ô>—ËÕÃR+‡èh¹Z í5kÖ0kÖ,õò&EJi9.€ó4hî„@\~ùåòšk®ô%ZY¾|9.—‹††y×]wy[_üCJùJ”.Ø„»@$ÇgêÔ©äæærÍ5×h¼pŽE«î×ÊD µ¿Ö¦5'RÛμkê¾z° !°X, ÞÃ¥xP_òE4³¡b ð-Àµ×^kŸ2eŠáСC †Δ)Søä“OøøãùŸÿùŸ>Û/„£=ëÈmiii”——“ªŠ ‹Ä.¸ÂH¸çÅt‘h,£U˜„ @‡ÃÑ£Îx´Üð»@GG#GŽTÊ‹¶®@(-e¯k:!Ä àÛììlCUU•9r¤¸ä’Kzø6VVV2cÆ Š‹‹y饗ذaÞNDñÌmBˆspÇÙî̸K–,ñÅÈù¿Œ`î^‘ çx µE8be(mh´`éMc‰Êß+ò©Û&„(1[gòæïK¥ÔHÖWð­Y³F}¨‘>FÀˆ¾ÈûBˆ”ÂÂÂV¯ËËc=vtܸq«W¯¦¤¤„Y³fñì³ÏRVVÆîÝ»¹õÖ[ÈÎÎnjllÌÄ«20áö(QOfµYwÙµÞ×_ñãÇÕB æH`ÅŠÞdš<®.ç«Ç¥âÒèv„vx”/ 2„3Ï<Ó—n!‡ñ_‡2”‡Ú÷œHE¾P†òH¹¥š;ÛÎ¥W9G‡jooqfÞ{ëõú Ò€úÙ±š“¤ÿ±úúzæÌ™£› ¿Z‰Çé{îZ×à.ÚÁ/~ñ zè!Wuuµ²wï^¦NÊÊ•+)))aäÈ‘TTT°mÛ6ÊË˱Ùl477³~ýz =z4ûöí£³³“ÒÒRét:EFF¾²AgœqK–,éÑYŠ¢õúå ©Ÿe°sÃq 4 Eé5~$ ör6ÿÁ ½­½Âñ¼"¦¿³ñw´hÀçý½iÓ&–/_NUU«V­ò¯¾@JùÛ¾bE“:IRÊ%Bˆ5@;ppFzzzÞ?ÿùOåÔSOeÀ€¼öÚkäååñ£ý—ËÅÁƒ9óÌ3™7o=öãÆ#++ ³Ù̺uë(--%))‰#GŽ!›7of̘1<òÈ#H)imm=Æ“DªH l8(Ô.˜n ë=7ËYoÀÄABqÚp¹œz2ÇpÞ[h´ :\ÍÛjµòôÓOzÔR`ŽXѬ0™”ò⸣³¯|â‰'~ $¥ÿä'?ÉúáÈÕW_ À“O>‰Óé$--M¾øâ‹Âf³!„`äÈ‘|øá‡TWW3~üxjjjØ·o×_=UUUüìg?ãÅ_¤¡¡={ö°cÇŸ)±.’Âí4Ž¡ EøÚÞ® D‡N׫âÅl‘ü?¯¾ ˆÞDQ-k i¾C‡ù_Ò \ßgå˜λ¦¶ !j€Ï€{<8dÁ‚­ ,X}øðáÉz½Þ˜““ÃW\”R¬]»–Ûo¿)%¯¾ú*û÷ïgîܹráÂ…Ân·síµ×öxƨQ£XµjsæÌaÑ¢E¤¥¥õ*2†ÀÁöû+КK ,S4J§ÓT!iþŽ`ç8Eé1I…ò0Ñ €±Z´Ë!¯½öš¿Fr¢”r‡–Ç#ÐQ±T\\ìÔét dNJJ"===aܸqÉÙÙÙI^ÿ̲²2öïßËå"//„„öìÙCQQ[·neýúõ¬ZµŠüü|êêê(--eΜ9Lž<ù˜ÚÔÑj£1dÇ Ï"Ñš´àX±Z,¹šwû‰'žàá‡{„|^$¥\¡ù{=N€;wºòݸS–›p× °ÆÜÜÜš³Ï>;·¼¼¸à´¨·+άY³Ø¶m[H€E;ÀB x­A‹g„{~4çDÚÎH’>…³/’ëTKÿ‰ú@pÁ‰ø¥wûàÁƒ\vÙe<ÿüóšÍÞZD]kÅåb!ÎyѦ`Àˆh‘ˆ”þû/^¬ö*©—R÷³ ø_õPåÔL|ІkhÍå´|†Vœ.’õY¤) û¾pYQQÁüùóÕ»ÞŒåXÇ+áh¬I‘€;0v4À°aÃX¶l™f*-TýZ› ´xw2FiÔÃùÏá*C´Ü·qãFÌf3õõõ¼÷Þ{¼ñÆꨈFàT)e]pá½Ü3< Sþò—¿ø"ÑcŠïÚæ+pöu\D&-@î¹W^y%ëÖ­ t¹ w€ô[±| 'yì}>ƒÊ}÷ÝÇâÅ‹{-;Û×u[¬5’Z‰§ZþçH×fáˆÑЉ‘œÛÚÚêŸÔÕK;€)±Û Çá<]ˆ»6/CII gŸ}6z½žäädî¼óN­žõ}œ”´ìëïLœŒ†#Î;—E‹©í拤”Ç¥:ç 8O–¥þÇÊÊÊøðÃ5|ýŒ±~Ÿ±Y¬ÖÞÞΟþô'^zé%õá…À-RJÛq›'"à<‰;Bw~5K–,aL€²½'j_ÄzâÐÚI¼¯@s:<úè£>|˜––V¯^í \öЗÀ¥”®ãÞŸ'ú B”“pŽwz†E‹ù{¬¬,ŒFãI@­4¶Ñ×|‡ƒO>ù„… ú'ÿQÓ>Ü‘û¾“>>Y•â<Ü1zäççsÇw0yòdÒÓÓÙ¿?ï¼óO?ý4………|ôÑGß™ØÖ_€¥—Ó P¡ö/\¸ûî»/Xj€§p§JhÿÎúþdšÅ…÷„:oРA¬X}(TèÓXg ë c!fnÚ´‰Y³fù‹ŽõÀ«Àb)eEƒzN"’RÞ+„hÁ­™2 kj8räÙÙÙQéû¢½Ô:iíñZË555ÑÑÑANN555¼ýöÛ,\¸ÎÎNï).ܵ0þ,¥ììW}~2* „eÀWùªC.<¶ÉÿøÿàÁüÞq¶þÄébÀû￟矾·fÝ$¥|¶_޽“]3'„ÈÇp¶wš¿Ç½Ç~÷»ßñ»ßý®Gb§ÓÉßÿþw6mÚÄu×]Lj#8|ø0………äääÄLü<žé´^«UUU‘››KRRR¯×Nž<™œœŠŠŠxøá‡}¹]Ô÷Ü´iW]u]]]nQüVˤ?qÀÅ|F ðU¼8p S¦L¡°°C‡ùòúSVV7Þx#'N$11‘ýû÷sÎ9ç|Ά 0`¹¹¹!ÛÔÚÚJss3¥¥Ý&E—ËÅúõë™0aBL9úš¦¦&6lØà«î}wìØÁìÙ³¹ãŽ;¸âŠ+‚>cíÚµ\uÕU¾ý'NäÁÄSo—ËÅ믿Îüùó9zô¨ÿmv/O— ‘8à¢ÝNÜuÅûLÓ§O箻ØíôÒÞÞοþõ/üq 3fÌ`ذaüâ¿À`0¼‡×=í /døðáØl6V¬XÁ7ß|óÏ>Ë…^¨9—;rä·Ür §Ÿ~:™™™ìß¿Ÿ÷Þ{»ÝΊ+|ÿÇŸ>üðC^zé%Î<óL6oÞÌgŸ}†Ó餠 €¥K—RPPp HÛÚÚ¸ì²Ë¨¬¬<¦Mƒ "%%…={öÐÑÑáÿÈWqWeZó½_qÀ3ð¶â±×… /=œp$½ø¤ !0`F£‘êêêcÊLš4‰¿ýíodddøöY­V{ì1žyæ™à/½žÛn»_þò—$'»3Ë777“––vL]soþLï~»ÝΪU«¸à‚ z$‡­®®ææ›ofçΟYRRÂsÏ=Ç)§œÒã?.[¶Œ¹sçEkï»ï>¦L™âkGEE÷Üs»wïŽôUýAJù—ïÝøŠ.jÀM—R¾/„0ãÉÀTà ¢p 7›Í\|ñÅS__ϪU«¨¯/Òß`0PRR‚”’êêjÊÊÊ8묳0›Ílݺ•;wrÝu×1aÂ’’’øúë¯Y¸p!••• 4ˆ &™™ÉîÝ»YµjU"HQÎ=÷\F…ÍfcíÚµêü!)33“ââbjkkilŒªÍRÊ¿}/ÇWp}\€ë³q{¶Lf…4Ë,¶¸Ë9?ÝqXîáäãaQÞ§HG•…-5ÙÑöý÷‚bQ;úûüñ jÆgZ÷šæ½ì½ûàÞƒq'Pú6ÌgDò9 Üèýžy1°9Šû-ýñ1à ðß—´ìûþúÑÇyZ¿ JàaàG@.[÷¤”Û‚L”û€?B öpÒ|ÏwîÔéžoÿ÷Ü‰Û £èðpÍdϾuÀò@u¬¥” !Vç{r‡›‡3±.ò”‰ÛÓ ìðj¿áN‘Rpýƒ\RÊ£”RöávÊ=‘X¬Bì pªë›5'ë‹Vâc=NqŠ.NqŠ.NqŠS| § yóçžZúdï+\ï8‡‹tð” !ގச’æ¥ó…gŸd}¥BÜ ¾~楓„wyœâ€;‰Áv®gà\E_ŒV !þá™ñOô¾2K€D0)y)·Íp·bDp''ØJíýŠnž9 ºìàÒ>Þ£øÂÜIFà6öjA7!¦À“Ó¸ÄÇP” <ÜI¶nóˆ‘ZÒ'p—Ý­ñýÎ÷€8¸“„®ŽÁ=ÏB¤žhåùO±àÞÓâ€;yèŠÜSÛ¬p¢Ñ zI¸ÔšÜÉ!NšÓbtûÁ'`—ý0ÞWÚÎÊ'ŽáD“ãIJt1pp"¬SÆÄè¾ÙB=îØ¾É¸ÓZœð 'a:ïÙÄN¿(‹Bs7/¯*.ôW }7£=žþŠ”V¿–RÖÄEÊþOCbxï‘Q®wô¸³N-ëOÞžèõX*‚¢µÇMv !.Œ®ÿSf€}Íý¤mïö#Ï•@~¥­ý¤mfÏunpý›ÄÀÏûQû&7ôãñ± õ•xÁ³Œ®ŸR“ßöÿØ÷]S1¢×è»×úY_ Ãmºˆ®ŸÒf¿í·K?kcYð7ô¤CP+&þ ôÇÌÆÓã€ë¿´\°)å.úg ÜÅý¤KU¿?Œ÷Up‘ÎÚ­À“žÍUžïü~ØÔáý¤©&¨•ý´¯J=áCqÀõSº×¶=ÛÅý°™ýd‚ª~ |-¥¬Jûé;Íü> ¼“2Å‚”²Sq Ý6³HŠ«;€-¸S½ý&†ÍÌíGýõºb½êÿGBu@¹‡3ÆR…ŸíyVpýtí~Ê€kƒÌ’ûpîX¬¾”RZ„gÄpJ?ë¯*ÏÏÀ6§ƒoõLFëµÀz¯7ˆâ“øXŽ'ò¦Û…s<¢e¶‡ó5µž5_¸Ȇvžõ­ý´¯¾Nõ$]*Äí‰b=Ù•{ã@¤ý‰Ü_qÀH.Ü*ðpýóq EN©5÷óþjްþýµÇ#ž{2ô×É®4Ñ‚Úp·hxÿoOðþúÚ9´ÆwâÓ.¿í•¸Ë;iEå'XUúm¿…vFôr„Ü ,‚Ö{^z·C­VâÑú¬Ë>Vý®’Rîа¿>þ¾tBp}£§ü8œVFᇥ”'X_½‰»–·¯Ð¨¿ÏÇwrÐóѯÖã"¦EµÓÀ_N´ŽòÔ›ûOÜ6O¯‰ ¯ýULñ3ñôkŠk)û6ˆBˆéÀuž]ÑúZp×\{LJ¹òî¯7…·¨8\´ýµwnËg=ÚÒï Åk|kÙ™B\†»>A(ªó¬ÑÖáöX©Tqô$è¯oõí¾*<ýõù÷1µBp±@fàB`"0·çŠÍ£ÙlBå}ï/1·§ÿ<Ü.·Š¿wÕF`£”ÒvÂüç8àâ§ãGq¥Iœâ\œâ\œâ§8àâ§8àâ§8ŧ8}·ôÿ#¿kÏ‹ä¦IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/preferences.png0000644000175000017500000000717012412506713021470 0ustar sergiosergio‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÛ ,*ëÔ#¹ øIDATxÚí›kl\ezÇÿï{Μ¹ßlgìqœ‹ïNfìÄI¼Ê*E,°!»$la)([UÝR¡ò¥ÛUEj‘àKúaY-Û6*Ý…]K–Ý("PØe!¶—È×6vŒ/sÆ3žûœ3s®o?Øã8VETÚ™4é•¥™óžÑó;Ïå}ž7uS7uSÿE¾Ìæp8lq»ÝV¸xñb €qChoo·z<žC'Nœ¸ûèÑ£ÔÔÔTo³ÙÈårÅ©©©É³gÏþëÜÜÜ¯ÇÆÆ’7”«œúèSƒƒƒõ7„ñCCCöááá‡?øàƒX"‘`+++,‘H°ÕÕU–ÉdX±Xd¦i^‚±±±±+}}}ƒÕl÷¿¹hiiI÷ûýËo¼ñÆå\.çÚ·oß”1Ã0 iEa°Z­k±E€¦¦&ßñãßøÖèèèåùùù™šÏCCCvUU;l6ÛmO=õÔÃíííÍŒ±uƒ×nÅó<l6ÛÆ¾x<ž»í¶Ûn»|ùòïjÒ6{‚(Šñººº¹ .\EщDn¡”n܇1MÓ`š&A¸\.[8>266öSQåšPÑÊÊJÁétÎ---E_}õÕÅ»îºëÇq–Í×èºÆØ„æææº‘‘‘ÂèèèÔ<H§ÓF<_ ƒ‰¡¡¡?öù|îÍ¡P@Åb!»víêxûí·ÿ-™L«ý’ûY¹\ÎÆb±¤iš¨,ÆØÆ*•JÐu½rŽh´ÙlªÉ¾,0Æ´™™™%Æ>‚a(×8Çqôرcwþ_|nÕ „¨ËËËqžç¯`šæÆ5š¦AUUÀÀÀ@_8¶ÝH|ƒƒƒ½ªª^ãúØ à÷û}ªªZ«ý ‘H¤›çùš¦½322’ûŸ6wuu |ôèÑ£‘r¹ J鯙 bøæ„†a0»ÝN«c,|îܹïOM͈gÏ>wvllì…‘‘‘ÙÏÛþä{ßû›$I"”ÒÏx@å\°n8E(ÆóDZª@ùÔ4MvèÐÐ΃üÃÒÒò_¿ðÂO/¼ôÒKÏʲüîÄÄ„ ½½½{ìï+•dûõOýúU)𦡧§»MQ”:éª<ƒA[__ÿ±–––zÆÜn·mpp°ûë_?vÒçó~UÓ4ÅétJ§N:‡÷jšBÈÆ¢”‚‚ññq<ýôÓØ¾};6Þknnv,,,¸ƒÁàkÑh”U€mÛ¶ñ““QçñãÇ¿`#›;K___ÛwÜñMQûN:õÕB¡@6M)¥‰DO>ù$¶mÛ†d2‰X,†]»vã8Øív ô<ÿüós³³³—«€ÃáÐ4M³D"‘Û·lÙbß\ßcXXXÈ mÏf³Ö͆Wþ꺎ӧOÃçóáÊ•+H&“X\\D__l6¬V+íèè8422òš(Š«U N@SSSÖÇïTb9›Íê33ŸÄœNgS%¶¯‡ðÌ3Ï`rr­­­èííÅôô4òù<úúú°{÷î.1 :5MëEññx¼\U½Àž={äD"Q,•J»;;;·sMÓpþüùÿÜ·oïîJÉ»~)Š‚W^yû÷ïG*•B&“ÕjÅž={pâÄ ‚°i^@ÐßßZXX¨knn>ÿ‡ÊŸ `~~^¯¯¯ÏÍÌÌ$EÙ …ÇÆÆ–#‘,Ë´bðæ¸§”BD"LMMÁãñ`ee^¯=ôÐFü[,W›FŽã000Ðîܹ+Ñhôãªê‰D¹¥¥eubbbnzzÚ‡].·¯òô>Ï(¥p¹\èîîÆøø8²Ù,yä¸ÝnPJáv»¯éÀf³ÑݡБC‹‹Ò+³³UU;¼¼¼,544Ä“Éd<‡Ãî ›ë(¥äzÃ+çÓ4a·Û‰D0<< ŸÏ·ÑÛíöÏ|†œÍâç·ÞÊšåøŸG"m{öüúâô´VU#±p8lÑu½ã¸½Á`ðpOOϾÖÖÖ–††Ïóœa,•Jå’ÉdÁï÷»ÛÚÚ@€kllÏó „Àív€"Ixfÿþ¿´dgŒ¡1D ]u¹î>ñòËŸVÝL°««K°ÙlM”Òm¦i=sæÌßår9¡P(à‰'ž8­ªê{¦i6º\®î¡¡¡C{÷îmokks†B!k*ž9x°d™›³ƒh¦ ˜&êÐ ­”üþû¾öòËoWÕD(™L¢(æb±Øb0ìxðÁo¥”ZLÓÄ… ^kmm}VÅ(¥tbvvvâý÷ßÿTE Àçñxl„˜†ŸÝy§ÚR(Ø‚[·ÂQWM È2JÅ"Ê¥’ËÏó÷}'Éýxròê‰577ïà8®mjj*1==-NNN~ôÖ[o}L&Õååå´Ãá˜w8s¢(N¾÷Þ{ó“““Œã¸†-[¶Xyÿýêažõõ,p”‚ç8V+äR º$A*97Ïí/n .\œŸ7ÿà!°YÛu]ßÁ#ë]_òã?ž¸þº#GŽðétº‰1¶G„ð1‹å»íóómžÇÁ}û@9²¦!_.#-ËH‹H&°È2,‚€í­­¨oiyó²$Ýûg¯¿ž®_T÷Üs·¸¸¸=(IÞ•J}K0M'Ïóìëƒ (iòŠ‚Ì:„•ÕUp…(¥h … …d»ý›_yñÅѪ/ªh4Ê–––²ö­[g’‹¾SQza‚˜L¢±¡vAGéZ8P j± ÏX¹Œ|&S×½õǧöî]831q¹æTÇ“–`P,ò<×®ª}Ì0x1™Ä¿«uG)(Ï£HtEœËASU‹Ïj=þ§‘=31ñNM€•••ݺ5žc§¢ôÀ0,ñdu^/œøMžÀqdJ!+ ´BJ¹L=‚pä¯ö︷³óÜÙhT­9ëâÎ;b)JÑ®ª=„1ËJ*ŸÛ —Ãq!à8Ç!«ª0‹EÈ’+Çí øýwßßÕuáÌÄD¦æ¬µWìmmbšRÖ®ª½0MK"†×é„ÛáGxŽ[ƒ@)LŽCFÓ€µ2 ÂXCÀëýö}=Î×€ k(´’æ8´«jLÓ²’JÁi·Ãër]õ„õž”bÕ0`Ê2¤\0MGÀë½ÿîî̳Ñè‡5b±Xœß¶-™åysçz8¬¦Ó°[­ðºÝa°‘9iÀV*AÊd`š&×àrÝñÝþþ–vvþêñ/0[¨ ëÕA¤ÍÍ«’ àEéc|2“ÕbÏãÙð‚J8ð‡,cz.]×áq8ö¦Ž#ß…^}nf¦\SÖcŒƒ)YØ-kžÀ§²YX8u^ïFUØ€@)$Æ.—bª¢À.!]ݽ§zzÞüçññdMX‡°lƒ9Íb¡­šÖCã2Ù,!¨÷ù®z¦¥‚•rD’ ”Ë8Îçw»ïýNOÏo~4>¾PSÖ!,’P(-bîдnðÙ|Œ±k ÐM爊²A–A{ÀïàTggâG#5DQ\¤--Y‰¶cݲ…LÓDƒßõؼž yJÁALUaH´bq-9z½wþE_Ÿÿãã¯?^K*Èöíy™çõœÀeóyhš†zŸŽ»êë(!XÑ4H² #Ÿ‡išÄãrHö÷‡ÿ¶£ã§£Q½f¬W‡®¥EÑ ¡mªÚ€ŠE¨š¿× ç¯zÃ& )Ã@R’@ ˜†·Ã±K³Û#?8yò'_¼ÈjÀº'\!mm%1Òªi]¤AUáõx`µXÀ­Oª7'I‰1$ÊeÍR,rš¦Áaµ¶/år…‰F[S°X,6ÇÚÚÊ&¥¤UӺТ$AQUx\.Ø6µÓ1Ãøý‹‚ðS.׿»xžh²ÜÀ‹ve­Lîœom}z~}ÂT+*fõ–„ ¤i] „J²Œ²¢ÀítÂnµBÖõÜc¥Ò}EÓ|—Z,Çm¶ÔV]ß[¯ªM%Y†R*ù9¯÷Ç¿ùôÓl­&Šâ¬ÑÚª™¦IBšÖ B¨\*¡T.Ãåp@flê\¹|úÒ¥K©åååRÿ•@©t»O–wqÊå2–€Ÿ\J¥–*úµÖqéÒ¥_ýÎçûÙ{NçÏ `PBÎå0;?NQÚv²ñÅÊùóçÕnAØmã8е<¡M Bªò>Ú”ñá‡þRß·PBÈAIº‡4S(@Õ4÷ÃÍÍoþÓÝw#[*IWdùûF>Zf  yžËY­r­ƒòÚ;%’¤“ R¹LÊóóƒåbqÖår1šÏÛÅxœPBÀsÁëý¡¦iùZ«ÿ]y4‡‡‡gG ÃJݦi{ÈúÏø Å¢e5¶ŠÅµ±=`N;Ͼ¿eË‹£££ñÀú´Ùþä÷²¬y>Û¬ë[­€›¾…–)M|àvÿ·õõg3™Ì'étzã›n9r„Ïf³‡9ŽëÜ].·7êz£É˜™æ¸ØŒÓù~IÓfý~ÿìÅ‹¯™Ü0* ‡Ã Çm-•JB³ÙliI’V'&&Ò¸©›º©›ºNÿn¨!ìŶÞÈIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/refresh.png0000644000175000017500000000145712412506713020627 0ustar sergiosergio‰PNG  IHDRóÿasBIT|dˆæIDAT8}“LÌqÇߟï}ï{])·Î%?ÆÙýÁ‰Ø¤®ÒÖX’6eØ2„#jX4±†ÚŒÅ†Í‰fló‡9Ù²f¡-«(rçêÜÑùÞ÷¾ŸÇÎÍ[Ï_Ÿíy?¯ç½gï#×f:ô¯@3°Àl±¦>íö º=¨#b$IJaŒMÁÄ9g'Ö%$&,£s|úrø=À~?L&S‚(êæÇM¿AÔJ‹†ýñD$Àûw°ÅnÿÑÝÝûês_ÿ¿ß׿t:?‡999ÑUÍP‚üL¶-k|a~¾v⸠``à*qBPUPwêdà±ã©[ È•’F󨥥¥PRRbÉÌÎ=°¦Vö¹}ðËÄ9§Hu¬î8·XSyAAA&ˆ!û‰ºè±Ë¶mÝ,=q>Þvµ¹IÇ®5ÈÂ(áAAþò®¡¡nÏ`ýd£&“IÇ ££ÃLDs­­†Æ¦KÙY¶1[6–ŠŒ1¤gçDQÄìÙæ`qÑj̳ZÅ=UûׯY€×ë]g±¦ÒɆÓ¯Ç9'9 “×ç¥êC‡e{yùe—Ë5'œ"J{êpdTUÜaž5C_¸r™6¨AH’Q#â«×‡{÷;^¿u]¹Ðx@¯×7…!ˆåãÀÀâ²íöM‚ ¤l/+Õ•Ù+åZx¬>Æ—2uj۾ݕ7’“7cïÿ„ IŠ¢Ø¶î,/êêêZâúâ–Ú_>ßÿqqåÿÜÜðÿñññÿïïïÿìììÿæææÿÞÞÞÿ¥¥¥õ)))uWWVíNRSÝD} ÿ:’Ëÿ3Êÿ#g³ÿ »ÿTT¾ÿÓÓÓÿõõõÿòòòÿîîîÿåååÿžžžçÿÿÿZYU…º¶µÿÇÄÂÿmmMÿ;OTÿ&Usÿ,t¢ÿ(h§ÿááãÿ×××ÿåååÿöööÿòòòÿìììÿ†††­ÿÿÿ11"q¬©¦ÿôôóÿ½¼®ÿbzƒÿN„§ÿ/]{ÿC_pÿðððÿßßßÿÜÜÜÿøøøÿôôôÿÃÃÃù>>>5ÿÿÿƒ‚|ýöôôÿ~kÿOn‚ÿt³Ûÿ[¥ÖÿdœÀÿîîîÿÜÜÜÿÝÝÝÿ×××ÿšššÃDDDEÿÿÿÿÿÿÿÿÿrpo½´²§ÿ•žÿLbqÿ 0:ÿEzœÿV”¼ÿåååÿ©©©ï444U+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=:9]WZWç‘ÀÞÿÃäÿc”µÿ2Ztÿ1DÿŽ‘ÿ’’’õ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUY[¥QjzûW|“ÿož¼ÿ¹ÀÅÿŠŠŠÿaaaçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXXXiÏÏÏÿâââÿçççÿ²²²ç&&&7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZZZi•••§jjj{ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ9Ã×{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;ÇÕwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSµ÷ÿíÿÿÿÿÿÿÿÿÿÿÿÿU·÷ÿåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/åÿÿÿÿ¹ÿÿÿÿÿÿÿÿÿÿÿÿ7åÿÿÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùÿûiÿ=ÿÿÿÿÿÿÿÿÿÿÿÿûÿùiÿ7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSÿ?ÿ;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWÿwEÿ5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý•ÿLLLÝ›FFF½___×___Õ:::¯===½'''ÿ###Ï...ËÿMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=AAAÁ¡¡¡ÿ¹¹¹ÿÖÖÖÿÛÛÛÿÜÜÜÿÛÛÛÿÛÛÛÿÝÝÝÿÝÝÝÿÞÞÞÿÝÝÝÿßßßÿÙÙÙÿÐÐÐÿÖÖÖÿ‰‰‰ý•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[‡‡‡ýÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÝÝÝÿÝÝÝÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿáááÿÖÖÖÿcccã?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿU555aigggíÝÝÝÿÞÞÞÿßßßÿàààÿàààÿàààÿáááÿàààÿàààÿàààÿßßßÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿàààÿáááÿ???µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ555U‡‡‡ã………ãyyyÉKKKéÞÞÞÿáááÿâââÿãããÿäääÿåååÿåååÿæææÿçççÿæææÿäääÿæææÿäääÿáááÿâââÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿßßßÿ———û_ÿÿÿÿÿÿÿÿÿ222U•••ûLLL [[[éÜÜÜÿäääÿæææÿèèèÿéééÿëëëÿëëëÿìììÿìììÿìììÿìììÿìììÿëëëÿêêêÿéééÿæææÿâââÿÞÞÞÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿ666¥ÿÿÿÿÿÿÿÿÿ"##É788÷)ÿÿÿbbbïæææÿèèèÿÒÒéÿ””èÿooèÿhhèÿ||éÿ®®ìÿêêðÿñññÿñññÿðððÿïïïÿîîîÿíííÿëëëÿéééÿåååÿàààÿÝÝÝÿÜÜÜÿÝÝÝÿdddé ÿÿÿÿÿÿÝ ÿ sÿÿÿ]_`ù‡œªÿ_ƒ¦ÿH£ÿ5¤ÿ¨ÿ Ïÿ Ûÿ Ûÿ##ÝÿéÿóóôÿôôôÿóóóÿòòòÿñññÿïïïÿíííÿëëëÿçççÿáááÿÜÜÜÿÜÜÜÿnnnñÿÿÿùøùã;?>ÿ ɇ (í-x©ÿ6‘Ìÿ5Ëÿ2Ëÿ/Êÿ,ŠÇÿ#h£ÿ!œÿ Íÿ Ïÿ ÏÿooÑÿææçÿöööÿõõõÿôôôÿòòòÿðððÿîîîÿìììÿéééÿÞÞÞÿÜÜÜÿFFFÇÿÿÿÿÿÿ655íƒÿ†ƒ€ï{xuÿ‰‡…ÿkvzÿBs“ÿA”Éÿ@—Ïÿ;”Íÿ5Ëÿ.Êÿ*‡Äÿ5ŽÿÂÿ((žÿ±±ºÿºººÿ···ÿ÷÷÷ÿöööÿõõõÿóóóÿñññÿîîîÿëëëÿáááÿÝÝÝÿZZZ×ÿÿÿÿÿÿ'sqpñ­©§ÿ¯«©ÿ¼¹¸ÿÊÇÆÿŠŠuÿefIÿ2EIÿ8sšÿE”ÈÿB—Ïÿ9“Íÿ0ŽÊÿ+ˆÅÿ#ÿ¹¹ÄÿëëëÿÝÝÝÿÃÃÃÿàààÿøøøÿöööÿõõõÿóóóÿðððÿîîîÿèèèÿÛÛÛÿ!!!—ÿÿÿÿÿÿUTKé´°®ÿÖÔÔÿËÉÉÿÉÈÀÿ[\6ÿhiAÿz{fÿÿÿ#/ÿGaÿ(h’ÿ,„½ÿ:sšÿóóóÿëëëÿÞÞÞÿßßßÿÁÁÁÿúúúÿøøøÿöööÿôôôÿòòòÿïïïÿìììÿ÷)ÿÿÿÿÿÿ+HH2û‰…|ÿÃÁÀÿìëëÿïïïÿ÷ÿ³³žÿnjSÿEhÿ?l‰ÿ)J_ÿ)6ÿ ÿÿXagÿôôôÿìììÿàààÿÞÞÞÿ¼¼¼ÿúúúÿùùùÿ÷÷÷ÿõõõÿòòòÿðððÿÎÎÎÿDDD¿ÿÿÿÿÿÿÿÿÿ —“ÿÒÐÏÿüüüÿúøøÿùøùÿ…ƒlÿeihÿo«Ñÿm°ÛÿcªØÿW¤ÕÿJ›Ïÿ7„µÿ{“¡ÿôôôÿëëëÿâââÿÝÝÝÿ¿¿¿ÿûûûÿùùùÿ÷÷÷ÿõõõÿóóóÿèèèÿ[[[åÿÿÿÿÿÿÿÿÿÿÿÿ7ihcÿÃÀÀÿøøøÿõññÿ¦§ÿ~ÿb•ÿ»àÿwµÞÿk¯Úÿ_¨×ÿR ÓÿD™Ðÿ„Ÿ±ÿóóóÿëëëÿâââÿÝÝÝÿÀÀÀÿúúúÿùùùÿ÷÷÷ÿåååÿ½½½ÿUUUÛ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+,ùµ±¯ÿûúúÿñïíÿutLÿQRSÿ ÿMl€ÿ{´Ùÿr³Üÿd«ØÿV£ÕÿH›Ñÿ€°ÿðððÿéééÿáááÿÏÏÏÿÉÉÉÿòòòÿÇÇÇÿ§§§ýGGGÁMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+.-µ°¬«ÿöõõÿ§¦™ÿ„‚qÿbx‡ÿ"+1ÿÿÿKtŽÿg«×ÿY¥ÕÿKœÑÿp”¬ÿëëëÿåååÿÞÞÞÿ‘‘‘ý888µ...›eIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAƒ|ÿËÈÆÿjfGÿtˆ”ÿ«Òìÿ¢Íéÿm‘©ÿ#2;ÿÿ!*ÿ@wšÿKÑÿRƒ¢ÿåååÿàààÿÛÛÛÿ<<<½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ UQNé…uÿ[_Wÿ•ÃàÿŸÌéÿšÉçÿÃäÿ‚¼áÿ\Ž®ÿ!7Eÿÿ(6ÿ(c‰ÿ¸¼¿ÿÝÝÝÿ¤¤¤ÿSSSßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ=<<¥3@Iû¬Èÿ‘ÄåÿŽÂäÿ‡¾âÿWœÿT‡¨ÿb©ØÿG‡±ÿ9Mÿÿ!ÿˆˆˆÿÓÓÓÿuuu÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿIFFG鉒˜ÿEYfÿm¢ÄÿC[kÿDt“ÿ[¦ÖÿJ•Åÿp‹œÿ¹º»ÿ___ÿÿaaaÿ£££ÿIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!!!•NNNóC]mÿo’©ÿgަÿx”¥ÿŸ©¯ÿÞÞÞÿÞÞÞÿäääÿÖÖÖÿXXXÿ›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ|||ýåååÿâââÿßßßÿÞÞÞÿâââÿèèèÿïïïÿïïïÿ---·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'''’’’ûàààÿäääÿéééÿîîîÿåååÿ“““ý"""¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'''“}}}ûÆÆÆÿÂÂÂÿŠŠŠýQQQ×-ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(0` €%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEc7 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}Áÿÿç%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)ÿÿý…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;M!ÑíÿÿÿcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS7eíÿÿÿÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsÅÿýûÿÿÿÿ]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'›ÿÿùÿÿÿÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍíÿÿÿýÿÿáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿYíÿÿÿÿÿÿýqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­ÿÿÿÿSåÿ[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7ÿÿÿÿ¯‰ÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿEõÿÿ» ÛÿYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿóEgÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5ýÿÛÿYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÿÿÿÿgÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#ýÿ9éÿÓ§U ·ÅÁ¹q éÿ¿§µÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ C"""ýOOOÿ888óeeeÿ¡¡¡ÿ€€€ÿÃÃÃÿµµµÿƒƒƒÿ«««ÿ×××ÿÙÙÙÿÖÖÖÿ×××ÿ’’’ÿ”””ÿØØØÿ’’’ÿrrrÿÔÔÔÿfffÿ___ÿMMMý™#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%&&&ÝPPPÿ¬¬¬ÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿßßßÿßßßÿàààÿáááÿâââÿÝÝÝÿ³³³ÿ&&&çyÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]DDDûµµµÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÝÝÝÿÝÝÝÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿßßßÿàààÿáááÿáááÿÚÚÚÿ   ÿÃ+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(((ëÚÚÚÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿßßßÿßßßÿßßßÿßßßÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿàààÿáááÿâââÿ»»»ÿ(((áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%w777333“™ ˯¯¯ÿÞÞÞÿÞÞÞÿßßßÿßßßÿàààÿàààÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿàààÿàààÿßßßÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿàààÿáááÿGGGýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~~~í³³³ý‘‘‘ÿýZZZý™™™ÿàààÿàààÿáááÿáááÿâââÿãããÿäääÿäääÿäääÿäääÿäääÿæææÿæææÿäääÿäääÿãããÿåååÿåååÿâââÿàààÿàààÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿàààÿ   ÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ EEE½±±±ý~~~ë$$$o3/¥~~~ÿáááÿâââÿãããÿäääÿåååÿæææÿçççÿèèèÿéééÿéééÿêêêÿêêêÿêêêÿêêêÿêêêÿéééÿêêêÿéééÿçççÿåååÿçççÿæææÿáááÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿ¥¥¥ÿyÿÿÿÿÿÿÿÿÿÿÿÿvvv666±±±±ÿZZZé)ÿÿÿÿÿÿHHHùßßßÿãããÿåååÿæææÿçççÿèèèÿêêêÿêêêÿëëëÿìììÿìììÿíííÿíííÿíííÿíííÿíííÿíííÿíííÿìììÿìììÿëëëÿêêêÿéééÿèèèÿçççÿáááÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿ———ÿqÿÿÿÿÿÿÿÿÿÿÿÿ1;<<ñikkÿ ÿÿÿÿÿÿÿÿÿ 000íÛÛÛÿæææÿçççÿéééÿêêêÿßßëÿ¶¶êÿœœêÿ””êÿŸŸëÿ½½íÿææïÿðððÿðððÿðððÿðððÿðððÿðððÿïïïÿîîîÿîîîÿíííÿìììÿëëëÿêêêÿèèèÿäääÿáááÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿ¿¿¿ÿÍÿÿÿÿÿÿÿÿÿ Wÿ ÿÝÿÿÿÿÿÿ 111éßßßÿèèèÿããæÿ££ÚÿHH×ÿßÿ àÿ àÿ àÿ àÿ àÿáÿSSåÿ²²íÿññòÿóóóÿòòòÿòòòÿñññÿñññÿðððÿðððÿïïïÿîîîÿìììÿëëëÿêêêÿèèèÿâââÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿNNNùÿÿÿÿÿÿÿÿÿEÿ ÿíYÿÿÿÿÿÿ-.//÷x†ÿKq‰ÿ0e‰ÿ"`‘ÿ"_ÿPˆÿ9‰ÿÿ ¿ÿ Ùÿ Ùÿ Ùÿ Ùÿ ÙÿLLàÿØØñÿõõõÿôôôÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿïïïÿíííÿìììÿêêêÿèèèÿåååÿßßßÿÜÜÜÿÜÜÜÿÜÜÜÿ(((ãÿÿÿÿÿÿÿÿÿÿÿÿ99:]ÿ043ÿEJJÿÍK‘.@ù*qžÿ3Êÿ3Ëÿ3Ëÿ1ŽËÿ/Êÿ-ŒÉÿ+‹Éÿ+‰Æÿ$g™ÿ&ƒÿ½ÿ Ñÿ Ñÿ Ñÿ Ñÿ ÔÿÇÇîÿöööÿöööÿõõõÿõõõÿôôôÿóóóÿòòòÿñññÿïïïÿîîîÿíííÿëëëÿéééÿãããÿÝÝÝÿÜÜÜÿÎÎÎÿ»ÿÿÿÿÿÿÿÿÿÿÿÿ Uÿÿ8;;ÿA@>*)(ï.02ÿ7BJÿ*Rlÿ4‚´ÿ=•Îÿ<”Íÿ;”Íÿ9’Ìÿ6‘Ìÿ2Ëÿ.Éÿ+‹Éÿ+‰ÇÿU‹ÿ œÿÊÿÊÿÉÿ ÿSSÿ˜˜˜ÿ···ÿöööÿöööÿöööÿõõõÿôôôÿòòòÿñññÿðððÿîîîÿíííÿëëëÿäääÿÞÞÞÿÝÝÝÿ«««ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿsomlý¯««ÿ­ª©ÿ“ŽŠÿ‰„ÿ™–ÿ˜“ÿއÿx†ÿ2\wÿAÂÿD™ÏÿB—Ïÿ?–Îÿ;”Íÿ6‘Ìÿ1ŽÊÿ,‹Éÿ+‹Èÿ%gšÿ ”ÿÂÿŽÿ²²¼ÿÝÝÝÿàààÿÈÈÈÿ   ÿøøøÿ÷÷÷ÿöööÿõõõÿôôôÿóóóÿñññÿðððÿîîîÿìììÿêêêÿàààÿÝÝÝÿÕÕÕÿÇÿÿÿÿÿÿÿÿÿÿÿÿ™•”ÿ«§¥ÿ œšÿ¢ž›ÿ°«ªÿº·¶ÿÃÀ¿ÿ£¢”ÿzy_ÿklUÿ$35ÿ<{¤ÿKœÑÿG›ÐÿC™Ïÿ>–Îÿ9“Ìÿ3Ëÿ-ŒÉÿ+‹Éÿ Zÿ™ÿ~~“ÿøøøÿäääÿÝÝÝÿáááÿ¦¦¦ÿßßßÿøøøÿøøøÿöööÿõõõÿôôôÿóóóÿñññÿïïïÿîîîÿìììÿäääÿßßßÿ”””ÿuÿÿÿÿÿÿÿÿÿ Ÿ¥¡ í¾º¹ÿÍÉÉÿÃÁÀÿÈÄÄÿòññÿÇÄÀÿfgHÿZ\4ÿZ[2ÿst\ÿ ÿ$ÿ AWÿ0fŠÿ>Šºÿ@•Íÿ:“Íÿ3Ëÿ-ŒÉÿ+ŠÇÿ0WÿââåÿõõõÿçççÿÝÝÝÿÞÞÞÿÖÖÖÿ³³³ÿúúúÿùùùÿøøøÿöööÿõõõÿôôôÿòòòÿñññÿïïïÿíííÿëëëÿåååÿKKKù'ÿÿÿÿÿÿÿÿÿÿÿÿƒjiYõ£ž›ÿËÇÇÿÞÝÝÿ´±±ÿóóóÿ¨§˜ÿ]]9ÿ_a8ÿstPÿutPÿ\]]ÿÿÿÿÿ  ÿ:Pÿ$\ÿ+{¯ÿ+ŠÈÿRwÿôôôÿóóóÿèèèÿßßßÿÝÝÝÿáááÿ¡¡¡ÿúúúÿúúúÿøøøÿ÷÷÷ÿöööÿõõõÿóóóÿñññÿðððÿîîîÿìììÿ‘‘‘ÿ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«efFÿ€}pÿ™—ÿÆÃÃÿÜÛÛÿÿÿÿÿâááÿ¶´©ÿªª‘ÿ¥¥‡ÿ_\5ÿdbaÿŽÂÿ£©­ÿðððÿìììÿçççÿâââÿÝÝÝÿÁÁÁÿÂÂÂÿèèèÿëëëÿ“““ÿàààÿSSSû½; ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ­ƒ„ÿÀ¼»ÿ÷÷÷ÿúùùÿ˜˜ŠÿvqRÿ|€‚ÿBR]ÿÿÿÿ ÿEg|ÿo­Õÿj®Úÿ`¨×ÿV£ÕÿMžÒÿA”Êÿ‘›¢ÿìììÿéééÿåååÿàààÿÜÜÜÿÿVVVý ã---á‹­Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?MLLý³¯¬ÿàßÞÿÙ×ÕÿZX3ÿˆˆ€ÿrŒœÿ¬Óìÿ“¹ÑÿH]jÿ ÿÿÿÿDo‹ÿ_¦ÔÿW¤ÕÿNžÒÿD™Ïÿuˆ”ÿèèèÿæææÿâââÿÞÞÞÿÛÛÛÿ(((å)ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)''¿”‹ÿÅÁÀÿ|ÿhbBÿasÿ¦Ïêÿ«Òìÿ¤Ïêÿ›Êèÿ†´ÓÿFbtÿ ÿÿÿ!+ÿ>u˜ÿMžÒÿD™ÏÿPs‰ÿäääÿâââÿßßßÿÜÜÜÿ’’’ÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ {qkgû†‚|ÿkeDÿSWSÿ¼Øÿ Ìéÿ¢ÍéÿžËèÿ—ÇæÿŽÃäÿ†¾âÿw±ÖÿAe}ÿÿÿÿ(6ÿ4w¢ÿ,k“ÿÅÈÉÿÞÞÞÿÜÜÜÿÉÉÉÿ|||ÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUXUTõ…‚~ÿge_ÿXuˆÿ“Ååÿ—Ççÿ˜Èçÿ–ÇæÿÄåÿ‹Áãÿ‚»áÿy¶Þÿp±Üÿc¦Òÿ:h…ÿ#ÿÿÿ0Cÿ=KUÿ¶¶¶ÿ¨¨¨ÿÿÝÝÝÿ///çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgm»:EMÿl‘©ÿŒ¿àÿÃäÿÂäÿ‰¿ãÿƒ¼àÿLpˆÿ+BQÿW޲ÿcªØÿZ¥ÖÿPžÐÿ1iÿ "ÿÿÿ333ÿ«««ÿßßßÿãããÿFFFû=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ™MMMý€„‡ÿl}ˆÿ;Sbÿm½ÿz¶ÜÿCPXÿÿP‡ªÿ^¨×ÿV£ÕÿMÑÿAqÿ…‘™ÿ¨¨¨ÿ:::ÿÿ ÿqqqÿÜÜÜÿ²²²ÿwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿY%%%é”””ÿrrrÿ/6;ÿk¦Ìÿj©Òÿ]›Ãÿa©×ÿW¡ÐÿFжÿHlƒÿ¼¾ÀÿâââÿÞÞÞÿÝÝÝÿ°°°ÿIIIÿÿÿ555÷5ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(((ã356ÿI_mÿxˆ“ÿ^wˆÿs†“ÿ‰ÿ§ª«ÿÚÛÛÿßßßÿÝÝÝÿàààÿäääÿéééÿîîîÿ¸¸¸ÿ ñ3ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ §ºººÿçççÿåååÿãããÿáááÿÞÞÞÿÝÝÝÿßßßÿãããÿçççÿìììÿðððÿõõõÿFFFùKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿq‰‰‰ÿßßßÿÞÞÞÿÝÝÝÿÞÞÞÿàààÿäääÿçççÿëëëÿïïïÿóóóÿÉÉÉÿ†††ÿ¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 111÷áááÿãããÿåååÿèèèÿëëëÿïïïÿòòòÿÖÖÖÿ†††ÿÍW ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒƒƒÿÁÁÁÿìììÿðððÿóóóÿÊÊÊÿ¾¾¾ÿAAA÷[ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ a¡<<<ñ444í===ë ­}1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(@€ Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ…áÉ•U ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘áÇ“Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Å­ÿÿÿÿƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ýßÿÿÿÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ )÷áÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Eóÿå»ÿÿÿÿÿÿÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ EùÿãÁûÿÿÿÿÿÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSµíÿÿÿÿÿÿÿÿÿ¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_§ûÿÿÿÿÿÿÿÿÿ­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿkùùÿÿÿÿýÿÿÿíAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwõÿÿÿÿÿýÿÿÿé7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿg§ÿÿ{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSÿÿÿÿÿÿa¯ÿÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ éÿÿÿÿí}ÿÿuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÿÿÿÿë‡ÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿIÑÿÿíIÿÿÿ}ÿÿuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿOÕÿÿåCÿÿÿ‡ÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ1ûÿÇÿÿÿÿÿÿ}ÿÿuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ9ÿÿ·ÿÿÿÿÿÿ‡ÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/ûÿÇÿÿÿÿÿË©[_“©³¯¥“3E±ÿÿÅy…«ÿÿiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/ûÿå§á'''ûFFFÿÿkkkÿœœœÿ+++ý!!!õAAAÿŽŽŽÿŸŸŸÿ£££ÿªªªÿ•••ÿ~~~ÿ###ûý———ÿzzzÿ$$$ÿ ýiiiÿƒƒƒÿÿÿ ÿµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiŸAAAÿ½½½ÿ’’’ÿšššÿÈÈÈÿÙÙÙÿÝÝÝÿ×××ÿÝÝÝÿÝÝÝÿÚÚÚÿÝÝÝÿÙÙÙÿÝÝÝÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿÞÞÞÿßßßÿØØØÿßßßÿàààÿàààÿÇÇÇÿßßßÿáááÿžžžÿ···ÿÝÝÝÿUUUÿõ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉaaaÿeeeÿ¨¨¨ÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿßßßÿßßßÿàààÿàààÿáááÿáááÿâââÿàààÿÔÔÔÿ>>>ÿÍoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]÷aaaÿÛÛÛÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿßßßÿßßßÿàààÿàààÿáááÿâââÿàààÿ¶¶¶ÿDDDÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ# ëÆÆÆÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿßßßÿßßßÿàààÿàààÿáááÿâââÿÂÂÂÿ\\\ÿÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·wwwÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿÞÞÞÿßßßÿßßßÿßßßÿßßßÿßßßÿàààÿàààÿàààÿàààÿàààÿßßßÿßßßÿßßßÿßßßÿßßßÿÞÞÞÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿßßßÿàààÿáááÿáááÿâââÿ[[[ÿYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿA—+++»:::»000É###ÍÑ111ÿÔÔÔÿÞÞÞÿÞÞÞÿßßßÿßßßÿàààÿàààÿàààÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿáááÿàààÿàààÿàààÿßßßÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿßßßÿßßßÿàààÿáááÿYYYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#***Ÿkkkï¹¹¹ý¸¸¸ÿ¸¸¸ÿ¶¶¶ÿ”””ÿ777ÿØØØÿàààÿàààÿàààÿàààÿáááÿáááÿâââÿãããÿäääÿäääÿãããÿãããÿãããÿãããÿåååÿæææÿåååÿãããÿãããÿâââÿâââÿäääÿåååÿãããÿáááÿàààÿàààÿßßßÿßßßÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿÞÞÞÿßßßÿàààÿÁÁÁÿñUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""GCCCé«««ý¸¸¸ÿ___ã « ““ §@@@ÿßßßÿáááÿáááÿáááÿâââÿãããÿäääÿåååÿæææÿæææÿçççÿçççÿèèèÿèèèÿèèèÿéééÿéééÿéééÿéééÿéééÿçççÿæææÿèèèÿèèèÿèèèÿãããÿâââÿäääÿåååÿãããÿßßßÿßßßÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿßßßÿÝÝÝÿ±±±ÿ"""ù+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG___ñ¹¹¹ÿý###™ÿÿÿÿÿÿ«FFFÿÉÉÉÿáááÿâââÿãããÿäääÿæææÿæææÿçççÿèèèÿéééÿéééÿêêêÿêêêÿëëëÿëëëÿëëëÿëëëÿëëëÿëëëÿëëëÿëëëÿëëëÿëëëÿëëëÿêêêÿéééÿéééÿéééÿèèèÿçççÿäääÿâââÿàààÿÞÞÞÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿàààÿ```ÿ]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#HHHé±±±ÿ‰‰‰ûŸÿÿÿÿÿÿÿÿÿ!+++ýÞÞÞÿâââÿãããÿåååÿæææÿçççÿèèèÿéééÿêêêÿêêêÿëëëÿëëëÿìììÿìììÿíííÿíííÿîîîÿîîîÿíííÿíííÿîîîÿîîîÿíííÿíííÿíííÿìììÿìììÿëëëÿëëëÿêêêÿéééÿéééÿèèèÿçççÿáááÿßßßÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿÜÜÜÿ,,,ÿ9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[]__ÿˆ‰‰ÿ788á-ÿÿÿÿÿÿÿÿÿÿÿÿõÌÌÌÿäääÿæææÿçççÿèèèÿéééÿêêêÿëëëÿëëëÿÜÜìÿÇÇìÿÀÀìÿÇÇíÿÙÙîÿîîïÿïïïÿïïïÿïïïÿðððÿðððÿðððÿðððÿïïïÿïïïÿïïïÿïïïÿîîîÿîîîÿíííÿìììÿìììÿëëëÿêêêÿéééÿèèèÿäääÿàààÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿiiiÿ«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÍÿÿÿuÿÿÿÿÿÿÿÿÿÿÿÿËŒŒŒÿæææÿçççÿéééÿêêêÿÛÛêÿ››èÿVVåÿ##äÿãÿ ãÿ ãÿ ãÿãÿäÿMMæÿêÿØØðÿññòÿòòòÿñññÿòòòÿñññÿñññÿñññÿðððÿðððÿïïïÿïïïÿîîîÿîîîÿíííÿìììÿëëëÿêêêÿéééÿèèèÿåååÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿ&&&ù%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇÿÿý±ÿÿÿÿÿÿÿÿÿ!!!õàààÿçççÿÐÐÐÿ°°±ÿqqšÿŽÿ•ÿ©ÿ Æÿ Ýÿ Þÿ Þÿ Þÿ Þÿ Þÿ Þÿ ÞÿßÿccåÿÖÖðÿôôôÿôôôÿóóóÿóóóÿóóóÿòòòÿòòòÿñññÿñññÿðððÿïïïÿïïïÿîîîÿíííÿìììÿëëëÿêêêÿèèèÿâââÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÍÍÍÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¯ÿ ÿÿß5ÿÿÿÿÿÿG ñdkpÿ;[oÿ(^‚ÿ+ožÿ.}°ÿ,€¶ÿ-}±ÿ)mŸÿ Wƒÿ9oÿxÿ ­ÿ Õÿ Øÿ Øÿ Øÿ Øÿ Øÿ ØÿÙÿ’’èÿòòõÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿðððÿðððÿïïïÿîîîÿìììÿëëëÿêêêÿéééÿçççÿãããÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿ¼¼¼ÿÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùøù Ç!##ÿ!$#ÿrzyÿû×K)µ 'ý#]ƒÿ1‰Âÿ2Ëÿ2Ëÿ2ŽÊÿ1ŽÊÿ0Êÿ.Éÿ,ŒÉÿ+‹Éÿ+‹Éÿ,ˆÃÿ$d‘ÿ)nÿ¢ÿ Òÿ Òÿ Òÿ Òÿ Òÿ Òÿ ÒÿggàÿïïõÿöööÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿïïïÿîîîÿíííÿìììÿêêêÿéééÿèèèÿßßßÿÝÝÝÿÜÜÜÿÜÜÜÿ›››ÿ­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùûÅÿÿRWWÿ û U»ïÿ=Wÿ(i”ÿ8‘Ëÿ9“Ìÿ9“Ìÿ9’Ìÿ8’Ìÿ7‘Ìÿ5Ëÿ3Ëÿ0ŽÊÿ.ŒÉÿ+‹Éÿ+‹Éÿ+‰Æÿ#aÿ oÿÄÿ Ìÿ Ìÿ Ìÿ Ìÿ Ìÿ Ãÿ^^­ÿÂÂÂÿìììÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿóóóÿòòòÿñññÿñññÿðððÿîîîÿíííÿìììÿëëëÿèèèÿßßßÿÞÞÞÿÝÝÝÿÛÛÛÿ???ÿoÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË!""ÿ<==ÿ[]]ÿWVVý†‚|½^ZUýec`ÿspoÿ{ÿ\gnÿ.Skÿ2u¡ÿ@–Íÿ@–Îÿ?–Îÿ>•Îÿ<”Íÿ:“Íÿ7‘Ìÿ4Ëÿ1ŽÊÿ-ŒÉÿ+‹Éÿ+‹Éÿ*~µÿ%cÿ¶ÿÇÿÇÿÆÿ Œÿ]]zÿ¤¤©ÿ¥¥¥ÿ‚‚‚ÿšššÿõõõÿ÷÷÷ÿöööÿöööÿõõõÿôôôÿóóóÿóóóÿòòòÿñññÿðððÿîîîÿíííÿìììÿéééÿáááÿÞÞÞÿÝÝÝÿÜÜÜÿ’’’ÿ«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ é—“’ÿþ¾ÿ²­¬ÿ®ª©ÿމ…ÿ“Œÿ–”’ÿ¨¤ ÿŠƒÿ„uÿžšÿq{‚ÿ$G^ÿ>ˆ¸ÿFšÐÿD™ÐÿB˜Ïÿ@—Îÿ=•Îÿ:“Íÿ7‘Ìÿ3Ëÿ/Êÿ+‹Éÿ+‹Éÿ+ƒ½ÿ&`ÿ¸ÿÁÿŽÿ‡‡˜ÿçççÿÝÝÝÿßßßÿâââÿ¼¼¼ÿ‘‘‘ÿøøøÿøøøÿ÷÷÷ÿöööÿõõõÿõõõÿôôôÿóóóÿòòòÿñññÿðððÿîîîÿíííÿìììÿèèèÿßßßÿÞÞÞÿÜÜÜÿ›››ÿ±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/é­©¨ÿ°¬«ÿ™—ÿ§£¡ÿ˜”ÿ°«ªÿ«©§ÿ¹µ´ÿÊÇÆÿ¿½µÿjjNÿpnTÿnp_ÿ$'ÿ6o•ÿKÑÿIœÑÿGšÐÿD™Ðÿ@—Ïÿ=•Îÿ9’Ìÿ4Ëÿ0ŽÊÿ+‹Éÿ+‹Éÿ*ºÿ cÿµÿGGhÿòòòÿ÷÷÷ÿÞÞÞÿÝÝÝÿßßßÿãããÿ‡‡‡ÿàààÿùùùÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿôôôÿóóóÿñññÿðððÿïïïÿîîîÿìììÿêêêÿàààÿÞÞÞÿÜÜÜÿ444ÿQÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmJIHÛ®ª©ÿ¶³°ÿ°«©ÿ°¬«ÿÎËÊÿ¼·¶ÿÛÙÙÿèççÿ¾»·ÿww_ÿŠŠsÿ\\9ÿ]]6ÿghLÿÿ6Gÿ/_ÿ@ƒ¯ÿI›ÏÿGšÐÿC˜Ïÿ>–Îÿ:“Íÿ5Ëÿ0ŽÊÿ+‹Éÿ+‹Éÿ%išÿJÿ¶¶¿ÿ÷÷÷ÿöööÿâââÿÜÜÜÿÝÝÝÿáááÿÂÂÂÿ¬¬¬ÿùùùÿùùùÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿôôôÿóóóÿñññÿðððÿïïïÿíííÿìììÿéééÿæææÿÍÍÍÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)!! ŧ£¡ùþ¾ÿÁ¾½ÿÓÐÐÿ¿¾¾ÿÁ½½ÿâßßÿåäãÿ²°¦ÿddDÿNQ"ÿQV!ÿfe?ÿppMÿy~‚ÿÿÿÿÿ4Eÿ)Yxÿ7|ªÿ<Åÿ:“Íÿ5Ëÿ0Êÿ+‹Éÿ+ŠÈÿ-BWÿñññÿõõõÿóóóÿãããÿÞÞÞÿÜÜÜÿßßßÿÝÝÝÿŽŽŽÿúúúÿúúúÿùùùÿøøøÿ÷÷÷ÿöööÿõõõÿôôôÿóóóÿòòòÿñññÿïïïÿîîîÿíííÿëëëÿãããÿaaaÿ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ëjiUÿš•‘ÿ³¯­ÿàÝÝÿçççÿ©¦¦ÿâááÿñðïÿœœ‰ÿ[[6ÿ`a:ÿopMÿy{XÿpoDÿŽ„ÿ ÿÿÿÿÿÿÿÿ.?ÿQqÿ(q ÿ,‡Âÿ*‡ÄÿgxƒÿôôôÿôôôÿòòòÿåååÿàààÿÜÜÜÿÞÞÞÿáááÿ‚‚‚ÿûûûÿúúúÿúúúÿùùùÿøøøÿ÷÷÷ÿöööÿõõõÿôôôÿóóóÿñññÿðððÿïïïÿíííÿëëëÿ®®®ÿÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5ùnoOÿnÿˆƒÿ¥¡ ÿËÉÉÿÏÍÍÿúúúÿüüüÿÙØ×ÿ²²¤ÿ˜—ÿ½½¦ÿ•—qÿ\Z*ÿ~ypÿ:AEÿ7]vÿ$>Nÿ%ÿ ÿÿÿÿÿÿÿ ÿ "2ÿ–¢ÿôôôÿóóóÿñññÿçççÿâââÿÞÞÞÿÝÝÝÿàààÿ}}}ÿúúúÿûûûÿúúúÿùùùÿøøøÿ÷÷÷ÿöööÿõõõÿôôôÿóóóÿòòòÿðððÿïïïÿíííÿëëëÿ­­­ÿ·ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿs$%ñmlTÿŠ}ÿŒˆ†ÿÐÎÍÿÌËËÿèççÿþþþÿÿÿÿÿêêéÿßÝÜÿáàÛÿÜÝÒÿŸÿa\=ÿ|ytÿ9Viÿj®Úÿf¬ÙÿbªØÿXžÊÿF‚¨ÿ4c‚ÿ!CXÿ%1ÿÿÿÿÿ¾ÂÄÿõõõÿòòòÿðððÿèèèÿãããÿßßßÿÜÜÜÿßßßÿÿúúúÿûûûÿúúúÿùùùÿùùùÿøøøÿ÷÷÷ÿöööÿôôôÿóóóÿòòòÿñññÿïïïÿèèèÿvvvÿõMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%Á87*ýš—Žÿ™˜ÿ¨¥¤ÿöööÿûûûÿÿÿÿÿÿÿÿÿüûûÿÿÿÿÿþþþÿÏÎËÿ`^=ÿsoaÿWXYÿ\ޝÿp²Üÿl¯Ûÿh­ÙÿcªØÿ^§×ÿX¤ÕÿR¡ÔÿLÑÿC’Åÿ7€°ÿ'b‰ÿ6LÿØÙÚÿõõõÿòòòÿïïïÿèèèÿäääÿàààÿÜÜÜÿßßßÿƒƒƒÿúúúÿûûûÿúúúÿúúúÿùùùÿøøøÿ÷÷÷ÿöööÿõõõÿóóóÿòòòÿñññÿïïïÿåååÿ&&&ùEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™‰†‚ÿ‹Šÿ­ª©ÿúúúÿøøøÿþþþÿüûûÿðêêÿÿÿÿÿççèÿ‚‚lÿc^<ÿ———ÿ2EQÿy¶ÝÿvµÝÿr³Üÿm°Ûÿh­ÙÿbªØÿ\¦ÖÿV£ÕÿP ÓÿJœÑÿC™Ïÿ=•Îÿ%\ÿÝßáÿöööÿòòòÿîîîÿéééÿäääÿàààÿÜÜÜÿÞÞÞÿ†††ÿûûûÿûûûÿúúúÿúúúÿùùùÿøøøÿ÷÷÷ÿõõõÿôôôÿóóóÿòòòÿðððÿÐÐÐÿ>>>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw{{xÿ†‚~ÿŸ›šÿúúúÿ÷÷÷ÿûûûÿðêêÿú÷øÿûûûÿœœ„ÿ^Y2ÿ§¥˜ÿejnÿf“¯ÿ€ºàÿ|¸ßÿw¶Þÿr³Üÿl¯Ûÿf¬Ùÿ`¨×ÿZ¥ÖÿS¡ÔÿMžÒÿFšÐÿ?–Îÿ(]~ÿáãåÿõõõÿñññÿíííÿéééÿåååÿàààÿÜÜÜÿÞÞÞÿ†††ÿûûûÿûûûÿúúúÿùùùÿøøøÿ÷÷÷ÿ÷÷÷ÿõõõÿôôôÿòòòÿòòòÿÄÄÄÿ,,,ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcA@ÿADDÿ ÿÕ{ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙ ÿÿáááÿäääÿåååÿæææÿçççÿçççÿèèèÿèèèÿéééÿéééÿéééÿêêêÿëëëÿëëëÿëëëÿìììÿëëìÿØØìÿ¿¿ìÿ¨¨ìÿ››ëÿ””ëÿ’’ëÿ››ëÿ¤¤ìÿ¶¶íÿÔÔîÿëëïÿðððÿðððÿðððÿðððÿðððÿðððÿðððÿñññÿñññÿñññÿñññÿðððÿðððÿðððÿðððÿðððÿðððÿðððÿðððÿðððÿðððÿïïïÿïïïÿïïïÿïïïÿîîîÿîîîÿîîîÿíííÿíííÿíííÿìììÿìììÿìììÿëëëÿëëëÿêêêÿêêêÿéééÿéééÿèèèÿèèèÿåååÿãããÿáááÿßßßÿÞÞÞÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿÈÈÈÿ___ÿÿ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿ,/.ÿ ÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyÿ ÿÂÂÂÿæææÿæææÿçççÿçççÿèèèÿéééÿéééÿéééÿêêêÿëëëÿëëëÿÜÜëÿ±±éÿ……èÿPPçÿ%%æÿåÿåÿåÿåÿåÿåÿåÿåÿåÿåÿåÿAAçÿrrêÿ¥¥ìÿÒÒïÿïïñÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿñññÿðððÿðððÿðððÿðððÿïïïÿïïïÿïïïÿïïïÿîîîÿîîîÿîîîÿîîîÿíííÿíííÿìììÿìììÿìììÿëëëÿëëëÿêêêÿêêêÿéééÿéééÿèèèÿèèèÿçççÿæææÿâââÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿÚÚÚÿ666ÿí;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%(({ÿÿÿ ÿ%)(ÿÿÿ×!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿpppÿÝÝÝÿçççÿçççÿèèèÿéééÿéééÿéééÿêêêÿëëëÿßßëÿ¹¹éÿrræÿ22ãÿâÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿ âÿâÿ))äÿQQæÿ¤¤íÿÚÚðÿððòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿñññÿñññÿñññÿñññÿðððÿðððÿðððÿðððÿïïïÿïïïÿïïïÿîîîÿîîîÿîîîÿíííÿíííÿìììÿìììÿëëëÿëëëÿêêêÿêêêÿéééÿéééÿèèèÿçççÿæææÿáááÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿÞÞÞÿÞÞÞÿ]]]ÿ÷Wÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ÿÿÿÿÿÿ÷ËMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç333ÿÒÒÒÿæææÿçççÿèèèÿéééÿéééÿêêêÿèèéÿââçÿ­­ãÿMMÝÿÚÿ Ûÿ Üÿ Þÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ ßÿ77ãÿ„„éÿÝÝñÿòòóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿñññÿñññÿñññÿðððÿðððÿðððÿïïïÿïïïÿïïïÿîîîÿîîîÿíííÿíííÿìììÿìììÿëëëÿëëëÿêêêÿéééÿéééÿèèèÿèèèÿäääÿßßßÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿØØØÿ555ÿë7ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ gÿÿÿÿÿÿý÷³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ïNNNÿßßßÿçççÿèèèÿåååÿÉÉÉÿ¥¥¥ÿ„„„ÿkknÿ00UÿGÿAÿ@ÿJÿTÿiÿ€ÿšÿ ¿ÿ Ùÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ Ýÿ!!ßÿŒŒéÿååóÿôôôÿôôôÿôôôÿôôôÿôôôÿôôôÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿóóóÿòòòÿòòòÿòòòÿñññÿñññÿðððÿðððÿðððÿïïïÿïïïÿïïïÿîîîÿîîîÿîîîÿíííÿìììÿìììÿìììÿëëëÿëëëÿêêêÿéééÿéééÿæææÿàààÿßßßÿÞÞÞÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÝÝÝÿ¢¢¢ÿ ÿ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿiýÿÿÿÿÿÿ Éí1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕ%%%ÿ®®®ÿ¡¡¡ÿdddÿ47:ÿ$2<ÿ:Lÿ)Leÿ,Zÿ0j‘ÿ/q›ÿ,u¥ÿ-u£ÿ/sŸÿ1l“ÿ-Zÿ"Ekÿ/Nÿ">ÿ :ÿZÿ–ÿ½ÿ ×ÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ Ùÿ ÙÿÚÿ??ßÿ°°ìÿòòõÿõõõÿõõõÿôôôÿôôôÿôôôÿôôôÿôôôÿôôôÿôôôÿóóóÿóóóÿóóóÿòòòÿòòòÿòòòÿòòòÿòòòÿñññÿñññÿñññÿðððÿðððÿïïïÿïïïÿïïïÿîîîÿíííÿíííÿìììÿìììÿëëëÿëëëÿêêêÿéééÿéééÿèèèÿçççÿåååÿãããÿÞÞÞÿÝÝÝÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿ°°°ÿ ÿµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ] õÿÿÿ*-,ÿ/22ÿ!!ÿ799Ýçƒÿÿÿÿÿÿÿÿÿÿÿÿ M³õÿ',ÿ#7Dÿ(\}ÿ,t¢ÿ1ƒ¸ÿ-‹Çÿ-ŒÉÿ,‹Éÿ,‹Éÿ,‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+ŠÇÿ/ƒºÿ(q¥ÿ%^„ÿ3Pÿ <ÿ^ÿ¤ÿ Íÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ Öÿ ÖÿÙÿ‰‰çÿééôÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿõõõÿôôôÿôôôÿôôôÿôôôÿóóóÿóóóÿóóóÿóóóÿòòòÿòòòÿòòòÿñññÿñññÿñññÿðððÿðððÿïïïÿïïïÿîîîÿîîîÿíííÿíííÿìììÿëëëÿëëëÿêêêÿêêêÿéééÿéééÿèèèÿçççÿãããÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿˆˆˆÿÿ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&&&m÷ ÿÿÿHMLÿrzyÿrzyÿÿõå¹Gÿÿÿÿÿÿÿÿÿ3³ùÿÿLjÿ-x¨ÿ0Éÿ0ŽÊÿ0ŽÊÿ0ŽÊÿ0ŽÊÿ0ŽÊÿ0Êÿ0Êÿ/Êÿ.Êÿ.ŒÊÿ-ŒÉÿ,‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ/´ÿ"W~ÿ%8ÿCÿ˜ÿ Ñÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ Ôÿ ÔÿddáÿääóÿöööÿöööÿöööÿöööÿöööÿöööÿõõõÿõõõÿõõõÿôôôÿôôôÿôôôÿôôôÿôôôÿóóóÿóóóÿòòòÿòòòÿòòòÿñññÿñññÿðððÿðððÿïïïÿïïïÿïïïÿîîîÿíííÿíííÿíííÿìììÿëëëÿêêêÿêêêÿéééÿéééÿèèèÿæææÿàààÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÛÛÛÿhhhÿÿuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø÷ø!EEF¹ÿ>BBÿ477ÿÿ7;:ÿqyxÿs{zÿ/32ÿûíËË‹óÿ #ÿ#Vwÿ3‹Åÿ3Êÿ3Ëÿ4Ëÿ4Ëÿ4Ëÿ4Ëÿ4Ëÿ4Ëÿ3Ëÿ3Ëÿ3Ëÿ2Ëÿ1ŽÊÿ0ŽÊÿ0Êÿ.Éÿ-ŒÉÿ,‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+ŠÈÿ*‰Çÿ.k˜ÿ.Eÿ?ÿ£ÿ Ïÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ Ñÿ ÑÿIIÛÿÚÚòÿöööÿöööÿöööÿöööÿöööÿöööÿõõõÿõõõÿõõõÿõõõÿõõõÿôôôÿôôôÿôôôÿóóóÿóóóÿóóóÿòòòÿòòòÿòòòÿñññÿñññÿðððÿðððÿïïïÿïïïÿîîîÿíííÿíííÿìììÿìììÿëëëÿëëëÿêêêÿéééÿèèèÿèèèÿàààÿÞÞÞÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿØØØÿSSSÿûIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûùû =>?—ÿ-0/ÿ!!ÿÿÿ\baÿekkÿ ""ÿ÷ =Ÿ×GÃûÿ.>ÿ'fÿ+v¦ÿ3‰Àÿ6‘Ìÿ7‘Ìÿ7‘Ìÿ7’Ìÿ7’Ìÿ7’Ìÿ7’Ìÿ7’Ìÿ7‘Ìÿ6‘Ìÿ6‘Ìÿ6‘Ëÿ5Ëÿ4Ëÿ2Ëÿ2Êÿ1ŽÊÿ/Êÿ.Éÿ-ŒÉÿ,‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ,„¾ÿ*a‰ÿ7ÿkÿ½ÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ Îÿ ÎÿGGØÿææôÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿöööÿöööÿöööÿõõõÿõõõÿõõõÿôôôÿôôôÿôôôÿóóóÿóóóÿóóóÿòòòÿòòòÿñññÿñññÿðððÿðððÿðððÿïïïÿîîîÿîîîÿíííÿìììÿìììÿëëëÿëëëÿêêêÿéééÿçççÿàààÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÛÛÛÿžžžÿ ÿÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿ6::ÿOUUÿÿ÷³ººiëåÿÿ ÿ ÿ ÿÿ/Bÿ$\ÿ9Éÿ:“Íÿ;”Íÿ;”Íÿ;”Íÿ;”Íÿ;”Íÿ;“Íÿ:“Íÿ9“Ìÿ8’Ìÿ8’Ìÿ7’Ìÿ6‘Ìÿ5‘Ìÿ4Ëÿ3Ëÿ1ŽÊÿ0ŽÊÿ.Êÿ-ŒÉÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+ŠÈÿ,}³ÿ9TÿCÿ«ÿËÿ Ëÿ Ëÿ Ëÿ Ëÿ Ëÿ Ëÿ Ëÿ Ëÿ Ëÿ ËÿÅÿ«ÿyÿEEnÿ~~ÿ›››ÿÓÓÓÿïïïÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿöööÿõõõÿõõõÿõõõÿõõõÿôôôÿôôôÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿñññÿðððÿðððÿïïïÿîîîÿîîîÿíííÿìììÿìììÿëëëÿëëëÿêêêÿåååÿßßßÿÞÞÞÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿØØØÿSSSÿÿ» ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ÿÿÿÿÿ!$$ÿLSRÿ%''ÿûª«©ofdcGEGõCBDÿ:;;ÿAACÿJKNÿRTVÿRX]ÿCPXÿ(:FÿÿIeÿ/sžÿ<‘Èÿ>•Îÿ>•Îÿ>•Îÿ>•Îÿ=•Îÿ=•Îÿ=•Îÿ<”Îÿ;”Íÿ:“Íÿ:“Íÿ8’Ìÿ7’Ìÿ6‘Ìÿ4Ìÿ3Ëÿ1ŽÊÿ0ŽÊÿ.Êÿ,ŒÉÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ,‰Åÿ%Yÿ *ÿšÿÈÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÈÿ§ÿEÿ$$;ÿcckÿqq~ÿttwÿ___ÿ777ÿKKKÿ°°°ÿöööÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿöööÿöööÿõõõÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿñññÿñññÿñññÿðððÿðððÿïïïÿïïïÿîîîÿíííÿíííÿìììÿëëëÿëëëÿæææÿàààÿßßßÿßßßÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÜÜÜÿÅÅÅÿ)))ÿóCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ121ÿUXWÿsuvÿ|}~ÿrqqÿŒ‹ÿ’‘ÿŸœÿ’Žˆù{ujýwpcÿxreÿ†€wÿ•Ž‹ÿ“Œ‰ÿ›“ÿª§¡ÿ®®¬ÿ¹½Áÿ‰”œÿIYdÿ$9Fÿ3Fÿ6|©ÿA“ÉÿC˜ÏÿB—ÏÿB—ÏÿA—Ïÿ@—Ïÿ@—Îÿ?–Îÿ>•Îÿ=•Îÿ<”Îÿ;”Íÿ9“Íÿ8’Ìÿ6‘Ìÿ5Ìÿ3Ëÿ1ŽÊÿ0Êÿ-ŒÉÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‰Çÿ-m›ÿ .ÿ„ÿÄÿÅÿÅÿÅÿÅÿÅÿÃÿÿ3ÿ‚‚•ÿÍÍÒÿÜÜÝÿßßßÿàààÿßßßÿØØØÿ­­­ÿQQQÿpppÿîîîÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿöööÿõõõÿõõõÿôôôÿôôôÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿñññÿðððÿðððÿïïïÿîîîÿîîîÿíííÿíííÿìììÿëëëÿêêêÿåååÿßßßÿßßßÿÞÞÞÿÝÝÝÿÝÝÝÿÝÝÝÿÜÜÜÿÛÛÛÿ€€€ÿÿuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑ++*÷¨¦¦ÿ‹†…ÿ¨¢£ÿ¤ŸŸÿ–’‘ÿ²®­ÿ°¬«ÿ«§¦ÿ—–ÿ”Žÿ›š™ÿŽŒÿ•“‘ÿ”ŒÿŸ›•ÿ•‹ÿ‡€|ÿ€xoÿ}vmÿ¤Ÿ˜ÿ¸¹¹ÿ©°µÿZgoÿ/:ÿ$Roÿ4tœÿC•ËÿE™ÐÿE™ÐÿD˜ÏÿC˜ÏÿB˜ÏÿB—Ïÿ@—Ïÿ?–Îÿ>•Îÿ<•Íÿ;”Íÿ:“Íÿ8’Ìÿ6‘Ìÿ4Ëÿ2Ëÿ1ŽÊÿ.Êÿ,‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ-m›ÿ7ÿ†ÿÂÿÂÿÂÿÂÿÂÿ‘ÿ5ÿ››«ÿÞÞÞÿÝÝÝÿÝÝÝÿÞÞÞÿßßßÿàààÿâââÿãããÿÑÑÑÿbbbÿuuuÿïïïÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿñññÿðððÿðððÿïïïÿîîîÿîîîÿíííÿìììÿìììÿëëëÿéééÿäääÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÝÝÝÿÜÜÜÿÛÛÛÿ„„„ÿÿ{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç÷spoý´¯®ÿæááÿÙÕÔÿÄÀ¿ÿº¶µÿ¶²±ÿ¨¤£ÿˆƒÿ~yqÿ‰€ÿ“ŠÿŽÿžžžÿ¸µ´ÿ³°­ÿ£ œÿŽ„ÿ~znÿrn`ÿyuhÿ™˜‘ÿÃÂÂÿ•›ÿ,•Îÿ=•Îÿ;”Íÿ9“Ìÿ7’Ìÿ5Ìÿ3Ëÿ1ŽÊÿ/Êÿ-ŒÉÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ,i–ÿ +ÿœÿÀÿÀÿÀÿ°ÿ6ÿ”ÿíííÿøøøÿèèèÿÜÜÜÿÜÜÜÿÞÞÞÿßßßÿàààÿâââÿãããÿÙÙÙÿ<<<ÿ¦¦¦ÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿöööÿõõõÿõõõÿõõõÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿñññÿðððÿðððÿïïïÿîîîÿíííÿíííÿìììÿìììÿëëëÿèèèÿßßßÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÜÜÜÿÔÔÔÿ;;;ÿûOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%áù³°®ÿËÇÆÿÑÎÍÿ·³²ÿ‹Šÿ£Ÿžÿ¨¤£ÿº¶¶ÿ‚}wÿ†vÿ¶°­ÿ¬§¦ÿ­¬«ÿ¬ª©ÿ¼¸·ÿ²®­ÿÅÁÀÿãáâÿÕÑÑÿ©¦ ÿrq_ÿkfOÿmiOÿœšŠÿ±¯­ÿNX_ÿ ÿ?UÿC‹ºÿKÒÿJÑÿIœÑÿH›ÑÿG›ÐÿFšÐÿD™ÐÿC˜ÐÿA˜Ïÿ@—Îÿ>–Îÿ<”Îÿ:“Íÿ8’Ìÿ7‘Ìÿ4Ëÿ2Êÿ0ŽÊÿ-ŒÊÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ)e“ÿ+ÿ¨ÿ½ÿ½ÿVÿQQdÿããåÿùùùÿùùùÿõõõÿÞÞÞÿÜÜÜÿÜÜÜÿÞÞÞÿßßßÿáááÿâââÿäääÿ±±±ÿ@@@ÿáááÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿñññÿðððÿïïïÿïïïÿîîîÿíííÿíííÿìììÿëëëÿèèèÿßßßÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÙÙÙÿ___ÿÿ½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ‹×OMM÷£ŸžÿŒ‹ÿ—“’ÿ ›™ÿžš—ÿ¥¡Ÿÿ›–•ÿŸš™ÿ¥ Ÿÿ´°®ÿÀ½¼ÿžš˜ÿ§£¡ÿ¬¨§ÿÁ¼¼ÿ¶±±ÿ¨¤¢ÿ××Õÿíëíÿ‘‘xÿ_a<ÿmnMÿb`EÿUV0ÿ__9ÿZY7ÿ48'ÿ ÿ!,ÿ9tšÿMÑÿMžÒÿLÒÿKœÑÿIœÑÿH›ÐÿFšÐÿE™ÐÿC˜ÏÿA—Ïÿ?–Îÿ=•Îÿ;”Íÿ9“Íÿ7‘Ìÿ5Ìÿ3Ëÿ0ŽÊÿ-ŒÉÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ+‰Åÿ KlÿLÿ±ÿ¨ÿ$ÿ¹¹ÁÿòòòÿøøøÿøøøÿöööÿäääÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿàààÿáááÿãããÿáááÿIIIÿ¯¯¯ÿùùùÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿñññÿñññÿðððÿðððÿïïïÿïïïÿîîîÿíííÿìììÿìììÿêêêÿâââÿàààÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿqqqÿÿsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ»Û˜–”󫨧ÿ®ª©ÿ¯«©ÿ°¬©ÿ«¦£ÿœ–”ÿš•”ÿ¦¡ ÿÃÀ¿ÿ±¬«ÿ³®­ÿµ°¯ÿÏÌÌÿÏÌÌÿØÖÖÿáÞÞÿÁ¾½ÿ¹µµÿª©£ÿlpOÿ˜™†ÿÏÎÄÿš—ƒÿHH!ÿEHÿsqSÿlmBÿ?C<ÿÿÿ)SnÿBƒ®ÿJ”ÅÿLšÍÿLÒÿKÒÿIœÑÿH›ÐÿFšÐÿD™ÐÿB—Ïÿ@—Îÿ>•Îÿ<”Íÿ9“Ìÿ7‘Ìÿ5Ëÿ3Ëÿ0ŽÊÿ-ŒÉÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ-†Áÿ%@ÿtÿeÿUUdÿääæÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿõõõÿåååÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿßßßÿàààÿâââÿäääÿ‹‹‹ÿsssÿúúúÿùùùÿùùùÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿñññÿñññÿðððÿïïïÿïïïÿîîîÿîîîÿíííÿìììÿëëëÿéééÿçççÿæææÿáááÿÞÞÞÿÙÙÙÿYYYÿý?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁ ÉjhfÓŸ›šÿ¿¼ºÿÁ¾»ÿ¹µ²ÿ¬¨¦ÿÍÊÈÿËÇÇÿ¶²²ÿææäÿÝÜÛÿËÇÆÿ¼·¸ÿÒÐÐÿûûûÿþþþÿêééÿãââÿ›˜ˆÿ\\=ÿhfMÿgfGÿZ[=ÿFH"ÿFGÿPT#ÿkhIÿbc6ÿŽ{ÿEKQÿÿÿÿ ÿ9Kÿ,Yvÿ–Îÿ<”Îÿ:“Íÿ8’Ìÿ5Ìÿ3Ëÿ0ŽÊÿ-ŒÊÿ+‹Éÿ+‹Éÿ+‹Éÿ+‹Éÿ)mžÿ)ÿ'ÿ¯¯¿ÿòòòÿöööÿöööÿöööÿôôôÿçççÿßßßÿÝÝÝÿÜÜÜÿÜÜÜÿÞÞÞÿßßßÿáááÿãããÿ¸¸¸ÿLLLÿùùùÿúúúÿúúúÿùùùÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿñññÿñññÿðððÿïïïÿîîîÿîîîÿíííÿíííÿìììÿëëëÿêêêÿéééÿèèèÿàààÿŸŸŸÿÿÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿeá]]\—“’÷º¶µÿÍÉÈÿÑÍÌÿÈÄÃÿéçæÿêççÿ³¯®ÿŒ‹‰ÿéééÿ×ÕÖÿºµµÿÐÌËÿõôôÿüüüÿ×ÕÔÿÑÎÍÿ¹¶­ÿnqTÿkiOÿKNÿILÿOS ÿQW ÿTY%ÿqlSÿcb:ÿfÿ¡¤§ÿ-:Cÿÿÿÿÿÿÿÿ0Aÿ(Urÿ6r˜ÿ?‰¸ÿE˜ÎÿD˜ÐÿA—Ïÿ?–Îÿ=•Îÿ:“Íÿ8’Ìÿ5Ìÿ3Ëÿ0ŽÊÿ-ŒÉÿ+‹Éÿ+‹Éÿ+‹Éÿ+ŠÇÿ;Zÿ)ÿééêÿôôôÿõõõÿõõõÿôôôÿóóóÿæææÿàààÿÞÞÞÿÝÝÝÿÜÜÜÿÝÝÝÿßßßÿàààÿâââÿÐÐÐÿGGGÿßßßÿúúúÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿðððÿðððÿïïïÿîîîÿîîîÿíííÿìììÿëëëÿêêêÿéééÿçççÿÖÖÖÿDDDÿûsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=íHHB£¬©¢ñžššÿ³®®ÿºµ¶ÿ˜”“ÿ½¹¹ÿèäåÿÇÅÅÿ  ŸÿæææÿÍËÊÿ¦¡¡ÿÐËÌÿóòòÿüüüÿÄÂÁÿ»¸³ÿ…†jÿPS(ÿecEÿTV*ÿOS!ÿQV ÿRX#ÿYZ(ÿzv]ÿolJÿopJÿ£¡Ÿÿqz€ÿÿÿÿÿÿÿÿÿÿ ÿ  ÿ-<ÿ$Okÿ2sœÿ9…¶ÿ<Äÿ=”Íÿ:“Íÿ7‘Ìÿ5Ìÿ2Êÿ/Êÿ,‹Éÿ+‹Éÿ+‹Éÿ+‹ÉÿMoÿhilÿïïïÿõõõÿõõõÿôôôÿôôôÿòòòÿçççÿáááÿßßßÿÝÝÝÿÜÜÜÿÜÜÜÿÞÞÞÿßßßÿâââÿàààÿRRRÿ¾¾¾ÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿòòòÿòòòÿñññÿñññÿðððÿïïïÿïïïÿîîîÿíííÿìììÿìììÿëëëÿèèèÿÓÓÓÿbbbÿÿÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ë$'áQS;ÿŽ‹„ÿ¢œ›ÿ³®®ÿ¶³²ÿÇÃÂÿßÛÛÿéèèÿåååÿöööÿ£  ÿ¦¢¢ÿÐÎÎÿñððÿþþþÿàßÝÿ·µ«ÿab;ÿNP'ÿZZ:ÿYZ1ÿOQ&ÿZ[1ÿZ\5ÿkoIÿpuMÿybÿde9ÿŽ‚ÿœœœÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ-=ÿIeÿ-n˜ÿ7‹Âÿ6Êÿ4Ëÿ1ŽÊÿ.Êÿ+‹Éÿ+‹Éÿ*ŠÈÿ8Nÿš¡¦ÿóóóÿõõõÿôôôÿôôôÿóóóÿòòòÿçççÿâââÿàààÿÞÞÞÿÝÝÝÿÜÜÜÿÝÝÝÿßßßÿáááÿãããÿfffÿ¡¡¡ÿûûûÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿóóóÿóóóÿòòòÿñññÿñññÿðððÿðððÿïïïÿîîîÿíííÿìììÿìììÿëëëÿãããÿyyyÿÿá=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿå!!ûNN/ÿzxgÿ„€uÿމ…ÿ«¦¤ÿ¥ žÿÒÏÎÿäããÿèèèÿÚØØÿ‰……ÿÑÐÏÿÍÍÍÿúúúÿÿÿÿÿçæäÿÀ¼ºÿšœƒÿac=ÿa`<ÿpnNÿiiDÿ~~_ÿЉmÿ……fÿƒ‚cÿrpDÿjn0ÿut[ÿœ™˜ÿ[]_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ "0ÿD_ÿ#aŠÿ*z­ÿ-ŠÇÿ+‹Éÿ'·ÿ!6CÿÌÒÖÿõõõÿõõõÿôôôÿóóóÿòòòÿñññÿèèèÿãããÿáááÿßßßÿÝÝÝÿÜÜÜÿÜÜÜÿÞÞÞÿàààÿâââÿwwwÿ‰‰‰ÿûûûÿûûûÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿôôôÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿðððÿïïïÿïïïÿîîîÿíííÿìììÿëëëÿäääÿxxxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ9ó66 ÿkoDÿppYÿywcÿ‡ƒyÿ€{wÿ¤Ÿÿ¬¨§ÿ±­­ÿçååÿÐÎÎÿ±­¬ÿÎÌÌÿîîîÿÿÿÿÿÿÿÿÿôôôÿÐÏÏÿååâÿ¾¾³ÿ£¢‘ÿ™˜†ÿ§§–ÿßÞÚÿââÚÿ­¯ÿ€Zÿfg5ÿgf-ÿkfSÿ’ŽŒÿdccÿ ÿ)4ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ )ÿ>YÿKlÿ0?HÿîîïÿõõõÿôôôÿôôôÿóóóÿòòòÿðððÿèèèÿäääÿâââÿàààÿÞÞÞÿÜÜÜÿÜÜÜÿÝÝÝÿàààÿâââÿ‡‡‡ÿsssÿúúúÿûûûÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿôôôÿôôôÿóóóÿóóóÿòòòÿñññÿñññÿðððÿïïïÿïïïÿîîîÿíííÿìììÿëëëÿæææÿ•••ÿÿ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“÷>?%ÿnrEÿnlXÿwvbÿŽ‹}ÿojgÿŽŠ‡ÿžœ›ÿ—““ÿÁ½½ÿ·³³ÿÏÌÌÿðïïÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÖÖÕÿ×ÖÕÿËËÁÿ›‹ÿ«§—ÿtvPÿ™™xÿ™›lÿ‘’dÿ˜šuÿHHÿYU+ÿokYÿ‹‡‡ÿZYYÿ2>ÿ_ ÊÿV“ºÿK¤ÿ=kˆÿ+K`ÿ)5ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHV_ÿòòòÿõõõÿôôôÿóóóÿòòòÿñññÿðððÿéééÿåååÿãããÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿßßßÿáááÿ–––ÿdddÿùùùÿûûûÿûûûÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿôôôÿôôôÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿïïïÿïïïÿîîîÿíííÿëëëÿéééÿÛÛÛÿ]]]ÿý[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÇé66 ÿaa@ÿrp\ÿ~{lÿš˜Œÿsplÿ‹ˆ†ÿÓÑÐÿÛÙÙÿØÕÖÿßÝÝÿÖÔÔÿçååÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿøø÷ÿÒÑÐÿÍÉÇÿ»·³ÿÇÅÁÿÄóÿË̱ÿÔÔÆÿÇÇÃÿŽxÿWT(ÿ`\?ÿ|zoÿ€|{ÿ!""ÿ>f€ÿi®Úÿh­Ùÿf«Ùÿd«ØÿbªØÿ_¨×ÿY ÍÿKˆ¯ÿ:lŒÿ,Rjÿ6Gÿ #ÿÿÿÿÿÿÿÿÿÿÿÿÿp|ƒÿôôôÿõõõÿôôôÿóóóÿòòòÿñññÿïïïÿéééÿåååÿãããÿâââÿàààÿÞÞÞÿÜÜÜÿÜÜÜÿßßßÿáááÿ¡¡¡ÿYYYÿøøøÿüüüÿûûûÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿõõõÿôôôÿóóóÿóóóÿòòòÿòòòÿñññÿðððÿðððÿïïïÿíííÿåååÿÁÁÁÿ¹¹¹ÿlllÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#Ï á?B ýHI+ÿ™•‡ÿ„„qÿ—‘Šÿ›—•ÿ–’‘ÿ¼¸·ÿØÕÔÿ¼»ºÿ¿¾¾ÿæææÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿèèèÿûûûÿûúúÿýüüÿýýýÿþþþÿÔÕÕÿÄÁ¾ÿb^Dÿd]<ÿieQÿŒ‡ÿfcaÿ 09ÿd Çÿm¯Ûÿk®Úÿi®Úÿg¬Ùÿe«ÙÿbªØÿ`¨×ÿ^¨×ÿ[¦ÖÿX¤ÔÿT ÐÿP›ÌÿJ’Áÿ:wžÿ+Yvÿ;Oÿ&4ÿ ÿÿÿÿÿÿ ÿž¢¥ÿõõõÿõõõÿôôôÿóóóÿòòòÿñññÿîîîÿêêêÿæææÿäääÿâââÿàààÿÞÞÞÿÜÜÜÿÜÜÜÿÞÞÞÿàààÿ¨¨¨ÿYYYÿøøøÿüüüÿûûûÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿðððÿïïïÿíííÿâââÿVVVÿÿýÛ=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ }ãûÿ‡ƒqÿ¥¢”ÿ›—“ÿ´°¯ÿІ…ÿ~zyÿ¼¹¸ÿåääÿøøøÿýýýÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöõöÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîííÿËÊÈÿ……pÿWU2ÿ\U9ÿ~{sÿŠŠÿ665ÿ/J[ÿn­Öÿp²Ûÿn°Ûÿl¯Ûÿj®Úÿh­Ùÿe«ÙÿbªØÿa©×ÿ^§×ÿ[¦ÖÿX¤ÕÿU¢ÕÿS¡ÔÿPŸÓÿMžÒÿI›ÏÿBÂÿ;„³ÿ3w£ÿ&\ÿ?Xÿ%4ÿÿÿ·¹ºÿöööÿõõõÿôôôÿóóóÿòòòÿðððÿîîîÿêêêÿçççÿåååÿãããÿáááÿÞÞÞÿÝÝÝÿÜÜÜÿÞÞÞÿàààÿªªªÿYYYÿøøøÿüüüÿüüüÿûûûÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿðððÿïïïÿîîîÿåååÿhhhÿÿ±%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿi½÷89%ÿ˜—†ÿŒÿ»·µÿzvvÿ}|ÿæåäÿÿÿÿÿþþþÿýýýÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÒÐÑÿ°¯§ÿJK&ÿYS+ÿ_[Kÿ‘Žÿ}}~ÿ"%ÿ\Ž®ÿt´Ýÿs³Ýÿq²Üÿo±Ûÿl¯Ûÿj®Úÿh­Ùÿe«ÙÿbªØÿ`¨×ÿ]§×ÿ[¥ÖÿX¤ÕÿU¢ÔÿR¡ÓÿOŸÒÿLÒÿIœÑÿFšÐÿB˜Ïÿ?–Îÿ<”Íÿ8’Ëÿ0ƒ¸ÿ):ÿ»¿Áÿ÷÷÷ÿöööÿõõõÿóóóÿñññÿðððÿîîîÿêêêÿçççÿåååÿãããÿáááÿßßßÿÝÝÝÿÜÜÜÿÞÞÞÿàààÿ¯¯¯ÿYYYÿùùùÿüüüÿüüüÿûûûÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿõõõÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿðððÿîîîÿéééÿØØØÿ///ÿë;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ iûxtuÿ‘Œ†ÿ±­«ÿpklÿ†ƒ‚ÿÝÛÚÿÿÿÿÿöõõÿüüüÿõõõÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿçáßÿ÷ööÿÿÿÿÿÿÿÿÿÿÿÿÿãâãÿÄÂÀÿdeGÿNKÿc]=ÿ“‘ÿÿ69=ÿ)>Kÿv²Øÿx¶ÞÿvµÝÿt´Ýÿr²Üÿp±Ûÿm°Ûÿk®Úÿh­Ùÿe«ÙÿcªØÿ`¨×ÿ]§×ÿZ¥ÖÿW¤ÕÿT¡ÔÿQ ÓÿNžÒÿJÑÿG›ÐÿD™ÐÿA—Ïÿ>•Îÿ:“Íÿ7’Ìÿ(6ÿ¿ÄÇÿøøøÿ÷÷÷ÿõõõÿóóóÿñññÿïïïÿíííÿêêêÿçççÿåååÿãããÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿàààÿ®®®ÿ\\\ÿùùùÿüüüÿüüüÿûûûÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿõõõÿõõõÿôôôÿóóóÿòòòÿòòòÿñññÿðððÿïïïÿÝÝÝÿ¤¤¤ÿEEEÿÿ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ózy{ÿŸž”ÿ žÿzusÿ{zÿÓÏÏÿÿÿÿÿõõõÿþþþÿñññÿþþþÿÿÿÿÿÿÿÿÿõññÿäÕÓÿþýýÿÿÿÿÿÿÿÿÿ÷÷øÿÅÄÆÿ˜—‰ÿJH ÿ^W.ÿ}xhÿÓÓÒÿhkkÿÿ^Цÿ|¸ßÿ{·ßÿy¶ÞÿvµÝÿu´Ýÿr³Üÿp²Üÿm°Ûÿk®Úÿh­Ùÿe«Ùÿb©Øÿ_¨×ÿ\¦ÖÿY¤ÕÿV£ÕÿS¡ÔÿPŸÒÿLÒÿIœÑÿFšÐÿB˜Ïÿ?–Îÿ<”Íÿ8’Ìÿ$/ÿÃÈÌÿøøøÿöööÿõõõÿóóóÿðððÿïïïÿíííÿêêêÿèèèÿåååÿäääÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿàààÿ§§§ÿhhhÿúúúÿüüüÿüüüÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿõõõÿôôôÿôôôÿóóóÿòòòÿòòòÿñññÿîîîÿæææÿÿÿý¯#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóedeÿ¨¥žÿŽ‹‡ÿ„€ÿ~zyÿÆÂÂÿÿÿÿÿ÷÷÷ÿùùùÿóóóÿýýýÿÿÿÿÿþþþÿåÙÙÿîæçÿÿÿÿÿÿÿÿÿÿÿÿÿåäãÿ´²¦ÿcaGÿaY5ÿpkMÿ©©£ÿÙÚÛÿ27:ÿ!0:ÿ€ºßÿ€ºàÿ~¹ßÿ|¸ßÿy·Þÿw¶Ýÿu´Ýÿr³Üÿp±Ûÿm¯Ûÿj®Úÿg¬Ùÿd«Ùÿa©×ÿ^§×ÿ[¥ÖÿW¤ÕÿT¢ÔÿQ ÓÿNžÒÿJÑÿG›ÐÿD™Ðÿ@—Îÿ=•Îÿ:“Íÿ%/ÿÈÍÑÿùùùÿ÷÷÷ÿôôôÿóóóÿðððÿîîîÿìììÿêêêÿèèèÿåååÿäääÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿàààÿœœœÿtttÿúúúÿüüüÿûûûÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿôôôÿôôôÿôôôÿóóóÿòòòÿòòòÿîîîÿÖÖÖÿ”””ÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿã:<=ÿ¦¦¢ÿ}ypÿ‡†„ÿ‚~}ÿ´±±ÿüüüÿ÷ööÿòðñÿþþþÿóóóÿÿÿÿÿýüüÿâÕÕÿüûûÿÿÿÿÿÿÿÿÿññïÿ‹ŠqÿLPÿSRÿ_W1ÿ’Žÿñññÿhmpÿ+2ÿt¥Äÿ„½âÿƒ¼áÿ»àÿ¹àÿ|¹ßÿz·Þÿw¶Ýÿu´Ýÿr²Üÿo±Ûÿl¯Ûÿi®Úÿf¬ÙÿcªØÿ_¨×ÿ\¦×ÿY¥ÕÿV£ÔÿS¡ÔÿOŸÒÿLÒÿI›ÑÿE™ÐÿB—Ïÿ>–Îÿ;”Íÿ&0ÿÉÎÒÿùùùÿöööÿôôôÿóóóÿðððÿîîîÿìììÿêêêÿèèèÿåååÿäääÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿàààÿˆˆˆÿÿûûûÿüüüÿûûûÿûûûÿûûûÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿöööÿõõõÿôôôÿòòòÿðððÿòòòÿòòòÿñññÿæææÿeeeÿÿõsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏÿŠ‘ÿhh]ÿˆ„‚ÿzutÿœ™˜ÿìêêÿýüüÿîììÿþþþÿñññÿüüüÿðéèÿçØÙÿþþþÿÿÿÿÿþþþÿ“”xÿHM ÿSWÿŒ‹yÿxrdÿÁÀ½ÿÒÖØÿÿOn‚ÿ‰¿ãÿ‡¿âÿ†¾âÿ„½áÿ‚¼áÿºßÿ}¹ßÿz·ßÿwµÝÿt´Ýÿq²Üÿn±Ûÿk¯Úÿh­Ùÿe«Ùÿb©Øÿ^§×ÿ[¥ÖÿW£ÕÿT¢ÔÿQ ÓÿMžÒÿJœÑÿFšÐÿC˜Ïÿ@—Îÿ<”Îÿ#,ÿÅÊÎÿøøøÿöööÿôôôÿòòòÿðððÿîîîÿìììÿêêêÿçççÿåååÿãããÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿàààÿqqqÿ———ÿûûûÿûûûÿûûûÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿõõõÿîîîÿÅÅÅÿ­­­ÿÐÐÐÿèèèÿæææÿ¦¦¦ÿÿñ]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµ ÿDJ>ÿ9:ÿle_ÿyurÿ¦£Ÿÿ´±±ÿ÷ööÿúùùÿôôôÿøøøÿù÷÷ÿåÔÑÿûøøÿÿÿÿÿþþýÿÎÎÃÿLOÿLN ÿssWÿ–•–ÿ¨¦¦ÿ³²³ÿTZ^ÿ ÿa†ÿˆ»Üÿ‹Àãÿ‰¿âÿ†¾âÿ„½áÿ‚»áÿºßÿ|¹ßÿy¶ÞÿvµÝÿs³Ýÿp²Üÿm¯Ûÿi®Úÿf¬ÙÿcªØÿ_¨×ÿ\¦ÖÿY¤ÕÿV¢ÕÿR¡ÓÿOŸÒÿKÒÿH›ÐÿD™Ðÿ@—Ïÿ=•Îÿ%0ÿÃÉÌÿöööÿõõõÿóóóÿòòòÿïïïÿíííÿìììÿéééÿçççÿåååÿãããÿáááÿßßßÿÝÝÝÿÜÜÜÿÞÞÞÿÞÞÞÿWWWÿ´´´ÿûûûÿûûûÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿøøøÿøøøÿøøøÿ÷÷÷ÿöööÿöööÿõõõÿóóóÿÞÞÞÿGGGÿÿ+++ÿaaaÿTTTÿÿ÷yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‰ÿ25 ÿ67ÿURIÿ{vsÿ½¼¹ÿ¾¼ºÿãßßÿþþþÿðððÿýýýÿóìíÿãÏÌÿÿÿÿÿÿÿÿÿóóðÿxxQÿIOÿZ\(ÿ‡ÿŠŠÿ¬ª«ÿw{ÿ ÿÿ ÿ7LYÿx¥ÂÿŠ¿áÿ‰¿ãÿ†¾âÿ„¼áÿ»áÿ~¹àÿ{¸ßÿx¶Þÿu´Ýÿr²Üÿn°Ûÿk®Úÿh­Ùÿd«Ùÿa©×ÿ]§ÖÿZ¥ÖÿV£ÕÿS¡ÔÿPŸÓÿMÒÿH›ÐÿE™ÐÿB—Ïÿ>•Îÿ)5ÿÁÅÉÿõõõÿôôôÿòòòÿñññÿïïïÿíííÿëëëÿéééÿçççÿåååÿãããÿáááÿÞÞÞÿÝÝÝÿÜÜÜÿÞÞÞÿÓÓÓÿIIIÿÔÔÔÿûûûÿûûûÿúúúÿúúúÿúúúÿùùùÿùùùÿùùùÿøøøÿ÷÷÷ÿ÷÷÷ÿöööÿõõõÿîîîÿíííÿæææÿ¢¢¢ÿÿõóù÷å} ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]ù).ÿ7:ÿKI;ÿtolÿ£ ÿØÔÓÿêçæÿþþþÿÿÿÿÿøøøÿøøøÿþþþÿÿÿÿÿÿÿÿÿÒÑÄÿTVÿNPÿ~}kÿ‘ŽŒÿÒÒÓÿŒŠ‹ÿ.48ÿÿÿÿÿ ÿAZiÿy§Åÿ‰¿ãÿ†¾âÿƒ¼áÿ€»àÿ}¹ßÿz·ÞÿvµÝÿs³Ýÿp²Ûÿm°Ûÿi®Úÿf¬ÙÿbªØÿ_¨×ÿ[¦ÖÿX¤ÕÿT¢ÔÿQ ÓÿMžÒÿJœÑÿFšÐÿC˜Ïÿ?–Îÿ,;ÿ½ÁÃÿóóóÿóóóÿñññÿðððÿîîîÿìììÿêêêÿèèèÿæææÿäääÿâââÿàààÿÞÞÞÿÝÝÝÿÜÜÜÿÞÞÞÿ»»»ÿDDDÿöööÿûûûÿúúúÿúúúÿúúúÿùùùÿøøøÿóóóÿôôôÿ÷÷÷ÿ÷÷÷ÿ÷÷÷ÿóóóÿÛÛÛÿƒƒƒÿzzzÿWWWÿ ÿõM!E=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/éÿ9=ÿHH1ÿzvÿ¤ŸœÿÍÉÈÿãàßÿùøøÿÿÿÿÿþþþÿüüüÿúúúÿÿÿÿÿûûûÿ×ÒÇÿkk*ÿWVÿvrSÿ•“ŒÿÃÃÂÿMNNÿÿÿÿÿÿÿÿÿFasÿyªÊÿ„¼áÿ‚»áÿºßÿ|¸ßÿx¶Þÿu´Ýÿq²Üÿn°Ûÿk®Úÿg¬ÙÿcªØÿ`¨×ÿ\§×ÿY¤ÕÿU¢ÔÿR ÔÿNžÓÿJœÑÿGšÐÿC˜Ðÿ@–Îÿ->ÿ¸»¼ÿòòòÿñññÿðððÿïïïÿíííÿëëëÿêêêÿèèèÿæææÿäääÿâââÿàààÿÞÞÞÿÜÜÜÿÜÜÜÿßßßÿœœœÿ^^^ÿûûûÿöööÿõõõÿøøøÿùùùÿøøøÿèèèÿªªªÿ­­­ÿëëëÿôôôÿòòòÿÛÛÛÿJJJÿÿÿûÓYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅ ÿJN.ÿFF(ÿ‡‚~ÿ—‘ÿÉÅÄÿßÛÛÿóòòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèçèÿÄÁ¸ÿ‚~Qÿca-ÿ{uUÿĺÿ©§¨ÿÿÿÿÿÿÿÿÿÿÿ$+ÿQrˆÿy­Ïÿ€ºàÿ}¹ßÿy·ÞÿvµÝÿr³Üÿo±Üÿk¯Ûÿh­Ùÿd«Ùÿ`©×ÿ]§ÖÿY¥ÕÿV£ÕÿS¡ÔÿOŸÒÿKÒÿH›ÑÿD™ÐÿA—Îÿ4Hÿ´µ¶ÿñññÿðððÿïïïÿíííÿìììÿêêêÿéééÿçççÿåååÿãããÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿßßßÿjjjÿ•••ÿ÷÷÷ÿÎÎÎÿ´´´ÿìììÿöööÿîîîÿ²²²ÿÿÿŒŒŒÿËËËÿÅÅÅÿaaaÿÿç{U#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyÿHSNÿkmPÿŽŠ†ÿ¨£¢ÿÅÁÀÿÔÐÏÿòððÿùùùÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷ÿÍÊÊÿ~lÿRQ1ÿhb5ÿŒvÿÙØÔÿ]^^ÿÿÿÿÿÿÿÿÿÿÿÿÿ)1ÿW~—ÿ}·Ýÿ{·ßÿx¶Ýÿs³Ýÿp²Ûÿl¯Úÿi­Úÿe«Ùÿa©×ÿ^§×ÿZ¥ÖÿW£ÕÿS¡ÔÿPŸÒÿKÒÿH›ÑÿE™ÐÿA—Ïÿ>Vÿ¦¨ªÿïïïÿïïïÿíííÿìììÿëëëÿéééÿèèèÿæææÿäääÿâââÿáááÿÞÞÞÿÜÜÜÿÜÜÜÿÝÝÝÿÙÙÙÿ???ÿ¾¾¾ÿæææÿ^^^ÿÿtttÿ¨¨¨ÿƒƒƒÿ"""ÿÿÿÿÿ ÿÿÕ;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-ã ÿ”ž¤ÿš–•ÿ¯«ªÿÁ½¼ÿÏËÊÿòññÿùùùÿÿÿÿÿýýýÿûúúÿÝÜÛÿª©¢ÿ@C!ÿOHÿwoNÿÒÒËÿ³±²ÿÿu“¦ÿSivÿ"ÿÿÿÿÿÿÿÿÿÿÿÿ.7ÿVÿt±Øÿu´Ýÿp±Üÿm°Ûÿi­Úÿe¬Ùÿb©Øÿ^¨×ÿ[¦ÖÿW£ÕÿT¡ÔÿP ÓÿLÒÿH›ÐÿE™ÐÿA—Ïÿ Liÿ~‡ŒÿíííÿíííÿìììÿëëëÿêêêÿèèèÿæææÿåååÿãããÿáááÿàààÿÞÞÞÿÜÜÜÿÜÜÜÿÞÞÞÿ”””ÿÿBBBÿ ÿÿÿÿÿÿñ‹E•Å¿‡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›ÿbhmÿŒŒÿ°¬ªÿµ°¯ÿÊÆÅÿåããÿüüüÿüüüÿûûûÿêééÿÄÁÁÿqt]ÿ>>ÿ`Y0ÿ‹wÿÕÕÓÿNNOÿQdqÿ¥Íæÿ¦Ïèÿ”¸ÏÿWm{ÿ%*ÿÿÿÿÿÿÿÿÿÿÿ ÿ%9Fÿ[Œ¬ÿn­Öÿn°Ûÿj®Úÿf¬ÙÿbªØÿ_¨×ÿ[¦ÖÿW¤ÕÿT¢ÔÿP ÓÿMÒÿIœÐÿFšÐÿB˜Ïÿ'\ÿ[goÿìììÿëëëÿêêêÿéééÿèèèÿçççÿåååÿäääÿâââÿáááÿßßßÿÝÝÝÿÜÜÜÿÝÝÝÿÜÜÜÿXXXÿÿóá›Kw—{7 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7÷789ÿ~{{ÿ°«©ÿ¦¡žÿÇÃÁÿÜÛÛÿóòòÿìêêÿüûûÿÓÏÏÿª§¢ÿACÿNJÿjfHÿ¹ÿƒ„…ÿ"%ÿžÂÛÿ«Òìÿ«Óìÿ«Òìÿ§Ðëÿ‘·Ïÿ^xˆÿ!&ÿÿÿÿÿÿÿÿÿÿÿ ÿ/J[ÿ]•¹ÿi¬×ÿg¬ÙÿcªØÿ_¨×ÿ\¦ÖÿX¤ÕÿU¢ÔÿP ÓÿMžÒÿIœÑÿFšÐÿB˜Ïÿ,i‘ÿBOXÿêêêÿêêêÿéééÿèèèÿçççÿæææÿäääÿãããÿáááÿàààÿÞÞÞÿÜÜÜÿÜÜÜÿÞÞÞÿÐÐÐÿ ÿå_+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ·ÿronÿ¢›ÿ ›˜ÿ¾»ÿÕÒÒÿçååÿÜÛÛÿëêêÿ½º¶ÿffMÿGCÿa[2ÿ…‚wÿª®°ÿ%),ÿ_v…ÿ«Òìÿ®Ôíÿ¯Õíÿ­Óíÿ¨Ñëÿ¥Ïêÿ¡Íêÿ˜Ãßÿ`}ÿ#/6ÿÿÿÿÿÿÿÿÿÿÿ ÿ0Pdÿ\šÃÿcªØÿ_¨×ÿ\¦ÖÿX¤ÕÿU¢ÔÿP ÓÿMžÒÿIœÑÿEšÐÿC˜Ïÿ0tŸÿ0;CÿèèèÿèèèÿèèèÿçççÿæææÿäääÿãããÿâââÿàààÿÞÞÞÿÝÝÝÿÜÜÜÿÝÝÝÿÞÞÞÿwwwÿÿ›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=ïUSQÿ‹…ƒÿ›–’ÿ¹¶±ÿÓÏÎÿÝÙØÿÌÉÈÿËÈÈÿ¨¦ÿ>>ÿVO ÿpgKÿ˜–”ÿ/49ÿManÿ£Êäÿ«Òìÿ®Ôíÿ¯Ôíÿ­Óíÿ¨Ñëÿ¥Ïêÿ¢ÍêÿžËèÿšÈæÿ޼Ùÿi¤ÿ(6?ÿ ÿÿÿÿÿÿÿÿÿÿ ÿ3YqÿT•¾ÿ\¦ÖÿX¤ÕÿU¢ÔÿP ÓÿMžÒÿIœÑÿEšÐÿC˜Ïÿ6ƒ³ÿ!2<ÿÄËÎÿæææÿæææÿåååÿäääÿãããÿâââÿáááÿßßßÿÝÝÝÿÜÜÜÿÜÜÜÿÞÞÞÿÅÅÅÿ$$$ÿ÷;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡0/.ÿ~yxÿœ˜“ÿ¬¨¢ÿÑÎÍÿÐÌËÿ±­¬ÿÇÄÂÿqrYÿIFÿaY,ÿ‡‚vÿw{ÿ.:Cÿ‘·Ðÿ¦Ðêÿ©Ñìÿ«Óìÿ¬ÓìÿªÒìÿ§Ñëÿ¤Ïêÿ ÍéÿËèÿ™Éçÿ–Çæÿ’Äæÿ†¸×ÿc‰¢ÿ+Jÿÿÿÿÿÿÿÿÿÿÿ(4ÿ:o’ÿPŸÑÿMÒÿIœÐÿFšÐÿB˜Ïÿ>•ÎÿIfÿlrwÿäääÿãããÿâââÿáááÿàààÿßßßÿÞÞÞÿÜÜÜÿÜÜÜÿÜÜÜÿÞÞÞÿºººÿÿýmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿG çoll÷tnlÿ|vnÿ°«§ÿ¾·¸ÿ‹ŒÿjjNÿUN ÿd\/ÿ{qÿ../ÿ\x‹ÿœÊèÿŸËèÿ¡Íéÿ£Îêÿ¥Ïêÿ¥Ïêÿ¤Ïêÿ¢Îêÿ ÌéÿËèÿšÉèÿ—Çæÿ”ÅæÿÄåÿÂäÿ‰Àãÿ†¾âÿ‚¼áÿºßÿh›¼ÿ4O`ÿ ÿÿÿÿÿÿÿÿÿÿ%1ÿ8sšÿG˜ÌÿE™ÐÿA—Ïÿ>•Îÿ/v¤ÿ%-ÿààáÿáááÿáááÿàààÿßßßÿÞÞÞÿÜÜÜÿÜÜÜÿÜÜÜÿÞÞÞÿÝÝÝÿRRRÿ'''ÿÿÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#Ñ543ójeeÿzqgÿŠ…~ÿІƒÿokfÿkhJÿaX)ÿyr_ÿLJFÿ+7@ÿ޼Ùÿ™ÉçÿœÊèÿžËèÿ Ìéÿ¡Íéÿ¡Íéÿ¡ÍéÿŸÌèÿËèÿ›Éèÿ˜Èçÿ•Ææÿ’ÅåÿÃäÿ‹Áãÿˆ¿âÿ…½áÿ‚»áÿ~¹àÿ{·ßÿu²Ùÿ`•¸ÿ3Qdÿÿÿÿÿÿÿÿÿÿ ÿ5Gÿ4uŸÿ?”Ëÿ=•Îÿ6ŠÁÿ+<ÿ˜¡§ÿßßßÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÜÜÜÿˆˆˆÿSSSÿ¾¾¾ÿUUUÿÿ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¥$#"åpllÿ‡xÿ`X=ÿSRFÿa]QÿrmGÿ~tXÿ}yvÿ!(+ÿs›´ÿ•Ææÿ—ÈæÿšÉçÿ›ÊèÿÊèÿžËèÿžËèÿËèÿœÊèÿšÉçÿ˜Èçÿ•Çæÿ“ÅæÿÃåÿÂäÿŠÀãÿ‡¾âÿ„¼áÿ€ºàÿ}¸ßÿy·ÞÿvµÝÿr³Üÿn¯Ùÿ[”¹ÿ5Yoÿ ÿÿÿÿÿÿÿÿÿ ÿ?Vÿ4€±ÿ8Éÿ&fÿ3=CÿÈÌÎÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÜÜÜÿŸŸŸÿ888ÿ¿¿¿ÿÝÝÝÿ»»»ÿÿÁ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘Ývrqý¶´²ÿ³¬¢ÿhgcÿ¾»¸ÿ¢”ÿ…€}ÿ*++ÿ.>Iÿ‹¼Üÿ’Ååÿ”Ææÿ—Çæÿ˜ÈçÿšÈçÿšÉçÿšÉèÿšÉçÿ™Èçÿ—Çæÿ–Ææÿ“Åæÿ‘ÄåÿŽÂäÿ‹Áäÿˆ¿âÿ…½âÿ‚»áÿ¹ßÿ{¸ßÿx¶Þÿu´Ýÿq²Üÿn°Ûÿj®Úÿg¬ÙÿZ›Åÿ5]wÿ#ÿÿÿÿÿÿÿÿÿ ÿFbÿ/‚·ÿ5LÿW^cÿÎÎÎÿÜÜÜÿÜÜÜÿÜÜÜÿÞÞÞÿÜÜÜÿˆˆˆÿ222ÿ¶¶¶ÿÝÝÝÿßßßÿÙÙÙÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{õ754ýkjhÿ|}|ÿ—•”ÿ šÿXWWÿÿ(16ÿE_pÿ‡»ÛÿÃäÿ‘Äåÿ“Åæÿ•Ææÿ–Çæÿ—Çæÿ—Çæÿ–Çæÿ•Ææÿ”Ææÿ’ÅåÿÃåÿŽÂäÿŽÂäÿŽÂäÿ†¾âÿƒ¼áÿ€ºàÿ}¸ßÿz·ÞÿwµÝÿs³Ýÿp±Ûÿl¯Ûÿi®Úÿf«ÙÿbªØÿ^§ÕÿVœÉÿ6eƒÿ%0ÿÿÿÿÿÿÿÿÿÿ?Zÿ ÿBCCÿ£££ÿ¾¾¾ÿ¼¼¼ÿ   ÿJJJÿLLLÿ¶¶¶ÿÝÝÝÿßßßÿâââÿ¯¯¯ÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿeñÁÛ÷÷&%%ñýÿ+38ÿm”®ÿˆ¼ÞÿŒÁäÿÂäÿÄåÿ‘Äåÿ“Åæÿ“Ååÿ“Ååÿ“Ååÿ’Äåÿ‘ÄåÿÃäÿÂäÿ‹Áãÿ‹Áãÿ‹Àâÿ„½áÿ»àÿ~ºßÿ{¸ßÿxµÝÿnªÐÿ_•¹ÿm®Øÿk¯Úÿh­Ùÿd«Ùÿa©×ÿ]§×ÿZ¥ÖÿV£ÕÿL“Áÿ4hŠÿ'5ÿ ÿÿÿÿÿÿÿÿ ÿ==>ÿ555ÿ>>>ÿ>>>ÿGGGÿ“““ÿÍÍÍÿÝÝÝÿßßßÿâââÿâââÿeeeÿÿÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+‹‹‹‘SÏÿÿ "$ÿEXeÿ}¨Äÿ‹ÀâÿÂãÿŽÃäÿÃäÿÃäÿÃäÿÃäÿÂäÿŽÂäÿŒÁãÿ‹Àãÿˆ¿ãÿ‡¾âÿ„½áÿ‚»áÿ|¶Ûÿ^‹©ÿEg~ÿ4Oaÿ 1<ÿ ÿiªÔÿi®Úÿf¬ÙÿcªØÿ`¨×ÿ\§ÖÿY¥ÕÿV£ÕÿR¡ÓÿOŸÒÿI—Ëÿ0hŒÿ)7ÿÿÿÿÿÿÿÿÿ444ÿÿÈÈÈÿÛÛÛÿÜÜÜÿÝÝÝÿßßßÿáááÿãããÿâââÿ¥¥¥ÿÿý‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÿ"""ÿSSSÿ))*ÿ:ISÿf‡œÿ…µÕÿ‹ÁäÿŒÁäÿŒÁäÿŒÁäÿ‹ÁãÿŠÀãÿ‰¿âÿ‡¿âÿ…¾âÿ„¼áÿ»àÿ|¶Ûÿ4L\ÿÿÿÿÿ ÿk¯Úÿh­Ùÿe«Ùÿa©Øÿ^§×ÿ[¥ÖÿX¤ÕÿT¢ÔÿQ ÓÿMžÒÿJÑÿFšÐÿB—Íÿ.m–ÿ ÿÿÿÿÿÿÿÿÿ<<<ÿžžžÿÝÝÝÿàààÿâââÿäääÿæææÿèèèÿêêêÿ¼¼¼ÿÿç!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ùÿxxxÿˆˆˆÿIJKÿ06:ÿBQZÿ_–ÿr›µÿ}«Êÿpºÿ}±Òÿ…½áÿ„¼áÿƒ»áÿ»àÿ~¹àÿr©Íÿÿÿÿÿÿÿ^›Âÿf¬ÙÿcªØÿ_¨×ÿ\§ÖÿY¤ÕÿV£ÔÿS¡ÔÿOŸÓÿLÒÿI›Ñÿ?Œ¾ÿ3v¢ÿ?Vÿ:CHÿ®¯°ÿZZZÿÿÿÿÿÿÿÿ ÿOOOÿ±±±ÿßßßÿæææÿèèèÿêêêÿìììÿîîîÿFFFÿóMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒïÿaaaÿºººÿ´´´ÿˆˆˆÿRRRÿ467ÿ)16ÿÿ .7ÿFdxÿt§Éÿ¹Þÿ~¹ßÿ|¸ßÿy¶Ýÿ4O`ÿklmÿtttÿÿÿ ÿZ—¾ÿd«Øÿa©×ÿ^¨×ÿZ¥ÖÿW¤ÕÿU¡ÔÿQ ÓÿNžÒÿKœÑÿ?ˆ¸ÿ,:ÿ-;Dÿbmsÿ´·¹ÿåååÿàààÿ¸¸¸ÿ\\\ÿÿÿÿÿÿÿÿÿbbbÿÇÇÇÿèèèÿíííÿïïïÿñññÿ```ÿõSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿOßÿÿŠŠŠÿÞÞÞÿÞÞÞÿÙÙÙÿŽŽŽÿÿÿÿ!ÿRy’ÿx´Ûÿy¶ÞÿwµÝÿl§ÍÿPo‚ÿTZ]ÿÿ*5ÿL€¡ÿe«ÙÿbªØÿ_¨×ÿ\¦ÖÿX¥ÕÿV£ÕÿS¡ÔÿPŸÓÿLÒÿD’Äÿ-=ÿ‡‘–ÿáâãÿçççÿåååÿãããÿâââÿàààÿÞÞÞÿ¼¼¼ÿkkkÿÿÿÿÿÿÿÿÿyyyÿÙÙÙÿñññÿïïïÿ111ÿï9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©÷ÿ@@@ÿªªªÿÚÚÚÿÜÜÜÿÿÿTTTÿ]]]ÿ ÿ9XkÿvµÝÿt³Ýÿq²Üÿn¯Øÿh§Ñÿd¥Ïÿe¨Óÿf«ÙÿcªØÿ`¨×ÿ]§×ÿZ¥ÖÿW£ÕÿT¢ÔÿQ ÓÿMœÐÿ7t›ÿ1Bÿ4>EÿããäÿæææÿäääÿâââÿáááÿßßßÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÍÍÍÿxxxÿ)))ÿÿÿÿÿÿÿÿÿpppÿÿÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ cÕýÿYYYÿ¸¸¸ÿÙÙÙÿœœœÿ???ÿ899ÿÿ5Reÿs³Ýÿq²Üÿo±Ûÿm¯Ûÿj®Úÿh­Ùÿf¬ÙÿcªØÿ`¨×ÿ]§×ÿ[¥ÖÿW¢ÒÿM“ÂÿHŽ»ÿDˆ´ÿ%Leÿ0;Bÿoy€ÿÉÌÍÿäääÿãããÿáááÿàààÿÞÞÞÿÝÝÝÿÜÜÜÿÝÝÝÿßßßÿàààÿâââÿãããÿËËËÿ‹‹‹ÿ+++ÿÿÿÿÿÿÿÿçKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#ñÿÿ^^^ÿ¸¸¸ÿ´´´ÿ>>>ÿ1BMÿgœ¿ÿo°ÚÿjªÔÿ\–»ÿW޳ÿ` Éÿd¨Õÿa¦Óÿ\¡ÍÿR’»ÿMŒµÿD~¤ÿ&I^ÿ)4ÿ"*ÿ!ÿ>>ÿèèèÿçççÿçççÿçççÿæææÿåååÿåååÿäääÿãããÿâââÿáááÿàààÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿàààÿâââÿãããÿäääÿæææÿèèèÿéééÿëëëÿìììÿîîîÿðððÿñññÿóóóÿõõõÿ÷÷÷ÿ´´´ÿÿÝ;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI÷FFFÿåååÿåååÿäääÿäääÿãããÿâââÿáááÿáááÿàààÿßßßÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿàààÿâââÿãããÿäääÿæææÿçççÿéééÿêêêÿìììÿîîîÿïïïÿñññÿóóóÿôôôÿöööÿøøøÿúúúÿfffÿûwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ï$$$ÿÐÐÐÿâââÿáááÿáááÿàààÿßßßÿÞÞÞÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿáááÿâââÿãããÿäääÿæææÿçççÿèèèÿêêêÿìììÿíííÿïïïÿðððÿòòòÿôôôÿõõõÿ÷÷÷ÿùùùÿôôôÿ˜˜˜ÿÿã#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ­ÿWWWÿ×××ÿÞÞÞÿÞÞÞÿÝÝÝÿÜÜÜÿÜÜÜÿÜÜÜÿÜÜÜÿÝÝÝÿÞÞÞÿßßßÿàààÿáááÿâââÿãããÿåååÿæææÿçççÿéééÿêêêÿìììÿíííÿîîîÿðððÿñññÿóóóÿõõõÿöööÿâââÿ}}}ÿ}}}ÿVVVÿÿù}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+×ÿ...ÿpppÿyyyÿ½½½ÿÝÝÝÿÞÞÞÿÞÞÞÿßßßÿàààÿáááÿâââÿãããÿäääÿåååÿçççÿèèèÿéééÿêêêÿìììÿíííÿîîîÿðððÿñññÿóóóÿôôôÿöööÿøøøÿóóóÿgggÿÿÿÿái ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3·÷ÿ ÿ¥¥¥ÿàààÿáááÿáááÿâââÿãããÿäääÿåååÿæææÿçççÿèèèÿéééÿëëëÿìììÿíííÿîîîÿðððÿñññÿóóóÿôôôÿõõõÿÓÓÓÿÍÍÍÿºººÿ```ÿÿã‘MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCÇÿ———ÿãããÿãããÿäääÿåååÿæææÿçççÿèèèÿéééÿêêêÿëëëÿìììÿîîîÿïïïÿðððÿòòòÿóóóÿôôôÿöööÿ÷÷÷ÿéééÿJJJÿÿ ÿýÝGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwÿCCCÿàààÿçççÿçççÿèèèÿéééÿêêêÿëëëÿìììÿíííÿîîîÿïïïÿñññÿòòòÿóóóÿôôôÿöööÿ÷÷÷ÿøøøÿúúúÿ±±±ÿÿóŃ#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÍÿHHHÿ´´´ÿåååÿäääÿëëëÿíííÿîîîÿïïïÿðððÿñññÿóóóÿôôôÿõõõÿöööÿÐÐÐÿÏÏÏÿ÷÷÷ÿÝÝÝÿ‰‰‰ÿÿý]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ=×ÿÿ(((ÿ'''ÿJJJÿ¾¾¾ÿñññÿòòòÿïïïÿÐÐÐÿäääÿöööÿëëëÿ¹¹¹ÿ!!!ÿÿ,,,ÿÿÿñ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'“Ýï÷ÿÿpppÿÿ\\\ÿ ÿ<<<ÿWWWÿDDDÿ ÿùíïëµS ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿMŸïÿÿÿùýÿýÓe ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/w{_''='ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsleepyhead-0.9.8/sleepyhead/icons/session-off.png0000644000175000017500000000250612412506713021420 0ustar sergiosergio‰PNG  IHDRAf]iCCPICC Profilex…TßkÓPþÚe°á‹:g >h‘ndStCœ¶kWºÍZê6·!H›¦m\šÆ$í~°Ù‹o:Åwñ>ù Ùƒo{’ Æaø¬ˆ"Lö"³ž›4M'S¹÷»ßùî9'çä^ ùqZÓ/USOÅÂüÄäßò^C+ühM‹†J&G@Ó²yï³óÆltîoß«þcÕš• ð ¾”5Ä"áY i\ÔtàÖ‰ï15ÂÍLsX§ g8ocáŒ#–f45@š ÂÅB:K¸@8˜iàó ØÎä'&©’.‹<«ER/ådE² öðsƒò_°¨”é›­çmšNÑ|ŠÞ9}pŒæÕÁ?_½A¸pX6ã£5~BÍ$®&½çîti˜íeš—Y)%$¼bT®3liæ ‰šæÓíôP’°Ÿ4¿43YóãíP•ë1ÅõöKFôº½×Û‘“ã5>§)Ö@þ½÷õrŠåy’ðë´Õô[’:VÛÛäͦ#ÃÄwQ?HB‚Žd(à‘B ašcĪøL"J¤ÒitTy²8Ö;(“–íGxÉ_¸^õ[²¸öàûžÝ%׎¼…Å·£ØQíµéº²šua¥£ná7¹å›m« QþŠå±H^eÊO‚Q×u6æS—üu Ï2”î%vX º¬ð^ø*l O…—¿ÔÈÎÞ­Ë€q,>«žSÍÆì%ÒLÒëd¸¿ŠõBÆù1CZ¾$MœŠ9òÚP 'w‚ëæâ\/מ»Ì]áú¹­.r#ŽÂõE|!ð¾3¾>_·oˆa§Û¾Ódë£1Zë»Ó‘º¢±z”Û'ö=Žª²±¾±~V+´¢cjJ³tO%mN—ó“ï„ |ˆ®-‰«bWO+ o™ ^— I¯HÙ.°;í¶SÖ]æi_s9ó*péýÃë.7U^ÀÑs. 3uä °|^,ëÛ<ž·€‘;Ûc­=maº‹>V«Ût.[»«ÕŸÏªÕÝçä x£ü©# Ö¡_2 pHYs.#.#x¥?vniTXtXML:com.adobe.xmp å? ATIDATX 푱 „Œûï¬#P… ë¿p¼³þf™p—ïçûƒa™u`GÆ¢†efÔ‹:–™Qvd,ê`XfFØ‘±¨ƒa™u`GÆâ[, éþIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/cms50f.png0000644000175000017500000024645612412506713020300 0ustar sergiosergio‰PNG  IHDR\r¨f AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ iTXtXML:com.adobe.xmp 1 42/1 2736 121803/20 1/60 2 0230 0 0 False True 0 1 False 6311/1359 0 231297/38 2 5/1 2736 37/8 0 5 2.3.0.0 6 0 4146 00000a43a0 035021001653 0/1 0 18/1 55/1 0/0 0/0 EF-S18-55mm f/3.5-5.6 IS STM 1.1.1 1 Canon 2 72 72 Canon EOS 70D 2 Adobe Photoshop CC (Macintosh) 2014-07-24T23:12:09 2014-07-24T23:42:18 0 2014-07-24T23:12:09 1600 ·/#@IDATxì½¼\wuï»öô^O/Ò9ªVq•lc°¨¡“vBBI û>÷rïKrƒœ›— åæ%!I 8 „â›ȵÛ²qQ—ŽNïçLï3{ßïúŸsä‚Hd!Ë#3[š3{öìÙ³÷öZÿU~ë·ÜòÂ[¬xÆÇÇíg^ÚÎÝW¿9ÝÓ÷Û©®ž™ž®ÞTï@Woÿ@²«7¹º´°´¾¿§kçÎpye¥Îk÷ŽÝ×|O:9Ä˹òúû–<è:À{|‡³¾­óÔ+r¬+ò¬¿õ¤¹ŽÛ]ûö¹>Üз¯ºfßYbÝaÛάå²|n·[,q½ÅãñD,˲Å—#NK\–»Ñh¬4jÍ@šûÝ–«ßåvÇÛ9e7›IqɋŶŸpÄþP1·p÷ìììòS¿^•Mww·s×]wéfUߢxžºg½3í4W¼Pà þ¾ÙGcj¸Q”€×íE¸\-¬”ãu{l¯/Ðr{ýx¡å „l”¾G·í’×Fâ‰/}ýk÷i8ˆ;¤ßÐY:#ð¼À•§n·gÓb(Wï?Úó²`¬+ '¼0Ö=þ>³µÚîxóF€Q©ZîbføA?b¢ÛUëw¥†ß\S Ì좊ÃŰ*†™õ2P‹@ƒ†¥ÞhZÍ:Çqa;¸ë Ûiðu¬ò!¾ÐrÕ<_¯Øµ«—gÿr]øÕŠé(¡³<¿#Àu-Ód-è±_vÝ×6mÉ^Ëí×Ý)¯ÌXÍÌ ‚ͬmÌp„• ž‘Aþ´ddÖÙŸÙ\|<Ök&ú¯ŸAºy¯ÊA-ÔŸA ðyoµ, µšú¹¦×(Í4‰bg ЍžŸóüR­4=º/É®´ú"á¿‚n»ò©^I€%GšÀßî—¼þÏ’»^úÊÔ¦]µ`,mµ,Ÿ«^+H37kfèf~ aÕç5eÐ43y‹™Þ¶IëaèzÀ>ò¨3¼}@dÝáúû Ôà` !·Q dŒ% nRÎkïZÚP¥z]¬ÕRÐ8Ïï'@Xqªµ¢Ë±åhpçdzÙñæ¾}û¼sssÔà Y²®kSSôŠX8°¡¬öÆúw½£§¯x×Fµå®²b—²L¼jÐh„ãcü}f|õøà»39#¤*¼ªª$ÔJ S@ÜÀ|N}}ƒ @è±%LpP•k$æ‡é_CyTI!bh†ea…¢³½mŽa£4ñF»Ý顽­XßάÀìu°×ÁJ×sEŒç$_˜#pe¹üÃÃr›;ǼÙzÝÕ¨T¤YX–ZfN¡}ÌÆ#9²füxÝæñ`Ö#ìjèC¥]g÷F­&^k¶@Ý„ZCÁ=€ £z•ru'b ü üy4+Àç‹àÐâá;|ªX÷òì ĉo–X÷DBaw©Z¶}©÷D“‡cÝwÏs)êc¨îX Bgy~FàŠ˜…n'ðw÷Ýã­m"Ýáë^ÿ‰Ðæý1o(j×uWµ´"̸4Š+ÒdFn’“GBMn^gz5ÇuÚWs¿J OÍxÛæ}„x-¨&~Ó¼¯³¼‘xã(HH­uê( E¢ nÀçH 2Ö„*U0¿O|Ž|(jXü»%K‹…+à Fù¾¦”Ë«×ÅÂÑ}C½©Ï-,,h½A' øüÜûo]¿ùÚ} ¬»ö4Þupÿþ_ëÙó½CÉôP+ÌÜ H¤µ,NaV¼:£7ËR-ç ¼ ¢ßhTx‚u²T*y©” f›ºê°“: ¢9|ƒƒ kÀ/ AVó^§iÅB …ÃÆz@e`   ˆøz0 ~„\£Œªt@ I+9,¾T·XËàr¥¬5;}¼µ’YÇzc±îlÑ'pE(áv¿I:çwq#pe¸3ÙñÆFBÑ´xƒ§ÀŒïÍŽKkiR˜ÚXž°¿ÕW0E°Og…ùª ³Q¼Ìµ*äЀŸæôuö7s>ŸÑ«°+8Èí àN F‘èÇ5ÂŽÄÄía=d“ùZµŠÔ˸ý>ý ?wH‚Ñ„^)•J&͘™;#3Üãñû‚-o,N„0ú¡®]·(p(µÌ5òÜY:#pÙF@o¼v_œ}ûÞ¥^É䎪Բ̼–«Pµ£GOÊñÇ‘L¡"åJ )²BѯxüqæVÛÒYݸã@@z÷"à~´‡©ß¿TÓgøPÎ?Ïñòˆ„%‹âÿפʶÌÒ,lH4Ù-‰®A G{$’è_0l`Æjú‡"qñ†Ò¬V¤V!Ј¡Ñ@ dgNKi~BjÕª»QmÚ¾@â{Þm¿¤×E€óJøôT;Ë l®óÓš›3u2¸çÀÿítíÞ]­â³ÉÌ;~93}RJÙi€<©V1ñ1ùåˆ a #Œ@˜À §A Ž’`„\kÜÄPk@S{j9è¦òQþ`Pñ3¾úÿÀ|Q-,Љ$މ‹?šLK¢?Ñ%-fâb"Ò vQ…Æp°$¿¼ ³ÇþMZù%ŽëÕ`¢íóøÕ_èÉ.MþÙøøx'ð¬+årÚ^(~þèѣΎ=òƒ©=ïø5ol³Îæ)9«T)ÿ]sûÁ·©¼³m¹@`AÔœ¾Z‚0ÐÁ·J$Ad} ÀËæ GPA:7¯‘Lc xQ6¯ÁÁ&ß¡åš"¨c(fç¤XX•ßYg{±T– …0£X¡´¸ÃýÆÍ¨“UXœ“•£ÿDV"À}[¢.9I¬ w8–üx!³˜Ç pËyHL®”©sžWæ´{ ÀÚ³g!Û°]Û®õúR˜÷Ñ=o£N`[$½I¢‰|í²ñ¹£Dæ3‹³È|UÊdWSÒƒ‹ÌâM\oLt~«l6+©Tn€—È|ɤîÊ` *•@Iú׃„¸å˜Ù½Æq4+àÆÿ/.œ”:Háô)à"D°,,ŽH¬Åâ’Õlåã–Ê*¥U‚±Á5ESo8µj™ì€ûÄ­7ìš½ëÌ „ubW¦ ]ÑgÝî À9t×]]y·wÕëǤ÷ú¬¹ÕeLx NI3ðÉÒrN¢ñ¨¤F®‘R¹Ì¾ nH,ÌÌˬ›Í—Mt?à÷Š'_ !Äÿ'ˆH@_z°*ÕªQŠ(¡|b¸RªHw h\ˆ…¥%éíêÁå()`@"ñ^©ã߇bq”LKˆ2˜¸‚·eI©“jnN¿Þ¸Z†Œ9aƒ+p7,çá :ˆhAgéŒÀåvW®C‡j }Ð7øâ;ž€¬æ²”übÊÇ"ú%¹‡P¹ ä…]a|Ç/¡`WAsóZl 5:’HˆÔÈ Ôñõƒ1 ¾äùýøüÌz-J ("àùµìW­€”„úô}é„ÄA VîéÀ@ÁÓ(ŒŠA³Ýž¿’ÔÊËäûQ~²(§j}Fùq|M3’†°Ü¶—ìÁ Çý‰ù¹îÌþ—÷¾ï|Ûú´uôùÀƒæüö¾äÕ?ž}ñþ¦Ëg“¦óKCmfp›hPòå¦d Dç1ÿ‡<&5¸eMõ;ÉVl)h ÏÃ瘕«Jº¦ú—OêìS·xHp“ a©éH†~©É±\!©q¼†å—º+ÀkˆÁ8©¾€PñK°1H°0"=Ý}R̬H%·ŠbŠ{€€+¥QÊHuòëâ ¤°B@(‚;P°Q cËÕXÿ ΡsWvFàr@›+€÷›™Ñy©ÇOTÝå±cñ<öZòŠtÓÀ3}<®„ÏOî?_(J¡\5ùúÙ¥Œ™Ýmâ“Ó‹çà€ÏL/®I)Ÿ“ñ™ñ!œÕR n/‹X «ÄåJ¹Šô…p-V%Ÿ/IØkÉüJŽ ABE EÑ›Š¡lZ21}V2Ó§±(à$ò¿ŠÏŸÍ®H>3Ù¡@‡9W5V(.ÒÆÕnÛþrzh4‚hwkìrß›ï» #ÐÎ À:xö^–r½Ñ§BO¹Žµ<»$"ý‘(€Rr‹‰D|a9£eŠ%“ç÷!¤Ÿ WÃ-ˆÔÓ`¢81/ºÛ†ºÞiåVC¿Zm)°$‚ÿ¯ Å¸9¶à2xv"x@ƒ«’/¥H¬A‹‡Væ'Qy †’â\]¤"[¸ÕÜ 3¿ºÿ„2tž7ë.pKø .wˆlÀoè5TWÇ`ŽÌËΟÎ\†h_ i±µe|ü^È~4 nEb ìpBßðÒa(¿¦Dðõ½-ò)}É8QÿŠIÃ1Åç—(‘Ó¨•dfÎüü Á¹ñI²ÄòDë§™åIôÉJ¡ %©˜OrÅ‚,P6/3¡o¢H|Ìì9‰ó}Š ¨"üQbAM9‚ Pb‘*ñ„P$*!\/3¿Jµ*5ýÏI¸c{Z|7ä¥?Þ¿}ï[Ö¯µ}õì<½°F mo¸ëã|íµƒoHtv-,®:cSóLÒˆ‚žÍbæç†[••¥¬dWVe~ná®K=Ÿ•2i¾€[«ûˆü‰Ê‡0 õHwLjڇ%–ˆÈ¦þ„I×…Ã~³:Ø”û†1û›Ä¢X LúJÕ&€¡äÏ%9bZTƒb\ wåS)ä $8Þ3 qR’¬ E—Š9)­ÎávÕà¢kf—À?§±f8›Ìå8pN?¼°n³ÎÕ´ël̲ív~.Ðqš8“áà·"›öou« ¼‡%P òŽ7 &À#«+Y J¥üÖG, «›ê;À9|JÛéE€5ן+V ‚I‹`“\É>\21»`¢ó܆ÉÉyñÊf 21³Ä,O1“•©…I¡4žý—„}n™XÈJ”÷µöÿÌØ˜dæÆ$N“ ìV~qƒ9(,•ÜÉO’ÇL—Â2Vr¯® çèrû ðX ›{céÞ/þ†²éo¢Z¢³tFà9ö <Á÷õ—^|ºæOۄtú$€ÇÄ “ÚÃÐbœH<&Ù²¦ó4à’ã'g×êòÙw åŽM%ßÀÁn"ÿn™Ÿš”#›ˆ‹Õ׊˜ºþ S“þt/ùÿºÄC~éëK7 ŒÅÐÕEZ1€5Áw|`BwÀ"°#VP'3à娶M`‘ºq«š—æªPÄ]0´`kŠ@}²ä]-ËÓ„Yèz§U}?×ûÓ<:¯¿|g¹,#О àÉKº]t÷!ŸYÉ[5ÌòD2,‰^Ì >ü¢ÉÝkP=Cä¿KV`cž°Oª‹ò]\†to¯t÷õ’£¯ƒí'§Ÿè&3P5uûCàö+ÄBñj÷{e×AAAáHDÎÎ/9a=2¾$©ˆ¦KRªg%âd¤ç‰-(Âï‡S` N B‰C¡3Ò¬ìÀŠH¤Ba-̧€¿€ÚVˆt*>ÀzéˆH`œÚFŽª®™ €òÜY:#ðœ@»+ÜîBFÎé'ØÖBàò•*Y€°ìPäL=ÝDñsDà c‰´;rŒ¼>3u4$“KÔ,Ó/0]–BµNlÀ-Ó ùâ€z”гDt? °¨RÉOœ òÊìÌ*ŠEQ¯kX’Ñ‘m úò¤ôJ²¥§7bQ’Ä´ëÐÜr“ÔcNRÿ”q5(Kv™€cT+ tRÇ‚Qߘÿñ9uðRتV¿ÕUÞ6(S§ÏDê(F¥³<·#Ðî ÀŸÏf|.LyzrâÑW£kÌêJÁ€3;òn6 yjfá–åÕ ŠŽ>P|~Ìue:¾<&½I\ b+ ²ïÚ‡ÖdlbRn¹þZjöë2~fJvlÙ„0ç%Ù“–m{¯–ÓÇO˜’à¡ÍÃ2‰ëàMÆpÈBP*ìãØ û°$Ü20´Yú¶(qœ³U€¬ÄJ›l„Ò‰i™‘Ö/èÌoa`¼R¨Ôåäø<ñCGæ–å VÂ$ùÿ¾ñ”k¶,/ÌË?Œ™nËÒ̸ŒŸ>)£›·IfvJVx½gÇn),LPvÜ”M[F¤Ñp· ö‰ ¿'™”ª óÔ(äV—ŒU\%Pñìø;Jã»On/Ù·_pŒ½Ûm{ܱØÐˆxryK u,L÷<ªé¿J£(›»·'Ý79.#›·HL<¢ÖÞÉŒ=vT²” ‰´grUyôáGÁÐM˜ŒÀôÙ³>pÕŃ@w,‘ “Ö ôtQc@i/îA4•E²áHÈx•D•^;ìh©o R7þ² º®¥ùYØSÒ;4(ÉtÑ÷¨LÀܺM ¸Ð™9"ú‰ý²:5!+¸Ú BO¾Zf™˜A™gÈ=H×å©Èç2è\r–òß°eZ>ùÀƒ@}ê@&r7BM|R³G2’X BöŒÀLa“ ¤?ž–ÓG¢>€†!À€¡ä|ù£âªH@…û¸(S¶àôc¡8H¼2š9­²ãj¬Âu@ŽñÉE?y>!?ß¶'?ÕYëŒÀ³vS —Ó"W$1Ô§4w5Ÿ··í¤ì7%scÇ¡ð"•GÿÈv™!“ð©HI²[›Œ6¥«¯›ÌÀƒPãjdPBýÛFàüË`%T$¶i§d) nb TPB.xuÔÐ'îò=àç»Iú` "à…kÐkWc.¡MC ¾nÐ3—Žà?sD:¯¿ãh7°qADı*‘ùE¸öb4嬼«Vè (4EPÑ´TðÌæÎ0£’3 qxâñ' VßË{+°óÆñýÓ í †b©¤$ð}“x*LI1nþ{,A&Kcfü%Åîù ¼5‰§Iã• °('@ÙÖ$ÈF ñѤTñIvðîGÝ›’]¤&ÀÇñ` Æjpkɯ²b0%-u¬äÐz¼Ið–pM/ØV€VgžWðÿIÃPUjt–Î<§#Ðn `c–+•³ó«ð2~»[Ž?þ¨”˜S˜åaSÂÛ”3ß| ¬?}˜i½°%z»hÕU‘Á®4ÖBB²¹‚$ì4‚v|›ÂaöÅ•° R…å''G+ñE¨¼ãÝ)YšžÇ—¯’ è•* cuwa Ò º:ªbökêNùþr¤µ;PÅP+fdbìeÆð @ÿ]QE…[á߃˜ô š‚¾ê´LAe r £±² h¼€\¦´|±Ý##’Ö3ˆH¹ËÔD<§w@çàßÕ#Ðn àÜÑtò«½”ïFâ]ÎÊêŠì˜#—¿Bµ]œ:€X~¿>}L–ä×ûG·ÈÔøY©fW¥/6Š¯È±³'dÓæQÉS˜SXY‘å¹9Ìõ¢TQTª˜VâÅå B[ä‘Ù“ƒ bá^E)h!‹c²a IÔ´¯“Š´X/ò„”ÔK¨^h$%NÐai ¥¤©>L|ˆD5® x?R7Š2/åÍZެtå¶Sƒà°;˜¨Y ˆ^*$runT:+¸´#Ðn Q‘VL˜ì#=»É)d+V"áHj`³”Æ•t:.}£{Îz.?Aß|è̶&)¿3ÇOå%0;ožÿ‰c'0Å]¤î&]è& ïÅÏGÆbdÔÐ.ã^ ‚,!Ð fûko¸†<¾-§—-Û·3‹ÛDÿOÈî]×À6\S‘Ñí{dq⌑×0«”"Ç ™>ñ´ÊZªLb®ÅA1 (ƒqü¹Ÿr‚ 9w­lQÐ$k ,á-«æñYõ:Kg.Ë´•8pà€uèÐ!ˆ=á¬Z=3cSòÅÀÊSg¶Î1ƒ¡o Ü£÷]Ò0ñú Ò=öõ@úEe §MÞ€rJÆÌÞ3Øc˜ƒŠ4÷"ß_S ʇû·‘5Èf$Kc=Wo—UX~&`N Ž2k»¥@r.9@f`“Iˆõ‰ªpÛ³p,)eª›äð]À{-‚|eø¼TûÕ ò5*+˜ZìCºà‘¢-Ø@aôÓiˆ¦"ÚdÔ»PÍÃl¹KîV2ˆÿpAm™eÃeú?ÐÙ¡3ç¶R…ÂnìCÒ¹áñw‡V—áêo6- ÿé‰' áô2sñÿ&Üã'—AH{$D38a>¶¯ÀÛ?8<`Êpg§æd誽øòðý;&‘d·¸p%ÆÏHÌ€Ây³Ëó²8Dä$?;/dT8óÓã2  yåÐ(®Òz¼uX…LëùUftÛ4ÍÌLÐk°L¿=˜õõéOíH¬¸"ô t˜¸Á>ÃO „! Âx±”\CDz¶÷Šœš;ßµ± E  €‘ê” o Içù"G €õÆ7´“ÿJìedd”«®f„мÙ´p‡è9eäë½´OJn>¢kÒ xfrL{ûß=J°N`O™{O‡¾›ž8ó«3ãršmJÂSÅ…ËçÁçXdròøÃ²î¤îÈ™'7uü!¸ÆŸ4øeÊ.dL³Q¦r™…-(mëp.³ˆ"ÉR@‰Ïhë0XÿL¶!H0ÐÆÌ—„¥¸>Ú‡{} 9s ^Ò'˜À ÁÅEDMCýó›¬#"5%ª»>méþÓ†£óâ;vRrðàA½áië‹ÅB1Šp¦¤+¾I |Z̪^êè ”Ùj4?ùg®ç—™•!éJrñåÏ>¢,?´ú”Ÿz⸉Dp–àø·˜•É”TÁï7ÀíG¢kä¢5˜|‚øò0ýŒ€‡Ã=ݲ4>)]= ‚€^póÒ73„”øsë5{eL@2Qǯ¢ úåÊÿçâXtBè\­¤VTW¯WƒeR`º…yiZæñî`:|~4àwðSw>Úo¶R§WÈåZÍé9zËDÉÉGWàM÷P7¾<ì?‹s¦7‚^! ·´ƒ¬£)sÙif_ Á`õM!\‡P”^}5ÝÞ=¢:áÎ%AHÍcÎk'7Ý‚Ët ÒHЄõ‡ú‚ 3´ò ÄSƒ i<)ݳÌkcm M¦e ö!E†©N ”¬b!h'`N+„·^I@ ˜‚Øf`Àdtr׬ê¿@¼Q/âkyãoåÀÿ[fÿ1꺯—è¿Z¥Ê4Ljˆ7– ÇôìÑÏæÖ¨9ˆ¹ºé twÁÅT¥ö ¿Jj0†UÂzw}Bé0uX ,r "ÝŠPŠRT¡²k¾¿Ñª@‚éOlA zõû}µènÜäA£PàÆÚ'sõ…¶™vÍâ[¾Õ¸?|çÐh'à8$îCxÎÅüññ·I*9d­,¯:‰dÖ,zNO D*ÐÙ†šñ]øý“TôõÚÑŠ»±ãÇ©fë³@ž ² ·SG¤`‡¸Aœæ'Ÿ`!`}R˜›•23¾–ã”àˆ“Ö[š˜'5H^ŸêÁ•ÙE0e¸<²€@Ë5š…b1`U(-Y eTz0ŠŒÝ©®j A™n@ùp\P9A΃g¥×b E¶8žv¶PQ›à"#@w#ü„ÎÒË3í¤Î]qH+õ ô©'y,)hÁWˆÔ«o#Òß58(13;Kz=,ÙÕ€= ISêKu_ æÞ`!O>#yÌb„)À)­TP"Ç%ZÐffŸ‡Dt€¦".fúr¥"6á˜ænüò!pþ%f{EñõÂ4œ¥ô· Bp뎴›d_Ÿôn”¹‰qé"é–¥É“Ä QAÆ °vÍû»Hª£î¾) f]; ë~4½U£À ­ Öì¸çîŠÎÊs1m¥uï67¼ìÈ-ƒýŸ/9¥•—SiÉ*X-Óø£;-žé)Ìé€Ì¡–äñ½³0øä–ðí1óñ»éê%:_—h”âÌ÷*»T$LžãÀæ­¦øg ¢‡¸AŒB •†·2 iƒÑþÁ! ÂSu¨eÆ \Œß2³“Êëƒ?À… ¿<3Ž"I“º·Fþð³|¥Ìkd[»¹´0ˆA ë@áÉ|.L1%á¤ÕìGö׺ÞY:#ð@û(Øpå®;ZxÉýNjäm fÏ*À0·ðû6¤}ÊÞ» /€¡ Ȇ ³ÝOÁvßI@ ¦ÝƒS©4Áº¸LOÌ‘1è’do\–OŸŸ .¯ëÚP”‚ž@ `1KGŸ†$!ï0„¡ æéï‡5ЬÖ$ÇÌ_r¬ÖA–†$yØ‚jj(™2™‡U”KÙ̼¸© ²¬3¾R~&𨕀ڭH…ÜãÇ×÷²Îk„º¤´ÇuÍ Œð `2"kÊÀl¸ ?æH´gg§Î0m£,í±~ï½ùÅ·öm½f¨Ü ;XÜ¥ýU¢ì~‚fê#—Aî…aŠ1»ûhº±‚¿®ÿ,ƒÕ%Øy™­ 'Ž`¬àÄ þ¤L8CÖ ¼IfNœœƒK12 Ñç”4>.!Lù .DAÏÎ%¡ó¢Xˆ¢ :¼ú}•b·K“^-ˆ`„jA„8Ϭ­ðãè¿R{p{C2= ò)g!x?R–¤%Ã)ñR*ìaº·©T,€bÿÓàE9()XµZ¢$ˆl…Ë»eF*O¹ÐU õ¡)ƒ Y6FÇu¸ÑêìÓ>  {Ýüwû½¥¾¹ªíö¹Ýšf+’žë•·*:[‚x]}÷¢Rœ›‘ ˜€U †¦´êŸ»'@…¢Ÿ¥‰Yñ¶ªtjÊqºû†a²‘º±GÓ9‹èÿìÉÓ4MTtÉ DZ€p@%÷ÑIxiyÙ˜éaH?4 ˜ …¨õüK%ÒìƒÒ° ïjT ÷D‚ª"P7@g}}­™MSjÃQ%QÀºŠ  ÀÅAûkÃ0MÉzh›ôgSx¡Šâ…pëevdCéÉAþñߌúE\ GßMcØ> `ãkÕëKêoç MW£Tv2óËVfqQàŒ‰ x§Fþ}ºp”ôݴɯyø12^=)™œ1̼Šø<¾¸ßTëùâ©À Çc?ÐÄdïÙ!ÝÛ`€ñWKˆ»µzAZ s¼|6OW¡ä#›i8º'`@½™õ{7 Kt‘–âìGdúøcâx"9ý•¾< ±·ýÐ,´e“ŒÄ ÐØ€FÿkG¹Tø• Ì}P @ÀL´¼[’"cBÃÂs7÷Æø|?[Ÿþôí®Læ•®;v8/{ÙËZ ï~‹µóéOÚÉd\ð*(d‹}.D¨/Vq\ÐO|ÛCÿIב#GÖ&.èSÏýN:aµÅr×’¡Gý¶šÅ,-2]QfÊŠÌÃ󀳈R°È­û˜µÔ®'¨V“0>|@#éÖ¼šÛ§ÚOãiA8þrXšŠÛ4Ò6 à·ú!†¥±|¤˜ÞúJInÞcV3ÎLmÊd³Ë̶~À@ËøÿÀr=qfX— Ê*jtõ÷É4™/i½®þ­’9qœh?i90+3gewÁÚM/uK4øP¿^I?sXÙ•EÖiFµ_)?›0?8˹E\@ ®"VE•xA‰F EbMF0NàÑ´ùR.RÁX÷ZÝ€Â]``357î–Ó œ×õ'ÿÚ³ŠžÔkp¸í!½Ct<¾[—§ þSˆ6ü¥Ÿ»±»{ðºH(°ÃOxˆi¬ä ³­f½±\*”æAx>=5~ì/>ñ‰cð1‚&[3íu|Q*ˆ‹Qó9Ô¦…[m£­ßéµÓ‹û&òeneÚô;É®^KjZ“KS‚K€.–ÆÿvÉ_¿ëÀcX{æf¦hІ`ì-Ð+•Tï!ÌÎÜ÷ bŽÄ‰œxì„çÄH×Íçk\¤S¦ñG™¯í&¸˜û¯Aô¾Qqi…hœ@(Ù(BˆhÚqu~|ЃÚ*<§…ùÜ 1ÏÃ@–³3f ²8ï:.€íPåK°‚òÐøæþ À÷ °˜ ¢B˜­‹XF0Æ1ttý»h±úÈG<ûïx76žaDÙôÇ¿ó«¯ïíyc"{Q:Ñ Ñ‚MM,«4_Åt(éªÃï§…c àãy27ÛvŽÚ/½åƳ¹lñåÌòßþƇ~÷ߨª/p_O*‚ï¶ñ}Ú­Ô6 @º»f îxÑuŲãÎjåægÜùÞ>fS›H~Ž€[/?rtÞ,³l°OX}ô„¤!öˆÀÃ7ˆ¢÷B¡$õKîë†ÐÅ ±A™&› ¸ÿ&³3_”Ljx¨Ø ÉU#¸ eY„v,=ÔOŸ ·b3iC¥³‰!ô™*¾y0ý¸ ¸š"Ôã4–q)ÆþÙ>ÆÌÕ¡þ¾]/‰­p ´y¨E«q-ÖraEú8.œ%Èd±¼n±$¼Ô}!¾ëÓ~Ðv~q;©Þ»îºK¯é¼³¨Îújæï· ¿ô}ä?øž-#?·ut4¡B_%>SS‘)ñæjv¥VušãÆ!Q¬£842j,ܱxÔ•L%¶o²¶æ³¹·ä÷~{fzañ‹_?òØÇPòMpNÄZ¿Åµh硼dçÖ. à\´;Þ¿íå-zçVlŸíw¯N¯c'øGž¼r"ο—¦Ÿ¤ÍŠ(ðþÉîµàžn€8b¶`óÑl@"™0Ù‡™7 |8ƒ™¯,ÁiRU}ea…ú€nÓž«2 ˆb a-T]’ s›Ö¥T¥•8õ ¦td¸‚UÈqRjåE¬ D”Ä €€Õä\±Jp»m:SlÔ„.,@ 3Õ;ÚáX)Á 5ûxÀ²ª•œí)´Öp_Ç/ü¿Žìƈ8rÉ~ëçý@ÿžðc’{î¸ã ™ó¿¿çÝ/ºú%wîÙ{M¯‹`l¡PhÍ,.9+…UÉåòN¹PvQ¹éU®…&¿…Z‡Êß ÏjU)®׋ÂJ_=„ÂøXýÞ¡ÍÃCÃCïèÿÉWì{ѧ¾ôÐC"^ð¨Œ~?UNúø®YÚB03¸T#Z[û_/‘i­¬º“píå(ÊQÓ¾ š É“QkÀÜÛ ±FÄPz/Îô!Uú{††CÛ¶‚Ìcê?ðÍm7vìQ¹þæ›Ïò‘oÊžýû‰Â×höù¨xZW)0OfÏZ~C6}vŠràí¿ûežváQ¨¾ºFä #!¢ôƒ[d>^Ø|z¶ÈÄ4¾?ØÝÀž3'OI*ê‡4”¢¡™1ÑWä_ ’…¤eÌÔ‚&$¸è¢KQÕkÜ ë ‰k`*™äá73—Ÿc.Wˆ¾IõSIîá*^ØÌ ùÈ»¼/{÷A5ùG>û×ýÒË^öòmˆ³-äì•Õ¬‡Gkn~Î=7¿àš˜^l>s†–ÑŸ®ÕŠ.,gßÿÕû§ÌX­EýÃ7ÝtSJ_wõ&÷ÁwÃÁëã±D_<÷ÊE§„‚v$¶†ü}}½ïûÀ?øƒ§NzßÇ>þ7§Ñ»Þõ.ïG?úQ=§üÒ `c”[® eu³{tm¾É·gW¡KÌDOH)·"vràpTšÅйÿüt˜~اø'ï˜3ßÂJÀl׆ŸâÁ ¹w^k.AA¹äþ“ÌòUüÊ ?Òi`¾EÈ;|²çºk .ò½QÙIaåà§V`o×YF nÙ"é|–Z¡’lÝ:*s“§ea‰@^¤Ø% tòý/kšˆ²‹ü¿úÏIë¦Í˜ý(1 ËASÊlÀ…˜°P‰w™1é>rÞsc¼®ôg5»ß½&üñüäŸ~á/ÿÞm˜õõ\6ç]Îå=Só ùé9ïøØ™\žûðøÌò'¿qèÐ\7´éç]*<ð\òf9Éß¿Ýsãž¾áá[âáèÏ'ã‰W¤ÓI«i4«­º;‚¯†ì­;¶ w§»>Õ•î}ûoýÞïþ$¿²î\l¦`ýÚÿ©-@4zríF¯--óÖ¬3ŸåÌLÌÐ8“þ|ûjuBuÀ'_î¿$‘u|q‚oÝàûýDÖݘÖÈ;MŸ@R†>9Kð0ž€üƒô[fjváù{—ŒŸž¾M( ŸLž™¦óOŠ_² 3&ÛÐÙ亮_0äá;â[-P{'˜H|ÂÔ€ôP«‡q÷ B¤¿ÿùÏ»·lÙb¯GìŸN~ý¼C³¾ÝÒøR29æúèG7þù _úÌŽ[®} Y¯ý?]éôÏÄ—‹ÖùÙ}fËñûýÝ{vï…¢_éëézχÿäÃx‰\‚ó ¼n{Þ€jÒç}902â·“€öâ;ný©ä¦XË^Zy÷Y Eå!£Û Ÿ[¸tüôö#Õ·¼(ÊmÒpËÓã¦X¡WŸ;³ˆ€R¼ãgÆ]˜]¢1Ȫq VæWúä!IÈ2ÛàøK2ÃWó&+Ð07h9¶8‰ÉOl Ao*¤¡~Lø:h =´D¸ LØ! ݨÃgæÖXƒ]…š,{%¡Ì?Oº:ÙTétÜ„ X#Õk¹k › ,×ÙßFøµØë"þת»œjîdnîÌ]rè~›;Ÿ÷ßçRŸÀ=÷ÜãmýòÏ¿ýUßûê7ÿiO?Y™*Uœkvy¹qúì¤ç±o>þoñW?P[œ]Fˆ}þð‡[sss­£G>+¡ÑýžS+Á…oïù—º;{ì‰wÃñø5&/'8'ÙÛÒÂ,ì¡[s#•J¸{»R¯Û½cûð×¾~ß相Ïç¬g9&ª×Ÿ¹<«ëxæ‡/Õë¶Péô«Ýss‡íþí·ÞêJï¼½PmØtöu)2/ËŒž¹W'=·<{š~¤Õ¬éðëÃÔ.æ¹q. Qˆ"ƒ¤Ø4#P(¨ïs¢ À@~ Áa0UåýSü~wæ>* 5·BÞ )H7æ|®Ciêü «@:”.05R|AŽ10ºÉäÿè1ƒ„Ä&sav‡£ðä?kÏÌèõ÷zð÷)3¶b#ÄÒd àDYè÷2ã@J¤í΂È-踫j 'ó ã³.ü³Çwô›oÛ¶ÍO¬DoºçõÆÓ™ü'~â'tö¶þÛýÅO^wÃþAbr¹âá÷kNOO{¿ñð#“ú±?5ûäTø™…Ÿ‰Ÿ×1y¶ã‚"8¬.ƒçÆo´>÷Ù/žð{wÕZuf÷N·ËElÖÝ$}è%…ÛòüVoOÏ {vïzù_½÷ÿÿÚáÃ9 ^¤x^Çœ±ú¶K[¸ggG[+UÈ>só$uÀsáÒÃ>Ó®9Y*ï¼ù ˜aÀ ãÿ+þ_;ïº$„ð¦i^efŽõ6%I_ÀÐÞH?åóó³zî8àž<¡²ž&¸ç€) oD™<2~¾Ï%v@ïAñ0sÛ´"@™D9UKRÕñ磃ªÏ vjÛ¥æ¢ê0iXŒ›ñ?9j|}2J-®ifR$ …9+M˜æ±5Þ¡w g€ qÑ‹Î6ß"è§OŸVûBnÄ Áº}ŸõIÞv›ñrì_ÿõÿtûèö]7B×îЖÍËÃÎfòžÇÎȉ£gÞÁç¿ðëw^ô¹áè8Xë‘þIúõoüþ×~È®VÑ3@µ §¤$àøBÆ5×]ó’÷¾ÿ×¾ö…/íuÄNhÖâÝïþè…Ž¥žk[/maÌÍ>äÈwʶ_ÿÞDÿŽ«VóE{hÓ°«N‰f;÷ÝJ¤¼.•%rþàý½Ìš(léÛ²˜0¬» ú.ž9ˬOž÷ιŸý(D4þÄ£š&ß’ùã"ÂÔùÓèsæÈ1EçbŠ×dòøã¤k@Hóà ‡&L$Ÿ+ÁxÌ|V¨>š¥¶ÍDþ¹ sãcÆ¥ÐöàjüXÅ¥i©Ž?H|b”;”à%­ÂuÆ\ y‡â&€?5‚… |þ¤§uJ‹µã‘’Š6¨vd"tlꇚ՜7R<ý‰b]Ê„¡8à 7{™a-nrâg É3__öOÎ=dÌè÷üÌ»ÿäºk®ßÔ²›M\ÜÙlΞš˜v=|ä‰ßùìg?ó1®ÃƒÙÿ¤u‰ÏvÃP×óäñÓ_Âì?Zo4_ Ã.*Bt @IDAT›0‘›©Gu¶§NhW_2ñ#é®®ûþÇ>1ö‘|Äû…/|AÇsCY^â³»|‡kàBøu0]›o|í{]ÑþšÓrú†7»<ôð’Âëîf& aÚ§…@£L@ouižŠ<:ù-R)XÁ/‘¶Sа: îÃQrâA ,ÓèÓ¡”8ÀÌ»85Mtã(Š…É@˜öT÷MŸ`âžpZf ôµðùIÛ-ƒÄFÅS¤[Ð ©ÜsñUUŠ„Z¸n0þ•¹bW¦p7(†@ÝyH=¶‚½&ਲ਼½â”/PÝg(,XAÀ€ˆ:®Ve9[ž<óÇ„)<º1£_Ð]ðëXê£íË:èáüìÿü ?²ÿ¥7ßvg:rÕju¾¸³¸´ä~ä‘GkÿøÕ{~j·%¢øî‹4·/øºUøå ¸8h}ìcq„°Ó§™®ñú¼[hAï§É³I”§ÑÕ• ù}ÞЧºN}àxlBÌ—]ÌX·âh`cí•\®Öj-ÊÕyè¿&¥·u轪Dämôq•5‚ÿ®JÀ‹Ï†Ù;¼³2= X–·,¢ºðიÔèÃz‡$A”-~¿‹œ~ˆ÷–§ç$Þ•"@‘Ï<µþƒ}2ˆ¿<·„iß-ƒ#› ùÚ.,pvNBñ°„ÉÛ&ç 癀`¡‹ÁþãH” GèCìÓh×#ð×…;A-O$ ½Ô h´?† &€R ¸ þ&½§mƺGhº’0J)5Ôƒ¡±çÀ¬’H±ž%6àe¡%Ç6v½º*6f¿¦ú46ФÀÉ!6àFÑUÈZØš 䟦‰hÐëòÀ³¾e.î™iµ¦ŸO{»â‰7ùpªï(ï,KÎ,3“ÓŸàý,B¥‹¸_Ì :Šx×»ö<Üøì§þñ=þÛßœkŽnù•Áá!è\-Z¼Ñ˜ÒÛØº}‹Ëÿï}îw¼™süÜS`Ìß{>÷kã½¶{n`©ðëÈ|Á¹hš Ÿ‰c²e×UäÙñ“‹s²gçn(¿N2Kf̬õW%Ò_ªÌ"|8ËʺcQDv@[Š9V¯ñùWçX‡po‚Ðqf`ªñXÏÌé Xô¤Àd ²‘f‘âÀ¬Ó¨r`Òt`ú=PwñÓ°0pÔ f¿H7¢ù?1À;ö,ÁÅò´¸sÛÇÌŽ™{¡á<¿_‘†U_ß €ê~¬%ªóšJvŽAç`_±ê x-¾üÉY¥mf Î颗ÛnCÉËAû—þ®N¤R»LO˶ÀòÛùRÑ361nß⦅Ö/ÀMÐÉ÷r*s]*üš%à¡Ä!¿úÖï}…ùç7Hº±:Q–×ëñ6·íܪ$ΟñÝqÇ÷¾ìàÁ/kLàÝkŒú£w€Í‹øóŵòW²…eg3f»Ý¢!G++#qÌ䳊¥Ð\jú+ÞfâOzR40¼ S¼hPv¡©>*þª…1¶¦Ù‚2uúŒé<Ø? sSä÷ñ÷{Hß­LN1Ë;”‡Pstë¡# aUОŒã(Tßl'ödTΞƒ €Š>ŠwæO€êePÅMQH¯Z î \‚é-„ÂïGWà  >7ŠCc²­˜Rd% Ñ{Å¢p36Õ°á0 IˆV·_7Ò³ºÑÈmæŽØµsßÍé®n/‚ýßpQJÝÌ«®ùùåûÙÁÔ>jœÀì|ažÕy<åú9]ž¦`ùnµRtb´ÿá3_üßôVHà\ÍÒRÎ튻)AÌíó4®ÚµSë·ÿéu­ÚËþoÂ/"/}Õ«ei~JvÝ|+‚ä%è—ý¯yƒÌÓ¤3L?€í/z9…+|zdë 7É"=üúºdû©ìêMÈæ}·ÈA¿Í›ä†W¾a7à©É®¯+â¥G`]öÞö*±ý •À\àU2¿0)»¯Ý/Û¯¾^Š û‡¶—èC¦Aû9ÔÐPKUa­1Љ<3.T`(S¨€™@ÆB™€•hÍæW>b[)KX–Û/ço´ö•ö÷ÙÜè–8`\šhOúE!R·«¡G5S¿‘‘…åÕÕ!à~ÐÀô…*ëÀºÿ%]T ¨Ë‚»f}îþùCãã'Þ7?3K†V¨Z uËëx]í{w†^~ÃMwßöâ×ܨ€¦/é‰\†ƒ]@T…T"ðßö‡}Ó›^³cº•Þë9OÖ²V’y Á(·tfÇ= ³O»+IÊòJ†<{…"¼e=st&ß´ 0ÛËÐrmß´àŽÈ8­Â·ïØ)UñÑBü¬\½kÈBJcÎpVëE?¤¯»Q2¥¦ø ð nÙAÝù*B®Xø§ÙÌ‚lÙF’>à¢á{$Ûaa‘ôŒâ¶ôI6Þ/¥©G©¨1Ë7 (¶‰?` 49/Л֦+Î+DqÿP€°n€Áð£Ãf±\‡yí÷¿ò¡ÀüîÀ9fÖ@(²WRM`ÞÔâ8õj²ÌùÚ‡ÿM¯wË¿víÿá_g}Æþw<Ïÿ®Cp¾wªP,Êoßñöè.,¸wb4Afì¦ÌX ¶‰¼O¤÷ŸC@nêÄ ì?%öôÉÂØYúh/ø(Àæp àÌ­Ò‘ˆÆ£5º¡;lƤè§ÀS„ë‡?ø+½õ–Û^’LõЃ”¡@J¥Õ²ó«…b¸â¦]w¾!ÅÛÒ(]%ʰe´7,+àîç3r¤²*g ‹’;9A~Ÿ[tã•yʆ¿ÿ6‘ÏÝ+rófÙ;ºC&þån™¹î*ÙDuì!‰\³Æ`/>üWÅßÿj*ÿ6KñÑ/â"Ü ý[¯“•½¨ïK%Ö½Iþõ•ô­·É¶ë¾G¾øÉÈK^ºOÒ›®–ÏþæÉëßÿ#E¾òÉÏÊ+ßð}PµHÊñêý²ïÚÿâÑD2n¢ì¸N€M§JE¶XxŒÓ^ÐSGQ´•à¨åzË-·ï»ï¾òçÿö_ øîö¹=¯öø|M,ž¨ …×]sõ-ï{ß/~âCúí;Ö\ˆƒ—;“qQ¿üs¦ž"üÃøÍ_þò¼ýGGRý›ˆÆ#¸fÆÓ›\ b[;gÒžDün­z‹¸zˆÍRS:0}(\ ®Oï-1‹ç)ÎYÍæ¤ì—ÙUÉV<&bï¾’Ï@JÆÆIË-æåžGOQC&†àÌéõÉGDÎ.ËÒ&KfO3õú wH©NB>J7Ÿüì)j ’S~Ìg«4 ‰¸fc…¥óR!X.‚ u˜LöÊê©ûIýa ˜>÷0—¦mÆÔï×ÅÂð¹%‘m°[Àˆ)®£gŠˆÔÁ zçSÇ©R_±% ä°#Ñ›n_¡Ô{eu…@ˆ‚kÖ)½Ûêêþ꺨|üÏ?õæwþ”ÿkþ~w§Nñ‹‚ªPkÿ5{oÿ/?û³¿ö?þã_ß½{·ÞÜúXÓæmuEOžÌs¥hâði°;–üÐ[^÷[/ÙÃH,–íâñ­ñ·×bhøÏà¸ypë{ÝT\È![7”늘yêküf}­DJÔ©¤›A¯5÷ ÁïTS­¾R, H?Ê¥; Clˆo¶¼SVHf©7/í“,çš2Iuà\ï¨|ó x&0ïÅ‘©{ÿNæéfü«LN•E®Ý.÷~æKà²e¸_ƼGÂõ~¸Q(Llãß,å()Ó€åÀ(2µÌ]ÀùjvÏKlÃbkóÕ€fúJTu:0ü*kÀCïr@À¥^ù.ÿöÛp½;Cd<,¨Ï¨ÃwÓ ÕR—*›ÉLèõ~ùË_Ö€g;º<J Æ¤¦…IÕ?ÿØ_½á'ßý_»é†k·S>Øð„0@Å© Ùºçª;ô'~t Eö×Ä><<4«Ð¶Ës¢(Üb«µíú›w÷u¥Þ‚¡¤ÐWÂßx夺\¤_Å‚›ã\Æ ÙÓMOym$yÚBÎ]ˆà/3´%~BxCIè³&ÙͳêU<6, b †L’TžRt—iÈIñ!¥Ä9fbžy½ºBù0‰s¥:t`s|ª²@Õá8<€‹NX¦Î4º(2™:®D”*ƒ ‚/Pú£Ò¨‹Ôb@‹Šöa2 ‘´¡*+Í,X—$éE*$°FŸ¼ ü yA0ÕêÏÀ½À¢ÍZ‚à»Abhð“7*­¦•)—db‘Þïí¿(A}=È·ð/‡ï~KÀg}…z†²ß Àç†hnÝìÉŠ{Óë^uá¨Ýƒ‚ωà·ôñ¨ %}7õ ôÂÎS»>rÉ@¢žþ“#ü3 @•À†"P¥pn»®êFÀ93­¦ÎtÓÚÂ6Tƒy£›UI°“òIHßÞø,«fá|Ö6­) £,˜±¡™6…; ª k µ”X‡–¸isð1_ótÊ‘Z&K°J¶ “‡  ï îÆ7—! ™Åª ʯ^˜b®s!]yó¦‰F¢´¢ ?¨Fè!Ÿò Æ»Þwð=±ÿtðòG>ýißîÛooqó‰£ Ò€÷Ò\¬^IÛ/wÞy“=¨çêu‚CZÂ! b[™\Ö’F–“'×™¡Úøª1¸n Ë+fX³Q¥Z·o|Œíèkz‡éÌyð6^ˆ~›îF‚NßAUð¦~^_›MkÛÍ›úž*1®GSyšÒÒfJ®Ä5”D™jÃ2¡Ne²-Ât“ÏÁqÈs‰÷[t Õ¦§:®RÈtf¡&GŒÛ"÷ýó½|æ–=wÜ¡[Ï-Ì*œ–±•TƒZ¢•艪˥Ïmµì†¦KOè-»6wù=ža¤# Ö×›"¢,@T:ûé>Ýë½!t½—§X÷¹£ž_ ëó1·×ïJy|N ¸?jî¾v×®_zïÿõÛüßÿÙ=0;ñ‡¶û}.¥0¨ƒÃ…†w^wàú}‰×ÄÃ!‡q)ÂOµÿšXF£€Á²®ÎŸ>ë»O ä“B© @çý§‚­w! úÅçþè mëÏkZÛ×ìcöäs*;fÃS>·~Nj<è[æÏÚþë;™O˜?úyU¸'éBE¬!@è tîKõ\œ*c èÊ ¤M­ Ð’` n*Q©H+–ËUweð¾%Úוþáür>_*æf—grãÇîÏÿÊïR•Be]Ð×OØœ‘Q ÎAFèàš¹½¶õùÿ{tÌÆX/×¼ü%ý˜È¸6ü† ¬H„(€ªÁñ¶Nòɽó´kzþÏþÛŸ3;`¡ƒéÿ3¬»B±Ä{!ziÒÙÑd£˜vWíÜþ3oÿ©û*û|’G[Æ.•8'n¯xíßÜ“ø*¨·4j%‡Ž=Ó5ÁGékðnmbæ#º¢?¹~Z¥y}U×UèÕkïðŒ`ënæ#:Ùñ_«Í|È:šµ7YWkB±nf˜}Œàë.Ä ÌÑõý0ëú…ú9=Ø“ÇZ;Ý—åÜg6öQu´þžkã8¬7G_£/,FÚ"à·¦,,ÝA}æ¡ÊBc#Šh²¬·ñü¶%Çår¹uu«Qi½ú5ÅwþüË8Mg¹Ö¨e+µÚExôµŠÕ†Q«Â¬…²ôÏ]nž€kp]þ´ßž.f;û¯}–7õ}ýN}V%¡'¡ëß·qsbz<Þ×ýu1ŸÕèÆÉ˜ýؤ›²ö½æxº¿.j%¨fÒ}Ö¿gãf£±BÌI°ƒ~'QAr<™oÔCx}A+žH)X‹fxæAá© ƒ ÃþÅe9ñðøó†þ3Ñgí{§AXÕÏûròd¿‘p –Væfâÿ ƒ¢§N´a7Tðª}ÎùB ‹å\?ûÄç, <ºú<>w3t äo\³ûªT-[øý{¸÷µ( û}/ô{žËýÖïÜïô+ö™øé–™-Ô(ß=kßûÀcn¯S Gî[)¯Œ ¨¯‰ö“Ï*ƨ7®9h_#èFØ*`—1燭A{èAÖ`¨¼aÂð ¸4®ƒêÓv\úPKÀÌöªTàͳ®ëå>åµ ¦ ¢yÖíúZ/EŸŸò0ŸGÏí«ŸÑc©lò¬ AÆÔg2ÃÄ_{à AøijŒ[6UøÀ0á§=ÈŒXæÁý¡i@G}.ã¨FÛèð©@«—¤7‘>ø7¥ƒáVzp³ì¸þú_xô‡ÿŠíœ:‰¶µ8¾l‹Åv÷ú}üF6€f‚Ô«)å¹V]î\{ºÂþn¥²2sz扟>{ö4i笧NÍ‹×ôÛ£;·¼æ?õÎ÷ê¥a¡és¾åÛm?ß¾—lÛ%ùÒ ^ÿlUz&aÚ=56ëʬæ¬îîÕ{@r¨µb[N­†[›×&*½ ôµrå,Â^ø=”×§%†s… c´l´¹uø£‡0³­®¯?Œ@ª`êXñÇÌÞúbýqn•Ý×È™9 ÇxÊä©›Ìfý+$3Ö_”y=ºÎóÆÃì«â‹@«i¹«q½ñ©Z[7Û%!@)@SdØd‰TÜ}»R¸Ua |âé§¥•æ™Nãz`±÷\»ë‡þåsŸûÖ‹ì’Xwz¬K±xC„EESï`ܧ¤a3j¹YîºËg.ÅW]öc` 4ÔõºûïïýÂÔÔÜeW³€ÖŠÔ‚¡Ÿ^»w¨WvŒŽþªÐ—JNXçûmžrÓ]¾K¸$ `#zKŒkT…Dcã==!+EÃL8xyGºQϳñÕÙ‹2@€TltÉ5³<3:IUä {Xµ‚™UuÙx^{uîµn62ŠšYý™§5ߨýùÜat]x6Jdãçµ·ÌÁ³¾¯>骥­ÊE:šç/PXÊ= ¬ÀFYèñ¬qõÊh‚¡mÂÙÆkG8£,’b`]•Ϫ,@J Lr‹g¸ P˜XÛ €phÓÐá,|û÷ïop£]’ßW¯ôb—w½ h%‹Ëqõ+™«–L+‚£N& D7$«ÑiñÙÑ5¸°®_‹¡¹‘þòÏ?uç‘ÇNæ‹/Ea@¼l±ÆUWmKü×÷¾í7õÚø]øõ†{þ—KqƒXê é¥ÐÒm—Fê‘z' I<-7¬S» º¹df]á–nõíi¤©Â®ï G˜NF¶ð¸ÁyÁÑwuyʳù€  >xK¯æÜL¯û²K@ŸŸñ0Ìëïé,z~:‹ëÍñÍVÖÙfÎ]_³ï†à¯¿m¾G·K‚æ<ôyÝJP% VÂúC-!½ÎµÓRKAS¤¤Èô¥ßÒ×\–Zò4ŠÁ( Þ7JB- öÁ¢P@p%˜ŒzöüÝßýÝëô´Þð†7ð…Ï÷²†„›!¡JÔCƇÅVËw¼Åÿk œKY:;vöW&'ÆqrîF^;¢`a¢£[6ýØ[ßþÖ·êå:ŸpÙGBïôïlõ§ØzÍ5=P^ÜL§VÓ†kþ¼x,Êý®A;µ’UÌŠõoÓ@‘)•+vPaP– ® †ŽÛúÎl{Ê Öy­ÛÌvÝG'}½ö¤[ν¯ÛTpͱø£¯Ÿv&ë/u³Çìgv2[ÎS¿Ë¼Çf}[•“QPú1}cýµyf³î·¾n”ûé`è…£ð”Ô„¢Qæë5=®q2¥#7í¯yFÜ×”‚N•‚Ùq3Ïj9XÃŒHѽ¿·çÍ|³œm‡™ÆŒ¹ò²‡kW; u¨³µêÔvPÜæZd÷î+¿¢ºÜ»Öÿú¿þýØÿáîMà,/Ê{ï:{÷9}Nï{Ͼ0#Œ,ƒ «‚Q\ˆ&nQ£ÉõMÌMn®‰ùä¥ñ“䯛å½÷f¹—hÔ¨€ "(ˆ2"Û " ³23=KÏLïëÙÏy¿¿§Î¿gD13Ãt¡ºÏ9ÿ¥–§ªžç©§žzê©]»>3>žnöºa÷€W]‰ãÉÝú•«?JuíØ2DÁ‚µQízQNºÐëj)#åºn»«Âyݲ®pww;jÔAø(é4G†¸Lìå 7š4B¯Ñ‡_!Ð*FBâÊh†`b±ÒMdeTà‰ËhŸ—.íÃ;›csoD+†"Ñ=‚Š>Œ —2æÓÇÏÓOÖÊàÒ‚ž)3™Fj½ ‚žY&¼æ×¤ò— މ'é©@ÊKí“W{©µ `3ðíaÌQŒû€QªÔnZZ³_Ýó¾.^w¥sým0Y- ¾è> =É_ßråJ“¢y SzNÍrLL3¯ù¥:FìÅJLUüZß{ðë¾k×.9F!XÀÜ«ZÖÕ§*«W¯:ï7Þ÷Ž©Æ6jÐSýý/¶Ü“nÀó"Ésª8T¯kHTz:ZÃ-8ÛLàž«b¢¿6ÈjÔ:–\¼2PÌ@Ä­_}ÂC˜Bd~EYŽÙ[±ý“w~®Ìµ˜$£|ÌðaW!iì^šf3¾ÁþŸwf„CŽóNîÍA¦ÀºÖœÜÜvKׯ5‘aîy‚7Æ¡ Ñ´V1®©·ˆy>ŽêLUÄ+tBbÃd§9zï2 r!’J2~õŒvâW> l°Éáͨ>Y×wÓ?½sQd]§NW€©r|b9Ae췶ѨBñxÛ ¤Ù î k=ƒõÅ¢©À-·\9°Óíß³ïЧ†ñÅé©ð¬JWO—[³lå‡)#%]€˜ŽÒ¼˜2_LÚËtEüû$Úb³cÀÖX¹ÃÒ|Ú¿&`È(h¢°Gl/ €Ì³!µ$²kt+BtE³(‚†ø³jÚ€òt[žxY(d“ÃYö×ϰ3PŸiý˜”ÌrÇgææ?cøņÓÛI n¦ùÌp$جŒòɲE¯µlòåڈ̛²ÂÄ‚ù·1‰šòΤ ê ŒFðö+† OÐUºhcüÚs½¯¥©EóÊQLT Q;ª‚8Øï%¤£ÙòF6öå–¦Œkkmz¹²at™/µ–íiù©Æªa €©*Œ\Žavè/´Qbì´ôó =%m0³¯Þòÿ±cÇ®-ø—Œ‹ymÆ@¼´vÅÊÕúÝýøù,ÒÓ¥ˆ €–­=ï- Y—É1fª>ÍA(Ä6JÃù5¢©6´­!oÅD]IÒÁ’PˆQ!`½Â ýIû¯kœÚZ+Ò¦} \â”KéD›‡`m³ËJò 3[™Ø,Žß",ñCz1 Ê”+q-/jõAû÷ãN'¹»÷tì—®9-†¥Hžs¯†â,Mbêe{ˆHUGš&?tÊݾ¬<Ízý#¾Å„fv© }ô^£cðÒ?W4Á­öb’¯/c‚ZY ž[ZÒëž"*jIÖÅϵl–T{¼¸?˜þ¡ SÛ«èTꑯfxÀæ‡_º f?éö’R\ A~GwïÙ÷?–.éû\C&>ÅÀ¯ŽöV·´«ý(ã3, K PšÓÑ /†„dý' 9½çÃ8±`îEöEcáŠK¢õ´C1…¨Ú/±&UÛ]#Iû6Ö\Ö0ÜŸhBv˜ˆ,û’l$Ò©?Ûwít{ŸÛ?ÀFñ sÉ=£=þx âLyéãÄ i´Ê“lÀ™p“8šÄ±ï‰Üptq†@°§[\c+z CŠ­½™¦´@ÚŒCÒ&®9Œ$ƒ?Â&NΤӸ ãŒE'ÉôYv ˜»^ŒÖ1P]²$%µŠµß€ðçÑÎ"Ò6féHRÒ½ÆQM{Œ³ÒFFøÊÌÒ’ŽBâñØ =â)Îb‹óÓ¨ÙC虯^‘ð®Âö'ÁUÛ0³Ø ¾ØòÔ¨ÖêÏÏ‚6ÚøößùÒ’¥íïíîm»¢!.2ØÄb ¶ ¯YÖóÁßýÝß¿éÿþß?§îZI{~‹rÒ ÑÒæ.g]üúU•rè<ˆváp k·Ö„Ë ¿D-@3_E\DZÕLD^ÃgÀÜØÈ¯æ´& ¹L²íµywûwº¯ÜöY÷ÔÁ{/8£äBœS€9ÞÍEí®«Ûo#QÞEÌfq;Â<[Õ†ˆˆ‚étjqòL‡¦\iÏ(ËîÏjAîç—üËqFÚÇY…Ý®µ³ÍõvPfg¯kikw¬‚´4·¹VBR©$LJ#9Ð"}Sð‘^LÀþü4¹F-5|²v€ÔÕ.|´hÎO¤ß@’ LUˬ²–$»š€ i¿gÜöò#÷*s7Þx£½æz‘ƒ*¡¢ùæìsy@¯§Ù™ÚѲEIZþø¥ µN8.¸^¨m«ýÑM¥Ý{¶~´£½ãÁtª)–ˆÕa5±ZÓ×ÓónJø{tã§K 8éÆŸžž¶žä KKÅj:†3N¹ï•[¬ÆL½ŽW5d×((=>Z¾²éÏ4òkˆ\·†ì Î#pÞYpŸÿÒÝý?6]r-m®½¸d5é@D­4)NüÕ>,g<î[wŒá ·jÅJ·bù*·”¶êâTã4S‰T²Î¦ Ú‰H ¨+GDc¶V­`0rjôä×ÊÅ"˜MjUcª´*îTe‹o:»»VäOóJ€ .\ޤ´bƒ†Xc@…£7%i#¦,‰ èç¥èÅME*{ŸÚýÉ]KÞ‰OÄXcc]5’ˆVÚZšÂ=m¿Íû›©¿\ޝ.ÀºûT4ÖI3æÿ¦ý9øì72ë¾W …^ÝÕ¬´¤3‘4sfœ%šH*"5G ²!·†b­,y#xc¾.BzžéDÝIöÅ÷{÷Ûó„vðà>S H~”Kí¦±í휌HŸçhíœtV´¡írWW/ÊAxò\ˉE,å’L'÷턘æ8D´‡m¶SÀÅiÁ(÷D`"º<'ø´6â©'ÕQáÉ—çía)‘©LAÓœ2e¤ê3nå²5îÈ‘C¦{bGåHz´ å»Î®ÆcÑÒþHÙ$µç»ºù(4.©s¯8ãåî¬36¸åëÖºUËWâ@¥×µÊ€ Ç™‚Kyú¶ƒð™ók5ĘÄ/&$A!«ÈѲ˜“Ø+Q<¤Ò¡X2¹šGàiG³è!pBÁ1sc~‹p‚eÚ¨X-È!¬…¾õy©Ià9]ºÕyk>?3½ê©d}%–HÈ›¨ëël߀"ðµØkÜqRÀ1DóâZì¤@P,Çhϵöl¨ŒÎ–]{S½ëìhfù/ÁœOb:L@ºFE?Â2øk…Ƚ8èsñŒ@ƒžðTRCÌ á°ˆïÿÐ"ȹ§ d,h¤åBúC-Š©4fZ1…ÕZÞíÝû sÿåFÀ)“33S®EbB™Í¹åËÏ6é!—à4‡ŒÈcÑÄø(nÇw¹ö¶%ÌÛ;ÜÈØaò*¹3Öm„yTÝÈ‘ŒÎh ¡p=¬¢jÌHz ¹kÈhN ?D*rd¹êZaEBuÕ4C²N»º;Œ1B».ËΩ{ï}‚gg_¸Þ­^³†°Þ½ü¬—¹ g¾m1”’V+²S(R•©ö£T[é˜2I_¸©7øÔ–0Ý*}ІãzÈj½[ì/œTk üš¢`ºÀ¶þ£fìÐN1q.ŽéÀåK.T95Hj™âÖ}Ûþ±¯¯÷7Z›2‘úX¼ÊJS±{IWlŪ¾7ñþܽiÊ ŽT-J8y `–.Ú—/ïBÛ¿ax$çV-]âš9®+VÏü_b³ÍM=Ázt¥nB^ITO„b;ü!bžòñÏw/çö=úÐw, óÚ4¢¹®!=ØBâS‚#äÙÕ¹Ô%êÓ ¾ÏíÛ¿Ñ»‘%<”¯Üò-ÎYÆlÄ„)ðEGQ˜Ø³ù,Ë…øë‡®ÚZ»m¤=ÈAŸÒ]N±² ¥·¶Ö>ûh1©AfË ŒÐû‡2ÏŽºõëÏ’=;eQˆ]' qà…­^Ȩ¤•GaMÏp¬îÁTOŽœgjwè.Ä t ú¶Çv»?ò¬ûŠûšÛxÎîW®½Æ]{Í5LÖ°÷bÁiéÓŒ ¬í<3U›(O5¨µ§Úˆ¦ÒêEC$¾’¨bD8­AGl—ÂýT™†aì¤Uƒ Ä?­.dáò¤üï»ýáGÎ[söwX¶þe•‘t#¢•æÆ¦7¯Ïîvõ±¿u_»å+nhÿ>ó‡ 6݃¦ÿÅp¿˜©}h;{ª6ŽDªò ǃó=‘)Éé y¦NÈÂÀ-›¯LeÊt¬Ъtºà[àrY°ÁvèðÁ/0påKyÜä±u.©ôtwµ^uékÞ(4 X`X~*û“fÁ*@C8¹ ÜŒ­hN¸æL±e ÇlI.Ã!«­óÓõ63—ö´n”Ïܤ°e0ê! ç,°®ŸuÏ<³Í•óLÙkmâm |/Ò¥ÖGf]at‡ËÁ° d¾¾sÛf·sûcœô„­<¸ÛŽ q È$’À„>¼;#(Çm4R–Z»?Ä1áEDwÏ*ˆ7MšÃŒþ]®B—¾@ÌJÊAy ƼӮ§§&HÍ|ãYDߎè®cÌ´"GâЙùRÎuö.cy”ƒ1àr0î¶n˜ ®Â™Ó˘)Ë»qV+®©­Å}üoþ{lóÖVÆJÚ6l#¾o@-kXfʋڒœå¹X_ra^+‹IN”ƒÒ ^$©P}€Þ"x¿X ¶r0ô©@ܪ6ÛgÆoaJÈM•õÀg  Gj¸ ÷Ò³× ÀþÅÛtÒ:€M5Î ÞÊ,=ÓÔPa®á|#¡ F|!¦ÍýŒðEÀ «ø›^µåÛ¨ 1]šï¸]?zÌub\£ù¹ž+®±:g’S5ú! æÆ’ë½dƒ{扽n×ά›ÈþŒayV{õˆûZ‚Šc› yy¿þ¬Ãš²QÈØ˜ÉàŒG„0e`tÎ2zËÔ6†ˆ~iAðç ô C΄u9BL[yç`RNjJ‘Ímg¦'lÚÂÉ·VyùÕÜ]S‹*uѦ¢Ë–:x‚SŒ%%ùº‰a à^Ë‘¬Žã“>æ¦F'\gk1Ôc)F|S Uû%hfkPÏ"i+µe<’ìó{ê6}ý3¹Óe  VÀ콯ï{`D”’¼’1-*ÞK8¨ëlIpøÀ®{ŽZóá¶æöh,­Ä˜tvu6¾zí¹WîÁoïwýn‹Ä‘N&˜P K•ðe"¸Xe„‘*“ü©lýkâ¿õÿkY¹6‚÷,À˜€ÄT`4ÞóœŸÿãXÑV¡Ñ¯H~ HyFåUñŒûßï½ÂýÏÿv…ûÜo^èþ8IðUWºþÙ_¸ ®¸ÒqÖwÎù›D2~è°›Cxhß>7ÂuëîQÙ)€„€ë÷³ÜÇ”~˜ÓˆÓ­ÌÕ; Ô¸kCüoEšÐˆ_ÊC̈õ’¤åhGâh„°c(õ*Ø„]´Èæ¢1ºY~Dœß¿o:¤©ÂîÛÜ(§¡ÓgÕaŸIšRˆ5ê‚ oMgdrüÄÓƒ,5NÂ@¼U‹lLS­§¦zî®ÏC VÒýç¬câôxÜSîýºÿR3à¹ô‚W x;àöìÞkÌ`ÿ¾ƒnß¾ýŒâØì?ÄQaÃXñÕ9QÕÞ©¬ÛÏnÃ`‹3õâÌÁC( ñÐU/»º fÉœþ£ÍNª<»$ø‘R’eD˜Lªg N¸L“”„$âX{H,Q/ MÕ65hJáÑÂ{@ðb¨’¢†ËuHº@ÌÏ“øâwîUîZË.Ö`QYyû*8MRÑò(Œ3Z'_¦!_,xNg9LÊò £HŠß.qxŒÜ9ªãu¬Ú4¦´«û*«'I›'VÓ›\G!ì]ˆ6´µ`,Ó–bÄookÕì±ë䌈æ„‘²ˆ&.GÇ3f®,"W0䪃Æx†Ú€“b'Ý“Ïlµ8ZúÝ+hplH&X?ŸfäèupÙŽùB‰ÜÛè8Å]úö·¹ÿó_·º±÷ »Vk”yöˇë/»àê«]e-t<ìμêõnÙYg»ƒ»·¹»>ÿoî÷þôÝ_óWf»ð»ÞÿÛàóè£a^swßy‡»ö­¿ê:0Ý}ÿ‡~Ͻ÷ƒïu³ÃcîË_ý:–¼YÙÒ-mŒ— è¾Òõõë/¼æš³¹ãއOÀ(èEµÙI1€ý#ÊÕuA¾Mmì„›ÉæB…BK1fÊQH© O,ŸpR "œr/‹>Df¶›[¨Ì³ýºÇ~pŸëêh±sø”Ncˆ†¬ââòÊ»*ê~ü¹‡Ýè†6WÅ®ñ+[\¼sí¯éqÏÞÿ]·êÜWpGÔÕÃ]Û—,AlÇ@xªsIì–n\æŠH ’6–wv» ëÏt?þáÜE—½Ú½lÃÙ¦ü cwÞ¹ç@¡a÷½îu)$›ûï½ßÀmëÖ¸k{›ÝŽÑ)÷÷˜÷f9p矼–=Ë‘×eŠU·çÖ'Ýè£npψkM@‡´v$]粇¹óßón×±vûî¿ü£Kv‘öN¦è;jÕc”§0Éè%éxm¿"rµîÅt£ö“AÿbªR.¥ëC2¶9©P™PßG˜q‡„b¿íÜ4ò™A<¶x\¿¤CO?ÿðÈŽí>ç‚|we‹æEbåž–öȆöÎ`ÎF½»àá¤@°q‘õë¥Y¼T÷d’UFgv¡¡àb Äô¢®_³Öh%桳i̹P\!3¯l9ìðÁCVéúTÚÍŒ@´RŒ ±IŽ*Ù嘋/Eôþí»žtî.ÆÏ?Aü²[‰iº~Ê}ù»w¹.ÎÒh\u.FD}®{õ7qh¿ûѶ»«ßÈQáÌó“ç]àæXâS¸ð¢‹ÝUW\á6?þˆ[¶f-O° Ììø4«Iwht”'%÷Ö7¼Ñ=ýÄ]'ÿ^@¬×µuÀdbnçÔ÷f–qî̸m=u®a¦êZ—%ÜÌl$®ßàò×θô·¸©ýÃdv‡·ípK^{µ»òw>èÒ=®{ù÷©ßx·ë”åž¿­|kÍíE$xÌcÿÓ+­0Htyë£?IØð SÊÜÌÚSѶGãÈ¡XÝÚµk‰µøa“Î.$pìù”`Ìò) 1‘¨£±Õà¿ôAu8Eí×O§nrw?º}ÇEWOîÅÕZákH%•NG2M™óÕLÔù§°\åú³á¤@ † ÝÂÙd}ªœ›Ã°©“= €À¦õ3…ÄÍ¢0IRniD÷Kz´©š•{1ˆ,âïþ!Ϥ$Òh¦‘Ì…Åñ%—!–Õ«;]”üò,AXyƒ;‹ŽßJ¸›†FžÝŒuÝã$@\'´56¸Oßø'v}ß+×®²ë¡}ƒî©-OcU8æšØÄT˜›aÒãnIïR÷ÔOžp×_÷6—Æ´yóÃÙ†¤v_ ”7Øç~§§×ubNüäDÖ•»›]å¹Q÷ð[Ý%ïz…‹Ìåg"ºžózÝšóV»áQ”„péÈj·kÛjøNºýOís¡TJçãí…¸ÿöË£Âáq G°XŒ£/°×A³Á¨<#_ 0[zåïA¶ÄD‹§-ÒiúšŸzʳæA ë$I2b¨tÒÈgò4A·øÅ²HwÙÞ€¹ÒÜÜÓ¥B~m%Õ`KeQé€JœKw‹· @ž à°Gl¼Q€ëdÒY ³º…ˆÜ¼ÿ2JáBø6"Q…0F Zý•?½ LZõ\,Õ9LjŸÜm–->ÑŒÄ0ìÚ2óóãÜf±üé„ óâFKI ÄsmEŽÕ/q ø)–X,¢(£OX‚E^ ¾ Ú×™ñ1·rÕr÷Éø'û¼P+çfÉ•GûG†Ýu×¼É}ëÎoXÔ?D9ˆVÁMã?à/¹«ò­îÀ?>áÆXß}ìÓÏÀK.Ó×äfÆfÑ ô¹Âá)fm_›|êÙ.=Êü/œ›ÆÆGŽ( X*áíÛ—ËNŽsâ0–Žéf Ïö^ž4ÐüšˆØ®*?)¦–Š×ß?ì3{~¢¾v!Ä‹³‡t¶A(‘”|ƒ¾›‰h´ñ-o¿ºëk_üâî+¯¼2,%Ùƒs²ÙŸÊ¶«b“!º+ÍNÏn.ÎåÞZm2 ׺4¬\wÎ9}[Ÿ|r›„ÔÉ Ú&'Ài@â ê§Ðz܉:–Óp¤QÞœm ÍŠèJ»ÄSÅ·0©5vpÀF:]JG azrÖmÛ¾SYÛÚ9²ÌÂÈÁ– õ\ÌB\E¦´â E;,î ¦£w@U–ñA>U®ƒ`’R‘’X_ñ`b]¹j[qS¶?Àï³gžŠ„!» tnùÒ-–W=]ñȦ‡ìzùÒ^—ÂØç#G¥âÖ@ÐßAy™Ù‘sé®·å£ÕBÙÅV÷0ãû¥ï½Ô=øéï¸v&*‡Ýsîõ7ž_ƒVæõ”{˜¹!†ÿÄüz ­PÕZà+ŒN̺LKæ½’¬øW­^þŠíŽRSУFýd€)¾RfQtšθ̀¤P©8(‡TľQë)à…AAü6hnn6CFHÃ-Ÿê¥ý=66±w†ý!­Å&Á,&#õ¦“ ÍkV¯>K €6ùeeÖ1Ñr8Ü8R`äo¨5µ³ ‡ fåE›¸4õH««¡«V:@ÄÐ\”i˜[Á¦Ø=vÿ÷0½­3m¸æ‰¢iCvb‘•0?d (Ác‹žˆdÄH¸"‘Ý$]ëODõÞy”ËŽˆüÚ1ÈI/ÊGyZ^Ä]³FS<Ø"AhÙp ³ÞYÄñ,i×D‘hÈ{šâ—3õ(-«ƒù”Ñ?´›DR ££@yâï\ÞÍ Ðmc'àà^Çn ø?´ÿ ù+/R”ʵ*.éEχхäpR*x¥-¶Fј, ù:qo±áŒúE²’µ š‘Š4§ô™ùhz´(aíZ¬¶àçßô±=½«6hÉ®â>έ\Úí¾÷ͯœwÅú·‡B­ê ß­‹áâœ08~`ç0K¼}PC 6ì Ò6îp{† &'æIåx“Ÿ„0@!ÕÎU«ZÂåP»Î¥mÅ!†æ¸ýñýäÑL(G¡ —mO„ uË#®DV³¦ƒWÂHF!•jÁK|"}ó£ô6²éæ¡W¼&=˜¥¡¡½È–¸Š¯+EÓÒèÞ$cB*Ý1 £) ·úç^–‡ºÜœîb&eäaÁÑÙ<À'•-ï9tá2ùr_˜óˆ1"^í+{˜ãË™é´[²z©{üSŸu›øô°Šg@·Ë±‹Ð–õ ` WÝØœTßrûw™Ù°ñƒZ›PýÙ-ÑÍ ­¦Üë­Œœ"¡¢T Êt1¥;üäÿVnÏã÷w‰wâ¬IÐ,òìªÍ-M¡|±xÓŽ-;ÿrÓ=·ß÷ÐãÏ|è£ýèpµ:@—¾t™@ ÝwÏæ¡×]õÆ1Ú©…é>â.+W8†IÆãËÔQ==='Úg'ßèPeèßdÔ³—¶ìÚ:˜Ófgª¡)–ªê`r]î˜ mE¢¼ê§+Ö¹félöóU¡DƒH=̼\AeØHm)á ¤%[ø$“~¹õ¡¹îI#½‚þŒpƒ{{Y#~žy¦ Øµï­¤½Ó·eÀ¯bèÞVÆÀÄ(´Î®2è+~¬DGøÕ(zgWŠ¢¼,öóK_¡1 i 0I1Sˆˆ>;>ëb]ø $1ŸJõÑÓl&‹E˜™(Öτࡉi±«·þë?ôGS ŸŒÖ%)OÏM‡¤Èk?&ßrS*T«R…Ë%ëoþƒ÷¿½c ©Ãé êÅZïj0‚ §‹Ùˆ™rÓõt;Le¿ïU„šIpwA~›Ž£ˆ`0B}‹Ô–qæµ9:µSØz”k"S™|æyÅ@í8o~…Ìž¡RM¦ÒþÏ#>oòxÐÆN_AÒ‹0Y­BRè’. =ãׂ²5ò’Ô€;®DÊ%›0bo~=Zó:¶ßê„"jG‰ÆÞ{Fテ _Ã}4÷Öé?:ÎÙ†§Dj›Ù!da«†\Zw‰%)xbµ8µ'R$ú8<¥îÆ„,ŸFòKZë·úòcm¤÷žH)‰ç(=@a™³çžƒÁb¯¬mÔ>Öf<LvO1í:m„4[®\+×j3¹gUâd·Pô½úOÔÅ3éb<*·¶7Fû–ö¾‡Çî†E2„QY‹æKÄUuǨ˜Ê³_š‡ŠÛX¬juå Óè|îÇqqò™3µÕÖX<ÏTª¹2JLJƒ!hPH*úð„,dRzõ,U×ÂÛ#Ý,6õû†¼BLŽ9jtä‹âˆÅ2.£Q»è£Ö!ûíÈKÐþÝ»ÝsÏ>ëvoÛêölßîöïÜé²SÒ-”]<É!:°”eÂFÖó[»z\.|›Ú:]¦¥Ý¥0è©Ci®ÍMÞ™©¬•"  tŒgþ¡=óì¥ɈYpz†eR¯­]”‚´Ê®‡|Û5Òk¼¯ë; •HmëiŸ¼—ሑ’0Ï<•:+i§R-,Ö–àþþ~:iK©¼Ìl…umðØüPiA«z{›j‚KÕ$¦äé×ñ:ºþzó¨«|^‚þl#ˆ+TŠè<¼×jfH¶À #óm[½AZÐêÏ#Çñ–’Ë­u7 Ùš[ÆÕæ 'èÀé¡@L{YÒ’zº1$Ý£oŒ10Üï´`–c»ö>瀌‡Ä™”Φ“ÍŹ“X/§©Í† Oö‡÷îv—\û·tÙ 7Æ®¾#ÃCîÀ®ýîÈÞ-˜ÓŸ¹¹ Ó›º˜ÝP—`ÔöíšÈV‚+¨£ÚΈRõ9Ó·vн°J(†îì[õ¶kÕßRø\í¡ò c½Q0¿Z’DTñåX*¥Q~Чií¢6¡Ñ¬í, çJK¸¤s0“Xœ@õÔ2 C©’B µ`ð‹I j‹Ä¯Úƒá,#nj;ë5×¶>ýÝo>Ý[˜U‡… 7ZäÊÕÎtt© ­À¼M+7!We ºÇ8 k"}¢ ôÌ3·p4•¤Û^«ƒ,µ57™Œ˜ã N2÷A–é`Í‘ âü "héÔáBZ \kÊ0ÆvÙÏ>íšRBf8 Ò˜EÀ8„.Ú³ÕˆŠ¨$LвñH»©$ZêŸý{÷¸ËÞüv÷Æ_ûU3•Í DSÄMxý,Dc|ÄÝ÷­;ÜlÿE,G¸iœ‚N ³]øÀA·mÇÓüî7Ðz—ô ¡ÕèFØJ|ñmÁïù·õ¡¯‡¾Çñt- ¢T]5•P¨©CjQ!òR£â¿b«‹>ÿÅ!¯‰Ñäm$Ež"&]«½Å8ƒñ^LJEã”U<ÍÀB#“€µþ²:£«$å ì’e§1ep[%[z#þ1}+"¥z®{õÆs`w··oy^+Ì7Ç¢\Ôüó©òT‡ÈpÀ…p5%‡1œ—®àRü†1ÞZÁòíîñùÃwOuñµüN„¨3ô©®l¹ô¯ª‘øU¸ÿ*'âõ‘B‘+lô±ujÅ0§Bt¾‹=R;jÔ&D¬656—%ÍpX'+ä.ÁÜÝ x”\íîÿ Ã%‰ÕúÝûÜ.Ò8Ûš»oÏn»~àίcûÀ¥9 3É.¾¦Ö&|öáѾ‹YféY¹Ú]öú7°ß¾Vq ÁÄo†QDŸ¡¹û·Ã}ìC¿å–®Zɳ9¦  ³æíLOªÒÀ£lYø£µŒ]p)Â7ÀýH§v1z¦,Þß"`jq•ÒÚMRï‘ F¢vRÐ1Ž£¯};S9TñLEmL¼rÀ¾d7å®ãïVmã\À@Ù€=@7pR|h/+>—ð@\"WT/¥ 3Þ‚{ÁÖAŸh±µ¹-–‰í{ ¯îîï¿VðMµ€0¿PÖòâóBïNÕóRµÀä‡*ò/LÐP‰"ºlãr÷©*æó9 L¬AXË]ZhFµJC2Ãb3KwÖÁ¡¥à³­¼ªÄ ¤ä½.™È;T=« ufÜl°ç10ŸÍyä礵ŽhT)D&ZŽ;2´ß½éÿÕͱt8¸нöåç¸=ÏþÈýà+ÿn½`èY½Þ}ÿ[ßį˵t·¹Ö&9îltõ0 ™Û¶à‰hšÓ…,À™KS%7´o±&‚ñN´…å@È*†ïC~‰h8/WJyÇ$—6€Y€¸VWu°Q€~çŸñTUTÝ¡VO"ÚWú¡$…9LÄÚBi”´Æ ucÙØc±îé#XLñ‘ñö¿Êðá `i×%t$¸Õ-x%(w-×t×1¥t ‰ØUDoäv’9° ƒˆuZ‚— KtÚH¶3þ°\ú, AtMWÜ¡…¯ó 0€zÎw¬ºQhJÄB³²5‹ÑV‹!x´5TD¦3o¼4¡oE!¤˜ƒGNhbž ¹Çp¥¥à· ÏÎ#ÈÑ’— » øØ·{·»ðu׸‹^ýjÝ/jirIdßýO?Ž"/Éq\k1³•^m$¶‘›¥'0qVt?Úù¬•÷‹¾–¬\榎cÙ—vKWŸ…ÓÐawà V*öý¢TGßá¡Ð5áíרº5‚'Rÿ ƒ`äÓŸ‚ˆØÃÌ»Ú(µ-ÁHÅ%,&ÉhqK'IDm©<,ðcÓ/žW¢aimÇ0@·^ÀN ôD@Ë@š;œ:p€Àƒ²K­QÐïa‚ §VüÖ;?°î_?wó#/Y=À7ZWŵ4…ŠTýÐ\›& ŽŸ\‡2‚dãÆk’¹j¾[£‘uˆuq¦€ô¡¸½TŠ0 :‚ qU™Ú(âÒû6÷Gó‰X/=öX oóˆl‰”ÌÒ*˜®Vp’)q‡#Eüõ•ЄXœ˜s³ÍãFìš’ø¢™d¬œä+âX†æß¼!™H¢ˆJ‚¡ôNœxn _ÿìç¤á3ÏYç~íß`¾¦a,yÉȶW׉£lôç(3Ïå±Ý0.öE>ˆg ‘ÓnjÇ´cíÂë ¨Ž‘/°¨Šµ–ªµ TuØëb²'šš“–Ä ¼·%n,ºÒ“#‘Ÿ’i>)êSt¥YŒ â˜-9. Âï ˜·ð[u•ZD°ú8Ô €DË푵«z´è‘ö-§W°`mv9 EFcô&@à($#‰ ¹ƒ²_øpÜ à:`‘YI–RÑB4£ýé)ìßcÕ¸K”! ¶yÚÈ$°éUÄÁ­ÓÑËVÈbö^ýï™ýo"óÌŒ×Ò›Ž@ öcñ½²KÇ€Õ³iF¡µ¥ÅÞGY7=²k·K¢Ô[sÎÙî‡ßû6ÒH=Ûmu‡—ó •û}¥×5»Þe½®½·Ée`V3CY×X‡×áœÊ2T@V\P–~G­ªE±þ©ŽKã2x‘š´`ùÌÄ;óµ:¨”>dspËr>æB_b{I範f‹Z¸ñŠnn tê Î¶ZóË€!3ò’¸ƒLüb^jïÐXM°hRÌ)jŸê ¿ÚÀz—F uKúTë &¥MЕ|Ï ™ £Œ1ðQò³á€7)þÙŒ¤Í×Î4 >áOã•1“ÁLd)#µÞn'ð2½A×U˜@÷ò3BB”1)AÖƒ’>D„Zs*¢,,lÍ»[Ÿv[k…7á’¼Ÿ€RªNb@é­%æA´6±;¡Ö6¾1™òÈ”FmšP¢·~ÉTuåa±öS;{†pŠ Ï¢…ññ{@¹TÝSŤv1ÀÀ  ,_By˜Qñ¸Œ4\Òíž÷½ë}Ë>õoŸÒ_!.^j¡!^Ÿ×á1Úó.Çxb±Z•‡ïb+|  Š4°9¶Ns&êâ!ùÒ‡l`ñ˜Øê×Öñ¸zT]æjÄ’{ƒÿÒ|BäÚ4='SWá3ÒD)”6ãFb9?ÉèÞç~ãm×¹zÎõÓ~^‰… Ó‘,3ìtVòøâŸfËî,~ÿ¦p¼1>1îÆGGÜà¡A·÷‡à øxBœiF;»ñêeœTRaMÞ$ |ÿɆÁ–©{4‰s’•1œpdÐQxf˜dîƒÐÔÆ›> ÷;Z[#ÞàâRõmàßVŒñ¨…EüjGkm#$1KÆÀá÷5( Rñè)W̘a¡GUáØP.”Få±I.A-Uàú/F@äSƒ_½Î¥Vš›2ÑÎe=góGÝÝÝV½cóþÏ|=0àB||ÇÆâÍšûè< ÙzIq^¨5¶©ÃB¯€œ0Ô¤´X–ýì¸ð i„L`ž+]qySñ¨W %­wkW -e…¼ nYÌU9Î+Ë©= b2–ˆ”fG馷uËVwÃÇÿ†3ôz9>«™£Èñâ›á“æÈîzEK²—èhgï=¾û1é•ë1í@¶3ý"4«¼ i3Jÿ³ìAÀT4Í–ÜYNšÄ(iÿýXÜãžÙ³Ïà:Þ/6¾à½8‰KoT„ß;Nô‘›´@ªQ·‹€õçÃî€Ì%ôé™ÄTDäâž¾­"!ïJKã¿bêiðmTĽQífÆ7zÈu¨gõGq! ùm¬³3‘=³ì„„ñiÒB8Ê| ¨.á—êkU i²”ɤ£õñø¯ðöóøÀÊœ°kQ__TCV’#‰&I•Bæ×ÎM¨æ ˆE ÇÍ‹$´î ñØÕƒÜ:L„¤‘‹Õ“µ`#>}nKA¼÷t/&@÷û¾¶Q±ÄNÀ©É9KeŽDÄ$D´ bÂe>BŸíä¶{ìÕñ|-_³Üõt²ÞÏRa“'õ60ª74hÀÑ]uI×Ú‘q]±n—´ C¢U:E§øèä^&T†áågç²NúÚæ¨1|"aÌáƒp”sŽ eܱ›ãŵòv|¡ÃN?b»0õó-'²†àŽç u˜:kÙÌdD“²ˆ§ÁÓ^²j´e5~Õ‡4\ÊlM|ë<_Óãf6²\®Ö áŒöù'‘dž ÕP ÍSÙÌÒœŸø¶i1„ÊF̾ëíZP&]BSÐ ¡+ÿm@lÿ+Äèí`ÿ<Ä)ÛélÏs ÖˆH0¥sø Ì‹÷À,ô9ÞPß™q+:{]W»ŒƒšLÊÐÑaÕÓ0Ž:~[xW×Û QjdgË-Ȫ%7HfGb#7Þ…"žƒ˜Úd瘞0E™Fw15‰ÔÁÖ×1*Äúsƒ´ÄÁØù@Ö*,‚D¥g@D,Öz'¢ç1ºÀâañ¶Ð ʽv•G:«¤âjaCàñ¦831ÁQ霔Pn0Бõųh%ð߀iAu±ÓƒUÔ2að+•¬_~áåW-}äþï찚לÚ`ÍG–5(Nmæ/”Û¼Ivë­OÔwYS\L¶$cLKÃa‰ÓQzU„(eŸ˜ƒoOiÿEÜѼÖs5ì¥oM,DÜ#m¾ê*ƒÉ„íú›_:´|Ð> ˜Ó DUÊÆLòT¶Â,‰úú­í·¶¶ÚGªE½ì•p ˜gH'%ϵo Ì'Ÿ+¸Ïnw[žú …Hf¡{e·[ÞÝÇqbm®QæÆ¸ËpúoCC’}œ•À±OÉζN£K¨Â¸h”`²e»ûè áúúzétHŒ·~´\éq>JZƒ_µ¦Â¼²f–nEÒ8(ø)‚osé'P°*Ù¢†-[¼ÓØûò]C—\Õ?Du×K5b XGxâaV?ªv«º‰ÓÓ©ºDºÿ¢ í5°uðMº9ÿ‚<ƒC?ÞxÑ%+ë2ˆ¢ÌS‘Ž˜ —Ù:]pG …J~ðàAß@¿ ¯ûê¸@0ˆ ÃèHFßP‘5-NÙÞwzOÐÚ¨Å{)Ƭu%ýéŠ!­¶ÅÎ3ƒo@ážÉis_kÄly)²2ô]jLj2Q6¯WdDFýØk¦"Ve—ðþ«e?ÙÁ#ïçõ‰¡6µ´rªoŽ…´™/K)o¦»¼Õh瘆ή.˜óÑò¦Ÿâ„Ð1ÄaÚæJÝ講‹fQ8ŽìrCÏ  ÇóÕ±¢Ã­èZÂÊ@•s8a…/uR5ÄûTeµ™ê˜·mÀ¸I«KÙs‰õjGã>"TOJKÌOí×à@Ù¬&NÂ4h6%XøpŒ¤1ƒ7¤¦'kh0A`[eŸ¤vT<ãh®ÅØjC1CÕ¦Æt¨£¹c%Zx¨¯„àÐŽ¶ŽuiV¥wpEQŠàfŸmñ(¯s¹ÁÅ‚æ¸kšê2WÉîÿvWG÷ëè<v|N±u*ñH+‚´qH©·¾*Á¨Åž Ù¥×I1\i“u\šÈÂ_qXˆ«¥ÁëcôniÏâòPE¨T=¹³kÊ-öàá9÷ê‹W¸Ë/¸ÊMrÄÖýìBi¸ÄíØuÈÍRnšM>vŸ’”1>›Óœœ|)Cs~Ñö)œ"4Ì!i·¤µžŽ*àâÛü!ºöî.tŒîúP¦–-A‘Ÿ$ --–ÑsÌ1Ò#»ØG-ÓÑÕÎT‰x­”%øíFéY\Uˆ‘/O˺Á×] Âñi3õ'"å†äS– ÖD»–Xé.Ãh8¬¸¯P)_$O€£õe 1ŒàU+ßgú•I3Ï#¥†TåWáóòŽÃôÅšhá _œœkZ]gºù¬ ¦íH¬¸M(…i¬gZfÆÆv ÎTPã,h8nD—ø“OnšpõË>{Yèu‰gÛâgKJnEE¡BS(GWº´%/[ÿ÷Ë`žøIàQ–¯-¢‰ñ"?¨B†HBefò#‚ç¥Ë½PAµ[Á éƒ8¶­:7á6ž¿Öõ-é`›ï·lY·[¶t‰{ê§\º»ÅíÙ{ È« ó›hŠ9¦$e׉í8öɹ«¯:ÃAÇÝ“{GÝŠö´;21ÃÑÝî»§ âæèoƒ/ pø2éâU#˜K7ã¬ä—Ô¤iGŽO,®¥á’ËKuÍgK(*Ñ ™øL•)ÈâÐÇ׊¢òù&N ÛƒRŽu8Æ$J²h!؈;óƒEꙀњ~ÇpD½¬HQ‚ߦ‚Öx<ç^‚“KÎ5ÀG^8|)QãÄ+ÀNçÆ SÕvTE2{4[;ØÒ /ƒŠ*„ìª)äÞw÷Ý{õ¾¿¿¿ÂÀ«Ë 'Š@?‚4Ä3r_$wUFÈÖ©2Bœt¦Ð0V#W&ºZ<á'ªŽ¢ü¢ú¨¹u€&S‹:z $ãóð!:ŠÁ–#È1xT2ä×äB:•ÂDxƒ52ÒIX{h»[ýò—¹£ñ{~ï îÜ5îÁûŸr½}væàÄøÕ˛ܣmwU–»9Øó©gÝ3Ûöº·_w…»êò³Üðá1wäŸïv;wpý½Ü­]¾ÔÝüÅoºÞÞóÛ§‘_Ð XI-Bpµ‡¦DÞkÄZû<^[T_«w­½ôPG‡f‡ÝyV¢K`‹¸Ò1]Rž*CùèZ7j‹ ½ô@«2dÊUpE¼øëµ—©s¤=¬Ud\Œ¡l„ñmÝdR£ ÕÕAWüÑVT ÞÉ2jª¾uíÆ™í›7’ŒÅýÏú%)†*Ü”JfÖË˽…MT¥Œó–Èt6¿‡wÁ*€o˜¬¬uÒ ç?]á˜:ö$ã6¯c·µ´×tJyyS#1ýi*â¾ëËAM€ãÚzt!Ú !2W|Ë@™éõ©=#A)Ó3ÙŠ!„¡—À‘çÔ…«~òԠۼ넊û/Ì„[ÙÖ»sϸ;ç•Ýù/_…GcÎû{͙_æ~åÊ Üo\×ïÎ=g shŸÇ*Ž"Û²}Ð5àRìÝï½Âm8ë ÷æk_é.»x••¡P*UpzP¨€™¹±¤½°àa×åÑxš|ÈWÂ1ÝA4I Mmmx_•¥˜ˆß§· ê«‚ù°ÆÐàZ e1ÒÊV8‹„óV¬EÅlþ€¤ú ~H-ÑËÐ*V__kÕ„gêXØanJRËÆB‰ºÌ®¹ çÎ&Æ‹^‰SZà&ëÔ¶ó]gcSºC»_åìZ–¥y–—§'³ÛT}¹(ýuBÀ¦ !âñ†¤eŒåé6y’gc4Hj ü6BÓiy rÒëUR_ʔ㱠äÆZ•5r õÊF8‹&DÑCƒ½'ŽGê9‘%2[v<£ÈY—ir[˜ï’sö†'ÜøøŒË°“q„µüÞÍ[›8Ü$ù)§åàDÖ¹’ûÛ¿ù‚›ÀG!ÎÆ§ì Çsá`~í.¹`­ëäãÁ½ƒö>jE¾Á¦F‡À&ˆ˜taÏyjìz6CMaAOTmBŠaè$…¾ZWÆMŠg¶ÔÓÚ^QõŒ4Lp¹PÏÊïÜœœógôYŽ ÿµ¥¶‹o|òðˆ–?›ËZÍš´€lðZÐb’TÀ0Ãpß°åg]¦%’ZÍËç‚<ú…+¡»{-½´É½åüןßÑÚ’’‰„H OÉá™éi–ˆçžRéLÙÄ(üè³pàÔ4LÇ[À¦ÚΤ©r:Ž|º±ŽE´S硼ªË#lþu-QN›@D¨"F1‰º†¨êd¸½ji­c»ÄŽÄ÷iðÞ¡Æ4 5¼Ý¾˜£ ަ[Pâê§öíe¾¼6ŽíúÊí±vŸr+Wô¹Ûî|Ä”rõ­8%zr»{ç›.µ-¾?Ü´Å­_Ûî¶ï8â:ZXëg´ïŽFÝÞ©·kÇAwÉyg¸ÝÏp õqwÙ†^·së­ç¹u«{ܾa˜J’ÓÔ›DºQkðX ж¸rƒeÒŒÞÔâûXDT\}Ë‹œ¤kUJï©Odi<·Q c&Ê_óëül=@ÑÄÉàˆ.‹´_¦{ïä̾ ØiGª•zÄ\Ž,fSƒ‰xÔ@2?Õ‡ÚPc4V,-µ6¤¢Mõáõ¼¼çU‹÷Bñæ++t7»Þæ•65¶à#I8S,#c##¹ññ# ¸èØ:žàܰÇ:Wš‘VZ'a°¡i€í:׺³vøNU7ªCÕß$£³5r[àÇÞ<†(Ðð¸fì <Çq·^(¶pÛnké=ÒHüWÅPFÁຖXñD(ú,]ª# ä¾¼äZq` ±·@RðlÜýÝ¿[>RÞÿ}å¬ÀâÜ“®§'´0møì—tO?»Ïm~b«»üÒ3ÝÒ®÷Ct—]z¾kÄÂpë®Q&uhë `ƒÜ]°ë™àQЯ¯ƒ½AÌŠŠÂßüÀ*¬%2±Gç:Ù’g>,;_kµ±]Öj«>Á3G}P-pæðxÁt=CCz»h!ØÁöµÏݹý—õog 8ø4cpÄ·‡½×‹Q €)yõCÙN$b‰u|ø?«pu¶>Œ?ÂòvÌ“FfÕgbèÅbÓ–§?Íl½ý®»¶*ÅÂíÿû)xjöÓÏ~Á]°7¹‚â“MÄЙ‘]¨jKPª2}'K@‰éM¾ðßc ^úk ‰F|®KàXó^C`I&5;ö”CíÈFZÿDw¾ÕçË’¨Ì¿¬9‚J¢±J³Xa–´Å¶™}+VôºåË{aíx–`¿}O¬E%ôö4ºÍOíu=K:ÝýnwŸ¿í7<•wŸùÂnó3{\wW†2 P · 9¤4&ŽšänîŸWmd1E´"^þÄ$ \riãœí+ÎCAµPc´J« ë‘þ¸ Éà‰iÀìá±áÓrö¶6P4?ÀPQøÀŸ)ƒM×!&PCÁNlÝ+‘9ÆrHF&쥨[£¼8-WÄã+«¿Üágàè÷ݹe éæ5¶C–Y4ÇÆqJÒ¬ž™y„*Qê¤dßÙ \Ç ã+¦?f†EL…|ÚW·y+5ßqA–BF:•f0D…ð„æþs´8Åñµ×ˆÆZñÕnäaÄÏ%ï58Ì#¹%Ò×rãÞZš/Kj7Êß—oÚw¥ÑK>"*Á®ðO¶þŽ/È7+ô 3Flæ—犫òIˆh_vÝiDµ²é·|Yg¸EÝòe=®­™S~YrSiL!ø á-{%aYóe⼦2JfuS&´€ÖÃÅ)<‡`2nò)ynIü{µM0½²,x\f .V“S_ýê¿ÀüTEžŽœÎ¶e1hÒ²§oØ*m ¶.÷wkØF ä‰Áˆ5…¶È" Óo÷ÊËßðMÄ¡¥„_ö ¶öq ¤¯rýv÷áßúõ—aÔ¨U)E± ޹Cc“÷)€ªã¢ô—omëD¾ªø1BqÒã ­­ v<2Šj ‘AzÕ@©7âíz®{#T¸:›Ì=\›tlÅœwöǯ”õ g"bø ,/+£ÖVÊ߈[…(¢âiú"4/qˆ°@µüôÎÚE Œ1gã9AýOåÊ6[[è@!Èd±(j@ÖFO¥Uв§ÀãÔ+ÅÍ—*Ò|Úà˜YÑ3”Š•â§ýhm/Œä`…a €¼ýéRú"z^ÃIQnmͤ^{Þ9ïÐè,ÅbVà•»‘*ŽmI÷«Ú[[ÔÇìj/„ lþ›¹ç ?¤÷‹a¤rN¨1û-‰¾’øñÁà^4wšÅ­Ñ‰BlÃCi§ue¿ÂYOžtï;]ĉ(-)ÖrWäçs±gÝ´Q¤$±–ü­ VT¸ÊÔ¯à°2‚ôÜ‘uø"4 ÛGolª"ñ£™ Ó!(„iÈ)à4åNÿCPþAÃywNy•»Gbcw>]­Þz7ßäe›˜ôβV*OЧ;ù+ÃШ“‚š›[ôX\ÃâË=¹‚ò±Ð4¼óϨæˆ1…â(Om$bäô/•h‘SÅX{$›–và Ú˜6ÍPR¿ò«–À´¦œ›­³$úz:ÿèËŸùäåL wÝu— Õ ÿií·Q2ÓܘzkJ]mÖÊæòU9»™œœztÌíÚ§zaüó3ÒÃBUô„”€›6`Äê`ØÈŽ@Öðµ‘I*tÔ·'Òðk¹ŠÉ®RžtŽâ¢âÊt ÇB)Ø9£ÄןÏIOÉ_æ´ˆÀ6RÒõF@ ˆE«Å”MㆥÕ+²C®h£’Fd–­Ùs­Q½Bž B'!¨¦ rÚs#´c Ð„¤‚Ã[°µ¶l濽؊ên0 Û lž žŠ_ΰ·€`Ï_pbäÖ]²ëã´‰Ï&Iðyˆ”€;Á¢ÄúðF@òÙˆΠžÜrË-‘ÚüY·‹‚5ûO~òï[Šs…e‚iJLXy@U ˜vð¼M€™´G/Òj\ë[zæh¹!•Œ¤›¿pçm·½åꫯ~\qüñØÆKÔÿ(BéE-Ô˜„*œNËÎ܇§‰?Ìç:¹Û ÉFBïýó~;£'ˆ{ Õù•·½íŠWtôö­ÔéVLÑ"3s¹êБ 78>}—ÊÂïhÒ#¥,p8!@…6ÛzRt´Äs%ŸerÌâ9óe `^©# ñˆ/$GÎá•D?!½ÀÇZùyÐvØtÒl=À úɰ٣ 9Œ0„ô†<4bÕ»Z\•¥“‚•£®­le%ìѦ²×g!€ ªêV2ñ=~Z —Ò‰±è×bf’D,C(Oí'PèæüÂ$‡šhyQϽºU%]¢ RæaV&ÈÐÚ_0W-íS<önùmTQ™Á©>ííÍàR9}E‘¯[µž—‘t¥ 𱊨ï¸å+è7 YGM—º{ºû¢¡è½ßýÆ×þà5×¾å3矾JµzŸáñæÍ"â–ƒ»ñF[œRn|$wÐéÆîûßwW HiqJB°,ºáeç¼µ¯o)5®K¹¹Hq&>|phêžÏÜ©‚è«‚õÅwB `~-÷?yq:Ç‘[ aô2W;òûnkו”aæ‚[w"Rõ¹u<½Cü0›jä®;õÚË€  É•øâ ÒèÐI>­ú]%|¹EFFe½þeBüI¬®¦ÜþÁÀ€S9e ®”2Qr¬täé•k"R9?AããKÄñ ÑJ RÊó§iù·ôš›û|„‰<Ô Rhô×¥ž“ÑT$¨3BßÒÕ.ÅÉF¶è“ú,”’æ–Ĥ¼”“òÕöY¡YylÊçLP>‹Bœêtl‰n~_ »žÛÁÆÄJÌ Iå­Ï|#̃‡œfí©V•¤V‘ï”­!(x|¤´lÉ’ÆîæŽ}äûß~sa.û¿.{ý[6…BW¼ ¡>sË- ‰õË›ÙÖN!ÝœTÔF_7"%õršU”Õªr¡\a\:Í—¶n~¶ôÌW\¡ €X ßzýõ¡ëo½õE1O1V“À:z:;ߤúä ÙH.Ÿ/OÏ΄'f&¾>ñð“{(&±iÂ|{,ôÅ 1Nl–Á’Ko9n«Ã?¿Í›Q×û™WºAà ©gߊ§It,âdLc´ËàlCA¶¢bróB£†8Š!¤çV“_×!çƒXþü’VÈ&Wà <% (â$1?N°Í¶„M€=Ìt ©½›M; | ޏnŠ¥9c±û¸Nâ.lf§XôتŸ`3¦d$èA°ªƒj8/ExXÁ¦#”©vܘ¤&ò!‘ÏO‘½}=,F\Žy¢˜…⫲jgeïï=3Qj^bYR OqÔZn&¿_Oæ·n!ì¸ë.mÞÉë«ÿrQº>ùfI-±§G •HYaÒ› À#Ñ÷ *æûÙð‡[QžN•ÒÎNÚ<:9;]Îà>««³íM'÷¦g7ߢßÓœ¬“¦Ñ'%)O»ñL¸RíC’€ðÃ-Ÿ$À˜1ÚYR—Pú”Ë·:ž¾Xš-·.ºõï|ó¡©‘±OS-˽è)Ô•W6³¬çÊúá÷¼Yßò^¤¹J._MÌdc»¹ýÃC_R97Þx…å™™âœêpb (½®˜Ó3e¹šD“ûlŸGJ!&„(Ì†ÒØ&îêÒ†8OüóÃiÑó¸–f/(­~ÊOåñeòÒ­ÝäÑK# ˆÇ¿µ(ɈIØU{!„’Aëÿ³xé™À÷_ÉC0g0Ö&å¯ot3'ÞÜÔçF {]k[!È > ë“?52o¸áC?1Yþá× ±ú×@Ð#Ü’* íÍ<¤¼ŒúAˆZ6²¡¥òÏÕç¹¶ýò‘BãiÝ>|î=?ì³ <Œ¹ì°K¢ `a·’c…µýìKO¹GÙ¡\ï&ÇY†£Ò©f”•ÍîÈð^FèõH€i~D>*‘C€ÈùV‚z &ÛĬª‡)ô ÐÈÎhÇ1æ—_ºÁµ°@Ûˆíl@¥‘ä£L‚¼íÞo±¥0ô± 2å*Õ½;x&'ï P£—´ù×]׎ò7P°Ýªþ¹šò[®ˆ¯úƒW¾;’¬ÿëL¦±ebvêx0´»Gç4A’ak°é.äüC‹;©•¬^ªÿj7M±4Nh Àé.&I ")í ¹kÉV8Ã{-*ž€ˆ¾Õ•œn*²åɽpP’ˆ/ˆÁ¥©—bµ«-Fß–#Ù|¾27;WhhL¯_×·ì·;w™ˆŸ<à×Â:§„_Hüj¿š"±nõªu¿ÓÄrn sÿÊô\6ràÈ¡§¿øÅ/~Vôôôü¼g! 1€N/Ň%'úNÏ„Šùí'€•C<Á„ˆFêzW ¯N¡_íãûZÌ@B_ ¸FR(æf!,lõ™/jdT /5QÍî¿tQËKØB!üØHÊsyôÍå9O >ãþÛý>Ó‹6æôhþågÈnzÜÍŒMº)6ùLŒ ¹©é!7ŒÉÌ”9&>êÚK¥Çµ:‰‚NÛ…“‘zW‡oúD·,rL:‡B9 5ͽUY#ŽDp(žûúè¹UD¸êƒßê ŸŠò,¤°bÍ“TØ(BYZFSó‘ ±)['2KèÕÇ2À´±È(™ÍLüW>GËÕÝ šy€L^®»–×(ì…Ã|³¹3™î*…C+Ñ©\/ºº>•\/³ß™¹­[Äly˜Š2ý¶A€‘•ºÐÖbf\p£¶0²Rõ¸ÑG ³*&ÁǼNUKœædFÕURê­6aHGx¢ø…wƸÔ~[/¡ª:Þ j~€Ù0S2Óiâ wI¢9 ~jrª”©¯»ø7óׯþ¾üMŽ=ƒ›ß<ó ·òÑ?|ÿûV¯=c;ÿʸ‹²;²4 þŒLÞÌûÙÓ5úSö‰IŽ)€±1%¯À³ f%—áÎj8uˆvÒŽ\Õ€TRê¡<áh $8Â[‰jU×ÌÆ×Ðë&gà—MöNÈ ñw–_í…&ÈAØckH“ĹÈäø°;÷Œ>÷[ïz»kïêÃï$åj„äöí™OÊ( ¯½sn:Ë¡¢ÙYóૃAgY¶šDäDKëfødåÑwjÔô32Ü`û4y îôRv;î½ODjÒŽà«Áj’ eûúªNBZ^Z½x¼à‘.Í ˜ß•ËWÀlp?FÙF4Vcò!CÆ!õŒPT”Ò’X $ÇÆ’B¾´“Çj;²&dÞk<Òß?¿þ-* Bè©§hJVýѺð¦ßËQ¶-e¦Üˈ¹‚2ûpãÝ™Š³Y9•Ôª.Ïf+ì‰Hýz  ˆˆöæ`”†9©?o =‰`¡ï_.xç‡xµ…ܬÁ<`vò™755…æ„K¥“Ä—t७҈QËtX+/¤´lô%§3*Óˆ\º+ßã•“vN$)L'#õ¯ª!Nïå¸ò8.ã£o$Ê7Ç\ÿ ¢fM_"ýŠ5gœñ—œcwèÐL6[›žŽîݳý ÿöÏ)“Ó5ú«ì“’ÂáÊ´5Û÷òô3m ŠYK×:ODÀ¥°V}!† 3/úHç [$ëdºœaCâsC —¯YîžúÑß•Œž#?&È^øbŽæã‘GÄ †!BPHhW!G‹2EÅ‹ Ì«ÎFñp†ÑÓE€*6èD¥¤0’®2ÑZºBZú"@sòaé“#/m>:ÃÉC‡»ïÞ{Ÿûνßsm­¸øâ8<ËKy’ÍÑìU¸0힯À"MG¾«V¬Ö˜Ó9AœZZµ™>ñ4Ò vžÀJa9*Íç³ÆdèR+õg~¿é¦m&$5ÍóƒÞžnO6_PŸ¬%Lz#%áX´ì;i»º„ )GuR»øVðuCÉeYeÅK,BU-Sp¡é æõvγn¥ñ6´Ö5á×ôF Òë@Ù9È;z¹U—MŽ)X=Œ^²òÐÀ«³öãQ{‰ÐÉ Üó€*OØþ™$ I2°Õ _M24 ¸º''ébÑÄ+¨VøúëMìW›ªš/Â7ß|³Íçÿþ/?òwg®;³±HÇds¹ÈäÄtôàa7><òg8þ™`š峨šÿc>!Ð`©cÓ¹=‘ÆòLµXi(gÿ·5‡²?uœÚÝhßw‚Õ•b¨‘ÕõüÑ‘Öéä™J7¸Ž¾N‚¢•5Š Ju¤:Ñßøk-?ß ö€mú¡QÐǘžetÇÁg’Q‡¹0â|Sù*X C¹©£%ê­h¾ª †¡}øž±P1`3¤¶”@OYM­ÆRõu”Ç2Ï dËåè—I‚€¯åæR×<0¤µ2cŒøÚªÌ¢uoŸ!q‘åI¹¨ËˆB¯„ðÔAŒLÊ3 "Ó“H.{•ÇÏs¢¡¹©æöç_½!éO¹çüp¬î]xyz=ǰ­–;sµ“Äw¶ªòaJ!ÈÙ¬ª=ÁnŒ8Ô{P sh~YRám­>‚S•Sý¬}Eh¼” xõO@œªˆê`õã½ ÷ÊÊê$âgj®ibI`rv„Ý'e¤¯9×ÔÔÄT,aKzF~вþ±iè^_š6”ÍÌ›r)[fì¶2#õP0 zÃ=•àšÒê¼QNÚfMgi¿À­—¥}þ×}÷ÝÆ– ò‘¾ãÏyù¹oajRÁÙG ±435ÚèË_¸õ«·)yÕØßósYœûb›j0Í–ò쟃üi$¸3â„eê#ˆoêºP=p` /ì™— „7â¼ü³µ(…3<ä*h^ë ‚—ÊBÁòÓ/{æ‘Kçñ°Fxõ†öïC€.d”¨H/[R°ˆ9@B‰ÂW2`íÖ¼Ëå·F 4Á<¢xXHeÈÀÅ'y‚¥ Ÿ§òP ”eø}Z=Ók"€¤óðë=eÄa:‡††ÝåŸíZYžÌãH‡Œåi¹L„©\µ\*)°ƒ÷à5 ¬Ù¹é}CÞ³l`f0ðuìrÖï¾íÂúæ¶ÿÎomio5‰Ût77š£cŒ£17HðDQº¶c;¬@íËðLÜ*dÏ<ƒW幂 Dl$£-a²Rœ²TF$7âpõˆˆ]5²Ü5rð@uSÿ¨ÝUW rò:‡6‘²Ñi«‘R1¤$MD¼4b-‡IÎ6ô)¡´#UbòÆà]ÜRU•€òüT^büÖ/¾‹ð×ÇIXu‘µ×üÚ¯]~Çm·}«¶[Ï#) tâ/¼ãÒØÙç]pÁ_gš‘ Á)ÄÿòðøttçîÁ©ýƒÛ>¢4ýýÑ<>üØ\îú„À<8Ù éÄU: µ ªÍt˜z»Ö¨jl4êd°3´"~™èJ¦¾8ÓX¶r…!1SLCq-½å§K †šŠ)BÖ}”§J<-¹f´çC##æ·_p¨Ã¥\ñ“Y·""[šbŒøQFm<‚0 Ám ž)4Žù,¤™žÆðs»÷è YŠ©!Šó\í`%Y鬼àA­låcmÄs5›ð1ÎüVáœsÏc„k1‰BëçC•ÚQm§9±¯‹ål9²xÅtL'•÷~ù³Ÿ5% €r¶p,ñßÿ½¯ýU<™þÓ ™Ì2¥942Š™¤‘".^ 'rôS$»à´?€0¸ØÓjMáÉCéyDØjkÉџÚDŒ8;£eÖ©¾•®Bï¤D5àU/.Ì-8W*_mˆ0%uy'´ZŠ=td”³ ±äDÒ™ÄUZ*“´³)Ŭ­­ÃÈ‹ê“W^<³im,ü$'7ob4*SDŒåIà I*WB#cXNÔ×Eš’Wá[W^9^¹Yê»ç…ëâ0YÇt¿ö×?öÕµë×Çðñ_šbô¬B+òÉP­ƒ`Ë4‹ô 0³J×…‰Z;‘ƒÎySÓcdéÛ]Ì–ü„¶Ú'¢º ßÄ,4%,b"Î¥+„Ëx2‹»†Xì,ôóô7Ý$¥ßÍ"þÈM{×6œ»qeŽ=³˜›GG'' #ccñƒû?}Ûoû¤ò€œVÑ_0(œði\²­k¬"8‡EK,:ÚNËÔá†ê@:/F®õá|Õ:ćô  8ëË­_³ÒýÙ î/opkÖ®²õyiÀ³¹9C¦GG=¥3Ñ…D±{a%!‡x¨ðÙO|‚¥¼”[¶ö ×ÀZ?'ÎZÇ A I„‚“tBnÍy5çlÀÍ—^Ȭ:è½H–|5­Ðßþ‡Ü}÷Ü庺ÚÌÇ¿]=1•P|)½>äeu‡l…pª… /Àò„µrt„e+ÖbæP`j"Ú覈ÁlW´‹~•'íšc4Ïçs?Qœ€èyGR&³„|㋟néèüU”—%…>6:RвëFÞºÔÆVSòUý½¸ ¬üid—(Í¥1ZŠì#‚xLÍm®-Ç%bòbFš^åY-Êg™ZÐ'ò%)B·ªO»X ˜cõ²¥8êiÒpàv†>AzCD¯ç ®žnDÿŒápL Z£7¶ì›H¡°cJ ‚‡Ù¨ÝõsõýíûÝ V¾ü ~õ‹1 1?î¥ì-äaX´ gö¸yEKå€,›õÙc€nB™ZÓøÇþõã7|ýœ /¹œùqqz|<611U<2<ß²c׿OÿÛ~Ÿ´N{þ#Å[Œp‚ À»)šÙ;é[út4ê¢ÕdÚ’ò1‚¶.vßðBL!º˜ePãæþ•K#‡Äsq\¥ãÞô¦7ºÑ±Q÷/ÿðVÿÆ:¼½“$U4ïsšK"ª³ôgåèWÅôLyêž¶¶÷ÄÓϹßýÀï»s/>Ï­Y¾Êu¶·¹¦Ž6×ÖÂ9~ìH²|•äÀÏ$¢¤FkÉPÊÀIÀüÊ[ʼn$’ŽqœÙ?|ÔîëñÛ?3:¬Ò…oµ¸ÜåêÞô‡%‹´¶ @IDAT2˜ANÞéRsÏ¡áÃîÜK9žŒó›å+ÎKAâ~tÒÛh-&Pk_òÇŠ­ˆ…Ù{Ë'žSþ[¶Ü%™¶¼iÓ⻥[¿ðO¿YŸN¾â'³j˜ú"ùB>ä£U~Œ¨l©ŽFð¯~ÒÜâ5%›ÞóÌ süÂ(˼nÁ§ìb ²cе– “H5Ê¿HZ‘nT*1µy’©¾mYP.Âu§£MJ0‰‚² æ °­ìˆ«-S¢ž£Ù¥`´ŽªNžoK¼1`º®ÕþØ> ÒJ21æm@Ф-·†ôÿŸ½÷€¶ë:3÷í÷õŽ;)ªQ”¬ÊŠ#y9ãОؙÄc;RÆÇÉJq<ã,Á‰³’xR'+ɲÇqœ8ã"&q‘m%[†%ª‘"ER¢?àxïáõþnïûϽ£¨Qr ¼µr€óιçì³ëß÷¿ÿ›pn _T.L{Ó±‘Ÿ>±Îã8œIyC6Ý7ôÿüß?õë¿î‘c[tÆÒÒBiay±ÆîÑå³ç'¯þÊKç¿bο;CÐÉâ–^^!ø|]¡ðE9½¢xk DPÉÔ`g ˆ=b`íTÜg² 3²"¾W¹ŒââV{#9‡ÿþøóé5Ü›~ó7~3}ø?ÿ.Þxk7 Þw`ˆŠh` Tª|䕦œÄ¢K»vQN.}öÏÄy3£ÎÍÈH1í=t4íÙµ›Ð^ãi1ø«•^Œ>U;!VbÙwG‘h +2•‰‰Íôüç^HÿêŸü36 I‹ËŠêòGÖp®hœÐ–ÝÙñH öôè¼öË_}öæ·c;óÑðE°Ã½•Ž”LÏå#í¶ß{ªo±<{ ¢4uqJ¸%´T9·Á(zi ·¼¿â&¤ôu÷Yœt°ðqè¤ØÁX)(P“«È‹]!ê=Œxö±Ï”Ú¬‹j[Áúy†µoºDÚ!–WcS%‡ÂÒRˆÖîY%sèÂJ&‚ ñôž¨ uÓð) – UÆÞÍŽœ©q†ÆúA:„¹4×*Áj³xæb>™]†ÈÄ7g‡>…˜H)2ûAäpiÐÛIó­rjô4s2ˆbOu¬<ÞwˆTSœ?ßAþÿô/þá‡^õú×½Š}‹‹óÅKKõ¹…Åò¹ WÖ.OÏ~÷ÆÇ?~í}øÜNÈok¿fà *)}‰¯3 1ͬvÐ2ZÿqÃÏLܘÜàüL€ãfž›Lïè‚û¶w¾ Nøúôø‡Ò…KÒé^H{âãéÔÉ—¬÷Ícp°/ úÅ<0yºä—A€8ª‹_&ÖzcÏ®½»BÏÓEX ò"ê:ü©çØ 8¹™ç+¹!\UfÿаD¾ÑìN½,·ÎKÓyDÏðLë´[­W{²Qoyã[ROOša6@´—ŠŠ¬îz¤èßåVÊá<~M“km7…¹åõËÿî—?õÿ™?À–éAÜÿã¿ýc÷mlm¿¾Œ’²?ÀÍsómÑgÁÍY5H‚€±r¼\+Q×ý‚!E%Šû:.é‡/.•ÙõX×jÅp%:v4lÚVzÖ–—(ƒJ«ö)¢Bjo37žp#üEò¶ƒâ– IJ "6;Ò±5;µŠÐ¤S¼ž«uQ"ðw—!€QÕ³Ì2ͤR;O©'SUyü8‚!‘‘WVfø0äËÅB‹‡üÐ@ï=dò Ô«ð”ü‘ïÿÖw¿ó­ßüK÷ßÿàÄêÆF}ii©4·¸R‡”ÎO^Ù˜¹<ýmþЇ>~;"¿½ñ5$€mÖ¨àSêùr[cºeÀï½ÅÈ``D:M à ·û–#èÏ­$ b*¾;нèsîK‡L¾óíé{þì÷²7ßtùòT:}êÅô™çžIÏ~æ³x‡Ý”È¢,rÆF'²2ŒŽÓÀµDǵ‚"b…{˜h,Ó+/"Ÿ¨·¬«JÝBj ÉÄp](*wu{Ìq˜ ·E¯d*g¤_ÕŽ^¤Œ^–(ŸzáTú¾ïùÖô¦7½©Åµ´1´ßÔ]m‡¢:ŸÆ·~„„ºÚ—>=6V/§tqÎßó♩oîïùä¾xùÌôÌŸ{ݾÝú¼Ã5B¹j ×1K»û÷©¯‹è꾪JXae Cº¢,« çUç¶¿ìJ‘ܶøN¤·§%Z×óæWÇs}e9T2fù5DäÔ jGi¦Œîò™Ç…vÓ^‰wŒ“Ü™¢‹üv¨|&‚΂8úý渹ðKð¬.ö£Yv<+!Òù<>ÍRd„`W`Îj{vgÛãÑ÷íò“íÇï»ïÁ¿sðÐ……•¥ú"H?¿¼ç_.]žš\¾>wíÝÿñC¿ó™ã™Å?|.¢ŒÛèÏ×APýÑý×ÐÝ·ÐñÜBKv ÂÊJ#3dÉ(©F!½òDŸë "Ñèr¹L&Brí šnŸÄlˆ¹Y§}´òÞsß]éHï~÷£8…¬¥yVTQ%]š¼˜.œ;ŸžþôSéÂå+”ÎÀc†ÁÁàV1ÈÖ#ÊEŒ ´ünüçLDXakxÝÉn.Ÿ)Àò­H¨øóññŠö •œ!¦ ¬o—ìÞ ´\ëR< AëßõØ»ÓþÇú_MW.LFþ¿b¶ù‡ÓdBðÃÃ:’¨VoäW˜»záS)#'ž|þôÈÁ½‡^½gÿô­z?û—¸ 5,“\ÔÞh¿m3ÿªNL¿$ì"D.[î¡ÿ¹ŠdZØEôì>»F¿ØFø«H";Ò€}d:ûÂ>äë˜vÓe¨œèT¡ñÔ¯íÏøÈzq¯Ñ×Þ&SêÂ3òÈ3mP.ót=S7T}¾”#\)•¶Ûm£uñû„È1 èxceÞ¼öÈÆ×1µ/3)À´ªXd¯í~gjÛ|ÿw~Ëþä·|ó?¸óÎ;ߥ2sc©´´¾R»±´V>?9uyæÚìwþæoÞD~ðö<^)hcÂ,° ´‰èvYï*Wb}B,ôù¡¸à1¦ô²@@Ç T^åúˆ¦è¯q©+nú;tL…°#mžY€µUˆ@p©ûõtŒvGß‘î¹û®ô¶Ö[á\µàœs,ü™™fÏõ¬ô×Óää¹tîìÙØÕgþ‹†/š2yË•‘”)“é!96mèZŠ…+h“@€ŠP1å!d!NL"ãf ¿Ìßûï½#=òÈ#éíïxGzë;ÞŽ‘«?]¿z-2ö  ¬ ªäáÔœ¨¾Ô)Cš pk[[¹…¹…ÖääÕâÈÈ;YÚâÁÝñ+f5f®QŽ@‰4Û¯ÄlMtp†8"Opp £"6‚àò"ýniqÏs¹¼Xv¾ÃáÉ·+¡H`ÝäÔyõ¾>ôhViÅþ^ð …ÉUäˈ9Çï ¤ÜyD”i=¬oˆîñ:+׺D¨¡ò­cæªM‰µp¨íÂòü>ƒÓìÛ lÔ1ˆ0cªýïí7pÊ:´gï_~Õ»ý±}$¸~sye…-½Örûš‹««åó—.Ÿ~fjò[žÿÝ^Tì‡ûß–œ?:‘?¯”¤‡/\È?­×n] ä%ž¾›?Ö‚›Ò±1Â+$œ9À¡ÈiExQï0õJ]=73®,r1RFN ððž Å a™Å=âƒ"§b´n¼JUÄù##GÒÑ;Å—ÓÊÝØ¤£ÚÞ׋s!-‹}q½±Þ/ÌÎá×?®_I³¶‡óë=î¹koÚ³÷`šØµ+–õŽqåÄÐ822”ú‘F”H†ûÑÿ{˜&ÛL“—.;„ц”!øí”&¢OeSÛ-ˆä"í¹23Ûè)‚ßíD ް{±þ¤½w¬DºÑ\·³ü”Îèfò3RR×F¤‘ó‰èñ£.”#Rúܾ7‡c톸§\§Q­ õµÒú:—ng 25PX± |Ã_xt¤VË~ôÎúq:Fqòíô™}ÝËÐÏù­}¡kï‘ …-!rŠÜ¢­PKŽb,ͺËñ èâ¶áÆsT] ¨’÷&¶üÍm¦u™.”9øÌ¾òyÖYÖ©CR4$t Q­Ñgy–z[6a(G[†’ŸòI‰~]˜o—®TÛéUT8V‰–®\eÿ¥ù¥ðþÃúiR¦ãÇü ‘ßWému¼bЭ=óþ‹Í†QkÚ¬ (T²é%WÏì ¡Ó…¹„L@®Û“J8« €`Šf¤Õ…´{8!R›]æïÈ‹ø­ÀAꊱ‘Ä„üñÄØóÀüˆƒ“ $ÜK"E¾ûø­‹°"c‰yäb±/ F¢ Ö=tGò ø¡*¡óZJ·õ¤<»Û|ù*¤Ú)§Ó 'ñÈih ¨d»;¢i¨Màð$nADé7‘ÕrÊaä¨i‡åeˆ7„x­®¬·gæç·VçÖªãG÷¢»2û1jÀ6K¶76k,—ÁÌF$…`‘ Lˆn·y—pÙG^Û¢µƒ}.âùƒçVŽ# ¶âøò›ôÁåãU }ŒOH ¾äÈÆ‚¶Qg§×ððT ´ý]Æ !âí‰I×=oû\»5‰ºåáð[Î>´»6WgóñøNXsýD©êº Ô˜8¬g¬5­’ÿ¢ ”Pêd¼þ2‚¥„Ò™ÊÀýUßšÏM_Õn™¿>’ãGf¦fß÷á|ä¼uÖÉä¿muþn¿v¯¯œ<­··žÌãŒ1 Âòض±!Ü  rú*$7 ¤ AñK΃èVH›ŠŒÊÇ ß…+E7?èáO#6—”n#DA¦K8¼wŸ¾&î#²ƒÅ! €ࢊ¼ªÿ²tMœñ=÷YBê ºø¯[~ƒÌ¬v§Î:8E»øÞoƒ#½¬^Ük€§ÓX¶Ç½‚øˆv¨åS£+)gÈG^´a‰eni9wmê:¢N9We›µ„ &eY—Å+Ä>¥¶Õ|ÅÞêrzU §ÕÈš¼²>’cG;éȨsô®µ4 íñ&pT¤Š›ìwyjÛyf[%pz> ‰Ço[‰ «È²¶ZÏN–ݼšnÙº û½}àXhê#TºžÞˬõv, È4!’*‡c"¡·ž:«©>pƒÔä ³´ŽÊü ºû娧ޅXBfPÖ:ý¤ãŠÄé©kM|üŸ™\]ú§¿óøoüÙ¤ŒëŸhÝ.~Öé«9^9H'‚U/LžþÔ¾£þ8!Ôþ3ÀZùÇ@è’ñ¨àkL7ñ·C2 qΕâbÝY˜€ü.¯ŒAXŸy/ŠÛù$ ÈÆ,øVAPZ:¢ƒÔm©ß8€üvýÎ4ÖC€v°ƒ( ÔO ËÀ3ÀüŠúu³3/>  Sô0_ÿ„þ6ÏÌðé}VfþŒ{~“(Î.7¤xŒš6!#aÑUºSWò¥†hÈ!ýÐ Ä猲#=µåª¤±8:¿8_¿zõZ{ld˜*æ1D25Ê·¶±¯¥ks E¼(ýجw $q§n½íôj´Žö{ÔÑf*‘ñƒþŠ|l],1%Ÿ8짨‹}d³iÞ0è2¶B„ŸÕQG4Ô¶ÜwÑ`a2 êùEé¦âQ yF_q±’±À™u!Aôv¡,Þ‰d“6!i\y‘LÛDÒ jƒèªAJZH¨Uî­êR °nÈ1ÅÎÜ„´‰­¦°²½ñ~öç1VôY߯õ­s÷ø@Œ¥Ýºváäßçú÷wßà[V¶×~@WÏœð¯P}90o;îÅUm~-ù.=E[™¾®£‰K_·“2"·—Sò2]ÛÊ—@È'ûøç•‚7ûŽA:dÁVpf3àwˆØNŠ™1Ú÷œõ“X§¶®¤A¼Z†˜¹N[üÈo›`xf/'¶|NQÛC” ᓟNÚ€@Ò†•?pŠçr+Þåq•µ,ÕAd× ‘2è%Tó"ÐD ŸüÂÂòµó—gÎL ý‰U¢!©ë4º9g»ï™ëóD£ÙhO€ðl¹I}¬_§Îrbû’>–@š¯¹ÇAÝýu$ÕúDOØŸÔÓÓï½±£Ž¤ñ™‡ŸGÅV½Ú™ºeÃÀ¨cÀ„pˆHHÔ)»u“øE–Kö[»K¶{b>ÊL¬-@Z‚6D=%T‰[I{èë œô8Ï»ãa¢ ”áøE¶ºGûm³í0Oï­KäUh÷G'¤0Ôÿ¾ï«ÿ…_ØÞi\ßöw¯…ø­c’;vìXåĉ[ãã»FE¸­ÚF à cȤˆ€Ðsü—Â:@Øóü¡h£ïêVf JJxóI ‰€Ó7”€v/1ˆ™/pŒ&ïÁÊà*rú‰¢¨ß=q;yÎII:¯% €3??Ÿ>¦üIÁ„æo›-".Þ‘©_v‰••#Ùr‘n~®‡—3Y_£\ÚkQQÓhiy&àñ1ˆŒdŠSsŒ–\ b€Ææòj~i~ùTsiý¥ÂðП`¿‰: SL‰Ýu-‹lf—ó‹K«í;À. d@bŸPåq~_ŽRíQ"r •œ Ÿ¶[E™IÃnA:ëf½öˆ†ÄÂxŠŒ™O)+aH£Œs8€‘…<Ãn¢FÛHjéi}ô›ˆ+ñÏT ¤G¾ÝhPÄ‹èåÖ7ˆ¤°FŸ¹¯C…EC™õ#OóÊÔJ2æ¿Ò¦¿ÈLì:.ÑYAÐø€×îÔè'ê‘+1½Ê¶ ßÌÛ€ü®Ü2ë{|­À·!5סoÎ3@µõV­g[ØÓ1%@CÑKàÜáOp.CQ¥ô"føÞ¾ä1Æ.q¬…˜Ú¬ CB´Ðë¨#1på¡4ÄŒ-)60^Æà…˜Ï­I2dŠ"DÛì=€ãÁ¯ì0+ó .DJÑoEkëÜnJDºXÌ+~e¯¬é²ox0Éý¢’"o€_‚`žf«$Эoü¦nzU–Y’l´$¯‘§eñ­%º˜ŠØ…¹E¦0—ç¦?–ÒÚ¯Ó9ÇVK]tzœµ Ãm¯· Eu=Ïýw5†:;ôȹ·ˆƒØ ²„.m[¬ Ð8»±Ih1€‡ˆàqÆ>¹´MHÈ䲡šÄXDò¨£ê•D¦ÉÆ+~'Á3 »ž—užÅ42/:]ȇV³svʲL ÄŽ€pb±NÉI ÜßÁ1žd¢!×Jj~gýn1ûÌr]’L¥â^„ÏÖ28þªôD£¿"Ì YwƉz¨ÁZåïæn„sñÿ+†'Ým{|= üøq{°‡õׯo²EàÖúVn­g-,˪L,¶ˆæè" › åo P0¼ãÎoÅp¹REk.Ý”(˜n’¡7™Æ¥Hòlø†œ(à„aåŒò²ô}WÔ¦ñ!§í¼y 8ø:rÝ`’<²® u }~HëýF)D¤T„÷;WÖq‡E§ Ù³è‰Y%LkÙ!"£\R¤w 3&eÓtÖ)3 QŒmo-./ÏO]IÏ¿tæŠz‘Ïß¹¹±ýc´á=8Äa€Ïc›¥4È\¹:#"m«³ÕýˆFÁ‰äŇA¨¨„}cß×ê›i¿ k§H 3=Ú%æ‰6RŸLb²Dv|:нE2ûF @—]ëﴜӤFÈY`ç¥,L—=!Xð=…Y^w礼yxÛf°²çŽ}\ʱêq©s;C|ÛèsNgPÜ­Êb.á*ÆÕüMc[må4{> ‚ç´¬¶×,X·ìÈàB•’Ó‚·ëõ½íŽg>÷Äû!˜ÃŽ=¾fpìØ±<Ü¿ÅR¸Ñz½5j„ඈ{n©Î *8º\9ù(iow:®F3îd@qðº×ܪÿ›Ò_üæ=Y œ‡) Wç Èݲ2àc˜(7x^§<Ç[à ¿n³æ(ÊêpD¬‹cÉCþ‡Øé$g‹Ü”¸:ø¹ßrµe¡Ëgé ðdÀoÞ¦BÃç"M—¸É9µ*—åTœú èŒ"7• ‰8õ`¶ŸºRƒ@kQþa>½½Jhó«Ó³—Î<ý”O¯\<ûQ.ÙuäÕÍÚÆŸ¯çs¯i5sKù¾öǯ\ºÒ»º¼ôwš{'$Jøa5h3µ"CŠÈöfûQ±A\}\+AÝi—HŽ9/SË. ´‘l”” *¬¢Ë¤õ~EçFhÈS„ðÐÎ dä¥ÝÀÓ{s'"Æî¶"ÑÔxÓi6÷z¹½„U¨p`~Æî£‹±A¨…©`¥Hm á;Àwæ JãâOÇÑ[ ã´¿Y铵µ3†|É æh+DK£G¤Ï¥§ï¹çžxe³ÿ~Í ßÏÏ/5kµeÄó]|(¬.3èzeb–ˆ”éÀ@çÚËT† >|Jï0  i³Á  ùƒW[.äWF}ˆ±h·‹–©¨§xÌ=uqƒË Qþˆ¦³…÷¨+‘•eäw邃P/JŽzv¥ˆVžYVH‘–û€@òá•Ào}3À׊O[Üð9€:M¥tãs @ˆ¬IYß²C2vÌ0¶—jYKÚ²¾¾Ñ¾qc>]Ÿ¾ñûΘ}Kô£žTPo¬G÷»hƒcMÑö¶Ê æÎ½ßK´ƒ¨ŸU¹ %&Œig2}Ô¤“.ˆ7ÝŒ5ûŠÕBo¾ôÙy8rŸ¯t<ú’:ù’ïÿØ_|=àfe·ÚÍ¿·0¿ü?aðÛMèhƺÉþôula¢„„ñ²ûåØô=o!ç—Ì)ÄEGJÏHIíº®8) ÆÄÎF(rpš&CŒp¨Ah¨e–W†~' X†@“q ’A”Çså{Þ ø½uâ_F½2OÇbøÆzǙ޴!5D9|K]­‡0-2ØŽ“zÒß ݺq‡Ä1žEuøƒJua›‰2»\<;9ùìÊìõß÷ƒ›RY–ˆïŸp ³ÍzßmÖ„uQÝ•s" j‹Kƒ»Ò‘QxXí³:Äç!-Älý£b›¼ztïã E3] ¦Ô4ú•d­V™æå‘ˆ&±Žô\•Úì*Ë“ t¯‘éýF£²Ë~ËL)ª¯»±lÅð=t#,Œˆ¬Î*•Xê]P¢ì ö§ÿÌŸ3`€«D0žQ‡SпÎGT!;(˜žáK˜^‚X`Ÿ9èËã™Ì¢»©³ovÈ߯‹8ÿÙ‘®¼ýíßðÄŽÿ%iÊ@dDÙ`ŠXƒ`§ÊÉ‚â¢ä¡ÖŠ<Š“"RpGþ »ñ8 "8| /y‰xhÜóÃÒ`îÃX%ñÎöÔ•ÖDæšI%$îÜ[/GÝjF:¿_B2±–I>1Ä”r=À©†$ø¶d@f&J# HÊÕ)—oå²ê¢^C  ŒLŸ—cfhá¹Sœõ¡nªB­ˆ:ˆp›¬˜¼4™ÎŸ}ñxÕèŒCéytóÀ$”µcÝZY_Ö`«íúˆ=ìëdk’N[xê¿®d.²Š¨rö˜ûï"¿¿A\Ûࡌe?»£oeé6¥UÇÆÃ™U·ewJ”\#OGR䳑öbô™ýÎá¸8 à nCÄÏh§D*Û%ˆLbœ„­ aÝJOŸøÞ1¦ŽöÄ>žñ±Ûè ÚDƶXõˆfqo|¤QÛèPùjþ Ü'`“¾Ï Üî¼ãë"6÷eDàãƒxÝý{Þ…·×.£ Ó¡ô^úm °èéáa€z]Ù[,™†Ò: 7èa^D±·A6ñ{:Ÿ‰‘SÄf<QCD£ ®mÀò”Xx„¤ÁÕüýV8ó™®°™^ÈÇ<Ì“gñ¼3èæk½DFîy•ÉB¤eZJH ­göܶXïHÍ3Ò'Ì&ÊHËëAæ.È;CÈ,/2óÔóÛ,=ö–[,ž}á‹ÏÎþóøÊ˜-ãZXZ}qumÅ)Õ“ø.“t²~6\·G•±´Å1f¤‘“Ûh= ÆU`i=»60…I=bšÄŒzÄ—¤µ—ÑŒ¸˜§ýª–6‘5¦1 ì)á‘S§çȳc»K¦>“2n1 õCr Ýßü©#]H`3¾†S"Ò!TYyzKœEhn¨¸+í¿k,]=7…îÐ?_7°Ý/# ŸMS±ãÉ—èÒáÇûòùž ä·¡ÖúÆ#õn€Š¾ž>P¤—¾cà6 ù×  2ÁC܃8,z–eÀ C@1% £íÍwAúÈ€IådÅÝ®ª""Šäú~›OÖa%$!9¦ó7 ä&úž‹9Ÿ'9%Pæ#¢BžæÉïHÏyÊc @WmÈêII×!T¦%¡‚6õme·ð"у>öĉãÃÔé{pÖáÁ4> è™BÐ)Ëßä€7Qˆì䔣ÚW"¯-2eW–oDšmD³S‚e„/“¾ôð46#FÁÈÖÀ}³îÜ;Ä@õÉ>– Ð316$ w”e ö¨+÷X¼¸¸ ÷®FzjB¾†ª7†a=õõ÷Å D WäùÑÇdÒF‰z9>Œ’‚.ÔJb "émíôä—ãIûK!‚ÕjixvøñGFì‰ÀËûµÈ>ôôè^]=‘{Œ_H9%ìdS8yò$B\ë¢É]·Xزr•Û†;øê"Ì m.ΤžÁñÒíµ¥T ÝX¸Áó±ˆ!¿±Ê.2£è‰ìÛ·¾È´a£ :ª±'(=#šA—ÀdÈš!bQEB*ß& :ôD Ά()­Qaf”¹µ6„ŒÈP1CA{ÌSÉDhFW¥¿¸÷;l!! ð[`•8I,½ ¦£8èµ*§_<ÿé'žøÄûì)ÞÕïñô¿ýÓþà+¸©Á+ŸØØØ~Ï`­/˜ŽkW2DºfˆÈdÀ—ÔŽ¥È]”›ô}K‚Ä3ßK¼$aa€åwHH¶…g]éEcøréòËÔ}œžguÕ¦`Uì/ŠäÜDþl/L þý2îmßc•o¹ŠìUüþ’4Åz€Œõ¨¢+¥ÞJÌÆ ˜W§NÖ1 Rò`<ís —£jƒESï3—í¨Œ"i“)ÒÂ@)ïLÀïvžowÚñGJ¾HãÍîñù{(×1™D:ØÒvº Diä0[Ëa•ŽyqDÓž!0ƒ'à‰ðqÒ¡·oQc•!„ÃÍH6×Di KŒ_n´Q*3¿›«SSîý×Ôßt®¡ï‰ëÈÕ>D~öÎŽY»X,Ìá6ûK¤-2ÕEà,Âùö0ÒÀ0\¢þ_^& ¨Ÿí @Ëööùž‹'*ÇAl*‘d:ºÈâÕCö QÎÏs¹”€êÔêåžþÈÓßAÒ­c_…è™vþtíTs«sŸZ :ïøØ:B:>Çí–·ÔÏ3ˆ`ެz524‚àÔŽ?ªNpGûéÆþ’?Z?¯a`ã^„ïê×ö­[­Ùߺ«VlJL£ˆ Å»œÛz#ÄL³¢¾yÙgäu‹> >Ñg”ApR"x,Èn$i¥¹u…™—l¿@f@gƒæ06:žª;ö«™:]i¯{–éw£G»ÎÀ©cáª[8_K†éËæq–ª<1<ôýÓã3«º£ŽÿÞà•v½,+HUœeÞ ˆˆŠ˜Ž84M¸v¡D ‚µF=y†kHSJÛ•˜£!M15@pf¥ÞaÖ¡ohˆ±}Ã1ýÅHBŠÜ®Ãüà^‹¾Ü=–{å_Ù%&J"«4“l:7HW$‡¨@À?ÑÚ<äÎþîoC)ô¦a‘_™G 0a~(bE¸¿H­xånNÂHSBÎ{UGÕ—XÇ`zÒxŠíÛPX¿¹§QÙô¦ïâ%m?pÃéä°¡ DGÍÍ-<1—o7¢®_ýq»T¾~˜øÊ3Å45µY(U¤º:Wl76j¹\ôK-ô»<ï›f‚ÀM=¡šA×#ŒÁjˆ¼è€ d †€K¤e¥@ðê%FÚHQqÈ5Lé¦Û2 ;;KࢦbyÕ·¯X[ž™Gj_ÚݧWmÂVQçŸ )݃ûÇré‹D°ië,Y]]}yšH{ôèÑ–†R?Uˆ{Çx;Í!ꤴêï›Þ—'ÿCNQÆñãÇõDŸj½Xßl?Z«·rîÒ†._nˆBuBylžþúî;èY@P‹àø¦±øV£&l+p]tsÕgo$Jóo°nDûH?«W‰öìT  ·YWÚU ªD;{Ä)ʉêð^ý$wWmB†ˆÏørÖ…Ä@!ö@„BuËÈ‘kWBÉö® -e:kà^‚ÙTrF ¬ŠQ¢†PFùA6ÖA™¨µA=* õ"Áq|¡=Ëg;Ḁ£ÝLO? V³Ê„£µváÒÀÑofÕHÁeÅáFüÁ•™k`iäÔÌB¨o æU ? ×Ùyq¿åzuåF*ö¤œkÆÑak+â-ÇãÈ:Ag’AÚX¾J¡¨}x©¬cìbù7¶Vñƒ'à(Ö?6(m·VoŒU†Çï\zú´ ^Úb=€Ž›÷X8Nd¿;—›/_~óôÓOc8½ù$ƒúìçÍûÇ´–¦ÇÀÂÚÿ†Ö›_u7ÖÓz·jëÛÏo4õZ?ñ[ªj9£ŠWÚÞõƒóøÚAäìkLÚíÒDp‰oˆÖX‘L¯FIT=¤ d£‹ü"Â?„–FóíÍA½«ªñt[Dñ¼*éÅ?3á¿’F×ÿ@¯N®ønŸ•å­Ô º³{†Q6òaCöw¬A\ÜîÝ<‚˜P@”A}²CÀb$˜G¯ë ÈO¢ägg…”À $ ’KK̪RÄÜÓj®ž>yàÁðÓ™ùŠD;èÏ­&öj{xÏ}‡‘òïaSŠ}ŒÆžVca Uú›½{ï.ŒŒå–¯_b{ÒÀ‡˜ò™I÷¾ê i Dg/_J‡ŽÜ—6—ç“–ÿ<†  ¢á ôâQ’kp*$xúÊùÔ·‹ % 'm8¨Ì›«'­±šL+·À¾BìÃiðႱA,qÉÚ5јØwGñʹÏýÍ‹ûàÏóJjb’.$qûuonÞgâóTâë*ñ H^X}vam¾µ«=zjaÂðF_dñS«§3}wD1‰´¡+ó¬yŒè$çÌÔµ¾Êt­b¹:x&1hºé‰4Q&Y…ˆ¢»ô×#ÒqͤExʰ\%2jADC+-°|Ñ€•à\Åh«k›i•˜½ƒ}YÙ~+*ó½u—hIX”JÝHÝLÈÓ©[¥ÄhŸ„9€¶HxºêŒFCŠj?ùü“Á´ÈxG·’d£A·Çú¢†~gžPT,”Æ787SïÀ`n~’9]ì¾ûµl¸±œúØå¦–_M#£#éÐýoH/~âwÓôçžMoÿ‹? ×_I›sÓi߫ޒÎ>ûÉ´rîtyÝ›ÓDu4å¶fÓá#¯J 37ÒÌùÒýo~s{åtãôÓiÏݰéd-]ä›]w½:{ÓòÕ3i߯I×'Ï ò­ûÆîhVÖGó{îùŸ[ÓgþE:v,—NœØQ¿¸¸z¤ô;O=1yïýÌ"~ï!v^¡Ô@…‚žµäÕ"¾’˜ §¦»(o®¯0;GÅxˆ*!ƒ¤¨^"I×Vã÷]ù‡ørg ¨:µ—Ýö‡#}«Žè¨¡CJ=8_Ì\3®iÈ¢Å^â4ö¦íåõtñ…gñ ´6\~úÜÉ´Éú÷SÏ<™._ºÈ>s‹iD^bSŒÖ¸o¬³½ÕS‡Pý–4qÐ_¹t% ßýê4qßëÓ쥗ROÿ`žØ›ÖQZyŒ`<œg{®õÅ%fÆF!-A 6–VR¸ï‹‹ø¬¤kW®¦³&Û‹ËÛpÀ‰oŠN;ñTÜÿm n:ÝHÓ­æ9çÌáÐø§ÁMDð”“g™!£NP#¬E|/¥>Äínô÷FݽlpÒÏ®B!às‹d”cÆi,fÐÿR4¬›™hHôPc²Óû¬> IÄÌSGF(æêÃÿ€üUz©‹u |·S”ïgÂ>üŒx\†0(…T¨S¶u8õ¢Í-Û©g#±ÓR™6êpf]”lìí ¡þ+P‡¨]‚aÀÝ£÷ (;vÌ‹G·Ù¯Ûüï­”¢kZÏ¿ád,óC{¾\~miº=·éaP‰o‡Ø^Àw©J½˜è°†Ø=÷z*°õW•©Áüî»ÒÌvÕaíz«‰^yꀬ‘&^ûú´té {(³gWšœù›©w|"Í_¹„¸‰.ËôàH^êeÿùÑý¾gKòZ@™¼@³QJõÍ\D»gä•/µ‡~_éé§V(Îz›·ÕÓXäll46žß®m¾ÍQŒÔKŒ•à°r>§@3ˆã¼Óø§”/D»§Ò <”™²ý¼jåýN:n% ‹ÑÓ®¥ùñÊTÏÀØÖöV[_ìrÿ8"¯éð;³ ~ ” #3B>÷0ðX³˜'dꎙ,&ÙÑËzPôm¯ƒ¡vDø©´¼‡ Ñbö œƒs(®òíz©ubË“ú#F/bâVP!âÍÀÈ@ZÄPU˜P ]±¶±{ŒÃBzù»: ¿wèÚæ×?¹¼ºõC#à \ ³y}½ïDÄàz4HÐr.ÎØºŒcKgAh¦Á¦ èý› · }×âéU%$.Zì«Xéŧ/ƒµ@NÑ”r3UÄ<;‚@k¼[Ê2½,‡w&€yþ½»ñÕ§u^–p^eìœ66_¾äª‘¿ì ^JÜ4ò0zm0ö¤)M¯S™-@Y‰ÑÖ,¹8;"«Z*…=<|¥Aüä¶8n-èl4J_þVÿøoÀP—sï¸=w½6]»übÚÀ½W1ñȃoKØ |÷¾=iï=¯Oý𤾡íKM,üN=›î½#[^›<…ñ¯‚¨:žn\¹ÓHZ…g®_L=]X[DŸë-2Оºx:×Ã"÷¼s—Û™ËgíW±ØS~: ³&;Ap™1<úL¿Ã»÷§M€2‡å¾¯´ +ðªRu`(­­o¤áa Û†ñâðøÃÚ¯Q©™Ç%x¸‘e¤™nÔ¹¤g¨' íK‹›JGï½3bËÕëë¹ÍåéT_™I…]‡ø‘z~‰Í­W1ê?šŽó×ó6?ÐW['0^~âwO\zä¾;'±Þ ?êL ŠQpG|èÅ<ÃsiÜ‹{߀Ìîÿ°ìÞ|ˆÕ"–ý%’È]šS¬Î°£€ÿc/6‚àæŠÓ|¾pðz×b¾7¢úúút(e|”8‚„9d£JÏ•œª4ºp±H¸—èˆC îÊÎþ¸eýæv!Í/1c aè#çù­£„À ˆšQÏB9€Á+†P €Üª¶'íãoˆ?MbÖìõ‹ãǃð›„wÎqk @§ŸØh¡Õ`þ¾eÉF­Ý\ZÈ•ïMv›é¾u¦øú™ªÓ hîìsè¡izžíÂñÖ3þûª.½ ~±„vCO¤†Ó€[ØzŠ ÷ ˆQÐY†|‰…-N}X$ĦØ 0"âK°²‰ø7½ÈνH8¨\úØN£¨ ×/O¥¹ë7ÒÐľ´ÁóÚ‹m¼ ÛP©ÆJm½\ß^{3MÉ‚0`ÔiÞmwXÁ/´mvU­5›ÏÖëÍ» µ®7oA„0ª±n’!&ògº¾ÿ ä±Eta­ê}_bÁw°ãˆÙE0SË•ñùwªMy¬‘û‘Â*Ãla¶wjb<ÈØÅ½ùœówe^–/Ap=AÕË›A¾Ø¼#ˆ…¶·úê”gY™ÖŠD£“a%ŒÂß’XðOÉRƒÄ‚‡Ä|dXnS£îJ_Hp$pÜ›Ît^Ì^´œÃ"¸ÙI‡ÀzËf}KÅ$ÝÀжœÛZYJk˳Ìë—ÓÑû^ƒ˜¨¾fœ¶MœO§ž]#éÀw¤µk—Ò¾ƒw¥#GïMs—/§ÁÝûÒÞ#GÓÕ“/2UÕLwÞu_Z˜›ea?þw¥éÉópö¡t׫æù5ˆÅf:°goÚ\]M+ ö¡ÃGR­w[]L{Ƥ•…•P-J]me5¢7õa/õöåªÛïßwo._Æ¥u@B*씣ýøãßccÏ3›:?µjྜ!H±™«-l‹ÄqÀùüÇY|¾ 8áÌZåË8UY¹jÒ9ó^T;gúáĽÜúâÑ‹ßÛƒ•žíáR{•5sï¶ ÃÅ¢¹3` ø&ë;êË䵈ø~§®åxÖª/qõ»õ ê®÷èJýÊÊÎSB TÄâY.®R_±VÈŠæñÇ…O1•é3ix¨C š1}ûÁv¢ð°á*‡]Fj–;êèVüÖTºã=ÕxñÏô?ò§®—ûGöBW[LÅ–7àÌr¦åpƇÂo3x~úÇÂXÇø×`Ÿ;‡°Ùfkî]ûb0›ûî8”*¯@(NìAÄ7¡ü}Ž ¸§<’Áèn8Ð`*᎚Çf07Š ˜÷ðlxp0)TÒÆ+çf¦§ÒXÀ]gî£Þ¿µ‘ëïOóËónQåÄu7à/·ÖñÖôôSj×µhm{ñ…ÞðÈ01ABø–ùHpÛÜN°æNƒ¯šÆF'ˆï/ÁÞ I@ñ:˜ ¨]γñî2€hxç‘—Æ@#Go¡§³‰7¾,©ÖkÂîj=ŒØdx®Ã b *õ‰Yñ:K'WÏZuÎ{&’)+KïlA¸~gIâ;ë˳¥rj~ 2ÿ€%ê(§UK»†+îF“],@*gl×4ðŒï?À35‡»çÄþúè N :U·pí<€ÔLÃxN^ø¢e>Ýw߃éÊ…ó©½µ’ŽÞó`Ú¼1—róéÈÑC‹e8ú\zõÑÃis~.­NMw<Äb’õ4sí’ÀqÖp8Z C’ËŠ#\4Ó…[Ü •ÆÒøáW€d¼pãê™fÿÐhapâÛ£%;Ä'œ•ŒÑ÷¿ý{OMâu†0cHÊhÖ5Ì“C^dËÄß"KMA& cåܰTñØÅB5 pnìêé À6óüŠäb˜ˆ¼…ñpëõM<;)¯¦Cú¾ßªÓD5Dâ!2Ë…­ŠŽJjò±T,ôà‡îÆ|3~5Œo2°RŒ òÔv`'ž{‰œóþ5¤’˜n${—ž[pØŒl'?ÊL ÷ÐV§žu0êCºÔ1 âU®âH¹C[Nt¤‰ñ,?%'a ˆ˜¥v9‡ÃÍA=0ä ï:FºùËWCwÜÜ\J½æÒsÇ5IIDATÞôæGßš¦?}"MìêK÷¾î¡´ÎÀö¥½GïOƒ£c sý£ã)Ѱ<Ô—Ž¾öMiäàݠ̧û~8M8”Öð8xßCitϾ´qhïG¢,7žxí#oI‹ë™¥ùÀÑ{Òü vŠÕÐc7æ§YœtO-g¶ZM(ÇãX('·åŸ®!Ê5Ù]çÙš‰Ç%xðw8_ÜÒ90ˆÆñŠ{°ÊuÖ-Úô p._µKH6Er·sc,! u¼4=ÃiHãß›üVÛ´Ëën& ‘±KT)|/ˆƒt2Õ uóx,׆qèø#@”!ܽx(ö`€ìåÄx™y0r>´M¸r±Ì¸÷è]h:lP"z/SÈ=H«ùÝ›†PÇF‡Ò®±Ô¡b¹‘Vq{ħ勬øÌ*yûþUq»•GîúûßÛN'N´Ç<ð}¬8{ÓÖÚ ð3—¯!®ËN¬i‘½«ñðî=iáú•XÐSb¿”zQÞ>[«¸ò²J0{ïÂôõ˜_^GBXœº#kõ|Z¼6•z0Šl¡u€ ›èýcÀM¦ ÜõW Â-ª8©v•"N;° Wc¤¹Ó6¨±0Íz¥4¸÷`‹­Ñ ¹­[ W~?=6‘O§NeÊå­ìÙ¯¢l¸e‘éÀÖkï?zpp´ÿ[{zrFÅÁ¹&ökˆåµ"˜HG~JrØ.g3|ão8÷€‚`÷H ¼ó”»K$nTºŠ×ÀŽÒ? ÉDN å3Å|’ÇiÚ»£, sñŽ|•BÀè¸FJê%²{Ï „}Tgd¶§àI!­â"î£aÝðaÆÄž£Ú—}áí©Ÿ‚¶ŒØª{ G”Q¤ lŽ¿››¬­¹’²žÛ¬mææþËåËS§ßûÞ÷Xá¹#ÆžŽŠÃ»•‡£!‘›iùâTºú™1­'B²7­.Ì¥-–òª/–Aü~ u§^<›Îf±ÎžƒH í´<½TzÕ€$N£Ìë9²—©CÁñ{16ú©X`4¼ç@š¹r{Óˆ.œN+j1W–‘ Ðk-'_8FGÆð”.~ö™4Àû\eåÂLG¾xQr; N<õI¯~WÚ•v³¾7S~» »¯×®}HŒI˵Ÿ]^^l±UW—]f·@Z¸:!ƒ³Ú{ ©€ Ø'ˆ&bûJäï&™!¤É¸»F³ˆâÌ÷Šñ5¤,ü&äÐ…Hã*…˜›EHqÉ—WáÅGÿŠô‰@è,Še’€Dº0©>„5x1ø‹4ÄC©Dµb‰™c¬¡^ÆÆ²¤ßf`Aà´ÉT°êÉ&+C7¸®CôUGÝ_pûÑç*¢ö¥u®k,ˆº1#wñÊèA3ïº×²^á6a~rË[J~øáÒƒŸ C$ºÔS%<ûzví-”{ûÛ[Ìñ¯°Fp¤7¬ðWÓõ+/¡¿_OK³—Ò`bjha2]øì‚Ó ó|Z[˜J[Ë×Ò ìK×Î1×Ü EšH¬ïM#›8õïMûvïN…C¸ùæ,Ä@Ë4€OˆÁT*·ñc»èy ƒƒ\k•x «RìIw¿-­â‹°~i27„»1 ¸w°|` Qgnÿ# žÒ¯=þ‰“ÍKêÚˆäa–3ƒ\ Nv á;òf«àÎîu\RNÙy«NÍ—t2N9¨¯tà1€§aº×  ªÙVo ,éõ°¬XuÇ¥sRŒïŸy(‰øLâàÇ7¥% êl粃¿J„ãïò6݃Ad‘ÿ÷XÆe»÷k"<¥vŠU`e )qM¢áX%šÔ6S½¬E9„=iÏîáöÓÃ[[[á ô|@âoñ;渥``` =1q#D¦+ŸýÈÇKý½³‡~w*í»·]Çé'Çœ|µ' V™«ýU@æmÉ ûº# â ¸±Èá¼¢šûÚ;€WY ¸IœÀyÄÎ5ÄwB¦â ¬œû+W~á:žƒD”¥'êµµ045™ßm×6Î%n?Ç¥Ô  :.ÛÕA<÷¥õíåö6ŽE•JßÂÊÔÔb6òÙìÆí7WBóÚÜK›.ÎѽW•ˆvÆê@ˆb÷²åÍp܇U\då> w ‚o¬õ¹Ž=Ù‚£’ÙD™MA°ïèh4^·/wßÕ…(ë½åH`ÜÿOÂS€Ž@ÂÞ@ÙxІúÁUI,&í­‘ß˜F# ÚÆ¾±Íâ0mJ–eô"ý tWª^Ã_À A2Ç J ^{‡@ê4´îÁW@§¡J¡Ž´¹g|ð/ýoïÿ¿C¿Øôh¾õÜ Ç-%èŸ uÐNGÍÕV×êFcs» Îá1†;©]/á4"w(b…5 ”¢*±àu^Öi¢ 7Xd,2MS‘p°èÇÈ?•j> ŽŒ@\,‚ÇœâÁb¿TÅÛ°à©*TXEWC_×a` Ý)-¢‚¸]ç!˯)·<°K±1ï—Jµÿ@ï½1ÚrìØ-í×Wx±2Ðôø5ýwI™=v¬¾Â.M¦»]Ž[Ï©ðž²3XT½‡x cÕÂfZ`Iï,ØÝ%¬·ã¸ë%` Ë;þþFwQ1àÝXHý£‡˜`z ýÌ4å>ö¨+ãöËT ³:÷û ýdÐÏutb˜|KâÀ#E0¡M^¬Ü5š†FÃuutt‹1ž„ðÈÄ8å2+Àïl½CƒˆÊki‘ˆAGï»/ ï?ˆW[Ž©Çƒzà{ @6îoó?ÝAÓË7>ÑkN$Aì…¹Ó„Aâ'¸Æ¢‰Z%'o 'GÁÀ_l"…˜"ëÅââŸNC©Ipõ t'×Þƒå!îW ïV "íÚ$>°Ž"Bä3Ñ16ù:g6+ÁXisÛ+£€Ä¹ˆô’Öˆ ´£ ¤·çä«(¯¿ƒã:ƒPAHR§|LСx¯Ø¯Š`@X£ «2ÄZIòÔ_àþ#¯\L×fn俉Qî« ¿éo:H¶;.6à­'.Dv½ñÑV×öŸ…ó¾õ®¡Ü;ŽŽ¤en}ÁŒXdVÒ,•{!ƒððCw¥À´÷óþ»àD¹+•††ÓÕëSi # ç¨õØ®;ÒÞƒwbõE·EÇÀ? æâcŒ)>CŽ­-°Å+ ]#°h€EAîdk²2ÖA÷PŸu9Ö"ÆCב÷ôµzûGX»Ð÷}À@¾Ã‚° ·óѵ|ò#Ï]'€Êä&ÀnT¦pr1‘~<Ý\£âõ@Xû™1«øz±Í”:„˜†Ë5Ȫ(/¢imWÒÚ®š¥.r¹ OI Fž’ 5t’<]7í0ü!A„x¡ èFpa C¬&”ãsŠü!! ÅrŸI ¡ÂDïK È•zoà«®Äv÷4±Æ>áa)o]ß0Àó5®«Àƪ@fÖ1kSZ_w“T‚Óvn³N>µ|`²¹rah{eåÇy§E¾å*ÀcGæ':îé'ÿàÂ7û¦Í?÷ážñ‘rúôt3Mcô+1È.7ÃpƒhûÞ&{cuï?âÀá§.Áuªi|ßAÂx­†ÀÞ;ïI}¬\oΣs3å„ÃV±\ß9_¤‰!¶w+à ²²j(qœI .Â~×àð‘Vf€àjˆîH«Ø[á{Çö3Û0Kìv…y̲…n¨—ÂÂN9n† GLÿa<,“TôU_V2Y ¢!×õìŠÌ™¿}†Œ6VãY†ŠÌþËRC›z6oAnþb¯qG¦:‹¿2çŸL$÷$'Cv6ÊéÍG‰@.ì H\I# ±Ë Hy¦ÉD~x ÜZU tw¿%VýR <’ Y(áyÄ ÙdßJ9üNc ¶ mþ(ϸ[‰mDáä\y}fN²[JŽ?žç4Ké¯üðûþÞD¾Õ³ Vó‘ó3¹Zp|Üq×a}Ã%¸5>¨tŽSÄ©§ UáD›%œ<ªx²Ýt{×SÜ|Çq’’ÏܸN@ ¸ÓÄnæwW°Ú¥R_•ÅD.fÍÿÞC1U»íÚ/LÅ4Õðø~n…Á±½k/àÄ1Ç8ÿ]g*p¸‰h 1ºðÒÉ\‹cFú†öÝ‘Žuì"Ye´€âà//¸˜ƒr=‰¯}¢î­À,º‰àqðB=ZÎë‘q_y8@<ïD¢øI¢Ì>qpWÒ•Y‡±BЉöov˜¿ßú)+B¼+Rzæå¯ÎÕyTA¥…(/+|HÄ™ úÔ â´Èl‹‘ƒÝýiï–ó~3!-Xï¬ÖÅ{Ŭ•FG½ÃÎ!À°Üd-HqeáÜäéÓ§Ÿ°~'pjóºSU¸[uäºõÏ~òÇ~î‘#‡¾giúrë…Z!}fWòh{qz:·a‡ƒ|Ó“—B _Æ¡c”/¢,ߘ™ã-È‚ Uü̵ôn ³†3Ëa¾™¾s:—÷ c¼YL+³W!cL ÕÓÕó§™ÒaÃP"-“K ˜¦êIËPõü*7 :êÚutÜ|z0b¹È}¤Ö k 0E7ëkc(»¿½:?‘UätjG[ä?uªýÀ¡Ãß04<øžJ_•™Nx=ÄÎ#8 È øž!ºÈ/Ò‹Ø O—(ˆ”ü|Ή4þ—“{fÈí½^ˆÞÌÅ÷²—C]¶u—ï0à!m!J ~‚ rcÉŠjÜ£.¥ŽD›±·`¿±®„9 ñÞº¬.o°çÌ,*~ÿŠõ+¸o3¿ïêN|6Ë }€• çÿñô[[Ö(×ÿuƒVQuÒOB©”ôŒy3ÇÏáb_ñÔÜÌüóÇ'àÚJCVÿø+{ü8ÖRŽoº;½ãÞrãM×N§©…öR³/ß‚s×èÜÁ]{[ÃõÍ•ùF9Wk–z†ZóW¯´X_ÞV¿|ñˆŒ±ŽMBÏ}öÙTE4ÜäÁ4;u}æXÁw4-Mãz:·˜î}ýÛÓÉËiñÒ¥tðÎÌ¥tæÌ é·JÛD¿™|élèµ5¼Ó®Ÿ»±)#5´Òüõ9üÈq^!ÆüâÜ\²(#±éXáÇ×>—n”òíjNO2æ0®­<ÿÇß›__‰Ý¥Á«õúì~¬ØË볉/†~†þRôÉäˆ"8Í!÷&PÓýâíççñáªüöK‰‚*W%¥ Ĩx9)Öû1ß åØÙC.ÏM4 éª B¦ÅÈ ¹¹„F ͼTâˆ%i¼È ¢ÖÓäÔTºtùJºxi2"nÄ©“§Ò… ÒÕ«WÓ4Ä}æúUôø™Vð ñëˆù9Û«öayË,g ˆ®Àµ~–¥ÚwøÏø ˆ©ü}»·Lxg§gyä=ùYÝ1·§W7*¿üÄG&ÓÔäŽ^ü©FyèML)1 …ÈÎî¿k3×SAfîÊ¥vem±]ÛÚlߘºœzÚi›»úâÉvûêYf÷pùÂI¸u?ŸõçL=˜"¾o²T¸­—ß7þ©´yåRZúÌsé¡ycZf'á©_ûôúü¾Xc0óä'Ò«ßó¹S—ÚµÅÙüîW?”_ v¶LßBX±Ñɭ܇g‹ép ·•ÁñêÂÚôí>î_´~µJmv•ÝF¶‡óý­~llðãàò"™ŸÁµD ËÑÍ([øcÏòϤ>#MH\»ˆ.â‡XÏ39´Bp5Ô¨@®À®ŒÐD€O\¿#äÅbš ©Î¼Áë Zü•8”(<œVtq‘ˆµ_ªÂë-¨ìM>®ìT÷·%zªJ0=DœÇ>˜É`¨Æ)Ô°™'Ë" eÚ&Ë(®1]Dͼ1=ÃÜõ&̧(âï¸ã–€?LÇè°éÒìü¡)bùïc;]\v[­ŸOiý÷Z‹çΧ¡£ÿG£•…ÛÖ7WiÔëÕ±]ˆ]µ<>ä†Þ•ÓðÔØXI»ï|ýŒY$fàþÃ1ý4wy’ED¬ö"VÀµ³/1k0Œç@ºzîÀYJG^õÚtåùgØLd!ÝùîGÒâÌ4{̦;޽5m.­áR|-&|øìlªcîÁ‰eii¥±´²ž»kÏhne„…&skùo;§ÙžK¿~i«úŽÁZú莃¬ÂÄç¸ÑnD¼¬’’=ˆŽI@_o€L7޹ý £B& $ÉC,ç*ȤÄt‘†4zÛiTË$6ÖdEà[wé]ç¦êæ/! |±M¯¾=ÐË~œêáá-ˆŽG"½’e™¯jž± µqU#{’¿Óx|6r=…´‡½# -ç'.ø’88›£$1ÐßKdèa48žQ¾ÄAIDoF% eÔÿu˜ªTˆCÁ^ "D- k¬­nþð à>w<‹Ÿ—Î^½v¸Ä¼}Oÿpyjz©™®¥ß6Ÿååå‹iù³Á{Mëåþ½÷'zÚ•¢»Ùä\جKµ^øn{»µ^]_^fãØüHaðŽ<OàN¼”`&E5Ä Šw`UZ ‹m.]fñN¤ö©»~ }ž8õ,ZŸ»ž¶Öæs…Ñá­­«/½»¾¹u´²UÝÓœËaW,¦—ÎΤÝjzðžr³ý½÷§_Ÿ<ûÛ=?uÅ:³.ø‹D^‘󋽋¯nåŸjutÝvŽþÝÛÀ#Ê….1÷ ˆùô¹AÔ@: ƒÈ§8‚£‹ÜAéAv¾W*#‡ý 8hæj[sLð-P0Ö~C’ËÕ͸ ò·õ´ÃHX![™ý+,Ï-ê:Œ·gD7Þ€.Æu¦gÕÓõΓHl‘ï:È_ÃX\Æn³Ý Ö¸x}avVÃz)98£ z1€?Ä Aª ú3 (qÉÖ;œ²°U8@H¤Û,]¯RŸf‹ê¨Š¹BzÉŽ;n‰ÐÝKýû¿ýOìû}â8j:rß@Z-@žÓç³^|ííi­:t="àÚõ9³W_äïòËž-]üüìÌ_Õñ¥„v‰Ç?Ï.éþ|+žä}«S“Ï]Ùºï»sÕâ·ýao¾ùgßpoáo¼ióÆOh*}pçßõÅ7ñlèdv»\ ‚?@zê©¥¥w}Óè:ï^¬ï0ÀÌè'&ÄL@ˆÖ™H/GÆ_(ÞÀ-"~F$œáo¡ƒ N4 ©6‘^ãŸÁ@<”Þê5¸.aõ\Áç Aƒ Ù•ùë³ìCœ¶u|׈¸ªº|»±ˆù†/?õÙ†°onz!óÕX9š'œœt,Ï>±=~e¦sEn¹{ 9yVŠF3ά6ƒy¡xÃCUµŒ´éªÞ(×cEévGƒxÜÐí'¬÷íòÄhû<:üC÷Mû†¤¢ŽŒÝ‚Mš‘㈵Gñc>â0òŽaÅu»e›m,ÙY$>-Zþðxù}öäËþ½™©^~Ïßõ·O­Mzª›É“Ï<ÿ›o|Í/|èÌ¥ƒßû'¿1Ýóš±oMúÔÿ òK7€ n[º_I·ïqî܇·ßò¶Ç®µù‡ÝÛzÁm‰«ðs@\9n,!2Ä“#g^ýX=ßýBîÌ{òP=‹Ý@¢Jè× pÆå¸¹üÞŽu¨ý‘(úèŠüü˜’E‚9%1Ëcy<3š‘ܿޔwë”Ä&¡øs(=ø^€Ùóx‚²2'CtËèBª‚šªLØ7¢îÁxg&<­G¬ƒð7õ`K+üP H'¨y¶ªÞÇ-!p›@„Ÿyõ›g>uîÒÔÓWçw½ù¥“éþr󎔎Iéâséᇠlž±Š Å[õ‰/ÒËn³ýòÇ/ÿñòû—§ù"÷/Oúò{’ŠÌíÇWR:œ.]š¨;v£Ä4æÊðÐà¿]ynã'Vñ;thߎG˜ð îü§œæBÈm¡£`s“kfqÏ8sCd©cvQO:]dåô†ùR-0°†öx%Bi1›[½é9YA,o ¯Ï_¿ñp½E3ü:-|û›€áä¶acñ0jKð@ùà2@oÇîA¹þðÈ,ÄU.¯o«ú‚`ð‰ƒiM#!ÑP7^‡˜ß÷CºP@Àd‚-;[BrÞqB¤|åh´;uR¢ÙXcçYÄ&臩wÆqK]Ó:vìXC@㯹÷_œ^oþë³×çëŽâñs×ÐûÒ¹ôÃðÞö£O‡Êu; U@Þ¥K—ˆv)Fvb"36jß?öú×þ X—0CtXBdf‹Àíw}×c¨·#•×Ï×Dî­oåÛL¸AtEp‘O^î¯þ]Ã]ZŸ‹îÔ óâFÝéùFbQÅÿ¢‡Ó½bsN-ëèñnýÿ DßZˆ†ZPGt—7pjå±Í°$‹¢Jze·"å‰ÌaáȦÍV5Ñ©£+ýDü8DRGU#eÛ†®Ÿ­-@j@¤7ðŒ¦H .NâKÚMá–m~d¤}"b‘a; ;Ô¤ÒüÂBûãÏžù e>úè£f¯êº#Ž[EÜ3ê£Ï½ôóßðº{~à‰ù­·Œôl6>ðÐÐýäÒý{ôø‰_±ßGÐEDüŽÔàÈvF÷Ëöoù¾š´_6£¯ôò‰sKé¯?ú`êƒÃœ½vÝÁdv4‡/#¾Rf·ðýÈȈõnÖ7›/­ãSí]c¿$nx"ˆ%R5°€»Ÿçû$#Á½þŒ¶ë:§Ï²@¡ 9Ÿ–x&bËå¯â’Ñ|Dâz¸QžëLëfF"›}êßxõÁm->:“ôßÅ:^…½A.PbѪ¯QOâ’-_Vô÷Ìœ†"ª/z»,ÂKYÈŸÔLâž±ô¬L òËŒîX/&#¶%8<ß;¡¤waî5÷ß1víü³;n1Ð-#ôhH‚F_oñoæÊù~rq£øêÞ\úoý…ÿ<û–]Ï?ùñþ³¹\UÀHÇq~àäÉü)tÿü>¡ C2@‚ÊN.qïõ¿Ûóˆ° 4Uìî+°xh9½8Í.$)å^ÚQs¼ß G7œU©T}©¶ÕÜZ_Y«¢Cg€8wnäe^ðŽ4¶žœXñY„[Äiy&’Gœ?îcÚNÿDl$ ¦"xfÄËì >† ’'†­‹Ä" ÃŒÍgÈ™ðH[€‡Ñ‰-×mß$VQ'ž›OÖ‘÷Ú+ g¼—¸ð™^££8žýå™mà_jU°Ýl|JVñ›)j6œj×GƆKÍbñm$ÿPÇ jv‚¹»[I”"5çÇ^÷Сzã[òZ!׸v²ògFŠÿìþ£ÃÿËÇFzþѵ{¾ù‰ôéÿ4Eº¾T²ª%ÿøÉ“v~ú½Î*ÃnZIHèïœîu¯Ý¤_Åõa¶Ïìo»·ç»w ¶Òé™…ôé…Úçøx«Ó¦/[ׯ¢?Ö$øÀñæñã)ýò/ÿÇ“ù¯ýЧ··×ß¹97×dÞiåD¾ÈÚ*²´¦95è9ÐÍ Å7Çg@5‚âáB%’†Dƒ +¼ÃX'‘ja·À‚©VB଀ bD }¢\®MÝ"¨žk Äi×J¡ˆ+ùçÚ…ØÃ²Þ¼hù'3øÛ1cK €²~ös—ÿöžÝ»~ü÷¯5Yµ÷ÂG?Úx÷ÃËoxèÚ™_¾~î×ç¦RúÌF)©™žËï{ád~ðlZê]L³½lÔ‹ü—>¼MáåÿUÙŽ<æè?–”,¬“Ç_ßßwÝgXù3ãäý­ï92þmÛµfk¦ÿpþ5»æ>Øñ_^—Èóvþ¾¶ß÷¾÷•~ög¶Þª5ºR®¾³¶½ŒCP£Õ?З`éo„Æ.â»/Ç+è¶àˆZÆD UK;ˆ,’L}¥ÀES‘^VJ:‘Ô…9†j‹0\prK`ACà·ßªZȽÙÇɃ@±8ëÈÁ%<Î6l±ÌיݷµKðìS¯çó q-2ô|”vÕŒ•æaÞ±58ªAì šR®£ùñqF(OÕÃ:†±”¬“Èoâ´¾´tÇÿc9°ð û3æÃ¿÷Ô_ÿŽÇÎ\ØÇÝ?1r÷ýûŒ§o¹ã .¹?5~ñÅÞsýì‹ïY¹>•f'/¤÷n^_iì]lî]m¤rc»¹ÿj³T™Þ®m6 Å ¦ÙÖå¥ùËókÛ=këʼnúBïÐìÙkõE,SóéÑc‹éÁ¼ŽçZÇEÔPÕ_‘¾>þo~ä'þäÝ#?Z)4¶Ï ?\ÙZßzêõWÿ“m‡¨í(ä·Î"?ÀcÏýμÿ{~jïÞ}?áb±ZôÖ*n ¿œ[dD2Ðõæ¸ nÉ}ÙɃ£×Á€xÈÝ+áÔßE:9´™y9q1[Ø ´ÔÙwPÓ¿yi„Ô×@î/§ïG-ñ[ë£S’˘=üÞš¥HÉE2ÔÄfÐ.C”¸WMiC¥\ð¶*oDfrùð‚ÌT à¤DA´9"ú%Š”qØÇ-—:}æxxÿûÿ÷Åý¯|÷Ÿþ¶÷öõ Û_÷Èö:¼¿t_ùžwÝ¡ÁqñÕtmª;¸Lð•9ÂwµZ¯­ÛŸõ™©Í”\ƒ…,õô&ts6¡Ðítm¹Q?˜¶˜m^©]ùÕùÚ‹ÿfkû®4:Ã^“‹þñåÒÐÈuf´æ6[¹åÅRq{‰Šô VVªÍZe"Wí©Ü1T)¾i¤ZüÆÃ#û×??ö+S‹í‹/nþ˜myì±Øxó«’>L»b?ujÿëŸù¥¿õ£õ‡Æ†þâÖë1›lžžÊ0q*Š‹h™_€(#ö2"•smÜwOu{8DòH†è ÇÖøþ@€ˆê'V¡ƒ‚AC²ˆALMÂífTD÷(`¼ëíé • ˆõñ™Ë½‰h„$(‚ÈM†QW¾Õè謆’ŒG7ÇCˆÈ×Ù[FHº‡yI£P ¢~ü¡Y™’|n\оùjÿÜN•vT±:As¹Å_ý¿õïøýï~þßþ{§Öîå<üš7¾ñÀÛßþÖWÜw`ßàÀàëÀ¡ãÕöjïèvhémõ ±‘ sÌx‚UÐ'ÐYuì(ªcÖjìYè¯m­õ·Ö×öà:|ÖYíÕZ3Ú Q^.q‘;9ö(úV±:Bd+ø‡†&Dà¬áϳ÷üôv~a~ñúKïÿý©3)ý–ÿüô±G‹v”1bÖ.\¾òÓGüs¥|±—ðXHÛÍLßÉD‹àˆ ºz¸˜{súÍþƒ7’$X‚Àmö>è‹x¦€:ÞdD¾ž¥ ä#½ß˜\±Û{¸°«u$¤ ž‹—îý¨ç`àŸÎ7¸`èðŒ¡Õ0‘RB¶:Q‚ƒ#EâTˆvXgòÏМ«ó;žX‰Èi¸Q¸PÈ–>+ÉÙ`ŽcÇŽiÛŠûðçv"ö—ò'ƨãy‚U~æg~¦Éo½|Ÿô|îÉ'“gç°Ç3Å2¥1î%£o<|pߨÁƒý•‘QâsŒàÖÛ7ØÇðôõB«÷æ ­~vf'¨Ê®bßX©:²w¨§Ú“+3õUÀ½´ä`#’ÿnyþ\ªPuÈ,±æWÒÂÚR}šp°Ä½û¿æN|ô@ü«ÖÇ:sîXÎoº‡ÈßiÏÅùKïÿ4ÐúÓÛDjv[ovTeÓd0ª‰.b]&¡õŸÝ«;H£_¤4 oɺœÞ)B7`qÞ]Q]âj`|VòИh˜°ƽ+ñŒãà‚ÇÅoESlŒ˜aî‚@ $ªF U힊,Z¤B%TE,Xt{6,;X8ÐJ@Q¡D¤¢6´ª¨HÒútâø1ö¼<ïá÷;wÆ5®EÒRšL:7ùü=ïã»ßüÏ=¯{îz±Vköþœol_\ÊÔŠ'O½q޼‘îÉÜ“£Í×øï$æ¸[©mÿbzgâîÂt!×ÔÞÎ/ßuþ‚}0ps%à‡‘…"À‰Ï% Æ„š€,–ì“L¬ÚøÊ’›GpÅ“B‰¸5 BchÊô®ÓgéWN"O'$¿$Ë“OÓ~p%ìÝÃÁ³*) "dmŸ5Æ}ê·\ãHDlŒoè=“÷¤O–›IRè)h“¿)Ò‰ø;,®I°¯óV€ eØüAØÇ— Ÿ<oŽESÛ·ø¬o%ØÙÁ¹Ü…Ç–%Á—Ÿ~îÔ“o帲#Ú1«çÖ=†Ý•åž§Ñ‚ÿuîâ“3…™Õ¹¹æÍ¬í×m¶;`-ÆÓZ˜Ïx-5ò‚B9[çQÀ±ÇV€`ñœ&:Á¨ÒÏyúŠ_ál”2ðmý¸æ“—88‡@™}a¯Bæõ›$FæMÉÊ1{Ûã碂hA9ŠéŠq*®Ìf¡¬„ÿ Q<ŸžS¹DÅÒx'2s¤ )d œBŽy´«×åuÝzDŒó‘aJÃ@ö÷§_Ùm7%%>0Œƒ»×÷øM±—ˆôíµ£ƒ{cäbÒã˜o»-fÊíöz#&BÊôƒ_Þàñëfà»¶íâ­ŸøØŸ°uß C¤—zÀ 0à¦X  ´éi´'—¸³«)Ah‰²ôÁ¸Šè ˜Ä9Æ‘—iµ²ÕÉYˆ) ^üž¦QY æy6lü²lä"ÂzY¾!Èu7ÀS­"ƒ.Á1§ßs‰åÐ]“«Z3¹e%2C›ik×vR}ü 8â#ø=ŽOí5ß„}ÿq¤ 9Ú6Œi À»éçôûëç¼»çüÐßMy„<½{–Qj~éX§Öéü¡ÖhÞ=SoŒÁd:y~öLÖ&^ˆz´À,e’Œ£¥«7Eb„ NU¢)_Ç•PBXúý ¦%ŽÁJb´• Õv3.ŸñùbNÀøxøÀÀM°¤<õë\$À3è?§ïª\"nµ$½ b†ŒÄõð䞤*€ÏÞ GƒvH@lCPؤ^¶ÑØ iáTHC¤ÿ‹Wÿ €xÙÑŸwØ}ÚXÞÚücqa²²0[˜Å†ŽB½ÓÖ®Ã1tªgÌ$`wIB€Rx™BT$¢¹u• ¼ uäqNÂ…ò;~’þ¬> VÌbœL6b}¹ P¯9 0ù $iLN]ð÷°×Àb$CÎUP÷ ~`wrµ:«0ò’. XäæHB·‡X y%z lÃÕ…ëݽ!)|j(’o;J£8°ôk÷Æ£þö,S}O©|«µv‘±³léŒÀ1Jóœ,·€”1rŠB¶àå?é@c,ÄDŒ>"þh»Wnwª­´ÁäNyÜ|à Ð)¶ð#¨÷åòü4†Ÿ º6å¤ùVF’ƒPbEÒ=ŒO&у8Î!.¸‘ÆÕ§´[¹Ãý—ʃXœ‹bK´…öÓ=æ°F`½UݪÆ«¦4"ÃôµÞç¶"*u———C¸íVÚÇ ÀêTà\ò¾S®)ÀPøPÖÁ ’„ÿ×?ñk“‰æ ÙzG^þ9/PN^Ç]ý \šL Bƒœµã;ïÞ¿1͘aœ*!Dü…•ŸD)¨nÂÉ@Q<&Ó¤ãzŸ]·t®ON1ŸEb"R´Â‰÷ì PLð}lÏ[š×Ƥ-ÒA™X„íÕÖše¨J… ÇߎïtÕZùâ‹/‚ü¨Æ:•*Uñšc8ÁÈ Éc¼>$Püë&°ú –+ˆ¡S¥ ý{ä鉩<4#ªæ9Gü <EJÅ Š­ãåYÇÎ'‡à‚/zºéPD H–ìÚ y'¸¦ ™+cðŽ|‹©ÂL˜ `% ôĹn…$}tj”ëÑ÷ ‚ɲÈÒb,¶Y,öÊÛ›(#·Wž9ñr€È4D‚ºQ{GM}Ÿ{+€5ö^xþô¥£· ÷ì‡ ÎÙÅ|‡9ŸàŒÑ8ÍñÒ!8¸Ž<‹MT1¢J4\<Å%÷N nàc`ô íù‰ppÃÄ^0[®Q<”œr˜ X®ú¬|? ø'\§P Ã]YEÑÂvò/‡¿€a¼Ò3-ž ó¥\µøœdË: {ÖÀረõ™-¬Å"~ã2Y_ßȬ­^ꔊ[¹b©öø…•Ó¿4+ó?šÏµk:8€kúó\ë" ¨,ÕOÔœ‹ª„£Åè‰ÜÌÈÐ6┤€ìºþ‚þSLPÖÖ@Z F|‘²aŽÓŒg}èEyšÜÆ££¸£ü ‘œqGÞ/0R«üÇvH4 ÷=G4"}Ô#tÙø`ç£BZ¡Q§àìÂÏ´_œ×Ó€›q‘PZqLxyÜ‹‹~cc‹~™•7/fVß\Ë\`ÿæë+ìWÛkëù-Ö”œ™‰I`wÆÎ—¢d¯Ò¨®¨°ü®\ª>—¸ž\ÙÁX(Ýô ä¡4¤ÜqBu ºù:IÇçØÌ@~ÿ  )çà¨ï쿱u 6® fÄæÀæp¨,”˜DÐRDƒ”¦ Å%ù-#;e|닺87ty›u$Òœwp@ûZ]Þ;‹?áÇòuf˜6êÍïŸ9sî©° RÑOýó¡Øùê£4êËõ€Cf œ}ç?_<´pïáÅùÖ¡° °åÓÌÀT“ï-˜™#«\ü¾„ ‘; ªK\ƒ€OÏ6‘íC¹ÈhmuIóo´aäp€®ý¿ 8k€Ï€Fÿqí>óT7 |Fp§ 3£n@"£§¡kX Þ%„ÔN¸€xFç'‰„.B_¹†N¬Äì1–N‡P!¾ð>´áïˆ@Ÿ>}æ×ýŽ“E:ðÛöÐÿ‚£ÝíÞò1;aÎA=ŸX÷bú«ã8>» p  ¿ÎF9lÚÕ¥q,kÏ™Á7ŸÉÛ!2p'¦]SFÓQœX «t«ˡʪϮØ+ÐK¬ ]eM¾Òv­W«î0s›ÑžLä ÔøO>I ÄéåÐmûÔ mãd!Ï .§’F~Ž{˜³Æ"öÂ(]¶ÓÍêï·:í5¢hÜ8S¯uòFYx*ܦÀóëSJêô¢ss­ÀJ· n¾%Ll|ýKhÛ«±L·Ëv×Q9P yñ<ŸœœÈޱ|{0âsX#ôñè>r”­˜ X ®A—^2w:œ[¼é†\Ù¾ÁêÇÊýz1ºNÁŠE}$Lrh8šÔùZ©X^¾yéÈyä‘ {; …ßn\Ƚׇí8‘ãakõ¨½W£¿•Þý_ûÊÏ/.|ynaº57?—ŸrÝ>´ïy×À”Ç0jd3XGÛPÂ!‹ËæØumêå­r¦Œi­ è×6‹¿ A`ä¯Uà¶;]´ÿ=l÷Ù©BA><8 ô„€—²»a~¨0ÒŸæÙ—ðRn M¬0ðo!Ào´{ÝÜA›úǙð>·¸pËÌüì'! Ý62ÌÁM¬_ð‘¥›ŽY<|Ã<~+Èõ§‰,õŽ—–æ–Î1%}ïêrY€?޲/ì Wã#¼×u>ê{]ë°4²µ¿ø…Ï}öÈ‘›kOŸ]˜ëf ÄÕ`f¤y^ŒJÔÆ+c‡ü^'˜[©TÁ‰f ›úff»VîU*åudtÀ3ÝXafzÌ\g‰þ£ ¿V©œc*òIXù漿ôÚÝձɉ «\:yòä«ÿkwÞm9\sæ¨nÑ÷IÏþ§†÷|D†÷Û]–+W;¢÷¾þÀW:xáþõK[„aËæ'Âð5Ý©·w‚ÎN]7Y¶ŠºrµW.Õ;Õ’î³ÔhkÿÏhÍpk(Øpñ)dT*ê`„⯎6ÿvµ'QÊÕWÖV~rþ…ó®»p`2›S¶Ë®y@2$|Ü»ƒ›i™‰×]wéç°+ÃKœ~öìÙÞþ{;ô—쬡«Ñ üßzÀ±˜Âƒß}pyzzòó+o\ žbµ9®!×´µ;_É–QÞá9œ™$þ—‚n¿³³ÌßôIFH>Ü-!Ç¿ŠÖFë©òvé±gŸ}áû^Äßk`Ž fAíýi•©]ïËs%§YÞÉíºá/÷ò#p¹Ý[¤à§) ÒCßûöQ²}³R./ÕKÛhî«!ïëTãj=r®ìrc„Wé×§&Æ7áëßÀºþJ§“=‹÷ÝEâð­<óÔ3¯QÙÞPo.±¦ç‘Û™›|lWÛÀ[ÃFÞqŒÀ;î²Q{`/¸ïû>Ôí¦RÜ<Š}üF¦øF˜ÂcfG¾Ëq?QmTŸªmnüíøñSF[W‰v`ÒtwçwŽß’ÖƒtTýÀžzo.þ¼iD|Ež88IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/sadface.png0000644000175000017500000021171412412506713020556 0ustar sergiosergio‰PNG  IHDRzzïÅ4Q pHYsÄÄ•+~IDATxœì] `UÅÕž¹ïeßW È*‚ZW\A•ºU­Š¿*Ö½nÝÔjµUQÜÑÖö¯K­kµ­ˆVkµnuC”-„- $$!ë{wþÙç̽÷- ±?§4Þ{ß}÷Í=óÍYæœ9&„ ‰Âßv¼´­ *((hnnÖ§¡P(‰ìèaŒs2Ó[Û; ÒCaüæÙåcŠSÙðBíø’´ÅÝ!G]Ò<ô¢Ao¾ùæá‡N¾>oذ‚´iˆ8¢%ò‡_¨¤‚6ˆõî”9Lø7…ÛÀ~&ÿÄqÏ}×dž~\ Ju ÕèŽ+F8SšëtØS¡Üƒéˆûô…,Ôíàn\ÈùJ²åÉÊv3M¡Lʘ»âÆoô6ˆ*9ÍanþåYG?4"üæÜ<¦Û#.ÌŒûLúqÑl#3[Ÿ0îÁ¬q¬}NÓ_‹VÕ¸{]Ò”wF}Ë£eüùªMü… Ò_þò—ÞE…àçšOZæTÐEÙ»Ó7#).Š5ÇEŸèH!‹™ÉÌ…‹+MXá¬b݇YFqUi˜>„6hМºÚ;‰61^òû›:‘`D¸à ¾&g k ýBÎìõì"JäG˜UÀåï,i\c#SD›8o$‡zyÁôQ¹ç׊ؿ(kÖQÏl˜6mZ@ƒ4˜ýbåSQ–Ãä/W„ çÁaÈgìt©ž¢šk™.| îl0` tG$ëZïL5®â%ë¯wÖuµ¯7(==}äüšå%ª¿jnLAC­t+îÊiˆ1®,)‹‰ðY…sÈÑ-ZÓíp®8šsšgn×óµÔÑÑÁĽ`· K0?`¶hw“‰Öšš$ U›Ôo‹q‡AS„×–uÏ 'äí²Ï?ÿФ۪;Nµ¦ÇÑ"üý4©ávÑž¹Ê•p˜wÇü)D¤´ä&Nˆ7 s;IÖÒ%*Æ¿KªMŽOlv殕ɺҺMÌW¯ÍF‘>RÖ·´o‘jÒ5ƒˆ7È’ìo7k;ûîøÓ1Í«M®úæŒÀ°‹…íg¾¦‚H.ò4Hø|ðAï¤ÛÔü£ª´4¦FDg±FP­ÁÆQ”êS·)¢:.ÊÇ”µf¿ýö{ÿý÷cýh(»Mé¹Üü aé„8À.†¤'ŽÕF¿HÇÙö)=Ѧ!C†Ð7£~8õ|¥®Ðs1Ü.Ö„µ]áêŽCTúQyCǯLõ¥A”ÄŒ 5â¨vpë•Ò= ÐZu Îe5P=E5J‚1½k 1GÁ&åùRŠz0üôš‹©}C½¼¦ÎèQGEÖ¾–üOô®A‚šššÄõ5:è áÝAª¨¨ Ö–¶ozK}÷:¨ç»xñâ>=í|Ñ *^¶s±g›Zsçw^sÍ5ðÊÔ©S,X°ãZ3räÈ+Vˆãé•Y×ìSpóA…âô™¥m7þëXÖôÀuý3{ýÔñ3?›ó%UjbŠMg)Oø”=²N¥ý§‘<…ú]Ї^ºgþ¯/T3CZWð9¤,¤=,Bq©1’nSRѱ³Æå<2½DÍ5!ÖŠ]þwΤòNœËÂP÷ÿ§…>ç7ÞȾ´¦¤¤¤±±QFéÂjæ+¤ÃP ¥I5EÆ~"ÜÃtðœ}sçì•—qÄ(.“â…¡è_fÕ[±5ÿª'e˜¼RƼlŠËÃa®šÁ䱺ì;«ûƒRMAj¶5qnÍV;ös]þS¢›D;TˆŽýŸíêŠâ{V÷"õå—_š¦¤º0&ÿŠ)s ¤&Þ„‰E¸¥F½ÞG,JQÁnƒ4^><ã7«222üÁè€ÖL˜0AÆ{DSx¤´†MöèÀ*û‚fžÝaF Ëfjæ/Ë®Ä28ÇÂ<×TÒ%æ åáGg•›†nJŠ+u!’wV=½³ùÙäí)17BòOfsE[þ8;®î#é½ÃC«5---ôïîRèÃ$>ž÷Ãzq3ýIƒ\Íb''Ñòάßòäì¨>8r¹Î%djS;N[NÞÖäåå阈&±n‚”æìí)ø¶ÿó@óï.É—A'dÅ¿Hm¹¢"fÄIbÊ"3a9@k›£ƒË8ŒeЖÈiJEÏ¿×õÛ˹§èЉi1ׯÛÄÃM£ S) ¶lÙâmMff¦‰ÆÁpSXt“+hp9›9Ô^³z€†;,d&â„c_ó†¹úèósʃcMŒÄìÈŠƒ±&x;c•ž-Db‚ÑzÞ~—Ç0"g ¹’5–A–PН¿þúwËF2ös"xã„Bà JMAÝlvd˜Mð†TXƒÈ)½ÆÏ³‹'¶‰Ç¦eÔMd”I‡â¢:ÊÄâ_WŒpGز5·ß~»ì& ƒ!þyh¨0©ýg.c‰µTœ5Â×$§qQVW›“NŸÕƒD ;08ÄßDsÐSX±D7«x–Ï„\»¨e+±r:YŒÍ'¤eR®pN„\vx‰fé8o ¶&Ñ`kT ë¿‘QKЃ!e»ALóY*®:(dÅýxàM!2î„AŒ'Å’IÄŽ,“è#ŸË5(¡.Æ$‡¨ˆ#ÐJ¢ˆOF©lèóÎR:ÅÐáŠuž˜”Nqœó0Oá‘ ŠMÊŸˆ#»CÌ‘ Ê5vÄÉÆMR$Û:~Ïî†â»¥Š²nyz‚gxÞ3 5ÞKÌ;8U¼g[ü¢Cµ´ªSoz?—=N‡±Ôœ†÷É­AÊx“ÙàkTÞÓAX8¥wá-JE“™nz­P:êáV›€ÀôñšÙL ‘… ¦mÖ7ŽªtÞ}%CØÆ$`b»ÛYøFôŒË$‡ ¦nÞkdøÍ[ tÔŒgbÓÄ Öp+‰7EÆJøü¹Åù3™½¡oäSùËÆQÄUsÞr"W<š¶AS÷OÙô^*îqFŸÐ²±ÉýdydÔ…›–ÝSª^ƒù¢µƒ¦Ú‹ÇlœTgÊ…ŽU’6K¤iþK1kGÔeÑ!Ç•³Ì®#¦NåÃx>›lsìln}óT>eUþñuMîâ5‘q¥©jò4ÈÓšuëÖa,§ïL®`çþO]j7ü±„ð8g,…¥ÉÂ&]Ö0¬æ£ô—lá-*rNÃäŸ6¶>8X6T5(ãî•=ö˜¯§äËñyMžôÂÄ9BóЦ©ÊZ€¹ÜeÝÊ£¡Ž£ãõ˜è'ððQD³X+×?8`À…õ¿x©å¦©ù&‚Ä“Î=÷\ok8à€á}°úÒaD¹‰ûß±±õ>b¿ãˆˆ/7šDDÂQªÇô¿¡Cr¢_G6ΔsÉú›/Ð1›Î® 6¥wß}×8úr}’Ùo\Åm¤£¸2v„”+ã<B•¹8mûM9KiQ¡µ‚û¬p„ÕSC‡xuÝåà àÖ_ ¥}ÄŒŽ«ñqÄBF¬+¹5©}Hê2ø€MÈ™¤ý÷êòNd“ÕšššÃÖ; ’%û©Ü¤”³š÷' þõD‘ЉÂHÖ÷_Ú ¨&ã ÔÑdxÓ * +â:ü˜0k’y8ÅÕn ô!*P7‚ÒÒÒ¨#(¢|2Ê!t…¡Â!¢ ÀR=…‰‰ë Œ<Ò1/F~齫éýµµµ‰[ÓÙÙIÙ3àÞÕõ— ':›F‰«&DùuüÚGRÎF•$Œzú YÛÓÚíö:––wWõ–«*t@ÒˆT!iªúzJ‡‰x´Ñµ›A÷}Ôòã·{7c¢ĺLˆø?® (š0ç f@@ê IU±û(3}™M_›8qbÆ]‹:®AÁËi÷ctS¤u$˜ä²AQ?sYülÒ¤IŸ~úiœ_L0ï'bL&Šæð cH7{² ƒXµêQUìŸYHñ ê}…BÌq¢ÎKºtx†£YcÂUfmÇݬ#GŽ\¶lY2?”ì|1uÅËéÉé¼4§î’J%ˆµ­‰Žy®öÍ5íâléÒ¥£GNò'zÑMšáåååw¯ðß@ž¥½}l[£iíÚµ}þn,ÚÉb0;U|jg£«¯v6ڡܹîºëî¸ãŽmyõ¶<ë-¶+mGîtttdffÂ+'ŽÌ¾p¼{Ž(f'Ь֤m~HDjž•M=ã·F«AÔá¡^Fÿ¶\S?s§¥¥%//OŸŽ*Lýüœr$ad<®ò‡ÞÀ)6K€+„Ù>db=dôch~Q¥µfÍš~|þáΘ1c¾þúky\”úé¬rÇ"&]ÎÂñ[áã!9B`‚JKEÔMVõ÷ʬ֜êm³MÜùꫯvß}wqüÑYå»—¦€… D³C{Öš*= ‹€ífF†ÀÁ:Îø2¤r—uh›{ÔcœþÐjÁ&ê™Qw¨Ï/ØGîè.œ^qá0°úÄǪiq¢ù¢Çˆó,~Y ."ñ¢²ïÅZG{*ƒ‘lÒ€¢zo³ õš;š/µ—TägbObƒ—Aöúø‹5²l©¬æiE\’_âSJ20æÉ lBzY&½Nýyz0à¾ê¾ñ¨Ü)--mh`Ó¥us*ò2° Lmð3È„Tà(31ÃoNÉÀ燓¸r²ÆÌ’’ë/ÎVÌ]µ]²`‚LyNxÙì¡Á|‘+ðìa%_z!ˆÔxò2‰Ø]1ÙAÔ"|Ñ ÖDÅl>%Æ‘òhËUz¬õ[ú¦ÖGÜ;çëóLò%cd™A‡CœMü½=ë¤ _Äeε0_ΌȵÃD¯¶áìÐéë‚#!dx$º“'/Ó·(™W½hÑ¢„‹ÕsG@†å,]"‘–b ;¶Ðd˜ò¿ÿê¸ôÑøØ£öLýóOsõ LB7?-2´nD Ëßpõ²Zóâù@|êX£†MîòŽa5PÕu¨;¿­«ùéßÑ…©,K忨Õü ;a‘ )¾¨Ü/z\ôѨ÷É ?ížxQÓgs»Ñ»LC±Lð†£¦`ú&ÿ ,ŸäéRÏJt3š"ü¢°ò›¸ŒJË€Þ'–]ÓwŒF£Ž܈9]2ãN­µ2Ì<µTHÍ$ñØ¿Ÿ5‚V×EY‚–;¢~…±—ËíuÕ¦ï)d©Q\U±éíˆbˆk.̧è]9#ÆfêèXÐFb!‚A¡PÈu]ƒ;5€5 éMqÊ€H& †$_äolúrMdünüŽÀÛˆVç1iņ(˰à"†Ïtó–GùXãI8ˆ?€e[„ æýÄf5‘—Az^/1wFŽIÿž96wþ1Å*3yYÃJäi¶Eul?XfÞídÄL;räá×ÿ\á¦0—¿¶8"µóIlIJ+#¢2 ITŒ‚Í”‡9ƒBŒSWŒÈ˜,ƒ¸#RzçS1,õŽB‡P!•¬á)6ˆÐæä;®KcÑe¬Íhø!1¡l„ž¾?½xR@Ò@8„V<ŸÏ‡‡ &DäWDu …«²98ƒge„§éˆ˜)â‰E!7-„»¢$;;»­Íú¡€œ@ú÷ü y¶JVŽBH),¦@Ö‘Ä¢›ÞÉ>­¥u«ì™“¦‡º=MéxbŒFOK\å@¸¨áˬH*ÛÛ,~âW™Ó÷O¥ƒHÆùŠybŒ•e®–ÊMЋYy~ê¨S‚š/gå ¶nõ.M–;óŽ,F²é gÈ“BÔ¶Ñè>Ö­~3[JzÚÆï^¥×…íGø°R«qXT'‹„ˆ+2¦ËV ³8" ö!$×ÎÌ“!yâG ŠT ièËS—á./ÍÙÒå–——ÃÙr‹;wÞy'â9òÚEÔ~#ÈûÒ<"ÀɲF†k½Œ´Ì¢H6(³½y¤FXŸ„y’˜0aDa¹IlŒÐ‘Â3.BA"fÎAÁO‰tA…¦ÂD¹þÉ$°ê.©¤P¼B/bÃX^_K²‰vÛszÊënî¥#¼MtåÔ„\KåyÒˆ±^¨Ø"r½$û Â×ëE0±À'ÿ [WÈíF\#*ÁލµÎXñ…·Mªvñ‘PgÆžHNgÝÂVVØNþ2ZŽ:&³Ì¸—X5È€Nù\"Ò­1V€£î(!^†Ij_!SCŽJw¸Gn^•ˆb°ÙœsXôŸŒAªûcšZñ¹#¿À‰ø®XÏ œŽs›Î†5>—fW am`åS6"ýÄÕ=¤úÜ<û~N·F nó7Ußæ£ÜS ľbÛó1±nã²òûÿÓù·1 gï#ô7î…PýgY qš‡’»-¦ÁÀ?/m;e\–·D1ÂUcJˆa/À/”)O0úéƒ>Óë‡ûLÑ(*ž`ToÈA oæ#¤ÖPÃfŒáªOA®S$¡Œ,îL›6mÁ‚×ýkåÖûb>…K~éà+‚GXÌH9¼öÖÔÍ¿¤iÂ8gù*wÞoRŽŸò,˜RBB/•byem-èÇ7ö,[N¾X°ž,J1•عù¯EN@µd õRɱdqçÕW_¥ÆTm[¼¡Ó1\1©90 kõ&jÐT\qeÞ ½2¦<¼ò/y|=K *›¹¹³›=¡;BòNmÈÉÀë Š`•ôe&]•c)™ˆEΈŽ;sG$3ÿݶúÇ6¾Xm!œ=á¾ðS®] .ØUxíæü}ǤH3/ªj‘ñTC y™Å:“N.tV]"?ƒ©!ØÅºgŠï Nkp]ÔÚArgÕµbĈd^¼Y:W™ò(+ÅiüQûUa¶„<ì°Ù„XaI€ªRþ¿_m&¢ ¤¼'[\ÊÃ/…—Å»÷þ#›-))Ù¸q#Jšú˜;-x„Dn>Ÿ$òr®‹Ï~+ñ¡„•u£¤2 ñ̺èd„ð0•+ <ïÈb¥÷U·v3^0 ®®®·/ÛÇì&Á£ JœGÙ©NÃ¥Úî˜D“ô`9ZÀ—S–êgj4´w 9¢X¦™‰ !w@UUUõí5·)3N—¨ÐPJ á-—Wêy?µtB+U¥ lÉf8í¢tAT„RQÜY°²cæKÄ—ÊÊÊ6lذ-o‡ú+«R«FXíK&œ" Ò)Až àxöJ%tä•În¶Oß~ùå—Ï;·_^ õ{F®. ÁVÂ* V?ªðéuF.RcŠ ËÞhœÿÅx#õb»ÛHÛ+››Ž(Xj„Rvvvæ=Áe{EG}ôc?:Q/dÝ®´ãVxBÔß ÚµŠ$íZ“v'&íbMLÚÅš˜ô­±†ÚÖ‡zè‡~çjãΛ7邏NÚa­‚´CYCý°^-q©­­=ùä“á•_|ñ„NèïvÓvg=Ÿ c*³¾lì[”úƒ19§ŽÉö|º¤±û©%mO-m­ÊKyw½)/8sæLqpâ‰'>÷ÜsÛ¯Ùh»²&??_W™CÜi莒%ç ­ÈãU•­u5é¥Ç–¦ü²´à—S ؉J˜³°áuËšØ^'Ï?ÿü¶¬"J†¶ k`t£ay)‹ÏÊNÀJ8¹å!1AáȸóýÓŠ…‡YÝ9á…ZÁ#ñ[´rssû÷-ú™5"9\Ÿ3>wîÅi¢vºJ>–“ÂpõC ƒ”ó-ï“ b*‡T†[NOÇ>¶¦z +Ó'Vœö/‚ú5—\rɃ>(ŽO“óÛé¥*À`¯L3gVˆJ8=óëŒ\¬Cä©,ʸä‚rzzå?úœÜ±cÇ.[¶l·/ÕÔ?¬1‹vsÂË.&ó,uN ®ç¢rp‚¹ÃÉÛïŠ/XäJ©$ ‘õÁ—»,ºûðâ1®[[ÑÆÜrË-?ùÉO¶ñ¥¶•5Ó§OõU¹gÊ}G”œ·G®Ië6¦2Å„ŸZáÍ€ÜMb*KãEe‰‰dBÅ ¥2U<¼ºnkô§œ¶q|mk4X¨&~næ@“X ÖyšUvÜÁŒ"=%JŒº’¼Psé< B¤zöðO6tøô:Ñ<:¸Du™>PßY£ùòÐQ%³&ä¨,{ÅžM"£YƒGbj(Õá®b¢Z«#y"×Y2ˆ'Ĉœ…½†¤v\UUtïªö ‡ÃW]u•È=ï-õ…5,Ɇ¯à’^~AÐ j8šàP܉¹jHjn~l‹ž%B.ÄbKôF›.«òàêMÑ»îºëÑG…V’ÔkÖ´··ge± Óó'äÉå+Ë[7ify„BA€)â/ÐÜD²IóÈcJrDn$÷\ÂdÝÅÃ_[Õq‹ZZZ‹v÷'kº»»_NÚ-[òE,tˆ·.X&Í‘8 ÇÐÜDm5çhU%t9–áv¹ \D»Ä.ù™Z•¾vvEùÃÕÔwë-wzÇš´´4ú÷ÀÁœ1,éô‚%€)z4a¥Øú[ÐP&ÈK”Е :SLiw‚<Ǩ8·^^•sÏJÊOñ~c»³÷È£6nR|ñ—mÃ*0–Q¡¹1QCIf 8DƒHIžR'Â^Š;á"°ÓÜÜüóŸÿü¦›nêOÖ¾œ02+€/!•CìaŠÖM–F‡ÂØ“e"xaUNå)ÎbЏ‹$%¬$‘‘8<›É ÂN6~áø²ïÿ¥öæ›oþÙÏ~–ŒFOŠ5úAO7Ðð. ŠÍ)nÎÙ ‚ `Œ²h°^*加¨bPð RÇ<¿Usç虹©NK·K5zÿT櫯¯c Û?J¯…ŽÁv$G´Ükc¬åk¨4ò€ÁF$l1¦ÈzÖ r³¢ÈâN`Ç!õ—VȤßξ°F”N™Ž!dà`•>e<4SŒh;Sȇ%h„+\Jñþ<CViJÊ ¬VD …'ÆÏó¥Åêè­[·ÞÿýsæÌé;k„ˆ9dHÆ‚SÁ6+_%h¤²Î¶&ygÊ*¨©¸ù™~$~ ¶†BZ³§5mq+Γ•Þ¿­hÜ`3¦V¸îˆý…ÜkÕÞϘ¼ýƒ!‡üiÝ¥—^ºM¬dóY ’xñHe^ 3$jQ!½ƒ{Y—íãÑüb±æ äŽ/R£GþÚyío þ'߰騉©Ï^U€]‘eÀù…rW Îf¯ÜOoßgpæ+Š‹‹–«$fØÒ¨$3¤Æ…þkYÀV=!µ>S]Gù€/šFÌÚ¼ü‰`û!•½&‡‘x#íRB¾Zøy7U½0OŽP#wEmxàðÛør‚ö+ª†=\³qS@AŒÄ¬‰ìôk.®Ì6=XàxѼÅô–ãÁõPãWîëìaß’RɱÁë³&^ÙøùÜ"¢¶”Ür—_ Dpòâ \ºwñÅ*©©©ÔÄïkÆølƒ²ýá¢èNqéã¾ðaõÚ¢à_¥4ë¶¶ÇÆWûÅPBCÑ!«&Hu}Tl¼AÅ w‘´’ˆ–5jX¹¤nÓV===TUQ…•,kôNðbƃ=óà:†/Ò<åW1ýÝ/«#ÆÒñ`G›ÂÄ[C'??ŸZ´æFÙ%Ø¡\V¯y!2{Å.!bŠ\GMŽž¹pu;õ(ƒ’eXø0£ BÆÞN%@è3ŽBŠ›±iÕ:¶C—±ýàŽò¼ÍšE/”ÖmŽ) IîÅGɈ1ñš9±Œ'Ö\r<1üç*³ Yc ”‚øâ‰@$¤Jäêo—ÃÆ üLRK'Â!é\„°”Êâw‰Â“1p4àd§:mÝnUUÕÊ•+=^]†x¡?åïhŽHø˜1e ¤ÿ-€Q\7¥¬Ä‘+oBKObéXB Sâ«#ùzp"J¼ˆmkˆ¬8Ndn§Jœ»W®ZµÊÿð˜¨aõ›‹±c1B ªpãIÐ+Gï—òêØR$ª¶ÂÒâF‡[ôv-ÂÕŽCŽÚ´ ©Ú€HmÃ-†•«Èf– %=¦‚k´!^ï'=“iw¢eM†e3?Í)Þ³ÕÿËNMçoN¤‹¹49ån€ƒ185EMöÈŠ•øS8¼¬ …BÑhT…Ù ¼ѳ zg2N§Œ›ßÊ/<Ô[Oé³™$d2ì’ÆQ‘^˜‚)³Íš¦ã§¤œ73•íð ‹á©R¼ÀÁP² ujÆTEEÅ'Ÿ|²×^{ÅdØ1¶U‰ùéã‡*‘ddsíÛ¹e‡˜€ß•6p ÚÚD?Ó"bðÏ‹àlø8køþímªÓ)SSúI&ÛpDje#b‰ãŽXc¤¯a‡ÎwȤҴϪ«§N ]*‹5O?ý4ý{ò¨loOjÀk…"9¢Õ“‚ŒAô 5Œ6}˜CMøÎIÏPò(¤œžÁ1œáæ«+¦ÄÅjxõ{™ô`õRQæðõ¹b’Am_æzëàðE×b&k\=ˆ„ñã¨*1œ•ïQž1wÅ&Û¥²Xsúé§Ó¿u[£¦'5X w›ˆ.#$ÜhKm vH¾èJJ`6ÇØ~öœžš—nôð¡|Ÿ9¡§â58bu¶ñô Òe_Œ† ’‰Êû‰䑯¹Çú€ìÀ>©âSF< ˆ¾hö!ÕDZzjKMߌkKS¦qÔ*ЀQ£{pàÅú(!kJ3CÖÒ7¤ØÀ/YÆ2ÒLj$kÔš-¥ís‚Ó$‘ëPÍ$_ªaB̨Q‡Ÿbe:²Âm@õ$§-^¼xܸq1Y“€;Þ©o0¸ˆü°I{/ÒS'FÒ#héaå2c#n]ÆQJZ–ò¿³ï ¨ø’XÍÎ ¿'Ÿ|2.k4L±É&bäI ÐŽ…ÏJSY²X–šÜuTÏ«Êc &¾eVªûÁËÃ×ÁÁ¯Ã'—eü{CÇ3Ï<“kà/ò+ã<´$7·-ñ̪(‚†bW U²Ï5Dlt¡*s6Ì煮€\P˜…ÐöÊ£¬Ù{ï½õÇ^֔礳ÝÇð$ð#»M^E’c{ꢚ‹´nͨѕç’{ù\ðÜ/ vÜ6›¥X3$øËñó+è6p›7’kOP J4j’|ù€VY—ýKhzYÓãQcñŸç¶`¶jÒŒSªV+îvñtI¼]k­Ü§û¼¬ {lö³Qq:ÆCnýuäÞâ$iØ•Ãño¦%ósIve¬a,ÜËš¦®„õ÷0˜ö¶ 4p[$ŠÊvoO¢ÅÁ´j5)­”žñùg¤üêšTùä`9g7 õ‚q"{H—5ßlî xyðò¦QZ®øï'hðþ­]1à }¡GŸì¡ÿèÁÚfg¦Fû1.ð-ø±HÍ.((Зƒ”·ù>‘ ߣã4…`•Ûïw*ŸÂâv ÊÙ{tÈ×ì­ ºMˆ»Û?dSn1«ôZü\ (ßNøpqÑÔ&7È+ÙtÔEl–kóë² œÌ´©>Hį¿¬`º)%%E?9k|à $~Ër®,¥ùÒÜŠ*NMP òˆCœÂ"|Ç/S2st*˜— ê·dA üâKÑË®í‰FPOlÙ]xdSz*®}¾ÐðB{FÄ{€ð…·t±ožsÎ9ú™1XãJ“ ô]ÈÀ=™4øäMí]Á*íÀ½Csf¥~HÈš‘ˆr·ÂSú×e‰ Æ ™Ç„¿?-¬Kí{\ÇÊšLvv“‚›X¢+ù‹Uq "¢xᆮ¼òÊx¬™ÿYË{åØ\°ñbØ¡òNönÃØt\êÕç¤VUðÙï0Aªr"5n²ØÁ&P‡Ô”ª5b @òßýð…,Q.¬ê¨ÖæVoOäÏll~¶DÍ¥ƒåãöËJ›,Öxàï¾ûî¼O›)kbâ…¨±¦¹ãâ¼Ó¼¥t&îzóá™äòìQÑH2E AvP_µðETñÑþ]õ×<ú÷÷/u_y¯eäŸÜ°å©RþuÕ~ÕòÉ M^~ÅaÍ;ï¼C{tes`‡]rVL!]Q”õyîV)£÷I}ê¦l!rÁd÷ù5SØ„‹¨ $ŸcÜÕP«àš,Ч«Ó©vѬcÒΙ–~Ëï;î~Æäç¾±å _ˆÙvÇÈ2døõ§¥L–O™2%&k ÌRºPå£Bø0+¬¿¹ýE“ùBÇÉ–d›nKXñX"áIgrWñ_^¦L»‹š`Í5OP$ Cºø§?ÌüÙ²FÎÚܰE¡¼Yu[(`‡uªÎy•%'`MÝÖè‚UíÓFdH6Cá"OeùYzñ¶—$k¦ï•öÔu¹jŸ ±²+JtÉKÀ~É“XØË$VÃÊÃ#]ÊÐ: xùcEÿü¬û„ÛX”‘þÒÄë?¿¥T°$eƒS;ÝàÙgŸÇšY³fýþ÷¿¿éß›§U ¶,ËËy„”s¾Ü°|@žóô•ù¬œ*â‚Õۙˆ‚¬HíA.;ã¾µšâ•’LQRÕ\3•sEi]_°”Ùü…Ý=mˈÔÁU#ŠðùN}äeÍã?NYóùÆ.‘Øe)¹‹zâþ»¥.¸±ð›•¸eÓKüU‰›æAz\NúË™«Z4 OÝ0£¹€T67ˆ{Z˜{“€Ã®®«¹½L‰-«¶”–ô™sÙ/ååå X£éáÏZfS=eKˆ£oçã3ÇYpm¡·â}ˆt-„TQsÜH쯡 ‡žå67ýfŸã¢òE+´Å³.׋Zæ—å^P»y« ¹lQ=­$3ÓÖ¼öÚkS§N½ê­†Ù“rU‘OHŠ÷‘3-ZÛ3u|ús— ¡ËÅ-G„+ —»Dq‹bÎÂ!HI1¸eÒIcDzýlàXuB±ç —)ëî,ru-Pê@ú|¼•¶O6aí¨£Ž’}OÔ àðý5 øç.,%r"B +Áds!¹µ‹ƒUìYܨ!¦™"´‰ÆÌñó{ų2ˆòÒœÔ0¾êù滎/2ECF.|_Šýƒx¬A¼ð_}}ýèÇj¾>Gªj-„WÆSvK“Þ\³ó¨ìzÉ‚Úg‡× åìЖž  BþÅXK ¢ø"Ë~+E^šàÍ¿œwÕº»fb⃠aIéâ§æÍ›—,kêêꨭi‰ÈÆaýWŽ&úð¿^XjþQ=ƒáSÕHŠ_ã᮹ ¥§AÍv 2­!\œØˆgñiÔÒúd2ïaxذaLˆ)†³²²¶nÝ:äÁÕë.ޱ­Òåã¥èA&Tˆ¥öÁ!ƒÕö…ˆ¨º²20@| kêˆLPo×ÇSùÎgmw EË jê°zõêÞ±¦­­¾î¦Žè–N’—É»^ðBgfÝÌ Z$Šz3Á6”„7  Í "…p‚F”ötÜ’A¿$/QxªÍå`NIÅäâa¯B¼¦],Ä ÑQy¼pá°rèÂö•Þ"‹p4´;Še–!#CnÈð(Ž c‰WøŽÇáŽHA#®ðĺ—­;þûßÿÞÖP-.ºs·ù5Ë.ªÄ­ÂU¶Ýhè0zZ¤L1‰+ŠCKOXb@!óÙÀ-T#(ùùbÒe¿ÍΧõLg/[¶,Îë'Uä{mkD `5¬°Xr. ›ˆÐJDÓÆ!R;8|üé-/=‰Iú‰ÐöS>d Ñ`ºÉ¬]xÀþfÜͤïI'¿ÌlâE?iii]]]w³òÞÚŸfoÔ$wˆØ‰pG 2DgqAÎ>‘©¸£ÅàvùÖy(ín>Ýïåmg²/¬éììÃjÐÕ.©`ûkÉ‚‘ÅÂ+¢Ët3aŨñZz@ k×Îʵ â ÛŪ[-fv¼ 2;t,j`Céã?NøâI-ê©Ó=ýåú§Ž`ä.ÛˆÐæ8˜oy£—H‡Ž°ôT" ñ›Âȧ¿Í_e³‘°éCÿ9Ü“2dÌôÜ&ÖPúòË/wß}÷—·­ÜTTUR»6wt•+“@U¢×ZÂÒ¯êx]n‹\} g¶À Žv¯’ä‹1Ó§O÷oç²M¬?~üðáéu4þñšMs*33´s­å®v€]çH'C2ÈUZB;ļ| {‰€”!À]–Ž8à‘Þ¡BoŽcªæs¾ˆ²Ú©©Iò¥¬¡T]]žžNErÑý«6_Z•‘F,îøe°˜Áq‰ )†1ydz ‡ál?å:3'Á€|¡DŸüûö®¦„É…÷­\4kènE)8D¤žæƒHï(kàC;°YÞùoDÙÊš²ƒL‰É#¾»ÍÝ’/½-‚Ô—M233;::öøýšé•YÏϨs3‘X%¡e°À¼ŽˆÙ)høøñ$¬øÝKÏ,7BÖh.\Æ3 |ár·|é k/a3jÔ(jJþ}ÕÖ‚{W5]V‰\#Ž>%"yÑx:aUHÛ½´$Ñÿ€nB€)ZAôy]÷ä'YlŸŠH* úðš},õÍ7ß,]ºtìØ±Â6{¹r›ÊrxžÌÊÓjÛ'bV(hK“xaq—¸YÃ). {©‘¥…˱ÇûÊ+¯ôíû^+k̘1D¥cR½XîPƒP¾Ú¤Ck%KÄÀç8š['D«…@Š¼Â»{PÞ<É—ƒ:¨Ï|AÛ^|ŽrGÔú¤!í«Ú‹*ó3¹£„ÑJzL‰u<š/Æá8’vdNP¦Ð{´Ä4hÐúõë·ñÕú¡d¡XE+àSöÐ*úWŒ/åIb™éé‚IòÍí#¨¿•u£…Žb“dPþ=«º¢òîÑ£GëÅØÛBýVè’ÂçÜsÏýÝï~‡øø¢Û/Á7RE‘Z-˜¤æäÑßA)óVQy'n9å”Sžyæ™þz£þ,ú[Nåååbr1ózí>¿8¨Pµˆ+PsÇp/-ý-þJ§A+fÄÅíË/¿8YØgêÿ¢º"î€xï½÷èÁ5Ñô`þÔÒ3ÇçhA47 VR$@Ü l„\œ1ceJ¿¿Ú~¥˜ÿýï#î”xà--,ßñ‚×6ÒâÓŽÍytê+œH\¬ü£†íèÓãzm¶¾m•”fìí ²ïpÇ7Üpßþô'*‹\øéàƒ¦ÿ_|!ê-ï0ú6 ¸ÓŽÿÝÞÒ®-&bÒ.ÖĤ]¬‰I»6AÚE}¡]Cjõ…váfõ…váfõ…þ_àæÉ'ŸüÅ/~±bÅŠÄ·n…B¡É“'?öØc£FÚÞ¿õíÒnš››§L™²hÑ"¤*£õêëi!<0+œ•гÂN” Œ0‹©uEI”Ön·¹ÓÝÔ™àôß}÷ÝÑ£G{®cŒÏ:ë¬ßÿþ÷½jÏÎLßmÜ\|ñÅ=ôPàG4%™¡C†d,ÝÔ]˜:yTöÌݲŠ3c”ã4I-±Çú¼¾-ú—å[Ÿù¦µnk47ÕaË„*Ë ×nå5áù'}?…õ‚ Ž8âˆø/¸ÓÒw 7_ýõرccÍ È 48ãÃÚÎ*9b¸Ú_{â:ê´/aš ßåq¹Î{åÈuÏ vOiÁªö‹6”f†DR¡ ë#<Ò´|À€ 6ˆÝ”¾ôÀÍW_}µûî»~tøÐŒ%›znœ\pîj§GS×ÎŽìF”ýù,É“ }QתS÷ i#2V ïèÓ–Û>ؼ¹3ªJõõõº^LVVVKKËNŽ¡7tnÜè]kOé¬q¹”ãÏžÀvkYPk”ùÑ%ZIÅNX÷ï%yHìK®yŠVË íCÿé¬Å㞯ý¦©{M‹,¢±uëV¡£Ž:êµ×^‹Ñ o“v.Ü466–””èS¬ºá‚=òÖ·FXÉ~¤¡ j$Âl_õ2ïuõ\‘&×'ò©*âUƒ2jï‘Càu #U¨ãåSjÍx®ö³]›:¤q¶páB‘÷““#bæ; í¸¡r…JÏÅòœ0õeŸ74;ÅñbE+?P€5c ¿•þöˆùk ] H'—y®»êc…•Ê>EahK'õØjQk‡Rkk«PZZZ¯vJßNô-ã†jq‘K}êƒ,úŸ¡ücK™d/ùeþר*`oÀê½^=å*É=1†´óÛÇÆ|bÆñ_píRAú6¥³DÁ Š­¼LTwi…¸a·GkØR5N]]]@{ìúvp£ó5M,MÛØ]yá0v"VVqþšül]ù„|`÷ àA‰Ìáö3Ä@1ƒ´P÷‹íOuŠ½Æ’…ߴ㘙ŽT±rsdüã5âÒ×_MѳdÉ’1cÆø^¸ïÔϸ‹ºg‡–yïÅÚŽ‰‰Ñ©ã7w´ý›Œ¹¬ª¬c%òûú²F1q’bFJy‰(ɤ,˜^4ROyFŒ^“jÑ#{ª ÃWUøbÝßWÉ5ÆŽÛ¿+‡ú 7Çs ¬PE½ë/ÏÊ;Oí„“@Œ¾ õÍÜñ«*y`mlë×S½B¥§Ôb>廢ñcWÝ Ö8÷Ñ ÑâGW÷ÈYÜKZÍÏÏdÕ‡õ*Ö––:ªß{ï½É“'÷æmƒ©pÅÌ%i³'åÎÚ=W£Ä‡VU¢³À“ÞÇ{Å2w<62â÷¨ž š ²rŒ‹L*Ô!OÌuXB–S²GÉ$GaHË$Y¥è#Y'AI Y—LÀB]T²cµ¥¬Ú^J5~ÒtYåÜšoxGîV¸ÿþûçååyv|îm+n<‘Èc+³ž¥0WbÆt¼Æ‡_UydL  aæ{€eÃþ¬P‡ôgÏ´~U58të™Ù©†:ËÊ}´rï"ñü\×–î*$‰¢Ÿ=ÙöÕÚȨ²Ð­§ç¤†1†Ëþep€¿å €â*‚T‰*Q]Óµo“ Šß"Wì“Å÷ rïY)SmEuÖ6FI· 7žt»Ý Ržå»Ìˆ-'4üW8â[ÍÈ#~Rp™÷jûOŸ²V ¿½Í_('ÁŽÚ3õÏ7ªU°É'WÄ"bƒH+ „î}±ýçOl…÷¾ýšÿºlƱ{¥=yy¾Ñe® -?´|‰l«åŠcâh<é/BÁ㢖+*=PÝÔÉ„›ˆ’R?ËŸÒš$õ70?¦<'üã} ÎÛ#WŠŸ5c:Þ/xâˆ"h Ç€ =îì!fdê@Zøiwþ‰ Ïÿ"÷ðI|7*hñÂào,"௺‚U̲«‹ 8eSà÷4ýõ“®¼3ë_¼®à°ñ©¢‹ÅöŽüXìð¡ h»Ë×VRà ^aòL¬kMÒÿo¸¤âö÷›ozO6ræÌ™ÔÖñ “¤>â& é ‡å¦|‹å(Q\òÁf^ˆø½n£¤¤{å3º'/'öÁ Hé,‡\79ÿÂ=r=T¸‹Niùòåï¼óN’-×ÔÜ@+ø‚=ò˜§­ hðAÄ3Uú+Þ+6b<2¿'yКÿJç?HXl¦I zâsÌò •"ë}÷ÝwËËËá&lÉP¯qAsú˜¤@c šÄ‚ǯΌÒþ— èÓÆ]Ô;Ð:ì²–ÅOçõÅÊQz ô*ë˜ñ§Ï‹uuuµµµ~:冦¯.2’,6zÄD†°…‰ö­Œ˜ÁŸ·ÄŒÚú)è°ñÂú¡ãÊ¢¨¥uëÖ•••ÕÖÖ&zC½Ã Œ7±Â>G—Z ˜°A£\¤Ä‚GÁBÞ´@z{ìõn`;ãS-ýVXûðög’Åຼѷ8Sb4cÓ¦x°®Ýì²bÆ8=ú'Rb&JÌp½æ3\ü¸µ!†°”;®¡ËqÕÕÕpÀ¢”S2Ô ÜäççëÓÙãsžZ4±´4¡«e¾ˆRû…#ó‘ÙPÝ!MLš>_Ýc´Iè)+¥,ùm7¡˜ŠI_¬î™0œmEI zˆÐÀî‘pA ÄŒ„Ž3Hk(Ñ5[ìG¾Fûå#2•Âzï½÷.¸à‚ùóç'ÓòdqsÑEéYêÇfÌcê ÐàØ Ñ˜ðh+¿n 3Ê÷VòÉ6“ûJEEÄàXP2VŽAŒ±lÈ6 ¸¸ÀA!ãuWáQŸ¬‚ÇV13ˆÕÌærˆÝþ{BêˆRáœçôOÜʒûe¾é£>:gΜ &$lyR¸iooøá‡å|ÂnÙ,²mÂ@=¡Þ€* … ]-#®Ä§Š"½]S¯hÊ>á!ƒ•EéQUüÕDà<¹5¸oÍ8tÏ”²&W°Ž™«>Ö¸ä[X(3IÁç " a­¡bBG‚ÐFÉNÃ?Þ§à×¼ö"â„&3%˜n`âÕÐÜ0œ§‘/ëñ«•J4Y÷(ݤÀä3U›þVX8=Á¦À~Ú­Ò1pGê·ü$UïºÔ#œx'ÕSºo¯ Ž’c@ö§x4VÿQA Ä7|Ó»®ºŠ·ÒERJ@'Pê@[Ç#„Øí䦃 ç}Ú,ÂX­­­LXM21n&Nœ¨OÜ-û‰dß{`áE 0„QoACliä3ZRNì=&üñÒØÛ>ûhÂhç¶kÒ¼±-~³D°&bRz¤kãð1ïà=Ç…>]Ü‹2{Œ ÝvQ&Rî´ö³•Dápp@ÄQð"ÊjDª´‚ûTC‡'!„Õ©«LgQ{œßÙô£*í^Õ××S+G—© ¤Ä¸å/×0k÷y5,Pl” $@  ›|Ìm;:"Þb;Lÿø®Ž~]¹†ñ&BSö /^ýôï™a¾˜" > ÕSBÏHê&~¥Tƒˆk2……Öÿ‡Ù‚×ÞÖýÏ÷e3RÂèàï…—®t?yŽúÈìÉ"ž(µ‰Ü‚TÂq #ìdGA‡éLï©O= 3È¡- ñóáË÷}BNúé§q87#GŽÔÇ2CÃóRL4éŸ$–K‚JB~u¦O5€,0„Å©$M h|‚‡Üñãt[ËZ +/1£U|HvO#oú•Œi£;nH§z >¬ej3HÙ°+{6:J~hÛE¾&„õ)RÚÊÒGHnò %HÔø+MÕo\SSsà 7Ī27p×…M)îa€'[ø¨3ÐI> dI/0g4¶íwàÕâi­5Ñg dfùT „ö+> t§‘åþli :È(,…þuíHƒO‘’ÊúHÝÀ$ò‰ÍsŸ9.÷‹¥þôÓO÷7p Å1•YçOÌ èx®i” ð«3Ë…úK"ž)”8ê»qA£¦µIäÏÜPÏDFg Ï,‘ÝiR ÄÿMièÉi~¯+Å€GãÈSÕÁ¾SÑÙÈ’껆½„ÈA~|À{8ªä=ó*Õ¸‰³NLÜvØaúø Q( û8+¾=þÛ|²Ç~T4"6àœNAg}Œà1óÑFß! 8ygÕ;IFÃ|r.ä&çÒÎÕ"¤ì\•]eiàï$Ô8Ø×ý‚?ÂÓíƒ")³&bÔ›B»¸“===wÞyçÕW_íeGÜ|øá‡úxl‘Q{(SðäNÞ/bäM`°…ºâ´¾4uªAç¬Àœ¯Î@OFÄðÎò9`y –‘qÏ|®2Kùƒ,CŒÂ28ð”{O—ºïê”V ò¡@õаŠdAÞ"`ëè^C¸43´±]N(<þøã½Ã ¤3ÆåXç~  PP ( ºâ ‡x…¶r¼x‚æ‘Qˆ¾ÙH[» ¤g| ³|Êòµ²„àÑiÉ™„§ûUzÐ@ìaEttr/ ò%ÀmA0R¦×©£sîûT¦ÅÚ4‰Í°CøäÑÙ>”x"^Ã&ßãb`Î;W(Ãÿ•D–×›KÂŽFÀ½’/Æû‚(ÛEI O„È|Ѹ0D@Í‹láƒ]²zÚ¾%/°øCì/¢ / ̨_üñ>7eee(ˆãfDAJÀï _¿ê À?‚ƒÍDO3*Þ$Ãlùt“ߎ†íQZ‰ðcâ Ò8.‚46ÁëØ}¯†8hj Iॠ4Èl x“AC¼§Ù²­8ÃÔé•t–79)jôùPð:H ¢X·%WâG“~AzÓRvJ¤ùµ›ÖŒÂ…F2^íú4R°Kll&- |ïAdÀ=Ám1ä¿-öõ ŠOŒ›H_Rê’¡¤Ûî¡$1÷ëëדßÜé¾ý6©ÝLÅ€;RSQÕ<ýh|Î9¡’¢ä~:Éæõ•1ÛƒteS%ÍW¯ zGß=Á @ƒ¾ø4ÿEñ4B<ß½ï±È÷÷´oŸ2BÝÝhéBÿÝuWÀÀ¢Í8ÿæç)S§({Þ5@lJCÊû¨¤ä|Œ§Rop™’’x=1nÖµÆ5kAí¿îíû¾B ¹³ð¢2N™Óñæ{½Ûaûm`mùáEÝ`ú"º7^’ú£³Uݱ ”X«†ã܆’º-@ÇÂ\ 0åçç^OŒ›ÆŽèÒÆî1Å©¶ „1†¼·Ay¯x­:â»Íwå׿ëºãÑ`/qç¤hÝ<¯›þ§i©èå²ööN‡C{¯ ?&‚¾ÓH´NáMp³ÜXeÛ“š¿yrIÛ/. ømßû%G6¨Ùp›rY­GYBEy탞Ón°VÑ~w©«M=_¾Kf:~{~NÕ`ÕIY¶¶¼‚ ÇŒÁ••¨¨„]ÏËGYY8+‹5vëVÔÞN¶4³›77’+È’ÅhÙ2R³† (Åii¨¶–l» ÕÞI¾wó\è@»äÄô[Îå›’0wÌ '‡§€+Äû-ì¸mÑF#ÅO9å”ÀÇÄÍܹsO=õTq<"_GBÅ#ÑnÀ(á=¼Åسvœe?y¼íþ—úXü{{8ud÷ÑÎùg†œÌÃ? WÐ8Û((¨ |ø,j:h°úÈÔÀ‹sÅ_]õÓÅo¿}ô‘Ͼr)¤Ú¶öÂ¥H½ÿ¹Nú/-=û‹ÜƒÅ2r/V°؇ ìA@ÿ9^qõ“Ÿü$°1qC¦qóîúŽº¶ÈÀì°¯ï1†ñHÖÙ,:£ƒ‰,¾…e‚–(@DÍ—¸l•PÁI ±槃öÝ#uÉïnÏ 2@ÎÊÀ©dŸ0vUW±‹h}{Ö57‘Ú†Äs]=踙ÊÉÀkŸ(–Ïž^'>i¤b] @DØ?jLÄ!‡«`E<û†ÚDºxÀi¯Ô¿ušt}1D々M¿:*o…s¡½;:è줖îNžÞm˜3÷šL;÷O¦D‰…ôX¤h‰‡ #Šß#â: †ˆòu¥u{"AóWhCÀ wí^ä¯FO‡”:o>ž…ÔÍ—ÞÞþê¿{6·ÄH­$ÿĆ¢\gù#E!¤Ÿ¦ITv ŒËßò!ŒàÊ;=^-’pM¨ _üýôïž"¿ÎëVДG…G¡‡K)U³H‰-'4Á½ô)ÐY–˜!’'RX..ºïšLt5o¶‹Ÿ^Øuóï;ê6ÅX2ÜâžÖŸ…k)ÕãÂÆõ¯|òj@~Ú£öÄJOOÿâ‹/bvG¬(ÁÍE?ÛØ5gaÃýG•‹D†i´üàFÐd‘‰FÙ§æë…g×GcHî1CC)aüö½yÒþ)v˜˜¯e+ƒ±ˆòˆŸS@Ñè%ªˆÌÁ8CÁÉ7‚°§,Ѐlabw¡«ªn¹ÆTÆïiG¤vXº%ÎÛ¼fcGš·’¼Ö9!íù+ Œäs8ñŸJa£åöé;cGWÎ7¦   /Ï$yz(þâ‹/Μ9S¿³¾Sµ ˆ2§2=%î)ƒZî9K¼F çgã·æËNu• +ê™92‹A÷¤L—2¶ Ö•<$Pt.°£J ad0„$zÏukÄ(ÙåÍ #`J{íh¬5OCf¿x¤P˜D“¯lZºÖ;ïúú]ûÜØøÑ-ÅBCI±'ĉ„÷!.>uÆU»Õ8­ûÛßâ°!nN8á¦øè]¶¹»òášU³‡Éá G=%8åª á·¾î<~®wµeÕÀЇw¥„y¯ ›‰q™È ^)„|Æ#f-=KÊKÒ9@°ÒS@è& 8€™øz †GÁz~Ê¿­ d€$ã|A1ƒ €$h4Ú8˜>¸³€wv¡Š Ú»L#¾Þ)½¨~ůä¦cp?FZa)ÿâ)s®I'ÏÍÍ4iR"$%ž÷£¦±®yS»5²º92ÿüóâø„k??§\à#µ<€Û.R[!u*…N¬î¤ ñüÃX þm5¿]û;>ÞkG¯™;Þ“ñêL|TÝ=öçuK~^ âA‰mô¸4@C 8ðÇ?þqBH$[ÿ&‰hmµ±=:ö±5KÎ*àbld›½:Pê`òô‡lf)?ÓùÍÉy?Ø' 7^‰G`Íhw"Ž=®¹(õ”@JnÅœåÓX‰eߨVð=òFl[O! Q,i$f´("À AFr4ß7øç/µÜýzëÚÍÑ ›£ƒsÃ1A££ñfÍ‘G¹páÂdðЋz[l¶UA§zKÏqÏÕ¾|R™€Kt€Ž#k3 [çâgšÝ-ýÙ ‹ÒRŒ‚CÚ²}Éýi lü,v™ñ£‡¨Vž–V°”@+z–ƒçÈJÌoàHAû†¨©9[À X0sÍâS[‰;Õ¬´ºç¦có®9<§ìº ÓhXtm™¥­-i h\š‚y«ôX˜1cÆË/¿œ˜œzWߪ*özMûo4ΕÛvÄ:ì˜訞!‘(yåÂ$ #ÔŒ+õ±OÕbX¹ÚM›"~ô ÖÑ©í€\3aCôä\´~(YVŽ<+ ÉÙí^a`9_ð"p×Õ"°”åWèwsRæß É¿f…*KðõAƒÐ W‹š7”¦M›–zô课ú*vß& mݪ¥¥åÖ[oÕYa>½®(#´îâájd³~—áF¬„о‚€-¬ÄWö¸2c†#P:Û*Øk†Æ‡!„dL ?©S†Þé*b=Ãgåp@×=hvÇ+`Ú $Êøƒ%T‚E‘Ôzºæ#âÀ7ß|ó¹çžÛ‹÷õQ?ìww#'mXmêˆÞ»ªî’ÊÔ°²’1ò 'PI)OÊŠõ]nµHSFàJ ¤lˆ!•jÃ"Ú¨EŽÂŒ‡<—üJ_œËÑrA?KÜ‚±àãzLÄ @«YÞðYm×þO­Ómœ:uê‚ b¼O/¨ßöפ@¨ªªZµj={W¦‡Ö_2œ}¦ÆzLËW¹H@Qö ?if&÷TzfùOÅD޼ª(¡L|êCô¸à¶@%PIÙð">Ųš‘eÍxL`Äó>û4¨÷ó]¹re4ÕÆòæÎhÆ]+_š9hje† !¡¸–ol ¸±$Œf âÄ,_øSÞ+–{ecÅã¢ëY „‚-›@y­fcëÌx¾ö )|Ì1ǼòÊ+½u¶ãP?ï-\ô«¯¾ú®»îWNxqCF/;oxq–£ K%!-_håñ#CNH†$!€´yëØÑJÛRÑ1d¤‘ Àpf¯Èo&kõäÏÑAоÊ(Iqô„‘1-XÑ>ó/&G¸²²rΜ9W\qŶ½ª—úßyJwrÊËËÕ ¨Ú*¸:;Å©ŸSé8Ä ù€â±r„øAª1Ì'×I=å•=.øº5‰lËŸ¼iît=¸*ì˜%·‚N>ùd:À¶1®Ô_ôíãFÓ%œèÁ×_}ÐA•””,]ºñ$ ½Iú‘Ã2_þþ •&¡²&”.CbÆ’1,¼÷¢^¹ž‹1åjùTqñà‡«›:ÍrIÇqFýòË/WUUõº…Û“v"Üh¢œjhuL>øà÷ß?‘k]_¯i×~Dvª³ú‚áY© FHk¢ Ó¡˜þTßÈïO̪c3wŒ?ªíœò§uÚoÆŒ===¯¾új?4oûÐΈHÿú׿Ä5€FŽÙØØ¨1ÔÖí« Œ)e„ñ›§™8 Ítš²l€Ž ÚBð:PAÁ¤UYLo<ž•Cïý¤éúmŠe&M›6Ê×Å‹Ã]pwZÚÙq£);;Ng]xá…o¼ñ†¿ êˆÉO®õ|kRiÚ#SKw/N‹±¸Î2kz'|g‘ôºŸùºõº5ÖmW[.''g¿ýö5jÔ}÷Ý׫_Þè;ƒ=òÈ#ðôÖ[o¥ÜonnÖûPTTTTWW¶±kŸ?zÁ¤ÉÁ¬¦üÈüÔIÓœ~ÐàŒÂŒà2Ï‚V5÷¼»®ãß:5tU7÷´t»qnöÓ!‡BNm¸k¯½¶W_Ü é»Š‰Ü1xå“O>¡`zçw¨Ø¯©© ü5=7¶G7¶S(tÜo7ÉÞQZZu©uà^wÝu{î¹g¿=z§¡ÿÜøi¯½öг-µ$þö·¿}Ήvð°aÊ‹‹SSSÛÛÛ©Äêèè…B'jNQddd¤¤¤dffvvvÖ××S±1f̘‰'Nš4é˜cަþŸÐ-nâÓNßv+¾Ãôÿ7»hinvQ_(œÌ6:»hyh—¼ÙE}¡]¸ÙE}¡]¸ÙE}¡]¸ÙE}¡]¸ÙE}¡]¸ÙE}¡]¸ÙE}¡ÿ¸ùðÃï¹çž>ø`ýúõ===}{HvvvEEÅGqýõ×—””ôo w~úïÇÍ–-[fÏžýÒK/‰…ýEmmm_rš;w®¾HDK¯òù/¦ÿNÜTWWÏœ9sÑ¢E;øwná„xj0mÃSO=•ššºƒ›±è¿ 7tè_sÍ5b?€>Pqf¨(-”“Êj€¥…ñ»ë:&–¦¥8xkÄmë&u[#ÝÑ^Äd\×ýÏþ“–ÆÖ‚ 0à7Þ?~|ß¶Ònî¾û¾:É@Û>e郲BõíÑOë»Æ¥î^’6¡$uÒÔqE©…™ñ’ý(mj~ÕØýeC÷¢]ôï’MÝc‹R³S1½¸¥+ ÷oÍš5â ¾¾~÷Ýw§™™™}ôѸqãzùŠ;}‡q³qãÆ‘#GŠÅ{~JQëšI»ö­5³Æç[•yðÐŒàÇÅÌ87we†šqHÐþYÓùÊŠ¶?,n_œº¼©gsg°ÌkooRg¿ýö{ÿý÷ãþÜNMßIÜüô§?ýå/熧¯iä¦8Wí“ÚØë³$Ë%é{ –b|‘'¨O–NÿÝux±¸òÄâ¶»?njît:¢7ŽÔ›Ã‡B!ªËâï¶sÒw 7‡vØ[o½ëÓãGdQ•qİÌ_Z”ÒË‚Šé'¿v!þbeŸ]¡üÃñÙô=ìì!×üsÓÂÕ[©"óë2jŠí¹çž@<ðÀE]”t›¾}úÎàfÔ¨QË–- üèð¡µ[£'ʾ~r¼„í¥o~ l{Q~Á 2’‰ ô|ß‘T± ÀoþwÓÓ_·®iñ¬ße%5/æt饗Λ7o›Ú´£è;€:"?ûì3ÿu*PNÜ-§¦¥çÉã楉r\`ÜÛX‰±2¼¯%þò-éCyëÈÅÈòÿìÀú¯©#zÌsµ­ÝîŠfï”ã}÷Ýwÿý÷ÿêW¿ÚùÊìÔ¸9óÌ3Ÿxâ ÿõù)¹iÎù{äÎÚ=—cÐ=޹ÍW`+péï >Å1wÄ&@=šÆSÓ´ #ôÞ™CèÁüÏZæ~Ò¼z‹…*{®»îºn¸úí‡zhrmúh'ÅͳÏ>{Ê)§ø¯O”¾²¹ç‘i¥ûNgçºÀ¬†ˆg5¸c«„X–MÌ’Šˆº{Ë›X7høB Á’º>7ÁLÊ¥ÿÞ®é<ã¯u›lÿËu]jÉQ«¹®®®¸¸8F›¾MÚépÓÕÕ•™™Iç¹¾_Yúòæž'g (Ëæmv¼Æ[¡Mû-›Øº)¨Ø)@@P0¶´ºò¸`@C ( ¤m ‚–¾î’ák¶D÷þß5­öPj5—””TTTÀåÌ; í\¸™2eŠâªüjI>8µdLŸ°õôÅQvEõ}P‚mdäU '{ü)#x*Œ‘@²ö RACóB/­XT×}Ü‹6¶GÅ[¯äPuuµã8O?ýô©§žšl£·?í,¸Y³fͰaÃ<©å»ï ôËöÊ?n$/Ñ`#Æ®˜„àGüØ’:±K™l1…¥wº—W0‚Ú È!m#Y™Ðˆ…ž=¦Ö\4ü¹¥[¯ûWãJ`5S£ç?øÁÙgŸÝÞÞN1´ÍíîÚ)p3iÒ¤Ï?ÿÜsñ¼ yaüëC‹ØIBÄø¯ÀÛPŒYÔ Áã¥37&Ú¶š`òi(!~üè9iLýwùúºmK—±{¨§Ï£>zÞyçõµÑýFß2nèò—{Ù{`:õ2î=¢˜•ÃŽ£­LÿUöCÖÍðJ¬Yà8ýïØ37Ho÷äbKüÄB‹ï9¢øÎC‹†<´Ú3[xþùç_uÕU¢¦ø·Hß&n`AZMGϼrïü)Ã2L¯ËzÕÄèmÉ’±‹c¸âÚ[J@Ú3"~'ÜgkÉcÙÅRUY(A¬N’żIF¸nNÅk«:.x­^=‚ZZZRRR/^¼Ûn»%jñö¢o 7°¶ )åÑ—O,c'@Œ"±“œ]Ó(Ö®¸9õ:ÅFåàSð –Ü‚òÛÅZüµ?¨Ü›Mî7 ­fuqjeFÍìác»¦ÌôD"‘Q£FQÙ3þü —Ùîô-à†úØzrMgË=itÖÃ3Õ¶b DŒñ¤TŸALc¹Fq  „8áľÛÚÊkkñ£T•AßßDìu‚mµµä¼¡]Þ~ñë:Œà¡¶Î /¼ÐØØãe¶#íhܬX±bäÈ‘ðJazˆòíái”¥˜òªô=⦛À§JCG µO•ÍgŒÍ9ñ/µz~¹§§gðàÁ_|ñ…È*Ü´ƒp3yòä>ø^_œú«)Ei!(f€ ÛÃòJ d))`ñXÖ®ÏÖA "SòÏõ!0k¬ïA&8e‰èU¹¶ì1ºI©-(x„Å£®44}õ…ÃG>Z 'L˜ð÷¿ÿýè£NîM¶‰vnFýÍ7ßèÓÔ¦6ÍÎ.g'Ž‘+ª*€’ e„×pF1 Ó÷xÆ«‚œpƒ$ˬAF1ý{×'E‘½«'ìÎæeÙeÙDFQAE@0EPDôDEO=ôÔ¿ùôäPÔó¼3‹Ä€bÀÄ ‚J†%,ysž™þ÷t¨z:ÌììÞ¾¿¥»¦º»ºûëï}ïUuµ ÝÇ¡‡ø&ÃmAâ‘(Ÿ•'Íèý%w†®ˆk®¹Æä4bfMŽ›:Àé<Û$ºSã\ë§µƒ‚Æ”f̃)6öæ”™ÐA4¼]6Yô“DA›‘ …!‘.6K÷Á¶/Ö7ÑÄ#òYŠÜéøìÎýÕÜ¢x ¬¬lÖ¬Y¢3Œ™5-nN<ñDšã2â2|®ÿ^š§ßHkßdí³O5"Òú^õ…ÒóœmºR¾"ßÄÒËõä²jßïåÝ¿ö+5:ädÝ~ûí;v¼ä’K,ϰQÖ„¸9r¤¢ÔðjN’GÑ4 Fe‹ vLV3v>‹ cvQqcqX­Ã›EAO¸D6±J÷1èáB*!ñh¡–Z.kÁ<ôó#ÞÙ·µÌ_¸Oÿ®ÅøñãAyÚi§Ùa”ÖT¸¹óÎ;—,Y‚W{´ŽëŸë{úÜ,4€xlhÆ<ÎB @ˆ!3Qi<…Dê8‚tƒ°‘Å¢X’i踀ÜAúê’Kr&¼¿WqXýû÷ß²eK—.]"?={kÜ,[¶ì‘GÁ«Ò¼yɧ a™F&÷Û"Ó˜`DБñf&é>o›¥ûÌ6ºèa‰Gï½BFr|®Bç­‹Úžµ hå~ò¼–'&&:>=§{ÜTTT 6 ¯¦Å»’½ÒãrÈ]×n$Ã(0ž²–ÆŒÏ2Iç˜êb:“µé bz:»€tŸÓtŸ£„ G0.ŒH‰UÊH_ýzR^·ïĬSWW—?FC‹=nÒÒÒð²r5Râ\á[².h"•ÆN€PÜã)Éd™®ø_Á°bRÁ"Ýç4ac OáïÐ  ³izûìù$8¯ªªJII‰9tbŒ‡Úav’gË5í©èÉ!hÌÒ9bŸÅ!†8)Q—'¿ Ëu3 Qk”aú¡¶ÀŠN÷…\z%lJdGÐ9pCÇÖó·×4è-S 3xðàåË—‹N8J‹%nN=õT8ÄÈÎIïŒn«ß!¬i€· {n†Q`<Q:‡SÊ‚Š…ŽlOaPð5ÃñÂ!°@–O/„!w4 ãcé!ÕGZ@ÇØðð 3æo« èíÿꫯÞ|ó͉'Úž°C‹nV­ZµråJ¼zóÉé3û©K¹.P#"lÅAxcÓ9ÂJo•ì0hkšÆA¸$ƒÄ 3ìiDa™ÅSÚÕБÔà\-WJ×^Ñ®ûó;q“¯¼òÊqãÆ1!j‹núõëG–³}=2ãÂ/¬¸@Ôˆ'ìžÐ0à`“Ðg   ,PpáV¤¡¸¬oã)ÙØ‰DÅPx¢ÇqÂF"ñ”„h¥¬€BG†Ò·jŸîùûY­ïøºXkc}}}zzºö½íÆ[lpãóùðrø¾HhrÏ’\ÁÔ4È4‘¥sDˆ‘TÄÀö[ì:1|<¥/ˆ‡’p … ¤£ip1Å*t¸„:ˆ€ I¤šl@GF7’þôšòÝ•zxU]]=iÒ¤ 88U‹nþñà¯*Ö3+^‰ñ¤ ‚XXPø€¤"¦Ͱr'üG{+ VD¡8F…À´ƒHˆ{A݆éÅDáÛ¦AV Ñè!@1Å*éaR&ôBâ°@p®åu$ƒ‡$d›§·Ïxr{­!t^ýõÙ³gçå噜§S‹n`ÚŒ>éwž^’ÈCÏRÔ¼ h,r€šarÇAÄ€”·ˆb ÊÑ´-Sö\"à !*Ý'»hôÐ9b›„–DT¡~F:2TÄ:Í0ù÷«Úw|®·ºOŸ>ø3ÛQ[cq£Í_§Yº/üRXøÓ¦PÖð¼£'+ÐXwA@Ï…´Chø—¿ù_\VÓDÏò>-² 5(ÝB3åfA8"à—zå/Öú_þ²ViÆ¥gú.:%ìÇ%,Y€Ö–A†Ïõig* –ª!LˆÖÈ’Ü6Å=î¸äw7ëÊæðáÃ_|ñÂ… MNÞ‘5 7K–,ñûýd_’ñ e ~ô‰:†q¸@ú a6™¥Z##ý±ùHé7¿“ö|²:ì=»ä¸~"ƒÜu(t„‹7^Ð%!ŠŠ”}Ä¥ßþNÞ=P›QÞUiÆìLj=0’†P„âHC±" €^™ýþ¼j<ñÎ{ï½WWWUi¤Ö(ÜŒ9/Oïö³[ë+XÖ`@ਛø/:¤Bæ ¡º Xš‘ ˜¦O> œrë¾`›ËïYÐ:ÎcAôÀÈ‚)$Ì]œ>á‰[”fL=¸çßYq•x\ñEw&ˆÓzˆÖ¿$˜bK8¡³oFÇ̧ôù dYÎÊÊjL9zÜœ|òÉxÙë’ªBú O(k4cD12©8ÐÐ9@иPÚ¤Mõäö“‹÷¼ÑÚMòËàg‰DÑö†%l¤¥_lõJJ}@.¸öÐÞÿ´q«JrIØOŸeÕ™´…PsBG’“â¥ù ßì©Õ£䯾úêäÉ“6kQâ&¬^M¾¸}rvü ÃÛ` ÐŠ„ùçÅdVÐß$WÕáZ{•Wë—Û_^¼çM @„l ƒùÐÉÖ Ôá²bÛfÔ)͸öàžÿ´Ñ.¢x$ˆ?Kè`Dé_X¢Ö‘àæú¯ŸÏM{b»6 ³$IS¦LinÜh/uKê`á“ÛÆÏ=Û˜Û#†x(Œ(ˆˆ„°hhšQlÇ¡@iõµ™UÕÊ÷¿Z}ÏÆ ÞC…W (CÓ=´Qé¾íE¡²jR ¡ÊZùoïVÝ5.Y‹¶$™÷YÚ9še„iEÌ•àÊ”·2 —^œwöÛ{2܇Õ÷÷Æ÷î»ï:i6cÑàf×®]šVV”9èïÝ&žÄP´‡â„;–¸¸•‹VÁh” }n¶ʱ½ñeý=S!nDwZŸ«Øf@eÍÉ*å63µW–×Þ5>I»Ù²ªU‰Ï"X±ÈsøËƒ„pl…Ѐ‚xåP‡—>áØºˆ,ÜtèÐ/Oí™úä9™˜çÁ Æ]‘D²F —e±¦!åá?2ñVá…º€#¦Á¶¿$4QíãŒ8¹(3»ú?²¿4ôäG53G&â„î³$3i=ýkî­d"Knìœþä6­%JTu 'üöÛo‘@¸ùöÛoáŒö¿û=.‰Ü]P=£f8™L-@!,ñë°ÿ+‹´ý¾^{ã%>‚‰Ò+ŽŒ‘Æ2zKijŠ<º°zæ¨D˜ë û,:@ëàr ƒÉVÖÄ@ï•òR×kVÔDé§R“€.v"й \6 •UEŽÆ ÞÖ_ª’CjJßfür¢EHB@!}‡9Iž}Æ»å?ÿü³óÆ;Å üF’¢l^™-V6<—P.̨/:2S1x  ëѨt1ÒcªÍNƒ)DKc@Þh»øôÃS\J$‘Ðy+sý‹vR˜rh•³ùêö)O蹜={ö<óÌ33fÌpÒx§' ¿qúÝÞ:¼‹ˆV6Z+1ÙPwÈV/cl‘Ä ˆÏµ::†ò²\h£ÃæSVSg´7Æ ë nø„6º%+JüV×É Þ–TEŒãmL¼Ð‘MT‹I¼M)y<äÀŠÝ}÷ݱÄÍ矎—;¦yßÓ¯Ê\8eѹ^æ<"2™udj³Oò¾÷ qÎ-¤£zÜxdE‚ Y‰bã< ž9 $Ýzu\D¸‰Sš1+ ÷oÓú—W0tÖ()ÑΈ—ÃìjxÑ“>ت‹Åâbû!M6¸Y´h^¾°sÒZÑÔÂŒ¶4_e\…QÕ¨Þupª½^è”çÚnÒCÄÛi}Ü Q§øw£àC#KèÀ÷§°.6ÐÓ1ßµcãfôô\p†×ã'sú—1cdðL(ÇÜQ $^ÕôúȶÉótW¥Hœªªªääd‹S°ÁÍÔ©Sñòþš ØI™KÁªäŒl¸eZ/cÉ?¿ššq¶£Q8™ÒÔñ^6’bPk–Å a Æt+?LÌ<ÉÑ«×Y­¤é£ã…@¡ô¯D<Ç%„-,r3œš«ˆF K4 „7ÜpÃK/½dq6¸©¨¨HMMUþ*Ëù)FeÆ 1bÅz•óh,Èð&€ x%ƒüò3w&Îx¸ÆúDzi.:/L6$°g¼2 ƒ@«t’uðXt5S‡d}Ú¬'yŸ½·r»¤‘ƒ¼ú0*P&i¨ ¡D©ÎûP˜àVéÊF…Nê—³[¥Öä—_~¹Q¸A*tÂõ\hþ°,K¯ÄñÕªL# ìÊtY(t«Ï‹{ë3ÿW?[%ßòÚJ¿|šhLmAèŠÓrvÒPY67è´.ãy{IàÛ•VÝœ¹m\¿¾“Êä!8(dàtâ¹ñÞÇdÆádWŸŒË;î?…J÷Ûör+ÜÜwß}xù¢.É .VèH*"ŸÅ9Ù@¡£íãÍKºí±Ú ÒÇ >”èSAc ÀÐ7‡µ¸§ûð¤$ê€=¤M"±ø?¾?ßïuûAyŤDZ¿0…¼ºÀª¦×æy¡dÑo=ÿS¤¾‰‰ª RŠŠŠ¶nÝj1©næÍ›‡—W5x"‘é’|–¾¹Hñ Sa$ óË’üØ,ß_®Ž?mBU\*. WèÞÙ•’$åVd yeï w{ñÞÊÌø©¬õWŸ´7ÂËsï»ýº¸£kH3:¹ÓRÐ%çy§^ŽN]ˆÏÿŠ‘„h•Ã:#Ägð"ñMÚÕ¤®0ŒÆgÏžmñQ4+ÜÀ8öÏ!ÙhþÞ;òYΈG¦k²dÃ-C¡“… ÿ›¬ì¡¢F®¨–ósô`¼g#B Ì X@c…™%ßxE×­‡Ú¶A;¾KR*)ׯ²JÎÏvI!#[¨̃úW™àÑŒ<,Ô ­Ž9ßÄ"Œ9® IÓ¼ø; ,ˆ7ØÜºõ”t+dð% ˜ì±E)S²Á(A¼Ð1ÐàB©ÉRj*² ë­ÌÏK?°ñ+2º!ɇéð´:Z·vZJKqé _LŒàDœ3¢ƒ&x¤Á¬^a}ñ¢J_}d`æøõQݺu]ÝLqÉæ¬‚Ä“sâé^êvâ&FäÂ('…ë eÄ0 #5¦#‚F2šYÊ).‡£ûtˆ Ä~˜N¢z’ûGƒ<åLd$ãD1 Aô]⑊"XBü B£ºo+¯_¿™›)nî¿ÿ~¼ž0‰9ÆHH3Œ”f\˜éªl…IzL;ÒÅsÞ;‡!u A~sJÓ¶²~ §¨[›ëÁÆ'(”,üO,‘èM«¶ÎHƒŽÅ&d1¬\¹ò”SNA"3Å |mø§}D³qEyF‰½ 3wRˆ‡šEÆtxá:|Gº)hÈ€TÐú™£‡Ô7§d0‡ºg$ÃùÒ ™Ìuk3÷ž¥M/›8#È ˆÑÎÈ¡3â Bß7`ñ{ï½1nà÷n^jï,£bË:,˜N ÀE¦8 ËtG:3¾]?:˜Ô‚:xçØH %é¯åb—ÄΗÆuk#úÞCÊÁGÁÌ.x¦VDΈñ½¢:ZIZ¼«ÌøÒ½‚›‡~‰Ì‘.¾° ÝUá(,3ñ.L<›°d²Šxâ‘ BÔ˜ j<  “©´Ðdõ’‹0JÀ+æãÄ”#rFñ¿"!hpóŒU™sFB‰ùFѲ ¸ƒÓbÒZG¸¹¨k¢ë1-±•Òœw°é+å±e… 1‚ïé·‚¦íU‚óœ«ú:¤®¸€Ã VÑÇ?C†ïn€¬Ò®J] @󈌵Ÿ}Ò1n,²Æö¸éÑ:®cº—'âK¬7(JxQ«\ØÅ¸0šlÀ2Úé>TÄ:/«€²þÉU2ƒš Ï—†¨ž¬þÅì,iñ°ãM­Ð·?¼ Ë"D #Äz±A ø‹‰ÜĸQ´4^n—êÕÆÝoQnžËºF&‘ ³å!H¨;2ÜÀüMª-nÂå):µ&v|‚Ábȸ£!ƒU ÈÂ4 B[co*k‰* À$=nÒâÜìÏ1<ñ¸*–‡»QXÓ£V J‚„ j¬#ˆÆ¹+ns‹ð*Þí †IµÈpcc±~fšö¢]½öZèõ¡ ¿Ëµ6o{Êà/e­[£¾'KÓ®rÔÔ×"æPFª ‘Ú’ÉìTbÜx½^L9å~'ó×Eû84Z½V¾÷o «Ö„QÎ(°âbôùgòçŸé{T.¯Ï‡† qÍÿG\"ŠCb¶«&8D¼Ù––&¬+Æ üZpE}HX'*s/Éèz&&†˜‚jÅ¥ò¤ký«~‰aã­LiˆB]~úðãð7E"Œå~äî¸4öeYÎ噽FÑÄŠÑÂQD†›ÄÄDÜZn‹3Î`Ê›¾šR°èãÀÍ÷Ö×D9CmÌ,Bï¼|çýZ…‡r³¥Å/&tÌU›+FƒLbsTM :Ú›aÁ¨ùFûLf°JF¢?‚»h–Uâ½9¨¶¥04𒚺¡X™r Šö˧\·µÍ’V¼›”šä%ŽÁ$8ªhoöuôj@ÞDˆ›ŒŒ <ïþ„09ž­"ÁI¶MN ÂVQç|æü‘±ÿkî®[ô©àýÈ£Ðö’; ªŠó¢¿ý9þª±ôz²#.qäÑ©„èj©á÷‰&ÆMÇŽñl¶ùɤŽàÎ;¶<’œK~C$5ån#+Ë+œ ˆÖü è/³ë•'vwù|õ6<&bëÑìªuíÚU¸¥7 xçw´å¶IFþ&åAÌ,kÊoˆìK‚A)ïܲ†£Ï%Ej¿l ¶>£¢Gg÷·/¤„×µl7¼LÚk7ì½ÝlÁí°}ò¨wïÞÂJbÜŒ9ò–[nÑ–}/ŽN 7Dô—TLx…©ÓmLù¡²cc,ì÷mÁÖƒËõõ,š,Š˜¢“È,«xâ‰ÂĸìT^$»£ï«6Ή[±…ˆ„èQ§\™ÿ¨ymi4³ý¦\Ã嫹ÃËŸ¿3ixU÷0Ða_ áwœLdZ»}ûö0#Í>_¼µ,`4#òÀÇ–xL¶ Í€Úï…3®­°m§sS‚ÅΤ`:Œüõr÷îR¤ãŽ“ ÚIIÉ(1¥¥£ô4Iù[^†ÊÊeåou5ª©B»vÉ›7É¿ÿ.oØ({=á õõ¨¨(6üWW/Oº·*Þ‹v-ʈsq¬ÃÝo‰“$À„ƒNL†˜µÖ7 ßl-iè’áµe–~4@P“‰J_BvrÚ5å›wGùÁÍââÐà3\»‹P|<ºà\×°!®^½Â“’éÃq$þ§£¥Zd=(=UBFô±€Z^BM¡½4¹n}èó/CK–†ªkÂ{ر3z$Õ7 ìQ%÷^™xóÅ ¬ÖaÐ#ôD–>¯üFQ‹':êŸú`kõ-§¦SÇr ±ÊW +§–1²XŽêd¤Iݺ¸6o͘ê™z©'%L@¡¿Â¢~Ç[6&”ÀíÆ# ›À·€Fù×»‡Kùwë }8zy9zqApþó ­ÒÑÎ=ÑœÀý/ÕÌ_T»ýÕֱ֜å!GBGÄLºAÜXÌmŠ·Û§IgqÃGˈ÷Y’.[p[96‚Î!ò^›b«6†þ%âo®žq²{ãöÐøž;oŒó%,¢ÂB ©/qÊê$ ð”úWÁ¨‰^-n†YGLøŸA?’©´déæk\7_íU`T]-?ødÃ;KµõÈïC%rÇË‹WÌm•“Æ#È2„ê'*0i%«¡W>Ÿ™˜)nzõêµvíZmyK)I¬Á»Kš…,“.vÎH½ú?uÝ•o,`:à>Ç»wí Ý6=îš qaLhïö†Œ‘ Æž%­IÆ$*µŸÒ›ä#— .Ú_F!£3Áá•”àúû,ßßÿ.yæUÿ?ž÷W×Ê!gf¥•r¯kKÞ¿7ýŒã½ŸV90±ß `}‚)\RÒ¼cÆŒ1k›)n¦OŸ~ýõ×kË][oÐpž……‘,`fQ⛺^U|¨ÜÑuÍÏvµËqÒÓ}Ïõñš:Ñw¡½r M2úz¥Y¾I'µ]à]Î$úŸ$AÐC%F×OŠ»þÒxeùžùuŸ®lÝeš qOÙ““n™È ÃúaxÈ ëP›Œ;Ö¬a¦¸™1cÆþ­iHc(Ÿi^AÆÍÅ«]¯všÜû…<œÔó8—îb\úq  BÆ\5ˆ†Žþ>Ò‰Gk¦ /B[ˆ^ÐUYÆÄC¦Çâa„Ð×'<8CZ³!8ꦪš:{çuϫտŸ›‘JÝW™»ñFïÈ ëÖ³gOá0š9ÒÅ{ª+÷Ö’ë£`ïŒTQ‚ÁU|¿µÕSþ\b šA}=»÷‡–?›âñêøP+Sˆ ©C«Uò´·[ t$}²jÏ9-“6cø’9kãi6 ÒHNç NÖ O:νçã4¿õ™Tq°$²ÄÏ[ßÔåf¸îŸB½l+w"taüX‚Ë-‚pä|¼ßã+Ëß¼ÈPI¶z…/a‰‡%ª‰—oÞko_40nӮࢇS%·¬ßl ;¼7Ù1FÊeÒ1vXúÛÝ*ÑIÆ-‡²†Çè™&àÁí‘’ „õ2QH`9Î-ýþfZ°AêwUÙîVè™û~M<ïø>É œúqàÂô óW“XäÛo¿5mŠ5nºvíŠ_»úqŸ1¤…ËíJÌç×9gD¡DfW•‹øÀ¢ÊOV› áÖ©.åÖ?{KrXÝkW ï_6b"@3£ˆ‘ Ì:zôd¸%ˆD‚pÊè ÈCÁOD&ƒ ‚0c…ð% ­}1½ºuŸ\ZUkŠÿªè’í>¹CÖLÔ57[E&.Œ«PZGøþ²Ë.3k²ÆÍ“O>‰¿t—èчì$íŒÈ]Ä¿Ò~awqð±÷M?[wbgÏìk“N=Þ£:™! k$9dpFÈàŒu´wxõ‰jÔ‹èÒ'ø$o„T"pùð!Æ0Â7C‰âøK6bxˆ<#)ɇv¿ñݺÀć*„èiÊ#þVºï¹l#·d)h¬iFäÂð¢$I·ß~;ßlV¸9ÿüóµ…Niž %þÃÕÁÌ$7Í+ôû³¼ 6[œt­â/³ê_^úà´ð4‹ˆR04PŒ6}£BÑÐÁx"“«ae¤ûèyvXƒ×A åª$Ì%º:ÄC<”ÁŒÔ ÿÌžÞ=¯·|[ÙÚm‚Nÿ¿ÜnÆÝOeã–þC¼Ïâ\Xˆta‹·V&x$(<.ýœsÎ騱£ùµp¦o¶—‡Oà†/¿yn.² ”,W¡_ëù1hN=Î{ߤ¤Î¹nýHØ ‚Iˆ¤õt$è›dí*ë£Gp>Ê t0°|!Õ]†Œú$1Âr¤Ýr¼7ÚÉhùìV›vÎþkY5p•×È7¿\1o2‰gá¤ù¬p3®ùô£÷ÙgŸY_ Üüñ6lЖ7•ÝѼ3¢V™0 ¬Ò:\!ï:Ìjáx¯Ô:EúüÁt¿i2޺ŠùÕð_4tŒÉŽ ß¤-ËÚ'¸e<¯ÃÏ‘ã#Jcd B<ŒLÐËá »å{ö¾œ™wåaÞg}µÑß½’‹ÅÕÎHVCœ°æê«¯¶¾ 6¸ùú믳²²´å½UcF; hð½Ä-@@¾P‘6­ŽCR§?`wjWoïÞǯJÖwÄÁü¯¤Ï¥……Ž:!Dâ)c¹d0`o?ô]#ÜN¼@ ôY4Ä7˜.!pÄ·_ÓFE/d]1¯bñÔ'ƒ·wÛÁ·•hPnHŽ`U-£šrÇiË]Êlp“™™‰—+ü¡W”Þsf+|`’[ƒ«œ3âÔq˜îyqí9‰ÎôÜÅ«¹ =~FŒ¬‘´ß3J(èJg.ê…–Èô°ÔL)¢E†%%À[®G+T:ÇX† Áê80Ç F/ߘöíЄQ”Â(½¸*´§8XÐÊMÁ’ë6N*üÿ 7‹pY÷îÝ¥Ùë›””üNÌ3kËtÜXø&^ÜPrX熹ŸRsœŽ9Å7óü¤ü6.ZÿÂü/–58­žZïÑ:zg‚= õxx€‹ È5Ø`ÔÏ‚‡ƒÌ4ëHñèå Ë(Aâü²R2°{üÊG2ûýõ0 0ðáC…³sÈ-€p E,T<äÔ©&"Bè·¼ÍÌ7‹/:t¨¾Ç …?‡Ëh^+g$d ]‡©¼ðÀîq󧦅_ ! ¹ü/%kôŽ‚ð.:ØaQ a§ù$™ÃÅò AÆé°Ð1¶ã¼hÐH¤$é*¿Lôr×l϶ym:Ýt6©Ö/'¸A«ÌñaáÑŠkˆ“JMM}þùçM.1{Üœ}öÙx¹º!4õãƒ/lƒ›bíŒ ¤â씉²™Ø?áá‰)©>ÉDÿ"Ö[1BG¦Q"™¬û&=VÂJíg@œ.¶@ 6üå€4€ì@cÅþýû+ÁÝ…p‡çååéþï÷âzÒÐ:#ýü9Ê©1F¢\90ñÚ¡Iá´LGÔú†|·¶L<ÅG0¸£[6|ac ál ­‰€4b(WEœ œ1VÖtG:YVîE+÷²Û3Ïþûadœl(vÑPãÂ`šØbŒ4G¸Ù²eKbb¢¶üëaÿºƒþÞmâø bh[Pmþ—º²i“âÐ9î„cRm*ÿ+S²ÿj,:˜u¡u$ÐÑ-Ä£µA2I÷Ѻ˜5ê–àûjôOÉ4Í Ž~ÐvÑJ[Âå—ûuŒ»cDÊß—„EçòÍõëöNÌ]€*bõ²ˆxúôežp .äNX`Žp£¨kI’ðèÏgïÞë;h‡'ê˜sFbÊ ¡ÿ{_¤2SÜ—–(#ã:²ù_a·¶ — U&#’°¡GØÈ"ô ÍôsápÄÈà~°pï³ñP ì"êHiF Jµ»F¦<½¬ªRM Î[VùâåÙ„K6¸Ù” »Â¿}OpSZZ*œ­˜7§ýá×_ýSO=¥-7eVGB9Úô*3=?ÞÕ&,¸yˆ×¿|G7„ŽD D±Ú=ˆB:â5­Mæx|1ǬׄñYT6Yb ÙnsR( „]{ËM»±H9ûeë€/cóθ>íÂôåýUTè¿ÄkmNq3þ|Œ›ª†ÐÀ×÷|wy¾Ö>"]Í(‡)GhT¯„G/Iƒú—õG#béèF4Jd ‡ ED1#l zÔë'C"Ñä3¢ÁMÓpàWB b GFKc+ÐÐăótª82¦ßßž}Úß íæƒ9VÙÐR†ZVb´ÿE|ø[o½åì„-²ùý`îø«ÝµúiU¦ÊIIŸüV[í—i ã­ lnmœÆ]N²Î^Z—‚á›Ô‹ ‰‡¼´€û€¬!yÇ&Óõ±.fÎΉ4!PYG$QÐPèTÔ…¶tËŒŒFEÈŒlä g6Ú·o_$— BÜ8pä{«W.9øÒšrðYÑ}¸ÂŠíþå3Ûè  {ÍÐBG†\b\P¦·’t)r爋.Ý'zñ…ñW|JC‚ ±ÞÊÈÇ0é±CoŲ ìƒ4°Ð)¼/ïùÕÝÆ‘úˆÞD¦Êµ#¶}f;>…lÞÿ}î$­,2Ü(y||<ž;L9¬f¢ŸªÁ=Ïo­ë]62ÆëBÓ å†4‡¥ÉdìÎQ¬±‹lü„(…¿¸lŒ‘$AÄBq @‡ñV@t:ú,X" É >GtI¸r¢Gºq` ÔËЗÑzY_ö7PÓ¨ýòË/‰Å<´eee¸³tuàô×ö¬˜œ¯mx4Ô¿Ðõ FÿÒ²+!„K ,„ެ3Ádô§®xˆÛÂÜCgn¨WóápQÍ Pd=AH] è°'%”ƈ ¤!hÀk ¬¾¡…Ž~,ÌF´/z9¼UÆSäƒd#FŒX¼x1ŠÐ"ÆÏçËÈÈ()Ñ“E›Jü AÙ‹Œ|? L$"ý ‡‘c… –#t$ ~ùÑŸxLØà—]ŒkÍgn+ ÅÀ™ Ñ4C¹*:ˆ ¡‰9!±Ðaa„ŒðÛ\‚s?tèP¤dƒ¢›÷º¸¸VI^WÖüe7w"œaW´þEäÆ3%¢x[%õ±ck´¿ôõ 2èÁž ÑBˆt˜81™Þ‘ûA¼ƒc•õMÈ4@5##‡B—8„QXb÷y…älÆŒ³hÑ"ggNYTó¥#Ô·oßÕ«W»ÝîCµáDÎÏ{ëûåÆS=Ø€Q(Ýc¶€Ø‡¢Xæúdnô'vŽhôPº˜y[ÊAO84†u„B‡Ü?õ 0‚> ¦sÐ 4†ÔEPè ‡ÃH/œõ_}O\\œßïONfçWvhQâfÕªU åà +.ýhÿ–kÚ 2ʉ›‚ÖȈa]SÐ$lÈ 2ì\G"jÈ9"¦¡zù 1¬·â⬩lÎ4€6Bp ;Âõµó1.”æ¯Ñ߬S@£ü}å•W¢9ù¨q£Øc=vÛm·iË{*—}pàõ Õ·°@æ½"¾Œ-¡‚):š)AÓ„ ÷Ò‚½ßTæFüÁuSÖB"l±¬]¬L)oe‘ÎÕxÐ 4+2·€Ì`.Ì|ŠÄÞ­[·~úé§¹³rjÑãæÖ[o½ãŽ;ð˜Â¥;ªkP‚—î†ê_JÄœ/ÂÁ”:!òŠ.ðM„F6z$„]¥‹ 1KQ“Ì-àUañ/Ñ7éJ)ÓIŽiÀ¯¼:6ÑËzcVn zXq&LÞY'=nú‘<³zm@nÿ쎃7vÄÞŠW»Œÿ¢±žÖ“Ð!©C@1IØèñµõè> ‘×{-Ü/Še U¤³‚A &! ša…3 BP$%H\¢v¤ŸõÆÜêÑ£G¿ùæ›æçioÂMbbâi§†?6^é]ÿÙ¡§ÏUß›Á±пl¢/„ߎ3‡Ž!~T õ" E<”Û2.+vî2Ý'!ðƒ1î Ñp¡¼•1c h±H" 1D ‚þH˜ ï'ïŸÄC!µ¿Èá¸>3knûá‡eÞРOÈõêo•÷œÞ:;ÙÅ šAfŠ˜ ¦tè c&„ÃT,"„6²ŒS˃·%:!2è̹ÉdÌÙ ¯‹…ˆA4ÍȆš!®Š&D#‰€¨cNú€;áM>ÚZSF‚žtÒIQËalÅ RG‘vèÐA[nɧ¾ºkçuˆ·21ˆ¦2÷Iû,†xȪzáÌÒ}tæ†E€s“%1t€ç#†È‘oâËy$Ðd2‚T.¹äÒg9|øp'¯+ØZ pÓ¾}û¡C‡.[¶L[=X<éÅÝk¦`RaE 5 aè ÊaA‚†ÏbˆGÚøGé>ß$Ñ«fÀ2 ÅÉÈ)\(tLP#4x$ uÇ IIó¶âöºÝnåfµmÛÖä|"°àF±/¾øz«%þ­©¸ö$õS"Í0ÒØHëÑ(ã‚59ŸErÄ@ÇH‘)¤-DîÃä#Šy4Néb*yC/PѸ€fxŸ%D@›ã¡¤O¸Â)¯í‚¯xfff>óÌ3ü¹Ea±ÁbÕÕÕ tðêmËï”TæÖ@ gt6§‰eè›tˆ`d°oaÒè!ʸ¯Öé>1TŒWÄÚ¦¦ @¼@ÅVTîqà@4˜Ì@#È&ÓZ¡¿Wýzˆ¼…9yòä_|Ñôì"´˜áÆëõ¾ôÒKW^y¥¶ÉìÞý§ú<X#‹¡ƒ3ÈT<ʼnb"{u·Å ±¸‹|ºOB²“ éØÍDú5Ù"3xAšpAàpÖˆaÈ¡ÏâA£FÝiOnƒ”¢…Ÿ{î9“¦7Êš7III›6m‚?ûq_Ý„÷÷¿uQ[1t`®ÆSÈ,aiL-.zÈŒ´éü^xEøáF"ƒè¨J&5Dñ”‰¸á1„# ¦œø,ýà©õSÛýAÒ”K/½ôᇶø6Gc¬Ip£X—.]¾ÿþûh«íS=l­¾àí½ŸŒÏ¥ #ÑÐá厵(1å¹LYçˆq•n¹Ðø½Ü$ÇÙâ¶hÄXHcÛt¢4M«ùÛà'9.¼ðÂY³fåç盜Ic­©pƒÔ™TÞzë­ &tèС°°P)Y¾»VO%JRS‚v œ(¦BnÚ1iè!%ˆÒ †î³¤ˆ²Ìí1p1×ÅÈ1‘¦sšä'¶:÷Üs¯½öÚ>}ú8;Ÿh¬ q£Øøñã·oßþ׿þ—l,ñ·ÿg!éÀ !½#¾3Kظ8ôèBLjª°KÒŒI÷Y±:–Á_RHö#ÐňCŒÐ1ZXb~Âî oetY$ÎÝ ¢Èƒ1cÆ ><ÂSŠÌš7ŠÝqÇ­[·¾æškpÉÁš`ÆÛKfv‚8š„  EÔè>âV`dް4Žq£‰§Xâ¡°b-tH ¦i 7‘.ý`ÿâ­Ôdá™™™ hÖ¯_aëc`ÍÍöìÙs뭷Ι3—Cò¥íÏ\æÞ}]GfعU†O÷QºÊ:Ýg$äŠ4š s€±JÒ–7¥<±•™¬rüøñ=zô¸÷Þ{£j}cíÈàF1Å_wÝu'Ÿ|rEÑw‡kƒ)s·¾>²í¨ã’`ôDÜ–mº×ňO›KãHÅȱ.F–ˆA„f&/Ùÿî&Šf0`ÀìÙ³Û·oßèˆÒŽnÚQ^^®ˆ8ÙS@Fã?ÜŸà‘^ßÉã1<v[È<Ýg䯋¢Ac„S©u3ÉÜOP‡`5ZùbĬ€Íe´¿*Øñ¹Bæh V|>ߊ+LZÓLv$q£ÙÞ½{ßyç©S§*ºÖªŠç¢.Éo^˜Í DŒdä-k¦û0<ŠB<&DçÀ…â‘'éý„¤Üî(­c?Î5aÂ%Þ9r¤¨ÍjG7Š]rÉ%_|q«V­ ÏR샭U)󪟚5µWŠ=|ºQº1é>ð.Tw$ÓLcŽ~ÆOV¬u1å¶èú!iì⽟ì¨ašÓ®]»ÚÚÚ7ÞxCrø}µ&¶£7й\.Åg}úé§'N,+ ϙХs§­Û¶BòŒÏÞüå¡/.É;%/žEÒ !zæÐ9…( …Æ×¦"'*PÄHÀ:¼.¦#)z+Yzà»üoÉå’é Aƒý;dÈÇMlr;Zp£ÙyçWZZzÆg|ÿý÷ hp¹?(ŸõæKZ{E»Î­<¼‡"é> dܬi i³õD­ŽE¡8«uL…^Ð9æÙµeþïa¸'-±>zôh…f–.]U›ÐŽ.ÜhöÝwß)èÉÏχéA¤æ—{¾¸Óë’ÞÕö‚Ή|‡¡VÖÓ}Â5“Á_X€<\ ©$…JÿõK9¿ïN:íß¿ÿå—_NMMmD›ÊŽFÜ(¦hE&ÿüóÏ á¹5kÉcßßç–¤[OI¿ÿÌÖá"&ð6ङ̸! ®ÆáúØPœKr5Õ…³Þسr?õÕLÍÚ¶m»hÑ¢O<1FMŒ½¥¸Ñ¬_¿~ÅÅÅ ,˜5k–vÁŸ‚²<û§Rå_V‚{Õ”vYI.zü¹QO¢µˆuO¸X¶à-ÍʈbdšÅQùížÚóÁ™±y<žþýûßtÓMãÆ3?ØQaG5n4›¤Úc=6wî\=Šª ¶û×—„FuN~sT[fê‰ð_:scÖ.#‘‚†C.ÓPœ)¹c©¶A>åÕ]ÛÊ„ûŽïÓ§rš7Þx£iŽ&;p£Ùmª-Y²dÊ”)ŒçBêp÷·V%Ìݪ¨®ïý1¹Éq’#÷$ÑÿÛ:/™[€?±ñ”TXÞ0ìí¢¢*Ó/(ø…^€ã“Ž~;fp£Ùˆ#ϵyófÅ…544àü°)ZQT—õÔöO8Óq}ŸôûÎhí b6™]³HµŽ®ˆ9rR±R MùøÀ‡ÛªÙÏŸÑ6|øð~øaùò劎ððGÞŽ1ÜhvÜqÇiÂ[n¹eáÂ…»víâëøƒa ô•¥Ê?¤úŸ>YñÓ{§]Ñ35üšÞùÈbhF(î…ZQúæÆÊÝ•ö_PnÓ¦Â1ƒ züñÇqì#lÇ$n°ÍQM=ÊmPV·n%ƒmƒô9X?㋃Ê?\¨pRAЧGëøÓó|CÚ%ôÌ´šºL‰ã~ÚW·lWÍÏûë7û÷WB6 s¹\x|cJJÊ™gžYXX¸lÙ²œœë ~;¶q£Ynn®öA5@Ó§O߸qãÎ;ñÜÊV7—6(ÿ˜q-±2+Šr»ÝyyyÏ=÷\sŽÇkjû#à› m䛚yóæÍž=»U«VÛ¶mÓå6õîÝ;99yÇŽ³fÍš9s¦ËåjΣ7ý¡pƒMyÄoUM[UÀ4þü¯¿þºcÇŽeee|0ßÓBhåˆkÖ¬QÜ¥” .¸ †û?:í‰ÆF¨†W•@ìƒ>øî»ï~ùåm®…¨Ÿ¢”+ÌT__ï÷û(þ®{÷î uù|> ^¯·¼¼|÷îðÛ'½zõRxeàÀ#GŽtøíä?’ýOà†1å6_¬Ú‘nÈ1lÿ‹¸i±Æ[ nZ,kÁM‹Ec-¸i±h¬7-µà¦Å¢1lÝiÛb-Öb-#kqS-Öb-ÖLÖB7-Öb-ÖLÖB7-Öb-ÖLÖB7-Öb-ÖLÖB7-Öb-ÖLÖB7-Öb-ÖLÖB7ÿÓ:TXX¸qãÆ;ve!%%%)))333''§S§N;wîÖ­›öúá‘>é;bÖB7@+++ûJµ5kÖlÛ¶Maúúú˜¥¡AŸÃ'&;Wh(==½]»v'œpBÿþý/¸à‚cqz޳¶º9VmóæÍo¼ñÆÒ¥K7lØP^.˜PòØ2EC«¦Päk¯½ÆWPSûöí 0iÒ¤aÆý!_¶ÿÃ[ Ýí¦„3}ôÑóÏ?ÿý÷ßÿh%jSº-ª½òÊ+ZIrr²ñ)²¨k×®_|ñÌ™3ÿHóÃü!­…nŽ.SÜûœ9sÙRXX(|¿$%%¥²²²‘Giàn“èÎð¹Sâ\^Wx’¹,×äJ¨¬>t¸&¨üõy$åŸ[’RãÂ:"5Þå’P¢Çï–”MJëCéñ®@ÕCʆ¡Ò¾×X^¯,ʵ r}PnåsµR‘â•Ü®ð®²\ã—ËꃇjCåõö³YY›6™"‹6nÜø7Õ´rI’&2dÈÍ7ßøàƒëׯúåXEVT5„$* Šùõ°_)ìŸë þ;1;ÎcÍ%pVïæ'ã³]ŠÞéÜÊ«üC(ѬnCP^{ ~EQýнµ?î OO—ìQhtWEުđr©‹ŠŠîW ©ì“––6yòä»ï¾»%þjNk¡›&·½{÷ÞvÛmï¾û.îʉȔçÌ<_rœKÑ)›KüCÛ'ŽìœxnǤŒQ®TŸöû`Ÿ™I–«111©ÚµPÝÊë–NÉõ)ÿnBiÌïJÄ÷éöÚ·UÿwWMn²G‰û¶—5h}‹d¹¬¬l¾jHXºsçÎ=öØ…^èdó‹ÚZè¦Iì»ï¾»á†Ö®]醭TrQžµï÷Ö¤xFvNÑ9±O67s»F+O¬þ:1ðõO¾02»À߃£¿¨âtsî{L¸‚”™èžÔ3YùGŠChÍAÿ[ª>Þ^½§*Ð&ÑST¨r@@¡PhË–-]t2ò>7ß|ówÞéóùl·m±ˆ¬…nbfß|óÍôéÓ7mÚÑVÓ¼ ¿×…VÕ^Ð)éª^)gä'°ÉMÉ„Yl9EÒ¿5±9ýŒ’p[òÁI²½3–”4­£/qß[–\Rß¶q}ÛfÜ70C+ …Ðòݵ¯þZ¹d{u‡4Ïþêà¡›LËû<¨R'1¿þúëzè¡–ŒOL¬…ne;wîœ6mÚ—_~é<“ï:§CÒšÀÆbÿ„î)WôJ9!3Žª!$ f±åüa­fÊÔDx,ý#¨áÓ0=Ùœ‰àÇvér—K:»}‚ò—üz¸á…uåol¨TTäÁš`uƒö©¯¯×>1¤¨žôôôyóæM™2Åáiµo-t±{ï½W õý~¿ÃMNlß/;^ñ´Y‰î[NIÑ9‰JæòübB.²dÊ8öÙÉdùHý•SÓö©e1á$ªÐسLJ=³¼s†f*ÿÚ5öþæšÇ.UT²µÅ—+‘ªzJKK¯PÍívŸxâ‰/¿ürÏž=mαÅhk¡§VXX8vìØ5kÖ8¬ß?Ç—ŸâY¶«vT礛OI;¾50B~qH.Ìâ0_ÓÜb‡3 gt3k‰lŸÄ1è‡ý¢©ÑìãvIc»')ÿ´‚õýs.ûh[ujœËšz‚ÁàêÕ«û÷ï_]]íóùyä‘›nº©etk¡[²dÉå—_^VV }ññu¢…zgÆ÷ˉÿp[õðNIw hU ./C1<•H‚o#É$]j&s3¥Cjbõà ~cLÀo–„bF$jÄ{9rÂ>ê—{µ‰{a¸Þ)^X¸ï»’Ï kâÜÒþj–zâ½î@)\ƒÔ1ßVÍãñLœ8ñ_ÿúWb¢i¿~‹µÐØæÎ{Çw˜…K ×Ä»%¿úyàôxר®É+Ô'z¤‡Ïj}z¾ïi”¥×³£~1KÜD$sP$Ib>++ê¡ú˜ÔæÊöOÎItvø¬ø ŽÌ]=µ2udu]¢Jb©§Cºç¥m´Õå»êîüúðÁš`I]°6 g&¸× òÍJˆýšj ïôíÛ÷Ýwß-((°<ÏÿEk¡Ê}ôÑ»ï¾ÛÉß“ÛÆïª”Õ…Š™Ü3…Œ¬³¦^Â8 ¬,:§LióHtcp"úU˜(§ºÀ„oÚ™H*+Y¤iDÝRÚ†‚&qéxý%†þxêAÒàö¾“ó•%@~q}å_NôºjÌsÌ x~úé§víÚy½Þ.]º,]ºTY6«ü¿f-t¶ L›6Ív"…S&õHÙXìWp8whfï,c8 òDJ1¢ÀJðP™1‹mô$q MPŸçNkȂ߭LæV„¢F’4Db%–VÄ­¢U T—vÔ#Åy¤kOJUþ)k«öÖÏøâ¢wöU‚&}’ 6lhß¾½¢w ´pá´4v°âÿšýOÓÍêÕ«Ï9眒’ëj©q®‰Ç§|º£æŒ|ß3Ú$D1¬Gù2ç`„Q&©âèÇà4M†˜{ÚœïŸÉ[õL!3QÃR°l¤¤ qÈ’U¥XÈ’zBಫ{;97þÇ)aɳ¯2xë³§¶ª!T¢w–-[–žž®è«®ºjþüùÿƒ–×ì‘nªªª† òóÏ?[WK÷¹ÆtIþp[õu'¥ÝvjúÃ2õ\¦B†%›ÀÊ¿SÅÌâLéD9ö/†¦µQ²í7ɛ޵aSÅÏ,2-|´¤ËDõh¹¨ ÷’rRܯ_˜­,Ö6 ¿ÿPòìÚò†PøÝzáI+zç_ªù|¾§Ÿ~Z¡aµ?°ýoÑÍóÏ?íµ×ƒVCK=Ò•=Ó>ÜV5ºk²¢ež9OÍûZ„K¬‰„bq–H!;XÊÿÐèÇÝ`’eÚ˜‘ãl±°¯JfµÄ°“ôånð ¢$CR!)Á‹î˜¡ü«ñ˳–¿·¥ªÒj0yŸ½®®N Þ(öîÝû‹/¾hÕª•°ÚÏþ'覲²R‘3«V­²¨£ è²)ëù;¥{ï:=ýñ¡­õ –±—Ì%Šá qÏ¡I•ežØA’˜?nÌêŸ2äŒÅápš†¯#ÌÔ  gâàB*QÄD²3‚=!ƒ·µæÄ8é©s3•«CW/=°ö`½Ù›J¥„óñññ¯¼òÊøñã…ÕþHö§%f>|¸õðß¾ÙñéñnÅýu@«ÎéFPmBT¼c!y¸=4>•cJ.f2WvÂ#PïP%Q×n?¢ÚJ(jŒä“u¦V²–- ‚¢/cäzØh lˆU_-$µIr}pq޲¸áPÃeíß_(«÷gÕ××O˜0aòäÉguÖ{ï½—œœ,¬ö°?,Ýüõ¯ýûßÿnQA š®é“¶à÷Êkû¤M院—BÌ9dJòP¸0•#à ÑÀ¿ߨBŽ•³7ÕLz]ì¶“hî°h9†Iš†Tp”*v”¬{ÓTÈÎHL*F[TÎXÂû6åuçÇgy×L-P–Ÿ][qïwÅuÙ/êÍRœ¢X¥¥¥)zç‡~èܹ3_çX·?݃Á /¼ðã?¶¨sjޝMbø ½™'§=2H šà£ÞH–id*ñŽÓ7ªlhEbŸëÌÉ&2ÍMÎ6Ašú1K›e‹…©bž}„½T'kq›nÂ;lœE6ýé¤Tåß®²à˜Å{÷×KDÃC¡ÐáÇ»té’˜˜¨°Ï€ø:Ç®ýq覶¶¶ÿþëÖ­3« ÜðÉ'¤|ZX3¡{òŒ¾Æ“Ô qw,c.YYܯ±øwßh‡ú£h÷¸$Ê;LóSc“5ö¼Cšw ×Q·m—î^ueB¯,›ýSi¥ÉŒ<555§Ÿ~z||üË/¿¬„ZÂ:Çœý覲²²W¯^;wî4«çš|Bêû[«þ|Jú¿ÎW§;‘3¦IbY\ß‚e"¥ž_øPK¸\ÙáÀ?ĨI fpÌ "„Â3‘ VBq Ž;ÄybÈM`öÉKÞÑìG‡M I’ ÝvZºòï—ýþá ÷V7„êEV}}ýĉ§Nzï½÷Þ~ûí¢‹u,Ù±M7ŠèÛ·¯ÅŒVíS½ƒ Ö¬ÿËié­ÅMd@Âm"Nß8bËX)âT² µ„Õ¨Ÿì؋ۚ1Â2vo[d‹E™Óp V³¦ý-*ÊAΓ5ï0:Èͨ +DevNlWt}‡=åÁsÞ)*® òb§cÇŽ;vì¸ãŽ;î¿ÿþ'žxbúôé¢ wlرJ7Á`ðŒ3ÎøñÇÍ*ôh×.Õ És‡f&z{ŽŸ@k9cÎ&âˆÉ‚G"Kå°~;‚w8W“üä´G<úäŽÐpÐ&™§{©ÊX{ö#ØÜQ²ÆŽz&k $kH‚ÐÑ2ú}Šõ@ùiî W·«¨“G-Ú»¡Ø¯‘NûTÏΊ€Â5Zjkk¯¹æš™3g~øá‡Ã† CÇ “tsÅWào›ñ–“äÙWèŸë{òœL·Ö +âqvÆ$˜²¯ÌÔ7ÿɆb¢øg'slr:ÌΣëgrÅÈ[ìÄvPŸ¦‰øX ÑW†R)õX'k€‚¼C'kŒrÜã2HR8³C³RªOúê²¼† šôáþ·U+\Ã_­ºººsÎ9'99yÅŠ½zõâ+ÍvŒÑÍ¿ÿýo…àÍ~=.#®Sš'ÑëzedgD#¬0¢TBì£ÝÀ?³_…Fj Ò ‚Úб;9–‘0¶Ô'5T}§yâ¨GÖˆxÇ*YÉQeŠtðV!ÉëFonëo@cïûi_]•èí󪪪>}ú´mÛVøùùù|…£ÓŽºÙ²eKÏž=Íìe&¸GtJÚXâ_0ª­:ñDŸjqÜ.¤$³ÊfT ™F¤rø ÌÁ -»Ã#&§IÈ ë.p“L #jŒJf²E˜¬‰rdu²†Ñ/„_„”5éÄyÑ’KrÊkåÁoî),o¨ãÉ¡Phï޽ݻw2dÈ|pLL'x ÐrYO=õT³WâÜÒôÞiKwT?xVF–ö®vD í(‰b“fNåˆt?®ö¤C/4›a!cI4j™-çæ p:¨¯™’5$˜Ò©„Ž•„]ŽÚž´iÍÔ‚¢Šài¯í.­ òï`UWWôÑGJlõÆoýßÉ:Úéæ…^˜6mšÙ¯WõJýx{Í´SØ^'ðÜbI4Äû™ÇIåD<¥ÂÀ 3»Û¦4>±ÄüJi \™ËËô¥ˆI²†NÊM$kôæA=%¬iìVÓQ“—êÞ3£Ãº~Eé_7¯©©=ztNNÎï¿ÿ~4ϪsôÒ¶k×®´´Tøë©9¾š†P̸§Ï¥ßØvH4à©s‡m*G˜÷¡Ëcó‚s,Óð×I9[ÇørMlyG¿'x„ÌkJÆ_n&éŽ} õ0[E¬qq›D–¬1”‘ÒáÃ+­1r8êìW2³ÓC+Jç®*ã§”eY‰­ ®¾úê9sæ˜\å#lG)ÝÜsÏ=ÚwÅxKôHSNH]u þ»Ëó•H*\äb9By*›œ±0•c"gš#•ÃVbr1‘9²El7·Xuh°™ê3#[g‹dDr'b®¡ËM(:bÂ[E•¬aõ¢á“5°Á ™“Ž0§ƒw¢Ö¿ûŒV·ôK?õµÝ…>¸ª¬¬œ;wîóÏ?¿jÕª.]ºp×úÛQG7Š,TÚl†½‰ÝS¾ØYsÙ ÉsµÉ®8Ùb¢‰FT ™ ÿ3aŸX§r 5F‚BSfq¢t`Ͱ ¤;õàñ¿1¿ZŽ0€`PŸ¾#žh`!¯}tjˆçŒ“Ê1ak# g=âŽf¥ bh2½(<ß‘DmÀ¥fà~há#P=xÒby‡ìX¨_ýj%Ìû‚d0©É³ #a¥S€„!YaJ YÊÉ%/¿4oñæê©Kð2§ººú믿NOOß°aCnn®è4“aºÀOÙUVV6wî\%¤øöÛo›?•sèæí·ß6› qÊ ©Ÿì¨^uEõö5++kóæÍºÄZsÓ .ìóÅ×Õ‘Ïr_Ó;mí¡úÂ?upI.0  Œš¿äLøwE‘‹œyØÛ=ýŸåo[‡bdUµòœ…µ¯.«_ýl«$ŸdÅ,)á¶ÎMÆÿÛ ê›öxå¯m¾×îܪêdE3¾øeíº¹™‰ñê ï°¬šJ(úuÑ =‘„‘lÓÄP¬ÄÍa«pÍü4÷¡ë;u~gQéóíÒ©cѾýµµµÅÅÅ¿üòKs>nVº™4iÒ믿ŽW5®‘Ô$_N²'Þž[(üǦšÅŒG¬DM$ýå$P“ö0ìžÒ•[׫¦è‚¥¡îSKV<•žŸå²¡õ9Š’tlM&Ç·A ¬dcΰÛÊWm ‰hŒ)WãPyè¸ëýðhF~kY£9Jì˜ÌU)›XIó˜È’P(VB+½¦Çƒ¶^Óaâû?+¬© „s[·ïÀ—¥¦¦¦_¿~_|ñ…ò7¶ÜÌšn† ¶lÙ2¾<-ÞuBfü¤ÉS{§†×9ñÂÒD”‘Íid¹ðáê å «wôò ÿ(‹9×`«¬‘O¿¡lýK­Ò’ðãdN+·ÐHÃA Ÿ£!(oE̹[e­Üÿö’ßžÊLK4Peð‹lP‰Äö@ñ¤C±I$Fñ2Ùб­‘ĦrÞ¼0ûoß—>òC‰0y|î¹ç¾ñÆçw^]vhÍD7}ûö]³f _Þ1Í›ä•fžœvaW5Ñ@?ê¶I_û¬°…`‰®¿œâ—ȉ†îniíÒÕV_øl¼ùЈÛË¿}LJÛÛvM,z”lMßÔa8¡¡.®ûüç¦b^Íü4òÁÒoÉ€=ß_ôñ7¬ZÑjòJlj„‰$õ‹Å‘m`ÅôX…·Ó–¶¨3"5ïÐ*/ÙsÓ—‡ø/ê•––Nž1)ÄtxƒDÃE-|ûËzçÒFßN–Í&E²µ}¥¡÷¾¯¿õâð‹x¢t¯ éÀD²ÉûÙ\l ¡H35  Ñ¯§Á,äty— ÏÚ+Úõ1Ž¢quÓºuë#FDwm­­©èæòË/ÿòË/ùòÛÄo+oX61׊kÌT‰•ðñ‘íØÛlŽ…¨ô$³%"¢%’?^Ù|ÒF±ò*9$‡J*åŒ4ã)â­1ÿÌLÙþr¦ˆh´òÏ~hÚ 1c%•¡šz¹¢VNM”Œ ±ÒѲ+ìëN,DI(&™-`ÂLA*h¹áh§s+Ï'äŸýÖ~¢E9Nž<ùã?îß¿̯|“ÐÍÿýßÿ-X°€/ïœî­ò‡^Õöxë|ML¸ÆV³p!(è@Ô˜K!FÑÀ_÷—6£¶Q­ušt 4”‘î¶¡à;FŽ!“cÑÙâý%,è›ÚÚ¤»ö•S=022%@Z—¹ ¶bd2²9¤CÊ2õ u`«ä1fF!Œ#¡~9qoj;áÃý<ã”––žþù+W®ìÚµkl/{ìéfáÂ…Â) Óã]iñ®;ú·:=OÔeCa®1“-SË‘U‹2õ OOâŽszÏj¡_4çc“ZR‚TV’]Æyjxµ"ѲµÁ¢.[µ¯qÔÖ7÷ÕHN@e•!á =QÇ6›ú¥b+^æàá91NýÊše‡AŽç‚ΉsÏκiÙ¡ Ì^ÿòòò¾}ûîÚµ«U«V1¼ì1¦›ƒ^rÉ%‚ø¤ÞYñOÕŒ¯i,רQIô©e¾¯ 5ˆN ñç©I± Zì­²FÎÌ3Ú!@£¦ÿjKTÐaº[Y«Ã¾–Ù*µ¹¯FEœ•áÒÌN™tl³=Üá'ÿÂóT„©_q8jpV,gZï”å ÿX)˜˜!œ}öÙÂárQ[,éF–eE}ÉS*6¦kRN²‡7¬‹£’5×H–\cO%ÎS˼€BFM±2Ÿ µŸã ÜËV7_ÂÂãFû…òÛ‚y±Y˶¦ÈdDhƪŽ$¨£n×µƒë¿+4 Fæõ ½‡CyÚ»L¾0†B¦2Gb£$vP¯zšÖ©_MÊàG» fŒ#½ãZ5Içµ¶^}°~ÙNvÐS]]ݾ}ûn¾ùæyóæÅêÊÇ’n\QQÁ—O9!uC±ÿ•‘Ùá–5XraÉ‚åj«(Ó=FQæØ$€²5|ôÄ3 ØÏU#|ÿ|?fïdÚZ¯ãÜn7òù 'È“BcfµÞ Ì;Æ®‰®÷Ü;M;ºZïNåjÄÅ©©É,Âø±Í“ÙlrX™§~%9JýšDUÖ››ð”²·Ææ<»ƒŸ”ëÀ‹-:óÌ3c5ÕqÌèfΜ9_ý5_>¤ ჭU›®i^ab>J¢…ŒX˜±Ó,‚Ô2³d4ƒ§H*æ’¹Mø3³“.yî¬tס²fJûâÑØs½Âá?Ä$n¡‘¦{QÄ|i;¬•wë,µN—ŠËlC¶ØXœ]28^#2¬†ôpséa±Ì¡xX!#fD ³Ä(õ+Yæq0ãâjö-°óÕSÚuúw!ß5¾{÷î«®ºªÿþùùù¿ò±¡›’’á`ÄV>÷šà[¶MÓF\ϳjŽ£$ø+ }«fá¢Yؘ‹ÍÔð»Daá:ß8å¡&‰A±¼l×Áyê%^ JøË–Ë⟜›qQ¸lü…Êå™=+~ÚÍ!÷ Ú¸Š+ä©#|F"‰‹‰HlÅ #s@ïÄ4•#A1è„2¬1V›#AÈ,æÒÎÝPsYI®—.Ⱦâãýükœ@@ \¶nÝÚø‹ºéׯŸ0esz®ï”ßYíÀ¼|$o‡\cÖ ÅKö?u†i6j`\÷öî;ÓÊÆÖ2Ò¤;¯‹£Ú©™A!­è…‘ÃшD2:÷+3[¨¬?ã}ôßþÍ;š\î¥%K÷]•謇›'>ÿB1‚ •ƒ¢¨Á1ãh0±‹˜ÐÏXeÓ4¦|DíóânÉïnJ^¼•uµµµ’$=ôÐCwß}w#/~ èfîܹ;vìàË/ê’´³"ðnÿôð –08úÐWMØ„ùÕ’\È£ŽÀÎ-t ‚›ói}s™-—Ùý+ s¶âÒÆKç¥tº¸,ÒµÙˆ!:ç,ãFKHàî î'’6×;ðÞ†!n"Ždàk„W—<ŸØ}XU“¶yF\0$=ÅkžæS¿L¦F=9‘fÑÎHW'Ô¨”°SÆ1 ‹\¢4áPΚôCÈoŒj›ýôö ?{i3{öl%ªjä‡K7õõõùË_ør%Œú­Øÿêˆl}]$aØ”pÕB¹ÀÊÎC0job®‘åT}ÛÊt DAvj²´tnÊù®l"Æv†ç÷­¡'²ýß ¿8ÿ2ŒÅ¯xQÑÄ"®¾Ú*Múð?‰#¯®i¢«qÎiÞßw~z1Mo¤dF(êŽyÀV,ƒà=èÏ4³)㘇E‘D E\šÆüW°jdšŒ_ß•3jQ?m«"p¦OŸ¾dÉ’ÆÜ‚ÆÒ͘1c‚AA80¼cbJ¼«O¶:é&ÕLS6Ú¯ôª‰róW´!˜QMÈ5dof\ÃjóÔ2GF’ܯ§{Ñ£Iãî¨Ä:¨º`°ç×MÁ'…Gö1#ä‰+‰È„ÛÊà jXöÑÇó¢SOr½ûLÂ%×׊0Õ(~†÷·mÁ^HQ®†6=†¡0©_X©Ï<è$2’Ç ³IW81!f<Ž ÅëøW&‰cRÝ>a@nÂwEµÌ¬¨¨Ø´iÓâÅ‹Gõ]hÝ(ë“O>áËÏÈõ-ÙQ]ø§áÓ0 üø×˜„`êBt\ƒ÷f–¬±­ZrV?ïê©§N©´ý¶‰s»d„çP±¼æ“DxýÉ%2JŒE¾ÆÌ ÷]Ùøc¢uš{ÕGI§]T]£žq¥ cÏŽ;\Z³ U?†>pN¶ËÔð©_™®À<ÏvŒCS‰Ã¼ 銲JÓ8KâпrÒFÿuñ˜œ¶OoçsÆ………Ó¦M5jTxTETÖ(ºá{ã½.)É+í¬ Ì’ï6N À1ÒF¸j£‰j• Áh²ìqwÊ5V©e¦+ˆòs\{?O»ñÑš…_44’tÎ:Õ½i{hâ…žAýÝÔ¹#ºñd•×ͨ±¤ÃщQ XêÁâ??ý”ü§;ë>ü"ÐHÒÜϳ~kpòȸ³úxôƒÉ$ec•©A&©DúuÀ8ÝøHÃÑ­: ¸¨V%ÇIî×ê©5e‰Wø°Çdgg?ñÄfŸ½µµèéfóæÍ¿üò SØ’ûµM8P˜Ø#E= Kic Á:|¸1¿Š)Iß„Í Ç„kðÙ1G‡2öðä_ûK¤;ª\¬®˜t.âYókpÌžÉc=˰CS€\tÉÁÉ[³ÔÇPõм#?ûHüüâ/½¡nåºPuMÄWcø@ïš Á±Ã¼‹æ$ëϘhÔ¯8ScúuÈ8’ÙæÌQœ—‰€5(µÂMt“œ1zðÿÛ;8)Š|WMØI»Ë.‚$Q zúDPE@0‹á¼wêé™x*‡Ï3`:=OLç™Ó3¢œSQQ9%¨(Jp ˲Íqfº_MÏtw…U÷ÌÎ.¨ûw?Ø]©kB}ç÷ÿWuõqÝû®f_ ïÓnܸñÞ{ïݸùío ¦{0š}TNô”6l(ôŒ¸*°“%rJM1IÑ3».vddå¡è@ /!Z )Is~x–w? ÌþK‹Ï‹ªjU#ÍãAcò¶´¢¶€~ûlÿ€¾É: U”¦Œ j” ÿÜ)- E}Š`M´¢Ží÷ļe‰¤ûýhá“áz.͹§•œVU;¼ãŽô55ë šwUrÿ"O(H ¿•/µÜ…e¶B¿.‰#ì¼0ì8>V#’\¦.ìR1§b'aTéWÊùëWÀ½T¹¹¹/¼ð‚lø«-NÜÔÖÖ®X±BLŸØ7mmeÛ» iÃÕÝÙüê4öVÌèf‹ºG†R­¸šÉâ°0à%§. K]°xY#0‹ 6•„Ûµ@ÐPK™ØPõ“…©þËRÔDÃÙ›lšiæK“nßi*#æÆ%S™e0«YL²°#^¦/dı‡4çYZF­V`2¡ç«ëÅûZ[[~øáN aMK p{Ë \ÿIýR}ó@ÔW ¢NÕÈ@@¢ƒÏÅmåUx^Xã?š‹ \³®ƒ ¦óµ@ÖHéè\y¦}ŒÐ0A~±tl¦è.C6¢±;õY‰vŠE„ˆY›ûÒéÒí;©ßøþìh¦ôÈvÇ#¬Ç¡z(È. âÈ “[D_§D.)›˜•æ÷Œè™¼¦œßè–øSeeeõõõ™™™Ž_ÚâÁlÿ‹ò¦ÐuGf3I0t˜"꘎dÀœR’Â,£Â–0¦ÇR—ö±²FºjÙÍ=èh0Û= eì¹3ËÄGÓ#Õ Ó‘`w¢SD”„A²í;£]ce»Hq‘”‰Ã;>j·H-Obr©ŒFzä†v1£„"6ª¢YJûí\6<ûÊËÅϹÿþo¿ýv¬Ïlˆ7`ø¨‚ä-ÕmÇõIô’Îr ¢NAd &Ñ*— ö„=•¹Qˆ=ÅnN•¬±‘dv5òªe«–¹HHê@ç²&–8ô&ž_ _جfè#ô1S˜GqÓܱ¶}0ãʶÒÑ1{ ÜŸMÿ¬â"Ž}ªôƒbñ’†7«¸8RØQ0²?SF܇l–¹hhæUŸ”‹÷4TWWwnV­ZE<71½0Ýwxwó9ðw4f ¸ß,â]HøN ¸‰ Æårr!BÉgÜEŽ@Z©@£ÓŽ•ÌÉ¢¹Ï2î½ÆB¬‰öx@%böš‰ºWÌî3æxõbaGþ> qD×Y£ZÓ¨Ü"È¥’pÇ•Àqã¹€ˆý¡($ ¯Œ˜2^Œ‡tKÚPů¶,--}ÿý÷€ßïG®-fÜH=©æÐEC³˜$œ@ÀÄU€Â¶ƒ]´2fÓ¬ƒ¥Œ1Ës¯x]5k„)v«ˆ‘x@õŸ[‰C ?gÖ ä¬¯>lUa&ãôDe²ZÐÙÉéh1JæÀ>s߀9nEâDª«æ§ÛãR1QS„ˆ²Yyç]¶CQŒþü€ŠÜ‡®Ïœ±aðH¯!C†¼÷Þ{3gγd3nV®\)&vOõ®.kÔ?âI1Y|ÿA¾@ HPà22Ì2ï:Á€NâˆÇpL‘±‹ÕQ#»]‹n ±ô¡ÍrÔ«£jš 5Œ5¤­—oŠÉCT¢dB¿ÜlQ2~ì°O•˜àšrM a`+¹c½q â(ÃH-…TÑìÑ9wA¸ñù|_|ñEÇâf÷îÝb"‘[MAè.³Û”¹á‹˜e8ƒ‰3®Ê¸€ §t;QÖ[;ÎbœŠëŒ‘ «)ÖHVýXô=è<(1ÓaƽU4ê­Õ0¦R±(aŒÈ²®Úë×(–HˆÃhÁ1A Öp3×9Mma·ˆS€`ÔÖl).íF‰(!B÷L”U´?Ëpbšß“êÃÍ£ŠÊÊÊ~øá¡-•ņrðyÌÝR<RLD ”ëõ˜WTŒÝ#“…+g;0§D¬ ꢘ}-,¤hÑV¯Z P aV3·>ˆo¬ÄtóõXý±nG@\†þöKõZ.‰ãpLqpš 5„s ~«J¤auüÉÛá!â^ˆ‰;GŒ3áŠE™¾-ÕüÀ'Ê ã*,6Ü€ÛM êú°žI@†ì7ÉMðqS&¡`âÚâÇòþ؉`Î:\.Ï È©Ù+éRC4˜íý`§ñ(kØÛ ¬Ûè•Áö ·™kzIª½~á­a$·8zIÖ©Ú7‰ŽO£š2a¿]qBlg`ú8uXfÖ=YÄMÄt å•‹ 7_~ù%˜^Õ¤ íÁâFñíT£Ä0þµ»æ \lܘ¸Š.À•\0¦¢j¡‡)\Ô¬q¿j™ÅCA÷!» õ?=å¼ê7B«Š@ø”Þ.î@ì1 ‘8`ä"TpHZQ¢Dâ¦T¬"ôLï”w…=Œ‰|ÿý÷…› 6€é[jÚ†÷47ߦ»É•S lÐÔ`Rä&¬"ÄuE,dÙeܨ*L™*’•Gf®ã,È ú@ åÐ,^èZÁ`ÞrXõ‹ƒ á͇Z˜˜®à¿¸…(AtùviW%¹¢,csÙ$eEpB•q‘õt‚edd¬[·îÔSO•ô•·ØpSYY)&öHó6¶iÝÒ"|)ˆc"Ÿ7˜â¬(>P¾bœ`‚¯è/¥ÈŠ4ó,£ƒ˜i)ñÆqë@gS¬ÇÝZF¶HqŽÅä.˜{l lÀ„%Âw Z½€©YÐ^$¹0ek#z%ƒ9@ ºؤBf±á¦¾ž¿=”XW6žÛK §òíi­Cˆ%ºê—  ”6еlšèÊS«0Ëa]»±udk˜glëѾÚ!^w{/(¨Á+pdB?ðqŒ^˜,®½ÞAᮢû ÅÝ7‡Ö<‰k‹ÛÚÚjkk%mnššø Kõ{ÄmMc65S(ãå›kk®Ê·áã,%R‹{¥@㺒z’ÓN‰aùû`{.&tôˆ[$Üg .œ5Oy] µ«¢0 ©(­¢hÍ©|}c-éï%hób¬ ÷†·¶¶v nÀ‡.¤z=nV*ÖÑÞQ–HÁcXY%†K$VZ¤`rAL§OáwÍ©[Í€›‡›j%†` ý*]7Æì²³ö¡9%mÇéj‹•‰m-W÷{Q@x ¦iˆ¢ÄÄ ¦g'Ǽ3»äå·q\¹ÈØiRËEyò6­DóNѨ,òR³Ý!hwqú22·ˆ»#}d/-c8ÞKt²Êè$^…±ˆ—aDt n‚Á ˜øUYËo Rœ+'DÄq‰ÄÚðM,Þ^‘ϳ±íØ©ïÜ©—ìÐËÊОRTU…ª«H–ÞØˆBAÔÜþ7ÐÞ¦“¨["¨-M=:qé½>ÝãAÉÉÈëE©iäed`¿õ艺uG…½Qï"tÐAx@9 Ã|ÆÀúe› /ÌeCC‹‹‹Áé#™Å†›¤¤$qáoòSÒý.ú¾ÊÄ~ã\µÆ bì@ÞO— ÔøøSmÕ*mýF½¤D¯©A VœN„¢Í¶DžƒVeuHì"ðpLò“IPE8•ŸÀ£Fâ±Çy?gf¸¹|Üwmq\¢zƒß$W_.áU`¨ZÿþýczŒol¸ñù|"nH?j[ÙoRüÎlûXXÛdqñòÙÄ%ú /‡>þ,ôÓv’žº‘ßLB+ò·ÓPXK?E›ÏC‘|ÁºwÃGÂgNóŽëËHWiØ]”å&Àp;¿£ê»ª’èò… y“’’’-¦Ë,6Ü$''7…ÍZ}@ ´jªC$€kx¹â#ÖãjMÖtîWqíFíÏ>ûR«ªÖAeûK5òb+«ô÷?"äW-º”>¼ËŠŽì9wº÷¬©þ^="Ï!–|&àÖ™\žà;¬;eI_ƒ2×¹|üêÆØ¥6H t nÌÄD"mbÃMûÈ"‰¬ÅMׂ•3¶%*[#:å™—·n×B€ Òe(r§ð¦-Úí#Q”‰O>Þ{íïüƒûÓ±¢A &WU\·Ö¾¾!™v™Ã˜ ‰«n w§q“““SZZÊ%V4…y¢æZÜb'^ˆÀ&²EGÏ- üýÿZw–þštK¢è š:}Á{AòGN=äó¢ñÿå»ñ÷IGê…ïl?/|¸*nâöE4X¸E[k Âzºc©üü|ñ¶©¶ž›â©l õHó& "û‰°trUrµxÐIfâ¢O‚÷>ݺy»¸xªËcš†Ú4ôá² ù#§~_@ÓÆû¯»8yÈÁô3ǧk“X?+ŽŠín2>~UÞáÚc’T„®BÐÍÁƹDFµõúŸÿÞ¼pI  ¾•¿Ë:ÖF(ýÍä…‡ :¸Ð3ÿÆÔ1Gø0jHPL ¼ ©â¦q0·ÔpN„³ðg%Í`Áººº¡C‡Êâ-6Üœxâ‰à^ÅÙÉžun"·Q•‡ÅB”ˆ¢¢n?TÀ0°ÖÞ ÑôG_o¹ïùÖ¦–. s`Y(„¶îÔ¦]žú ÂgÄ`ï½W§â¥Æ¼œeÈ!n0¹v—\€ ®(Ø×{`uSRR2bÄe‹ŒÅ†›SN9Léhm%°àØ6hHóJ„NVÊ“´¸³€ ‘ÆÍ`ŠŠb „±`¤£ÒJmÖ­?lNÀÍd]Ö F„Ï7B¯¨÷ù°ß‹.==iîE))IÆ·JÄ&:h“a"náCE6QG›ö£;-- [Þ@•a‹ 7ÄUKOOçÂ÷4ëÛÌ…«b™›1LWT;GˆÍŠÕ²Ë˜ºG#ƒ)-ø¨í†Gš>B&=âä¤ðR`Ÿ/ºn˜üƒÆâ=ã¥{«ø0FÍ-:I´¡ææðbRÅçE))˜TLM ß1LRH•Èâ½p¤Ö—*á0J*-աǯ@ †—/=² •üÜ1ØûÄ}óÍ@µUEÔ“r¡t¸MÉ 0ñ£=¡`JHŲF`üC‰)pƒâؽÿþk×®å·Ö’½8¤éÞð3Îa±à& £¨(“:0r(c0ÃNA 0"Õnx¬éù·8ßœlœ× g¤‡G{[ÕÔê{öè¹¹x@|ðÁ¸ÿÁ¸__Üç Ô£êÑû“Ø7_ÜÄ)=bË"õ8o‚láÓ0t*«ôŠr¼{·^¼MßV¬o×·lÕëêõžÝ1ù½ C­í«F ûù miÓW® qq׃ºg{^Ÿ—1r€?úB"æÆu‚ # ñ?³Že:XøDË×Ð,8aÍðáÃÅt…ÅŒ›“N:IÄ ±C»'}¸­ùÔin¢²ìgˆÀù@‰«` Ôç™+Ý‚YÆ8Ë~œ;¯¾¹uÿŒŠô4ܯNOC Mhç.­w>9ÌsÄpÏÈž¡CÄ㉠Xðáv‘ûUE²Ìa¾v„LèX{Ð *€ŽÍÿÅÁRñ[K#LG˜vI¬tk5£ÍMñ££Žð?+Å:Ђèû Úç+BK¿ ý°!TçIIBÛwé M‹þ¦Vý‹µÁV§§à˦¤þïùi>ëë¨ ¯ö¿f: b«ÄLrýâ&¾ÌÛøà 2nŸüî»ïN;í4¨²ÔbÆM=ˆˆªªªâÒ×U´­¯l{õ4Δ*#jJE)Gm9"p~2þq, œg>h™óT¤+fÉIhø!Þ$?Z¿U;|gúIþÉÇûzç›ÙÜ–æQÒ[ë‘÷͆6Î#ƒ™„M 0ÜA”ž_)MyÅ[¡³¨¢)ƒ(¸°ÚÇþõ¦dŽpŽ:Ü3ê0ÏìÿöÓ0ÚYª}ðyðí%Á [µÜÌ0 ƒð£@ä`C³>aÓÓÿnNMÂïÎË:´ˆq²LiÃPVJ:ð-¸ ×~ì`²Ê´iZI=p3ÞÈ‘# }¾oºŒ©tÄ&OžüÊ+¯p‰µmÚá=’>ßÙrüA)Jí¦Ð1Ë8S$ÊÈhP¤cœÀ1ûjÚìj›ô)·Ö¬Ûžø; 1FÃys²ð†ŸBEùžýÓ'zûä{÷Œú!MчÀ[aE†¥Ç¨ÌÞÀ41M¥c L øÈ“Ì÷žGÝ×h¾€öËJ‡-ÆHLUíó’œ2atPç²s’ÈŸU`Ç.ýío|ØS®§¥¢²ÊDþVÔ7éäï¿®­IöãG¯Ì8û¸ð->¼0a}.¬1§®¤  2NQͼ3 ná{ çg"cÖ(¦çgF,ÜÌ›7OÄ 1¿/ÚÒÆ ‚Õ L åijÄ-R+šH ø ׾Ɉ—DFG5ù2ºv_Em"o[ÐÇ{xÏê ¡Â<ü»™ÉÓOð'%›?LÔ¶‚ÌþGÞS°DöåÔ1ý¬[KËDù‚M¾Øî•õ&XWÔ©SÄ 'jÆ3 ¨_ÁtIEëB2ÊP Óé6}°Ý/|0ÀÁÈ`PßÞøº “¯» 9ÒlK«þÖ'gßj+) ªªM }Zúe×Ï~²áâSî¹0cšƒÔ; e„ iã0 &çý+®w ½ºØžœxRkÖ¬™>}º˜¥¶xp3`ÀâR‰ÛêüPѺ¥:ð—ã»'ù°d1 D îT ‘D¡ŠkÁ^,Cw©-€F\SUº/ !_¾Ñ‡úA½ºN¿â¬äóNNÊÊ0§&¬g¼y¨x­éa"¦Çü 7Ÿu Èû}£ c¹Wæw’‚‹¬aÑ`{Wr C›+!Ê¡‹IAƒDQƒá£SƒŠ å%S’ð¬ÉÉä/’N>‘—·=² <«¸¯®½èilÑÿ±¸ù­å­§ŽNžÿ»LŒIÔ†zÉ dX´Z5½,[rÁ¸—n–Ù^=©qãÆùýþŒ 7›1nˆ]qÅwÞy'—¨éˆøSO|WwÍQÔ][Ð ‰lBŒ‰žÂ䂹#ºT'޺íºÑ 5?Ò_V¥56ë×_2ó„$Ÿz¶œÙO"­uÖK2Ébõ,Ú}XÂX2AÐA”{…(±c}!í`ù¶XÆiÒ˜ „ÄRQÔ@Œc€F5ôPÔÙŸ‹›NÊÍÀWŸ“|õÙ„>8 /›ºï¥æFTˆ×u.«Öžû¸ùÝU­š‘~ùÉiv÷@½c@p¤ Ç+mõæ…N©f/ý°|555wÜq˜¥¶8qC.vß}÷‰[o­<ðMõ5Gf‹c>nÃÄ ½#8MŒ——džr>ºâéÚW—Å¿mä`_÷LϦÁ?_œzÖ„d7Ú²n•¾¨nÆk‘QÀŽøR/_%aLrÈ c;P”ØAæ¬ù­b$2ß ]·ßÆ8LÚDbx1’G ap²“e¦XqqŠAL$¾ðädòGÒ q^ÿ¸õ¶çšu]OõTÕks_ª¿çŸÏ\‘uÒˆd€VÔPpð†§±q*Z¦5¤}¹¸Ujøðá­­­² Ô'nˆwÞy/¾ø"—¸¯%4*/ùåõ  ÍpR+ƒXj0¨‚õŽdB.È,üâçMW?[ÇûàÁhÜpÿ–Ý¡cóß~IZQ/O´ÇY°ñ8Z*þbá@R€æ#H+< A':Ò­FùÂæÛaea[òØÙ£øM\ø‡X¬p§4>è^‰ APØXô¿LÂbÁçâ$WÀ‹Ñ¬‰)äœï ÝôTãŠõÁ†–Øv5#b¿¦Q;ÿ¡Ú¬4üÍ_zt#4=‡h4pÃ^ ¹7d¿pæ4ic™Ž/\\¾Üôôô+¯¼~ÍN?nž{î¹—^zIÓøèÆO5ùßT‡qƒø±›ÀAJ/ ÌíÔ–6£æVn-‹M=g§ã±Ãü«6o:/í·“StÌ@Œå QR%â7±a»VˆÖb¥`Ä„‡„„` Äè©ðIÄÞ°$]=uQæðsäôWß!”ƒ(ÐÔE ()ŒÄÖŒ õ/ð¾qK88 ¢'ÞkþËëMÁP86¬|ͶµõÊ:}ôŸ*oš‘qÙ„4»ÿÓ®SZÆ¥´ júâb`¹Í Aƒ¶oß~Á¸|ùœÅÇ3cÆŒ%K–äææVVVZO¼«mÕÒ|ÚËëLƒµâä4¹–?\.PtÇlì¨ 1·ÒýŽy„23MY´ªuÎYi—’нö×. D‡‘*òHMô "øuv>[Ô2Xg¡C{CÁ«¯ˆJ5ÑC§ÐMâʺPH6u¡e-k(GÄ  ò¢F,#ˆ=G ø<èªé©WMM#ß–GßmzàŸMmA·Ü©jÐî{·áé›–ÝÚ=5 ÛݶºJvÄ~i.bsQ,uÙSAôÍ|§”^_F{ZZšÏçËÏÏ?ãŒ3ܼdÐâÇ ±×^{-55U|’oesèúO+Î’žlMQÙCÎô :ÄèIr"á®kÁ ëóÞª`1€pÐN–´nGðÚ驜šöàevpÄEœK#5‚ceÊœh¸‡[¤'BŬÁ&µiv„«óßÑOH7‰f8ÄtªšX€(ú)1ƒ$¶PË9‚õޤ 0áeö‚qµ®›žFþBAt÷‚Æ,nnqŠ:­ºA;⦊G/Ξ44%ÚúEÙWaNù\©<œ,Î}“µÌ¶P\øhó¼\âÄ444Œ=zóæÍW_}µã‹•Y»pã÷ûçÎ{÷ÝwséM?<'é†O«=©GøR+íóƒàS“69¯LhÒ_ö­Üê|ïMïnÞþyž †ž¼2+¿›5Ð(àP#ú€š¡—AÙ1ZnÐÊ›¶³ø{tDÕEt e\ý„›&’ÅjXÒÛÊAhF ÂÇ‚—5e0² „õÎmç¥ßvNFIeèô»kvíÓZÚTïùí©ÑþwA}ñÞÐ&¤ 4Áü+iBÏùA§˜èÜIoîû1~ê©§Ì{gâ±vá†Ø]wÝõÌ3ÏìÝ»—K_SÞJ4Îê=™£ ’¹ñ/ŸiRÏCIr‘ Y È N(„ÞXFô­âu‘ûG§,[ßöç³ÒgK¥x­ÁS…u¬ÜHó ê[С™"sšxIgO£å07@°ñ3À]ŠÑÀ8±yMNæ°º† ’PDz³è=©„¸PÐ F,ƒút÷®~ üËúøMó44+¡³¹,øÐ‡{ªµy3³0 üÔ>w§ ÆårÀY¹owÇ?~|vvö´iÓ/ÍÑÚ‹büñðáÃŨ}}›vù’òo.ê9Üp•9>ê\ @¤T\»G¡~}^tþq©K×¶Ý4#ýù?š ˆlZƒÇÍ!(¶ceõÕ2¬„aBËRè ñv[È(ƒ5˜=Õùaoˆ®ØNá‚Ì·‚'s* å0š…9€cEýn«ÂÆ| p«7#®®]àŠIiäï‡âài÷í«k–Îd•V‡^]ÑDþ}æ’\û…8Á…çEL.˜CnôŠÍý®•À] ™™™kÖ¬Ù´iüz\[p3tèЩS§.Z´ˆK¯mÕ 2ÐË«oc¼§:ãRŦA€[DñÈ™8ÃnÙ+c׃&ž\^§ÝzFæßç1.k”äC¿T70Û1R ýšˆnÔæÃÃôë c "dRA"dld€Áº0¢“ˆùoÑ8ýb'2 ¬ÇÄVå (Uècª(ļ8—Ñ)É CŒFFôó—ü#oWehüU{%wÀì­Ó¶W†þçõÚùgç0}¶cØæ…ؼpç‚Á¹ˆË=úåàÈc ëÕ«øZÜ[pCìwÞIOOonæmªj{5XlaʉýRmvHnPâN£x‘¹EÒÀ0ës±Õ/y¶fgp0ͤaÉõÚËW椦˜Ÿ*ô9²5©eޤL¸:ˆr¯¢¸3J 3ßö[„©Á@•œF9Q£# TL@b5¨„U:TØ‘K5GNû»X€ ‹JÔPc52ÂE¹¡ -u÷n™ß‹hœ£þ\QV .í£õ­ógevó°dq ý:ÞŸ-—9– #k"¶Õõ謸UFœ®ÆÔ)¥z+eDR`6 ÓI‚  #%b¸\edÚ Ü 6 €¼j9+ÿx^qypì•õ®²ëKƒsÖuPRÿž>·¬aá"§ GO¾‚¢‰œ./m~æ`™+Q4+W®Ü¸q£˜‡%7Ć r뭷Λ7K'Ú,Ù‹OYXºâ‚"·A„øÀpÜÄ1ÑÒ.x†wJéŸT\¼pLÚÃäPí+VýR°ˆ–Tߟ-Hl’ 9A Ö Jì õž5”äAJ×1–‚ÆGL¡\8³v«D>O\Û2ë‰j¢h¬.“ã¼,ß©T®¿­ÀëqÇ%\¤+t"¯E²i ¢IoÀ³Q}úô¹å–[òòòÀÜX-a¸!vûí·/Y²dÅŠ\zEs(;ÙsýÒÊNŒÌ‹³K£Äq+RŒ:®‰cÆqN| ‚Y¶„Ñ C’{çx?º±O4»ä¹¹?[”9–7¤†’kh±ƒ©Á†ÿÌ>ëôä7Ѓ,Ž€km¢ ïæÄjºäV.@F=aÑ5R†rìX)A «5WsÀUÑÑäÃS*)ÿ×ÊÕÛíëKC{ûŸý²á²ã2ÚÅä„*…æ8ø™mà3C&Ož¦ª|vcÏå?µMy¨"hÞXxð“úËÇd=qÏí¤Ì˜8îµ]{›€€æ)§œR]]}ÿý÷‹Yq[‚qClóæÍ¡ÿ¶Õü¦¦[Š÷Œ!é"$Ȉž“߈%ŽI$-pÇ{µV7Î>2µ©M_>·§P¨,|3Óæ`ÖyQ2‡Žds¾r‚íò°”4XcÕE2¨SÆ Á¦t•Ž®óÕhºy¡qž/H)dKÕ†¤}@CÉ;Àa+עƮeÝÿÉ_ëØƒ“ö=\8êν[ËÃ+\B:(×·ð»¦3G¤³W‘´ e•ÎôKÒIõsßÛó5ô@ÞÑ£G7eÇŽbV{,ñ¸éÙ³çêÕ«IwAâÌù¼²gšw\xƒQ9q˜ ,8¼³ ?SNÁï­ O™ù¨O–WE..ˆ~õ8–b‘ôÝÎpX®o7ß#gå?8¼y’]@úµ+ßoœ—9:;ÃmB Dë³ ÖØéö ¡9Åiz¬¦]‹ODBû˜ú²Zº‹2VXC9ÅÊq Η 9L0YVƒ )æLÌöa|û¿k»§{+êC=3¼(AkœÃ=ì¥5üøššyËù‡© câ‡zhäÈ‘bnû­£pƒŒ FËÊÊÀMëÚ´#_ܹêÂ>ýr|®ã8È ýòÄáJdœš@ycxµÃm§f?0ÅhÊüÏËJ<•$2‡Y/ã &l|+L)‚5ÔÈÇÔ× R1´£Ázì2€¨¢YŽHR˜îú%’È»{¼akÉ(ƒX' r¦˜E@.Aˆº¼DÔ)ŒþgBÖ¾Fí¡Ïê7—{¦ùàFÔ‘c±ÇDsøßÕ\ÿ¿Ñ81ŸÏG(síµ×ž|òÉbnB¬qƒŒg6TWW?úè£b!α¯”¼Fáˆ|È«R†~¡¹$A¡˜ÌºqBöôa©G&E‡Âó²°¥ Teë"¹‚ŽH6J"»¤Îi’q±¨Bô¬1"5÷ÁP;)#šn]Î\9Qû(ƒ””‘†r –c U×QÔˆe(™Cþîš’3cXú°‚ðóªbAIŒ¬ÑðË÷ýepWaÍ„ N;í´óÎ;OÌM”u,nˆ=òÈ#~¿ÿÁ½ªêmÚÛ¥/žšB_!rŒT¡_É\«PP´@šQKº"R#6"”A‘Û̃˜ ƒ(`Y-#s$ZâÅ*ÌqÖ°’‡q Ìy] ïÈt•Ž<N›.¹´•+¦‹nÛ7åªY(‡–B4‰ í£ ]…^óâ(jdšÅhgtQRk$ÊHZ¸þãÇåÏ­–Ö}ôѧŸ~:ñHÄÜZ‡ã†Ø<——7wî\‘8åM¡ß°÷¾ã{˜³ã̘WÍFÉcæ°A|t™v…¥ƒt™Ì‰h“\,†xè°R€Ž­_¢ZÅ:f¦˜dÜÑ™,&Xƒ¨¸ºV Ý_2|Š}éŽ3]8`²œfÄ9ĈT¡:KŽÍ«¸ …hâœ/ïbóvŒ‘͈S¬9ýíÒ·ó7ñKMM4hÐu×]wæ™g鉵ÎÀ ±9sæäçç_rÉ%âÞÆ»‚s—UV6‡.™%‚˜ ÄÂö‰¢+%ŒQFô­lIGbyPéÐnއú¸Ùè“c‡:XƒMð¨éc5¥SV›P0—´Ébe Äá5WFg_šŒ2ˆ…sL—4t®È÷Û¡Èâ6r,0ˆüæåk+€Íärrrrsszè¡ñãÇ‹¹ ·N ±‹.º¨¨¨hÒ¤IÖzœ$Ÿ·(ó­&°«>xóª6Tµ=<ѸË%‹c¤&žÐ/2¡€dF˜áFP@‡ƒŽN7küËߎ`$2b‡ÒJHÎHɘ‚5 }Å¥¢‰–1³u'â0í8-á±ÊC2Žæ¸D RRFædIè3hD¬(„À±Œt¡ Ã$²ÒPŸ'¶U·„°q=ÖO~¿~ýZZZÞ~ûí#F N±Îà ± &|ÿý÷äµ%''755µCÅ5Qô4´›êW–¶,¿ ÐKÞ~éS¤&ÎЯSL4tŒÏK·Æ?è^E«/’!ÒnŽ;Š=k°¬E *¦ "š5ît“nˆJqoºäX(ËÂ?¬(ÃÆe8)B9€3%Y¡ã4v•ÂÆnʸ‚_roChÀÓÛCæ·#| GKwëÖ­¢¢býúõ}ûöEeŠb‡~xYYYŸ>}ĬÚVm}ekÑ?¶¯¾ø Þ™^Qb¨€‚ŸX€'›á¦Ë˜í L Ò¡‘áaf X¦D­æÀëûM1*rª[µ¬Š¬¨1Õûþ‚bruæ.ð˜ø"3ݼ¬¬5¹ÌøÂ–dƒX¬ u(¢ s ’c«°±œ#BŠF\kxáõ.æwõØé§Ÿþõ×_oÛ¶-áë†ÕÖÙ¸!Ö£G"m @^-—Eè[ÓªýRÉ3“óNîŸ*F[`X8,Òs-slߊ…,[è0¡zµ wku,]Yƒ¨‘Æ„‘ZŽŽ*èƒä¢«„»Œ±¬L;M€®dŽ€NȈ§öq¬»XØø`´(ˆÜ€&AÂÇl‡W_ôï²7l@͘1£¹¹y×®]`n‡Ú~À 2¾ØÅÅÅ^xáË/¿,æV6‡.ûpïŇgÝ1¶›$vŠÔˆ2G^FF„¬`0EÝ+~5àaY}@¬“…bYYC‡–Ù‹"³ËLu»¶&‹®/~‰6V¬\ˆ8X‹¹C RRF&g¨cÉ µ¢Ô rÉ#¹¨€Â;PV–¬ðô¶½ÀMÞ>Ÿo̘1£G¾ùæ›ÅÜN°ýƒ›ˆ½ôÒKS¦L!Ð ùßË›Bÿ®æÍÍ ß\Ô'= ÃŽÍdIQæØ)Î4Q‘8‘$“0"MD5„`”úÅ(É_ B!–"wh¸ zzÛøòÐdÁìˆPÎÒíÚèRޤˆ..’ÅjA®­ d䣔9¼®(Ã()PΰÝPI* ŠÅ{‚ˈ…ñ¹ï•½»v ¦OŸ¾råʵk×öìÙ,Ð9¶ŸqƒŒ»Ý‡ ¯%ôÇËŸü>yÑÌìâ»Ònl†}+Äo¸‡™e5JhèÐ|á4‚ØQqÇè1Ã.Äõ´OYôÐ}cRúØéòAN5ÈÈ":2³Æ¡¢,/‰Úˆé:ß bøSNòP ß iX‡¢utY€”+á£5¨¦EïÿTqs~»Ézmmíž={0vÿYvˆíÜóz½6lxú駯¼òJбúxGSþcÛ>;·èО~W2‡“0 špjH§†*‡–/P„X&vÔÜ¡¾÷Á¢¿Ä}úÔÕ·uÔµiìš:0ã©“{ÒÊ…–9R #›º–,«‰~ À˜]’všgŠ‘ w |Pp¡Ý ^òèa^Ü‹ú¬kae±ö˜BÅpe ™Ãß#Ž ÃÕåH +Ëayq‡šnºkà¥å2 àX1ÁÊ\gÊ –bîC9ȵë©!•÷¤ãï÷¶Žyµ|v±³Ï>û³Ï>{íµ×:s¹°K;qClðàÁÍÍÍĽzá…ÄhN}›¶¡ªmðÓ;®;2ç†ßäH}+äbe0÷•Å_dÁkØÊœ¦Hy;ˆ½c““<zÙ.¢O´ áÅÑ6T{†ŠU\ZLä’aE‘+ò¢FX§Ã­6fìÐPŽKÐP‰¬Db;i¬©ùâðY—ÈX@{ðÁvØa , ìw;@q1âRÝÿý¬ª6:¬j ÝòEÕ}«ª?9§px^¨ebZ O6µ3XC;4@°Æ|1¼äÑÃþ8c³!Ž5‘­Î%¢ÆlN|;%%ÅÂîÛqCt@¸ A¤ ˆá”Q…r$ôIhŒb³?­xb °»pÄÎ:ë¬M›6}òÉ'‘͆L; qƒ /´²²ò7Þ¸ð ÛÚ€;èÚØWwå¦x¾œÕ§0²ù± e¤kù è°ú…â»wDkÌ—$¢'rBЩÿÑŘÎd)` a=åÌ=DÜW‘‘E–.5VÏXqB†Ë5”ƒdrÆ.ïP,)Í«ëÿÁ^Ù»xä‘G–””\vÙe'N”9Pì@ÇMĈ;Jà=iÒ¤eË–‰ÐiÓô½M¡‘/î<(Ë÷ÉÙEÙ©ÀŠ5¨Á¸¯,B,†u:)XcšÿcRXúØù и·Í VܘN]ÆY Ár†½Ñt§…9œJx(ÇQÎ0ÔÐÐMiøë=-ÞØÔà7.;;{̘1ćúúë¯ÁšýAËÐÐaùxX|°Æ…Ów°†ªÈ×5 Ø¥EnNÿˆ_W,OÑt[QÉ H£6b-C?—PŽN½"ÊuÚZ8ú•’¦¼š†ØÌ™3—/_~Ûm· 8PVæÀ´Ÿn"6lذ¦¦¦>øàôÓO§o¶ê—ßs{YÅκðLÖ»[{ÿcÛ¡Ý“þuFï¬ .±é´` èu Ö°qbI°Æ¢ˆ¸:ŒQrF*":ÍÅË>ƒà %€\9YŽr†¡Ô qÊZN|cw@6ÅÐÉ'Ÿüí·ßΞ=ûŸÿü§¬Ìl?KÜDlòäÉ---O=õÔu×]×­[·Ý»wÖÐùüú>¹­Wš÷㳋úd›d.#k»ýp»ƒ5L¬ÖM°F˜b~r#5Ec¼v×r†Ñ1Vp2]8às]Gs ™£@Œ dø\W”q åÈü&f…~}cý¸W¢ Û AƒÈ·ýâ‹/&¿²ÒB¼ýŒq±Ë ûë_ÿ:oÞ<"yÄÄû%zgȳÛ3“<žY8"/üx p¶› ¾H7å‹‘;L'¾` j$¡bàgŸ Ð8@ c1Ci q[K:9g¨ R ÔþPŽD΀$2 ßðiåckj„×fQ4ëÖ­»þúë/¿ürE±Ÿ…ýìq±9†½ùæ›]t¸™ünÔ¶jǼR’êÃ7•{Ó1ݰ|£ÏØ‚5ŠÛ x«7ãOa*—, ƺTˆ+C7… ‰Íh1˜K‹tΦ’eít¸,ޏiJ'F°;\âÂ?®L§†rÀ2¸¶E;îÕ’­5ð‚½ˆM™2å믿¾æškN=õTE±Ÿ‘ýBp±³ [¹råI'ÔÐoüÑÔï\±ïþ¯« 3|‹ÏèÝ7òÔ`˲¾[°QPk”sÛÜÂDá„×>U^5€-èf—…ÛiºuA§KÈ(«¢ ™“àPN<«r êFùW7Ô_¶d¯<>žu:÷Üs?ÿüó;ï¼³ƒžÕ½¿ì…›ˆsÌ1õõõ?ýôÓØ±c÷íÛ'nÜ… ë§šÀgw±s۱ݯ=2ÇˆæØ‚…ܸušÀ‡(€’‡Ê§¨¬æ Í3MÑ "$´¬–q…€šK½## ’Ê`áß~åÐŘèL}@›ðú®u•ÀRUËrssO;í4¢hî½÷ÞÈæ{¿0ûâ&b (--mll<ï¼ó–.]JÀbDìÌ]VyËUùéÞwfô>¬Gø!Íð*7ÜAN+k¨ÿuEµ" °ª°ÙEèÕÚcä<à;Útá.K¨X,¬FŒZÈ ÷¡©cEŽïZ~,·" ŒŒ•ÁäwqÔ¨QO<ñDJJŠªèÏÙ~±¸‰Xzzú¢E‹ÈùwÖ¬Y:⃃‰4½¤>8úÿv±3¼gòëSóó3¼ÒÀ ÍN¹¨VÖ°šÅý¢>7¡bD…i¤ ‰å±™|]w¼,±#«›ð…)Ä<¡¡eþUÜxÑâ2Ù{óz½3gÎ\¶lÙ=÷ÜsÒI')Jþ2ìŽ˦M›F<¬ššš3f¬^½šƒÅÈ—cÕž–ƒŸÚžâçõO|R¯Œ$ s1ñ>Úâ¬Ý%hY#}S˜[Ñ×rÆzB\5ê\šnV“CG&s€ AnTŒ ÿX!Ã+ IIãøÛ½-SßÚ³¯xm£Göx ‚ÓXÈî,ÜÜ@þ’¼ø‚Ã2ÿz|t†;€‘Þå'˜ø(‹ú<ø]F‹ÅŠ@a³”õc6¬Q׊-6$Ê• ËèN$Å€•á®hTü¦¬åÌE{ÀÇ­ÐF¾S§N}ÿý÷o¹å–éÓ§« ÿòì×…ËÎ1ŒàæöÛo衇ššš@'‹X[HnmùKöâߤ<79¯(ËΠ&¤ìïbÄÕ¢%fÃ.õ!æË- ›…`ИGΔ11åæU•c2»)§þÐåe”,š$¶;”ÃëÎç 7×ÿaIE£ü†ƒˆ§‰Pfùòå³gÏž3gÑ5êò¿Tû•â&b>Ÿï.Ãêêêþð‡?,^¼Ü&9b­!ý?»š=³èžiÞÿ;%ÿØ¢{> Á(‰=XˆÑËÐe¢†ŽÑÈ6=¾,'K¸D‡˜8øJÊþÁŽUBþÉ…ŒqªièOŸW>¾¦F1™mÙ”)SÖ­[7yòäùóç8{ï/ûUãÆ²¬¬¬W_}•ìÚµkÖ¬Y7no:Ñ;»ëƒ'¾±+Õ‡ ƒn>¦Û Gå†o@wšrR¢Ç,í¬‘(ZP£‰ª$Ý>–•ìh³h¢î€:N,‹æPs\øçàX‘Ó-Õ —­­huó†GiçÎÏ>ûl^^ž‹¿ ë cEEEŸþ99(--½êª«–.]JôègõHõV6‡õ;Wì#~ÎK÷>rbÏSNŸ®+E‚‚5±FjÔÑb³¢®S™ýBÑïGÊ€ÍÊC ÿ+¢[ÉOËìO+^\_¢¼%Fà¬6ËDˬY³fܸqûÛßzõê%I¿Rë l½{÷~ë­·ÈAss3ñ¶yä‘P(Ùòcœ’’RÉnÐô]õÁ™ïì!Ç~/>*/ù©“óäúœg»ïÀtPž«h€F5õš$R¬«2ã™Úu¢Ë¸ô¡ÜðÁ*†@™8Jó–ï“=P…°&))ÉÚæ­{÷î„/_|ñÅ5×\3gÎ’% ¿v냥¦¦ÞmÑ8/¿üòìÙ³«ªªÀ­v, „ôå¥-CŸßAŽ}|d~òýÇ÷$ÿ#À•Å&ä‘ó\å:Å1.4+©EÚQFéÂX@\kƒäÑŽi0¤ë÷UýÐ75µÄpFX“››[]]M~–|ðÁ³Ï>ÛM­.ëÂ[#¢æBÃÈñÖ­[çÎûÑGµ¦¨Ôô•¥-c_+!ÇÄá".ØÍÇt»xh¦ÏmÕ}0ld ‹¹¦"¦ð\äQÁc—-È V".+ƾð”?`S†Þ,k ^·´rqqCÐa–““3~üø+VLœ8‘hÞðÉ*¸uá&8pàÂ… #Ç|ðÁ 7ÜP^^NT¦©¾¹ÄáÚÓ¼ê“rò‡ úŒ-JýßcrǦš?Í.6ÐBr1 Ä<n[…uìfÝN‡;,ü“FsÀ¥Æá¸þý_W?óC­ãêÚ|>ߤI“JJJˆÎ½ï¾ûN8á÷u»Œ³.Ü´×&† ýøãßyçééé»víR£ôYº³‰üEN‰Û5´GÒœßäN˜îõà($!a4\Ø,ÿFG:N›nuÄÅ¥e!¤œœ2Ò«šCw¬Ø÷æõÕ-®ŒaăÁ7ÞtÓM—^z)I‰©….­ëML˜%%%]k2ÐóÚk¯ÝsÏ=555µµµj‡+bÄíZSÞzþ¿Ê"§8é~ÏøƒRÿ0"g\Ÿ@HÅ $½ô´wçß.3]r C6È–3u­¡Ç¾«]ðcÖê6õý effŽ;¶¸¸8%%eΜ9guVbn]oh‡AÏņENW­Zuï½÷.]º”|§wïÞí¦-üÀymÑÖFòIÁƒúeûO˜qùY}2›×#[p¹}Ü‚aí§Œ„N”Å03¾6A󢟟_[÷ÕžÙü‘;ꨣúôé³lÙ²‰'Þxã£FŠ»©.sc]¸é ;úè£ß~ûíÈquuõ+¯¼òì³ÏîØ±Ãï÷———»l„ ·Ž~ª <¿®îoª­t ÆeúŽé2cPDD…3lÐÄ8Cäx#ƒCSñúht¶×^ÝXÿéÎæõU­5-ŒdIõaõÍÖ  :´°°ð‡~èׯßoûÛsÎ9';;;ÖFº,nëÂMg[nnîU†EN‰ŸµhÑ¢çŸþ‹/¾ÈËË+--w\¶,/7go5³µ-…š®×ŠÁÉ• &;ÉÓ;Ã70ÇD¯äc SSB†+UÈ:¢C ºESFŸmµe%Í«÷¶n¨jÝQ¬lÉž©Z«‹hoVVÖ˜1c4MûꫯÆwÉ%—œzê©ñî¯Òe‰µ.ÜìgKNNŽìyj¥ßÞ÷Þ{ïwÞùñÇ{õêEä½]FS0†Y„¢w,Ô´j5­mªÚˆSuÁ /Ɔ† dz‘Õhºßƒ‰SCÚ²#¤ëäÿºÞI!r匌 z‹Øž={6,¬[·nÈ!Ó§OŸ:uêa‡Ö)Ýé2WÖ…›ΆvóÍ7[)~øa„A555dÕÖÖºŒµÓ"Œf߯±ßÃËáP$ކ˖-#’`eÚ´i'žxb×=¸uáæg`ééé3 #>¾eË–å†ýç?ÿÙ¹sgQQo„G%%%Á`põ6!F\žÁƒ÷îÝ›ìÝ»wóæÍ}ûö=î¸ãˆstì±Çöïßw°Ëâ±.ÜüŒmaÖümÄÿÚ´iÓÆ7¶~ýú;vw£GIIIš¦555‰TYYéf’>Q–ššJÄHNNñƒRRRˆ'ÖÜÜ\ZZZVVvðÁÕvÈ!‡jñ†d;­c]Ö9Ö…›_¦effe˜›Â@ ¼¼œˆˆ={öTTTìÛ·üKX@œ¸¶¶6Â#Â&B(‚'R¸®®. ‰áõz³²²±ºŸø8I†‘Ç“››K׫W¯‚‚Brе’åWn]—…=—BÃöwGºìn]¸é².ë²N².ÜtY—uY'Ynº¬Ëº¬“¬ 7]Öe]ÖIÖ…›.ë².ë$ëÂM—uY—u’ý?šbpPšIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/go-home.png0000644000175000017500000000463212412506713020522 0ustar sergiosergio‰PNG  IHDR00Wù‡sBIT|dˆ pHYs11·í(RtEXtSoftwarewww.inkscape.org›î< IDATxÚíYmPT×~î~Ý…]¾ÁEA±&ÍðD¥ŠÊWD­‚…*ÚNÉüê´±ÓîÒ?ÉLåG:ÓÖ„ü‹­Xê8N“S“4C¶¶ÁIìÄ´"Èç‚ØÝ»÷ž¾÷e]-¸ &éôÙyçœ{9çÜç9ç9ï¹»HB|“a ø¿€ÿYûîwÖR|#ì¯Ý甄pp,¤ˆÙÄ{¿·×)Ip€! I 4=ÓêüÚ ¨Ù[ãT~G÷Ín¤§g@Çøø8–ee IM­gÏ9¿¶ž¯yÞPŽ[]·ˆ|:V®ÈÑg]]]»?†ÌeºCÓ¹Ö‡EœxñÅn›Í6j·ÛGM&LC²Á(%ÿäÇ/g?1U5UN5 :znõÀn³û ò äÚÚZH¤ ¥¥.—k\QÛÒÌ¥,âü¹ó!ë 7 ‹Å ™Âb1KŠ?ži•&Ì*wW3ù^"ŸššŠÕ«Ÿ–wîÚAä€ååðú|¶/®_G_o–,]â¨Þ] ç/°ˆƒvcSá”—BGg׿q³ëÆ“ÉBåÕ•NEQ½=½X”±yykÑÐð},_ž…ä¤dŽÌ¥™¨¯oÀú è:}PTÕ¡÷Ú'~¿ïɦѕåL¾¿·m“ŸŸãÇŽaù²L"šˆ¤Äª“ˆ%8ÖØˆ¢-[È–ñÁþ¨$Bí‘áááhEÄn¡²òNM÷ÀÛ&/7O.¯ª‚_UqgdÓAd§I²Ó•+ƒ{`‹/vtRÆJKKÇÀ`?tø}~ްmg“v»‘A©rcAêê"!!7íã’˜„#d±› ïð†ÝÐ4 ƒéii!;õ ,Œ€’²2§Âq{h v»·¤¸ØÚÐÐ"’püøqîó‡–3ãÃî!I" صc;|~?F¾™EÛ¶ñëÁÝÛ·‘F¶ÙXXh­¨®Æ„χIzèlQZV† ¯×Övñ"HhUÙfÖ¯ÿ=°¹¤Ä "?z÷.Û†f/::€xæçŠúÃõ´ÑÑÚú'¸iU?%;¬ÊÉž?…[·y8îÑæLOM TV”›Ž9"+êë‘Hvj~ë- Q&úL,b^^% ŠŠ˜¼gìÒSRQRZ‚ºƒy¾ÔÖ†Ó§O³ˆÊJ¤&×G:ç,`Ãæ"¶Í}Ïgd ¢¢‡fò :SpéÒ%œzãg¡äÔ4q¥ý#第+ÜL„câþ},JKUêjkÍS¶Y8ðJ°ˆW^}Uéw™“iÕ%šþÑÞîŒZ@^A!¿ÏOP>þVzª*+q ®qqqx`íííøõ믣»¤”þ>Ñár9# ØJyÞëõ9îŽÂ&[ÆŽ9š¨g«ÕŠ'Ao°8yò屑1Obbr dYnºòèž ¡¨ªÙëÜ^Q!6}W¬ÈYÙsòg?“““â«í qêߊåÙY=ßy.W•” âç çlB,V „þ±‹¦=?hpäçoÂ:¿Jd¯ÈƉË.¼sù—²Õú «Åúx í«­-m=sæòo~÷šxnÍz¬Y³ÑàÖÕ ˆžp-{ÝnDƒk×:ðÙµOð£¾$UîÛWúçÖÖË=ÈtòøåÊj•週Ç,€'‰‚?\È-~Ñ€80L>Ê“˜_¬<”Bûñîk3?,gÓ¬*ÜÏõvŽâò…óˆ×G•¦]¬Ý^Ž59É<î ×Yt~Ü‚™PþÒÛ:æÂlXe+í ¹Ø¬»â6S2âŸÊ  ¯cB#Õ Œ“4!¸õå±×ï8 Ee¡ÜOhÀ@çUnC˜Ë¬H¤z,h!@À¤‚0\†ÚpZSU˜€Õ &b1‚a–µW"hÔûp_÷!~~Bm¤X-¤ûÞô Þ„S³Íu‹ÙÂm4²…Qd`—ÁD¨ÊÐL\ð=3õÓ[HïËcüýÝ7¡ )41_ö\å·ÜØ-de{@ÕÜîêÐïSL ƒDÊ`”x¶“‚H#ø|¶–Iï§i܇úòŸ¾×Ì„©]øøÜ†8D²Pä,d¤Áž)iÄòÍð*¼ÔLô/¿*Æ=OÐBšn¡âéiñHLX@‡LÂtŒz5¨l!‰ûP_^šŸˆI?àWÁäû]Íèük3·™s’ÊBì}ö©7ÀuºÇÁ³È?<ÎdAÜêHÝnüfèˆ3+\Žûe˜Œ! W€Ç%±àÉ1×…¤¹YÈð Á9 þ¯ßf!¶…DŸ jäK…g”Hu«ÁÉ`/qö!ƒP[õABä ðÆçk„e¡9mb ž° sýý79ŘÇÃmˆ‰Sa7‘ ×’ˆx#tLYØOÖ¹¡(0™5îC}yìw^ÙŠif!)¶,”»í0fÂSÙ¹`›w¬J…ª¯g-Ú¸`x7ëÔA–µ:ŸWap›»sÏB†Ð»PqÍ D‚Oµ—  PÈa`q, x%ænÁ·)"½ —زh iŠ€?\€†‡,ä£~ÝBF-Úqc9ÈøU‚—1 °-\ª†8OP¯ Ÿ\ hÈ x#¢wD–™KLY(º»»qùó4?} ê2õB£ö1ê]«Qv÷²³³ Á,4ûŸUöì©ø‹¼ÍnƒÝn‡ÂNuÙÊK÷3—“ã~¨³Åb¦ñâàóùà×ÃSéÿ¯{¿o9'-ÄhøŸB3À;9 }ÆÅÁƇ𽃲då $I «ë&b@ìÚÚÞßÿ sÁ³Ï>ƒœU+çç¿”A/¦îG˜áÓÔÅ4uÁv]0´Ð¯Ìý8gÄ3 1†,%½œn‡ ’-gº¡x´ŒTŸ®œŽëKɶ6¾IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/svg/0000755000175000017500000000000012412506713017253 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/icons/svg/close-window.svg0000644000175000017500000002267712412506713022424 0ustar sergiosergio image/svg+xml sleepyhead-0.9.8/sleepyhead/icons/svg/forward.svg0000644000175000017500000001734012412506713021445 0ustar sergiosergio image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Next go next right arrow pointer > sleepyhead-0.9.8/sleepyhead/icons/svg/emblem-marketing.svg0000644000175000017500000002434112412506713023220 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/icons/svg/moon.svg0000644000175000017500000001707112412506713020752 0ustar sergiosergio image/svg+xml Weather Clear (Night, 220) Frank Solensky weather clear night moon 220 sleepyhead-0.9.8/sleepyhead/icons/svg/gnome-dev-media-sdmmc.svg0000644000175000017500000002513312412506713024037 0ustar sergiosergio image/svg+xml sleepyhead-0.9.8/sleepyhead/icons/svg/back.svg0000644000175000017500000006742312412506713020710 0ustar sergiosergio image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Previous go previous left arrow pointer < sleepyhead-0.9.8/sleepyhead/icons/svg/media.svg0000644000175000017500000006540312412506713021063 0ustar sergiosergio image/svg+xml Jakub Steiner http://jimmac.musichall.cz Generic Flash Media flash memory removable photo Novell, Inc., Jakub Steiner sleepyhead-0.9.8/sleepyhead/icons/svg/edit-find.svg0000644000175000017500000001256712412506713021652 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/icons/svg/applications-viewers.svg0000644000175000017500000002533312412506713024152 0ustar sergiosergio sleepyhead-0.9.8/sleepyhead/icons/svg/preferences.svg0000644000175000017500000004642112412506713022304 0ustar sergiosergio image/svg+xml sleepyhead-0.9.8/sleepyhead/icons/svg/calendar.svg0000644000175000017500000004323012412506713021547 0ustar sergiosergio image/svg+xml Calendar Jakub Steiner http://jimmac.musichall.cz calendar date time cal sleepyhead-0.9.8/sleepyhead/icons/README.txt0000644000175000017500000000030512412506713020150 0ustar sergiosergioThese icons are pinched from my ubuntu box.. They need replacing.. Appologies to anyone if these are used in error, contact me and I will correct immediately.. jedimark(at)users.sourceforge.net sleepyhead-0.9.8/sleepyhead/icons/last.png0000644000175000017500000000060612412506713020127 0ustar sergiosergio‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDPT¢’=0 pHYs × ×B(›xtIMEÛ  2Bôp“IDATxÚí™A Ã0 mýÂÇöÿt/¥ôX(ÞD;«ÍŽåD"c„B¡+S°Çï?Ê|Û]¨ÂÝ]€UE€MI€EM€\‚BÀ$KPUV‚ò %¨ß8 Ž— J‚ë+€‘àü "$¸û»B#d•ð°Öz¼>õ %Lqç5„úkÍ÷Þ¸J CR DR T2 d·‡‡¨¤ç]lÑ•Ñ Xk=IáÓ}UÀüñt®þü¸ó胶“§Øîª­Îáá]0áPáÕpá•áU°á©Ó ´;­Îái,sIuO`H«søB!„B_^¥×E€ÿ›#JIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/oximeter.png0000644000175000017500000012264212412506713021025 0ustar sergiosergio‰PNG  IHDRÈÈ­X®žsRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEÛmš Ð IDATxÚìÝwt¦g}çÿ÷uÝíéE]šÑ¨LÑô>¶Çeìq7Æ`búB Í¡$@€$IHÝ_B_p $`ƒMÛx\Çã:½÷"z—ž~×ëÚ?äÍîž³gûûM6çõtŽôÜÒytt_ý uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuÿïDý-ø÷Ikõ?ü 5 õÿ ¯|Iÿó'h¡ÈW^¦_y¥ü_ýÿášZk´ÿí¦ ÄÂÕ…õ€ÔýßE€Ö! Рô+7­VH­ õ+é0_ù(ÑhÇS:YD̽uhÝèûѶ(DDȶ]ZgÂE`I!¢¤-µc–aÏ4Dܖ昅p§IP§W+ñÊï¢ Ó¬¤î_—¯\@`ü× „*°HC‚);ΚŠî,z^û\-L«¡š®º±ÑÉR®:ç¶ÎUj­ÓA”v«ØÕŠBi‹( ñ5( „ ,S`Z¦ é˜IÌÒ¤ES.A&£!'*ÍéT©!f7gS¥d̼` qÆ@?êœEI¡•Ò`ÛN= uÿrÜPcH@)t¤ÑZ`I¡‰aÄ«˜+æjþæ³£“¯Ù{v|ÅДè.» {v¬ÊäÄ(‘Ò¤“yìx¡[Âp'1E)bH#@šE|>6–¡‰DŠÐ³0„ ¡‡ABSNiRŽCCÚ¦)¯YÔ.YÒÞ@{Km©íÉøhÒ6Nÿÿ ôóUÛtê©û?Ø”R ¹("¤0*@&ÈDs®™,sËÅK£Wï:Wí>|r4W¼<Æ¢œC÷"MT½DñÂYŠÅ2ƒãeÆ*)š–^G÷Šíر8^00|Â($B#E´‰”)¡µBH!"HR „h¥ ñ1c’jÅ',Aà˜ÐhЖ·XÒf±ª7Cw{®Ü—O¶&ï ÕÆ×S"féz@êþS‘‚"<Òr¦¢Ãü¥Ùò¶“Cå·ì½0s÷ÞƒC¹áÉ­A…•yÖö¶’•óD¥~¼â%á»Tpn`’3g/3é5Yv;ËûÖ!ãyª‘“1b¿ÒÑF+$R,ôoT¤H i 1Ò–&ˆ%˜ñ|Ì$,îj`ik†¶d m "Rª¸ž«4Ù„é¯[’Xß‘?Ù*åßj¿¼ÏÓvÅê©ûß †Ò(­Ð L¡ÁÐT‰2ãµéô…Úúý''Ö¿trh뙋—»kµbny[œ­+:ؼØ@ûÓLÍ2=;‰Aœ04(‡BJÇPõ9wþG.QòÛh¶¾+Ñ™<– 0ü* %%B”¡%ZG¦©BcÚ6‰181EcsŒwÞ³‰«–9´X $`¡±¨h‰öBÎ{>/_šçÄÙaâ˜ì\ÝæoíÉîjK9 u:B`;v= uÿsQ¨ †D&«…FK¿öò¹‰î;<Ü}òÔˆ(ŒÎÒè8,_–gs_–å-UäâøµHaʆcv®H´ÅljAHÑwñ}SHbfD9yi„“ýÓÌTòtö^I¶sÉöåÄ“I¼š‡Vˆ‚‘"Ô ¥B+Š|,Û¡àäcÓ|â½7²½+‰®„†D[¡…!à§çL¾þÈ NŸeëâVë¦ÌÁõ}mtçâºS‘'1SN= u ?BH…!J(Q {`Ü¿úØù™ë^8uùõû ¶ŽT­(ç ®XÝÎúyÒŠòìeÆFÆðB“l*…ò=Æ''9uú4‡Â0m®ØºÞ¥+1Œµj0ð*" ]옠\«288Í…óCLTÓĺ·°xå•4-ZI҉㨀@B #C´ÒH¥Q†AQKÞ´³¿z%ª2p2é`ˆ­å?ÏÊ(-Ñ2$Œ41Ódï¤Ë8‹5V¥h(¿¹Õ,íØÔ0°câS‹SÖ3‘_þ‘F„•¶ìz@~…A)bÃ6µM£Åàö#ýÑ›_:5½xÿÉsÙ³çû)Œ×Hˆë–ä¸zmkºRH;bdf”¹ñ! ©He¨ú’ÑÁKì}ñ%λD¡XÄ0…Î|¨éìê`ÆÕ,êhÇ‹B"7Bû^ÑÐÔ€a[ÌVJ\:~œþ3—˜ôS¤:6ÑÒw™Ž•$r)lÛD Aͯ¨ÇŽÓO³uuŠ·ÝÒMwRöP¡‰ÖZk„!†@¡ÑJ¢tˆ=&•Ã'¿~é¡*]™$¥ sFDϋۯlᦕ-Úãæ£À¼eÒ41,³_‰`¸.Ò‘( s>’¯í/¼ëÀ™ùm‡N¥°/^"tËäS’m+šØ±i]yåN253Àìt‘˜"™°¨Ö*œ8w‘æâÙÓø®KÌÉ`Zq´€MÚ%ˆ’%½-,_ÝN¾9®*Ú-¢\.337Ik[ ¹xŒÓû2<1Í™)&«§£ÆÞiY´Œ–Eí('‰¯@˜6B(âF•5½Yn½¢“õíYKC ´*@«!,P l›wøØ}qiK•QV’šÈP(•± Xµ$ÍíW4V¶®YôÓ|Üû~pÉ4Ó¦‰¢_Fn¨q ÉXQuŸ*ýÁ Ç&ßvàø¥Ô…þ£CC˜á<Ë¥¸rm[ÖµÓ˜š§:Wdzr‚²ë!Ó)bV†êT•ãGppÿ>Î\Di—˜“Ã2â–…4žÂ´,üJ˜#fÅXµ¶“®î$×]w c£CŒMŽ‘M§qœ4ý—ú±U…Hù MLr±™ÒbÌÆZ»–Ò°d5 ½ÄóM¸ ¡…é)òiŪeM¬ëÉÐ×£%‘¤!#fIT¤qý× xîÈ4ß{vœZ-Â&"ô°eÒ¤XÔˆ\Âcëº47m_tní’–÷›žx­ˆ'%Rõ€üÒÌcD!HT•#c^þ¥ ¥«Oþóg'¯¸<ÜoON“ÀdýÒv®ßÚÅÚ¥yl*ÌÏÏ03[À¯ù$’)ìdŒþ¡>ÀáƒGEh°,iƒPiL„ˆ„–§XQä³>·Ýá²~ý8…9ƒï>ÐÀäHñ\%=¶lé!™4(ÊLOñ#…-Àó=b‰45/`fð"cSóLTì¦>;7oî Ý×K[S'¶‘¥X,Rñ˘– ž´É$ã¤ã©˜$á˜ØaÄ\ ˜-•(ÎÅI¸#ÔÂX&QXˆBÚmQ5$2 YÜdq͆üù›¶·þÇö¤ýõ°¦He3õ€ü»†.’b܇£ýµü£ƒ«žx÷ù‹ÃÛ‹ãÃ=QuÖnHÁúU½ìذ’¾®8ª:ÆØÐ•ÐCq§W*F†/°Ï >y”™r*&¤h%PÂJ†IJU“|VÁü|wün‚¥ùA®¿£…#G&˜/[$R½üͧªËq¢¨„$ gÙÚ·aX>nP!IÄSÔŠ‚ò|@2àGeFÇg/àûIÒù.Ô¢>[—±¨w3 K¨™År‘ ¨±B(°LÀ0 bf„XÊEkB,,pÔ#Ô(@Lc‡À'帬YÑVÞ¹£û[k;bßHÔáxS¢ŸÁ‰ÎàœŸ{ùüü]/™ºòÀáó;FGÛÔÌTÊ K²³#ËU›–²iM7͹8ÕÚ%&†û¡f“L´¡E)˜äô‰aö>¿“§÷S.z@ °@V±mIè.BQAŠ,–vxûïösãí!S)t°éÚÚ4ìzØ¡mE‚|·ÌÄ¥V¤ ÅJ“,¡ ÂÈ4š´·IÒi…°@ÅÙí­K°í4Õj‘lÖarb‚sgú™+¸U3ÙA¼m5=hê]F¾­(ÔÔŠ%¤¡Z ´Œ0% !ô#iÚ˜"ze0(¥Â"‘‘ K"uH¶Á(½öæW/MýYC"ùíz@þ]£J!Š-¿4XºçÅóÅwí9;Û2pâdzfxˆòÌV2Áö¾×m\B__qÃ¥0;ÈÔø0ʑɧÑ*`fÖçÐÉý8ø4§N_$*Y€&7ر=F®©Âé iŽR¬ÜæÐÛcspŦõ÷~hÓ ÐJ²þŠ4ïxƒKkïRæ*>=âÓÒÔFP °ƒå#@X©¤ƒ¡%^EQ gpÒy²5]`ÕúXžÃÜt‘Ù WlÛÆþƒ{¸tUó™)SV)Œì ò­+Èu­£yÕš)Vª”ç‹!håáX&¶eù(°,¥C¢WVÿJ!báV”† #D¤‰™šTJ` ‡Š;ÇÞ´¢tãŠÔí­Nã‹õ€ü鈙Z´êøeïÏŸ?9~õÞãÃéþK—“s“ÃTæ‹t7d¸~c×mèdQO†€€Ñ‘! ³Ó¤ã1RÉx)ÇÏðÒ¾gÙ¿ÿ$—/z! †ÅëîÎñ¾{§ˆ’sšknµøÆ·’üü§5ÞóG%®Ù(9{(NàtvØT]É…©€?ÿƒ<³Si»'¶/œÃ2kàfñ| 2N‘±˜ö¦°¢Mñ¦X^ÐÛÖ†‰¤ZõÒäìÙ³¾#,ü¨F©ZfjÖE2¿ÑºŽŽ¥½t¬^Kº¡•J5À/áU«˜†…c9~ˆaê…Ñ-±°¡DŠ…æ–a8h:T˜¦&ŠZL$…@ñ×õí~ÍúÆõ€ü[•Òãå0~àÂô^80òž£'KË.23wޏ,²¢¥›¯Xɵëºinˆ1_,20:HͯâÄÒd2 ø~À™SgØÿâ³¼´wÓ“ó,ìÝpXµT²c§¦Ô¸ãv›»ï 9ò²ÅO¾áò±?N [ŸøˆÍ™¯{­ËÒ&vÌäàs÷Ù ÙÖ%ÌÌÙX¡Â6bÅ•ØYjàPñZÈmXÆê+V ƒ¡ÓƒŒ'œ¢©Å!Ÿ°˜>¶æÉwÆÈç}bVˆçKE;…”Z,¢tR¹Hy®Äl1"²[q²­ÄÛWбê :—­ÇLå)—«TKeÂ0DbbY¦1¤\è‹(…e[(¥ ¢ˆ˜“$ 4Z‡ 4i«Ds¾ÁB ˘áoìÛyûªæÝõ€ü› †ÇÐt˜zòèÔo½p|öÚ3çËw^<™t˃49.W.]ÊΫ·°by»Œ[etlœ’/hLæHÆbÌ ;y‚§ŸÞÃá#‡©VÊ€eI6m†;ïðÙqá¤ãUâÙ$O¿ѽÌâ–[+ sxr‹ÙdnÌrxo…£û|††’;",$!ááÄ¢‚ÄŒ1³Í”Ë›¸òƒobÍ{{˜œšG«W® 2WàÅÏ>ÅùâÔ>ŽïH)ˆiiš(¥‚Ó´0……ކ%† $ÀöeˆjL1T–ô´ÊÝß~ÿÖõ€üPòª}g&Ý·ì:6¶cïÉ™ôàÅ™ÅãýÃi¯<‘ìîHsÍæ.®ßÚ˲Ž,‘7ÏÌÌ ¥ù?¨’K¤œ#c3<÷ò>v?û0ç/^" 4H–D*“˜üá§á>!9¹?Á‡> ùÀ'*Üú›¿øxÈWï«ñ®w8üö{àò\Š÷¿£@9Hâ$"úOÇÑ¡…óÁhÃ'(ÜZ‚ ¿”x6Mud¬ålû܇¸ë=W³ÿ‡Ã<üÙŸÑÕ–àæO¾ŠÌ¦&öŒðÒgcöP?–®Ñ·pkejªL¦e‚|Cj¼Ð¥F$R’޶.Ò­L^À´"Še™©9¦§ T«–a ›ÖYz%m+·‘í\†e˜¸Åiªe%$¦C* p‘:D&¦i!¦‰FúMŽ •ˆ¨‡‰ù"×^µlç_¾¦ww= ÿ—LxÁÎÇ?óìáê5‡Ïq±˜ÉѺÆêîfn¼¢“+·¬#—x…1J³£ÔBmÙć0Ò\:?Âó{òܾǸ 8"b ÚÀURh”›'m{Üv[Äû>çêëjŒÎD|ôwsìzÜÄ׿ ›®˜¦kM†‹33aS ¨xÛÖ8ašyOà‡šX®™ÄkîäÊ{n%–uxéËßdüO`u­fûïßÍ ¿yÅxâoçì® ¬»c5×~òzŒX‚sÿt‚#_xžùË—én² *µ,1N¦Á Óª(ÍŒ“m1XÜÛËĤK¹\CãÒ˜Ë"¤Éñc'qk!¾çQõÕˆÙØKãŠ+X²j+­í^JÕÅ ¦8,̼‡F ÃDZ!¥Dš:‚¬¡IJϲ)G‚(ôvïúÓ;ëùWÖ_¬Ý|èbõOž?4sÍÞ£c \¦4;A“W¯YÄMÛW°~U+ 9Ëü|©ÉqLi‘JÄF–BIqôø>žyþ)öï}‰Ù™9ÀÂŒi¤4Ð5›@—$`ƒ(ƒbÑDÖèl.ó‘ÇxãoØ9lðñ߯qô¢‰ce ÊXL,åa™f˜§Ú`¦¡¡‹Þ7ÝÃ’_ÛF"0ïŸcÍÍ]xå yç_1óüËÊ‘¿õ*îøý·°jk§ŸáùÏíbj´È²{¯âõ¿qSÏœã¿õOt  PªLX¡‚&hðÙvó2•sLÙK&Ý ä›ÓTÆ'è¢VvÑH„4¼*žàFqj²™ø¢µt¯Þ΢¾uÄ39*ž¢\ªàÇ4pCH!R‚V(e‘мYÁ—1T2ÇÜü,·lÊîüø7í®ä_Á™éÊ]{ûK°wßÔ5/ãÒС ØÔ4ÂÍÛVsí–Íô¶§1¢cƒÌ–æ†M&Ûˆ!m†G'9´o?Ï<½‹ýöE 'Ž$“ lGQ˜sQZ`“ o˦킡‹qì¯Pu”21ì€Ð]XÅzãM!÷¼5η¿pð€D&|0HB”›BŠ,5¿,Rh’K7pÇÇ~‡¹‰Ž~å!¦§ËlùÓßææ?¸•þ“ƒ<ýî¿a~ÿ‹H’è\’ ïz=7|ðí44ÇØóãË™vܸ‘É'øÇw~‹l¥„'6Ay|„ŽlȦÍK¸ýêelìÎÑjK¦æ]†&'ˆ„O2k‘I5R™78rpO<ù(û<Çðð8¶c‚Ja›ýw.oz[‚þVÄȤæ7ïUÜñz›þs5þásq¾÷@™£' ÷›ì~.ÍÃOØû²B¢Q¦…-†p‰¤… –Êbª45ÙÅÖ|œÍÚÆàdd†k¯YrkKO‹¦»U2[˜£¿ÿ žWÅ05µ \Ø¡˜R/ŒTEVÍ hÊ2…È÷гñFV]u3¢¹ƒr©Š[˜ÇV–acXqTeæÏ‘oî$ˆ/¡¦L AÀÝW‹Ý½ã_vDËøU FÉóŒ;ßùÁ·íùÑoëg'î}ü™ÁÖ¡³—èIù¼ýŽÕ¼÷?\Å];ûèl‚Zaž‘¡9Ê¡K¶Á¡1ßHµP`×£?â«_ú~ÿ[>rˆb± ĶºF k©TPeI»fóµÉŒÉ~ñõo„<»+ÃmWÕ¸áIY¥˜õC„vx~O…£']ªn ËΠÈ Ò„˜DJa m„è(Š'ÙøÖ4ïìcòùAâ?sùçûè»q7¼u;ùÍ«˜+j&Ž ¢*qÃaüÅ ~Œ•w.eãÛn¤0ì2¾ÿ8±„ƒé881›¬¹°d½TŸ­Rv-üD+™MXvÇr~íÛyÕµÝ<¿ç0÷ýåý<úùǘ>tQ£47Ea¦Ìšu«0Ì€Ás˜6E”Öa„ aØfËQ$íy‚â(S—/0~ù¹ŽNºV­cjv‚ V*ƒjÊ£§d‰T¦ ¥³(Ó­¹tæjÝ_ÿÂGŸúâg¿2ø/uߘ¿ìÁ®ỖƒµwüùCC¿ÿò¡ñ¥.ŽU¶w§xõ=;¸zm©”C5¨QÅu ¨2MÍ %ƒ#ùÅÃ÷óÔã/pþâQ".<1Ì­‹ÒH§B­èS©,t*sM£Õ8|SñêWÃþcÿ÷ßû§*ç.*îØ ®ñ÷¹ÄHà²Ð_± ƒwðCiXh„/0#C¢j‘§ÿþ~ŠF‚ÞÛ¯bÉ>ÉKŸÿ óš¯pë[®æ7?} ·ÿðCüèþ­<þù©:C6ìúÌ×ð†Ùºó ‚É1l3NÆpýi`ž+–"¹ª‹ž«6Ñ»}½l¼¢•l ο|–¿þØßpæÉ¸sUšév‰mÚ"”tyîÅG1ŒL&ƒï‡T«UlÛF)…aaPE 5äÒJO1wñaNü¸F*›D&2h#“'ÏSœ½DsG'†•¡¢iãûž'~x¾ÞÄúÿh Tuö_šýíÇ÷pÿ‘±ž©1—fGpÃú47\¹‚-}9l] Tž¢Z ‰°"Ò¹,7äÈá“ìÚõ0O>±‡ÉÉ‘…Ç­ˆƒ€Wß(xë½>Ín-α%úÉ96Ý ùÒ×$Çž°Èä4ÊŒ1p¸ÆÒm~:àØ>ßÿG‹óã12o£yÕfÚúº2`fp’é‹g™Ú¿ ÊU–C•ñ…iÅ1Â2rˆt ßNAS¹{ÞÀ5ï5×öå)=q†~ò¸*Á=ŸÜÆÎ»6sâÐñ¦SÅ4L0„Tpª5¤“¤â$Y´| ©eK‰–$hZ·ˆ »émK“mNç÷œâñ¿ÿ)§>NÊwÈgç0,…i††”Ëö©ùÃÌæÀפSM|ðC¿Ã7¿õuúÈçóDQ´’@aHsá_ƒŽˆ.•ŠÏ¤¿ŒÞ{>Hç7÷ ¨ñQ¦ö¢Õ=+wbd:)D â&º,عÒçõÛó‡LmoYÞÛ]ÈÿŽÁ/¶ÿôð½?8:ýá£'&»Ü—®&“ë¯ÌqˬiËÖ*ÌÏÌ0WöPv†LÒ&.|¦ EžáE~äQ^zi•J˜¶Ä~ðþßkà/ÿØåg?ñx䡞î:z D1ƒÙ‘$k—hË&É/¯ñý]þI"‰AHŒzï¾—;ÿâ·‚©Yf(cb95Ü^bÿ—¿ÁÜÁ}XT©%° Ì0ŽT˜˜VžX¢+ê ¼|3?üÞñÖe¬2à¡oã9×å=ïÜJ¼\ãïúF_zŽtÜE9”má‚m¿ývÚw¬£ÚÖ‚lIÓd›ä“6Áˆ<&ãù¯?ÌÉŸïÁ™Ÿ§µ9Eh†T–]!•÷pâ>só”æçˆIË1Èeó4ä[¨–#ÖmXM*cïÞ}œ;wÇqˆ¢SøDZ#Ìžr¨¸5¤ÕÆ¢uo¦{ûÄRiôôY¦Ï¦X½Ì¢eËi]¼ƒ26®ŒÀ4 ç‹Ü}¥Í«6äÉ(¾eÙŠžzëåÄLÑ~úðÔÛ?pß‘>6±´Á-]1n¹£‹›:hÈ”jó Og`Š ­mq”qþž}z<ò0'OÇ÷}¤vÜ& -4U?…Ö6©|ŒùB˜msõ-N*Ž2X»Ææ½\á¹Ý6ü ÂmÏ<‘‘ÂnrQ%DÔ‹Ñy+W~ümKâ¼ôù]ìý‹/‚_!ëlþÓ{i~õM,îŸfbÿ~ âH¥PA•Ð( „:²ÈÇýsóÓ4æQJE !$¾6°-Å\aßì yý gë­4vuƒoSºxŒJÿ k#4-YLKû*"‘à \LÇCD6‚*Í b"2|Ïo¦ëù³× IDATŸ859—yäàôï}ä?ïÅ3[²q“;oXËë77±¾7C*áS˜ždbHà# …I<žÄ”&‡Žîçç?_<ö£#Sÿ|Mi 3»¾Š4+W9X¶à¯ÿh„ú‚ú ›®4˜92OuΤe§Åd9àÇÏ–ùê× ¾ú5›¤ÝŠmHü‰!À!¤B&7Ï„[e,H"¯ZÎò7¿b sÃj|Ûb¦àÒüêëÙÐòeœù NÍãØO¾GáøÓ´ÑBáV*øÚ¤c‰ÕÊ2™az÷Ãüü±ˆ+2JÕÈ%³ØFYÌ„@:jSS¬ŽÕû3?2ôô1žþÆ÷|òYÌêŽÈ‘Íäñ£y´é\ŽXÌDEƒÌÏÍx*T„~Ä·]Ã_×Ã?|ó+<úø£lÚ²…â|‰•kÖòÍo~×?IKS#¦TXQ@©,™¨¤1{obãu¯§wéUèH0sù<³#'ð¦O¹òíËhëÜBd6R“>®pI ]h±Kt·® T^›!ü«ŸÕ›XÿãCÅܳ/èÙóÞûO Î7µ:ðº«Ú¸uc#1„Œ˜+”¨ºahÏ'•HqâÔ þú¯þŠ£ÇŽS­ÖH%“øG­æbÛ6©TÏ( lß™"ß,Y´Ä&—Êð“ïÓÖ­1"‡;_ã³mkŽêœËä€Ë¿ìsàtŽ|Ï-,Ùr‰¥‹Èv”f&Úw”©—§6;CËÆÛY{ï[h½y®“Ãð- K06=K|vj5*±í[–Z0uü"#ÿcúü†Çš(A5¢q°Û±Â"ÔQTD‡¡gr$Ú;È­\Ñ™åÆ{®dç-«ñf«<¶ë{üãO=‹ªM“²!´"Ð ÇbÑâ& AÍ›§Z+àת„aD.—¥­½|C·ìR.TX¿uóÅ"ϽôÕR‘BÁ%•pHY!: (»šB ì¦ÕôE[îŠeq‡ÎR<ŒÊ\?®#’m^Ië¢ëˆg:)F.ž! “”´˜¾4ÄÍë#Þóæ˜®d“ò×»–¯ûQý œ˜Ï?vhä>úŸö½w´`eTqÏMÜûÚšrŠÀ¦ ¸J!$Ø–$Š""?Âó4r¹<Ý=½œ9{Žöö6ÚÚÛ™šœb~~žDba[gØVœtSÀõ·åØûì4~5àõïHÒÔêqáh ŸÿãDa•r¹J±,pº^ËÚ¿ÖÛ®fùµ)j&Ì¡*:Þê±x÷휽ï>&>Ë‹>A~ÙZæ1zßò:úî¾ G NþÙß1üü3Ä}4Þx+?ô:Ò«:Yýñ÷Q<ÃôîaÄlЙe$.¦'ôLj¯Ôv ²$–µÒºi×l%Þµˆ®+ÑÞl!§]þÊ#"Ì÷Ñ{ÃkéÞ~ édšâÈ c§qgFñJ#„æ©\‹V“lêCÅ›(IE$lËÁÒå±K¤Íy6®»Û0 /)\áW~˜÷øÅùÖ'Žôâ÷½ð[£ÅD+…a‡ˆù \±¤™Žf“‰þ ”d¶“ÁŽJø~@-ë)…i¸µÉd’O}êSÜxã|ûÛßæÌéÓär9²Ù,Õjua)¶ÖÄâ6/=YåÀîIæç<ÖmªHurß_úh9ÂìœÎÒ¸þuÜô¹?"¶©—J¹È㟹‘Ÿfùn¥ùîۘϤ°o¾žëÖoàìræ[ßbüÄ>4¼Wߊ4†òYôª;†O•>5Ī …XÚ@6§Ð"ßBË$à¡#AE§V†ÔÒe4-_Žl[C®§••×÷’[”¤³5F&fÑa˜'ÿa7ÇÚÇü©“˜¸$™²qÃ95º{ZijÊ"D™ñÉs¡q‹É©)º»º¹í–»¨Õªœ=s†û￟uk×Ru]j~·<͹“cØÉéf‡°Vd¦^bí7ÜIß7“kídvj„ñã/M^D—FÃâé4¹ŽëÉ·ôadS‘q< ñIÙI))âÍ °iÃÖô¶ú5„”Ã:ü+;Ì» ”î¹3Üstîw‡kv3ÂŒÙ7BxŠRÍcm·Áûß°‚ ˲øón!"°B"BÂ`á´r­5AEA ”"‹Q,ùéOʃ>H¤Ói<Ï#Š"\¿ŠŒš)•g1ì"QB¸~(¤L#“ai1ÞüWlþâ86>C2d÷å¹Ï|ùá³´_µÞ}½¬E@&Ù@éì!ú?÷]fŸ=Ble7¯ú«ßAlíã‚eÑU ðF*¸‰4©.¥.þh7'þèÄçûñdˆÔ`‘ÅË,bå›ßDnǵKˆµæh°|’6¡h´Lª“¼ü£'ØûQ;=@\8¶AU‚oÔ0-Ÿ\6IgKIKPšF —x2Îøè8žçsï½ï%ÎP©V9qü8ù†*å2ýâQ0L|Ï%ik’ñ¥P0UªÌкêV]ûv²ë™Ÿebà(ŒŸÅ/N¢ƒ2ñT‚l{3ÙŽ•8éx¦65–£‰+™¸D07ÌÚž,7^³ŽW]¿†ZyŽÙ¹â¥ Ö/ý•›IáÌ袮mïøÛzôÒ·w_,ßTPfܱM 3ŽŒ ´Z¨¬³ ƽ»OLÔÖôæH&Š•*a¤‘B ùoá‚( Š®[Ã0 6oÞÂúõëâìÙ³(µ0yê*a(0bE<ß'ôÓHL +B E„ ÐsãƒäÍ]ÛV1ˆ÷¶²ì5wàG&Ã#$—tѽ©ßt± ›x×bZnÜŽNf˜Üó"'ø!z¶LmdŽ 0…gùÌŒ]¦ðÂFú!—îû*bþ2Z„ ,”lÄÖid¦•­ïz;·meÎõitBºÓ iSgï·ágŸþ ç¿û(ÆÔ$N:Bf*”E( YÜÚÀÊžv76ÕJÌÎSªÑ:¢§«—õë· •Ê&R’S§ŽÒÔÔÈÁƒ8pà ™\× Éå0"Ÿ¹ÙsÕm]×°æîßcõ o&¦c ÛK±ÿE©ˆR?Ò È,ê¢yå$;¯"Œ/¡lE¶&´#lSW&Á|ñþ3óc,ïH°um˺ÑÝ–¦RšÅ Ô®ûîûêež ]úøÑò§=ó¦é‚¶e"ƒ™Haø5¤°QÚ@H½P’, QFŠŠ ¶;ÁÆ%¿yÏ®î5›a¶âb8?h ?$R©/òÐÚ' C‰4að“Ÿü„x€ññq옉!,‚0X8O÷•²fZ‚iJD* m%ƲÚè¾ëÍ\õ‘wQhÏR‹[4g-¦æ5N\{ OgÓkvÂÖ6ªZ¢páK_d챇€4VÆ@Ûš°BÕæ‘F„E3Q° ­™¨—BÑ÷î÷ðú?ÿ „8fŒâñ öþøN?ò Á…ÓØHÌX‹¨¹U"íÑÖÖFOgÙ”Åøh?ssóHCʤñ|U}+¹|y) n»õ6ŽŸ8ÉÜì4KZ²<ýü `Û Í½È$îDTŠ”*1’í›XvÍiÛt+–/˜8w‚ÊÄÂò5w,x~#¹Å+H´uØ9„ˆjEÍöH[I’ÊÆ›f~t ¯x‘´]cqs}]m,ïn¤oy+«—¶1ty€ TÙ°aýgéò³—?~àò§zs­j[¦c’Ìdðƒ Ô gÎê!j°!X(@©PRDS üéaZâp÷-kyÝ­]Ä£ /Žà̸ å2A¡DZ…EµZò,‰gΜá;ßù»w?‹Ö ˲ ‚ù_ç ¤K$%¯@D ‡6+#~Œìòm,íí°xQΧ%•DMDœûÅ/¸üäp2};XõåÓœnÂnKÓþ0§ßô¢Â ^¨b ƒÈ°0D­@>Jk/z¥3¾œìæWñê/¼›å×vrð©“œøáŒÿâ)jg°)‘HÚTe„ïUAhZZZéZÒE:™¤V«02|‰ÆlŠ–¶6&'&˜›çŠmÛxãß„R_úÒ—ˆ¢ˆžžn^~ù%&F'É6·Q }2 5;ÎìœOÔ¼ž–+^Ųë^O6žfæÄ)ÊÃ').â£hRùE´.YOªm"–¥&-\%ÐQ€iHÉ ºæRfvä,q£J>­YÜÞ@Kn1Í™4½‹S¬[»ˆ%mM\ºp)厵k×>÷KŸ?w¾ï™—Ç>sà|åži“±h´i*Ri/œ «Â¯TV):D!¨*…iX¤ ›Âô,•Z™«V¤yïÝkÙ°Ôæò¥A %ez˜†çèH.¨©–1-‰ëyøžG6›¥V«ñÌ3Ïðûïgrbô˜¨HáHÀ0ð‚*¦´° ‰„(™$†(jH; –Œ ÝF¬æ6Ú–63sù"fßuô}æ]4µ¤hI;~èÇû½ßÇï9ç9ÏyÎÌ;>ÁÁ“wÑ^m²ùÚ%²öUlo“¬"‚•¡öÝFið þÀ±Sä6Á ,2*hp­]¶çgÙm.à‰Œ¡R@c¸B­ìáŒ#%ü ¤V¨š£‡x𻪳²²Âòòòï]¼xñ~"²ÜŒïüô—_ýöÕëïnÙ:å¡QdÚ%#Cû‚ÜY|"<ça…C›…C8‡”å{WÌŽ|¥¹í©–VçH óasóçÜøúŸá–_@B lF–倣TU:r€Ó‡F°»Û©"imÆH ŸüäÏâœcei‰j½Î·¿û]ÊQDcp€Ååe®^Ÿ¥\.ãKpΤší”F˜xÇ?æøíw‘X›}…ÞÜ+xé:i²o%“Ó‡)M'§4x˜ÔB,;‘ ˆDD7é²½°H¼¼@˜vi H†‡ ½¨p”‰¤Ü·LRy—é©A>ôþ»80>ˆB³²¼ÎÚúÆ/_¼xá·ßÒÙlí>ð™'×ÿÙÿõص·¯¬ì”'ýPy´u·÷kô½@`é¿/À!pXéaœ@XC(mÿ½$U-†ø^€ò-Öô”…Î5VI?¤ÝËèí4¹sFñóï?Åt-ãµ+ÏÓŒ-¢TC›]Lž ´@ä’ÜjœpdYF’$DaˆPŠ—Ú]®Œ¤yò.ºªLÃtÙ?2ÌÂwŸáÅ_ûØøþ×Ò+á„ÀéJJ”dÚဋCd•³ýgÿœÑ_ , žLˆrh¨)=åØ~úóÿö ¼úÏb7/ >K…Ës¬ë…>SÓS9|R9bkkÏóÙÜÜÂÍ}÷ÝKžk^|ñxà§lðío›ÿôÏðÍo|Ïæ3Ôê8å”k“`â»»]ÚÁÃ>ÎÁ»?LT®±3{îì+ˆö&Û -JCƒ M_¤2~ ¢2FP®›”Äœ€rT&ÊÛ Ët_{£w#Áðpr¹B $¡Éq”p""}´4”äg4x߃ïáð¾Öh¤Ð\»zƒ,Íï¸õܹ§ß’1Îø«WVþÕýÅs¼¼˜b¼ "¬’jÍ3§¼›¾_øÑmŠ ´¾é1B „Ã9Y¤VR Uq³ ø>a¹†"`umÜfÌìŸD¤9Yž#=¢ØþíœAIGws—0nò³æ´–_aþúR”)—kô’™îà\€µR«IÓ œ%tš¥]Ëå¡I–Ξ#kìÇOûG"J½ßûÃõ?ûCÜÎfáù„%Ãb ¤‡/wÀ ’y'¸åŸüSŽüìý˜öeYCŒ…  ûüËÌ~î+\ÿìgI‹™÷RèƒtÄyZàyeff¦9|ø•jÄîn“Ngôº]>ö±áœãSŸúo{ÛÛ8vì8ßøÆ×1Æð‹¿ø‹t;-~çýmº=‡¢$y§ÅæV› W£vê>Ž¿óã Ÿ µ²M{ñqº­E’ÝE„K¨Ö#F'OSŸºˆ¬VɃ*™PQ„K%žô2§³±Âæü º› ‡ŽÆ`™2Aà!‡ +8Gä{½‹±î¿û4~ß= Ö‹”Ð+š’W¯]K£~îÖ[³¿K€ü4 ­Ó•?{rþ·þ»ß{ê}ËÙ`08µŸÁ!HtŽçy8žBÈ ÉÜleQg À“ Oöwˆ"ð *eê^¥Mn\¹ÎöÊ:º cM©–}ò<+ö+Ê¢BªL…Ã<õâ«,¯¶¸õØQŽM²±µN{g£0%rc0:+‡„c,N;ê%Ëäö¥MÚJ²4Qc)†F£Á¹ÝËÂvæ÷¾‚RÏàDÈÒCZ…ô% aŸÆðqnyèv¢É*aµLòâe^üÍßåéÿñ¿gõ_@í.Rò5³XkȲ !Cì?À¹sg8|ø Öjš;Û›†!JzT**• oûÛ™œœäñǧÝÞåmo{O=õŸûóÏÒîÂöFŒÊ»(bÖ›ë,îî’MÝÉ©‰Óïüyâ¬Î OÓ™}µù<ñîkehLaêØ½Ô§î&­Ì Ã =™qéS“eòæk×_esöeDw©†Ï¾ÑAªeŸÐa,ž•8âÂ)rºíE&†}ä>~àn«>Fk”œ"í¦lno=wþüùßù»Î€þÖ#ˆs†Ï}oî×þÉÿô­ÿTœªT&¡Ê¬ â|Iž²ŽÆ¦Ž$m#½bõpže)ñ=Ÿ\kDaTD8SÔʧT.R—Íím„õØ^ß@›Œ#G0Po°¼¼F’ïÒ$,‡E4’Ï÷pR¢…À Ÿ ·¤[]²5>tÿ4çO°1÷‹¯­áyc(Õ!I;ÎY¬Õh-Èu„-„hÓÁ'ß‘¼V™fíÖ;imµ˜ûæ×ØþÚ—®>‰ RbOQ¢‚1aÁÐuzbŒò»?Ä'ýQÝ_bþ±ç¸ôrõ[ß$ß¼Ž$#P`•Á9C®Ÿ±É)N?ÍÈpDž÷Ømíblޱ­s6V×øä'?ÉG?úQ~öŸ ÓéðÈ#püø ¾üå/ñꫯ211A{·CÇdT*!b§ÅòVJ6x û/>ÌðÝ÷cSI÷Ò"ÙòDz‰¸3‹ í?ÄÀÁ³xÇÀ?Œ(×èÉ6i–S*yD@ÞKi/½Fsi›ì2ZªûT+>J•K¹ì#DgðèÚ‘Ÿqǹƒ<øÀÞ‡5i‘)H§Ê ØÞlrcîÆÿrñŽ‹ÿÉ[ ÎYž~eñžÿì×¾ú{³í‘ãÕÆ¾Ùapd€òèaI„O{t·{ÄÆ`¬ÃZÓŸY– d±KBö"Rz8“*›ë›l¯m“õRò0 ÿ}žÿý?dñ«_£Ý~DÒ5Ø,á3:r€3§Ï26>@–¶H²˜$I ü€n·ËÀ@ééiumR‚( ½DãÒG¦ËüÔýwðö»n¡Lj@J”'qN`EùŠ¥µUV—~þŽ‹ÿ÷· @Œ±l÷ ÿø×>ó›_rãüÁéºES—!©§Gª H!zÏJ6Û†v·Kž$(åá¬$K5ÂýRÐ’BJpÏ“tw:,ÜX PÇŽÃ÷}–×étZd¹ÁjA©\gbü0©I¹rãUF&œ:sëRÒÊKŸÿS¬ÞÆóCv0¹E(›¥` Ãcãœ={Ž©ñ¶sgw¡2r IªÙÚÚäÔÉüý¿ÿqíÚ5Õ*óó |ñË_atl ¥$³³70Z"…¥T Éòœ­ 6vCgÞÃÌ}Ÿ$¯LÓÝš#^y‰hm ’eR·ˆ,GÔ§ngxß‚Ê^e˜ŽP*ŒêâÒœR^¢½½ÎæÜ,Ys‰ª—2Ј¨W«”T ß ¾‡ð=œ-ƒÕ¾!înQ*ù¼íö“|ðÛ˜šl`­ÆáÎ+pªZs8 0;{¸Û½åöó·½ü–ˆN *|ê/_þ/ÿ«ÿù»¿\¢)mBŒ°8¬òQ¾G¹Pô© †ŒŒ àEuº6»»ÛôvLî¡dˆEÎ! R‰¾©h A’ç…+ð|ÒX£(<¶6¶X[Ü&×)ûìctrY†ÈP¹Gâ;RiQÖQU!yÜBû W&íÅäK×¹p`ˆŸ¹oŒxw—_zŽ4Î)…åB»•öÐZañÉ“M¦%r"Ï畼ôêÓøÑÅ‹TNah‚V̯}ƒKÿö3<÷Å/A¶B(´Xåã¹¢Y šÆÐ0ÇOçàþ}`3â$%ÍR|? ‰SŒÉ¸ÿï Ç|é‹_äCþ/ÜÎcßü:GŽçsñ%._¹D%ð —C 5kÙÚØf¡íáÍœeß]aäàº[»lܸ íkˆÞ \o_*ã“ÔgÎ`ÆNãjû¬)Ò9“†ez[-:+³t7ç ’m†µ¶â#ÂÏÒGè ‰A–ªX£1q“£†øÀƒwq÷m'PŒ)ú.âæÉtýìÄä:çÚÕ«mçÜà-gÏÚÿß$è¹4 IDAT×9ʸR3îýÿè_<úõûnjxhDô‡PÅ2yßUÂÇQ”#†Æ™œ¥1\#ô=ÖV×Y_kÑÙMP.ÄZ‹s¤ÃS c-H’ml±ÿÎAîY@RõÊ´Ö7¹öòt–1qb’ƒ3û)…!¥R g-W._as³ÃÅ».b=Aš$(¥ÀaÉÑ.À÷#0šíõu*¹æÃ÷NqÏÃ¥§¾ÍÕ¥eD­JI·›ŠL§Eú$i¦ñLŠÕ.,“º}úò{o' Bäw^áéßù=žÿæA7 ƒ* Ag8 ³(ÑæôÉ>rœ£ÕÚÂjCžg£i6›LMMóÿá/òØc1ØdttŒ?üÔÿIšæŒ>ÆììuºÍ&õJˆ¯JùH%1&ÅË:ÔÊpß}gxï;ïd|°Œ6RxEX€s¯Ã‡("¥¤×ëqõêÕo?þ?ŽþÝßx`ÊYðãßfág_¼²¹¯^?*òÔ€qHR›¡rÖa­CkG¬-i®h§¦ÒaLïãð‘ƒLî›âò+³l.·‹.yÿ±ýé@¡Öš~ÚJ¤,hÜn¯ÃÂò‰QNžžðPR‚,†nº~û>¢ïþmŒ¡ªB¬±,.Î1sð ‡Cx’ÝV“­­&³×o°Ûê0sð0÷œ=Iì:<óÔ³di¨VæÐ‰£” z½e2<,9yÒ¢R‰ˆŽNóäò67>³ÄÇïšá¾÷ŒòÔ÷/1{íUjJB'Åî=›‘kSìô¶9€R£Dos™}ºÇýÜÁ“O>Eg»…(×p~œfpd”ÇŽpìÐjUfs‹¥…%êƒôâœfsûgøÀ>ÀK/½ÀÁû¹ýöó|úÓŸæÐ¡Cœ½õ,³³³!Ÿ‰j@µ²»³¸¥ÙØI9ûqfÞñ LÔØš›egé&m’w.#²5œá§>q¥¡Ó$#XeÑqŒ²•pD¸íeæ¯_¥·¾HUõ˜ TKø^•Àsý¾•ÀC\žâ;‡’9íæCC%ÞõÀ]*•(ÔíÅkPä©R ¤äGl­nqãêuÐ)`·½ÉíwÜF¹VÁÝ7ÊæN‡k¯-3Zd¨^g­¹ÁŽ9t`C•2Û.*ðñ<ÑAæ ~ÒÙÚ¡·ÑâΣ“|òœcqmŽÇŸø+œs”UcRrR Ň_ˆ ³ ­ Ãá+‡g`}uƒgŸ}Ž+ׯá5n=sÇŽ&ª9Ò´Ms­‰ï+<_qøÐa¢RÈÕ«WÙÞÚá—~ù—X_ßàÑGå¾w܇ц?ù£?fb|‚é©)®ÏÍ‘¤)ƒ•€Õ•5–·©;ÙwïÏQŸ¾×ì°ñÚ+ÈÎ""ž£ÏÒ%ªáï;GíÀJµhà‚œÔ“¤VHÙiÓ]Y¢;w…<Û¡Fª TJ¿ 2Â'ëS² ë(χ$‡´Íçòþ÷ÜÎÉc“,™E¡„¶Î!~ЖB`û:°½6!—.]"˲#çÏŸŸ}KĹ”­íÿÍ¿üËgž¾ªo÷„¥ÓͰÎ#·ë E …‡3)B” ð¼¯RFx ”Ź¡ƒC ´tQt×E߈@ú ”C Ù)ì–Ѻ˜ãK47¶Y_[#I*ÇNœ ¹µKm°F¹pc~ŽV+æÜ¹3ø¾ÂYxê‰g( 81EÜÕëB¢$xH)€€µX›„eLêh-ÏÓ[¸LÞZ%òs¨–+D[LyÊÂ¥H%‘R‘i‰Ê¶™™¬ó®îàw¡Vö1:¡ÂLJPÃo¶ðÌBâ\ñ±µ!ÄÍôÊÃ¥K—¶¤”£gÏžuo €›±»Ó>ûëÿúK_xü’NSG·×Á EnÁXGnÆxHÏCãPx~€Š ¤*d%AµÄêÊ:«ëœAXÂèâ5ð¤D8±åKòv yÌ‘ƒàî¾pžÐóÈMÖkz` ±¦pEűGç÷ÙÜŠÅÈMOß^¯‡µöÇV ÿí…Èp|¤V¬v1—ÑM .scÑΡ­CD>µF•p°N¹VÁ÷Šb[(“ý½tÒkp@E!RxgöVk÷ß\_Ø(ðT‘¿jcÈò„F0ÀÑ‘ý¼üüe»Ö¤^+³ÝÚbs·Í­w%Ï Ax!¦“óüå—ÙhîräðQ`œÀ Až›bšÑZÈé—øîc_$ð¥v:)V뎵6X[ŒËƒ_å©bJ1 yâ‰'¸|é |䢨D¹\¦ÓéP*•‘"%OwQÖÐð&OX˜Ýf®)ñfîçøG~š¡¡ý¤í˜å—_Åî,ö ;z¿2€½áÉ£”‡aÃ!œòéå9Vz F¢×esužõ唚ÛD*c &¨×*„aPHe üÛ~7^bµ$ëÆ”£6?õ®3|è=÷112„µ1Ʀø2ì5×E=ZˆPE?šˆ57Ç©8Š8çèt:?V€üS,[”âÜ7¾ûâsŸûækä‰c³Ù¦™Ú‰¡›QƯ4¨×KøÕ2"ôq8„(³ò|Ej$úòvcl_ÔXì÷“R ^ññXzò†(êá2Ϩ•†Ùi&\¿rƒV³…ŠÓ§¦™:0 8âVÌæÜ&Ý8Å’ƒ3c¨P¢±àûÈè¯*}v&MSþ¾#Œx‹|óóÁüõÑ@áÒ4é;±›s¦ðéJ’>x4a±³Ûaue™ûî½8‰™-öŽXM£äÇ +ë]VwHë‡9t÷# Ÿ}7»©Ooþl\Ç&˜ö2]E G¥1N4u ì;GX"œÅs6Œ0Z!vZlÏ_§¹ùBÄ …P #¢r Oùx²ˆòʘ$>QèÑíí uÆ-‡ÆùÀùóü<é‘eOébØ ,Xáp (¨yúµÆÿ³®ýAÙ+Эµ\¹r­õÔ¹sç–ß2Ésç‰>ùüµßÿ‹¯]Ô¹ÇæN›fÏÐìiz‰¦¥* Ïa|x€n‡ÁS)5BJ…”Ý ‰’ Ï+B„Ö¥J©~WÝÝl 9çÀ:LÿF’r8g‰EÏ‹ðEˆ³)-Aà㩽^—Õù//SwuŒïqàÜaŽa»·†ò+ì´sf_¼Âøè(ƒƒ¤i ¿“ÕíL^ERWde7Æ_˜çcñÎs5ž{öùÞ_}²€j­Jš¥k±F÷w„š(¤Àäš<×ø* ëë«HåSŠJX)M{m¹å6›v’±[ßþ»ÞCÔé®lÒYºŽHqñ bk'ÚT&Pã‡pc© ¥tœ cŠIÉ@:DÓš_¦»¼„LZ„~—°âˆj”‚J¡YÃây)4Æ„ª„Î,iÚ¦R¯òþwÞÂGÞuŠFckó‚ží§_8u³·Ò‚È‘ø7 7~@^Ïd !H’„+W®,Ÿ?~ê­•b9pN¾tdzð•ý5îymI2õäu.­…|ôç?˜>Å×?ÿ®¿¶Êàð0™Ó¤.Å7‰#k÷„Dç=2k©6QN!ŒÄt·¸>w¹ö[?ʹ‹ïC í#ßZfëÆ5² ¼Þ2R/¢Ó5Ä@D}üÂÑÓ”'Oã×'‰ó„žK°Ê' ‘kº­Éâ+è­"¡¨U¢Ú0Îs„b0×A 2`e)OšÑMA…éšÍ”ù%¸²¼CýÀ8G΂H“˜ÀIOâŒ-ü„º™6íx[tì(ìJ) 1dß÷õ %×oÅ£ q69Ö%B’4# Ëø~ÈÖz“åk ä[[Œ 2yz†l @t 6Én²i„TâŠÀPž$wL†B8‡CQv¶šì,lrþà¼}ˆ¨}…¯üñ±¾´ß¨cÃ$pd&ÆA Ò&«ë+¼4߃LÜõQÇî#èj6æHw®ƒY%ØÞÂÆ+nâWª#g¨ŒÜNÔ8†_ Ñ¡¥›e—©¢+h®.ÓÛ\Ƶ—©Ê¥j„–©ú>¾çáh”8WÂÊ Òi¤nÉwݾ‡zÇN€Õ˜@;ëà GäûEQjM1I(‹P털I Aát(™‘è×õnæ­²x’…-šR{)˜ô|lnðœ$é&¬.¯P¯×¡ç Ú8„¶¹EKpž$M’¢;xÒC(åËâgà°Â „+™ç°Æ*…ÝZ+1¶³Å½§ê¼÷žý,_œgû­…k8íhv ¯^[a=‰9õ.]|Õ˜bqs·dY†ñ,ΦE××jâPxÊ/îÆí¥v¡Æ9¤ AJr£ ‚À9RWÌÛÊ£T °þ0­v‡ßÿÎÕZÑx­Sw°ït™±ñýdš7Ù]ž#H— ž#Ž—‘¦K%”ÔÆ#‡Ï Ço%D”Cœ°ÈÔज़8ZIlc Öf ò&•À"ªUDTÁ“à{ct¡ó<òÜà{Eš4iÔ>üÐq~ïýT†°Æ µCˆ¨0èë`)d!bèù”#«qÎÑëõ~¬ Þ¿S€Mý”TþÃÖÎ_¸¿6Fû/Ÿbzt‚+/>Ž÷t‹ÃúýxS'™>.w¹þÒ/´:¿ó“£5,‡Æ(5´0d.E*UXççd~NBáa󌬛‘oï°AˆPˆ|¯8àVÞ ŸJÂ(cÌMþÞ¢`~Œî÷`¸y(”’ES³O ì½ )û]qSÌ…ôo¿’…øÏäXá!CI-¬ÔÈói4û&ö‘waki™öÖ´W)÷VpÉ:qoÏ—T†&9Hyòb`Y?%MÒ,ÀjIžº­&;«³xi‡²ëQª„å‚ÀO¥‡ÕÅ­¯]†²Õ Äe1*¹óô4ýÐÜzê G𦅯­/"Dô%>œpE¯Cô ‘Ïôjo¤w÷Fú¿Ã?1ÉsýL]°OG spß ƒÃTJ)Ùöó¼öxÎö‘MŽ8ÍÄx\hn,¯rí±}ñ8ãû‡ð" ¾AƒËò¢",ª/OA9’Ü#× i!ÞMÙÙhÒÛéÅT!j”"Ï5J€R¢ +]_þaúiX_-z“t0lÿgõ©â½®¸Ù~ÀãçÃb³ÏSøªc (gÉh¡q´q˜\áKIÖK‰·[twÚ¤íüî""ž‡x£cQ*ÇQõ#D#‡1Õ}ˆrDîR²ÔasÛ˱.Ýí:ÍJ¶EÙw”ËŠ0 ˆÀ唜‡r%t¿Žó•Bº ÛÙf|¸ÂCïºw¿ó"õz€µE=æ?‡”êæ­þz¼‘Þ}³ÃþF¼Yßã;ž$ I’èr¹ü“A´6Ïôânáâ¾´ŒEŒLLUÇÑ»‹ä½æŸý,ƒ‘eäÄ­ŒL+†k£\½Üåòw_%?s€ñ£ÃUAbb>JøÅ¶(d¿¶ÐÈ,Dv ÉN“ÖÊ»›øD9 ð#TPBÈŒCgõéH!Š÷NüP¨7ýk/TQ õ)eǃÆÍtB)…“ò&A`rÓ§œ‹âœ#3M, ä¦)fŒnœ5·Ñ»ë˜dÑma:+ݤ\ö¨O§2zˆêÈIÂÆU!ÃÇÙ“µHu“dèÍ%’õED²Í`à(G’ ø¡By#r$…Wª=¿„§4i»I%J¹û®“<üþû9vx L†É2„áyêæò!¥¼"‚ôoö½ÃþúfßëÁñF5îuUoÅ›}¿‚^¯‡ÖúÒ©S§z?1ñ”÷L/î 0øA€R#£gšº‹åÝåí`Óm–®RIãWSiäà±2f¾ÉÜ ¯˜ÃŒÇ«øÊÇf®X‡à,Y¦i÷2tk—ݵ-v×—È›ëøÉ.•j Ù8‰ ü¢a˜fDŒu$8„ pJîMš²gnŽvZk‹TÎò&y±+oÞ–¦ßÙˆþXq_>a-R ¬ðɵ)¢VnHbM'˜v¸ÙÄt7Pñ2´_C$ëD¾#Ã=D8~†`ø(iT#“†Ü¦`lfÈb|«Moc ×›¥$:°TÆ—ÂwapÒ‰°ç[¤ðˆã]‚´Íéƒ ~ß»yû½çð}A–uñTˆ“å›ô›Àýµ‘aïã7~þ£ê—öjïëq#¥|Šÿþý¤T./w»í•8I&¯18Pe¼6ÈäôYVægÉõ66´¶˜áëÄîÇïyˆph”GêÜXj±öÒ¤>CC´éÎ&ø(+‰·›t¶¶é­/ÒÙZ€l™wðd@µÀúfi3¶6Ú8u £/\zŒ´½Î©scßÑ£ÌåêÂsmd¾Ÿ jÓkm²³9n/A¾Cg(g¢Ú0åFƒ¶NéuÛ $FJ •硇/}œ‹#w'B‡ÂöÓ%Õ¯;DßÍÏê‚B‡’ECö§ ‹}%®P§æÅ ”q´ Ö92© [=zÍ9DgÑ[„Þ6:ibiSjD N¥2x¯:ƒ5¼J™ÄYâDc­‡4ŠN«MgsÛY!ÈvC‡–ñ‚¢.%…+¾pXåŠq~IŽë$L<øžó<øÞû,atZ¤‰ý¿Õ9Û‚¯WNýh¶éõ¿ž¼x#8Þø˜½9ó¿.õÚû8Žcò#¤¤>P§•ï°»»ÃÝwc½“ðü ßeUCàûø¡dcczÍçÔÌ7æ¿ËóÙ6I÷?dßɳ?Xf¶×eóê ¼ Ƥ۸Þ¾ÙD‰ÂæØ<Ç÷$•¨ŠuÝ$C“"¼¢i(Da’œõ©Y/ðú}Õ7…Ø‹ýA&mtÑ)vE¿Ãó<”Tè¾€®(;Š®2Ö¢SÎÖHÐIw‡|£ƒÝÝBe Øxެ³„4 Q9¤>2Miä(®:ƒ8‚ª Ó¶=vº½‚NÕ w5ikÞökˆx›†ŸV"ðQÂ+Æú=ˆ½¢Y™A„‚<Ù%"æ§Þyš¼ÿ>™@J‹ÑÝbJSýCénÊÎÅMlˆ›£¯{S±?ª_ñúèñú¾„7{ÌS¬7Öÿ7{o$éYßy~žë}ß|3³îª¾/Ý·@!¡ ¡Ñ27˜ñ1Ž˜ð®cc&6bcŽÝÛ±;a;6Æï†`Ûc!:ŒÁ$Ñ!t }wWUWUfeæû¾Ï±Î{liq«–~§[Y•°¼áR "C¼9Acü&6¾9u&´3ŠTà°[â ¨¼¦¿Ò£{äþØ‹äÕ!Æ2I[dZ %‘ïF+¼Ó8£ Þ;º.cÍn¾ñ"Þ³ûZ¶oÛBpž²¯Rœ·h¥1Z’à3Ô!ƒ!wûs²Ã< Žõýĉ%ØÉú˜3Èú?WUÅêêê+Úü³HýJ÷ ÄîL@%‚Ž%M³‘pÕµï`û®¼´Ç––™œšdjrœ¯=ðƒ^ë¯ÞÍ7ú:‡ž½‹é’µÏd*o0ßÑ”¥CË€^X´L BÓ«.ô€(+ãIP$ ‡7>m}§ó k#R[%²æ¡K0‡@z‘Bà‘ûG2M)]´dö}‡]íÓ[ž§8vÑ9„^=Œ¬Žáýt"I'Ï!Ÿ=‹|ê,Ts4š„LSzKeAVß-(ï¥ÛÙë"“̦:Õ <ž€Ñ6`@N3R—âº}¤ïðæ³çøð»¯à­W_7á¶Œø1a12AIÃr§ÃcO<ÅS?|ŽÁòá i.¸ð\.»äŒŠþJJ‚”ggë "ŽéVUdj­Ë§ Œ“ljВႰªª×v€!öøv«R'T¶¡¡†™›H ˜ŸŸg¼Õ¢yÓ-<ôÐC:2ÏÕW\Í7¾õeK?dzú#uN£pˆá§&d4µ—qÄ*|…p¾.­ê,"~àÀ¤ÑÐRùxPh¹ì¡–ã±Ö"•µ:/ˆîWΓڄÊG­\Û08zŒþ¡¿ ƒ}Èb/®ZD(Oc|3éäN²¹3Q“;é8%/ Ê~Ÿ¤…b~™åCG+{Q²K3é“§ †&Bz¼ïÆ©R8/P&%Q)2@Ù[dûl‹¯½†wニɩƒ²D+–ç+±4ßáÞ/~™û¾ö ?Øw~i|í±„ß~Š÷Þ²ÈMo»Šf³Qkèx‡¯sJ öt®^xJ)£ê˺À8ñàŸ,0NÌ@ë¿–RÖg:Ƙ'_³`!JÖËZ•½,+²,EHÃÔÔÆ´6=z„éÙYnÝý.¾öàƒüð±ïqÅe—¢&'±º$m6B¢ÁWJ”)¨/ê²À|…‚G„: *^!‚Å”vq%FÄú[ðÒT#G]| *ÞKÊÞ*Uw»2Oµ²ˆè.£{ǰvžyd£I{v'ÙËЭ¨ö>mS9óPzE¨(ÛÅ/.Ð?tÑí Í€<ƒÔd$¢rxeщÄ;MQ9ší^xìÒ™âWlçiKÏß x ëÐR!CH•pïýðÇŸ¼‡ï?ý,ãs[É&ÎÇ;IérÎ9çø×n=C©nQKÛ×i3B4‚CJÉøøxT0 ž¥cÇèõ;\sÍÛØ4>Á#‘¶*¹¡Ñha’[D¼„Éu‰²¦rDˆöѰ!넉‚"Ä% ³x«@+d¨U­AƒP2ÂL\ĉºAƒ’ÞÊ ew·|ˆÐ=H(VÕ~piÙÄ ™óiÏ\ãsØFJU×ÿ‹TžÔµéë±rôyÂÒ~¿ÄxC!TBf¢F˜ðÄÀ¶ $*'O®ßÇ‚‹Ïœb÷MoáÚ·½™±f†s}@£”g‘:åèÂ2ò±Oðwÿ=ËÉ,3[Ï¥ò†²#È’3cQ­¤×÷4’qö/W|ýÉvìØB+S80J„Ç9;òŠlj[ð“-O‡Þ]ÿo‡×ë½¢ôW‰uÀ{P±iøF kÕ!àÏ{‹’JJ0)^d4 ƒÀĸs£=†ð'à Øø3Þ² %’ ¤ÂR€uPU­©A8.rÞmié¯v,¥\>JR.¢ìýþQ‚ë’¦)ÙÜ47_ŒßEH6âG%*ð13QT”ƒåü ôæáWig–¬e2ÊÆÚû#V”•àƒÁh E‡qÓã¦w\Î{n¿†­[f ¾¢¬ú‚ Š’FšðÂó/ð~õ·øæ“io>“¦Né—†‘43Cž)2Jœµ¤Y ë»tï<ö—Ÿ=ÅeÇ,½9|-ӣȲÈ?j{l;þ£Ð»'  a)V–%UU½â¬þ&=^{„»‡Üú»N\(ªúkO#k ¦§HdE±Øg€â¢ËÞB™.óÐc}¢E‚õ#$JI‚41{AÅÆ2žà->DÜ”Ž(­ÂtÚ ‚Fhƒ-‹¸IÓÈŒ«… "}ç±eIw¥ËÊÒ<¡Üì¯à ”Õ"NvhÍ06}rã0½‹Be]ã±lе×Ð_êÒ[XÀô'—&S¤©$ÁâñNÇÇÄ„ÇË ©= XíÍsÅy;ù…¾7¾q3Ê´k7*Ò)AHʪ¢‘&<öØcüÚ¯ý~°•Ö–‹xøwä­&IÐÚd—ÒZrcaá ²¤I¿³Ìø—œ·% Þ[œ«ÐÆ …íDbþÑåÔ©2ȉýÇ`0À9Gžç¯ýBì !ì^×X{C×ö¢B‰ÉšLÍí¤b‘E¹Ì5º4e—^:FžNÐUÏ€"4HœŠc{Tµ{} H÷ñk@TÞz„68Á‹XÆ8…ÓAyT?T<èPb¥Æèƒî€¥#‡(Š{ Q®"‡ÅQ„PŒ·7ÓÞr)zæ|D6…©4_Ññ‚²ô¨Î ÕÑC¸…}Œ¹UŒñh• ´Š»P”îâœA‘bt‹Gv»l™lpëû¯å=·]ËøØ$¾r¸ ‚8tÈV2“±çáGø¿þ_yq%!›Û‰ëL5!mf(—(/#ÞL8,`¼D…è‰h=<·8A‹™˜¨9a‹H݇O5Î=]Pü¨ïש…$Iž]dõoܰ™{Ù¤#nª¢bƒŒ Ä$±,u—Ù´ Úã]/Aš¡M›P•HPF ´"(…ÐU¡ œtÑãÎ9!j™ H!A ˆ**V°¸ ¬ HFZËË,]b°r”àa…ª»ˆ´+(¥ÉÇgß° 3¾¯r<ïžÊ•ˆ²Oµ´Dgñ0ºêД%Ä ´AkÁS:6¿ÎmHMB"%ý•E”p\óÖKùð{¯ç’ và}‰­ú¨ákh<¾r$IÆß{ŒÿýדÃ˱é,®Lc’á Šz¯#!Œ®·ñ5½yÔ$÷º”eE³™Ôö¸T¥öª"Ÿÿ± ùÉʪ“„½÷¬®®|{çÎá5 !„='ιO†²ÓâÏ:Œ6LLÎ’ä9¡X@„gðeB»½ª§Hä©£òÖj„ðhq…t(é"gÄZ‘ŸAT”îq@ðxR”GH‡¯J|T«+=p~§Kf¸e\¹„®Ž!¤y›æäf’Ö&Pc8§)*º$`9¶|µ0¬ ü ™‰#Pqsm4Ö;¼=cÙD¸>Åýœ»kš÷½ûÜøö·ÐÊ5EÙE)…T¦6. ,Ê”6Ü{ÿôƒgö™Ú²‹…NŸÉé9LšA°(Q“Æ$HËN!D´”ÔÌDÎW "S2¸úƆ8ÎõIHñ#òSgq„~øÿ², ¯ŠòêÇ RÊÞûƒÀ¦S½‘Ã-uˆvƒµ£A@*Eželݾ™3¶ÏòÌKûÁ Ò4Cx¥ƒ A„%ÑZ‘eÂ{‚+ÎEXE°1€ì¿`A#Ñ8,‡”Àö=^U;¼Ÿ²×%Ul—r°„p}Œ´$œ¬=‰nL€Ìq•Gš’LIº«yú#dÝeÚ)´±¤CÇCçƒ`P•)H•By‹ ×Y!1=Þ÷®«øÙÞÈö­sàû&RS_½¯¡!RD»!è­üÿçÿÍwž>Bcóy,uã¤J€/£ƒ¬ËÊZ›J¢Ø‚÷ \Ì.àF¦ÐBÍA—"J‰^œ6 Ö3 ©…©CX÷w¬Ù?ÈZ}&¬Ã_UUõú õúɰ7kXŸue± Ž´‘sóõçqàà~¾ºg‘`ZTnŠª”™âPh™¢M‘­€ô†¢¬¨¨ˆ¿ÅG†@ pgZ+>úã3_zÖ–óé07=I¦$Š*eÔ!.Dc…êÒI ½@©:›I{bŒÄDgZH‘JÇò× ‚ k¬Ì“Ž÷Å:!‡!R'7#*³¯U0+ïY^^ÞX¿ýº !Ä#ëõ“bsÄš?@ÆLB@ ƒó–3vnâç?p-Ú<ÂÊýÏsøÈ‰’¤~'zØ~h$¨<¡**‘(JR:BÕÇÛzï<2¨ZÀ¡ÄcqB¼¥,—Yí.’¦ >X\Ùƒ`Ñ:NÛTÒ@¨„g%¶r(å)º 9²@ÑïÒО\T*ÀP Tl¦uÀ:H“”LIz‹G˜žçæÝ×ò b™ 3x_áœG©t$¢'êÌUð%¡t$iÂ>ÿwüÞÇ?I2½ƒ¥B0Ûj“¦%-‰b¤@)‘(!ââÔ•ô£ˆtŽ …J`ãdŽ‘:ŽÉ£Ø.eކ–§-§‘ÐFÞ>¬=ÁU .(–—;øªG§Ó!MÓgÏ:묯› !<|ª-ëÚ]h-8‚¨'SðIÔdª<çœu¿ò/šœ;;à‡Ïͦ)““ØÏZâé—:^ZF7gÁ$à mÐÅ€Õ¢-TÝ„ƒ é}DÐ ‡š²èÓ/–É…4W–h¶rø°J’)𲕠´¡,rÐee~‘²s”F&É’IÒBKI0Q?k(† S(Î/sõ¥gò‘÷\Ï›¯¸a¢’‡”úx¯ðÚ<(øú zT‚—^<ÈïüÑ'Y¡°†f3g¼•B…ÔŠïëÆ\Cb°vw^DI%2¤øÌsÖ†JJJ§15½0 —¾r­d:éç]gªPÓ ð5 2Äñµ«ÐJRÙÀc?ØO¯°}Jãœ#MÓÏò*¹~\dÏ©p:Çí݇ë†T€ð„ PZàƒeznŽ÷ÿÜ¿ÀBtšB`eµàÑï?Çÿî!¾÷ø‹ôüNL³Eßu‘h2ÑDI%@`©*©¶BÕ"ä> JÛ h%!Ôöi~P×í Î lHÎ:„-ñ=G·Û£×YÅ$Š´Ñ ÕšHÒ8 •6¨ ^`°Â†éœÛn»‘÷¼ëZæ¦sœ/ތ켯K¡ ¢$kX‡Yr¡øGÌ·}šÖ†sð4˜jµx”ªÝ½G©€¨ILA©ã‘³Dþ=Dgb*¦'ZlÚºmmAX›k¿§Z…¡ÂÉpÇ*€°µ<¬E™Œ£«%ßyôû¼°÷ œµ+ªõ A’$Ÿ{½ÈÂËõ—¿ÁℯšM—¨‡Ê¡¨¬F]‰ÈŸlkn¸ú"ÎÛ>Ãg?{?_øú󬬌!’Òd Á‘¸E/[„Ð#ø²†NX‚ˆKEç,ÁW RF<—pÁ Âá…Âyƒö Öê~”ú倕î-£Oxj"xÏy‡².+Dlë H¥äº+Îäý¸‰K߸‹àK¬í£¤’.Öd£!´ÞkÄÛYìUª*`ô«ÀW¾õŸ¿ÿ9²„Ö R ¢ê2»i‚­'@’FN’¤nÚ´iùu I’¨ªê`aÓé2ljB€Zœm]ù¸rJa†áâË‹h)M@©(amIÞÔ¼ý×pæ™ÛùÌŸã¾ï¾éÆ&6P­8‚˜'¤%¶ŠnºReˆPúI¤¡R’AÈQºEƒZ¤:DßÄ47ä­‰H°®Ç›/ÙÄÏ}设ò Œ‘”¶$ dZ¯ADþНµê}8Þçd-“{QRUŠ/ÿÃ×9tÌ’nèc2„Úü”5h­éÈa£MœJ‰—&BEž(ÞvÕ•´²[h“Œr7'pÐGŸÛ°ÿ ½$gI’rp±Ççîý*<ø8KIçûh ͆bó¦9Úãmò4%oäŸãUvé烅ö„vù§Óq=QKiÝF –·‰22¢î D„ràJI|°€ãÌó·ðËÿÓûÙqïÃ|æ {Ø· óíÈ4 ‹ç)ƒˆRD¤ ÊUdÕÇ ‹2 ò,A&ÂFq8'y³I–%PlU23éøàÏ\Å{o¿ 3M¼³8¢Ø‚01o¸Ð }Âk—¦¡äΉ€¾¢f—6-––»üÃW¿ƒKæ¢EÃh-T(ejHˆKÀú 6?£aº’¡–7TE—®¹ŠKÎÝEYm¨—ì#óø‰:VÂÚ‡Qgr!%ÎSû³hyü)îü·xòÙýΡAUZTðè´âì3ÏfûÖ9™"Qš$KÉ›ÍÏ¿®d¸Q_Z<±®6ƒCnÀz¦Úñ_oG§*ŽC}d Æ ‘ª°ÞӞჺŽswLò§Ÿzˆo<»-@‰iª‘XÜà†.›·¤\rÑ¥4)=ñ?øáQœSø|[$ÒE˃NT–+/?›_úÅ›yË›ÎAâ)e$ZGx}Äš „ŠO±MCm3€t#…Ãàããì?¸Èï}ôS<³¿ ™Ü€Ò ´Q¢„‹â A‡ãµÓ¬XS£¯3—¬7ã:QTeÁŽm›¸ñš+Ie ¬mÔBðkn›ˆ5¼Üº>÷ •­0:a¥¨¸ïKpß}°pÌ#’dE9X$‘‰<粋ÏáâKϦ‘ ´òŒ5‹V³õ¿Œ=ýº`ÏúÃ~b™5üž÷~$ ¦éqš°1 †î¶~ Wlj¯ýÓ•ö™ ‚"¸ø!+!ð•ÅiÃ¥×]Á¿ÝqŸÿÌ?ð7_z’#+ çz$ªâÌ­“¼ýÊ+¸å—ság’jË?<Ì}_x€»îûß=VP¹ çK2ëxu¡´ IDATã™ó‘\Émï<¹Ù9|áðR S—}ŽzL,kÓW¿¦Q{±¸Ê¢Ù’DËiçû4t›?¿ã~þÛ©­à”Æè)! ¢:$ÑjÙâñõ|8êBBàE´Ž.Á­<çgn»…-&q®1 UhFNæëJ¬KáØ”û`1Zóâ¡Ãüõ÷ðo=3˜¬dPöb¸ZËì\Æõo½³ÎØE’(h·Ç^læù'&'æUxý¸3ÈÃëÇ…'–YëÿoŒÁZËêê*i–E©OņÛY¨¢›á !%!Tuͯ A@ˆz»žk=[vlæ—þ‡÷röùgðw÷}•# ¹à‚ó¸æº7sÑ%Ðl5ñ¡ ÉٜǶ;¹ôŠ‹ùÜ=òäãÏ’˜i®»ö*n¹åzÎ;ojå5äy„µj‘±ñÐ é«$.€#%IšPôú,u–hç†Cû_@$)Ûθ˜Ãó‹ÈV™¦¨J`A9$Þ ¬Š–jRˆ8 ‡—î¡B •WVÜxõ¹ü¢3p.ÄáAèp‚Sðès XuŒ¥’EE–<†}šO}æž}öÚäx1 *<Êð]Î?k3×_û6εQB¢¤¡Ùh~ªÕûWã“^¥×5@´ÖʲmÔO ”õ3v¥b#Ùï÷é­®ÒlµJâCˆÛYgãEÀ ß#yž£µÄ×vlÀÙ»‘ ä°H!Ñ:ÎøMžñö[®äê·\@·×c|²ÎXWamYïb$¶*I)×^w%o¸äLç;äqf7Í€´”U­2¤–£ñ§€Š¸¤¡]’Áʆ¨Šh„byqž¯?ðu¾ñà\xÁ9Ü~û­,/ÍÓš˜#„@ÞÌ@J[`dTFÒ<¡–I•Z £ÛUÄo yÖÀ:\óÖ˸ýÖkQJÔαß.`½÷#Zí¦Q‡”UI–68Ö-¸çËñÙûþžîrIÚ§˜T`û+hQqÅ›.溫ÞÄD[G#ŸF^eyëßµšùïNŒO^Å×»ÄQp”êÞp¼Ùjµèv»t»]Ú­RFÕ Y/¡Ž-,²¼t !s3Ó1¤ ‚wxGäzÈØHÊј٠ç”T. 'ƘžÃ(]ß›~ÈÚVÚOkb‚öÄ (má=z½tÝÌ 3C €’H—fÞ”ˆr9ʃíwYX8Äïÿ"¿õÛ¿Ç[¯z3­ñ7ñâÞ}ìÛ”éJ°ë¼(æœ&Id"ú8EµOc]=Å`”5PÖ¤A`„a¢9FÑ]âŠ7ŸÏ‡?t3y®±6éh‰/“A/ ‚C›ŒìÝÏw~™o<ü(R¤Îèõûh«ýfÇ×½õÍ\zñ¥$2 ¥¡Õ;fÙ‡7nÜø5~.ý <æ`÷É‹_U¨?¤v»Í±c‹,.Î3==]ß±4?Ïþ}û)Êè£'Bä|´ÆÆPJÇfÓ[¬RBJ´VuÆDäAˆàâä‹PO¾TY†!ŸB× ‚*–2Î"$¦¯s´#^ËpBۤr®? ŒŒj+½n…#™?¼—•¥y²Ìð+ÿúWȳ !/¾ôÏ?ÿ"ßÞ³‡7^q-išÐí,Ñß‚Ñ)‡QK á#ÂÙ“ël ”Ô$F2è.ráù;øà{ßÉd«Qû$#TúP©D¬ Žáçà\Üô;‘ðàÃòŸúÏ¿tŒF>FUˆ™œå ÃŽí›¸íí—³}Ë FC¢ ífûïYþs3³SGù ¹~ì"¥Üs2ý¤õ úP1cøZIÅ£¥5°«=z«=æ2?„²¬°®@å-fZcL8OY”¬v;LŒ±qó6öîÛ˧?uI–Ñž˜ '¥±„Žc£P_œÃj­0Z³ÚYâª+/ä?¼›Óãx룆VMdrÎøêCäðp ‚C)Í¡•.Ÿ¿ç‹ÜwïCtžf6Æj§‡T \‰oºôln~ÇUÌ´rD¤©ñ´ñŸ[­æžœœtü]¯H‰u¢â÷É`'ÇsGâÿgffX8z„çž~Š……yV{«ñP—Ý6(©p•£èõI³ÖèÐ ˆQ+ÎFV© h•¬õ4ÁE¶]M-!‰E r¤2¿cL=P5iׂ@ ·%½^Ÿ~§ÃêâÝn—Âõêñ-ˆ¤Aº– …±‰1z½¥µlÛ¹ƒöX“G¿ÿßâ0¹v87ÀÉ<ª±ÞGܕн†óµG¢I0ÊPÙ lŸ›¯¿š|øLµ3ªª@úñ—Ôï½”TÞEÑ:-±®B EЧŸßËÇG~†DM£•aµ·Œ¾¨håï¸îÞ|ùy$iDÒnM.6[_œ™º›ŸÀK¼Z–å)å¦õ ±SZsÕx^‚Ý÷¾ðO>ùRJŒNñ!0==M»ÝF)Åøø8ãSÁˆÒjÐ\p‘gQ 0iB¯½5,j싦RÇýBL9:Þë=¡åÕ;)j³O({:ËÇ8vìƒ~¿ö‘x¯êŒäñ!ú±{}JŽ=B°eó–šSï°U‰8~ÿ>ÍCOEozªêÒÎbŸ¡±-H´Âꀖ Ó¢³<ÏìÜ$x÷Û¸íºËȲ,‚$‡öÖÔvqÂÔè„X%ª PZR:ÅÝ_ù6Ÿùì—8ºÆ´qÞàB…ÃQóœµmŠwÞz çîÚ†« òÔÐh¶¾Ùhäš›{‰ŸÐK¿"QY7êë¡ '.ÄA’`-RI¶ï:‹Ähž{îYª*ÐjµI’H4§=1Y‡[·õ]³R ¥ÖºXo%„QNˆ¥KðqZÔï¯\ kä¤y†Pjtø‡{4YUëZ[–ôº]V»+ôV»TU'fix¾ŒD¤Ø²B™e‡Fé„m[·’Ö?/ƒ–ŠmÛϤt)_ÿŸ•IñãôÊ’Á»P\á)RF+âdlµ»J³ÕD)_‹÷œuÖY5V*e)ùØÍÖÒ ¬­øµ_ý/|á¾/1}ÆÕô*Ö!eYgÓ’³vmåÆk¯àÚ+.¥Ù4Qü¡¦ñŠÑ†ÞGAp(çWÞ¹È× ßùÁ üÙw³ç±gÐ!êuõª‚D\™–öÜtÃ[¹êªËÑY!0Ön­¶›_Ù°aîÏy \¯H€8çn÷ÞßµÞlåĽÈqýÇF=„ñ¯R°ÚéðÒÞ½Œ³eËVœ–ËRŠÑ¦.â‘¢Óõ8 8Ç®~(3„ª„8‰rõ´ŠZ™^kE’70ÊÄ­³­°ÞÒï¬Rõ ‚÷8o‘"ò¿‹ÊÕÔY5êgœs£)«rôÚ÷íÛG’¤lܲ…4M†O¤”ŒO£T ¾BiÉÊr‡»îü =ñBeäyƒ´‘‘å97nàüów±kÇ6Æ› ¬­À§orÍË|(É#jЧ”ë*ŒJé‚û¾ò w|ö^öì`²6Þ–ÈwOeï;6Opë ×ð†óÏŽúXZ3=5õ„òý›6nxŠ×ÈõJÈfçÜ~U[€,0†×P;É ÷CJjˆå“ŠN·C¯×£™·È›ú΢LMÍ«ˆµ¶bC±i÷5$ÔNI"Ô,F_R”¤R¤IBUUTÖb{´Ö$iBUVq¡YY‚1H%‘„8áªJ‚Ó„ ×A>"·ôŽ4M(«Š}ûö‘¦)[¶n%m4F”Ú±±1´Ñ(a.ðýYúꪠQœ^1ˆŠî!PvxÃ…gðîw^϶-³xïÉó&I’Ü×jµ~~jjjž×ðõŠ•XιۅwUUE¯×‹æ3Yvâ8¸.±"Ö9;òŽh4hmê—rﺾ[ïÛûRi6oÞ‚ÖgËš_"êFÚ¯À¬{¼ú¹E¦úÄ áë}ù|ø¯÷5Qïvè/^ÿ½ˆ~{JJZí6•öîÛÇÆ-Ùºu;«ÝUò¼ïV&Eëä¤#ï“}}ò訿k>çÃ) ÷ç+¤h³ç»Ïð‡Ÿø+¾ÿ̳4Òq\P”å¥EÙ[rýÕoâ=)Lá]IslÊ7òü˲ì·&''¯ñë ïýæÂ~)%½^¢(hµZ#’Ôñ[öá!ÿ¶ªª÷Pªžµ'2 kKŽ9Ì (ذaÍf+–iõ]ÙûØs &ÔÈÕáx0`T‹Zûa`E÷'FF2eK+ÅñÜk-ƒ²@Ãäø8ûàØ±cìܵ‹ññqUI3ob´©eF ë9ë§|ëÑ'cbáé‚&ÂÈ¢`(]ÙØ/õËÀçïû*õןãÈâ1’<ÅUõ A8VûËloòÎ[ßΛßt!©ŠÊùã­±#i³õ‘¹¹¹/ñ:¹Ä+ùàι_BüZÕÕÕ¡ª7Y–­Û‰ø8Âç!1d¸y/ë@Y#QÅïÇŸ=rø0ý^éÙYšÍf­ R 8‹”j¤@è\\*ûQO”wTÖ"šÜ{”‰%Ð]]Å(3•‹ p Ð]é€LLNqäðaæç²cçN¦&'©œE+SgM­–k’«œÜ”æT~㣅êˆ>&FŸnë,FöYäOÿün¾üÀ·(‘$\YŒÔ«²ÃYgoçÝ7\ÍçnÊ£ c“³j•`Ãìä³¼Ž.ñJ?kí/ !þÈ{¯»Ý.Þ{ÆÆÆÖÁ­ëi­ë÷…ë^À°”ˆ a¨ã{b N‡Åc‹äy‹™™)œµ£I5èO p¡¦ì†X®9?tuŒ4 —‹”ŽØ­ÊÚzŒ«ñÖ!Tl惂öx“—^|ÎJ—sÏ94MñÁ“5›(eêç;ÜlËuuR8¥kì‰f£éŸ EocÛ#D‰u% Bj|äiþäãwðÔ^ m´¨†™ðÕ**¼åòK¸íÖ·3;ÙÂÚ‚$KÿÝFÞþ÷ã㯳K¼ž„sî=Bˆ¿´Öfà Ys¾=¡Œ8!@†T[1,Êñf=ý~ŸÅùyŒIذiÎV±oPÄÅ¢X;˜Î9œuè$¥¬*Š¢X3%‚£|g­¡ëB(lecS_[4òœç~ø +ËËœ{Îy´Zm Ρôòñrù£µ×p*®Ìzž†ªqU¡Î„‰TŽª$Mz=˧ïú;>y×=t–û$I³nþ-Z º+ËŒ55»oyW¿å2Ò$ö}ÍöX·Ýjÿss³Ÿäuz‰WËqν¸Ó9×ît:!h·Ûh­GZ²§|£;íšö ³¨JXV=r€Ù ³(%q¾Z³m£ÆoEÅhœwuɤè÷û­G|q)%UUDB½*úÿ=õÔST¶äü .$Ë2œ dYÎHžû¤Á±¦rº 2šPЯĀí ¥3žÝ·ÈŸ|üN¾üÕ©DëE¿$o¤ôËUªÕcœµk3ï½}7çŸsÞöÈSM£Ñú~Öh|`nnÃx_âÕôdœsW!¾`­^\\ÄÃÄÄÄèû'óâ~y00jê×Óy‡cÝàÈáà «lܼ)Ž« ­tȭ骢Vo¯×êêêˆ~j”ŠVhRb­­ýM¢E‚”’$MyâñÇ)}.zÃe$IR/³!e>ö)§Ãž¢ç8Žž\+cpDx½ó-=È”/>ð>öñ¿å©çÐj·Ð* àI<Å Ceû\uÙù¼o÷-ÌÎNã]I;OÉÒô¯š­‰_ž˜˜ìò:¿Ä«í 9ç.jËÒÒyžÓjµNþäOã¨zâ×CÕ!coslqžNg™ééiZí6UUŽŒ,‡}ŒQ=ÑyÞ5«*jÛhmFâuÎZ´1X[ñØ÷¥96Æù\TÛÅ=‡g(å)F¥Øé<ÆO̧ –áZ/øô÷rç]_d¥[Уßï@p¥éwWh6%7^%7ßðVZ ƒu<ËÊVkìßlÚôÚÜŠ¿&¤’]RÊûƒÁY+++dYF»Ý~™ôþéÊKQ ¸FTZÒYYfaá(­ö8Ó3³ñð2ì•!X¼‹üë£GòÜsϱqãFvìØ·v4pÖ¡E¯×ãÙ§Ÿflb’3Î8[qñ§Òz_‹Gøãذ/Ë §r]/·C½ 2T6$ž~æY~ûwó­o=F–ä‘Eî–ÉRM¨ƒ~-3“¼ï½·rÉEgìm cíñçüƒ³söü4,^åR7¢C÷ ƒKVWWɲŒf³yÒÌqª ϩ˰0*Ùúý‡í'ÑŠ ›¶"…ŽM7‚ ,JiæäÑGanÓFšÝî[·í`jf–à#Úw¥Ûå…÷259ÉÖ­;kÜHeFS¸¡$èéûÄcøçõzbÞG}«B „/PÞ¢u“~Šÿë÷ÿŒCöÒH[x/êa„D0@øe.8÷Þ÷3·±móœ-hæ LÖ¼·•ç??5=½ðÓø :“Lw÷z½«jk`²,;NHàd\’ÓÕö£²dh­@ärØ»—~1`ëŽmäyNô‰VØ÷/=ÿ›¶neÇ®3βwïó:x€Ù™9­½n‡~Q0·q3³3s[3×6ýüÈ]Æ©J,_£Œ‡=Plà%OU È’&÷~ñëüöü9Ëç4ïxYqõWðÎ[n¦™‚+oç¡ÙûÍ$ÉþÓää„ýi8ü„H$ÍÂgz½ÞÍý~Ÿf³I³Ù<¨·~Rõ£å¤eX­Y{ðàKì?ø"6ÌÐlf9´B¯W°}Çvff7QUýè«+ËK,..@ˆ ÷ÔÌÍf k+BmjáYkRùS •OANüÚד69W2ÉøÌÝ_ãwþàÏèWe9ý²Ñ)®? ß=ÊŽ3&yÏí7qùEo@+Ep–±vóp»ÕøÈôÌÜ—?ÁR—[Iá/VVV>0 mÛ‡¥Ò:`ëÙú‰X|€8µ’JpøÐK™?Hž§hÕbnn3FŽ­H•I¼÷µúùh¾#k31’Ü µOƒ œv¨pº 2Ìv¾vyФ«Øƒh­øÜÝ_å7~ïã œ!KS\ÑGjA1èª>_pïïMìØ¶YNÆÚ­‡ò¼ñá©©©}? ×@€ÔA¢¼÷¸¼¼ü¯Ê²d||œF£qÊÀøQS­ãƒ'nΣ Â‚VéïíqÁÇ«C“žˆûªª­JŨß6ýÁS³ÿ)â×ö"Á×âë‰QÜÿÀ÷øÍßù(½Ò"Tô4×"Ðëõ1¦à†k.a÷-ï`"mã*Os*§ÕûM“¦ÿqrrò§%Õk)@ê !„ßZ^^þ·UUÑn·O§mâ×þnvp„ êm_mƒ&üº`ú•x걉Z˜]¬íb†ËF)¾ÆþH­ê(¢ð\]Ç9‹Ö =ö$ÿëo|”C ] Þd‰ ßé2=ÞâöŸ¹·\v™’¤¡I«5±¬›â—f7n¹ó§Çþ韤'+¥ À¿«ªj¾ÓéüÆòò2!Æq¥Ó‰ýÇéeN#*ú³ ÝjÛ²h¡àk±…(êÑÊ #/þky|à‰¡>ÖÐè’õ ÄB€Ô¿Ë ªJö^à¿}ì.^&o¦ør@"«+Ë\pΙ¼÷×rÎ9çÄhÒ m6ËÚÍLNL>ýÓ#ÿáeŒùͪªV€ÿgeeEzïG#àõ»’Ó5èë!ùFþìQ{ Æì"Äú,Q+uÕYòd»ŠÚŠu¨Úðß‘AD휥H_Õ¤)ÃÇ?ù·|ûÑQÚWHpÓµoáÖwÜÀÌÌ8ÖZòf“f«ùÇYšýëɉÉþOûë$@ê ùýªª–€w:#¥$Ïóãvë'G'ófëŠñ¿ud¨rîkFaÍ,\cúºt#„hŰÎÑIü÷³bh´Sá]LÆøÜý_åλÿÝ_Qö—™™hpû;nâú«.#QÑTs||¬Ÿçù¯lذá?=æ¯Ã©ƒä/­µ+ÞûO-..6†åÖ©D NìGÖJ±ž>1"åÅ}Ȧ7ê3†Ü‹µŸ>aŸ!ÄqÅÔŠS-ë â\…Ô)/ì_äOÿâN¤4(eY]:ÄygïäýïÞÍygí Ø>Iš’µ&~˜$Éçææ¾óÓ#þ:­õÝÖÚ[…w­¬¬Œ£=ÉéJ­uëò4bÖðÿ­'Tµc,b´“øÿ5)┡= ÿ¿öÎ/ÄŽ«ŽãßsæÌœù{çÞ»›ML¬ b¡”BRÔZZk[±`k„R}QðIßôAú¦*øP± †BE£m’H "V-+¥iw³›»ÉîÎ{ïÜ™9çøpf¦w“MŠ5m“øû¼f dö|ó;çüÎïûuQk†gó<ÞX¾×sPf[xàwã‘ÏßÁª²@Ø‹áGÑsQ=5 ¶iy“@Z‘¯ªê3Y–Îó| @·ÝÚu°èmEÒþ¹ê™X—Õ§GBÖTÏW™wÂ|±Âl#•íãFÎ]üíäI=zfV ‰$îà“øìÁ{áKÃ…åûÁ÷dà?=HSCK›rùvë媪ŽÇãF£ÑþùJ²ûƒ?¼@š„>Æ8Í^w±f`ÌšË]´Î-ÝÔ¤usC­+8И*Žß¿xg×–qçÇîÀÃ}wݵªvÀ\i ‚ð‰ÅÅÅc´¤I ×ɿ˲¼W)õ§Ñht'c A\õí«W¶Ã—«ËDäFÛf¢½€eïèúv×mT¸Ó¼c€© /Ä«ÿ<‰—ŽýŸ:x_xøAܶguY!ŠBDQt" Ã/ƒ5ZÎ×v+þ£êºfYö‡Ùlöñ(Šºy’«½×ºòðÞZ Õ°‘m.»‚25˜v®N“ïÔü|weuÍâÔZ#ÎÅ'´ãºëž+]ÚŒÒxæ—‡ðÆò|ñÑû Oøðej¢È{:¼ï÷ûÔ'ü—(¥â,Ëž›L&÷%IÒ8š°b¸ü¿sã-èf‹Åkh]YCN0Îa4k“-m®HÛa»ý­sКG7=M<9ŒQÍk` áH,¯¼†¼ü*öïû0¸(!} L¶¿ÿäÞ¥þó´„I ÿK%‘yž?;ãqïpoÜíLrÍ Â”ÞYAlïÄþ|kGuÕ¯jæÄÇæ*H3騵RU7õxöÌœ^]ëxˆü×ãð•(N¿´°0|–/ äzT'˲ŸEñ”ïûHÓÀΙuàòy÷“{¦©6­Ši€qÇÆ9·ét÷ú\æIDAT—hz$MspþËÎÛˆB3€k….&Ú>–¬áÚ±ÝÓ«k8î<G ‰ø¾D'?‚à›iš´té~]pGUUõ5ÎùÖd2ùvë–2/’+íóUDïÈ$±íme·F7°}F»«Ù+o©æßÙC¹Ñ à LhÔÍ–a2cyy—.m! "$IRÊI†_ß»´D]qÈ»r»e|g{{û|žç?RJ!MÓ«f’Ì›·¡‰Lk·G¦™Ÿë¯7vÍx««]n̘asxsö°N(ZilnnâõSo¢˜ †H’\×{= Ãdž§åJ[¬w<Ï¿‘eÙ]×åý~Bˆ9+Ó†ÖáÌØÿéy“_XUàŽã®=G€ƒ1Ý=¸êôÄÞ Åb ÉšêUÂh áº(g%VWWqa}£q®Oà!|_ ÃÞW‡Ã^FK•òž1N¿réÒ¥_!Äp8ìf½wúmé¦?ν°9ƒ¦®!Æ\hÖFMÛ,®›Â¦ÙêÓ–{[eŒC îpä£1VVV1ÊÆü~ä#ÃJzò»Q”ü$I"ꊓ@Þ{f³Ù#/^üµã8~+’+¶DíPk3: ŒVPe‡;àŽ×d´·\íGm¦ÛHiÚ+\ÓE.%666pze u¥‘Ä}øA¸g¥ ŸXZZØ A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ iTXtXML:com.adobe.xmp 1 40/1 4053 121803/20 1/60 2 0230 0 0 False True 0 1 False 6311/1359 0 231297/38 2 5/1 4053 9/2 0 5 2.3.0.0 6 0 4146 00000a43a0 035021001653 0/1 0 18/1 55/1 0/0 0/0 EF-S18-55mm f/3.5-5.6 IS STM 1.1.1 1 Canon 2 72 72 Canon EOS 70D 2 Adobe Photoshop CC (Macintosh) 2014-07-24T21:25:35 2014-07-24T22:07:13 0 2014-07-24T21:25:35 1600 & c@IDATxì½ ]Uïÿ»§ÜšÛ{ÊMOHB ô¤ ‰ãüÕç êøÆ>Ψ#QGÇ7:㌅ªˆÂL  *@¥B éÉMOnïåœsÏû~~kï›àÓÿs ijî=çì½ö*¿õ[¿¶~«l³B(` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (` € (`à·Å@Ño›±¯€^€X³fMòÚk¯MÇ s_~ (`àÄÀêÕ«ÓÿJÏóc°Ù¿²I¿¿2e!²€0`êÖÖÖäÕW_U3òqSn¾ùºC#WŽç^ª¸†Ò²âÿýö«ßq–ÀªU«rqºcõ· ŽÕž-´Ë"MžØ°aCþöÛoŸdæo|ã¦9ݽC/ÏŒ¿*7ž;-.NŽÛD.gUUS¬¸4õú·¼åm·`%H`dŽeTÀ±Ü»‚mËçóEýèG“‹/έÁ¥Ñ[:º^œÏýìxîœd2•ÏÚèè˜ì|¶¨(_¤ß|ÞŠR••åV[;åô¿ø‹«=Ö…@êOF M>Æ0ÓKÃ'6nÜX¤€‰ÏÇÖ¬¹©±£{äÂìXæªÝ»w_J&«3™œ3}.;’+Jh¨?‘Oä-ŸÊ‰õ•g"?‘MNäówmÍ×N|ýª×ï–%‘ÒÇˤÜc)À±Ô›BmùLï&þã?ž~üñG_4:–ùÿöìí¹,™HÕår622*" þâv1yVÎ_ÊÇ€ž*~|<“‘°¨;¼÷ð÷óùû—­Ì®Ys•|G†Ç ª C€c¥'ÿDÚsM´F–0H|é†/•Í\™ŸxIQ‘Í#ÃÓ‹³õ¯é½ §w˜N—¶7¥U ³¿»eEX.—ËTVV¥ËËÓ÷¼óïz1©TgBÏÍý± àXèÅc¼ 0žšó¡å]‰çók’_¾±ëôñ±ñ+³ãÙKóE‹‰¤JÓg2ãÐ[ÎòEÒòât2‰ÁÑ þEãëžB׊™˜>B¬âI#Ã!S__›./KÜðöw¼óÍW]uURC Á1 à˜èÆc¯1Ó_³úšœ˜r’á®»îº%c™±«2™ìª‰‰ü¢DQÒ2ãã6>>ž—Ö&­ ç{åB¯ç¥éù…Ø]þökîÑøn(~2£TVÂÄD¶±¡.UZžúÛ¿üËwþƒà:¦üpìñÎ ¶E1Ó«ºž4µo¸å†yÃ}£—å2Ù—gs¹ó5m—ñá[Tw‘.’ÜøÎ¡á¹Ò¿9·ºŠÓ S¸–ña@ˆÖ)óax@Áù|®¨®¡Öªj+¯zë›ÿò?¥™‚ · á†qׯœ¶ûÊW¾Ò24:ðŠìøÄ+2ÙܹéTq‰´¾œy#bÜ ¼wé#í ëb¾Kc빚ÅcÈ£O×ôÞP¿‡É¹CBˆ ò9 ¢kÖ5ùˆA K$ªj*lÚôúS^ÿú·>~¬‚pŠ(|ý!1Ó3mGGÏÕßvÛS{z†ÏÏdó/ÏŒg.IkÚ¦—3o"§i87Ö™¶ƒùwùñ ~DÍhþ0¥ÿíŽC¸Ú³{ÇØŸÕ|bV*wæV^ŸæSœ;û( ÆÆ'@ÞP¢ÇFqž@I(EÏ)/âí &fdê4=XSö¹÷ý¯÷½ç…<=X¡ï ßÿ= Ljú£Çôyã7ž=42tU6“»T¼½ÀçêGGMqà-©_1<Œ£‹)pÈ9ó­‡þX¿¹¥©I„ÖæËøÝh V9% `^þ¹œ,ÇËÔ=¥QÏ=?…Ke!  Åé9Ïü_פ/Òzƒ¬v5·Ô'k«*ÞñŽw¼û v/ÈéAšX üVÑ£­Ÿ£é)èú뿸Lcø—É{¥Ÿ/ÐËÀIXš²;b×G,¦h˜Y FwºvÎS¼ó4Ïœ) N½aÌnEAx`h–2|@¬ P¬ß!•­Øè…+3¼*õr'­ )NKÃ8h›#Ìè7b(¦Ü£9ÂÐúSV8ÆÇEy)üDBqy¥U=p4 ¢ÝÇ*NLORC5KÛ#$¸BDùõã£ê" fÂ„Ö „;„Š%sÙL¶·g -yqvž¼jå_t¼¦  îÙÂïs0Ó3W¯ ûCïÖ[¯mèéÏ^”Édþ¬³·÷Â’tIyFGfŒöõç”v Ü,=ÉìpŒÁ`ü‘ÀÇÙÎ]º¦f²ºîw.à4U˜)„ð;¹CϹ/²”A€m˜’òCÎÀüª'ÒÞ”§%q,œ¯epOˆ™(Câ bT©u„—×—«ò0›!Ëg¼®¡º¸¦®lÍÞ÷¡W+“/V’0Réó0ÄØ‚Vé„gú_Þb+3vJOOÏ™ãÙÜ›dÞ_”Jׄ}õÃa_½(_Ä ÓGë#LÜÎ`¢.¥ÑµO êÌ Ãc ÀIQº˜C`±‚•30í¬ÏØ[Á‰VÕz¹ž%.ÛBñžJõyUÊ£,Ž ˜Ž$pð‰ÝàyiKH0‰-—Vå)ŽõGÚàÊjãPSKmª¹¶æ“õž¿þP4=8)H£¢ŸW?ŽËçD`þ øuü/ßðås³ãù7±ÅVãðFchxX׸H^Ž<1™k7ça*Ò/LÊØÝƒøˆña¢ˆ+#M³(BáèæFñ^pˆ/)“r`d8P¥‡z¸C@¸ókÖÉî `Å“/ÎK‰¢çA(Å ØC™qšD”œüÄQ„û- ȩŽ3G¦MmL45V_ýöw¼ïºk¯}‹Î¼îy{® ]S"ˆ™^Í}În»ë¾rÝ)Ù‘ì…™ÜÄk4ǽTºÝÆdÞkœ/ÚwêOŠà:'|gÁ™)bœ‡¡ÄØdƒº`/Æ ƒòX£Š¢\¤ãŽ40™Lr~’¤¤^gJ˜Žke »þBUnl+ŸûT'0jÿȉUˆ¯öS%‰DŠ•}i(O'I˜éF²(' T–[À?B!\Ó^OÏOH£b&ÍÍõ6}ÆÔóÞúÖw<ø|ž Ð{ _Ç"DØ“ü£R7ÞrãÂÁ¡‘WÚøÄ•šÊZQT”²qŒ;:6&ÚžÀz–_1!ü¹æŠ©:gOᩜAÂ̪+}‘×­¸G C÷ ¨p‡L?(þŒ¯“¶yîí'Ú?¬ú“-ÕCóçÌ^ñº×½qóýš\ù<œ,̨3µ BœÜm'†˜ôàÃôcÃc/ÎO¼¼¯sð¼ÒÒ²¢±‰qv³â%1üDR4œ@{¢éPp<„ üWNòŠ )3aj×0ŽÒav3Gðx•AzL J&P6çkêc…úüé¤Eà)”És«Ìœ¼oZk Ï¨ ÚXF« Çü¤_+Ò`%LÙ”)•VY]kååœö[oõÕõVU9Å*+«mXù::YOO· öuÛD6cÉT±âX0µTB&’5ŠÃò õŠV¤[¡‰!”)`u$’šÌöv Uì,ÚûÝûï¿ÿÄ•+W>§ €>;6¤3OÌÅ”;ŸØW?::zi6›M÷ðÅ¥Ò„91ý¨6ÞdÆr1Ëp“b¿4&/ŸÀ•"|®aµ(võUr˜Î$“Få“Téâ?ÝE'ð#é_éõ¯K¥"mT• ÄQh|ê§L¯×³R¢îèŸ<òG¸öîì:dû´ŽÃû­óàô™Jåú ‚^vÉ%ÛìYó¬¥iºµ´L“¿Ñú¬¯§K' ªJl A'ËÞFhÂÐBðÒfp‘Âá#R¾/><8œé-JÎ{äá‡îVä¹,“fv´%Fö?f-úcBP¨û¿ƒI¦QMRÿ7¾ñÅÚááô¹zÛÍ«¤Å®ÐaS²ÒlÃ~˜F^C}öÝ¡åI‹’û:S ×¼@E¼LïÀîa=:"ô8DD:~a`˜íèZ^ü0i¾óœ}÷ž¦¡ÌÏ™‹¼ž&8׸ 1bzic Y¤­;íÀÝÖÞ¾ËîÝ£ÔGÂâåËmNÛlkª¯³ÒŠrÓt%Ú˜BLñb½ÝýöìúÍVTföÄcOf®˜fvÁi/·ys–Ø”Šù@†mp°WƸÊP±ÿBcŽÉv;ö (ßzæØPC–ÈŠ#¥©¹.]×T}óûßÿá7(I@§gÒÝ9m!¼°0ð+™þî»ï.Ù»÷ÀÙìøk3¹‹µ@§!›™p¦×Qy2ïÑ86Ë=ø4YüÆ7V®¯ý"jvÖ9aDÏyH~ÄqžÂo(Ä呎XglBÙ¡"×û^éÅUþÒáKpƒÅãÂ3•£¼ììîî²ýöÙÎö¶§};‡÷L†%+N°Ç/·é­Ó­¼´ÄvhxÈzúµy˜áÕ7TYKs³mÝ´ËN8ãD;á¤öÀ´‘A=×`ï¾CöàÃOXg»—»dùb[¶ädkjj¥A*gHìû<O¸RZµ‡†Ä1íè÷Ù‰lKkcª¹¹öCïzÏ_ò-oyKZg>/fB/x« _Ïg `:Fï¶›$Yòº›®;C†üª‰lþŠD25ÙFçåIãkZÚéRóbXñ"R…ÀÄŠp‚ q¨ìxlËÁX<÷nÞ“Ydg!OÈ}ÇeF¿”IùGÖíSwð臽|}A|ãqÚ?ÖoAü±0ÿÔ+â*Z»vmòüóÏω¹œëˆ»þ+ן¡ñû«´8÷%EÉä|ÌÜÑ1NÆ‹—㺦§ glϺÚg¯Ü<ÂÀíÑÀÏ ìÎ-òêOƒ.äiGèRüM|¼Ïü yCðŒRõ®ŽNƒ0P<Ïô…Öì—Ö>ÔqÐÚwï²ö;4ï!·‡’¦*;ïÄ3mÞ¼ùÖÐPg:)Ä<`6¯·µĦ|ÚæÌ?Ϊêê­D¾f´WÇô0ÓB&¯ãÜ3VØŠ'Ú­w|Ï6mØhÃÝVœš°êÊ"›7{¡U×ÔÛžƒ]ö½µÚXç>¯û”ÓN³ãh¥²0Æ3r0*¸üT &^ÔP~4gªoðrD`ªÿm‰¦–z›5ê9W¿ñ?y>Li!<1€Æ×gR^óõËrcEWH³¿:Y”\\¤yl9÷8›40>š/>üæLkä˜)ù=:&·;sºnF{£ÅW†rô¼Ýp*#͇$Qà.ž@>y>*W<Ìá%˜>UÇt›Òðš.`‡¶Ý{wÛ¶ö ÖsàÓSþYgŸeÇ-8Næx£•(Ã-;6Û}ßo™R˜Í]°Äêj›Ä SäzK Öh…²Ú£!¸ùªŽ[8Ó–HH<öŒüú+)N[]U…õkà‰'µòäpÂÙV¦²~¶îI[÷øc^Gê_yöÖØÐ(Dx£pœªœ¨©ž–úb‹ | ;¤ :§W&[[kû–-[´lÕóàµcÀUd Àìçw^BSEŒnóš6Òœ±^GõÃV÷îÞýF½ªêÕ¢åSñà³*Oæ(6Ó`âÚçêáGg\1¢;ä"gTÐØ±dƒ£¹ÐT1# Rwâ¹PL¬)í@Ü¥á (åwîŽpvþ„ˆá¼,ÕH]Œ‡ñªs="sº[š·½}·íÞ³ÓÚwmW"%ŒÂÒå'Ùñ‹Ùôæ1b±,ƒ>Û¾k›­{òÛ½¿ßSÍ]°Ôª¤­Ó%endÇÇô& ~é5•7îñ:ÁË× Ð,Œ¡M5M¶ëð!1q·µÔ´Z Ó‚õV«¡"kœ‹kï»Ç.8çt[xÜ2Û¾£Ýî½ï^«šReýCývÉ¥—YÛ´YÞü=‡ùãÅ;FøRÛ½àJ2©´¤85­­~û[^~Öò–å— ý1§  "ºß÷¥HÓ@‰%K–ø>ú˜éxàç¬Ê‹áøÚ×>S±swæ‘ÓÛŽÇ‘¥g"¢¼ÆÿE˜÷ÎôP|î4qGQ^ ШPˆ•Zصº¤(Te ÉqþQ˜þ=@·§ß0¯\Ø<Œ™›Ä”ç•*LáeP6 Åôú3θ^&ýþCûÅT[l×î-¦÷s’ÂÃŒ…óíÔã—ÚÌ3¬²lŠœwöK¿§7þÂ6oÙkE%)›5c®Lô+¯¨R:8t܆zm` Ëçï‹Ó%šÃO Õ©¿”Ò$Ò)  |n?/S¿’ÆÚþÎÃÞKˆiÀiS§‹Ñ+­GÏ~xï¶xn³wî%Ö~ Óî¾çnkÐТSÈ¥Ó¦µÉá˜ó¶ƒSL8píè8‚Çè©£È-°üD¦¦jJzjkÝÚ¿ýðê•ä…ô9J †"ß߀Z¿G °!¤££ƒ±üä4ª‹8&T|Ë-·ÌÏN¼FÎâ+ĘõUÕ/Þºo_ížöÝOT•UŽMmjMerY1>ÃÈÀà:#:Ù0FI ÍDh=hyÌñ œþ%'t¯BHh6*K”ã„¡üq“%=—úJŠaâüþIႇpîõ«0ëÔ¸þðÛ±c»íؽÍ»úB£õ]9µÑÎ^~ŠÍ›5Ǫ«*ÅPcšæ;lÏnYo?}ø)O×4½MN¸iV]Ý ¶¤¤ÅÇ}z®·¯S ~†­8™Ö¾ØÛÆ‚F$(IëJJJ¬¬¬Ì**k­¸Të´hhDÃ&A)ÿ@©/øÁŠaÙs_—î‹l朲 š­[¾ˆ_<úcùÒöò _e;÷²Ý:­þ–¼ÿïWnÖcøl¬—õúÈ…ðû€$úä9q×ÞumyûæT×Te>ð®¿ßüo|c¦hà<-Ðy£ðçbÞ³‚-•ÒûíF‡uuvlxzÓ– ¤Õò æ,,ª˜R!Î8Aag;ó;SBÎ"c ÛÀèÜC‘DÁ¼Š:ÒáÄyŽèW7¤… ýRV‚Êç†<±cíI=¼N Š/œ‘ŒúûäÌ;d»wï°mÒö]‡{:ÿRÚóÎ=ßÌ[¨ñt½LŒ¬ÓoÛ¶É\÷ˆMh\_Ù4Íf´N³Êªj+ÓÉBìC°Þ9;Yºkš¾H8Ã:Ò @1>8!ΗË_P.æ/+ŸbS´âeÁøLÆ458¦YÞ,4.SV^¥•‚z.ëaDeõöuجY‹¬¾i†uÞk[Ÿù‰Íкþ ^t¹=¶~“=!Ÿ@YÅ«k¬¶sO?_¦B~†X¶ƒPù§ãRqÀE÷ÁÓ’ˆlëŒÆÔ´iõ}÷;?°ú1= rÐ _¿+ ˆ‰XÏé¸ïûÄîï¿ÖÜ_TW]ßÚÔМ+/²A µ ¬¬¼”*˜øºÏª3"â ½š:Õß×g÷Þÿ£|:]\4wö›Õ6[ÄSb6KŸÃœÊkn ¼X˸ONUšÀÔ±éÏ.|JËËQ‰®þÃ65P¾q”Å ~U&QbxÎûƒªG¥}÷tؾ;mçö¶k×îHé§žy†œy ¬EN´”4`_oŸmÛµÕ{êë9œ³J ƒ2ñ«ªjå˜+U5EB”s®W&>V±!ÇGµŽŸõ8DÙH e|cþ³ô·Lc÷ 18‹rX.<¦5š-‘ ‘Ї…>X/ÕV¡é@¤ZGç.›5{¹54ΰ^ gž~Ô.;ÿ4;néÉöÙoÜnÕ£ýÖ§7Ÿ¶âd[|ü2áÜHº‚„ xRÀ’Ò—âýJ¿‘Uùi4C‘×¹ ùm͉³_÷ö·¾÷뢙?èô`a)°wÕïæ gŽöгʎ¹úü?ñ‘¿Ó»$>6»yžU”V8QB©Z*¾lB‹t¤)³¢¸ZëïeߊXôŸÐR×|EÅ”‰¹s&üèZ+-/³JM››# Q·2GMþ¾œöº–ãÄQYÉ£ar†*$~}@(P~>(WX b†¹”K 4¦5ô¶gïNÛÚ¾ÃvnÝ(O›EaéÒåvü’¥6­E|ͳŠi7oÙ`O­ÌÚwˆ©“ ›7÷8MíµˆI×'\“wkm~ŸÖåç&2ZÍW&F®òv ÊÄãkæÁé¼ å‘¼«Œ!<Ê:áyÒ§I£V€3Åg4<`^^… ÚRä>‡ ‡Êª:k¨™j»ž}Lð$­º±Õ–É)ù£µyóÙk/¼Ð¾¾æV9ëì™-ë¬YC”:95FR9*_ªcLˆ ý„¹$?‹à`ó~áóíí”&wË 7|iË›Þô¶ÇþBà(Ì9Ü…¯ÿ"b¦¿ú꫱×(⦛nzw"UüYV²É¥Åy¹”¦À·øK$«ÀzÞ ­é ÓaR’pD޳ûzÐöØoK-³sgËd &±w\ËGAûÐñq뵄 49ü1),HåódÜ6B€1‚2“–Às®ÉfƒY´àHfrŸVæí±mÛ7Ùú§ŸDBX]uu‹i —¿ä%¶hþB™ï¥¯Zû¾]öÌÆ§lëæv>kö<™ÐbzmÐa¹î¸†6ZøÓßÛ¡~ŽZ±4=&9ÆÎ˜Æù#2ÿ3ÒÚhY„pú¯£;0ƒg÷õG°3g_&ga…§„©ãtX‚ƒñ>–Ö«ûÀYb†Õ™šN”°– ¤Ç.\aå•V,™^ÔÐ/?ÍÖüà‡²L:TÖ˜­8õ[¼p©£„ÑAp5 @ ªohªÌÑ«8°0ÖTKqII²¥µ¡cÅŠ%˯¼òuþP» €“äíkµÜÚ­×]—Óg¢sð±Ëí«_ýê ‘ã* ñ*y£çŒË³ïhc‰¶ž pœÒœñÙ :Ø¢ñhL8!'V±­öiß³ÏöjÑKEE™Íž9]Œ¨s6aVe ¦§ÊPNÊ ?]~Kw*[?è¿W"O,ÒB£Öàˆh•Nù€…H~’òGÀTZShƒýC2µHg_»ÌöGm¢O³ õ˜ô2¿YÀsîçÛygžgeò¼ïÔÔÞýO?aO<ñŒ§km™nK–­Ðv|\Nù#²iϨ¼D W^RaEÅ:MXLßßÓéÌŠ`CM™´9‡}$ÂZÅ\<=é-£Õ*¡«xÊ‘á‚Ì-y×Ô>©^š X$ްæÍV‹†dVè*oÚPl‡5M9uÖ|›R5Å÷سž²F9,»î·Ò²RÛ³oͳRMGÒ¿àÙ§H½oCùtÑùÜ<'P}°dI­çÈ>ÜݸnÝææóN**Z2þ‡˜,€çtɯ¿‘Yæsõ>mNÆõ½ù¶ÛNÌe^ªN׫«í$¼Î# ²6†áÀQ„¦ò¡4}`ÂÀl¡N¢´Q·$ñçòB×ÚYgžn÷Ë]UQ*mTjÍMMžÉ…€®"Á⌳;Ãë7Öäñ/DMðºE©Î.0½8„²Âtž˜Fžu i¿|gg—íÐÜøÖ ëåÍßïù««j,QW.‹Eëä5×ÜûÛÞú6›;w¾íÚ¾ÕnÿÑ]¶iÛ^yÔçØÉ§Ÿ#~JIkž]Ìȸû ;÷4}—J¥4¼™b¥5ÒðòÄ÷w o¾qßé1•&U¯:¡ãŽñÀ“Òp¡/Úæy³Im F8"0&4¤Ð®gá%,äq Î÷v©"‘·Êš:Çݸ…=ýV5ØhMu5–ªÐ¡a"MÛ5ü‡»ùLüÆÂÜq q"ðgœž¼.,)Y‹™Îξ%ŸüÄíßÑ£ËP.*OÍ÷ÖyúßõWAüÿ`¦gýýØÆI樂ùæZƒs…ÆÌ¯ÎfO*VçëÜ<™ì2/3ƒ²ó5ñ-:u‹ ÂðŠðm±"‰˜°éÿXcC®ÒÂ…ÐÌÜYslÏ™Ü;·Ê }ìú0ˆOzÆŸÈ §dèžò!´øÐë£ùõvD0ðáÚWÐ)ž6ôö¶û÷ÙÆg×Ùîm;¼š iÀ:i{œÌéwtTÓjÃö‘w}Ъªkìû÷|Ûî»ï![ 4§œ1_c÷J™ÒšÕYßÝ#Féív¢UvrˆúŸí·ý=ÒöCò-„yüTJè\žô¶¡)=súNƒAÍ:h¸ä ä©É¡öHx @|üDX0EAzÆÿ´[%é/§fÊX‚Ìsð'„öw÷ÙHãˆÊ3«Õ¢¡êº¶qýSJ+¼iH4&_ˆ×®´“¾Ù²L¿ð”óëÌ®K‡QyÁ%ÂðÀª/Ýß7ÑêÄÿÃg>~Ãß¼ÿïÞT´r%ÞÍxšÁsÿ.¿ à—° Ó³*Os÷ùȼw¦_³†÷Õ'ß ~Òoò'••–”LÈó-r^ˉjÅIz¡e(2XÐÒB¤Ž"VLy'F:_„r„1¸¼Çh( M³bù Û²»ÝöÉäD̘јX }œÎôÅ/ÄÍ/®=F55¡ï!à”@ÆçÐÕÕíeoÕ†šgׯ÷%ÅÅVWßà׬¢c<¥Bؘʽ2ÝW¿ûoe™TØ¿^÷)Û³³Ç–Ÿp²M‘?€iº!m§íѸ~BëÊKË­FÓqlë‘÷¾SÞõ1YÀ•Å‘N•;¼0 ˜c¸A™¢¢†…X„‹°`$Nµ &Æ‚`¾ÝþRZëÂê}¢{üøõ´ê>ýùt«Ê$àD•%ä„°Vª¥Ã©4ò=à²X—%©Õð „n•ÐV\õ@^ k}¼?€…6uGúàþIµü?ûÏŸÜñžw}ð÷º{° Ô‘1Ó˼çiëLÛm7ÍIëˆçüËú'N*)-®€àÐhڸ««±šE5òà+žlŒ1]¤ëÎ;5&2ÈÂ;ZõçšgѽғÀ­EJ&(¡ˆI¼A&è‹Î<Çnûþw4­ÕÜu•âêHäùÈéQ1A€Mï”Ïqžºþ rÐ8°OËl·ÚÏÿ‰™fÄÐr5µu"Xƒ˜>£H•æšJW\.'ÝáÃö®w¼ÝuˆÆç¿øOv`W-^qšöáWº·ÿ°Ì|ÆÒõZ¹—.¯ð:]÷ê(®nw&¦åÝO¦´)_ðbï9|SÄ­r\y$)õ'¸@X6áEÈ\˜‰Rô¥ ð…3qtDíT`b±¡·Áñ ?ò…@YºÒÃɲTŽ»è)2™sa’‘ó°Dmé ‹™Ü‡«ÅC¥e²\³NW‘P–>Ë =¼[À‡jJ€Ðö@µ‘Jño(p©ÀLŒf+’û÷Χ“‰OüË¿}fÛ;ßñþ5¢Ëb}èŒßiø“B¦›÷µµµGkú›Ö¬i,½(ŸË¯Iœ¯Å$ÕcÒôcÚ–R¯ÑmL&¥&¥·Ó‘º1ª¹”Wº@•JïÄ$"S.÷`« åÁËã!w¯Ê" é 46·Ìk›eç,Y¡ñõ ðtK³âÍö¼Ôƒd¡‡‘|0}±´9²©·¿ßº´¾}ï6Û°iuE›oªeÂ'+S¾Ñ%Ëš¸/Už 1JtÀÂæ˜ÿ¢K.°ãŽ[bwÿàÛ¼}Ÿ-?éTKi(Ô)gà½;¢Í9eš&ìôUv¬ äual² x£uÒ²Tƒ¼U]Œí¹óH}sÉÔÿé×AP’ æ`tILðjg^3 ëËÓ?µnކ5ãÖÓÑîžý0Õ‰eÀBù#MOîPV(ƒ'@0›Q,«bL¾„@_oØ@zú!CZ˜Ÿ|.T”¡V9ã“V†€‰&„ÀŸ”rY’›üeM¯)»Fi‰KrùÄKó#§ŠKäña! ãá>4=]Ëú{t(‘} 9†@çÅ]8¸–!@¬a¼r8Q(žc’>T£2EÁD$ž:¯Oøxúf±KÛe÷ïm×É56}Út#"_Ú žÔð  YO÷~Í&ìÒü:y¶÷R­f*åÅop­ÃP$'!çmQLì@ÌŠ!Ò1@Ljö¢sΗpÈî¼ó.;åÔ3l\fF—Öù<°ËÞ°â®Wã~`gJ­DÌï˜SÙø;õíFXt|4ó/û¾xãS¸€q\Ъ,Opù° GCƒ" A8è쌓Ïî’vã7>oMµZµ§ãÐô(°qn  s<…Fª4Ý,ÄÁÁQ›¥åÁ zÛ†ZL¤ñ}™VfÊso5šfdë±÷—ÊÛÊõøŒžÅŽ?RÑðÁÖSX¸u!!ZPå:ö$·%wÞóÍ»¿~â•—½vïïzzð˜b€ˆé…ëpVž;TnX³¦NvéKåõ½BÓvç§Å5#&ïÈаÈY7.®- ­uâÕ¯ÿqˆ•¾„Á ¯½{8ã4NæžÂÊ#ƒgC#Aîñ‚3fD0ˆX¤^Ðæ•5Sìœsγo}ë?´ÄU]j)jsSh–8"þ{ßKü$ ~í¸Û»o—6Ô¬³Ïn¦&«(+·z™í"y·Xç`p#=Cƒy}ù…´²Ø´DÙV¾è ?ì[ßù–Öé×hÍ †Dƒ¾U·¬L‹v4mÈ¢£’â).ˆ¼yºg ”i9â‚è+Tj£nB{‚k0>ÚÞ…(Ì*|(Ž4HËàôþt͸‹‡)C-öµ{ž¼Ë¦•¶hgá Ÿ^Ä'€€Á` u‡1?BGÅ»áldfšåøëÔâ$ÎQÌ—èÀ Ú0*Z©­i¶´9yY*'¾Ü{{¹ mT£¿¸IQå.´ ˜l¯®Æ…®ÙǺžzxÃÚuëî]¾üw¼{ð˜0½–â&å̃H`xgú︱2Ñ—>_„´*70|©6ˆ4ÐÙ£Yí«w¦×pO*NùÑ 0Ÿ÷ ®é¼ÐU|{G„ 3ƒC€ô¢S>q*E?Ðt 2nåCÑ…¬Š I¨½Ï @ %…èZcù93ÛìÔSO×é7›ütÛºê*­`«÷%®}:îzÏÞÝz¶Ñž|üQÏ“Ö|~ìÌÃ;=ª5ðWT„Ê?Ág8€|aÚ‹¨ãæÏ·A­š{ì™_جésü½ú[Ž<9ß0_”<…[D™Ã{õp®Íx]±­ âÜl&RqŽWO‹Èg0$øÀ™÷y }`¸EB¤xL©íÞü¿Þe/¾à•öo_ù¢íýÙƒÖ"X½xá4G}&B¨¬Ê–µP¤Y´u—Î<íÔÓÜ2j×Á#ii{ð§×£yýŒãê[´´9íŒ@â†\ƒ•íŒk5Ô±«‡qÝÄÒ¿ô;–›n,¤.ʧFGF2‡tͽã·~¨¨3²j8ð;Ù=xìauÍíkêƒ#LÿùϾD^é‹$Q_’ï¶—iN«kS=¢1½–¨FyðÚ¸)G'ÒqtŠÓ„®1ñBð.Ôöt,Ìrô_Bšû«,â%N1´}`Ýz…úr¢ÑoÄðÔ Q“XY©–£tÒ)¶ó€vÙijpvÛ•ÿ!í^{zÝã6í¸«‘–† Ø—Ñžg ÊshT‡s"w‚WÞn‡#‚7Ĉ眾ÙÇ|xçn›Ù2[{ð‡¥)Ó‚+lÐ!}TŒ®`zîâNiO€ƒØÉ§¤ãM/AƒURà” ^L £¨Ëàÿ‹Švøá$ṟ´7Y4¦Ù‡¯œY—ŒÚŒ•WÞ'j}M<šò™ ð•‘fï’õ´|ù òY”Úúõ¿°„–cs„ê¸ðH`6£º¦Â¦Nê°ä%Ÿ¾bº‘†0Dñ¾ÓZ ìÞ&]MÒ¸ïŠòü”S]È/liz°o`0“>X|Æ'?ñ±Û>ø¡¼F@Yÿûk^èÀÈdýýÕEZ•g«ÜŽã¨%9½ÎW]!½X«Áfs<Ô¨–ÖŽ wéˤ\ åEz  ¡kRiILJ<¡×¸röŽn•NæòbSZ'bÊVҘɰs¤|ŠS ¦'„C©È/SÚÞZ\RëyvÞ"ç”NÈ‘I~Ï¿gë~N®©Ò° ¾¡Ùy ÐXaYB(ß+€qƧY˜Ñh®x:M ª6x«H+Xy.`¼jÍpº.!«õÔlbbCÛ¼.¯‡v‡xžQ/ ›G0¹Ç ñ70?™0å£Ã°hi}øE„(Øñ xÔÌØ¼Y‡…Ü{÷öõÛ¿d•‰jk™&!)Aåiì”#_K›ƒ¯!dч¶רÉsçºKòYmÂ*(Ñòà?€`*ÖT`__¿-:i¹¦d«}*—rCß…kpçmt¢VHz}8í)%›¤ˆá™ ¤ðî8ÔÑ~‰?ûÌ?}ìðûßû‘w®\¹þ I¿Mx! gz4½<øîWºù毞©³å^!ºB{êæÒQYyŸµÛN<蔆¦Ë Þ Ì-x;tZ„k9©Ðê0†¾aHÏ fñÉÉçiôÀû‰quˆƒyBçI‚#ô'}æ}Dm€£"<ž§ ª¤¢ˆ!Rrä1ÎÇ¡7¤-¯Û¶o±òÞÿèîïÚìYsµ ¨Òž}z½ÕÕ5‰ ÙG±1Ÿ¯¤¸\êÕ…ÃØÑ/u¢ýÅM¡¼@˜BngÚ¨›÷ÄI(kÜK(Õò䱑ŒV(Š”â²½Z¾(‹T$ºâœÈn0½>>Ä¡N]“@ô®úpìaæK ‰9l• 2`¿§/€•êøp¥Y[›S²ÄF2Z å¾ÊFŽxÏÈŒOy½œ!H© SÊm¦¬›Ê)µšûï·Ž}íVR¿D§+Kx èX=,_€Þúc³„Úã–¢Êus8¢¸èpÂìÞßþ<Àù€ûX cB-е~&ˆéZÊ*½oÏ¡œJýÕç>÷‰-ï~÷‡¾ðßÝBü‚¬‹þ%¦w$iýýY¢™Ëo¸!w¹:v«Éô¾ 9|Æóù±Q¦íðÞkH§_È.ê QV`4uL ,ïè÷Þ =AùñXº" ª$üE„iÌÿ@šŒãé=‡– xgCä ”ä‡kè—C1™~ƒP`´yø“rº i•§×°@ç'üÐn Ëq«´‘†·ÙðÊ«Z­èÕ*»´ž TªâJÚ…pEiZÔÕ¥ñºo‡*…`QÑQ²#$cAÙÕÑ©aÀ ¢-«yYqçø¡`‚ÿ„ò]”êhøÇšÀ§Á8GW ŒÎ‚@Y.œ›3(*.] #;Cűž†Š½&ÁšÓTà¨á“$¼ÒÇCõg˜õPý¥Z©ØÜÜhUZb…dÆ´jqÿv™ûIKЦtiY;{5îuX(ŸëeKÏ’¶&àÍi  } 8T'è}NOTíŽ ®\É3¾ü‰àÃè“´RwI+‡pVœN%ö´‚Fþí_¾üÙíï|ë{îÁâe_Šø_ü¢ÚçmÀÑ¡ã#×\säT\€½ñÆO2^’“¦×˜p¹^qåÇCi¾^¸Ö ¾¦PDip„Yýø%Ãò@!ô=îý[iÔqL(ƒ$H“|¡/‹{nÕŸÜS©ó·¨“2xD<„L=þç$ `ýqà&m™ÌLN·¡£»tøÅÖmÏÚSO>jëŸZ§R¤mµZ®Z{8”ÒWæi¬Z#sµRÇ\áô¢˜¤Gš¥ ã9< %à"4È‹¾"F™ŒR:)? j†íÌ3–ÙÊ3_dßýî]šcﳃÝ®M9t#´5´™ÖƒØ]_ Hë$èhŸÁ]š^cr×Èz¨n}E×”yTcT*n½•É/É üšà&´+¤‰óàŒt!¤?÷ɤ ؉|bj[óøâeóV¼éõo[ÿÛ¾…8Åáù£|qd–ÎÉs8®¹æši˜–â^sÔQØvÝÍ×-˜K¬ú^!,žT¦E'ã2ï9åEe% T‰ˆ%Â2÷ Ù¥n:Ã1®¢ (”§k˜Ò;E׋Î,t*DF CùÌ4>QCžø-´u:”|Á«¯:t“’ǺLgà!³xQå^¢óóÇ~fÿì!ÏÊW³ŽÄ¢.¦ì`~ ñ¦'óvjk›Ê4íLÛ)¿€ÉT¼ãA™¼.*Rpsž‚¢À•š~ýZýd;éðGÝóÍâR¡­}ð=ý–Õ£a;´iˆñ°êÓǵ› ¿´]T¤Z\XÉñqû˜^uðŒþðÚ¨LeÈùŽ–W•á×ÔƒižöEÕ¬’Ô{ÿš›4E× S‰vÛVA0>6ä³l¦*×ð ;¤}c#ª7ii ³ŠlMÖ-à@d‰4gàtå´&f‹NÒûÌ]àqTC"èó£Ó¢FE© z÷‡ Å&ZˆèÏ[ªfº¸…”i»>Zm¦HbCZÇ÷ò ¶ÔôÙÏ=ç´e—]¶ªC 3¥ÏÉ'ð\¨UÉ" Ù× =kW¯–¢>þkΛñª‰lî%Jujiyyɸ¦›øˆ©³ÂØA4\ÓIk/R?\q`„3—OLa< ’aw•=é$åù½«â‡*SéýŽŽQðÎUúXÈPW±ŽLy§êžÎ‡ |Už²¥SZ#«¥D«ø8åwßÞ½Z`ò ûÞ÷¾-5åÅZ£¢Hh¼É9ôj¿C "šè =!”R}ÍÓ4muXªWÃÆç¡Þ@HÀ s+„ËðK¬ÚK?Pê ¨¢œaãg»P½†ÅÒž­ò+‘¢¬¶É6nÙdÕš&#·ã¼ªÍ”ܬ»O0K îGÎô9G¿%À1D‚ ¹Õå0 uJµ…˜—|VT†½ÿxíaX¶R3cpH3%=Ý|óRBxËÂÈbz`Hk)²0L?&kŠó8W“;%û&ÔÞ!DR£@NÔ~ŒÖ–©‚WíQýüÈtJW­xBL!.ê ÝH6Úϯ>”¯Ÿpö"Š"z xèá‰àQt¦¬¬$ÝÜÖøä'?þ©SUÞÒ’þB€î7JúßK`kÓÜ$€ûÉÕÇìØqZUyÉàë^qòOnJ4O ÙerήRÏÖ6˦±ðìj̘±ÈÒò5øX\“ÆÿŽpµ ÔÑQnn+Î ”¦À˜ÊDžI"Už^‘q‡…Š:Ai[{áJ£à CBÏñ<ÔÈ7!Çô›š‹ bw\1ûÝe¹кøm;7ÛÃ?¿ßö>ÛîiëjurŽ–÷bÞó ˆZAsˆA§h:˃ÛÛÛ'3‘u 1N°q!W;¤haj"Ä-îãÌŠ#‹Ÿ¯`›²N'Ãä†û¬®uŽ+Á¦M¬¦Fãb¬/‡é:­ÊcÎ^–ŒI_€[‚×]¹0ªxª÷þ¤Þè>Lø µ•}S´š±TLÏ,mD`²³ãÂFuLxÑ„:‰¡ÇuìšofÒ° ¥-ȤÅ1=:¨Í>¾€GpÂôÔ˶e^#ž®*µ%s—Z[[›ÖZT9ݧŸ3 êTß:3€y£”6ü‚·Ð—ºWÙN#ÄaD4{×ø ~ú^Ç5úV.¥ÅO“Ñi*µõ5émõß¿æ#Ÿ¸ŒU—H ViÄüú b~!0ýÚÄÚÕkAE„³æÃ³wîØÙpÿà•âŒsj’m’¬µ55›”njIIYÞôq™–"¦¬ªÙ_ZSZ¤2¥{c„GWô‹¤‡Ab&Õ]è/‚ cMåˆ:@É•6”ákyBiN„ÄÇ'4«cTo¨TˆBì.çB‹qm¹ŸSozuÞÖí0ýöì“a\_,³³¡¥ÅMûqOçóß* í…àÀ?lt'qÀÀjE‡Å0˜„ÔÉ 0ZZ§j©kNà ´]x’¸Tž²C/ñÀ.ôŒ4‘fQÒ@œäñ¼ª×SG¿œØS¦1&ÄhÈšæi³µ6`À_ãU£3öq¨¢ñù°F@µô h"ÕAÙþñQ &ÚéøV{xÇYR‡ŒTꄟ*9Þ*äó(^ËeE%„öÀ°Ã:`íΘ^Ü«uûáô†WI¥ÅÔG€iØÈ»Xýà+HH°åä,Ò H¨¹ušÍœ>Ëšš[uNa•ð¢hÁAàšrkLqá>j‹ã9`Ÿ×©AMJ¬ú¡3†,ºõ(µîíUZÒbºåÎûÃP½jiqb‚Señ†›¦Öqõ‡?ú—dÕg’ßtýkÙ§AÀ­üèʤ˜¸#ƒÖìs×~®õ©Ï\Ö×=ðÊ¢\ò‚šªúÒæÚ!WG6••óê+M˦8O8¡e 8¨'G8P ZÉgZZ# lÆŒ40iÉðÑùÂ!r&ŸûG·BÝ4õ¬LVòêX6™÷A@ iOç6P>Â3Ų`U<¬™Œ¬ÞR”T= ¦ÏÖ†-ZäS«>”Ucƒ@Ä%­ ‰q±"bzògƒ‘e 8Nã¹ôåtíaÓ\ eG‚Ú~)¼ÊSõ ']òHoYÊÎhkIµMoüÛ÷ýõ‡ÿAÊ7¥ÏÿÓ÷¥úÛ~ xæä“Úhx“LÿÙ>[÷ÌSÏ\ÔÙ7t•Fì5L©«ª×i+uêÌò²ò¬ˆZÛà'ÒZú1I-⢹üMŠà#n¿OO9 hã AxF²„rB³ü¨lžEÏ#¼†ÜŠ‹péϽ£<"Ä¢ÁóÐIÈ#Å‹ØCGé44„Í\}YY¥¦âôöj³«}›ÀÜhw}盓5ë=ôhšQ­B<ú(iÊöq%éTξFíÃGà gÚáIŸ9sžùÄ“8se5ߟ—ëÓ}2}ýB•ŽÒæåíš LˆŒv¸Ž@Ä¥]@ D¿G0(„g\…{R#½,õ ˜²«k¥í%•dž{­BZº¹u¶¦´HËKµ ÑkŽè-'xp©ú&r<{)„ ù>jåÌ«rX(ãz7ñCFšCAG„ã̸Ž— ŸcŽ^NÒb!ÑØVåpz±‰yÏLBi\^BJCÚ´D¸múL ­zY•“Ã'ú°D˜ B!’Ÿoü:àšv1Ûá鼑A Ñ^?¹tMV'R‰ãE…ÆôM-´v.@IDAT(Š’+I\žì5„0èÃo°ŠD Ö6kZÑ̶闿÷½ï½û7ÞÏ*ã· Eòà'n'çí·O2ý×ïþ|Õ}?|zewgÏ* Û‹ª*jY•U‡£¦¢"Ë 1jlRŽ-¯›x²÷ÆêÆÍG= ÍT„LuE²JN„ù€ðXûSNœ¤¸­ç¤£WÐÐnFS¤ˆ'Spú9³pK¹±t&¯Çé+drssM 2K§èÔZ´Ì~Û·~Ã/ìÇkï´Ž½á€ÌÚšFq…˜Z*­­l”¦•]˜ó¡.4†Žâ1eg·ÍöúÑ uõ5J¤„{Å`X÷í¶´¦ )ç‡u jÇŸ¦¨hÿtY81÷èܺb•Ø0lT¡§!’xE_Qà"1¡éÄÃ8Þy)Cí¨Õ  µ¼˜3‘±Öé³,%ØÝ?l²Æ4ü)‰=þž30=þàuâVYlTª“UÈûÊY!ü‚Æç¬âÕ”\Ö™]¾L|1÷˜´wªdмøúhÇ!æ= Ï!£,éuë‰aˆ¡‹CP£]mÒö­h{ÕÇá'ÔE€‘=xS#¦ B8!{óuãÎdѧǓ—4êPè'.öáX$ÄZßÛ¥zâ¡© 1»3¯n½ e•ˆPÐ;= à¬E‹GDáEÉSO=uÉ¢×¾öÍ{™e»ý(þ†£ChñÑ1¿Áõ/z×ãw•ßñwœßÝ1ðÊ‘áÌe•¥Õ­rÐÔ1G=eJNL/œä“ꀠéA¢·fÖ…sM ò ]Ó $£Á„€Œ£ÅùCò iÒ””#K Nâ¼€P´ŠsSŽb£Nç’΋51>” 8!k%âAJs\¥ž3çuz·NÒ锉¿Ù~öð¶î‰'UJ³gÍÓô˜Æ Ì-«p¬ï8]«èH EDæŸ3{¾p’Ôʺ2k’°{÷v;¼w—·ax@ [”¥±QohÇb™©Z3P¬³Ù¾< †ÃÙÖ*@¯„‹…Р´ÅÛ£êhOh6m ðèG»§„i“g¡B[ÐÞü5UòÂãŒËê@ÏŒLò* üZ­ª££‡µR°Wæ÷NÑe."’ƒŽ{Ë4cQ­åËÕZؤ—¦¸ÙÃT^_½Ç9þš•¶ÏiÊ3£2Få¼£—˦ÔhÙs“pk:¯ð ÌøqíÚ;ìý¨÷)øŽj pLÇ—%Ë’6wæ" ¿Zµ‰—‰jÆ@ðO`À@[àZˆí4C»C”#bRHå£üzÈP ­p稉𠓊5õçÂŽ)ÞÑpèVYÈ¡5J¯{ ¸ãa,DÀ-”LÝÞ/¡ï26¦[[«ù§Oö Ϩ\ú €GñO(9¾û ~eVø4ƒM¼á=o¼p wè•cÙ§K*Û¥éëÕñ•å%éõ‹ÎpÍå´OƒD ‰à¡ù;äBÉæX½Ñ*OÙcg΃SoyºðN¤0â½Vn¨‚â=Ÿn'Í* ˆãdñÃ6ļfŠ4ÚvX'élÕ¡?ûùZ{d탡¬èûÔ3϶>-–Ù¬r•€.àTUtüÃCUt(ϪäAg×Úmñ‚Ų$~ä‡rbf»‰È˜UÀñŽ2WCT çMMÍziæ> Û*ÍmÈ<&^CÕ¿o»òP‡VëÁ) Ž/Ž/qGÁž1Ä ­‚Í77‘,Â#ÂÔ/< à ÎÿÇa—cÍÂH—3wUUƒkó„ÆîE0¦~ZÔÄ¡£¼¾«TB,­<8ôpÄaÊóÆÞ0.Ÿ“VÕt)&®vvù6hÖæw÷v:óvâóÐ9~gVFÒV† ÃCaíë´òâϲ1=S†)ÕE[ø‹ç’Ó˜šëñN W ´Wm Úq¤¾ó²ôÜïþU  «àÊ ù©ƒò¨úäšÒú¥¼ Xô@¤h_¸ñòH¬G=ñ?êÀÂq¿‰HéÇ«j¦·L­üÈÇþî“ÏþZ@¨]ü¿Œ¯44þê¿zÓËsCÙO§*Vk¶JëÁe¾MhþÚq¦wÏm„Læ3CC©N @ ·Ž.!HÐEÓpþˆT:OJòèR8GÏuçe¹È˜É%FT飲tÉþ”>º ëÓ†JHËœžf)K4¦Ôé·û´Dôé§~nwÝ¡ùú£Âyç­Ô¶Ñ“möìÙZZªå»"ÖM[·Û¿}ñKÚ.Zëfz¨0t0ªóÎró³C¯Ò:qÅÉþòÉÓN\ásìO>°Ö*Û¦kœ‹™/ h|¬G”&Ìk©0"apä•TM³ƒ½CŽ”kLc_1 sÖÓîö>A›©—ß0ÃAÄ‘àZ\*ʱá1à¬é­2'…«?T{”âð+‘õR,'¨ d!t\§ þ’ô¨mi×»¿Vžó"1½p Q+ k$x«/Gyù4(‡¬Ê\Ç(.«Öžƒ*µW')Î?BW×aŸ%ÁéÊÞÊ”µÀŸJ\Ü6{ŽM•³µV×:DUÏÁ½·St ºP›Õ ‡ Æ#„öÁÜí)/¶ÓÖý¡õ]K;ƒê ´éI¢tºw•ò:3+šbøÄKÁ)7Æ\õ©K{;:¿_SQcSJËsêWh%!mÉË C•NðDAHÖUZGk±dRcôã 4 œŽñ©‘³Ö<ø/OT™!±¤7[×rÕ7,HÚú—&dœóIQŠóÅ6Òø,Ð)—¦¯Ð\1oŸÝ¯—r<ýÌãöíÞfÙŽ#Ë­Ÿ´ÌÎ?ý,[8_/“”÷˜·Ùnß¾Õž|òaËõÚÊ ^e?þÙ£öÀý÷YËÔé6 §U°Phc‡X†©¬Ã2_Ï<ç|1î°æñ·Úñ‹–ÚÀ¾V¦Ž›ÍÊ5ΡdUÚbÏéuÕz;nnÔ–žv¬‘‡íÙ;ôz+í /‚sýÆDìÓä`<ÜÕ;Mwtpæ ÷ƃF…€{}s£¦¹ „E4¸&+}çM Ÿâéa/¯Á­úHýC”a {š¦ád›e—^²Ìf´4Øþç]ö£ûÕ™‚:uW¾ IMwlêKÖA©p?¦aA£´}µ øŠÏÞ¾Ð$­¯z˜ºã}Šô1C§Q D€˜«UzÓ¦MW¹Mš.œ4£úÀ}|µƒ{טjÖðÓ>פÂþ‚ÐÞ€§ÛÉ~‹p¡²œ±Éí‚Oƒþ@PŠòïyU&Çø¡HŒ…IêFxº›@0èß?áIÈð0(NÚöLðÜé_é½Lýú,B"¡53‰TsSêÏüÃgϪ¡ºçê~NPü0 E>çµÕ7Üò…yÃ=¹s†G¯Ñ2û61LFˆK»6 ±äŒ €E­s)¥AŽ3¶#@Dâ÷ Ž 1‘ô âÇçêMCAž7XiCÐ/exBb<Ó6ðб Ö;G@þI8•–À‹Ÿ”ˆ1+æ!iˆ!7?û´=¸ö»¶uÓ®P•¾gΟogž|’´l™Æá-bú!ª¹Wj>l÷üð!O·lÑ"½õ¦YB¡Üš[fØí÷Ükc2Uqè1ÿƒ3œé×ÑqØ.¿üR{éK¯´¿ÿÇóî¶ M©‰yY(ÌaB—ÊQ–ËÚ¾C½˜Oêãzmö{õëÿ§zlÜ.¼ôÿgØ-_¹Ájåèb)+çøïÝ·Çq…õqÆÄî ¿Žý>~ÂSúdz+!¿à\xUVÏí£ñµº`ábš·NmÖašUöÏÿòWvåË®°ïÜý}é¶í•ç· 7Åö•[¾c´F‚7ô²2¹}‘úpÿþݪ3'‹¡Ä‡xÎY÷080p°Ó¬mšL| »jÍ0!è€ Ú¤Íþ!ˆƒ)Àð,n‡ÚР4!Žrã 3ò&× m%xæpžù3ES¦'Qž%Âßd<Ï]>>§ó˜æeõ‰põAÊ”!”päÒ’ÿƒš¦xµPô:´¼´8™šÖT¾êÃ×|ìv)ôÿk(€IƒŠä)LèCŪBªGáÚ[®míï¹LãøUû†Vê=méì˜LºŒ¾Š¤”TGðfSY”Ì ú‹Lƒ*“Iü† sh¶¬9€Ü<åˆPBÀ;@˜ §>ò(@‰ aë$PzaXØøïˆ'“­³¼8²1¡˜dp ßÖ=ý {èáÛ#÷?èåÅ__|‰¬½ßsgÏ`Û¿G/ŒìzÔf.>Î>þ©´¹Ââ sfY•ÎÍ_¸x¹ Ê3½cÛF›7s޽æòËí _þ‚M6Íút §ß¢‚ÙêKxå/÷¥¬{5Þ*Ô€Æï×°@¼.¯º˜D¼·}¯´0»ðÆ7þO;çìsôZªã졟ýT¨÷·ôìß·Í^¤øK.y‰Ý{ïwåS% ñp£üûäL,M² F(sÜG€Lþ`br÷‰H둺xxŒpO'zˆîãh/EÃàœÛ½k—Æä£öê—¿Ö®¸êBÛ·ë°^Òi·í™*ï}Úì:¤ƒû s ÆÅàÚͧ|00¯æ‚é™–a¦Òê [ºôwvrÄÇKK3Ñ1>nJP902ø‡64Šà:–VŽ š¥?¦wx.``f¿`EŹÐA?SˆcÉðtz¤TÔã&”î]H§Ó! ¥©>—žJ.Êv¸ô äj•_mWT©ÌB–±¢Iä0Ûºu“mÐÔÝ=:ßNSé“áä3O³³O;ÍÌÑÜ»4õa1ãO~ò Ý·ö¶{O·M[kõ_n .ï Y—¦¨†ô–Û:swû>NØ–Ã+e/yñvÖÊ ì§÷ÿØêå„â„a`/׉5öïµ—]q©-\´Ä~ñäÓ^7+˘®ìì´ÓO;S¯Ôî_ûc¶òÜóìŒ3ô–Ý%‹¬mÆt1F¹úÜkk¾}§?gùïÆg¶Û¾om3x_=ÚÕÖ¤½ub”^Y#Ziéx¢‹˜?b†ë_àÐCüH‚‹#'³(Š>pD»^"‚Th¶´U×—kSbß¹ýGž•Õ|{ö„í͜ݔf }¯bør `(6| È!H˜'稛øòþÓ~íŒs¦‚¹Ã¶Y)€&-=ÕéO»œ6ü^i"a÷²¹XÕ²ë7´: 0¿Ç‘ªâ×…J"º 8‰”[ Iµ[ð›×=ŠV¹÷×®©. ‚ÜćáuŸ–°' âá.Úß§µU‹Oi „ ×ÔŒR„ùéCfel‚LMÊg'’Å‹?ò‘¼A7É Hê3Ié)æï¸ãŽÊÍ;7_<>–»jïæ—¤S%5˜ãR?Y½ú ‚"áMe)(žÃ3¼± ]€ðO¼§sÆ # Q)’¦’pús4òã×üD@³Ì_e¸D†‘‘á±ÿºØˆ€8"at2êÊs(ÌHUé^æúæ©ZUW¡ýõz5•ÌöMŸ¶Ÿkþ– ;¼\¾šfϰËW^hË—¯…8µ{i'ÙfûÉO×jùnxYF•ÆÖÓÛfX_çˆÝ|Ý[&_À S£ãz›­àeî™çÅÅE²VØ1ùg〕ðãXcm“ùš‘Ó®ãp§Ãáfž·dô~¡yÀ/<ýt{ÑçkÁM¯PkhЙýNôK>³~½ýÇšoÚ£?}Èôº°nMûÍœ>ÍÖkHR£ƒA—.^bÏlÞ M:Õòôhš­Æ)qhS…—# ¦Ncæ§?³Ò§Q:Œ4À1µÅ#AºÒ:£‰ [yàΊ”ò霵Nkј]?µ³¦¶Ö ™k˜ "Ú^k´Š9R×ÔbKdYMŸ:CM£kAÒ²3’_:ªÜCVN@ÚŽy ˜WÆÛ¥fC€ìÊ*Š•‚„§ŒµyÄì… S±m^ÿ$ää0RV(_u#ÚIcÁ©òRÈWP:ÃÜGŠ ø%™²WB‘þ &>ü(0=tÎ@dýUèí!¤U`wf‘ÕM\:Ô­õuV¬S´«{`ðùÇ¿¥èä“qd‘9ôÌ{þæod$¾¬÷£×a.0o-5œ‚MÌëÛ @.íÄ$s3ƒj H 4pO)Õ¥8 vT€R…º!ÜëOÀdvŸëŸ{ÊŽáóüº¥ÑÄy½àXqhJzyN2ˆ‚妜å^-baí8]Ò¡ùág7‹é{À~þðŠ9^vå+íL±×Ö6UZ$ë[H}ü§vÇAS±Ð¤¥¹N’U oälr¿´EBÇN‹n]MHK9°ðZëÖÖ"ôÙÖ¥é©Ë/y‘í>pؾzÓõZ¯?Í-$4§Üœ0·Ù‰¸;´hæ;:b»ç M§¬¯»WÔ0a¯¾â [xÜB»øe/•ŲÞ~üzm׳vï÷ïõF4iØÀÌøÚ=µ®Êj´‚°VËt;tŽý†mÛu&Þg¥a€|àkßÞ='kK,ý3‰?>B -ynÃÐLx-¢÷· qZ¯®c µ?".¤÷¾'ÎãIÀ`Jç,ËeNQiÂÏ_&m?ÃåËàèm×€¢†ІçUç‚KúÜÃXE¼ÒŽ\sŽ"°øsêsŠphžcfeÊËU=rš2M9Üßmó—-~G$ô;|<@Y.€B×¥Ó³$Ƶ|KÒþÁ× Çbñ±´; Ž,҆ʭv N #Þ½_Ô>"LÂ7ŽeÅ1ä =00þ'wŽ]Â7F“rã©Ú)ÿããÿä×dLúŠ^÷æ«»u„NmSCSFó³ªOF‹0ŠŽ.´/ƒIäó B‚8²U5Ï]ª†®ÑÚ$% +À»”Æ„ã™7-<ók¥õŽEHÈj 5.á•Ä- =wqQHÛ§ä̫Ѫ4άK Ñ}Ò ›´÷©Ÿ?h>~¿iãÚd8ëì³ìÜsC/T§–Y‡œjëÖ=aÿqÛ-Ö¦eFÏR'J(й9+ILˆQí¦˜¤+sØêB_^Z©U,BZåù~jÛN;~V½êUo°/ífÛ¹qƒæûõòI=/•yU&2V;m®­kßc8eð 0Êi¾I¿!-ô!\ûµëì?ú™}ók_õû©Òˆl â5âØUýši8N¯ «×´ì¨®WZö@ç!-Ç-µqYh¶¦ÖÞj¤÷Ýiñ„€÷¥pIËœu¡Û(è†"<ž/"衎N f K{ŠˆH£¤ú‰R‹)’þ„I°H5#Ìœ=Ïf¶ÍÑp¥A})‡ž!pùÔ,%xñªÇ… ÷@¢ÚÐ’^  <И,JƒnI)š†n<ˆ‰8‹¡_ã²Òb “°Ê³SÚ1ánw×~›;©M›>ˇqäs!äè€W"fW}Ð6ú ,§ý舽оò9d‘±¿!ìë?Ð7 Œ  î?_ Œ÷uãm`˜†/ÜÓFpK:„ŸGpº¸R <þoŸûì)^*A*Q\2´ÏÎZ­äJ•kRÒÎ’éà Š*ǘ礘1fú€Do] gt*P ¥d ÕDçGqçã($ˆÓ3C7ïÑðZOîi”É­! 9‰4žFzrˆccC«´¦æëõÖÙÍ:ÂùÉ'n÷ßûm­>£–f,˜e/½øÅ¶üø¬QBbp¤W[XŸ±ÿàûöðÏz"vÔÍjÒÁZÚ:¤M.tžŸÕëX¬ /À,«CId±KëVXc*o?#˜ªZ4sºM‘é=¬¹ð—¿ørûœ@…Víõk1…äu]^¥sçÔѼé'4VZûÑYÇ>sºNÝÕŠ¹ezóÎþC=Z„¤ã¨´/}ßÁ}ùô%ÂÄ™TT.íÏXº_Bc@SkS[ghARµmÞ°NXÕÔ¡¦k$€xYuù]8Ã{)´‹Kú&RÃSnbö¦ñÜG1$ðh‚K˜6ä OøÌŠf† µ~AÌ…o¦TÓ®+N:ݦé„]VöéDWï–ƒ[/Kød耲y¯!xãÏMh`– éâ0S_V–íbfZBóþ‚­[ž‘ÅX¬WœÐôa½Ô¢ªZ 6uI¸å|Õ!ç7Ðl:©¼¸….`è7‚þq­/8™ºõÔÄÁ¬Ð5×J píLiGöBxN ·d"ÁE±£‘²A{‘^A‹¢†wèfQ'ê6±ðÁÒ{æó‰“?ýé¼èøØ}kÖ\•Xµêö\jÖô¶§ïÙ7½³§sbjéTFja(DÒb/ ì{ºÖŸÄ䳸#‚Î|:‡Fx! ‰¼jp˜¯D «:5% ƒÎ u"%ø uLÅ+1»ßHS)n•iX¡ 8cZ~ÊŽ»§ž~ÌþóÎ[5§L…GªW¯²SO>MgØOÚ¨"ô=ßû¦}û®x¢"iÈ9³gË´ç„!Þ$ÆŠÚM‡ú®1ô5¥ÀbœàqÅAöísVŸ4ÈÒsVÚê7œmO¯ß¨—w¬±ó$PrT_øüÇìï\mW¼r•}Gñ rŽÊ,GCmmßeÓg/´i­Ó­£;œ¬³_»ܨYi+±,õÏ<ªiJp±Ö&ìówí =BI€‰µéà$¯õð[tÖÀ°˜kXÒ¯U¤D8¶'sP ñlQnÖp`÷ž]N\Œ± BÇ9øúÓûU·®ýR„æ„åiަÅG}#„'f¸f ‹¦ã… ¬V$Ì[°ÈæÍ™¯màu~–Šƒ©Ùœf4 h¯B霡¡%ÀÓ3¿ôAYN-zHÌaäW}}Ѿ -ÆAÆ¡ 0Y¯vLΘ5SÒÉöà=ßu4×ò²šjÊ«­Wï(‘“±AÃHÖ2Ôh©r¹81Ä p ãz•:Å7úqæÖCÆðð8ívä f×ønú±^,Ê&ý¢ÈŒ¾‰H¯Ÿ¬¼LizP¥œ€…ð‚Wø ì”ÓsÓ,¿,¬‚_|X¢d*JGS$;ÿBîÓ„Ÿ‡TS}MÑìÙ³´ØåâYUbi= Wpdr!äF•Ñ!Ì®ÀæÎ¸º§Ch,é IHÄÍí€$cÖ;”KGš í¯¼“æyü™ê@ ¸ç\ÚM;µšdöVi§˜Î”Fl·û¤½¿uç6ªáòÑáÜ .°óÎ<ËæÍ#Æ)×É0í÷Üe×ßü G8igÏž£ïœ¿Ù¦GÌ Ü4ØÝ颧À†9”E³ŽÜJ̘³âKÕQû:s¶ô„%vÅË.³9óæÚ·îY+ÇÑÃÓšuéóÈC÷É1x"U+oN« µn¿¶ÜŸtŽíÚò¤V®/fÈûa!`—ã­žxò1ípÓñgƒîÙ¹Çó¢‰bABŒ‹qò°+n朮1åU‹µOo³e€˜Ž!ïDPukXÀ~÷M[vwuùø:f25VpvR]6°†~ ß܃$ðä-q˜ýFqzlà¿Ê€v,´~béÒz¥Y›Úï©à½µCš‚ås‚Rzú_쫺“`ƒN ð@ð!™×}9hê+n!þ¤,HÒf4Tš#0*Çö¦õÏh:±Ë2Åy[Ò°ÌZå ~ä§Ód¥ ûPÏ­¹©ÓõF &«Q ì æ uF§ŽàÏ ¿úÖ½˜Ý°R¤RÅØn¡Ñšæ_à'¤õ1¼Óœœ{Ìÿ ßX¹ ‚>ÓNß0$Ôð¦ç™k|ý¢¼?È&ü` BȲ®ôæàIáÔÌe.»õÖnþó?סÕZÝ›ÒÖÔŽÙzÓÌSëÖåÙqÆ›_“ò`«8J¤IŽL:€±8 áÚB±Xëî 5 ä‹åU¹ª0 ìæ¿*ÚKôöù—Ó—gVÙ"AЀ9eš5Ÿ^/“,%„î×·Çîû®ÝöÕj9Ê:NZqŠÖY¶èøE:åUM¥=£¥»÷|ÿßmý–0>UÛ>µ8BtPθ.™ÁÈf‹d¢6Á ø˜Â¢Í0ÿ‘àÝ/“KÄ "ÔQÑÓ쓟þyßÛq —ÙÇ>ø.ûȇ?hgž¶BºA›bFå€Û³×þüÏ_k·Þúu[¼t™ö ì·Îªnkœ:[‹Š¶ëE³­Xcàm;¶È¢èöShô:r›5w¾û6o~VÓŽÚ ÃH²ŒËi˦˜Y³ÈbÒŽ¼^í¬´þC‡eþO•_$m]Þ‹êÂЗjÚ¯FûûútÕFÌâŒJ<—2‘Q!f<žxppžGŸCðLfQ2²ØdkÛâe'ÚL-Öi”ÐA(ÁAÖýã› ^Šq:Ñ¥'-Sñ>¬”VÃÒA™x÷xµb2Õ‡fVÕ^¦ í–! “†$hyuÚžÝ){ü‘…Óm¡îµY‹ÁköˆÖ~THIð¶äiš>­×Ú ^gNÅ ñQ—Ó€êöS¡€74Q›™¾‹1ášš^•Ó­,GÚM[àðäŠDøtå"[t …©‚^À7G”yÿé‹ö\ø8óÀ_0?‡®²% ›P\à "¶,R[tŽ`ºfÃÖŽK•ýf}E÷ÉÏœÖXYþÈSϬŸØ±mG‚…%Ur¾xGØÞx—4äR+  éJÈ +â„'‡ùCz€"„Ž&/×þå€Ð ³zmcÀƦVMÅé½k"–g×k æž{ÖØ¦u›½œøkÆœ6»øÂ‹í„¥Ëµ{®–·ýØŽ]Ûì§Ýo÷ýäqOÆ’Òúú*-0ÑqQ’ò àÃÅšgw-U?Zˆ˜v«M¾2‰X] ^ÔþLa±‡¿²¢\‹[:ìÅŸaï{ï‡eý$íþ´-šJÌIèŒêµ]Ûìò—]iÛví¶ö]íváË.Ö͈}ÿö{Õ}JÓg³g.AVk8Ðé»ùè Ð¹sÛì̳/±[n¾ÞÛ”.Õ¼ºÞKW¡ñsÂQýããE6¥¬ÉözL×¶PsæeBlzv£ã5øSBÿ°’ŽC3™ê: iQ¶6Óô• šè5Aè—¡Ûü2< ÊkpH_#L–ÛY³çÊ‘:×›[4Þ „ŒÌS×H0²p :eÍ×€O~#å¡çŽj@ ©píÓ|ȼÜA_ž(fÕ¦þÅl>t`õv²™sçª/S¶ñ©_¸¯¡£c¿åtߤ=ua[0Ú˜zð¨ÀPGÄØÔçJÔV„?39¤cžEq0rð_E¦:Œ¬çð„[DJç4šîÖ¬DÀŸóE°4(>¬¡ñÂå£(E[¡Q÷Iã»ß ~SZ¯ë «À–h›s4SõuÅßú×þÜ•f«U‚§ÿéŸîÑà%wÜõýÜôiS“8c0 4øÿ0÷Pv^×aî™>ƒé ÀTÌ zaXÀ’"EY–%{E±˜Øy’òT(Å^I”÷b/?q?ëÙ²¬xIŠmÒ’%QV1©jÒeR¬`A½z¦`€ÁSÞ÷ís/I9¶ã·ÞJù;÷¿9e÷½Ï>çaðf€œÖf"±iŠ™=[a˜jqÇú ÷èXtÒ"B@d¤ÅTLz‘)³§¿x>Qì9Ìô:Ï8÷öè8­r=/¾~T4Ô¤_|û;ÓÕ×\ÃØø<ÓäÐ¥çÖÿ$=üè¯=80Â}F½õ®í0ªãà" Pmd{Bòа€ EqßþÛ×`NrÏyÀŽ{‚3 i¤º?üà¡#éßÜóÞ´hñ²ôÜóëÓîW·“•!ÜJÁK3îÁ|ÒwŸþþSécŸ½7<}.ýÁàÇIiei0Úi€•ZÓ‚¾DÃç…Ø@pª†Ú·'!)I_ÐéÆcc§zÃ1b0SBðo˜…..ŸDS΢q3ì?Äd 4š„“•ÛmrÒE‚# {9zaQ…)­(¾Sx•/ñ*ür_<Ïzì1³~ù¢U±k±.†>lΩyβå’©¨¿ 0B¦Ì¨‘k!¤-4àï»ZF¿}&Ï/ç÷)½Ø=³< Fû Œyœ˜ÉÈ™#©”(ß:|ðiÚݸ@ó‚­±f‚4툊uû ™UZàž¥)ä‚™m6³à †Œ2=a!ò ý,º^ñtÞõž4¦Ka;<„eDê‰úì/ÏÊ7Á༘w€¦6^Na!s]Ú ë‡siÜÔy‡©uKcă߮‚d`™¡sæ•M•¶´Ôž½ëö+—þò/èt„cÇ''ÿŸöúæŸY¶lIÉö}{!b’-ê09dXè’íµñ@P~s…Uà)š_@å¼A#BóóFtŠ ¢+ukê‡Q[[c‘ƃö¤§ñ•þö·¸ŸæyÝh¨²tÝš«Óµì×fòŒLÛäáo¥¯?øúì¼ ú@TŠe‡‡1}¸ÀœÁ4"ÄÆ ,µ æXG5Ø"ÁØnOã%®ˆ {š©õµ«ø©žgâµlˆdœ%ˆ·€$?sÿ—¸‹õ˧¿½9­^2@FA¸YÌcÆ™ÇH‹m_Ôþý‡+žëìêfvÛYÌãª4JîÀ[ßñöHöÙ³{SjïZœúyvñ’VÛc»ñtüÐAæþŸeT` -Ϧ•HþSgÒ ŠÙqT¬ï?Ì3š2óÓâ@Vþ½ãl&êÐé…q,#’˜x9R³,VTŠÖ½þ'ˆ‹}'@Ofm¿Œä©>\—6¢øuXj_Xâ³JµUæI Í„{—Frà­ð —’sÿ¡;yס<-‚Œ}ñ¢âRÄ¢,P«Á$3Î |é-×á`k=ý;ͺ§Ž'³#­¹îvFKjBƒ£‚ɲÀÈ 4B‚þi·Â4´7´“Çì 4û‡â>†ù¨3¯\¤éž·Ó­”Flsæž/¸,ózô/¦HÓhû¼0‰\-Kƒ¸J$šõò[÷é» ÌaÄK¤³êóÇ<Ž0Šgµº @æ•“.oÙ½ïÈÜz8R÷·û'ÿÔÿhñ¢…wnÞ³súìÈ©²ªªŽv޶­± ñ ¾B“ ,bm°×^—Ž>©Y¦ŸCè¼Ï¸8†>ÃR]½ÌÚêì ÌÒt`ßPú[ö·ûÊ_|ÎJâè"HdÄÌ·+ºÒ›ß|Wjï`½;ÆføƒGÓ×¾ñ⣬E×ÃTS"ÌDðÏ© 9ö¯Y/´1·Aó('B…¹Æ0‚9§}ø}…ø!‘Z€ƒ¿h<â=e‚¸bEI®ÝG6`íè ¡E÷`ó¿šT\úe¨r”¼÷S'¤ÎaPÁ’Þg²F‰¸tü8;×°2ÎóFÓ½¿ssºvÍ iªâ<–Esúíÿô|êe;®)ã4®‚VYá”WðŒÍ%#ðYmø~l|±0©\×ËÑG² ^C€Œ£@ šW«Pó]åÑÙÕ“úû“¬ÓÅP,®RGæ3€¬+ð²,êVœÚ<ª—é…ª¿€)7iŠ4^T>E*ˆÃ?¶ßœ»æÀ1’Å —SB¢!ÃOÖ\áã´»H\Æ?öJ”ŠK˜ˆã %ž°½2®•ÚG­µ»ÄáEŸµQBÑá?ÛäoÛL)‹>rGbÅÚ¯°˜€¹ðSs«{â:JËþ\f´Ê>Š ]·UëŠJÄ®D}Ég ü6ì{›wfX´§ŒøØ›iLVôzˆ(óø Cw^±hiÉÎÝ;Yš‰dš‚‰cOm»¦s SØ9:!ì=d QiDz-J<7®À7EÓ²¦êègñ ÆëƉLjÊ?’¾øà§Òø±(†hlË;•§•W®NÛ¶nfÉ N¤þ™Ÿü {îù´Iþåèï[H{Jb,y’ñúË GB ŽÎÒáp¦$ßj¥âÖÁ ¦VÂÓ…|¿°WöÉqH¥ùª#‹z<üADêQÈ™y§)¶gœ õœc<»ói”>=œÎâ ,YA’ï~ìÄP&$в-çmx1Ç/:»:S:w”Ù‰o‡¸ªÒßþÍÓiæÜéT>z"Í6Ð?¾#Äœ}wúI[†¶Û>KœÂ#¾$n‰×Cí5F¬µ¥ sØíƘ¹ \C|–í´ÞXfk’H~MyZ³æ¦ÔƒÅbú±Ö…¸ÇknV.:ʲ„S6Gi+í° ˆ™yKkÛ&lýÏG&SsÙ‡Ü/iwTƹÏqÛ—âÑ8¢œÇ;pPte¹Z$–'ñ½`5Ìx®eÈu£ö^ÕŒÑÔ2cä¦xë¡T€I)A9ŒÚÔ¾ÕðŠq#*¦=8ÚËqÕ¨òÂPŸí2òoßI¹ Ë#(}ˆ÷dzªÆ=fÿù[ë­8 ¡¹/LümŽ„L> yĬQé{A÷ÐažŠ >|˜•ޱzóädí›8Ï/.ðñO|âoI®¸ë»<:ÝÛÕSÖAðF‘xœyf"‘#4TÛdóLjgj,ØÀص«³ÌCkwv3q3ÕI)[_ݘ¾ýÈ×Ó®-»¢œºÊFæŠ3I†ÄcsŸ^uÕµ Kn$õÒ¡9–j>GZæÄTzçDÈ¥÷H£Ìywz¬/ˆ\BËèDg“V°íÜ ¡hs¼ç;R"O¢â#Å=Î ¥pˆcîÄ)¿$¾âû¡ý@¦þ™«ÎÄÖ ŒX%%ʨÃü¿pò`zÇûþ œ›Ò ŸIMu­!(EÜ}*Z1 \‡N!0ßx4©vKkïËxAÔ4ÏåÃ6çßâJ&ô—Çk m·ý>ãFÇ],Ó ’+ù˜M9IJì‚¥i`áÂÈUh`qŽ,\ ˆ6›‰´@5 \a'?ʨ@(3"x”OÖ²ëB{}>`Ì=uUüVÞúå h‹×E—Àr£ßqÇ÷óGí.ν/ÎrÿhŸ8ð:Ϲ³L/“z?SúÕïGs«½ƒ=xÖçm[ŒÁS—¬'BÒ¦Y¤÷„‰× j©@åéÁÖØ‡¨^¾quÛì•õÛÖœ¡Ö2?÷<–!¢y¯¶ç:• kGɦqÛè Ö"ZŸsK¾ÂÈħ¼»×è;w§f.ÏRfɲ®swÝ|Í2bÌë7;xzlìÂï··4ݵ|éÒ’]{÷ຒJ6}ÅÀÜ9krš¯¨F[ÇÑ:v¸½ ?¸‘uâ†1CwíÜ–žøñ÷Òôc«ã(I}ý ;ÙÒðóø*ΛCôÿ©‡¾ñE0Ð0ëšvmìzSK&ÝæÃGÒu¸HÚ1|Ö–Rj±r‘b€ÃwæûR0íö6Ÿð§hoèEi˺ÄBPPñÛWòὌ¤xŠÂDuÈß,„Žnñ±É"Ldð]ÅvÞ©„/޳vÿæéŒ#ÛoQ¬e§‰­”H4}%h s”!Fg 6²ØÇÎ};#Î)³®l›Û›Ö—Œb?‹ˆ-÷#_ Vh¹„%AÁüÏVD=s'.\ #_~.±—¥µW°ªÎ¼€µ&¹PˆÍNÀ›À Key(2è+önÀÄûNþpÕ¦ÆaÛ‚©mׄZVM 1…Å"üýiùúöÙ,öuë´,^äÛv{"¬‚),‹þÈñÏä>ûp<ÊûnoFŒKõÃôÝo°,váèï[ÄûS˜ÇÓ~q‹2Öb]Ä?vÍöðÍR+C24í3R”å"5ö(~G:ëîèMÛÊö0¢=´…YK5QQªûj9$œŒÞ»ü€*jù I¬Éo€¼Â‰HÊ@”0,"RáU«/)¨eª ÌHÍË,¦xNM»@(HÂo¯€ñ7ox.-%¥w͵ëÒ9|ø—6]Ä58ÂZûÍ!$‚X@˜› ]B—b†»°ÉCµ|«õã n{—± Âè7ŒkŸDÍ·}µÍqFÛÈ…Ò‰ÒC4£M *©­a|êä±XÉhÍu7`æ#˜Ùr,úo¥Ô1Mn‚åDyœDù´W¸25°BOb qY€cÜ¥=jvMê PÚÆ^—¼Å]ñàKÑV¾< }Í|£(ñA½!H|„«ÂÌnÚ.µqoÁ‹ýW°èy;Ĭ‹vq]ï[¦ö--*‡*½gŸÂÅ~©ÝE:EDY1ü'ËQ—îg1 7êU› ¡“ûi™>ŸƒsÜãEÙΠ•Ãp-x@ßü†›.­0&”ã+j~¯ñÛûº­ž#D"ÆEÝŽ´xßö…§0þ””ºšO9±©«3<ðÀÜóãgGîy۹ѓ•­­ógW,YV²içÎȳW3Eg:…N°DMeå›¶´hÕŠˆü"ÌұÇÒ~ôhzàsŸ£Ú|ôôö@'[°–;)»5ø¼5b™€é]á5…” iϽY:+"0åp¦bWd"·Ì'pv³ß®Z¼8ídÑ6‚WBQTȤº!Jt”'B)W`ªù-õxÏÓÀ†L–òGtæç³ÙÏãÜó}ëÊê9eä‹©¾L^¶Œo™Ùå€á¨Ðkì|’ªÔK:æ¥aLì˽SÝ® Çÿýì 625ÃðÐå±È*Œé±0¨~¿qö…ýýÌæë&òXª G@×(ZIeöY≾K´Ü±ïR­h9„Á‹ ÀE—)3’ï±eÈ“èîdù2Ìþ¿úê_„+px÷tön‚€|˜2¬+4xj_+ޏHÔl¯¢ËíVrpä9i¨¶NÄ`¶ÏvÛþI¬³Îª8ã—2~`ÏÂ(3‚â_ád”ëájC¯ @Ê”Îl;Ï8y̾ˆØP”Íý®{®P¸»û´&»¦§µ¼V ¼m„±Ü¢¨Û¾ûó­€¾G[¡kúi.Šåi9Ô7eô¾á`¿Í^4 Ä…¹/åOvùdp‡…¹™  ´U¾M|¢ŠLV/éâ¬AâTý\Jä©ò™ÉóÃ7ô÷¥ß¼õöôøOžNßúüýlâÑ“:HâÓ©ôð郩bšÞ©ƒu³ÀKfÙ #û—ˆäöÛW ÏCFÏõç¶Úo ƶÛ_çMœeøTmìqÃÚÛRßÀBb+,ºIÊ´í·o&2IäÂdѢŬ‚tŠN6’ÅÇæ'/«Ù|ÃM7ÕК˜Ö/ž¬+±Qz†gøµhM™),ªð¹ÀJØS¯Mt™á(7ÊðO†.ÞTÀ;´(W#(Íwh>¾Ãê“)Å#ð7õ9Lz RÛ‡î´ í¦•¹¶€@]Ÿ XÛ†¼<¹V”tìEÿez‡ùEò(%£K¥‘G²V·¾`>ú”ò¢Ý| ¶úðÂÁö^ÂÔ¶MyWbpÃÍ®šô 5»nÀô¬¹+|ø°çž¯‹iïù#4ÞµíKÀâ²x‚Çþåõ8C›"P[ÊÛÚÚF†ö–œEòÍ;ix¶¬‚VÊYsýÔiL¿®ôÒ–ÍéÖuëØÀr™vϦÇùnzá¹®’Òß¿(âJ2™[dª½Nã3VÁÐM˜OØ´i3~Agw˜>jGŸ;KÄYièöÌšøvÅÃ{" zÀ¹’UÄO°ÀE5Òøli}:}pOêYvMÚAb‡DÃQˆ×I!DÇ¡þ¥<9RûO)*°²ÿ¬ÎÕ ½ü„‚(7*»AüúQ.ÏH8žÀž8éê@2…åÚ~ È£¡¶"]Ã\…VVÂÙ¼õÕ´sýúTßìFReç.H#XBg†ö‚0vÓáéO8„Ö£ì×\Ïù‚Rbõ1ú”}b˜žkç±$ÆFs¢ÎBæ',]¼ŠÜ‹îXUB‹EÍkù…º²+îçeiõÕW³½Ù®txh®[M¸F¶œe€,`è8u4‘BhS´GøEo{si¡°çÈP“R…WT€Ü佈ç|^ae;|lyÂT‹À¥D¼C!lÌEó>Áµ*çøÃLÖ¡U ÕI1ÑÛÑúJ­†ÜV§b{[K¡¦†©á˜çñ[AC]2©Ã|.Q.ä Ô… àiR°cš2t¥ðWû‡©Î¹mд76¢`РǢ]˜ûÔÍZ]ÚÊÑ[y…z"Èç;0¿‚$²)£½œó/Ó¯ y 8•›°“îè#çy¤B·’*>À­. û™OòÑ£÷ýìñÃ{§+ªË*ëç±¾úyvQHÇIPyuó¦ôÔã?¦ |ô,¦s OÐ;ã4S<Á5ç¹w6Ô¡1˜ç2ã>%;î•#‡Ó܇X¹`¸¹…ˆÈ"0~‡yÒCpœÑÙY"æ,‰ã vdöüHºõóÏ”T§õ/>›ú™ø"Ù“€fáÊòPCxC:–Ê=þ‰ÍM%§WƒóYÐ&§¼ãü³pZ …W£Aô<QeZsÂ9O gÍzøè‰tëí·0hUºjù´ð:¦ ïH_}ð©„-Yï6µT—c J‡FyæOHôZFE·E˜Û·0gí§Môý4Ï]<œ!˜çQM°q 1†þþ>æ··Ä’h=ˆIÈÄØ÷%ª<"⇋²PÞ»woúÎ7¿–n¹ã­Ìp\’Úp.2*¡x•0£mHE)Ôß2à«@€n8ðÀ=IذY“g / ¬‰CÈň'[Ld|èG‚¶ I-Dz‚ pšm†›xµî˜‹ œè·ÏZ¾ï{ßQ(á ­e–*!æÄüjžÂÜ÷$è\ØO_a[tùŠx ˜p_M¯é_Ká*Y«VwØÅ^À¼T ôÁOa…)8ròŽ Jf÷ý(“²ƒ¶©;F´l-÷”Aô+¬YÚkÿ„§‚Àþ†‹¯ò=ÍîAem;Þ©­kü29Ñ?{üàžY·vbÐD™FÚ€Ÿ*ó»[©ËT1¬g´Ø­±ªÑìS‘Ž3Y§‘ÊÚ[Ñfó!ÚŠÔD:è„r’Œ·íäbWäÃ'rj®[UÕ1ÇZ©'2GX¸bB‹¡] ‘—wtuy² ü)ò”òJPθ\ÝÀ:ü;Ò’U×âËvo` ¥?`(CŠ8ÙZýB@ ùÏœû@ÖØžúk"?´Ïĵ7|ûNñȯñH–)€ã;޳ͭ’˜¯ PÞ5l´¸¯?}þ ÷‡I]Ò®$b3VV[5+I°¼zç·“ØT‘¶±°IŒ+bõueR‰.ú`ç¨+–ç{”ìÃËŒ{\A"ÕÀ’e¬0Ìð)™„¨Œ»ÃN=Ï[–ÚWb‘˜íž W‚vûœª—áÜÕ7¬K[7¿{ ÖãÖUa­œ#§#9- ²_Q–„ŒKëÅ!ŸV£}Q7°âäwo¼áçÓ&…Yø÷2(máeð£¶v]Á~joo…"‰gÙ˜kQøkuÉή:ìcŸ5>8ãYrÜ;1„+MŒÀ¤Ð¦¼`*qÊŒ†8¬'‚’´q‚@Á§Ðà5 ÇL«‡Öæ°HØ‘³ù/ó»#4ÚØfÈ*8„‹&¾q0•CYt·„¡íжYWá<únm° kÑÑpº£8˜›–4 › š˜.^U‘- *ýÏôûÛîݶdäÌ陯öþÒY iíVU{÷ ‘-ø5¢ým៸­¹™×Å,¼9¬ž¢PèO21DœŸ&ãè,&m%•ÛY—Þ2 uŠ•sßxÌg̹káùÚcéKxnTÖNà>È¢®×F±Œ °¥DqâÖ+V¤òæ¹éELéÖ–fêÕ$UCR'ñù8lòàÛò2Ò”ŽÀ4%Õç¬OÄ_‰1žç ŠÉ!>’–kaIø ŸÈR84Ãcç˜Ãuþ\Cpfz8¹\ŸîX³:]Úý#mÍùi\@IDATwÇl¼ò·œÅºAƒµ7¶qÇßI›„ cÚ,ëȪòÀElªA]XkË—­ŒõñëYAHa(òeâèð‚á} 2")<4WáZ$0~C:">c,àñù¯%­\Ø—–ÐÃD¦)¼Ólx`hfÅo‚ÌW(¿À PAYÔ–¾+ÔrY»R+x•’ónäËÛ€ñÏ¡§ˆpYá*®#¨ç7ðËæ¸Ÿ97VäŽ0£{Á094D­ªÝi1ûóFï1á“Ö€×#:ïoˆ9Ùo|}Zí¯²1¨Af6–å¡€+Àz¬‘ûð%xås^£ûÑ.a.´!ýe-ïHFºæ*‚¢éoÿ´Î ³â®“´’Àæz¼úÛßzvÿ¾Û楲ê†Á€3ʘµÆ6KÛwíN=øUæÕ·…ÔÓ¼t4ÀûA~ uÈD€¨ Ââ¼02v‘ˆçhú¥»‘±æÅX-3˜‘7²þþq˜ãoù>™ƒUrk0|7L‘d“Güãô×õ5’Ì„Jþ0¦H5†ÜgqéÆ} Ós/¿ š„9¨”žY~-f¨Ù) (ý á‚ •yÕH"Ý£øZÝëñ’’WÑAò€ýôÛÃÚrp AfÎ +X}}šãóÊ#‰[tøÐ¾´gמTÃ܉ ÑRƒ‰Áö‡ÉË#&êL¹KÇ*L|·Àr•_])¥}t <ÈÌ2œ0ÙÜN,–V§™ ¸„~æ‚×á2!›¸ôÉë¾Ï·D¬Vv’m»¶¤›o½# `qÔa‘M ˜-À/MO9Ì÷d^ zFE8¿]¥Fîz4e UMÌ [¯ýË <6[&÷z59"â7ú¦zpÙPL!ÖNKáÈâYÜGß 0VÐ)¤ò´[ž¡Íº#ܦOjg² È»2¶x’ÖeâÌ3pç¨þ<ÌBfV@d3>æKPN†g!8ÎC ¨Õ);Rw­”vGN…×üÇïÌäÚf™ÙAcÀ\| {$‘áÑî0¹B‘½#±¤Ôþsp0.­˜®­­!E¢üIŠOéñÁÁò7 N}îÏþì#ÇŽîýC&êLÕÖÍ-h%÷E^›€ÞÿÀ—Yzë$…±E6ùàš^ÎD«c1L‰×Ú ¥¶¬¢â¬LÓÃŒ·wý³wÆ‚¯nßš^Ù±³Ç‚jf½ew`æk Óe'ÐqC[eú¹·½#]±êº´u×Púý¦Îyí±®¾fŒdý.æxêÄéôÖÛoKgF¯lx>ÖŽ—@ÀO&@xäotØö+ʼn@Žƒ/»QüŒ×dxû— K˜ÄcÜ“YÔ:nny‰:2awæ8k40|æ˜íÙ‘3i/i¼§ÇÊv¯ZÀQ‰%†Ž¦¾½ÃAcøö u.[ξz¬hÔB Î`—m6 T‰ÎúÅ/Û&Ád!…޶ÙH)¯K|2Eh;v˜NMYg\—q}VF åXþ9`þ¹¿úË´¼¯—Ôä+YÁw P&•èÂeá9ûâá·ÿ¢^ˆÚa7™·(œ4]ó°¬mÓg…°Q$ÖìªÎÂÔw]"]cúXW¢iqßH¿ÈÈCx”Iõ<ÛÒÓ¯ O®°áË |ÚÔ@$Œ-£rOM+ÓGûi·£V1¥VA(sƒ³ðç¡ñ0ù ôªÕ]Ýèµ{¼Z¦´+_ËÌÖuð»X0 hOøšö)rIqX3r\èW¬,ì¤ÿ¢†Wá( dr­£nŒÃ—ö7Ÿœáï:PQöíè:â~ÉìSO=Õüì3Oœb›repå Œc¶VÂM’˜&AÈyÚíŒOW/ØðÂúô¦µkÒ¿xïÿž†ŸLð{ÿ‰)¨yë'7Á˜ô‡xt3‰2W\sCzñÕWaœ ¤ŸC9æ q­Ëž Õâ!â9Þp%¸G@e²õL(|…Ô…>C(™%FÍ)(ý ‰Ù~=Ý©pæ±d)›3œ‰Õ‰vîJ³,bÒÅœ§»Þ|qæ–e‡À‡àDôÁÔà“ѶDžÉu«o!ñjùø¼¦ý¹,q€à"¼3±f¦µ ûáG³´¨å3 ìDN¡9·S¯mHh~ÞS»É”<¯©áeªýû÷§¿þÖWÓ ·Ü£..j¶Z¯–À³)+}Ñr<±,OµJ„]$êx¼VîŠD¬‹âL;éÎö©ñmŸ}áB¸æ{ܧd™ÁrÑf!\‚ÁˆÚ«‹ŒÌesÙ¿jwŽÌY—âšß2¸BRȶú®i¿eúK0»ô¦àÕô—á#vüS Çø=ø´\Ÿ ‹€ws™Âz¤¾\ŒO]ju®äFF;³e©f0Ï#â6àÀïÐSã£åQˆÂÐoñ—¿³Kd\CøÙ×  Â@mjjªÀ2üLŒpcv+`ݺußý“OÿióÜyÿalôÙ«eå× Â9žèïH͘汀&¾*#.C$ˆP‰Ã Î4S_o¸b)¾ÿ¡ôÐw&£°ƒü~ž(Z²Õ’!ÆÎä]qpKÒ«ÚnÛ¾-¢× Óãë_&ÿ`CúÝ<ýÒ/½'}ík„6´SJ(³¦ÌØ{ì4Zw˜­¼§?M#&w™h $Ï¡NùŽ¿A<þ”³½¯ÐÈ3ayË7•Ï®'ÓcÐMÇpmZ›*YzëV˜™ 2ÊY£ïr¬Ú³c÷æ4ŠÅÞÉrS‹‚X̧†À¬É¶Ù7¼ÔÇ»Hœ`¤°!Ár´ëŠUWF¶¥›TÈ0j%ƒDA 6Qj.0'…ÉiÑrµ\ /8NÅ{öÃ:eÆ ~èÞLG¼AA/J`—!jË¥¡…¨£·§'Fv°s5ý5~ :ž ¸Ð¤ ƒ‚]B=oT ÃÓ¦θÔíã ­EgØ™pÙwÙL»×˜—Ãjã0Ñ\·lræìÓ¼v쎅·ì¯±,µph|ÚÙ䶪ÑyBÆ“Ùå¿ðëelh42W½Ï=“vÔÈ2}¶Ú YX¼&Bh8 Føöúü¼o2ŒÊEÜ„€ñ'Qéõ @ú¶î—=­¢¬½í¿khÙ/á9 â˜BÄYŽˆ0-:o¿¬3P®{DÌJhû´=€ä ûlÌÐÓÿ VpýÐ…²‰` ¯šÁ7Áº÷D¯ÙLã›D„ àíÚÇN7ݘܭLRaâÏY§ãŽçI ZÑ׆Øwïé-R #gGI%µƒ0Ñ8«²ÿHÊX½övõX˜}ø{éùñíL,rÒË1ƒí -N0Lø•/þIzÇ;ß“:ñ=‡OMuÌt«¯ÉQÖ  ÖÖ&Ö Ün¸á¶4Ð7ÀvØgD!®PæÐ”ù½œAÏ%h)¾ ×f¾ãûÅ ŠÃ5ÇŽg“üJæ@ÜÔ³¿ŽÄ˜I‚|'Ò[{?3®¼sSóü©‰rݶzd|¢CˆtÂrËa|‰í4Ë{y8‰êÎoK è_+„ÙjáCT µL¬ýâr‹–\ÓÌ‹¶B$j¨b»cøÊ®ò1i?ôs•{{!ûÊ'^rkàY÷ó=›­¹™o<õ•W§—÷îbƒÏ½©] ¼«ëæÄ´aû"½X®´§°QKY†iºojíÀ÷:~ÂtÅ WŠgMïV@ÄP„.}UIøOÊ÷ºçjoãö-ß²ã7…yP¡ ©&÷£0V64’rÔÔ\sàh9ZîK+ñÄ}~ÃE8G¶‰„ÏQuE+ !øÂ3·Á@„íÈ.—‰Ú›¾®eK†W k ùþ=Ì®€°ÿ¡ñy'h‹Î [ë§í($—‡wUæú†9i` ç1Oy+žãxâ‰'fï¹çžŠ|ä#ã¿ð o_ˆW°zââ¥i$tiøDT`ÇÛn=°?MàŠ€Ú· sý«ìêw Ðñô&²«.aÚO18­ŸDβ#xXÝ8?]½æ–tpßötË-oJ7ÜxKºë­oa” ;½ôÌbg¥ä%´P+ûâí:œ–.$¡…õÙ7oÝsä-‹B1ËBçÆ.0SŽUx껆öâ8‰#@h0zj™« @ h#ÊÉÌà3"Fs‚äâÉ“g°€Î3&ß”Ö^·6­½–M,æÍÃz¹voßž^Ú¸žLÇ)ò'š†sôs•`ӛà nZloM›‡ñë ž9Éi͵7’iùæ´îæÛRY•nr"Ad£rn{âC›m±í÷$4"§…#Kc<Ž·Bªçoú-s'@“<æÇò=ènà'àS(#„gáføß<$ñºíÚ\ÖxîÉŨ@%.Ýÿ)üw‰¿<õ-\‘~ðý1éèÖt )¾ Í`ýæ¶”ž)«B²±òn9‹P®¿D½aB"T.“”R ’+˜xàèÁÔ˰à®CCH_É–§¥lNEâ·ö.çF£Õ,æNpË–.N -ÂâhˆÓéÔ©ãé¹=Ï¥ƒGާy]©©»/Õ!ñÝbË]y% W‡YÄ(=ΞÉ=o݈–_¸h9Ë¢ÍÃ}©†’ õÙeN›¨fùl·ÂÀs™ÎC&ôBQkÛv >oÇ„.Kq"Bmðâ\áby0RÐ$?„C€†f¦…¢NŸ+¸PVÏ+>«pt*¬–Àªå«Ò®Ý{ÓáÃûà \´h18^ÄÖZGC³Ë¨¶%›ù2sA{£íÔ‡°mO1O½ËÁ@ p´ +¯U3Ê  Cg¸’] ËÜ2ŽíÒÇ;Ú6üh…ôýæÙbDž‚Á5ÌÂ}ÝÇâ€gcÝJc0µ jx/’z€}v²@V÷D„èq.\‡ü¡u´Šx0°}ò…ýö¾ùaÁÐæ˜+ƒóQêâ£ù AM|áX zªà9ÏìÐ IRÞœÚ6,…ú…r$>§BvêþéÓÇҩᓯÎùÝiaOGðbí§×ÁÁÁ>¥ïxÇ;NòSŸxÅ@Þ SÞ@Ãd’9ø{oºumzè+û$ªM4¾ZŒ`ëœe–gR‘…Ο:“ ˜êæóî˜xGçâ´yhwjÁÝ¿7gv³•ÕÞ¡½Ñ(§‡6Ãlb“4†ä¾Hb’®‡ÈS‚jº)5m¢ãÇ l…½wA&»jÉòô EšîáOgz B&¥?õiv}• ÚÚ›bâS>¼;ý 3ö¾qㆴgïúÜùô‹–4“€é™]§ (R¥â˜w²4•Ýèòïz,1 ÇhIg'“pˆ[(ÕEœÚ#4ÔPÀ§ Äþ@2Z_2iÁŸäAŸ‘Ðc¬]Ä+|KH<¯Ö msÅØvdöQ‚•xBpÐn%~02·‡Q>O¸ÐÄ/©¥¡æ¸ªP–ˆ/0ó–áÌ[n¼)=öðƒLmnMGVL×_+³?aª)„³‚‚ÒB“k;, :¡¦–qeTgðÙVMá—‡B j[œŠšTÞZ5ZZ~2cäX™¦0Œ9‹m ®‹nx_…¡ÎfûLöíy\:ajª;ݼh¨å“Ÿi§0|ÇóÒŒ o^¿»%™ß¸K ÷ùOý`$à«’ :¡Í£ï¦!Ëì FM|¿ ê…@ã9a•M|º¢Å“´ƒkÝÓféåWÃlM… %>v’ ;³KÏ£ØHÝÇŠ=G ‹Ý.^v¢͘¹8k\ µºí¼ôów ©ÁßûØSgNž¹ N×T3¯¯€´0'‘Âúr_xàëé,»ÙT²B>]-‹}¸§»ë*±Ùà›&`ט6ïØÅL¸zÒ…ëÙ½æTºç×'µu.I/lxjOÁ¸ iÕª+b¼õÏïû£4Ž RÜß½¥©³M=`öi‰3G¤HÆR˜¾R˜o «br >3ðV­º&mܹ‰E@ŠD$ÙAG5&Ðy\ÍTçìŽÔ@Þü’óÐÁCygî»mT ¾—åŸeXOP<²vS³ÁlË(cýí¸«V^•.ŽX†RYú®D%ñ‡FÞàn „åOM<™ –ò²Yë0R6q½‘—~âyÊ28'^‚E-ƒkbš«¡]dû쟂n¢,Ûz‘sñ&q 'þæ²¹§ òEX_Ýv©™L€=Å(ÍÓ‘…yÕ7§_½çW!ÊF¦i¿Äè@]ÔhðO¡­Ð¡P>›¿j6Ý G‘BPÝè - M“¡l“ FÂJ¦Nšî1„,cÚHîå¨<ú—{ DÍwLQø<•¢!an5Q}5óQv]5¢YRÞž{æ»P`ØÎG%ØÏäžOýÑG‘ eMžس$ÿt@ìlÍ{ÎGwN¼‡„ê!KàšÜ!é¹.aŒ0¯ ‰M*œv»gïÉ3M3åX`&ïêîJk®¾&]‹ßÜÜ“œ^Ù¸1½ÄdõÌA ‘,o1L|(azQgh/gká5A6¢«ð®¾i]ºåö·¤µk×%gÎ52Ïö…¶Å» _Šq8Æo»á3/£±\ó[ §…“ïyW¢çñø.š€^PëÈ2µÏÓHKÞ/–~#· …Ú‰xÆ*sÑ2Wf|É=ã\í$1¢µ$V\¸ÐT±ßõÿíÇ4ÚmóîÝÌjœb—v²;oÕœ¬å@ЏðÒ¢Ê„Ž©ŠÀÍWdË£|ëwè/{lw±føÁ™–AàÆó†ð!ì2Ÿî‘3è²jùâ½Ì} ˜Â*øp#Q,“àUÒÖT¸ªA4_AßEÂýðñQHºᎠAè]LO›„s5’áaü€o€}s¹/ÂÑ g\0½ð5½¾hØgéÀ97ãX)5O”h ‹²‚ìiüþIFËFΞLÇp­ÇvŸßÕ•~õýïK·Ýú–ôå/~æ_®¼âj¢£H“l’²‹ çÊj뛦Ù1ëÿøià‰'6~ëøðÏ:”«kX\EdxÑìæ¤‰Ðs,²°¿?Íg]øS‡ö8dÅAQ)ym=5 pØzëø‘#hã«S÷¶mÞD Ù<þÜ}õÝÆYþ3Éa{ï©Í-g.ŽaŠOcF¯ Aæ¦ç‰˜t¤T JÉ+³¸ÅW%÷ÇX^«•Ð.¥=0óµkׄ…LhbîßtãZ\‚ÖüèÈhÚ¶åÕ´Ÿá¬šú¶Ô€èg”AM{âëòÓ<ƒÍÚ4óõÓH?g/ùÑ‚‰¿ìŠXÞ»»·å¼›‰9/"–dF W•½‹‡úÊcOâ3¹D&p’Ц D+Ì%(LI.á`ç+lóûÔA›s2½õe¡(Ðç·O¡Ý©ÏÃÛöMæQð„ð°ä f´„h\AmdL@m#k¶zhõ˜^[Š+×ÉÐÚ«¯MÏ<ùHzöùtÇmw0ÝyuúñOž.˜5ªZ·¿ A+¢™Ã!-•Eôß!îÙo¨oL#ƒÑ/ÍäIMÆ“|'0BÛƒiyÞ¾y]M©¶W\„™#H¿Á¡ØÐøÐF¸¢¹o}a9DÅLÌœDù!h(7[I61÷KˆŠã¬±u•é´",5냹ù0#æþ=îQ˜üÜ×|×…S9(HDôPëf„ ûÂe«ÒÊU×£¹35sa˜5JpüÄ™ãðܹ(ÍiÍ5«2‡†qÈÍOGOïIÿö·ïÅ]=—NžØ—.ŒÁÒ>D.M7Ìi*¯©šsà½ïýàOå¤Ûo¿==¨ª¬ÞÂÁ¡¯jàrõ$ßÕ!팋¸ó s©áîXwKúê—wGPÁí®‚ÙGk>òYÜ‚­;·Æ*3íoz Ô΂ÛŽ;˜FŽ Úßn^w{Ú…PO™­Íóc_¼¡­/0ëo6]¹üútü䉨W¯nN ˆÄ÷â_h‰©Á˜ô±µØ<–ŸKó1¿‡¶l! u8ÝyÝš´ŽÅ-^:ÀŽ9ЉÏêºÕ,ËÕÜž°••# /âÛÊøe˜Y¥LÉ )ýGX3ߣ@Êu7‘o° •só*™(hGb’¨ýh˜c³Û$ÿûm»)ËU0<ÂUê!dX…ï«¡%Daÿ½Æ¯øÃ‰¼.¬ ÁìðL<ïãÔá½,ÖÉ¡Æ ßyº-D8Ó·VXd_ÝgÊ ¨fœ*ü Z…δ—ÂÀòÝj|vzAº0r.î[•v2D»þùgÓ=ï_––-Y¬“,T Sæ8†L­ß®çU5 šìÎUÂ8ößµùí¸ýˆµø¨‡Æaé§ÓîÂРˆÑá9³‡{ƹ‹gš½f}Xšë ñ¡í®Ë®@Æ“åiX¾CwávbxP{*¥9˜ÃsÚ£Øß 'Ë¡¤ ZÏŒ‰„6DÓ)t¬*¬<ž‹v„®Ê o™¡Éh[Ž™dS^¢‘ #Á„sh‚ŽeU3,•™]üåµôĽWÆÍÓK+Rÿ¢Åh¦“i®À³¬Óøìó/¥•Ë—“:Ü«!Õ‘2¬ynš¬É. W ]­)ü‚õ5¨3"û;çЋsC·@x›O!UH˜©§ôvìÀ¬EeàX¡ìró Ÿ+ Š,|†8×­×¹þ2¿L°„î4IØÓYkg¡ë¹š]<ÃËèоŸ°Ä/Ò‘NX |«‚ĉeûòÅ¡ýŸÿÐåî=Û ²> cϤ÷¾çÝ©¸Œž ˜9d­ryá…p>¹ÍocÊüù3䨬Jl§ï£S••5匰Õ7·ÿëÝóï¾48˜Jù ’ßpÜ{û½Óƒi0õw/ø&Ûl|qoß¼#ÇŽÎÖWÕ”\ºLÀbšK‡Ó{þÕZÖøùôòæéÙ§6¤3°¸è¤ §ËA”ŸŽÑ[„ºét>øÍô:ÿ§œñºÍøÚu^½mÝ Ô7›¾ÿoc>jê3l‰ÙäÖྫy+‘Œ2 у¹iíë’~½;ÈÎÁµÞ ¡9¬U§ÐP°!ûªfÏMÑR’h@.E0»PË÷­'LV®ÈüÞ°LÝÉ!R–-›~gQÐH¨TÀ}šeyÏß¾/Ű]µàªÌ%žò$pÂó¡Ì R 1‡P³éª–ŠD„ Zí²€ÓÐr}bg w™Ü!@-,•Büó[`¤#Úg§¸W¢¼jX‡á’®)™£fÁîxe#÷.¦#¤Ë7±*“Nã,ýžfôÕ¶«5vt’© XÃóìÉCéÈ‘³­­óÊçÔ6LÖ7´~øC’ùo/¿÷Þǧ3•Ùå׎ûÂB¾øÅ¿øèûî#ß›š×Ò\ÞÚÖ„eÐFö™|B‰ÖJØ6xãæCûö§þò $„´…T6ºé¡Ôvt bä·@†Q{U›+Àg~[Cºrå2öq?“¶ïB2³§;9ò‘`ü+Tj¯ýŠkM˜Þ>'R‘äuÄ$(ýúJV=“Ðh"SÐKœ "ÂìÆyÜ ÈãšÕkÙxs)btÁôNÂÉZ5h–~ˆì¨Äzh…eHd2\<«V’AaºÜJ˜šrEv¶âº]áß•ð%p¿E¾šÆÃß¹¿kÇo‡Ç0ŸŸ‚Æ@ŸeY¯ýwƒo‹C Â…ŠL.‘9.ïxMb íÅ·ÂJ·Îvù‘¹YãiÎBܺ‡BSHä”§usàÀ¡ô<ë3>ùøß²vãxúؽMwÿâϧ-ûN¦Ã¸eöÎEµìCqŠ­Œ­v83 5zfl5·ÌïlEéF&Ö÷¾ ű~ù×ø€ZÁ/] 3Ë Z£ülòoƒehÄŨ‘£¡VA¡OIÚ(|øÊp6üvž‚<™=>7c)ÙÐu†ÂTø{Èü ðõÒŒ‡h’~/Ñ.G§Î1ƒÖXš£޲Ç—od&é›n¹-fnŒ{j0žœ<‡°= ý²H9WàÇêl0åàœmn›WÂÒóßXÐ?ðoÿù?ÿߢù%°8~ÊðʱcÇ´oÑä•ÑÒPÿ{;:kΞ=5[]]Qb.²ÈÎþ‹ß ÌäF½ zRß’i?KzÕ762ÔÜ—0ÍΑ(äráƒÂeyȇ¯ÁX:ìðÁ b¥ÖιFgíD€I Ñ&™*KK¯*5ý’2a8Á¦†!<{'’=.C$2´A­ Ö·ìQ|{¶&_B”µ£‹Í.›X8Ó`'„cÄ´]°¡I þµ%.‘íàÔ­¢=¡9Ô¾¹©D$´øÁîB“Ñ´km-k+FŸÉKˆºc¡MMtTÔãëjsµcÖìjŒl18ãMFÊ„‡Æ·sàJ³>ö2ÑŠ;ݘˆPwÌ.ã…‰.œV€?û­€±ã:qšüžÈ€¥¾%dû¬õÑÓÝ•èL«¯X¾ü…Ϥǟ}.Ý|Ëuh£ötì¨æª f<^Á!3ê·[‚&½ÂM¼‰akÒÙE4^žjXûÆ“ÔâaÖËäÀ*òö}ŸßyŒ>Ǥ<¤W0ûi/çÑfáÚߢeî鮩±eÌÈÖ£Ÿ àa~¾ðÕeŒ,>`׊£caú‹wÞ³¿¡õ eQ)p7YàˆÃKXËcËsh}“°ngN¦ëðI½3,~s slô ‹Ìð ãO\`²ϪXuá0v!“÷rGÂø$¯¤±©éòM·Üôáµkß|ƯäcÄóµƒ&ýוó™úÜý÷?°kÿw?úƒOµ74–·3ã®-ªvW2Aóº’Ü}ú8œøÒçÓoA: dÅà-2=ÉA4¡µ€Ž•W0ªŸæG6ÕÃì7R›‡|ä,Þ ÕÉy±Å@hNn:f¯O«äq#˜òj*ÀEš‡×=*Ú 7Üœúú±!fkD²£¡˜P¶—¢ƒb\ž6è†ÃÑÐÊ3D§<™­Ã>‚óh^hpž Âö9Êô^L†YÆIÔÀU ¡™íÖÜX—Ž;̬F‹B¤SÚjÿqX¯'üyMó«½2µr ⤯‚*ûõ²6²>˲NßuáUÇöÅQXôE!“pÀ¯„X,Wf–¾åÛÏ!ÎH2'´M5´oˆŸKüÍ7S1Ÿÿ룿•~îgß’žÛ´7(ŒM5?vü0Á¿!¦\cæcá€vý J1KŸ*™º_Ê&ZZç(WàH{¦hAyWK–Þ}÷{š*IÄñ_Y^]±bÐ!î¡æ[šÞ=oîÜr©A"×ჹ†¿¥5­-Ò_Ñæ ^Xº2ícÈÏMBwUZj‹ § û€#ƒ\&IC€iš+¹=70”ý² +ZR…4×%d“(˜¥¿Äúç†c$ÀQ… 4½mÔL4è籌ÌÀEK#ñ¨KÃrЦ¢õÙ>±U‰ ‘å¼f{C ûÛ~ñpî7ÀPáÐnµ¥}ÓLô=ŠrÌû~»Øg# J%ùnàTGÌmðä~˜Vß|÷Ú‚I(.*ñËúe4 Ç eLÆs~e¬¢d0ÎÀ“ЬíÉÈ{:*zM>q†™r¤:´ÏñÛ`^º&kA« Ûoœ ´ÂÅû2±°‰²óT–‰%rŒkM /A'ްµw´…€±= ’z†ÈÞ¦Z=¼›¬Ô=d˜Ãõf´¦¯ªTÙ±àA)2¿¦´¾¾’Ÿ#/l£î’©ÉÉåçÏ —ÏsºÚºÏÊüîÎ-Éá§Ž¿WÜ}÷ÝÓ¾ëÁ²»ÿåÝ/æÓŸþ›•‹ýÜãÏ=3MFUÙÅ9nûM§CÐa:i‡'ñÁ\ö–›n  À&Ôt2#RtÒ¼~ÎÇ## ¨™ù—-ùªœqA“±ÔX äœ;Ûl`9%Ó¤WØ1‚+×’j¬?ì”cVf®½éÖ˜gï$M&MB××ËøÉíñ\¶/V·•K—ÛÈ}ÃC ¯×û’MrÇû=„‰f¬m&ù<)œÏ?ó|ZÌú/2·`É’ÅYEÚ·{7VYЬ°T‹3ʤ¢¦æ¶L°2”5(d¢¡W8!Û Ô¹óñÍÎïÐV3„dÖ™Ìì!ÁjÆ!C¸E¡i~=Ï…UC¹¡õ!æ]V8Úcõ%"f®;×’@EF“QÕŽsçÎ'9…U‘*KØ6nCÚ´yGZ}íuÀ…åÜaòǫ́ŸâÌqw­'·†S7M{•9+;®/ÄÝ'A/ ]ßµ¬â°ž8T0ð‡òÅqA™PB`š?™f3<²5jÀ—á¡[û‚Q¿ ‹®•8U8X®Z^«)ÎÅðò€ „µóü<| ¶—´žëXH¥æ×ÝŠw©7\5Þ‘víH;¶m„†‡˜2¾j$^†Â«¨„ìK§É ,oh"™‡áu$À04ÿDKKë¾ï}¿¾žòfÿüÏ>{×ðð±?¯¬©>rÍš[?j“|ðA2² íóBáø{€÷¶­ÜV’bÁŽ9s>;^Ûϵ7¶”\ta>f€¹j°te§E¾[81"ÐÝÕ™V¬Jû¶m!À&– Ã\úÔ<'‹ØŒ`NŠ,!“onFÖÚ^A3§†ôG¢žF>ÇIN—éñ³«@Š0–€ØEIΟË;á\½æzV^ÆŸya(ÍÃÊ =Ö-¡’ø¶5@˜ó<Ú–zéÂ6“øxZ/&}D 4߇Ø$žèDá‚§Õp$Ê]Û6¥jÞäáo¦;î¸3Úðä“O‘$³41¹4Õ+%] ÿ¡ BÕ–²Œmå<´Kh&ˆM£Ï)qJ˜º?ÁØÔ­©n€N‚–¨Ùw§¿ô1=X…U}¦ŸAܼ롵‘¿ m ƒZCº 3þêúÉüÂÇs.]ôõÏЬ€¦ÖtÕÕëBÈýðñ§‰³,gNG[ÅïËC…áöæES^:1GßlÒ˜So „Q}àhŒDØXKŸ¹–ë/îÙ$M|q¤ñ¾{DÁqÏ„CŸÃ N¡Å…%æ´ðÈÖ#&>pVÙ€¹‹ÌλÁ´áe² épDÆf4߇¡ÕI·­'%º“U£jX¹9[ ¤G£ÈÄ›îÎÉ“§ÒÎÝÛÓ†WŸcâÜÔÛ½˜mã—ÎV±3Bf†ù³¸oåMmmå5ÕM—šš¾]ÛPÿWÝ‹Ÿròžõ¿ÿýö+}ðW>üƒgŸ}vù7Þ8I[c‚ŸßqóïüùÀ 1ŸýÀ>ðØ'>õ‰Wúû{¯~é•Í3U¥ÕÉÃÄ” @BX™A”æ³3µé¦ë¯÷$/à2€Œ1yÆlƒP ­à]þs BQšj˜/¡ñëHÉu®¿f~øx =:&4äàª!b uŽ&áô0é„¢Žù=y'´aD†$šŽÒ@00”"Ä®©ýÝ»oOzž„©/¼ÂèICZ³|ÕL}]õL]] ³ôÚÊêÜ<×nYå¥úÚºgëëa1œGÞÿî÷ï´<}zåµz5ñéOÝß½ ëw‡Ž›œ(­™¨‰¡V „¨¨KDH'u2ö¾ôÊkÒÎWÙ^ifv–þÎ%‚oçÑì-¬)'c¤Øj…s'Fa("ö¸†µjæ  ¨âÚøšøN³5C¯…`™KˆÃBADš‰±´+¨©0^Tkęͤ"0g`‰Ûçã›vXFŒ­ƒ`™Só?>”BŽû2èCÓ‰ƒû(k&õôõ§3§ÆÒæW¶¥+–¯À§ŸŸ†X)g’YYÛ¶oOo¾óÚ«u#C Q©Mó 0Mtµ´Q}ö9À¢æ¤ý2‘>©šÙ‘…€De¤ÚlG­Mx ÓÔ`5|µLÏ}¦Â ÌVéUuè“À—”ú0€ xx"ÓqÍŒC·4s²PÀP˜ÀÔ2·ÅÈ ÂTaÜÊ2³„®%„ÊNmd²5Ö7§]Î¥ý‡Ý e73.[H^ A¦>––ïZ¾p1VCy\S@ÅP¡F4ˆ¥¦š_&´µ´Ã~>ÚÞÁahy`áoáSÆP«k „•äo]Í£™]¤X &¿ =;~"}ù‹Á>ì(«Ÿ‡îF0,g±ŒW\¿Ÿ³žF™ò(ñÁÎëűª0A>ƒDsj[X"{E@ÛkâÇþƒ¼>h dêUøÈ¼Ð_™0äÝHÁô*÷Ô® €lÊqÏë<£f“°Ô¸28 é®÷ƒSö,4‹ÏrÙ<‡çžzйíeL7îOG â íÝþÝF•9Û½½Ñ^·‹³ú|1ç=MñlÊcq>ÉØöøT›«ÏžN›6nJ_üQª!9ìMw¾5-'@¼k‹´À@Ö¥åÂAP,_nùÑÚB›öê~؉°Ò mŒþ™×f6ëeràÃ'§7ÔÀ1\ƒ0qtÊûÂ)—à·çÛ’ò­xÆ6ß8w÷zÁH÷Ûr¥ -2‡{-Ò©æCC{Óú—ŸK/¯ßH¢Yšè¹bº©±¶¬µ­¹¤Þ©ªi8ËÂ9ßlk™û•{îùŸÐ¹8Þõ®„y?Xâpü¶mÛ\²äü÷9hêû¸+à~Òƒ?ñ©OììÙ3}fýú)&a”·³ØÆ<’~ôÝõK= Ð(•Öú·ß~ä{içæWbÁN ÃGN²S° 8„™ÍšúŒï±ˆì¼%K–¥n˜È…9D ÷š¹§MGëõ=ì,Ìo`Èó¦w2Ãz¦¶ ˆ<Äå=~Ç?γ±L„È”$Pë³l?Q' v¶lÙÂ8ík ¼”ÖÞ|+S‹Ùä´³ágÐÇ5î}+[ aNÒ®•'X!Ú^û¥ÆÑ—w=8š„)¯iO JFfœßuÎÐP— ®–Q0¨ÍBsÑB [°È Z8$þGÃe÷ømŸðÑ@IDAT9çþ¢Áa(5¶ïçqõLgn:â!s¥ÏšÚ!;óìÉÞC0;‘ƉEF°G¯U`Pˈ½åNðÞE‚ž‡†Ò+0ÁØÈ©´zÍ ¬½–¸ÎXl~™àOKºŒ@( ægšo0°À£€² $0ûil#¢÷ô]ë34¾Ú¸†ÆG@JcEÿ_<„Ÿ~ãœw|Ïóì׋3*5¨ 3ɵ÷la-–XC-yÆVxL!¢;ìH”1“,·sûÖôäs?J‡†Øk e¦¯«g¦½©¾|î<ÜUr$ê_¨oiþÒÒ¾«,Fð­-_qìX'9úÿýÞzÞxü£.@ñÁÎBzp×’?ß8ò똸­;÷ì›E –¨ M†¨ ‹/¨-Èš!7L9Ljo" Dà$¼ö¸c€TG΀f­ ›-€”Z?¾ "Yл€¡¤y 0 _ Ô@!©!>c&"ùOÛÔ`ˆ“Y$Jƒbj™Yi/²áö&á&(°äÈ.[´I_SÆÑšˆw¸o4XFÑ‚¨Ä¬tv`mScz×/ÿëÔΤ!û”‰Šà"Œ¡FŠ )ÏW „ŸI» ìÉ£ Ã`dî ¿Zæ.ò[!1·A¡áǽQh± ä…ö‚ÝmH„¼¡{Z+<èˆÜak¶ o¯e†“ÈMG%FÃ57|kàè}ÇÑÍÁ×½Òü7ø3ôÀÅL!sÁ÷]z“àuq6éßU,ׯŒÀݱöâÙÓ§CÀN^œ„;ijá>Òv? €ìЕB߀¡Ta,ÝI È>^Á ܆yH©Ùµ²ÏàÔO‘ñƒùóum×â'…]G¡Û„SÇX¼S£µH´ÎÄ{_*øöîÞ•^Î{ô{48Í.YÞ;só­«K:Ú[J»:ç–ÖÔ6LÕ66?ÔÚÖñé_ûào¬÷!˜=xïé}è~‡Tþ‡ÿ$@ãfVü«·¿}øþèïïëíü­ÃÇOLŸŸœ,7’5Q&R±¥ß(óްHÄ<¤ÞJV+Ùºñe‚BF¼IsdõR}þq4Z*ö³ï_›ŒÔ2Ü!¢´T «¸d$‰3•jJ(™ 9Q'„#±Hü2©D©öÉÁü$gó?·Q-ï0ïY¶ÌeZ åʰЉZË WFb\/k Ú¶irûÑ-¾ŒÊNhq5‚D÷FFv(/´–Ú x¨EÜã0†¹ÿºʳ¹÷…1]á+ùЦJ×ÖCZE|ñ3 ’„ë0MëÌßjn…å$}~­5 ÞE&d>™Þi¶Z2¤‹mWMas*´*bØæ×5P@x?Æô :A§¤l&öŽœ™a3p~†\v·—7ÏC%B˜)psûà k:ßÖä[,dmŸ56ç¡9€ 8 SáTtÂÚ‚Q_cxîþ ð­bÜë]Ð%eÏ~×°œ×nê»Ñ{…O(šYéï1”Ùæ}›ÓK/<Ÿ^|ñ%¬€4{Õ•K¦çÏm)ïèê,kÃ:ÆEÞ_ÝÐü—]ÝÝ_z÷ݯóJîÁ§ïÌÚ>†ÛéÞÿ”ãŸ$l{„*í¿òê?¸ð ì˜?·mßÞ}³$n”Ô²â‹óÇ•ÎÁD":áGB¹ž¤€éÁçÑçO8[i¹ Ø@ÓDÝ/@œ øÉÉlöÈRÃ+ Y\~gVFTȨÍ$ ‰[dÊz^Ð×7“MË@"……â9‰TbÐ|¶ MOKÈZ„ ˆ7¬ åcù•!ÎЉEÑ#C;\Z•÷"Q¨yÔÒfK–¼æ„È=…çjHÏÅŒ´*û®ÕRÁ¹9„é½áH¨”eÌ@Af²U‘à…GŒïó¾RÚebŒjF û¦•‘ÌûP\—Éy&oÊÈšö M6q‰Œ<‚|÷ýʯü»Ç¨+˜|pðõþýÿ´½þ»‡ýÿ'Z÷ßÿåßÿä'ïÔÉÓ¿ýü Àïdy+»¸.Y-æª+p%l ÊéŸÌHJßÿáã¬ôRZ}ýM©Ñ‚¨8B#ÌtˆOÄG$BMÏûjÓ"ƒZ¢Dé¡f–ÐD´ƒêB3+dL±&ò¹Ê?Ñë¸ÇÛÆ;¦¥Æ£Ôë3î¿fYš™2<—ã°/¼`ñœ‘vÛ(CûX&.™SœÍ{µ¾±‘l–”SS©¥ â9¡$k*—Ë2‚/£:\äð^Ön0ª®èrlÃYyÚSbö•Bs›¬¤ð2¯„™.ìm£ãôº fÌ~7Q~Ìzžïjm©Õí´™xÂAJæ5ÑJ7O˜ÅŒ;®+ ÞÊ šþ³À×­ã¬ÏX€Á:ýaã–m¹{÷î$ÓmKº–À\vnº@X«B¼8Æ/œÅ·pbøÓ¾©±ù­Á5¿Œa! K®Åº¡ýeú<šâsÞóíNâÿWžðѼ?7>AÿÈMªº•Êf¾×Äa¸”Dü=œ6mÚ¾÷ØcSv€îmŸîho-éíî,íìë VÕzª©¹ýëí½Ÿ}ï{_OÔ‘o†ß<<óÐÝ…†ý/òçŸlØÞ¢Ð:wîçFGGþûöUì?thv|b¢Ä!.ó*lh-}Šñ&‰Øl¯åK§ƒÇO²x!«ð¶´¡„Ÿ±hºÉI>ûš¹N}ü !!*ý¦–Ù$™\Dc´áÁœS†Úš7CÿCx2¯L¢y§O¨Æv,Øž "j¡`q b "¡ˆ+UçØƒÄç‚:Õð)AÈšŠ }C™AßÜ™]Fœƒé±ód3|(AÄh[®uÂüŽ(Ïì¾Ìv<ª cÝ2¸½hZ8±î¿MÍ•#Ï^æ¾<>˜¦Õ¿÷Wîq{As\Ø]Äð^܇ñ/ãÇëhÖË0Æ ÞXŽbFwÍû0²Ì® î Ý …^C]S¸‹“hÙËŸIfÆp¨0ä9IÁ ¤Ì¯@Td¦‡ñšÁÀ6[GX¼BXÚƒ&ÂZ¯üÎxÊßÒuºgÞ9Ì|­K§¸÷t´Àä9Nà;Ö#-wŒaéû÷¤0ñ_Xÿ<~Wš]±¨wºµ¹®¼³oAY»6745o©oj¾oåÚÕ¼míÛðk_OÔ¹÷ÞAfêáÛßïÕÿõyìÿÓ188XÎgêÿþÄ'î;{êÔ=Ͻð2S¼gÊç²ùFs Û ÍqjC™LÍ¡¿¯F+<¨GÙ†z~Ù6Ú .¸n g3µ;&¼f0Q3+€ÜãN&,NÁUãL5‚/œMM¶ßµ‡9 ðé…vçMy5¼{ʰÂÀ‘0Ë„ÑGac$€ûÁøl}Z ?…ø÷ýÛ;8»Êúî?3sg½s÷eö5 ƒ}[Ð*¾µo­}«U[ªR·ª ¢l‚DŠJûiûŠ´ Ø* - jÅ*ˆ’…ì+Ù²O&™L2[fî½ïïûî Ѷ•5s’;çÞ³>çžßþÏý Ouš•÷D¸˜×ÐÆTw= Á•S—g†>Þ‹eè‰fÁ; Þƒ1],è7ÞLäÚ¾qÿ!…ðõœ$®1×DLB zsÞïŒâ5h8ý}ûÝÚuRóç=ê¶oÚ¡0^¢˜Je‹­²ï™C"­aä‰Lö?¹Ü×/>ÿ2óüñ^‘öJa}Â/¿•ÀÓ¬.Ž'ò§„Ž57åkžÚ"-`x¸¢N^ážfw©³2:9¾€©§žêfÍþ¥kjé°ê¿¢¹ÞOßÅê Bì?„:¸4Ç‘IˆZ‡}ÏEÍ @eàå‰Pt,JÀ ‡éâv,èèt^4fC'á:]§Vm‡1è`uñ@õŒ˜êIZ2PªxYÒ#Ù$Š”[:kÙ_Lu‘c½9ÕÖ:®¯{Ö(S Í ÇYŒ00ïD‚ù¶™æ=t®7…Äè94F o€]íE!@{²©®,L' ÌsèY½sN€TǶP€ímy$?ÉY²‡öù¡ÎHïÉgT^µ>Øíœ‡zß컎:/Zçò¡£›+I‡Úk˜g²fêÏøÙ¥gB¢Z2?ÕFw„Za®˜8HfÊaãÅÇ G<Ð\˜E2QÁ1+j?ç"Ùí8Ikì}$?lЖa©+“¡G6'Çá/ Ý”lã}Ù;ÐÄì}ù–À¸x Z´Îjâ—eËVhòÐíî÷Ï>Û|?´‹>b <€ï¢ ´'{MÒ3ÔsÑšÒ/ÐŒDÚ`ª?=EßíÑf ó:¨ŒTúV½ÂwdêÁhé7ô Þ%ïpH£X7oÛìžXü¸[8w~ÀÒ”ÞŽB.¯êìl«`.ȆXjM*“½uÒŒ³ï|ç›ß<Àcùø3ËçØv²-¿µÀ®^½Ü0Ü÷Ëšæú¯rM™ºmÛ·—T馢A„Ö¡õR¨KÇE+8¤A=LºùŸýÜu´u)W^“p¨Óú—GÇœõßÔs% é ë:zB„‡‡=ÇÓ^4Íœz:–m¼pRy‘ðt$»–Î÷Lf Õ`©£Ž “©Ö±2,õâòÓQ[APË·WûËM¤CIÿðqæ ‚8=’JKá9<Çh,´•vбòŒ¶@^»u\Ý“ûšô×½ŠÒça>êßÚo¸9ö|_ƤùA¨œc,P ÈÁ 4ž“„òìa†”d£¸Ÿ<{_S߇ù(ÞêgÓ‘Ô—ªaŽ;û®<ÝeTÎ=Ô|µÆ´æÎƒÙLè\´ŽA[Ð}ƒºú¨­°QÞ’ÁÐ7¼÷iÍÀ´vå~3'j•7mÈi@ó±áÌöÎ|¤$;k¢€fÈIkæýéÍòŒAß1Ù¨ô<(‰O_ˆ+K5Ù¨9ºÇò,[MNÏЯì͵ë׺ÇçÍÑÄ1[\"U_Ôr@jvµ¤*Ò©nkøQý‘ÔL­fuu ¿ß3sîIâûÑ}þº½]IÖ`˜i!b»\¬ß0žcд<ƒóíGí>*šã7! ÌRRëz e þl}Ó®t.ô‡ÎÐÀK{˜¨(íDSÞ=€µi¢ NG@Ï„œÉ`ñæÃ48Žw$\‘º¼yËf·Bv|è~=ŸÓLÒÍ…3Θ¤b,‰ªI“z+ÙÌX&½«¥µã–¼ÿãLee‹b÷Õ·ò©ùAûŸiý¬:¦¤2_y¯òjŸÚº­42TSQ¯™„ ÕÔ4upAJ)C{O6ÅýøÁG4Ív›’DâÖ1=„½¬THŽã5‹‘:•n¦°l˜¶?¶‘VˆQ¨s –œ†TL¥ƒpˆVœj’æ_´‡ÔZ®CgcîŒtá7ñy:cµ˜’/?¶?ÏÃ9¨÷|¯S2é¯ÎK–À ™üµPL¨JµNn9íô_i%µÃ) Àh+cXÚàkßÁ$ô]ÏÇPb€ÌsAGÔy«É(ð™Ý^ŽÓ£¦ã¸æ7*¼$6ÁÂ\(¨Âw<ûDgpÂâ¨öÜË€®ûZʯÎñQÑXá>>O·Û3_lÞ|=o•Ù;×wèm#6/]…‹)o‚?F½1N½ ¥?’µØ>ÌC×âÝsM˜©iJzÇp[cãúÎ5iï ×\£bvqIúŽ–¤1*rbšùÜ|Éayó7¯–7é|÷ÄÜ%ÖŒi§vZ2©ŠÖö–ªt¾UÅYcéø­]“îøà¹ÜÉAA^þL©ùÄîõaóËfyÖ Ð>õño¸ñË_úFwgûE»wí) ŽDêÄe-Œ¢IgÃ@\{ûû\OOëíéP9¬mªŒsªí³¡«zsH.ÐŽZOŽ€©ùb$\€ ‘œê& EE+À¤mH «¦Ë/}µöÎDã ’ÄÝêáI*€C¾ìOFÒŽÂuú‡/f`v©Î¨C™ƒJÛÐÈÄ3ϵ~ÓÚËý|ÇWô[[ĵ‘lm†Gé‹,ÑH›c!Q%]a ú`ÃPÖVCàDÊóA’£Yn˜Ìs€5 ç¦À8_@Gŧ¦³'¡Yy€‹“À³7G G6? B -ŒQ„ú¡†âXTƒµ ¥í‘´ ¯¦ñA‹ˆlx4.Àʳ¢åPÖŠG%™ª‹˜U ÅÕ±:·¢7i̘c‘þÆxßô; ›ýÈê]È4HɶoV˜1„ç:˜j¼WÚÙ‡šÿä*÷ØœYªX¬Ùs2ÑâT¿-Ÿ¬îéíŽ0\c<5?ÎÝxÉ…Ÿý)÷dà5ìvµ†ÝÞ+5¦m{9þyÖ bÅCë¹;j¾¨¥9Ù±cS^€Ò(Gíåór½Óø ê@‡•"<]õ÷œõ •>b°¦ ·œC‚Èœvçbk¢f:¯y€­ç¡öóÞÕ9Ô7màˆ:ê¶¶Ú(7ì{Ú€_‚=•Œ8ŸµêT‡£#“U5àPt»5µÚE0̓§sÌöT›Ìá§ëZÉ)ÖbPH|/ý Ž_ñ±ËfÛAúðµ¢Èoæe¿ðŸëb}åš¿ðÈ}}o^´du!Rœ¨Ê) tH ‡áÛKçæeáiîéž$¯ëR©oãõ7Ý:$ÅÛñ^U'ŽOú//•Žl[t7:6¯9ÕIè’øèŒüGXÙ{oê¼îmI:ä(X‡ôÒžN†ÝÏ/ÔzËü’Däü¶mº.ÒÍ`t4¤RAíª1SÅwþJ…¶¸žþÛý!j¹E “ðÖ8ãU&áÙf<æe¿µ i(m‚K0H¨AÒ#Ù.’þ°êb×[Y-m£H*šçûé°9ÖÆØ‹^¨ú€j|\Ãv%õMÓ2†£{Á$$ñi?L5]¤4 Ð#ç¡ù74¤6ûqæie´B£€ÑBo¹uä¤Ëº¯}ûßÜë¦Or¯WñX3»tœšäigß! ßD´QÝ|©ú$o¾cJúU"¦q< 6?š´GÍ߸yƒ{|á·lÑ KÚémo+d“ÑÊΞŽÊ–¶v9c›4ý­rBßuî¹Þc¤K ð|^ /?³­ž“ÀD´*—nlšY™xsS6U¹sç ÃÔÔ©`<¨´ÆÙ {à`ŸÍûÀÏÖúUõÑDêÌt«Ç®ó@'B­GÕf"I:…åäë…“Ã0 ¢Îƒ´ S‘V[iÃhvÑ;ÙùêˆÔÎC `„ÕËø)Ú€ºVqj:³™òäþZ©øÄ÷19l>;])Gû$„u,Ž)ë‹v.Ï<,UW?tˆi(<0á<ö+4nàçYÍw¡ ÁÉw`Öc’w,& ù®g&– oª¾¢#Äæ‘ò#;‰6¦¶³ § €n6>a@mÀîHwÆàû™íq>v= •Zr>̾~‚® úi€FÃfç]¡æCc45‹pè ~{pó.` ˜Q0NølTMCÑ€wŰf¹A¿0&S¾ÿÀ!yó²„y¤5ˆ,&¾Õgà}‹9ðÎxкk×®vsç<âžÒÚMMÉâôé=…L²ÑÔü´êÆ“éy™Lö+—|òÊïë~¼7sæÓ¹ù3O’ÄÚý|.z…ÏËÂuJŸ¿ñÆGú÷î•°B«RU’ì@y~cR­é¼`@@Q´ §«Ç-]¾Rc­• rQå]ê 4ÈID§c²KŠoZ'Å;,¦`btÅ|ç3!­kÐnÂÔÕx·…cc<0 €$ÀA‘sµ“Õv"H/ x“Ö^ãèÕq-G;Píñ³xgõò¸Ñ°áå­Çù'Éý>&­ž L°ãÅg’TSïµß‡õo=¹s.ê&j¦†ŸgšâW0I/z³ÆÃø‚çè<+ïÆü¢%š÷ÀpE3³ã=“´lPcÆþ]âL%<{ÇÝ÷¸©Ýmîg¿Þœ§¼_®ÉÝ`xÒjŽˆ˜g µŽÊÃ~44¶smÔü;·+·`¹{èÁmwwS!ÞØPÊæS‘ÞžI²í“ãòæÿ0™Íßrñ'.›kéÏL©ù×_½ú(/Ûut²Yz°…ù¼6€TBÕCÒ£ ¨§ðÍK_î`QÅ”9|$J¦Û¢øH¿Õyj‹T§#"õ±óiÙÇï³p¯NÍ£ëHØØõè*H|:, à9X Ö6ëIÚ@;à[€É;óJc’^Ïfe´Zâ耕žé±§1InÀˆdc„Û}Bj¿Æá‹À,,ÅWç‹‘Z¦ç£Iè¯9À,vÑmo!YÝéOûÛŸFø3‘SëÕf‘Ú€ ¸qæ‰<º†«ß¼ ¿ä5/öŒÀ3èÎ>2ùÈá§òPµÌ-*äB{˜-¦#D•¦;"/¦*;]­š¿͢ŽÞ4sêúÔÍß¼IÞ|U^ºh¹|7®4yR[!­«êèn­jkkS–if{"›¿»¹©õ¶}àc[x]Z5Ÿö„>¶ñ•þÇúòóD®UºæúëçöíÛsöŠåk ’U)U Ji”•yf­’°z $8£º{4 ùʵΙ¦JÂtEj¾: 1yTdÂ:˜TþEå„)~ÔQœJÕrÒ™º©ÎÕ¨{±=ªzm5b@h ÔÔ#n8<#ìÛÑ©}Çàò;Ⱦ§%»1Zí[Æ6¡C¿økßÔ|*=L€ìH½ô±JÇb㌠ØR½Íko^À—Ôä+vU€ûˆè4¢5¦€©÷:†’Úêëë|˜„WçÅhÄü¹ÊÛ×1&ݵÆ_@ã`ªhØÙ\O»ô8¢³17è¶£MÐél ‹N¨ôÚ†¶åÍ%O;¹1€§™€Nô †±ŠQþwøwæ«GÓ†·ëš¹IC‚©?˜Ö4óØøÔ4„ª0¤=ïÆ·O“d®–šÿØœÙnÏŽ½ª‘.&1JlUwww¹lS–òê r™›ÿï;þò‡S¦LQ^²sçœsNä sæÍçw¸ü*ž €KŠ£šPWŸ¸%•8z6)Á;‚©•D‹8ÕÙ˜G@ᣦÔà ^wÿ#ÒŽt+ '¶Ä¯%Y qR¥òQ& {Ф5RG˜ N sØÉy‡ JHpLG ñf:±Ùô¦î ð2 P#ÑBÔ‚ð^îôº½€€¤€Ù˜€šÄlÓ@áX?ø#›™ÀnÍÕŒ2 @6®gF²ã˜£LVAàq#ZcØäRÅQß©®ƒÙƒš?¬<{€ °Çd"™) °šÃû^ 0•0ËÖ·!»j ªïë~ Éåz0´ÚGDÅ?˜~‹ÀTj*»è:À¤º×Ky˜$yæï(ÚYxOïÚz߉?¾B1}Ó ´Ú@c«k)ÑUnûÆu†wšب{6È©ç•+ÝGŒàã³!yiÆõné²ECò°žIv´fœÞSjÊ%#í]½•ñTj<‘Nÿ{>ŸûúE|vnê.û̵ôGú¶yógÏfk¸<|Ÿ}¦=¿ý6ë_œvÕç¯_Þß¿wÆbi ÃUåU+ ¦I2Pãx¹à€Ôaö”®®.MްZáà wú´W©Ûxu5ÐŽ;J7c×I²£VâØ³¡·r™÷^j"Ò¯s :\ƒ O˜M¤—íÔ² Cuh:p5 7Õ\èÊ¡û‹mÒû6²öÑ òvm@¸ ÷ú#P ô¨¶€uÜbù©1ýF½'¬…¹CEßÃБҀŸa¶H|<÷æÌð*IH{}Š>³¯<:O×Gš£ÖKŧMäâýjƒÀÈ“xFà¿S À!5ÈiÐ?m‡ÞìGS0i_ÞÑ;á|Sù!œ¾[æ$ÛÊÕ7{OœFB:r_ÿ€{à縷ÿÉ[]wW·gv÷“7o~…;¨‚š›6oÖ´bRó)Š¥jK­¹Ö‰ú†ŠHk[SEO[¥ØvÇ2¹oö¶w~ã¼ó>º­ü®*|‘¸\™W—w„«g¦Àó¦@p>¢ÏD}4ùwñ±á»šÓÉŠ½»úÜH­R4%Á'*/©d’VˆI>N‘/à‘‡0F>ÌZçAÚ›DjØé̪B|+ƒ-¯|£œ{؈Aæ*“øJç%Þ/mƒŽicìuëèÚ†d…7É,úylQ¿´Ä&´@omeÍ6ÒŠ"ù¥Nƒ1Ò•‘´€§À"¥õ!ÔC`X*ÇáÜ£¬N; ó±ÆÎÇ¡W>§ÌO>4? >Ü|úN̺Zʰnm×~›±í·‘šz&$·ÙçàWD`Ä&iö=ôíaÚfèùÎ5DWÝÕ…u#“úºÚË€<æ óá1'Dow§kR½G˜aU@O¿àÙöìÙ%oþ7{î#n÷ö>M ’*ž~zo!m¬nïj¯N7gU©'17“lúƾõO¿ÆgÈûéÕü\.W*'§½âByÐàÙ.ô‘çsáz‚†sW\yõÒƒ‡ú_½|ꂲÀä HjDx • ¡ÒIU™Eá«ÎžN• _­I3Ü™ª„ÚOG${u°AL@ÝLyT¦‚.*<ñ}¾ôºf :Òi«U’+èä–”R–ô€ðÓPõ]ßÚ2Ê+šï¢üÉÎCáÔC´àÙ7 G%!J çhubTuˆ”&Ž­Îvóâ ÈÔœói¸>lgà }®>*¿wô™ô7&àý8 Í[¯m%IycZ{íÃ;ñ—À¸4ÚŠdð;û˜ÔÖó{àtÏ,~/&ð´Ú~Ï ø0KùT8†Ëzÿ€× ŒzÃy&DÅ©S–^\±{ÆW,Yª9"êÒ»Ž2ߣ,»ŸÁ=Ú, 8h #e§ €“•GkÈîÃö·sróêë‹9ÀˆPñõ€05žÛ3Ëb÷zvöÙ¯ÀkiËb–ÞØú³$8×òj?'ð²f ó`vt1ˆªöñl´­í.£J¸ä^xŸs9ªÜÖM›í]î—7Ÿ0ÞKæ¹m›w+-üÎ=ÅdJj~Gg$žÎÊ_”Î¥oû³·û7Ÿ±÷˜ãÈÍ—äÃxö&žûŸr·yî:þ ¨f¼¤ëoø»¿ê¿vÕšµ;wíä””I§m<=j'’Û’tXÔât6%‰]cÓi]|ÑgÔ™šqüš§ŸÌ/¤š…ûô½Vçt lXlZO‚vŠ·š®éA xD`ýôâ™ÁÓÛ©/\ë­Îì§Æ‚ ˆ˜'_ê¹¾#íùmE/^FÐÙG܇î(¼!À‹àäC#R<Ÿ5E*a'¿»´iÆpÂ80<Сm6-CÌ©®–üh"h>cÏÇØi¶ž“Gì6üf$yYÊ¿MØÍɧ}êoÞ|=¬Qkô+_×<ÿÚîc÷æ½pN£Tü™føZíq]fpbè4 báÂùî¾ÜéÚ:zܾý[ä7q¥¶|{Aþ›Êææle[f¤Æ‰Ì¿§”´sÉ'._ªG²Eý(Tób¼k½ÚçQGU¿©(Ýóøãõ ~ô£Õ}ý}=+WZˆHàÁAgê­:+eÔ_¿ªÆv¹Å+—¸[6¸³ÞØ"é9¡9בnê‘ú q‡Åú.ý¿ñ¸¿ò€¼œ¼£}ž1|áÅK| R]<*;6H}¤ý1/¿iç¥½× ´ßÎàœæ`"0ÝGûÄoLkáùðaD•R^>3yMS iÏd0šÙY&ÎæM›”ѹBR‰EAêÓ…¯ê-ÆcuÕÝ]Õù¦ŽÁ––Žk47Þ‚h"º÷¯ßû×Oñ|,3ŸVóCà{’¼hé_/ä"¨ºâU×ÝøÃÁ}ïܼeëÄŽ]»MÌ*E¸i ÎE‡5UW À[ÞÒÒäö‰ôª|ôW^!§•Êv¡êªs²z¤Ö×x]ÎÄw~"áYÛÌ4RLºêÚdæ:_OÌ<¾ƒ`Û3‘;Fàv$8©ÌØôkå¶uìâùÁ»1ÙÀŒî³RÜ£¡M0ìiöémCó0z€B1(ÿÈeÉ/iˆiÿ±Ì<ÁÛò^uG«"ÿÁ˜ZŽzÏyÞ ðÀg•1T]Ëh ðÕòðäëæRñ5–Ââô¾"ZSº†åØþþýný†uš,cÛ»cƒ‹¥3¥ºšÆ‚nU™Íe+ÛóǒétþΩSf|ù¼óÎÛ¦ KÅ=÷ÜS©yîQsx¤py (ðßaè95I/¸J/¸ðõ¯ßñúõ›WÏÙ·gWi݆-ŠUº\ZcÄÈÞ£³âÕÑÁ •|>ïæhZåo|ífwÊÔ)' ~ò?[”ô*€ï%¾´u5ù%é}² Le‰/)€5’ßRo•ž‹ÊNn>Þ}T`>¢ð*=‘Às`ToÌŒ!—Ÿë—µ® XÄiÌ1£Câ£EÐ8^í€ùÐf$0 ô ŒxV‡*ý®_:†&£ñèÃ-ã‘ßz1]Áœ{жl&@wÔ®ðÐìñü8"‰T å£ÑF ½ÒîEÙ´zÙöDk0wvíØ©’pKTáy–%R5廋ò*#…ê–ŽÍèÜ.O~zU2›ºsRפ»ß[–öHz4ÃÓN;íòÚþùQàeåÐËŠ×\wÃ}‡ö¿}Óf´€=‘l*îò*Mé0:"YƒNÖ­¡Â+Ÿ\çÎ}ÇŸ¹÷ðàUÞõ^ @?3N<¤¶9e§dè“·m²÷Éѧ®©÷TÖ±vi˜my¹÷H{“ìÁæGªKC@åGSᙌH{ Ì­³vªq$ô`‚°PÖ mÄ{ð^L¾@k¶»¤¸©ß¢•eëz}7[\Àì|G%÷jº?žcŒl4F×@Ý7µ_÷ø8%¡ NÙ˜ÛðÑŽ!¬ðaô+=wƒ[¾l±[¼b…’tb.›É*5Y« ªTu´w:yðKélþGÉLö›ŸýÔÕ÷ë<¤{P>;=Ä8Á–ÿQÏCc-à+_ûöŒÍëW,gÆ•U7”ÔÁ*Z3N0°:[ÔJXQTÃB륂îÛ¹ÏÝrËW\Ržc€Cg|¦°ƒ%Ž¡×|¾Ë£º€-vo¾l—ë;Ò•~T~ ìysè1{ŒÎ¥8&€ãýRéi Gšû8½˜‹öãü³!j¿Íñ6}6¾~£À€"ZþØ3™TÖ£!¤MòjIuÖJg ȇG—ÌGœ„AMíøÒl…èX$8ÌÓ3†ûR‘‰H ;8õ¢å™•¾¦‚Ÿï¾Æžq÷î=VlcÞ/ìöô—Üä)mzw€iin¶b.©tjÆÝß™íêüöEºhµnnËq¶½1‚`{¸>q(ð‚9ƒGÄ ²ê¥~pÅÕŸ¿ñß4™èyéT¼°g__dx´ÁÒwé¨õIP(ü˜ÉæÜ–}{ÜJ9—~ÿœ7(T€Ï¼úv¡  1úÐòóu=¼÷E€Í¨-]W*?É8–¶+éÏd•ø ¨Ÿov½Ùx˜xù-î.[3åСÃ&‰­þÒ]yñÅPp&"uñ' !ð<^yQ£ôßÌ5™gñ*¿t K¤7[ä8&ÉÙ ¿ osé!ýŶÅç»®i!;c’\&ÀDcfä'Œ+tW«Ú šÀEkîGØl=R©¹æ娠i±–/_ªá· \]LóBæ; ÓóÅêšbu—fÀÍ7µhj¬Ü‚l2ûg¼öûo{›Ÿ&ø•a¦ž(q,t| ´€›¿qÇ™ë×,]´g÷N·aÓS¥ÚHMEK>kÎ&<Í8³Ð‰‘H©”²ÂˆŸ·æ2NÊöxëÑB çÃB&Ú˜ni³¨ú:Žl;>6tV×Áᆄð‡±ÕLý;$‡^ Æ£þ[vž¶#õ­ †lyKsÕ½Pññ#Œè8ÚŠè-ž/AZ bÛ‚ö@A¤ÚðýÇKgžèÕxÔtö{u=Øî{lóŒ’{økxG×ÐŸàš¢ Ú > m%\×ÐÐhy8ñÔ ôÌÒ “êÛßçÖ?ù¤[0ÿqÕÎß®)Ü’%MêY¨¬(T©Ö~EkG»ËescÙ|îŽ|¶ó[]t© ¿å¶3gž#ûÞÈáw¸œxQ@™ôÌÂåW^s÷‘CýïÁ°gïþHs.í’š>ÜWóñª­%ß(º£­ÝÍ¿PÎÀ[ÜÔiÓL#9áæÐƒ è8Ô{>„Ò°ñÇ5ª„AFAŽ•È&¬e¹÷Z Ü^å—Ý/χ Î3ç=Ù} ¯«ê;&‚Âx»ÐnŽ?Â…ÖVôjµ£ ë3)) í`½Èè­©2ÌÂ6säim*»sPÇÐìwId!ÇÙšýx_á<³õ^“ô¦æë@ýg15_'ÂèðQ í9®sJ&u¸0‘FTb÷ó|;whÚkM”ñê3²tv5IÒGŠ5Õ¥HG{»’vÚT°#³$ÞÜtoÏäï|ø¼o°õg¦{aÂN@“o]î:/|Ã-àþák¿·yëúy{÷îv7lð}þ8(˯Nª<7é5ªÉÚܦ­O¹?úƒsÜ¿@j>=M@£J™kG°ÇàÌSçGä±G•÷’ß§áR]‡é±¸6vp0àÍbŒ‰ 5ñÊ£f¨#©>ª{Ó§F>sHü!QÈk-~ ¶ÜØßp‹ÙgGu(=#@}÷À·²Ú0ý¶ôf˜€i e‰èµßƒ\Çiƒ¼šï_# 3uŸYšcòæûj§ûš‡_ÀçL{½iÓ&M{=_uõV*‹OÀïì(Tk U"“¨‚ñ¦’™±D._>•¿õò˯|4è%çœC• Ue' á49Y×¾ç¼x­Ç;UüôU×Ü7x`ÿÛ7lÚ21ÐH“3¤-Ñ„zï¤ù2¸Ç‡æ&,å4H+Þ¼ÁÝ*- ¥­Uõã¤àÍWG—Mî'¿€øÞ€ìsc ¯Õ32oL³â`*Ê#ñ¤×—ÃϪéŠa «£'ÀÂ0',PZƒÇ×õÌÄ€ ˆr0ѸG©‚Ú@¹TsT¾û8<*¹Tú²½mÙ{öÝKyì$Pš §ž·ñŸ<Ãpi7`çF0c.hh?0;I|]ÂÆY(óN™“JÖ«—¯9hX´wŸj5®Y³Ê=òè,w Ð5µ¦JÙt¦ÐP«Â-ÙtE^À×|÷Ûséü]]]=ßzÿû?º1èH{ÞŸÖ¡S/ ÊI¾~Á€ÇÓGÇñioíùû ÃCoO§UÊþ>b%¿iWI‡–°µ8=‡‹o–3ðàà!å•/poûÓwÚ´Wdåù´ZŸž«y %¡¥¶›t' GÞºOÔ¡ ’ݪë %z€Ío*™wu¿ìð³ˆl²ö`¨óxì)íEèÎFª2€ä0ÂßR`ç=“ÐÚÏ|ޮǙ'P ½0óâvý¶Dlrûèª ×Õ1Á˜{@ôƒ…sÐDÐp0M¨ˆ¤{«‚ì¯EXUe³QóµF»Ù°~½[®1÷Ìšm—éÒRììh*&âu‘––|$™jVåä‚l:uÛ¼ùϾ÷Ú×¾v¸|?*ì›o£ð‚6„ë—Ô]_ÜE©NŸÑ+®þü‡îù£µë7N88Éh¤`2ÙhE;‘V8º4¦ÈmÔ)DuôR•»òÚ/¸’:ü¡AMŠ!Lh’‹1yå0+Ž$¡y»¥Þ©Z.Î/6¾Û+ü§c¬Ì¶Žñν§Ów…3c ŵœ ´™Hz>ÚOžqºIy/@ã¼ÔÇJŽjIn’[k¯ê³–¤—$·PžBÉÒuÉØÃ£/ ã+(ƒUðs ´ ™SíDÛƒ´g@çSÕ'ò¨†¾Î;(æºQ3äÌ›?×­]½^e´œëiï-44ÔhòÎEK—M F’vÊÐÓz´…²pj2Bq]ÒÈ ø½7¼ÙMÑ„¢‡åí'©‡Â’„äHÍÅñGŸ…ñ$™‰ð›4cxYêv™}¶ˆ¶OG¡ê|V~¨¬T|ý@zVÀ,,[i3ËÞüÚfê<ûÊǘçŸßØø€¼| ÷óŽ>ì{MС6¡Éà°ä™)¶L±Î½ü6©ù’úxýw)EwÅÊeîg?}КÞÛÓRʤS…x¬6’kÉ(‹2¯jéUòèßÖ;íÔ{ß÷Ž÷íµu[>,¶Q&Æ+}õ’1Š?à`ºá¦›^u oߊ]»÷ºe+W•¤T¤’qÍ£zÿ2l ºÀEún[s‹²Õ¸Íû»¿û1/ùÑ,_’œï––+‰Ó@Ô>Dˆgß;ðÄSôj;8ù¼ú µÁ¶›óNÚkÔwF߉=˜†+0Ae Xø5^í´z&Ý=CâËLA¿9OL-m3ö2â6Øåš?éË`\ŸL=†MÆvÛ¶nuO,š¯2[ªš¥&M™Ú]Œ7ÖóÉh¤©µÅ5*Å7O>ªùî¿ú™Ë®ûQÐÁÏ9çXì^YáRÀSà%cÜ>`W}îÚïÆŽ¾ö¼ù㇇ŽTgL'æ'aD±l¤µ©¾šd¾lÜמõzm§æö½.`&<þ8mþ;™á½8ü`HtœdöÐúÀÙè¡èÁÎNÁTàC2ë»>æ°´úðõÉHtÓÔ¼k_Ö0° ¸*ƒ®F‚ó’ìC˜A£Âu0<ò¸‚yüWÿ¡IDATz9õãÁ%öïïwO*7Σ³ÜŽÝû]¶%áÚ›› õRó3ñÊæ–vIûä@4‘¼;ÛÒþ­KÏ¿ô ÿzC5? C¸~f ¼Q€c-a\¸´ÕŽo¸ñÈÑ£ïëí쬞»jE©vl¤¢vŒ*T—•·ð \CÇ]6‡„‹¹ÛŸr¹¶Vwèð ¶âÿæ9“ä‡ •}÷ À’wÄþ|Påe¹¡0æ{Þƒ©¯{꟮ëÁo€‡ ”½ûüÀ^@# UW 7&³ðÒ¦SQzòÈzL)5ÿ€µØ=¿atd0nÛ¶Õ­\ºÌ=ðÐÏfÝ“ÛJgž9½ŒÖDššsU©\^CxkcÉô¿vL=åμëûÊĵ9Rõ ·ß~»áRà™) ®ùÒ.ð¹™3¿512ò¡‡{|üÈèpu:žÐ\òšHDulZ/E°á[5õ ¦˜Z¹æI×;e²À$›žŒ=IÔ’Rƒ©ÁÇ||pþù‡Ô>}$ ÜH~$3ñ}?Ò×$°€Í>}7•Þ$½˜€~SmÇVÇì|`ÕbV¨ífFè8$y¥¶‘D„ƒÒ¤½®I¨NN?&@ñ|¹§ú¾²Iѧ9+5QJe½sÓz'ªU^«>ÒÑ¡Qx±”‹¦²¦“™¯^~ùu÷ó,|dúôé¤è†j¾'Iø÷¿¡ÀKªж@ —ú¦£#˜ÔÙQ½hùêÒxÍXÅX­âÞ”þ=*ù‰¤•Ô”‰ òái«Ú; |vÂltT}©Ö–Œ¤—ˆ'g/½ÅÔu%6µŸégÌ×5M#¨QÎMÕ×1æ¬Ó>³Ã~Sï9FפDê‚oWÙÎGÎÒŸÂ#Ãåä$B…h-ØóÔ=dÁ¬!‰‡‚^ÍßïV¯Yé~òÀ¸ÑÃ%×Ý›wg}F!ªù ÓÉÆ*UHª¬«hŒ¥˜Ë5ÝþÉO~æ™Ôü0ŒgÔ ÿüO) ûÒ/çÈA5{öì‰k?í¿=ZøÈC>6^«N$c*àÔ*ÛIEHèéR}ù%K–¸ÃCä­›÷ßààÐè­ú/ê»žŽ˜¹í“X:e»,t‡š.`b µ±ÝM’£Æ ȘÚà…®añ~mó¶¾øfyŸIzFòé7J#)0B#ÚC£¦'Ça@݃b¨ÌpÄüä%ì|j‡[úÄb÷èc¿´ñšWO.¥ñB½¼ùé #%³L«µ®1ž¹}rï«î”tï+¿±cj¾~{u楕a N2 ¼äô(Š(-5ñÕñ>ÒÝÙV½xÕW3¦Ù€ŽJj 8ØñòôYü¾¨¤ž6Å·w-Z¡±ìõ&Ŷ!P×Ã~Çþ×_m#ãÜ|ä33ù:Y˜ÄìxòIã%6‰ÇÝ€¶ ÙÆ(ˆÛsŒ€p©¸Øøƒ±TcE%¸‹UÙQìÞ†ßr=i ää70µ™®=¨q +V.—3s¾{R1üŽö˜{ýYgcu¨ú…ð" 1EBb‰Ò‰ÖÛ.½üŠûÄ@ äÄîßò–·Qóg†ñ{Q7\ž N €|W^ó¹ï~÷ìù‹& ÃG#¹TB•e&&­·¬¸´Êƒ²Y³~©²aŒ| U K¢›.‘ŒT÷á7ÕËè€Ps@Ù™m;ÇêxöíÖîˆà= @pô“™©§Ø½Tû¨"Øö–©§6pÉKL–Ava__Ÿ[¡‘x?ýÑOŒÑ¼êÕS\.“ÓH<­­JIâ×4ÄñÌ¿çZ[nûäù—- ^n˜´P"\?Ÿ8!4€ã(Z½YyÞÝÛÖV¹zÝzÍ 4êjÆUÀB’—a»L)680(àdU˜2áúõ½¦ªNr×{òQé-„‡þ/·ž²Šdë™CO7¡cͶ7/>!>o`¿ßK}Â{lÔçÀ jä¤Lj²Ò—-4(‚‡à#õ޼ný“n±RtçÏ[¤êFUî¿ñµ¥xÒÞfü•š“SŸßíº:¾^á;Fè¡] h$5ó;ÛíÞ¶×͘ÖášÛ[Jõõ5…:€ihZ,͉—œ›Èd¾ú™K®ûÎ3ïýñj~™.á*¤À BŠc®ù7>6|èÞÍ›·VoÚZ“4Õ€żý„“Ô¯ŸÔ3Ù’{jî9<ë~ö[¢Hu©øZ«X½)n±˜ƒö`µ6Õ^š…]”°t]Îe›˜@×4e#*މA•zU0"E™k `ç»Gõ'¹s)º+ÜófÙ {ÝÿšæòédQ“™e®(Õ9é"µ ¥x"ûƒ|¾é+_|ÅÜà͆j~@‰pýbQà„bå‡F¯¸æšÙ£ÃÃoš·hÑDql<—²aÞ£^rlËkrÉÇçýÂlpˆ×2pâ¬ã_™! ñÙŽ `L@kSõM‚ûÁ;–Þ+í¼êéQPT¸7ßsârôç¨j‘Ô|J™£a0ûïÖ­[”¢»@à_ëŠÝŸúªSÕU2_“d4VÅRY%úÄv'é»ÛÚ:nÿÈG.\<¯œyxô‘þæè+oW!^p œp à/4›Ð½òpîÆßPylÓ¦-Åuë6UF5BZ´^Xa5€·vÝZ÷óG~¢ÊBNÓ_ç]WkS)ÚPSh”gOa¼ 9ôðþ¯øÊô?xû÷þ´\iç…>Ëuõ¤¼›‡7øM8á@¹¡Dã W_{õÏŽŽO¼õñ…K'ŠGÇ"(ãšL¤ ¬À§ÏʽCÃ`×Úä8òø–©§'3{ž4[}gújŸÄ£µÀnÀ3`'£ë˜Ù¶¨ïµ=Òž]Ož¾“žËu©3°c‡b÷K—¸ù üÈÚ§÷ºd&Ò^k"R¼Ên€—í/up]¥€OÖ µŽª„8€2-–€Î¹DÃHDRw±  £Ùhu ·lÝîÒùZ÷;gNuY¿®&R¨©©Šd››"цäH"“ú^º©ý–‹.¸lIù%?7ÌÍ=_›zµ&¯B3éYÐï7býM;_ÊíÌ&$P¸òª«îWY°?^¸hñÄð舄pÄ%qIã ׬Ùi2™œ[ùÄ“öÕòÊã˜ÃgŽ@ÓpèQ/O1‚ 9õF%í*.?¡*;:O»Ìt ë°®Nñ|íé·w¯f&Z½ZN½‡m×–oR†bm±à+tÖïh*3šIçÿQщz÷»ß¿›ƒy†ÓN³‚šaŠîsìL·Ýv›r¦Ýø\2ÐçHËãO?!5ß@EÁݽäüßP]šøãî®®ª5ëž”B.ž%Ç\D <¬ê7 ÛPù¯!\9úª¨‹m¯>àGͧŠði øÙðÚÇê5'¡´3¤-I@ÚSN{dhÄ­Þ¸AåµË©·Êš3ir—K)o¬.ÔTW”‘ˆdsM•u ɉd&÷íîéÓ¯ÿà¹ÜÉÁ3gž£A99 ʹ·pï½3íüðÏs£€€T)~n Ïþ œ°­ ´€O}êâ4åsïZ´lÅÄÈð©Ù1Ié•;à^3ã5NEÜÞ]Ûål¨•˜CÖ Z}("mß²þêäXž€ÔzüÄíÙΨ½•×Ú¼y“›ûØ£nßÃ.“«w­MšêZÙ†uu‘B]M…Âw±H&§jºÑÆmÉtþ›=]Ó¿Ì{Ú÷¿Ò·Â'N` êy- >ž»I‰5ïš6yJÕœ… $…z;"éßÖîŽh|}%N:Ty›þªZZƒb÷TÙÑöõòÜ“AˆS¢²Ji»6$WåµT5h»Ši®”¤|Þ|{e½“[]go»‹Õ¥†ššB¤²P™HĪ2ÙvWO®È¤›þáÊ+¯û®lR«p|Ž<úú0aF¨žÃ?' Nh  LD‹|ä Ò™ÍüÉþCC ΋äI×3y’kïêu žxÂ5hÀjÿcôFå XœÞ4pϸ{B‰*¹%5Ÿq÷[6mv‹.tk7¬wÍ™M†ÙáêëÄêJ‘ŠÒ„ü ÕÌPKft^rY>ÕzËåWî›ÁË %~@‰p}²Rà„gñÊ ¸÷Ü—þß­g­Z<ûñÓ_]ز}wÕm·Þì®øìg4_ýT7W’{ëú®»§Ý&ÂÄHÂÒž¬>JgGeTJí·òZJž={–<2榞Ңñö)M®¡ÞÊê“;`¢VÃ|S«÷d élþÞL¦éÖK.ùô/‚—,IÑ'LÜ ®OZ œð  LYÓ.¼ô³ßéÛñ—oxÓ[Žö:XÓ õžxþö›ÝÀÁ>è‡ê2HIÞhuõ¨¸s'3à.ssæÎWF¡s“z&i”!Þ~9 ««JòþSOÈåó-‘düÞo-·ÁBy~èÑ?i»{Øð_§ÀIÁ:Re‹³fÍoºóžÛ—55Ö5ÏxÍYÅ¡‘áJ&ÐØµm»âôý6Ö¾A*~TgtÞ &Ù²e«[¤p׬]¯Ôá¨kÎ7kŸbü2 ª«« UU¥R¤¦R9úi×Õ5YFò÷NšüªËßûÞ÷>±¦L^BXfë×»Nøûå@“‚@h1ÔoÿæÙ }`nWkKñÔgVUÚî®]»¬ºuܧÝM²ëW®zBÓ…õ¹¦üd9ô¤-è:JÒ¸Õ“‰ß˜ˆW¤›ï4?Þã­Í]ÿ|ñ¥—û…ö=T——;NÀ‹8ÿü3«o¿}ñøÕ×~þŸ–-øÙ'§O{Íø”SgTSü°¤ýÞ½{ÝÆõk•ª»Þ~1µ2ìå±W±àѢ€ÕY%Å™ ‰yñTî®ö–¦?ô¡ 6•_6Ú ‡ B¸„xYSà¤båtÐÒ¢]»þå¦7.Ÿ}_K<ÑZlˆÇ+É T­¤yÿIçU™0UëâÏx•R}+rÙVWŠ'ßÉ·tüÛE\ºà¸·[©áÈ¡ªE¯/{ œày¿JIñ’$säµ­­Ã7}õ«D&Æ~¼eÍ’âÄØPe<uIM.ZTE q5©ù H¥²Ô” _œLæî˜2õô{Þõ®wõóͱ§»çÎÞ¯Þ0üRàeN“JÞ‰7³UEø‹_ü­}»×_пoÏhEeu¼ýš@“n(Œ—ThOõõJÉDæ®TSîöO}òª9ÇŸŸË嘔„P^¸„xÅRà¤d)À[û®˜3<¸ïõ‡T‚‹D † ŠÔ Ɖ»3ùö¯\pÁÅOoíáúë¯/ IÛÂuHW2NJÀ ˜-4xßœ9±•sºmh`à,èÜšhLü »©ûžw}ÀO“åÃxNa¼{qê…À%÷öðÙ_^€ O´zõj?åNyÀ?~p\¸)RàeDÌã€ÎwòŽ1†—Ñ£†R ¤Ào¢Œà7í ·‡)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „)R ¤@H!B „x~(ðÿ•Jº±U7”IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/eye.png0000644000175000017500000011345312412506713017753 0ustar sergiosergio‰PNG  IHDRôxÔú pHYs  šœ IDATxÚìwœ\e½ÿßßç̆mI6»é»é!…„„„Òˆ‚&( ÀEb®÷u±pí¢*EôþTZ@)ȵB@@”NB !¡„’é!=‘=Ïï3åÔ™ÙÞ¾o^agæœiçQ (˜A5§÷ºƒ@FÔDÆ@™gä=ó-±—}ÚÜKÜÏBú¾mâ ¹ lN €õÀr`— +eûAV l|mý<ŠÒ†¨P”B]õ©u u#>ôTÕÞü\.ô¨QÏÙp‰ü$$ ‰þtˆïµ~‘ô¶ÌFkÓûlx‘—€%ÀRyØ+ÈÆ•k¯Â@QZŠÒ©«þp äh༙ý 5´¸Ë9ð¨HÒ–ì¶87¼û?ý*E€°· ÖƒX‘=À>U"¤…¼$Â+VÏÝ #BQšŠÒ¨íu²€ NFdºÀñ@H¥ xSgKИ/ထ—<Û³ÿðÏ€$Çÿc^ÇÈKqÛš"$ò>…ö n—¤°€„‹ýC®êÑûH ô‰O ØÍˆ<)ŸEä/ϼtËZ±JWG€¢4U'ÔL¿{?á2k. y¶eï„Íxt[þøô9‘W”|Ÿ=Ë/Æèûóò Ÿg ÒŸ3ûxXˆ b׊ÈC"òGyò_‹½QG²ÒQ (`@ÏjÓo#24Ó5ðÅ‘üá6qa‰d/«?|»£ï;.wî9Aù“ dÂF0b@,"’á¡<ûÿvëèVº *¥Hú÷<¾ä$ÀsñKÜlß»¬Šù£Û[OÎKHÎöOØž r7%AP¤áÏ ‡àìßì?tÛLæyF‘¹"ò÷¿?ù‹Å:â•ÎŽ E)@ÿžÇ×_ÎM/ªºŠ2õ×Y‹ =ÜR@B/#‰ûäÛgôóÎö³»øCùfÿQ£/cHÿ5™í{ÄÈÃ"2GD=ôøêP:%*%þ=›rp,H¿L'¾È…Ój ¹°Y@âãþWO^+ ŸìïûŽyEAcÜþø}ÂÌßĉñ…<1€€1²XDæ#ÿóÃשW@éT¨PýzW'ÂT`ðq’¸K¦c €"×Hê?P”%†< R¨ó_XH¨d°Q†ßH2ú ¿¤…@æ¶1&-ìcÌÃÆÈcdÑý¾V½J‡G€¢ýz›Nê“o‹0Ô·¼mì%Óþ@r‰`R‡Àâ@¡}$OwÀ¸zÿ¼îþ˜ÌÿÄX¿¿7@3ÿ$ßY€`“y|±1r½ˆüaÞ?V! tXT(]š~=Ž |8¤ˆ·h­HÒ%ÒÜ ôjíP•(…¼qF?däýŸÁ·²qAÃïß–ìGÆ¸Ç ŸÈ €ÈcÆFp¬1²DŒ¹Ë™ϼh_¥Ã¡@é’ôëq̉ —Çô wëQGÄ$ [ï×å/o›ß¸Ù? Ù?>c3ó÷‡Òe’MDLÀ FpŒI‡Ò¡Çx k1óÄÈ wÞóí6¨tT(]†¾=Ž)f |8¤gÒ%Ñy@þä@‰ùÌB@l8 ®áO1}þó~’gþÞŒ?˜ýoÒÆ>0ÁD@ ¤gÿNNdE@:4ö ¬1ÆÜï8æÎ›ç\© ƒJ»G€ÒééÛýè>9OàŒäø~ú’Hl‡›»ß•@D…ö‰!ánôS¬á÷'úfþ‰uÿ&:óC ÷÷ÍöÅ3òYaà˜ Hÿuƒã¤a«qÌ]ÆÈoÿ÷7_U! ´[T(–¾Ýîƒ×­ïR9¢¸áßÙ@ø;´ˆfŠœýgã¿ñåø÷I•¤0"ÖqÌ"ã˜ë¾vågÒ«Yi T(’>Ý:¸äŒx³ßµ@ÔÈ{U»C`'È`ÂZõâí° d+°9ý¤-‚ìö%”ûYDÊÒÞe}@\ B¥ cÞˆ ”!ÒO$µèi€ûŸ˜™ô±°±÷ç„]ÿÙ™}Èõ/âsïç1þ™xfßܬ?#œH‚ ãR©bd¯cÌBÇ1×_zù'µb@iUT(Š>•Gˆp)p–×§?XÎ×,€|}¼ÇÚ^Hà•,ö½´ñ~aÈR` °R`"[ßÙôÛšçjTí *JAF ôA¤ŸÀd„ ‚ŒLoënDL0 º&@¶ëŸÉ3óM »þ%>ûߟðçkÿk’ÿ'˜ýïÿ››ýE@Ê1Ç ˆTI Ùì8æjcÌœÏÿ÷´mz¥+­ ¥CЧòȱÀ·A>ŠÐ3iw|wÏÜÊ}¨À.GuÀsÀã‚ì]½åo»:Âù3è“""½Ó` @&‰0ADF}1&wLˆ,è“õ ÄÅú ¹þ“âþb¢9±" ÿT8!/€cpŒ˜ýó¼þ©”ƒˆ,qs1fáų>ºW¯|¥%Q ´kzW9øšÀ§éâï¬Àsç{_Ù®Y(Âb`÷š-mîlç{ÜðóD¼ÐÂpA&ˆp8"(Æñ/”P`úýç7þ&o`PDëþMœá÷{üÆÞ8¡ÇrS©T¦¬p¡ã8?úô…§jX@i1T(í’Þ•Gôùp¥ÀðȰm/ ¸süöb@pö¿Öû'o÷O¬ÝºhSW þLÉ 9 áh™hŒ1þpA4ÐçòOLþ3ÙnÉÙÿ阿¿ä/›ð—‰ï‹Ïðûfù¡¸¸"À1þm™Ü‡Tª6;Žs1rëÌs§¾¯¿ Js£@iwô®<âàë GÄ7ííL@rÏ·éY¾ÈýÿÙ²vë¢VÛw&½°äP/†‰ÈÑ"Ò/1ˆuÿç_èÇ„ãÿN†?ƒŸ4ów·£Þ€|R)'•B„…ŽãühÚÙǪ7@iVT(í†Þ•GL¾H6Á/i ¶û> €] òéYþºmtÉY~S8büÅ}ÄÈÑ"ò>dŒL̆ ü¡¼±ÿPùŸßÐÇ„œ|1ÿp`ÊñÍö}U †?|»¤$ç ‘[>zÖ‘;ô¬+Í ¥Íé]9eÈW‹@zäŠúrC´e@Ü%вÀ÷ÌuÀƒÀUë¶ýýmÍÃÑ“fUˆp¨ˆ|HŒ\ "‡Ÿ(œø—Ðî׉ItœH/€HÀoà}‰€Ámþ'[5ö¤ú˜—ôg ºþ£ ÷/'¼€ëºóD˜5xhÍ PJ¨.Ÿt>ðCD†am¤#^1nvh¤ˆìÞTàŸñËõv¨áWŠã+—ÝPí8æ?Œ1—¥R©ÁÁ°@rßÿÂ!˜ÆA‰±'"ÂÿR)kíƒ"rCÝàJÍ PT( §ºü°¾ ßf%á$qƒ«¹@ô½'=úï®ß°ã_jø•FqåW9ÄóÇ1³S©T1øJõ#bÖðWdnûfú~÷¿¿jÁ[Ù®k·‹ðÙºÁ•Ú/ ‹£@iÕå‡M®92v85Iäß·¹ºú–âõÍøÕð+ÍÃw¾ùëSc®0Ž9-•J‘­(Bį`Ýÿ‚=’ øŸ¤—EÎz¶³TtmT(EÑ«ü°2àRo€T%¨”ÚùoµJ;`A,v“ÀÀ7ìxò-=»Jsó½oÝ\–J9gÇ|%å8“r탓@~ãïó$˜P ìð-b”™ù{ 'ÇÁZ»YD®n«T¡Mƒº *”‚ô*?l8pƒÀÇó¯ÜG;¾ÇD°Ø} ó›6îxRëø•çÇWÍ©vs¡ã8ßK¥R=3­…㌿—$èÄT„½>àOÌëþ o½ïy®ëÎásµƒ*tiá.† %/½<—ÿO9¢ðÊ}4@äo¹vÀ’Ó+°¸mãΧ´sŸÒêüìÚ»OssE*•:5cœ†?¶ .ñ/Ôu0Ñø§ÿ‰ ~€âo€ëºó€Ùuƒ+Ut!T(±ô*ŸèÕöÃ7©²‘Ó| ø´æÙ¿þ¸qçSÿÖ3«´7üln•1òYÇ1ßL¥RÕÁÞN¬Ñ4 %ýe¼q%€™ÞL?'D$ 2ëZx" þ^àkƒ†t_­g«k @‰Ð«|âpà².ÿ¸Ó>€/Áo ðS;7î|Jëž•vÃ/>o’ã˜ï¤R©iÆ$í ˆ];ÀCq^€$@ÖøGÜÿÆçÀ0¸®»ÚZ.2¬Ç=SJ€^eODø)—žR¼ÈˆjÀ¾Í,ƒÅn¸zãΧßÔ3ª´G~õ˽Œ1c¾YR’ñäføÑf?ÁÛáÌÿ\òŸ ÄýýB gèsîÿŒ sýãàºîV°³†¯Ò NŽ %K¯²‰ç?A¨M&íSdý @®Ý´óiMðS:·üæIŽq¾]R’šž1ÎIuþNž–¿qeF<ïBN„=øD@îêrC}½»˜5|d/ ½Ê&”—|¡[4É¿þZ«PîI¯W 6í|FãüJ‡âö[þTcŒüqÌ%)'ÕÓ D3ýs±ÿÄdÿâ<áÞ¥$Kʇúúú­X;käèÞ*:)*º8Ueú \ òÙä‘Ñ  ø¿Ä}s:AÀ²áàÆM;ŸÑF>J‡æ®;þ:CÄü&•JUKzMü ”`†?è H’¹ž²2· ®[¿ÕZ;kôؾ*:!*º0UeÆ7 rœ÷ˆoêßh@ ÷¹ûw=£î~¥Óp÷N6ŽùVIÊ …€0ü±!€lÙ_BífÖŸàð_i‹1^8ÀZ;ëñýUt2TtQªÊ&œüJ`Xìh‡ mú_‘Œ»׳êîW:÷ܽ¨Æˆü1æ’T*Õ!Q„›þÄÖþûbÿ9@¢`AŒÁ­÷<ã'ÖªèD¨è‚T•M¸ ø®@¯Ä<ÿÆ,·›}¸yK½ö½ìnnؼëYu÷+žûæþ}†ˆÜ’J¥ªü" õãúˆ€lÍ|éŸdCvBDØLM‡Ü­ÖugMœò“Í»žÕ.~J—bÞïý¤ˆüÊkDpÖïäbü9!MüKÊþVx×Zæ¦ | ›^í[pëÝÍ®u¯¶ÖÞ6åÈáº~@G@¡ªìÐrà‘d¿È@„ÑÑÚ¥€ØÍÀmÀ5›w=§-J•.ɼ{lŒùVÊIMGÎôMPˆoå?îü‡¯ 0™<ïzKLµ6+¬ÍåÕðÁ|kíçŽ:æ`½.;0*ºUe‡®>‘têÛÈÞÿpÅæ]Ïi’ŸÒåYpßã½Dä6'åLHvùçIþ#Rà]o"ÉWjÀø[ï¯Å">¨ÿ`žµvö±ÇQÐAQÐÉ©*;ôDwöK¾à‹‰ûûkT/ìFà*»6ïzN]ŒŠ’fÁ¼Ç«Eä¶”ãLËdògE@ÆàÇÆÿãJÿr‰€Ù«0.ЂM‡2Þk-ÖZáƒúæa™}ÂIãTt@TtbªÊÆŸ r0°Ð©o^@ƒ*²?>Ö>†ðõÍ»žVÏž¢DY艀‹DäÛŽãô"“àëúYø'Üø'Ð_"`øM§ÆïŸ÷Üúúæ¹®}ÊiUt0TtRªÊÆŸ\ RWÌ©½× @D°–½ÀMÀ5[v?¯?"ŠR€ûçÿc&"7§§ È%f„@ÆàG:ôø«Bï‘õFŒî6éäÀ>ð§1Y¯ß„ €NHÏÒñ—‰ðn 9ý­] è•÷Ù WnÙýüzæ¥x2"ÀÉŠ€hì?ì !þÈ$†Ã™ø„BýÌs­ý±³ŽTÐAPЉèY:¾¸øOJ Ÿâæ ïQ\"à=À·¶ì~á-={ŠÒpÎÿÇL¬ÈÔüç<ÑØ¿Wý—3ú…âÿ¿YQó¸ÖźžÈx>qö1*:*: =KÇ÷~,Â%ÅŸæÖ©Èí‘}l#ðàæ-»_Ðn~mÌ>5•þ2°Qىž¹áVXûbá¼Ç=O€qª¼¦=d=¤ ~TÄ’iä7ú™Ç}ž×Z¬ëzàƒ´'`Æ'OPÐÎQÐ èY:n8ÈoE8Öú~žó¯°}¼åàqàk[v¿ ‰~­ÄàÞéTã€jé úT½jL‚d³{- ›v!¬Ù ¼' E°¯¯ûƒŠ„VfÁ}ÏD¸Ù1¦ÊBlòŸøÛGr¼³ž]i"!2·‰€û ¤=Ì>÷Ó'©hǨèàô,w"ð##'·ßÖ¹ÀW·ì^¼NÏ\Ë0¨æ´: d¤ÀǪ€ÃAÊ©$OÍwx[p˜P²˜ïÜZïî&µÀ>–,AxI`ÕkkïOÏLË3ÿÞÇf7ÇTeÎ_xÕ¿@€ïœÆâ7ü™û1‰€9€Åu39P__?ä¢ó/8e¯žö‰ €LÏÒq§s@ÆžÜF ß½& €t¢ß†ô>7oÙ½X]þÍH]õ©µ"Lj½^Lj$3Õ‹=ë9¯qà Äï‡ZȆ“ÊD°X+žÇàI„¿ ¼ŒÈ¯®^°AÏ\Ë0ï÷z"ÀøE¹ä¿<îÿÀìŸà\Ü?hüýO¸Ù}\×µÖµŸ¾ð³§ÏÕ3Ó>QÐAéY:î2à» ½rWjø»Ðin¨>PHxF€Àì­»ÿSÏZóPWýáZà$éÀñ"Ò'éüÆ÷~ìx‰ˆ»¸Ðí@¢™Ö"²^àoˆ,xJD^zåíyõzV›{ç>’N•wÈC+Ƹÿ3E€9›ï[<&ñ/pmÈ;àåÔ××ou]wÖ%³ÏÔ„Ú!*: iã-pP¾ÓYXÄ<'|«Q•’™N<ˆð_[w/Ö,ÿ&R[}J­ 'ÓãAúx½“ð5^”ȹJ\a±€ÿóÄŠœ ذTûþþÊ[óë™n~ÿ»‡/ÎÕ7 IDATg¿czeÎeÖý:…~!l¸ Á®Ÿÿïi*Ú*:=K©¹øOÈ”ù%ŸÎf‘] í/€Í4ö¹vëž%ÛôÌ5ŽÚ^'ׂœ„xF_ˆ›éK¨ór’›>t¶¤8±/ Ø–1(Å€ìn¹ u°{Ddð„¿,_ußZMãž»º¸#gøÃ¡ÿy‹'¹2@C6)˜3ük]\×éòÀ­®kg}ñKç¨hG¨è ô,=dpÈ'Š=m#Ø\¹uÏ’Ûõ¬5œÚ^'×áÅñ½™¾HŸtEú(KìùK^J™ÃÝ7> |?Îèq[‚¯/1sKÔÚµ EøíËoÜû‚ŽŠÆq÷V€½ÛgšõúöúÜÿáñòøYߟÄ€·G !Ðu³®ë‰ëºX¯QÐV×ÚY_¾âS*Ú *:=J+p ȱ =­\ àÅû÷,ÑxØë¤Zàto õå×t’hh . hëcŒÅ$†nGfüþí¹ý²}éýåjØÝˆ<"0aÑK¯ý~·Ž”†ñÛ9­n5ÆLÏdçgÏEn DZ¦ô/[5öþÎD“3y®×È3þ¹ÛX¨wë·Z×κâç«h¨hçô(=ätàW‚ „"Ogó €¸½°|~ëž%ï/’USK™ˆL#×O:G>ÞÑí…@è܈ää+ÌYýxsb (2=¯€!Ýp~±ww,}u®†•À·ÿ¥koc¦[×ÇŠ<'ø>cŸ›ñ{÷É›˜™ù»¡Ç±ðA:'àÊo]¨" QÐŽéQzÈeÀwzM\ú 4¤À÷ð=À×·îyQã¶E0 jê €O#rFôèÆøBÛžo_¿?¯!Àl3Æð‡ÿú=¾Úõ\Û.FänàŽWÞ£B Hn¿õO½¬ko7ÆL³Öõ™èÒÝþfbÖ× (jüC" Ó È7û4 rm:1ÐË øö÷/VІ¨h‡ô(=¤ ¸ ø¾LÿÖ±ï#|5Ã?øÚÖ=/Ð3—ŸU'.¹\ /Ñ4þÀñ%á<4LJô*Vä¶IS€ÿvBºÀì?½-"2›lx`1ÈÝ"ܱø•ß©(‚[~ýÀ2"U6]è??6¦ €ÖŸ¹Ÿ”ýŸiãÙ@ÆøûÃ|ày~ðãÏ©h#T´3z”Ží r5ðÙä“ÕÊ rS°°øð›m{^Ôæ>yPuâXà;ÀÉ }cÏ„DWJŒœ£fˆÚ7IøîKð³æŒJüÌ¿Pü?ûWü¥kQà«eÏå ¼("?xaùÝjDŠà7ÿïþOZËoŒ1iÜÖF·ç-ÌÌú±X—ñO‡Üp‰ õãŸ|^Ï_  Ñ£tìXàfãòŸ¬¶Ì€UÀW¶íyQ—ðÍÀž'ŒEøÈÉ }ƒ}ÖB&¾Y@x{cÃáû óDÄ@ á,.þï¿h ×ȆÜ7Fö Ü/ÈõÏ/»K{ àW¿\p޵Ü*YO@n›µq¿ qqÿt~€õÍú3Ë7óÿlˆOX×κöúÿVÐʨh'ô8hìéÀ¯äd¿Ö¾{Ù}» ¸pÛž¥OêY‹§ÏãÇ‚|Gàd¼…wbyc@¾í‰Ù1ro[l“ ¤Y¶Ø<€Âa€8î_ŸKôrŒ÷¤Í"\ÜòÜËwíБ˜Ì/>ï&óEkÝ\ÂïFÀ°û ½ßàk^(hüý=üë¸[]×uÝÏ/UЊ8zÚž½ø%"’ÚúF)Θû/ä¦ ì à’m{–þKÏZ”þ=TY:äGÀÏDä( "wc\íáã,ù÷(ètu‹›ÕKúUý.têÓOÜ ìö‹Èþôí} Ý›~¾äºøùßVBQ’oç‹ÿò„gÿqÆß÷iD¤\Œœ†0¥®ßaï­Û°ôM•ñ|äôϺnýÁ c]ëúâö!·¾¿¤Ïúgðnn–ŸéýŸÍþÏgüsîÿLµ€[ïb¡Ì­·§5åôןyîÁ•z†Zõ´!=[;ûå1Ö-'ò½z¶­ïCŸß¶g©–ù…èßó¸2óÿ9†E š% à7ô¾Ôíõ kDØl–‚l¶"lN›ÕÍ€|zƒj@ú£Dè2€P&H_ñjöB7. `ðåD¼I{¶‹0‘ï?óâïë(rãu¿ïåºî<sŠW;6·p PØÕq9Ä®X/ Û,(×<ÈŸð¿7_¡ž€V@@Ñã 1ÃA®>‘|V¸ú^ÂöÆ Ÿñ‡ÏnÛ»T—ñ Ñ¿çqS¯Ažr¾Ä%W›+ MˆÃÂ:çñVáû°X-"›Wo~Ð6çwÞÿLRŽP*È`0I„ #E¤_Vˆ$zrß;Z0ûO?ÇÈ• ú’ìC×?ýâêhò³kïþ¨µÌ5FzXZú|]Éz²!Ê‚+ÚÈÁ/@¢ð¿¹ýë*Zm@ƒÆœü4½|kž³Ò±në#íÚè'qpÝ4#"€©‚|áðl»_ŠOÌì+1÷Ã^€Ü_Ø"rõ“/ÌÑE†|üøsj\koäl7]žñÏŒÁÀ‚@Ä}7~ ¸p@¬ð½Fæ>^^À<×ÚÙwßûÝíz¦š­@÷ƒÆŒ~ L‹ø–Ñí {ñÜþßÛ®Æ?K¿Çö¾ Ì&+à’VÛ“˜Åv’y\ ÷£kä&à‰uÛþÞ!~£M¯@äÃÀGEä£"R< ƒž'€`s $/€ûlf?ùœ…:²s\õÝ[{»®}XD&ºévÁÁõüÆŸØåÓ»%¯J þx‘ ̳ÖΞ»àû*š-L÷ƒÆ¤óa˜=ð Ÿ›ðx‘¥€{€/nßû’.åë£_cb42åw»€ç€Í /f÷ñn„1À¼d¹>‚8ÓñÁ›¥®Å‹ë?,Z¿íÑNï²3äœ:`¦_dP6W &A01°À—ˆ¯g€'¶Š0ë_ÏÏÑD3ßýæofXË-b¤*œèwý3ÏNÈpã“ýåƒÖ™FBÞ«×××ϳ–Ù÷ýá*Í„ €¢ûA£Ë€KA¾ôJ>ð-!â·%‹ìK·ï}é6={9úõ8ÆkЄ ;›qÉ/DX,°û½÷ÿ¹9ßk èy‚ Ò œ|!H?/Ào×W­ßþØÛ]ñxzÎ éÀE"29vYáÍ yüíƒsá»äjnûçs·k^@šo_ùë‹ÀÞá« Ìþ‰~WÀ„‚\_•€Í½ž¿* 9Ly=Á­¯Ÿgás þø#=_Í€ € ûA£‡7Ïwˆ[6 P¬È.ݾ÷e5þ>úö8æ2ï‚d\Úès?ðĆÿj’K~@Õ‰‚Wg?B<‘øüúíu*7c;tFµŠ˜É¾NÂóP%à• Î>÷Ïçn×™%ðͯÿ¿ ‹½[0Ó2IAãïßÛF[»ñe6&y0bìýI1^¬PïÖ/p]{õ½Fó8šˆ €f¦ûA£§?ñJüšÐÕ¯õÕøÇзÇ1—7x¦Â>Ü<±aÇ“j [‘C†Í¬á"à["¦É% 4þÄåà˜l©à<„Ùÿ|VEÀ•_ýßt“ 9%Ó¹/ü{Ÿý_ @ØÝ_09Ðÿ8Á…†¬àºõ[\—Ù|èZÍãh*š‰œË?Snóæv"V_Ù¾÷e]Ô'MßîGW \2[àŸx ‘oØñ¤ºÛqÃgNF¸\³E¤,3ŒÃB Ü(°”pl…@æ¶'DdöÏÞ¦"øê—þQkí\ðšù×°Öšå\þ¾ÛàÛ'ìΧ`Ž€ßp{áL™ uí¬??òSÍãh$*š Ë¿øÃÜÆ•«€ ·ï}YõIÓ§û‡*ù5‚|¸cÃŽ'uQ™vÃ1ŒQw6ðM129;’cúD«‚ ‘$AÄ`ç *2\~é 3;2À—éL Ïö_ëàœ0ÈW d…±BÁó¸[¬k¿d­]øàã×k“§¢‹5‘îš òàäü{6ÐçiÞÓ4 Æ?ŽêŠÉƈù…ÀÁˆüÇÆO-ؽ–A¶+Ö°qÛò}«Ç-AƉH©…|3þ¬ð¯R d0"ã€Cj'/Z½nɾ®~Ä'M½÷ßïêé`lܺ|OïªCþ`Œ¼ ötSš@æ" ÔwQüË'gþf„€Äž4¤vòë«×-éòëÓ?ûü¢=S&²Ùuíé‚”fs°1Yÿž±ö»ï] o7Þý ]r8à ‘ÖÚ3‡Ôõê;ëžíòç­*Ф²Û¨¾Ýœšk«jˆôo+ï½E~¹ü›×o~CEÇeÓ¶Wذeù+ýjÆ¿ŒÈ†ð…ˆVø¯‘`.@fÅBS†ØS‡ÔN^µzÝ’]ý8?¿ø‘WŸtÊÖÚenÆH§»õ¹¡R@oQŸp¥@¸¤Hg@x ˜#@0wÀ†Ã ™ê)µÖž6xÀý<òÙÕï>§y ¨(‚ÊnŸ2azà˜Ià -Ë+øÜæi ¬Æ?™}P¿ECç`Öå+úÕŒ_ 0RDÆ–ö{ˆËHbÊÀ9¸vòüÕë–ììêÇø…%¼2iâI`95»?Æï毈-La1ßp(þõ±”m­>xÀ®y÷9Í ˆA@*»Ü·›Ss pMl¢_»™„?Q㢮æT³cףѹذeÙÞ~5ãF%"csWCž|ß5¬ ÈzªÀÖ ®›ô÷Õë–tù‘IOZáºîh1™|€pßäæ@q3÷ Ñwóí#âþ’óŒs];¹®ß”Mk7<¯y!T$PÙíà©Àíé¾ä¥ø~$€À݇’Ëößr5þ>j{T"bô(±sÇÞ7õ€tB6lY¶·ÍøEÀ(36w‰$äDrˆˆcÌ8,²zý’‡»úñ]²ôѽ‡M˜ºÈuÝQ c­u³íÃÆ\ XëApóybDˆk½öÅÈH‹=³®ï”×*Í!+·ìZªI!*»\ÖÍ©ù Ùò¾<ý$â·7¿PãŸÄ!µ³Ø÷ïm\ûÁöõ[ÿ~@HçeÖe{û÷ÿØ"‡ÉUë„Ë3×MN„CÙ }ìÚI¯¯^¯I/¾ôØÞ‰ãO\dmZÄnò¶ ÎøÃûº!?yfûQÏ¡¥‹-XJ­µgTV2¶¶ï”GÖozAC¨PÙíà±À¯€/õûé€À%ïï[þ/=£AJR=kÓÍ]·õíòÖذeÙž [–=Ô¿füÀi"Rš¹\üa€¨È]Sþ¼€t âS†ÔNzhõú%ºúñ]ºìñ½‡rÂ"×uGZ8Ħ%ÏÎcfÿšùGŸKŒÁl'÷Ú¾°D7`‚µvò€Þ“7½»yq— ¨*»,ëæT_‘îèwxþ½%r³u*¢Ûcž÷pþûû–¿¤g5JÅAuåûÿ½cËÞZîוذeÙ+ýzú&p&P"„KÃ" 8óˆ¤è=¸vÒ׬ïÚM‚^^þ½ãÆÿ¬ëº3-Òú6h¤máx}ÞY~nÿà{èDˆ/È– bí™zþZuÅ„•›Þ±Ëž¿./*º üJÿ* ?#êh+àû‰X|öý}ËWwõsšÄ®ý«÷ªñOfPïÓœªòÒ³|„ô,)=ËGòþžÎ1IêW=n0NÄŠXò‹ÿº1מ0V`Åšõ/¾¬£–­xbû¸1Ç­³®ý0PêFbþ…Œv1ÛÃûÄï—ýÇë_Õ°kÏt3v@ͤGÞÛ²¤K†ºìb@ÝF–—_¤o¾¥{ó²6¯À.¹øý}Ë×éÏ‘’D]õ‡{•G€T ô&•^GKz#XŸ¨Ül6!²K`%°Ì{\V#l|gã_ÝŽòý'Ž>·áV#fºÅæ*¾~‘5rU›>üäós4£,Í9ÿúLër3PåºÞ°(hØIxµ¶«}÷ÚêSj¦5 g“ é4–%üx¤enægS6#¼ <)°ä·7þå½ö~L&Ž>·ZDn‘¬@¢e‚qK Lj€ùÀO¾0Gͤ™öѯδÖámÄ‘íOh&ïßaƒx  `­»ø–Û–®º½Ë,ýÝ¥@pÖOßøüþ¶ ûHܧlÚøïPãŸHŸîê#P¾qçÓït…ï[Ûëä2`"Ó€ãé“<è$:öãYòï/™V:Ö¶‚< üá¯FÌš7ßûS»by“ ÄôÃ^bfÿ„=og×0ð „Ì ·Ö]ˆåÇ/½9ç…®p®ºŒ¨è6"=ë—Oä?-)â·7´@qôé~T ø°‘Ôß6ìèüEµ½N> ø*"gdµI_I ò'ø —œ†r`D‹Ý,ðÈmÀSomøóÆöv¬&Ž>w(ðOSëÏ qØ·ãŸZ|G—ó0åãÌS/Ÿi­½¤§JðsÝh©^À•QÃ^Ìì>æùá%Šñ‡ "Hakí¬½ß¿¾öîï:õyêôI€ÝF”zþü$o†£fñ­,Ò?ìjü‹ ¼ÛÀ“oÚùôÛý»Öö:yð'DÏyé%ÿ+ b±Ä{ B¹ªå‚ŒÎÎëU9jP¯î£^Ù¾ëõíåxmزl{ÿÞã×=E2¿ÁK ô7 Ê~ok1UÖÒkí{/> W\Ž×Þ|ê•‘ÃŽ~ݵv–ÙÝ„D=ò$í% ƒ8Ï·SxÆŸ}n>@z{ºÒãL'åŒéÛë°Ç7n±ÓvìÔ ¢Ûˆ©ÀMÀçA* -ÛÛ¾@ Ôï³jü SÞ­öKÀÿí9°¾Ó÷pïQ6ôP/%›d•…B# "ûæDDŽfôª5¨Weû¶,[Þ¿÷ø÷€iCãq Šßfï'eL݀ÞZûÞÒ·ôªËñÆ[O¯>øÈ®ëŽÆsŒ:ù³ùã;ÿåžã'˜{?ÐM¯'ÈÑÀÙ½*GméÕ}ÔëÛv½Öf u6lYöïþ½Ç? Ì‘¹OïûÖþØ?áï$žÛX8dÙº÷–v‰ñÖÞ\ýìÞaƒŽ\”QÃïÝôå Äx†=7ÛOßÈn‹ºþ#€̓Cûä^*ûù@Ò+ rZŸž7lz¿óx:(/Þ·›ÓË[¹Odxþ½›_ÿüFËߨ±o…ö¯.‚Þ•Sê@®~´çÀú.QÒÓ½lØ^`† ãWS½ÑçH^Ï@‚!='öëÓsâÓ›Þ©Ãÿw P^2üàEd:™~ßyiF }~ƒK|cÇ~5þE‡n¯9 ¸qÏõ]bùÖû޶݈#Èa‘\IaåÚIJÀ¼^€àûeœçx®÷³{uõnu÷ÑolÛõÚ¿Ûâømزì•~5ãŠÈQ`síÅÿƒ¡¿7 <6xyÝõÄñöÚçö©ò°µv uíH ÄuÃyÈî'w?.£?kä‰~¹ÉÉ z¿° ·6٠㠘ܧ焛w¼Ô¡[ešŽüáËK†*/þ à÷"rdhÔäÁ6àÑâ^ªùê)³¯´ø"ðU5þÅãÍþù4ا7ïznKûú{bDZ-0ºmÒ`ƒîÐÀ¯bÂþG“ŸïŸ}ô~ Ü9bÀY=ÛîðÙZë¾”. ÎDCýê£ëÞ{¯Å^qÄ„ ËôJŒçÏüjKYYÉ…®ë^äÖ»Ûƒ ~6fm€Lc ŒŸ—P8Ì'°¹µ ²Ã-³0¦Ÿ5þ62î­µœÌ;è3—ô™õ|tXP^2ü|à1¼•ûR6Æ“L!sÝp)`›wÏ=Àe;ö¯øåŽý+ÚdFÔa±œ¦Ð%m1ãÌæÙÇ6ð-lø6YD„_•˜Ü6bÀY‡·ÅÁ{éµ{7WYëîËÍDs%i™š-=ó’\ÿû)X{–^ˆÉ<ôøMöÉÅ7Ï·–Ù®u·Û$@è1—à¿|pÈÈ ÷`Öð:ØÐÐÎH„¬T¨¹ÎZ;LݧOëˆç¢Ã €ò’a‡”— Ÿ ̆ü‘jmÕIÀ3\—îØ¿â6ý©h5SúX¸4}þ»â_kƒW@¡{Ü%SÈ PÄÕfã÷ |¦hÐ5ó£zðàˆgÝðÀþæcy¢qekm¬7 0k±Ö^1åÐ Ô P€§^¼yžµügº /qB€€Ð ¯4Z+À'Èünûðä0cijûú®Ì{ØPlÀÆy–­ÅZAN掩ûôåcê>Ý¡¼F”— ++/v ð'¼#ÝZîÝl ~Éó¸]öl5þæ£"2¥Àî䨢¶Çz }Ø¢7S(ÀÆÝ·5À-#œ5½µÞÊw`ágÖÚíØs¸Np›´Aq-¦XkOÒ˱0Ï,½å>k9ÕuÝûñ/àgàÓù™N‚Öçº'”#É#ˆò{ãØÆD•ƒ¢"ç à:¬?ºöüã è ¼dØT`p+ȰâÜ›MÃÜÜ… IDATù‘l ¶i¯šN"z¸pÇþ•¿gmËñ ßÉØÔõ¾¾­óëžx/@Üݨ/<Û·ùŸQ0PðÝ«[ÛB¼üú½Ï¿ÅŠoæ™þd¡…kü†%çÁò…ÃÇ}æ ½$ óìË·..q­½ßúò/r®ÿpe€ÏÅŸZ6+‚ÃÏú\÷DKü¬ï* ÄlLJY² Èf0Šç ]{þå£kÏk÷Þ€v-ÊK†õ./öuà~3â.’~©lë}ÐH`Cž*XìãÀy;ö¯|RGMÅáuÀñ6—ÉÛ%û%ØB×GK„lÂ{‡³¬Ãñ׸çï·™ÀÚ­u×úÝÉÖç/ŽÔ§û—©u]¬µgXì©zeÇsËnÛv–uÝ?d]‚ÂËß.83¾ü³zü­„Ã9>¡FÐðû½ÙÇ‚‚¹±#üŸ)íò¼0tíyíz ´[P^2ìà/À5@Uƒç×Ò¦qü|¿,¾=³‹úœ¿sÿÊgõg Iœ ø—¹íÓ厀¥.~´ŒÈS\B M¾_Œ¦Hz÷v(^~ã¾·,üÂ?¹ xIfáeoÓe˜–ÿÐ˲xž_~ûVkí%ÖÚË­u·A´™ý<„=¹óF`ÿ¨ ;ôBŸè ¸-šïâ È©Xî5ð¼ëG <·g{<æíN”— =¤¼dè\`.pDG¼‘{ðÙûW®×Ë¿ÉL ݯìJ_~`ÕT ¥2§Çg¬£ zÑÙ~~á (& î3X,HZ <ëœV>¬÷ZìºÌ÷ÈÎ C‰fÖ"p±Öž>iìù‡é¥Y<‹WÎÙºxåœ,ü§µvG®$3\òG$103Ü %Ú\ía`çZGùö"f(ÇnK¿~•ˆ|¸oÔÀsÛ7 Ý€²’¡ee%CÓI~r.P’ÿMuñÛf}nñ¯–• ?.Þ¹¥.#ÚDÒîÿBg¡®‹†¾@]jaÉçÈû:‘P@ÂL>»¹Èþ6Á3`Ó"Àò³Ϊm­ºìûÞÁrS¶ø+²H ¹œÃýè¥ø´^¡ çÅWï˜ö“Öº¦½)»%f! ›à®÷' ††t6ý/lø 7 Š«6fxûþó*Nî5ðS×ø©vã h ¬dè‰À)"ɯlìNË"Åï•mð³sÿÊz©7 ƒñ2Çýd‡mÎÑHº¹ 暈õ Hvý75 ù5cEÀPàºÎêÕZÕbo­}—@+Zù‰ ¬7`ÆacίÖK´á¼øÚçZëÞïqe{¾a4Îþ?¡ñi ¡‘h {‚(ëÄk¨ äËXî;xÀ§Ú…7 M@YÉÐAe%CoþO3là‡£ x£E@Ãô±E½¦Ý\¶sÿÊ_îÜ¿Rü4#bNÆ¡]éXìÑ@y¾QÙøP‰¡€Ø=ò¼nþ¤Àá/ÁþSÀ ­u\—¯š·ËýÙO^¦"Ù硾C¬µÒK´q,}ýÎíÀlkÝë-öýÌAŽz‚pAfìØ@ŸÐµ‘J‚ðp·IF?ó™¬MHÂõ{&,ˆç 8xÀ'¯?xÀ'ÛÔÐ& ¬dHÆÝÿÞl¸‡¥fìÒðžü6ÿ/XØ„÷²+€svî_©5þÍÏ9Ñò7FÔTLéJ3¯iñð±¡[øuœ@âû×>8ûã<£•Ýa­Ý,7 ßö ™ ÷#t‰^¢ç¥7~»ù¥U¿ý ÖÎÊäȹˆ&åù=þ:ÿØŽÁ'Å ó<Ãy‘±íû\ÁJ*ÁË 8xÀ'ÛÌÐê ¬dÈ dkúã;ùåsG6¶‰ÛÓD;‰YVû ð±û_ý§^ÎÍKMÅá¾ä·À¹ÝŽÁ€ª½È|¿bQ]L( î¹Í—`ó¾Q|½ ¼P@«äy,sÞsÖÚ?d q™°ˆÜw±Ö3aÔ¹õjm/¿y×|,Ù¼ºäm¨ËŸß®‡yÎ_kƒ¤«ÁÚ'sLÎ@d[æÝýÞ€™­î h5PV2ä²’!÷ÿ—«éo*52ÐÐ~è‘ä¥{Á^ œ·sÿ«oé%Ü" …L/Öö‘.r NoA„°zs†š' òÌ<®ÿzC´â1þsÚ˜–¢ÀoB6°?–ÖïeÐ YöÖ]Z8ÏZ÷n2‹_ùzôû‡S Ó_AO@îømþó4 _kIÁ‹¤ äËîÙf«vlqPV2¤wYÉ+GAÎzRôL¥¥iÑwYgø¿±sÿ«ÛôÒm±s8„lýäÂûPMÅ”®Ð“}ZpT'Ïð‹¹ò‡—ДʀÀóåÜöÜÎ:¹•Žñ߀=/€ä²ÍC÷Ó1ëG×EÛS7/Ëߺ{›1r¡µö"kíŽìÂÌqÙù6¡P/¦ÑOL aÞÔ0<´m$a0ß5g±d+æŽì?óò‘ýg´Js‹ €²ÔÒ²’!ŸÁkæóc oËܶ(”ÈÝ\ÀîÇk^4uçþWÐ˵Åɳ ”= ˜Ð™¿ü€ªêÀŸofž<ê‹ ñÚ¶ð4 2  °AÊ,öŠÎjñ–»¯¼5—µü.øu¢«Í·Ê§¸®;^/׿áå7ﲯ¼ó»ùÀ'-Ö äG8üõ„ýDÆiL# †ßwP¼á'Ôæ8×Epdÿ-î hP–|°¸‹¼Í|ŠŸ•4zŸ&•Ú¼'/³]r§s0}çþW¯Ü¹ÿÕ®¸m[‘Øüû„´û?qä68ÐÊ 9 ïÕÔH»}†ÅNkCmç[ën Ï4mxMú˜û •Ö2U/׿å•w~÷ µ6°{r ‚IÉ€ÁmÁIzB­a?ü`øc/T_A˜;²ÿŒËGö?§ÅršU”¦O-K ^ÌEhrœ¿9æöqí‹y§¢ÊúÒUÖ2Ë ¬=oçþ×þª—e«21ñzͬ©8¼¶3~ñU'ÔßLÃņ ²œP()0îÑâ=i÷ïÜYÕÒÇÛuí;Öò”ÿ3f|Ò³àýt&ùÙh~V¬¾g›ˆ\ˆåb¬]Óáeÿ’+búb`[Sdg×Sh…Ž{¯®^h?ç¾f° ¿b!Îy¦|ðA½†Z€WÞù]±æžû,ökí]ñÞ€`…@Òõ`­oÙ×_†˜øj4ÌðGÞAÎÑïœfO$m’-M .ÎþGÒ±XxQ)ò¤ˆ­Ò¤×Én‘†7ùñÅ÷ׂ<Ü<±ëÀë]pÉÙöCuÅdx^à°äó'€}äØ-»Ÿï4k.ôïyü8GE‹Å_‰»ò_c’ïê“Ю1×”Hâ»äþHÌG—Ä÷’Ø×H¿—åY`ê›ïýioK÷1CÎ ¼RýI‘Ð×—Ð×0€{Éò7çÝ®WoË1vðùb];ø)08\JÆ6p=wK¡Ém¾0B1od#»‹€µv+p'pÕª ›%±¼Ñ€ÒÔà©øêùµL³MÞ›æ).ûXè5làr¶°Îbo·pü®¯_°ëÀë Õø· ÊñÜdΧ ûÃNöÝ¿-BŸø¬åô’«[›"âøÈ1…>œ| á4{!š¸øâî«þw÷UZ¿ßQ°¶&öL<íRvJGüªý{W\rlò -“Ð," ¼[ó‹€ôž§ ëÿ±íþøÚšû]àåÌ;Û`@ŒÑ~?Íh;^[wï’ÒҲπýÖ}(“¶oø‹,$\nÞ@Ã_ÌÑ ›-´·ï;­Q½0Š¥©AuÀÉÊèkž¾iòWd3†£üm÷UsôòèpômÄÀ›ÔѾd?Ïøß|¢¨HGœó˜mð{ؼ·%"+¿–ÉXZ¾ÔÎÚmàs»¾¼a Ìâ@`?6fÈ9šÐF¼´ê^[ßCÀ4 Ÿ±Ø%’©>)ª}oL¯À†ôhðoVždÅLr Ü6¼ï´†÷Ö qU¬àðÿßÞ™ÇÙQVyÿ{’ôMºo'éîtwšl@:a&(Aö]MP‘Å™8 ‚ ó:Š̈Î8|FP‡dÞÜ^7PÙt•„%‘U¢ [ÖN§Ó[z»t’çý£êÞ¾KUݪ{ën}Ï÷óÉrëVÕ­z–z~užsÎã”mÌ’ßî«ìþ!¯@팕É¿](ÑW ¢â°gÏ8©cî cIYãò  ˜èv±¸Åð'p{3w½F“‡0ÆÁÝ 'çÀIÀñ…®Ï³?–>è'fÓ^ÇW— ó0¨@‰ÙÐñ‹Øë¿ø)ð^ƒ¹Æ³VÏPqÇDB&ûÞà2Be1û»ýI¢#žBXäàú eàW¼ ¦Óß@ìy»¹w·0öqWi‹£‘ö´KT­Þžã‘J¹¹Ù3NZ܃Èe.™Ç]ä8åì~™²6Wtl†Ïuæ”À·SØø#ÃZ ¿ “‘_6Ã{<ñA&Œú” ¯wü¢÷õŽ_Ü,3Æ\ƒ1k- i-Íà”]Ð_sq[DËkà÷˜J0Î}ËÀå·žë;Ö—Ý»eVnüßyØû™üW4ÒÞP£ø§É© ™²nkþ˜=ã¤Ó€Ÿ‰È¹ÙSYû¹Ï°ý‡a‹SïñLÛ#Ù×Åq·åÇ©7ï©™d yœ xtï–û€+Íþn$œUý­µìï\ŒwB—cåBàneM-0-‡V°»\n uú ¶N?á`•ÀG€™&¯¶ëQ 9% Jýà‘3àÛïüFylÚo[fùà _ƒf“Áôd\§qx—ÏߥÕÀ„\¦z¢òÆöû·¼Ñyÿ9 ÌçÀlJSKþãÖÆ3¿1Þ¡¹ÙIt˜¬"8§Å€F÷nù9p Öb@d¿ÐjÒ̈Y;z €|œS?䘶ѿÈ8Ðýø`ÔzVAß° ìÀð–c”wŠH/&ÆÆLÓn\y¼ÑùÀ–7:ø/àÝ`~ ŒdF d4W,Á îa‚¾úsæ/cÈ*‚s^ ptïæÍX–€Û€]¡u©œ¿õ¿wjæ&¯½T”1-XV€ ­ (™[¦7£eúqsZ¦wnËôã/m™~üƒÀ:à#\Ôx·Á,mÙ·?@¾NnGB8Ùúˆ€ñ)V ü†ýfÇÿîO´§DH¸“0)Ó2 8T»qåòFç›E&} ø˜ÍñŒ‚©ÄÅ#¿€Í Ÿµß8´9‹jù §ž’OŒîÝÜ \;mÊ‚gï Ì0i—%xmÎxâF|œÌ{¿Ä¹ .•†h¤ýòá=o†$t”ü1ûAœ[”1^É<¶òªZ¦wpp$iv7ŠCßoáB¶Îl_ƒ8”˜ÓÑfü}$íº2²ÿ—òµÓueîgìâQ¿“r*§ãýy’ñ!Ch‡]q¨Ú„CbÚãȾj DµW6¯o¿Ï¿ho»àÁ|’LZ–¹“äŸïÒ~ÜE|.S穉±Ú€y@ÛÑ“Â(„ѽ›ïÇZ¢ðÉv¡b(³ßr1æ–€ïE#‹4‡wù0Ÿr2ím´`¦¥þØÓ1Ü œ4§¯,f|t^²<2r¿#<ÃÝú¶?K€kܳŸÇ4Á CnÙKƒ=6¤]PÊGc<Ó¸ÎÓn<1x³ó­ˆÜf0£©î 9«SÚ}èe¯ôÚ©Ý+ñcÛ¯ëžVŒîÝüð?FÒ×YJíåSqÆ÷^rðH4²è|mîeÁTï*sj xB[0§|üÈ ˜S ßð@ïóf9F$>º:Q\`H¾T·…â‹%Vv·Ú§æ™@¼±ýþßcXŸü ‘øì¾C@gÁÔveûArû³-O+7îüµçRö“Â,€Ñ½›ûÀ\|Ü@o~OÚâø¤ï Ù®yRØ…0ºw‹Ý»ù>`™‡DÄvq(XÌ{¿Ìå½ö´Ö`ŽF©({ër¸@¿T‹•œÈW³Ìo* HÆK`]&" »5 ¨ìt7ÿgñØ6¦Œl¡Jþs†cö;,:è§ü™}ÀsàÏh_NS|ø;M*TYŒîݼ¸Üs›]©®:aæȾ÷ËvkùÅhdчPJÓ×üÖkƼ[¯ÉiµyX Æ@.û*2 `žoÞž}ßx•Cêܰ{üîö†f2|tèŸX´·µÁ|ÍižÞ8¾Ÿû}Û7.ÝÅkàÀlžÉvÝ“ Y(£{7÷ŒîÝ|-p¹ÁlÎðÌ.‰ðq.ÓÀ?G#‹4D°,cŽ=ì«È.\·çv…á6ŒŸ…Š7¸ûÈ8æB@à ŽéÆšw÷]ÿöÖú^TWúïç7àÚ(ƒµûŠI[Ò =E±þ¦@9œ4ózSÓŠ¤ûìxYûqùspë¹g’0ù'×¥Ëcœý²ÏÝãæc\r¶Ùɬ¾¼©û·{‚ÜÛ¤RnlïæîØÞMן$„UKáxt§& *8#ÉsîýØ6Æ2ÿúZ§ßÕ §À`} ´" Û’ÀñßõèÁCF‹ÐÖ¤HK÷’œ.õît  Œ9¸õÜÚƒ[?x½íìw𸇿{WJ÷0¾|¯\Y¢åÌþ.à ›º<õ\r'¶wÓýÀeÀ‹Þ{–À ÍX„&™ølÝÂæ_Å!×ẂÆÎÊ ²n€Û/æ)L€2ó7%ðÜ–ž#…n„ƘY^W‘1f?˜íÆåÉÁ­\æg ·€4z®Ȭïõ–Ÿ2™4žBس]€¯lêþí ¹ÜgÙ€ØØ&Ë/,Þ¯†±N@æyÄß‹F½G»SAˆ;Ý­ÛBæ_¥7ý5»àæú@û&ొ ãUûîSig+è²ÏI´Æ¯Ç2õº•mÆtÃVíÆåÇÁ­<øÈ³&u"ÈÀïöMòÔ›©ßU<ÜÜë½–•ˆmê®À^U0—s„é[cò8NFàsÑÈ"]õ+dúF^Irºó™Øz:Ï.àeuo»µ S^÷‘ãü¹C9V¸…ý9ÕSöýýN ¤­½žÓQÌɸB`âø((8¸õƒ~ CRNÿŒ?ÞöݾMótÁ`Vø×MÝ¿Ëõ~ËN€-Œ±ò@¿ßUîûù9Up+€*u6Öt€æŸ®ì»dÔÛß4Õ1«Ó=ôÂ>`×5Æ)püCyˆ€´íŘHõ Øj`uqš ™ïæ˜Îuü—] ”µ| zPËî4Æü˜k|%ÒòrtÛÛx;ô95茭‚aÿj0ŸØÜýÛ¾|î»,@lïfÛt?ð) 7hR¯¦N ȇQP^t«COÓ€©¼¦—²µ±Â8zmª@òÑÇ”@ê—›·ö¬,øüú-gMx?CìG~æt®:– µ|` ðù4PcLî&ýô=ýœ~c¯¬»ÿ-àºÍÝ¿ëÈ÷ÞËVĉmú° ÌC¤¯(è‹b‡:›E¹¸X»[¨ì̡槓”¬§¬Ë£…¹n짃‹ÿÑÁœ³ûdŸ°ó ½YŒÆgŒ9ÀæãµKziÄ Ïðí¾¥ç –X!~"2ÆOæ>?‘ÿésúø0åyü؉· fpÉæîß…2ÅUö 6¶i-pY¦µ;úqðåz ³Hw¸yÝ{Ôïd`i/j-˜?ekc™ãg‰"ìßàW$íí°‹—å ·)û!þP‘Zà@³ÉóŸQÆì7˜ÍÚKå—´ IDATËA-¸ °BüL0s~jM›´Aoùîçw’ºöà?üËæîß=VT„ˆmê.{1!Û’­rÂ"ØK–s¥ 2 øn}dÑùÚýBaY¼î]ªëˆB]P÷К!`•Ÿ+ò9~â{P¯$Õ90ûý¹½x²8ÍÏ,ʸB 4 TÔòþÙµ¼ÿN0߃®$™9è`Ð÷ú6}ùà8‚Á c¸js÷ï¾fYTŒ€D„€íhúý[Ê!. ‘˼ ¸«>²èpíŠyÓ…q÷º÷¨»B—ýƒÞóEŠ HùXæ" c·S+ì%íõøÖÞG‹5¿~¬ëõ§øy%_«<¶içïv¢ƒZÞ¿¸¬ùþ oøÁ}ð7eàq"“ܘ¸~sO¸ƒ?T˜ˆmŠ;^&kæÀrqÿH3ðÅúÈ¢™Ú%s§/öJV¯{—Z]T¨H›Éê fd@H9ì‡MáE@.Sn§7égÿe›àÜÌ)(‡E_R–0ÛPŠÎA-ï?xäd?žúnKüú7ï{íá1è'eµ›ÛÁÜ]ˆ2©8'6¶é>,¿€ýQzgÀÔïäBà;õ‘Å/«}Vò–ƒ uAÝCk±òXäØî‚:¦mÉ'<Ðnß…þ“¥Þ—5ŒeVm~Ô‹ùÍËçÌÉxÜ¡C±b;+GbsPËûóý©ýÈtÀÏlYþŒ>`¾ \¿¹ç÷c…(—ŠP¨ÌŰÄÿ–w×Gëê¹óŠsŸò¬ÇÉ`N(ðuýÌvo_•üœ –#ÀþýœE@ÆopO•šÅp˶ÞÇ|䆥Ÿ!H³wR‡û0f+ðí¶Åá –÷Gj9ç[ñù~Ï<ýðÝçõšHüCü™a¾ ܰ¹ç÷» U>- áp9ðxTFxý>ÈIM–o `tõÀüxèu.nÏ©€ šêŽ(TH ÝCk6c’½Ñ‹!²Ï±^øÏ?"Û5»ô›ôkÝŠágElwç$_”wâ˜ñ0.àñÍÝ¿×EàÀ–sÌOAþ ¨q´:yŽçþüÔ½³“òµÓ¾ àƒ?LÛØ \aà6û[`¾DêÅå(‡ËJüçk}O¼]¬¶6¯é½ó¬çŠÉšÈ5µØÔü_(l>»¸=îì—‹9?ЀŸz0ÁÖ ÿ””Þ÷ª-=|¯e7a@llãfà ƒyHrZHÈO+*ˆ¬¸¸^»v ÎPýYà²B_XÏðš·›ŒïÁ/ËʆE×gÏ«æ!Ä/ ~”óO`VƒùQ‘ÛÙû€æäå\³ Ëü¿¥g…šÿCæÀæ³Û{¬~dà82ƒtq ÌOöàÿ&pQ©˜àŸ4˜‡’:£OŠ5àbôý¤:âi #hý8±©î]sŠp}¿É;„´,D€âÎäpí¹ä Hù%Œé>ßÑ·j X Ì~ûÿbŠ"iñç!!±EÍÿ!s`óÙK€‚œëÕ\³ûùé‚|ðôÇ›obð¿dKÏ#¿*eNx p1p± ´†@ööaý§ V€xd€†ú /¶®X_6³’27Ø 4µ™"äaè^3 \kŒÙ–š({KÉEYD@A§¾ÛÑ·jM‘›ÙÀ™×˜¶\ÆÝ›­`Ôü"6Ÿ½x8i¼í—Ì~ŸÏƒ¾ÝñôÇ f=ðñ-=k ý¡‰€,Çå* ô:.Û”€G_1æàkÅo^ƇPL_V0ðø–ž•jþ‰Íg-3˜ï»fõ T­Œú&Ø[¾ ]`ÎÙÒóÈSåP–U#âØE€wc°þ–PÈ8O#ð¹úÈâÚõ³–ÜÓ:‚”³]Úǧã{†×Üü8a…ÊW" hˆ ó…!`}ç7J@Æßž®ìè_ÕW̶5·é=K œìÿaŸ´ŸQóX,h>ë"àû‚ÌÍiÐOèSü N¹¹D˜ÛléyämÊ„ª#v˜ ˜Íþ[M)‘³ïjx 7ýÖ4À/ïxT¡XüScÝ»¦éRÿÍóÁÎg;ËOdç/Þ>°0yˆç›KÞkøçíý«7– y}Ygs¯{˲¼ÿÍÓ(y³ ù,+Ææùü{ÿ¸¿íû=ÀÄÀÜ\¿¥ç‘¾R—c2“«µ1íïÿKÍä†A‡f?Bü}+~ü ÄÇ7éûÈ;€E‘ɳÛ³¯7†âÈ´šÙÝÀ?Ô8–·¸–øbà¹Ñ±Î× }±±ŽX]dÎJ`±KŒIo6â«ídÞJŽÇ¥o?Çd¹N‘àÇØß‹ãu˜a«·÷¯¾·Ømjnãó@¾Š Z²À?oí}t•öÌÜYÐ|VtfÝâÛ€ˆãN!X`³."øLÆt×né]ñØ›ûÊ­l«ÒgÄ„äE[ü5Báí% ˜€Çý;zÆÃrøt±¬=ÃkzOÃ+"’öü*¦%Àa‹CÒ\ƒe´¾7Ž×ÁõÛûW—*\ê„Öñ·Hç;rxCÜ E] h±`ÖûZ1ævÀŠñO£w©¿ä>—ï~&âOcÖlé]ñýr-ߪ#co÷b­ðP>ç k•@ï} hx 'ý±uøÉtôó,z{óYÀ{‹u­=Ãkº›1»DO˜Ž+P„@NÇ¥»tnî.E{šÛxÆàïS*Ç×rNŽôóÄÖÞG{PrbÁ¬÷-Dä²ðú2ýù9cÊiŒíì×»¢,œýܨzቀñ†ÖÏ¥áÙyxÙµ^\晋mè^s?p¹1쑬Ëáúk%a[Æ?ä!àíàüMbEtkð¿~{ÿŠš"5‰/Yyÿ]®ßçÕ‰Ù3V‚%Ìzß©À½ˆœägàwÜÃCðq8Õcs+ð‘-½+ÊÆÙϪõHgl¬frão€õXñ¾Óp}4¹#ñ¿}Y sñZ`ydò¬5{öõ–}#+6£{wì™V3{º ËMF fõX¼6:Öù§b]ol¬ãպȜ×v™¬Íe™Û—sýฌ¯Åc/Iû¿®ùjç®?ì)E;šÓxú©ÀMâú,péýÖ}Þ»­÷±oho ÎüYg~ø¶ KœýRbh ˆñµ)Þ¶1;Ïmí]ñõØ›£•PÖ*’Ûß?6¶¿]Í䯷€e8vüR;&¶×͑ɳ~³g_ïn”¦ÕÌþ+p¦@›q+Oq*wà¨Úš¶FÇ:‹–e.6Ö±¾.2ç`‘ˆ, ÖîŠ Rw–«òvôq\p]ç®'ïÚ½i)ÚÏœÆÓk;yGò $>œíñéßGß~M{¢æÏ:³nfÝ¢ÿn¤Á-úÊþ*%ɳÆì_ ò‰­½+~SIe®SŒŒ½mç  ?Pc!h^€ÀéÓöÐð@7úcëz€Ÿx–¹‹À8øJ±¯¹gxMp¹µj\H!‚„äÚ¸ÉË/Àx¶ü×€ :w=Y²üè6Î4¾áY’ÎXiŠï~­½Ð?ógypði &üÁßçÒÀ._enN¬ä‡1ûï>ºµwÅó•Vîjpalÿ«î–€âXR¿uµhx  îV€´òtž ø›Úš¶¿ŒŽuþµ˜×œ"¸8ND´½BX¶nJàà²Î]O­+e»™ÓpÚ¡ßÉ*¬],7më{üUíÙ™?kyí̺ök;A³¶š,í'Oq`rÙ%-)•$òùÿà–­½+û©@Tx`‹€À± 3Ó»¾÷ƒÁþ» ¾‰Öx( {öõ>ªµ6ÎèÞ±i5³ë–;—¢»¤h¯­i»t¬³¨óy±±ŽXl¬ã¹ºÈœ7°¦Èœ#ϥŔBx\¯ˆÝ.±Â[oêÜõTɽæ§O;è[ˆœŒ1q¯¯ãÄ2¨ÞüÇàèÛûK}åÎüYË—ÿüÈ´Pæõ“•~½S-Û)WWní]¹b öVÙÅ÷ûE@¬„A @MnÞÍ$þŸ¢X–D&ÏÚ°g_¯Î;&a[Þ'0;kyfŠ€¹ÀìѱΒ¬Øeû<Lx'"Sýµ™\E€cÝz–+K/ÜxÜ£yäŸv <õˡݛK>hÎi8í"àœžâ%Ôƒ‰7tô=±A{ž;óš–×ͨm¿DàÛˆ„îÓg °§eí11à6à3[{W¾Uéu¡ÀcûûwÕLn|8’´ÊÅ!’"^W0Žmˆ‘´â_À©€Åµ5m¯Žu®/ÅõÇÆ:Fbc+j#s^hC¤}Ü ÚŸpüT0þÁ‡Ø |¸aÇÀÓ[Ê¡­Ðpêï ÌÊÞUÓKT~ÖÑ÷Ä×µ×¹3¯iÙàÛ × 4š¬í8N¶i§}Ã#iŠÜÚ»ò¿boU„—6TøÄ\IŠSxŸ/˜hþëž}=*l¦ÕÌ~x§Àß:—¢§ˆÇÙSƒ¥º‡ØXÇ[u‘9¿Fè–dNIeoOÅÎÿ3Û@þ¸lÇÀÓO ïÞR¦òN­Å =;.>(ù›½KìÕ \58º±£î§Ü˜×´¬nFmû%v_úõU‚`FÀüäÊ­½+Ÿ›Hõ"éfŠA]ÍÁMÀwA|%â)® ñý Àò¡=*Ò1¥4Ô.=X 48—dVKÀÏ+ûF^.y™6×=¸ø,Èü m*¼õ¶ºZ0[ìò¿yÇÀ3e—»â€†So¾êtY{®U†_íè{⟵§e2¯é½K@n>XþW›ni0ë¶ö>ú¿±nÔgK€Ç³!õ!áƒPDÀ\`adò¬G÷ì뙦ª|Ý»£cZÍì9ǹ—¶§Sà;±œ3:Ö¹·”÷2²§c`dOÇsu‘9÷V9Y|DÚ7òò½åt_ÍõGGAÞ\ œÒj}ãë.Ç·ä;%o߯lCxxä©®gºÊµMÐðîSŸÚ¢Ù'~Ÿéè_u§ö°qæ5½÷Pà&à|k­RLþ kÕ×€»¶ö>:V!žóÝ*9RWsp3p#ÈeÀ̬…\\+@\ÈþphφkmY4Ô.½ø1I¹<‡ÆL³v/ðɾ‘—*·{k®?yXaNšA&9%OÍ_HrVÖmôy²kðÙåÞ˜ùî…ÀÏ9ÆK,¹—†``5ðÁíý«Êý~‹Å\ë­ÿfA.ç?½ÆíÏ÷7më}´â=üýµa%oêj^|‡¤ùeׂ.JX`Ê÷ÃÀ? íÙðK­)h¨=L@~"pQŽV(cLsý1­ÀÁXBà|¬ufK"¿¶è“pkÀ߆ås²ºkð¹²ôã´Í|w»À9q<Þ?H?Àtgmï_½F{Ìm|Ïl¬·þ+D$-›_8CÓY<%†[ð@ÒAÖ,Žé¾r÷¶¾‰ýÖï·…+¨«Yøa¬%K< º¨V€Ä>½À'‡öl(ë«X4Ô.mÆš 8|¢‹€8ÍõÇL okiÁÊ‹p0Ã{k"‰û¿ç. Çþw;°d-0¼sð¹îJ¬ÿ¶™§´?‘Çþìâaa·lï_}£ö(˜Ûøž¿¾“H T’ë%øoZÙücþ\·­ï±ŠKåf *y®Ë ا¸T-öTÀÝ@£{©O,àEKý±™7,ÈÎÁ?N¨Œv‰Á9Ñ8¼úV&¸ó¶÷¯®úH›¹ï¹¸ËÚTˆµz_ðïÀ·õ=¶«ëN@ÈøEJœÚâÁhx`2 µK¿ p«÷Üxõˆ€‰N|ð9×ef½ª:þÓòþíý«_¨æòœÛxF¸¸¤&[™–«€ë«ñ­?  ™±ý}¯z-'\Ò©AÓ˜VÓºä%Þ¥î)jeµ5m¯Žujò¥2¥mæÉK°ÂÑN Úï²a{ÿ~5a 'æ4žÑ.pÈÅ„>Ž ~JNå+ŸÙÖ÷Ø›ÕÞ/T€pE@ÈSÂ;€v0º·+6­¦õ13Ú¼K^E@¥Ò6óäåÀ½ ‡1Oêa–í§_ÝTµ‹ýÌi<ÝN™,Ë*,¼o=ðÛúÿïÁÑ·5? * †—(ÀÚO,жg_OÕûŒîí™VÓÚ r&^b-ý“Š€Š`öÌ“/øÈù˜¨­9c^>Ù¹ë%_±°TÌi<}9p¯ KM üüA÷ ‹Ä/Þ|r[ßã*•o¾¨( É"@ò¡;,ŽLžõª®£{»^VÓú:ÈrÜ 25Øb:ÅÇrÒ´Lþ7uô=¡áÎYPPDRD€È´”®R"‡@ûŸ`®FD,Ω­iÛV[ÓöÆèXgÕ¤-³gœxpð Ó‚yú§ç>JÞnVŸéÜõÔPµ•é §Õw \LÉÿŒNfû…‚õâ¿ ¸´£ÿ‰_ŽnT“¿T™tò¨*ÕT€õÓïÄ \©" L¶_ÀyÀbÛ/ *³Ž…M댛£Sç¸SÂöÇ}%1ƒ¼¸´s×Se»’a¡8 áÔ:à±9+ý”¶:ÀÜreGÿji € €à.òϘúm`Ïð›=ûzö–[¹“ˆ±§.¨­iÛRWsÀúØX§v†iqÂÀÿò1iÙß)…û­>±cà©mÕV®Éƒ¿U¦ùe÷+¬X°¢3n¾ÚÑ¿jD{F0T”§é«M—p*ÀâPàÕ=ûzþ\íuT€XËFŸüMmMÛZµ£uú K¢Sç ¸ ‘ùnæä\„€ÞüŸ®ÚÁßZÞ<—0¿ð‡{§Eüâ/K³^àâŽþU¨É?7T”üD@˜V€ñýIJž®á…@DàpàüÚš¶)µ5mÖHoZ§¿ :uþÍÀ79Žäg—ø®ofÿ*üß]rpYá~Åï³ÈÝž#ã{<\´½UÕæe%ÆQ”*7@üãá*H× p-úÄ„OƒXɇޮ­iÛ¡‘™´N?~ntê¼ÿ|ä ê¯;+€K«rðŸùnëÍ_ä²r¾N;±O<—ÿg·÷¯Ú®=$ß2UÊ‚ø*‚"Ò€1%Ÿ °"jèE¸bh÷†´† ¡ö°&ï œç{A×âO®ëÁ&ð ðŸ½#/¿TíeÝ2ýø9ÀÅÀçZƒ´{/!àÜ/Ìí ÿ¶càé¾j+ç”ÁßÅ\¢¿ñ¬~7nï_ýýjïá•«R6ä& 3ñ„Ùœ<´{CÕ½9ÑP{X3ÈÀe3kMÖ'L/ðcàG½#/¯­¶òm™~ÜàKöÛ~k<­KNÎ}’µ¬cÀíÀ¿îx¦ê¦`ÚìÁ_ò5ûKçK®?`ÖWlï_ýTÕ?„B.Y¥Œ¨«Yøa»i«s €„ø9påÐî šXæ¡vé…ÀwÂñ¿Bàǽ#/¿8‘˲eúqó€Ó°B%O¤Õ„èÜ—.lQÑÜØ5ðLU¾M¶Í<%ÍÛ?èS%| ‡D>†+·÷¯~[Ÿ<¨¥¼ˆÚ–€°D€ßG¨ë"Ì}À*Æi¨]úwÀÿ4…)Æ·`†Ç€€¬ìyix¢”_Ký±s3AnB8()k­Ø[ئä×@.ïx¦*ß&ãƒ?Äçüó‹ô/È ·~spýö]تOœ³Ayb‹€»i £*ó TàBCíÒ#/¦ûxÍ<ûã[†ðµXVzG^ÚR‰åÕl ú§‹õ¶ "-€Ïä} Õ;/«‚îAøb×À³Uù6Ù6ó”(p{ðP¿ü†Š@G[Hñé™/oßõ‡=ú¤) *ʘhÍÂÿ¯4Q™û©p¦¡viÖÃê|ºìAL^UàÇinààaàwå.šë™ œrpŠ@‹óÛ¾¯åú,Æsĸ»kðÙªMÇÜ6ó”;Oîò V.†Ïlßõuö+0*ʘhÍÂ(ðD>V•æãdB½øØÐî 1­%‹†ÚÃäBàÛ¾§rŸâbà÷ÀsÀ+½#/•4)Êø€Ï9@pH‹Çï¼5o!ðò_r}×à³ÏWsm›yòÕÀ×AjÊñú¬g o×vîúCÕ.½\Ü2WÊšhÍÂ&່œFµæk°?à£C»7Ü«5”Š=%p“À‡â•YŠùø¸l±Þr‡?Ù^Öo"ÒÕ;¼6tQ0+z´sD˜½èˆ=໽åû½7{k©±“¦Mºï·t >WÕ«¶™'_Ü⽪_é†ûÅb=pyç®'ŸÖ'I±Ê]){‚‹€BO€^à“C»7<¤5”JCíÒFàãÀ—™÷hCd=O¼‚Œ1X‚·Y¼ b ƒ`’À0³O4hŸÏÓí£@=ÐŒßr80X,h¶–:Èÿñ“¯H’·î|î…jo³gXƒ¿Ss?KÁÃüVWvîzR=ý‹ˆ € AE@åÑP»t9ðyA–qðs+ H«¬´ÅX÷c ü“ÄüãS9Ý qKA³}â: Öú×äÅeMæÏäøx C$Ìý¯‚ü;ðÀÎÁçª~éåäÁß1ÏO(#€äy¬•‚¹sדšk¤È¨¨ ¢5 ›ù.–u^Õ›oh ¨ðCCíÒàRà_iÊ: ž³ðYÈ¿ x›pÜœ{B+B@³ ø pÛÎÁ?VݾNÌžq’ƒÙßO)Ʋ> î®ïÜõ¤†ù•]  ‚Ûß‹LjZ‰p9étº´oóxS‹¯0E× pbtïŽÑѽ;žV3ûQ,SúbÉpÂò#\Ê?`'öÂ;—ÛV z®W!ÿf'p/péÎÁ?Þ?²gÛ„É“ヿ³À¸ÿ¼ÕAÂZóMàŸ:w=Uu)˜ËÆØþ¾XdrÓJ(' *²0ºwÇöÈ”YŠLZµ²àÎ+Òe«Ž¦Æ+ÎOíæÞ.7‡ ,‡Ç`¹zçп=²g›†¥Úüsv«Ls‚­IDAT94õ9cbÀ_ìÜõ”Æø—¨P¢‘vË'À×t@QDÆJ_«ÓY°ó|¸FùÖVm ¦r>—בy ¸ó1f§XKÁÞ±sèùªwðKgöŒ¯ aðÏï™âÖÔŒaá3;v=¥1þe€ € &ioîÞ“oUç•ÀÞd‡òô |rPE@Vj—Î.ø,)B È" n pþ‰@mm° ¸½[~G¬Áß)Ô¯ôy+Á#ÀU;žúžÖVy  Â‰FÚÏÆš‘OU‡aP µKç \HŠð[}…p>ºÖ€Ä<ñVàVàgÝC/tkkq¦uƉ×H ³ñývv¿7kw <­ ~Ê€h¤ÝZ<Èʺ–su«(-–Eà<àà¨x˜Eöj sàöë à|n[Ý·OOw½°C[‡;­ö›¿ÀÔü–õÉíˆìç3o—ìxú­­òBÀ¡E€½¤­Š€€4Ö.bMë|X†HÈÉUø)¼Îç9-xÛ_ rðd÷Ð ;µ%d§uÆ Ifÿ\kÁ/’Ãþ:ø—3*&*& µïD˜t$ÈÅÀÀüDž€u›[¬ØÖk¿äAß³Mà „_+»‡ÖìÒš÷Gëô.~€HÄoÊåÜž9Ÿá-àbüË "À¯ÒDT’ÆÚÛ±Ø9 O1P~Ö{¡¬„=ò8ð–©ÿÉžá5ú¶{ð¿ažÿÔþãýs¾:Á²æð…ÏTõLåŽ € H¸" ?`ý£" L’ÄÀûŽ™”[-xŠHˆ“`xkNÿÉžáuÀσÖé'\ƒå t`€©£ÜO™HíûñÏthm•7*&(*ªƒÆÚ㇇GKE ³Óòÿg©©àÖq<ÎlÖ€ô¿ÖÃ=Ã/ª´N?>М®Ý6X¿ïã³Rà;žÑ¼þ€ € ŒŠ€ê£±îpæïþ˜rÖr½Ó€â'Û»[¾Wcöƒ # [°Öoß¼"Öº/ö ¯Õ7ü:øç7çŸkWv:Xƒ?ð‰.ü+[Ü4æÚ º¯ßܽA¾ Œ% ¤KÌZì?õb-믰éö~XË ÖÊÀ¬¾èEdèí^k´„ O‹=øK  Ex¼'„¢¹¸¾kàY]Ô§‚PPD#íþ_>Í |`î.ܽAó¸+Š Éƒþïý!>òݘo×w >«yý+ ] ¨ ˆLnz8øÛ\ aFŒÿ#‡íS§ÌZ¹g_Ϩ֔¢¤Ò2ý¸«[ƒÌùç6Äç, ¾ Ü ƒe¢  Û×7æoÁ’ˆ€w`‰€{öõìÖÚRh™~\4:uÞmÀPê8×£oÇüµßV(*ª„±}~—ÛÀeßL°xê”YoîÙ׳]kK©fZ¦WÜ\I gt1&0ÃÀµ _Õ7ÿÊF}ª Ë—D¦¸bp÷†µ¦”j¤¥þ¸Và?. çŒaN`F€«ºŸÓý&j¨2ÊÜP,›:eÖëS§4¿¶g_V˜R5´ÔÛü ‘s?Ér$—%‚ƒü'*ª" H‘I›mP ¼dÉÔ)ÍO¨s R ´Ô»ø"'c|äö-ˆíÖ㽺€ÏïÔÁB¡ JIRf"€ÈR }ê”æGÔ9P™È4×»¸WýzÊÒ ì7ÿ7A>²sð¹_imM,TT1e.°œ:¥yçž}=oj)æúc/¾%p ï5}‚ô«¼DÁør¾;ÿ¨+úM@TT9aˆ€Ð“6'‰€EÀû§NiÞ0uJËk{öiJyebÐ\Ì5À ~Éeö>· `Ö—íüãÓZ[J%ˆ€iÀû%S§4?®SJ%Ó\Lm]dîç›óú+œÏm³fpÑÎÁ?®Ó›¸¨P€°E@ž‘I›“ÎÁZénñÔ)Íš/@©Hšëin®¦äÜ? u”åñ·¸tçÐ7kMlT( *@€•Òø‚©Sš_ß³¯ç5­5¥Rh®?æTàXÖ¬<‘ˆþfpéΡçuE¿*@€’BùOÀx¾€æ¶©SšŸÓ)¥Üi®?ú# ߯3÷F>HGÞ|fçÐó]ZcÕ %ƒì" ‘û:‹€Zà¬({öõ¼¥5§”ÍõGGë"sþ k¾¿¡€Ù}‚õ©¤oí+º¸¾{èù!­µêA€âH…ˆ€vàS§4ÏVk€RNÌŠ½¸[„‹ñý¬-Fvö¤äÛ`çõç«ÝCÏk^ÿ*C€âŠ-ÃrV:ÔöÆO¢lDÀ4Æ­]š3@)5³¢GŸÜ%"g¤'öw´ÏÖ- )yý¯îzᮑ=Ûök­U*OÆöõŒíë[™Üô°¼ŒEXÖ€s¦NiÞ;uJó_Ô ”‚YÑ£®ù¶íÆgb?ñÝ=‰?Ÿêzá^­±êE€â‹±}}¯F&7½,+sP œ =uJs§ú(ÅbVô¨Cë"sn®©OïÏ!¶_í`_³¸´{è…•ZkÕ Å7$`Ü7 uê”æ5{öõÄ´•B1+zÔEÀwAN!k|!|ù‹‚ÀEÝC/h‚E€Œ q߀eS§4OÒüÆž}={µ•°°ßúïnšs?S!EA|³äÒî¡4Á¨PrÀcAf¦~[v"àà|¬T¯ïÙ×Ó©µ¨äìè‘uu‘.±cûO!ôgiž%}«¹øL÷ÐñW¨Prbl_ß_"“›€šúmiD@öóÊàÃvÈàk{öõìÒšT‚2+zäàÛ ×>ÜùC  AâÅŸÛ®ïZ£1þJž­JQ’ˆFÚ›°æ>Ï êôTßn6ß¾?¸û¯}Z“J6š¢GN®>+HkfRŸí5ÜÏ-Æ0 ÜÜÕ3¼fLkP)fëTª„TãÆrñïÌKÀ îþë¨Ö¦âDSôÈwc ¦g%eÏ Ør‹“äÇüß>×3¼æWZ{Š: äw r^ç–¸À±šDHI§©îˆ%µ–“ß—Þ™c«ÌkÏ ˆƘÕÀ§z†_|\kP)~+Tª–h¤ýBà;©yÏ %\ö,âß™°øïÁÝ]¡µY½4Õ±øp†ˆ´“Ôž6Ó" ƒ{€/ô ¿¨«ù)…omŠ’N4Òþ÷À×@T–ˆobXñÒ?ùÝàî×tj Jhª;b>ðàïi![*? {YÞœ÷Ža-èóåžá5§¿R€¶¨(>‰FÚ·\`mñç)]" ¾xÄõZ9¸ûµa­Ù‰ISÝó€åÀ¿ s:IÁÅ€ë]À=Ã/~_kR)lûSŸD#í³€oçƒÔ•D$m.âû@Ö·î~M³ NšêÞøo9(ü_œž²â{/óÈ%=Ã/>­µ©¦)JŽD#í\€%0³Ô" ÷s Xÿ ° øÉàî×^Ô®LëÞ5W¬5#’þÜs÷ûoFy&øIÙbV_è^û¼Ö¨N»R”´_ÜrTðÆY."ÀÚ?iõÇ€ ÓCcÝ»N®NhIšê Ö–B!/gÂ{ëz†×ª³Ÿ’O T”â`O |g<_@ÐZŠ0A_ç^ ü¸p÷k[µ¦Ë‹ÆºÃ眜 ,˜™Û_¤Ç¥‹•@ ¦ ø pwïðZMî£ä×Ô´”bb' úðåÌuü4Òr©ûÛï‘[±¢~ <3¸û5Í»^BëŸK†™?ïÖ“Ó^y! «Ójà ½jòWÂjZZJ)ˆFÚ—ׂ,ÞPK!à}eöÛe\ üø½:‡ÆÚÃç"œœ‡µH‹™¿ÁxxœÚiý€{A®ëQ“¿bóÒ"PJ…m øà2?Ö€ÐE@Úæ°}l“-ÀËOkÔ_ TkŸ Iƒ¾ø™Ûϧ-ù9*„G«5øïþ¸»wä%5ù+¡¢@)9ÑHû‡oX‰ƒ‚4ÚBŠ€ðÎ/‰¿Í~`°xxv`÷k;´§±viÚ /-€û˜¨* ÏïsOk𠸼w䥧´Æ•B @) 2ùm¸•!R¿M¼îyø=ððÊÀîõûµ58Ó6è ö $|/ð¯d™þî¾Ø;òÒÛZóJ¡P ” ÑH{¸ä߬րJ.×> üÉþó"–… £šAÒ€ÐÝ3Iƒ¾äXÅþN|;îå¯&¥À¨PÊŽhdÑXóžµþpø"  çwÝ#M}voaM¼dÿûúÀîõ2² ¡ö0ÞÌNiñ;›/¹îßì/GUà_õßvÍ*àúÞ‘—ÕË_) *”²ÄÊ (ça9 é¿W²5Àa±ÿ2ÆÛ€W¶cåX¼ t ŒVŽ¥ ¡ö°6 8k ?8˜Ò:¾gî™ùòvÐËéɘËt`0£b-äsKïÈËýÚû•b¡@)k¢‘EÍÀ ÀåÀ  ¹ÒE@¶kJ¼1 ›„¥@ÖÚŸ·X+Äuf`ôUC‘˜9í“€(¡x0 X4ØÙ k±D@„9/_:1`[6V_ëyùwÚÛ•b£@©¢‘Eˀ밹ÜD€¿cÿ†8îg°| F-ö¿ë!ûß“€À`–Câ$û¸XÒy¢¤NÃLZ=oÅrÆ;ÜÞÞ4ÛÿÖÓDÄa 7„óø ;ž?l'ÂÌØÿ(ö[Ÿ¾õ+%B€R1D#‹€Kh2Ytˆoêå2%àû´NgIŸì6ñ¶`IXƒ²¨¦¥*:~œL‚ä|5Y.Sr+“°Ê6ŸšÈÿgSæú¿Ö7òоõ+%E€RqD#‹Ž>\ 0Í[„ø¦^DÓoH¿“ïcÁçoJ~LJq ù–R°Ý0Ioý¯è[¿RrT(I]ÍÁˆL¶Ó ³<{²×‰0%àów$ŒßÉ÷ñPB ÷s…–åo|×ÕÀ­úÖ¯”*”Š&YT œ\+pxùŽWæ”@ο!ùþN¾‰ùñ$œó„yMy•ÜxôÆàë?ìye@{¬RN¨P&ÑÈ¢&àãÀÕ‚, )ULù‹ÇË×ïåy‰= ê+û¹|ÕÒx‡__틽ò–öP¥Q L(ì$BWd~\l€¯=ÊÕëo…õÈC„EÎ=¥¥x~¸µ/¶îí‘J9£@™D#‹Wã* #2?–‘5Àq·Ja^K×fÿk`µÀÀ¯ûbë4¯Rö¨P&4NB ¿.P>SÎ{[äz¹_|!à}^ûÿUàfà·ý±u»´×)•‚ ¥*H'ÈŸ²xp–eà(,gÂv6[dY£H…€Û±fHâ-ˆíý˶:E ûi (JÞÔG 0 8ä,,KA;Ð*¤xtAöu ‹#B‹ãÏaŠ eéƒÙ&°èžÜ5úª¾å+JAŸŠ¢„úÈ!4 ±¬G°Ð*’îGf7.?! ã(Ù¤ÿ0м8 ¾¢„‚ E)C2D¤ˆ‚ÙâcÉ›B= òO/œaÆß ƒXžúÛ€°RñÆF_U“¾¢ŠR!ÔG„f,Ð̶V2¤ËÇ`H-0{¼o›ÏÇÉ1y‘ëÞn öo›Äva òºW¶›€^`h`t½Æå+J‘P (€éS 2 X„-€C€X"a¿½­Öþ\gÿßÓ<k ¬7÷!öç. ¤Û>o°Ùþ³ؽ^ßè¥ P (UÄô©0 kðŸ†%À“R÷ö|<Äø 6¸ûµáSÿvÒÀî×ök)+Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(•ÁÿŠê{!·Ù«IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/smileyface.png0000644000175000017500000022651512412506713021316 0ustar sergiosergio‰PNG  IHDRzzïÅ4Q pHYsÄÄ•+,ÿIDATxœì½œÅý?>³Ïs½÷ƒãà8zÑØbÇF£Bì£Qš‚¨D±5¨‚ »‰Í7*Q£"¶(šDc b”^®pwÜq•»{žßÌ|¦îîsØÿßyá¹Ï>ûìÎ~æ=Ÿ>Ÿ BÐ÷©…ÿÛð¶½íPVVV]]ú …"‘ÈwÝ!ŒqZrbCóž¬ÄPR¿sQñˆÜxöA“^,—ðeu[ÈÁQ—ôÝèÐ;ï¼sÜqÇу¯/0 +„0í"ôD!~ í £ aä¡CæbzÍúéýi·’ÆãÝíd;éíÍ%û¥ß71—„eW¼ž>=b´!¼7QJ'‚C˜8¨åÚÒeŸ6ÐvܧŽ:D¼âŒ¾G—&BoHˆ :X¼[làX‡øacÈÄ?>d´ì= ØÁÄÁSJ›:.½ã>ÅìýYÓUƒœxN’8¢ûæ]Q§`$ĆL íG”“‡S0‡ùèwЧàѼ~z_Ö›8öu"¬ÿr\1^0dÔlÈC´$Oa‡õÃ÷õ) C€›c±‘½‰w­>Á؉1jÐh?Ø?Ä&?¥S³ÁаùOqÅŽùÐËk¯îS0…ŠÍÞRÑc´«%Z2µêïwef÷¶fŸ÷Q”qfUÈAµOò~;´˜Ï?Ñ—2'vyFFÆîÝ»;êí5¥§"†8P½‰c .¹¨Š^ùãkkk_ɱf¾‹aȲN®¡Ÿ¢.*½bç†ûóØ”ÂPJÁE¡Ç†•=(éî ·Ür˯ýëàQ^ÌÏiüŠnñÞxö1ãœêzúà]ofYrñе,«®çÔecÄûäBŸSöwdN|G¢’‘ljhŸŠ9m€TÞÑçÜR‚šBçÜù æ÷ô5ΘBÝ¥3“Ó+L)ÄFöÓ‹û%-Ühöɇ¡5XËHœñuˆ$°·‰ÆÞÞõÞÝ:LÇŠòI—¿j”œ`zLÅðwÜÐ!Š*5©œ’ó™?&<þ•Íh} Ö!9d­¸ú_i¹i"ÑŸðab“»œ00^Qxn¼ªÔD’îPjR"•áDÉ„æÎ¼+h¶ëÝÌìc…ôï•I‚qoä úêÏéì·ô$ãôJý—0òì>ºC-{ø´‘¢ŠHH?tikþ™¾¡<:p°GuS.SéóªÖ¦àv·#Ô†I›‹]‡ñ$—Ë =¬•ê'+W®œ0a‚îÕ¶„T’RSH+zÀÎHÅþ1²•–"1ûâd9…p”1Lö:6®ƒC(?é0’ &Ô81F´öâþÇ>öXRR’îÕD©îG)˜”Ô¼ÁMÙGs™Œlñ»D U3Øx€úSAoŒNè.JgÇUWW[CFõâw§ Z9RçÊ—$ |T£ÉX¹;Ž`>Å]u$¹6%Hˆù|äbMÜœSË3)ÕÑðœx¦‰ªï±ü‹­^!MåLRŃ\¥Ó M’†+ùÿ5x±ñ‰žtÈl_–·19Õ݆;üh·#îÞùáŒBÿyã©DÿÕ'žSSØÅðƒBO¸0 \é‰`¡WD¨ÒüJŒåygupâ¨DùÑê¸èµ§N}±ü/çÊ+ˆPüŸÉBÑÁXé:ü/ëÇ †îº F8âГLâ×Kƒ2‰å‹7Œu[ŒÖèµî¨=Åž',”vÅŽú‡úƒ‘‡˜ Ìu.˜Àb†K>„xo8ý¦ÆX¾€4pÚÌ ‹Q+VæÞ!£Ö|dœûÜî;ÏOãÚ±ì †i^t¹0ÃÙœRT° vÌI…8©ÄÏe‘Ji»”´xýQGåír@xdãâ~©Wm¿óÜtÌÕuBïÎØ+ë›ÌŒúœ6.Fcä#Å®³Î±þ9 Ëâ(§\§M+{}FžD޹¬DgüøñÞEñsÉ'4s„ÒY^ÿD!r%xÞ-ö|>À‹™ÊÌ™‹&N¦ˆèb=c7¤·=²4·ÁȲµ{´’ ;D8ã ¶&38V€HéWÔÿ¾P°üÓ 8ßàƒ%”k¬y ô‰ÓFP¨ÝLoE¯¡·¥2€O¯Ÿð§²ÁƒÓó%%%(€EL©uG߆ҩaI¿´YÛÓ/ª8dHÜÊßdq.ëpŒÓ.•ST2`ÅÓÁÄÑ-zƒH;θˆõfñY™bö T¡UÛ[æÏ?Ÿ~uÑEy;”˜˜8äá-ßNïχŒ‰â¤áÞ":ã>ú¶*¯»ŸÍ'D(bL†K@ðbì€ÌÑÍ{“qVÜ¿~q¿<4È4sÛ½–¯Õ!ª0vDâº# Æ ÷¥ÍØA/…ºöÿò ]B”ÔTM Pô)óŒ*õÍÆ}ò©B!& °ÚRîY?þ|úmLvõêÕIûïOípÂ;„ù;ÓNÒ>eÌÜáòGg©S·<—# zÿýyµß¤?gïÙ&°”K^¸±°Ð+=¼;v,ýûà' ÓNcBˆ[wl˜v/-¢²NZóúÌÉÕÞ‡{º²¬/.Àiƒ¨â&)Do;uêT“<BrºM; ]š³î˜=E¿bÃGÅûCk¼öÙúú‘–ˆw,éÃ{€ÔŒc½i¢z4 –ãX0 é‚P \ô‰i.ì$·èÐL="mêQ©BÍE Øד¨wÅæìoëM¿~ýàY7ÝtSçòöÉ•ÿÂÜ‚q‰Ö‹A÷Ó?“A1$y:D{C/¼ôÒK‘=XtHõ©îÊA L äNn'P2zƒµ¡(ħêS7ç6ï€6Л뮻ÎÿÐN´0"õ>æÒãR–+íÔu­›MiQ-Úè霢§7Лú¢Ýíô)##ƒ¾µÃ©å+d…òÅp½X5,É#…4hÊý(¿¡3æ ©ntˆ¶Ý»wßµÃÃn¸ªT˜GX(ìZt ¡UB‡¨œ¢’„¡sʃâžtñw¢öiÁ‚€JÚ¨=E-~hŒš‹©~C­¼Ú=ÑAƒÍŸy“NÔ=M^u q93þñÇ«ª¶z®ÉÌ̤ږÒoºÞ•žtȼ;µ|©­Ùñ•T£ÞõÖóàËÞzüóX-ü½Š—}¿‚e{Õ›… ^{íµæ™‰'®X±â»ëÍ!CÖ¯_Ç'–¦\{pÖoŽÌ†Z×xÃûoc©XÓ×õ{öz©7ð˜óG¦­¥¢C:¦˜;KÆgŽM9k¿e? á‘(Ô…¨O÷z7½â€Ì;Ë–ž!%+¸DiH /—Pe\HŒ.÷©Kѱ G¥=tbžô5!Ö0»xXÙ ¼¸QÀ‚v×–Þ÷¯zzŸ·Þz "=éM^^^uuµˆÒ…¥ç+¤ÂPF J5Ùû‰p ÓÁ3IŸy`FÒO~‚:$RGa(ú—iõVlEú_•SÎ+WGtÅåá0Wz0y¬.uᦞĠdWô""ç–·Ú±ïëòGÁ0A?dˆŽýŸñš¹÷lîFjíÚµº+ñ® Áe® ƒ¤ã{ØS˜ÙåÀaîŠÀéT©ž]’tׯ¸¸¸öööÎ{³ß~û‰xt…GzŒÞ0g ¬²(òHïW]æ¹r˜½,†‹à ó\[J;䉪ô†Òðã ‹uCu%κɸ°’^Y÷ç<ä)ð0Fw?U€Á/ÃÇHX¯Âa<î4>5ñ&MšÜ›úzfC)ˆ#ÆÐh"qxÆù•p1}¤„Á$—^¬ìSjà‚Œ *w?S€9F€#—+àœCƇð9çœc&X½¡±ŠÉñ/M$6LfKp öŽ”‰Î_Ü_÷øŒLtBVü‹„Ðî«ÆŒ8‰>ÚáAÒqB–3Ú¶ºhQc´%ÂM)Û o}l6ƒsH"ÙˆñðpÓ°ìøßýîw½INNÖÑ83܆ar€ŒVTŒ¸ÇN|ä>W«7ýr2ƒ8áØW´‰2¾µúââàXkàýyCqf¬É¼œ‘Jy ùdAöHþëñ †Î…¬€@“ƒE%dÝPôæúë¯?mh*±73'‚wïP|jãlâÔãÃ,ô’a "\zÕ«Ss÷o„Û&¤ÔFD”I…â¢*ÊÄâ_-W N’ÎÑj£ˆaÂF`0Ä{2$T˜”ÿ-‘D‚Z N°5IÄ©^“ÒÚè$"æÁ€@=vÌ8œA!LLaŒ–$QÂ2žá™k µè%–F'‹±3BB2¥ §DÈÅa‡tKÅùxW0ŽÕDªCDÄoDÔÒÁ1y»ÂÜKÅœäQ…¬¸¼ %DİãA諯¾ò X‰Ø‘%¢}Ä}¹EêbDrø„Š8€VE<)ÿ±©ÏKÞ<0èôþûïÊpI:OLJ¥Œ8ó’8–©à2lRúD1ÈPÄÑ!\cDœ*++mÜt©ù4ì ×uÚ<ï)›/Èůºæùڅ禧8ûçA-ƒa¾¾(—Þ‰€ –W˜ÈÇJŸ†÷μ…B!{¤ddå¡U¢7 Ü¹\îÊèæ^cAZæ,ÑîÕB2»Æø'ƒTpsJÊ´YÛï,½‘ 3úhÃÕìÇÎÏ–Ñ(ⱉd'îÆÂÜ¥ 'ÜÙ.¼ÆÜUÕî~¦Rݳ¡ùa© Å)NvNƒ³Æ¥¤ÎØVÿp5³¡äÚ¤ ô!} Á‡þT×7k×poC’ý÷ú·{ݬÞlÙ²E“‡I"Éúê–B3^”yºc]}ú0ù5g0v]Hs¸£º"FÊКä$ŠÊø™Ëâgôn—_~y¬®tÒÚÊËË©eš4o‚(šÃƒŒ!ÕLlg–î-âQEE’!C†œ{î¹ëÜ y=oô^Iƒ¹j0Kºtx†£H£ÃUzíÇ"Öœœœ+®¸î6oÞ¼¸¸¸XÏ꪿˜ö†²‡¦¦¦$ùŠ NÅŒRɈ•®‰Nz¾ü­ÍðiæÌ™¹¹¹páèÑ£O?ýônPÇʸ“ëC­ 3O-™]¥“ˆxìßOh›+¢, AñR\ÙEÙÇÕüž·¯®ùäžl–ñ:F9Å—\˜»è]ácž::W#´“GˆZ—Ni´iÓ&OÎgLê(Ô¤áÐ0’Þ$¥4ˆD¢`HÐEøxc·µ[#£‡ò+/#JœÇlëË¢,³îéæ=ò¹Æ“p¿˶Ìljy5‘—@óy»û¾úêN¨3dÈú÷‚‘韔+3#‘—4acZAÞ™b@a›UÇn£Gab–Ù°½¬1ÕŽxøÍƒlÙéüµÕÄÔ ÌØˆeW0BDE’p«q݇9BŒR, fñz ТE‹”s/˜:Òû0eÃBîHtÀ„ ÉtÀA O¹°A„v½85î¸.ei`¥F›_ Žƒÿì}‰¹ãýw‡Ðú2ùTâÁ„@~ET¥P¸2›ƒˆpRFxšÄLO, ¹ !Ü%·ÝvÛ 7ÜðÖ[oý„ç˜PæÔ/÷˰E²4BR`)4’F³$-¨Y•QrB}C“L§Ÿ~pA‚”ñD+žž¸Ò€pQÕÚ”H+êó#>{úwÉ'þ8žN"W"óÄX.ð'R€Ü,³ ¼òü£#?T7›•3€üÍ?ü0&u -=>‰®9Cž"Clk‰î# €hó;© (© h+G|x¥\Ýði%Wâ0T'0 2¦ËV ó•Í!ntÀÚY‚y2$OÜâHá‘AHÅоøè2Üe$8»[]˜Y·Þzë7Þè¥ÎÂ… Ï‘W&¢²¼/E#bYÀkäÇ$£²—‘âYÉe¶5/ç•™lÂ3+B Â@a¹Ia¾r7ì²\GÄÌ9(øG"LG"…‰0±cE X3J©9¬Ñh4; ÒFòúZ‚úmû”Ë«a7ÌK¬M#éÊ1Pr-‘çI#Æj L`‹ˆõãì‹_¯Á8ÄŸü'|ù9¤2q,R ˆ\ëŒ%]xß„h‡¯@œi}ÂÒH̬߲•¶¤~l2ÅGY¦ÍK,;¤A'm.HS˜ K À‘†7”xª””¾ÀSC"U ¼l¹æ«(æ`v›SÃø‰¤¼>¦ªÅ„¢bhƒ&Èí3Ö½Ã\¦²aµÍ¥HÆÁGÄŠlÄÍq—¿œ˜2Fd~!ÒgìǩިoËü]U—ùZ ê®bŸ±mL¬Ëˆ¼L0n”â¹`^³FaZɬ*Ãfj†Ø?hÁÝ ¸lÈüòooìë{‹à@ÿ[×xæ¨Ù!ë Ógo¯_Z$æ”+'—Ê`$Ü;‡dv²#tâÈ2©× 0YÃ9‹£jPɯ”õ¤ÓçT}™N¡¼0éåî6ÁØ\õ‰ÐËÿnil•¯¤_- >êœp +V¬¸îýJ¬2ö¡ŽXZÕçš²òÅ}ôN# )‡¯ƒD|”‹—'¹0½qÑ‹y’¡,VÚ– ³,FÁ2Ê¢2ûPP ©4:!Ær0Òâý›ZÈyÕ4Þ]ÌrAA‘— Pçõ×_§ÊTycÄxyžá Yj¸»8uζ´ée Ëú9¸Ä•ò˜Inì€)…äAññÌOv¼ °pÄ*(t¢©‚,:­$âøÀª‰wnV^Œ cη¾ÜpÇë 鉎$–JÈÜú¤ç™3,'''&uTÛPÛ>('Ì¥1¦£Â–[û¸±,mj+õ•¼Þ8Ê•U¡È+N×ò#)ex±LÒ¦€„:sسL• † Ò¨\@Wgþ‰š2Qœ~9Ë›;ÿà”ege³ë•êæürFTÖ ,=ΆýøVVÀV[€±‡s’BoÎÎ;þž*xdýc…`³¥V~@¸q)RÖ}ÎBBúðiR™„ÅáÆª òr‚d—¹Ä^Ñ."’¼.}x÷ÿ}ÄÖâœ{pò²³³yuCyO‚f¿ÅêR€ù *`–° {dË.ï9«å3œ&ìõ+NTÙžé—TPkp×£…ÜYå`jmñ„Y ˆà ›ð¤]( Ég“rÊ5>eÌð´#‘4¬˜±¢‹È™Å#lrñß¿ÓrÅïEåøá‰Ÿ“"À°óRY·ø¡5ìÊóÎ;®/**Š9³\—-ÝZiiEI R²b.\œ§r-ž(ÿÚ-m$EP»¦þ÷…"­œ›$RøÊˆÕ™’Œ›ÑdÌ,êSK$UÒ¹kÐŵ²°E] —ù Í×Ùµ¨(a$un(G$ÊJñßB2ØŒ3ÔOTÒQGÙ‹ÙKY² ŽP“Ò¾a-tªî,¢iWì€_¥óŠ:´±r.ØV0›Ø¹°Gª°’e2b(†{PŒÒƒ\_¨¨“}~eÔÎÙÕ7*³yQd@¾^iii^^üJ•(‰IE úãæ«±éâýã$ Cð„Ž7Ë‚¦4š¹CýVåj‡´ëÙ<"° Tåâ÷ÁÈ"fÞt¹ Ò -ž=Dyà¯-×?àú9ë äG/È29%3R…ID¤q9uá…ÂGŒqæ™gvNE äÅ“;ã tö!Y­ lbÎwa5P-1„Îx°fÅ:nMSÕE‚Vó缈v àYà-¨rå‹\¯0êòšÕnÀ•¼Ý{~æ”ÃRĤk÷ñïˆâSš4‡rÈOúSøùСCMÒtBE kþV}׿j7O-qÓn@rAþ|YX˜¿ÿGóÌ?¸sÎð^ö¾;"áå+s¹è jh=ÏŠ´á´%V,ò¡Z—ªÇ@õn–"LÙL"V¡AÝá*9̃yÑA)’ÝÑiOÔ½»®µ·È‘•â$Çãu ´ŒoÖ¼7³¤ÝȘ9ʈ¯yõ“¦KÔ¡müøñŠ QŽÑ4gæ+ÆÕN® t¬ã¢äðË3s­L „n}©aåÚÖ ;£ -1g |÷Køh}ûÚy\ÍÞ,å}›AaF¢XçeÂôýŸÔ_óCî•W^™­žÒAºr7² 84J‰sª¯Èž jKÈ& ¶É„‘±ÂRpœ›N̸é$iÿûÅÑ ¡ø·Þ“-®,צ‹ÄË—;Û~ôÔ6Ä—˜A+ÊhÎ9çœ^¹Û*&Tàæþ$–¾.îý–â¬K톓AxÏÕ”Q“LÒàVú!ˆ0i HËÃ;³ØAþ½›Ú-SSS=kz¿’‡F@£Ôx§êŠJFà¦4 [Á,GkÐů%[‘>E#×aÚÚ$Q"|—¶Y³f©ŠœÐ¦OŸ®´›ŽÛ^eÆAˆ"­@¦øÞ=»TùýäÒi2¢Ö Ž!ÍMošå1ß d:âÌž6¶O]~衇žp ž{Pvã™V]l½–‘{*o”LÏ?ÿü—_~‰xÍE)°ºrÀ§Û¹HÎ)‚f½Uýð¿­%zÔPÊ®ÙzLÕz?›ûtÞÇÔÂ… ›šDó¶ÛnKZ°¦»mÈ!§œr´ZÈêiT uÖYž²’=nûv%€9t‡~ø‡~Øë Œ­¨¨è’K.éõ;£ïrÄOxóœüꫯ–/_NíÀÊJËí@ßS•lÀ€Ç{,µŒöy_eûaRÌöÃò£˜íÒÄl?&fû¯‘¦¥¥…²Õ>ú¨ƒkúôé³téÒÀ Ðï }§¤IJJêÖ—òòrÏšc*ÑÌ‚qû´ísÒø×óA;©4emuëÈœø³G¤5"ÕóíWÕmüªñëeÄ}°C—«›gÑq¹#ÙºnÝ:èÌoû[Șݛ¶·¤9ñÄ_ýu8¾÷'y—ŽM×iÝ:ÃT¤˜ðVx3 w@5"rWØ1Ђ@6¤$J­»œ!hà²ÍMÑ›xÛËùµW¤Q`¡’øùÉ…:±ÖXç©W5Úyææz)—(ÑâJÐBúÒ-y„Ȧ©%Ÿ–µñìvè\”ýõìízNE—'äMÙ/MfÙØ+öÔl‚PŒ" –‰)¡ä€»’ˆr¬Êbƒ\gA ž™Sö‹o¹zPΒ͇¯¾újÈ=ïnë iX’ ÷§õK {YÐ j…s6™SÉ NÌUCBróc›Åð$(¹‹@<Ûœ¦5³Jû=°¹¦%z÷Ýw?òÈ#ž H»ÒºMšææf(¹õËý2ÄòˆÀ•åŽ-›±SžG™çWúïq3_ícB„¢S&VMM•QØxƒ ‹:ßEBK"Š×Èiå’Š™LZE£QÊ’÷»ßù‹æ“Üe´ƃåyð2M¡žù»˜öîÚM­éx°£Taâ­¡“™™YW§³¹ÅÛ"‹:bY½¢döÂ.!°E¬£&J’Wnn^°`XïiFŽIÿž<È„Œ½JÓ!z…$5c·ÛÙ]Z÷Cu¤å­×4ÈfÒ…¶í»¢ý²C‚:DRÇ‘¼Æ1X 8Þ]­USµà¥ÓX­iÐÚîºë.Øþ¿I…RmCÖœÂÄ¥ º8AlÆh$$KäÊo—ÃÆ üN´ú=t ‡„q !Ås‰Ä°s6ÀIwÛÜ%K–Ìš5ËsóàÕeˆú“öŽ¢ˆ€žSJêQ uèxì“爂ÈçÐRN,KˆÑF”†`É,ÿJ¼À¶5DT'¢N×€SE9΢ µµµônžú81Qà ª7‡¹cÈ„’)µ%AÏüôи×ÿéÝõ Z$*·ÂRìF…[ˆä`jwйi’µ‘܆¦•+-/d,ÒV4’i·­ZµêÈ#4ïí% 8 RB¢»ª|ÒQ–‘­Ú˜K0ã?Þ’–51Xô~þJŠòÚ6””2|•®å]·[Qž#°¬FÀD®…”ê¢ipèúùçyŇ>³í½÷Þ£¤¡,Yi€^ÒP@ÿÆ‹ìqý‘ðA6±l(©9\£ ñz?‰ÉLºÅk‚$”ͬþ,-÷€ÿMf•Èßœ ‹¹ár×ÀÁØø¨‹šŒ-dÅJ °G5@ÝIÏóB¡õ2Ìf’ÀKåmP;“áøÈè¸ëÝÌìc½‹§>_‘LB: ÃN)ìiølNémÖT;õ˜¸K'dzø¢žÜ)Å lr$Á"?ê9E1Q^^Þ§OŸ¦¦&pòzI£jÁ¨¾Jv#ÞÁÃ}üð‘%’4o./½ÏѺàw'b-Ý<1)N^§ì“”’77ÊrLgNŒ{ðÆd¶hWHeÍb‰ã¬ÀÑÜW“CåÀ;d\~Âç;ëžz꩹sç>úè£ ­,Ò<ûì³ôïÃR½#©¯Š ˆO2>уø0ªù(ªð{"$1Iò£pʃ£)ÃÕW\â°Þü÷dz°y+ØÇáësÁÉ ·/s½upø¢kðr‰«&(?ެÃIù÷󊓯·±R,ÒÀNMQ=’ ,&u 2UFÌh Kl9]T%%Û£u?Û§']âÂŒ.éÏ÷™9íϬÀÕ5JÇS“H•’tÑ*ˆ'ï§O.G çíÃ$öH—ИÒì fÐE‘É‘ BÓ“[jú\0®ÍM™Äº³F¨A/ÖW²-_¾|òäɤÉO)iª51Ï̲´fhpÍ’,7¨å-¥ýsµ€SML"–åj'_ª`Bô¬‘‡ÄRtD…Û€êI>JA«ªªÊËË++ck‰bWOŠE¯ëÛ˜\D|kIY/ÂR'šÓ#SÓÃÒdƚݺ‰#…´*,ågßAPñ%>Õ÷ßÿ´ÓN«®®ŽM“ÎÈäG±¿ò$(ç%®,Q,K:w9ò²ò˜„‰o™•~ãåÍ×ÁÁ¯Ãë“ôaYË—_~IIç:t€ª'Ò«#Ây(hqn®=Zì™UQ4:Š]˜@²dŸ5køºbã)‹ÆseN@ *Èf ¡+Ì ¤¡zúÚKšâ´8Cm÷<ƒ~e÷É+àL–䨖:Tóã`Ú­ž5ªò\×^><×ÄNÌt•S²½½ÝKš~©†½H?½‚.#—y#¹¶ÈÅ ÎfM_> WÖiS[ ¯^½ÚKšv¥Ûñ:¸,˜¬ª)ÂÉY«•m¤‡ƒ˜EÇ5†$段Þ\¦ÒW׬Yã%MØ£³"õÉ6]tD@ÞxÌGǺ ôú'}sº‹ë”*5MnNB(Ö…*ÕŒ )/ij[cnNxã+»9i°áööÌè"&žËÔ ’û ôÕ8"¿… XDr)â{±àžƒ îÑïrR;yÖ¬¯à%Ívµ¼<ïD]³ë}$øàƒ¥ŸÕQÒøñB³kaQêUÛ\[ÁÊcÊ´Uî‘åDÁGg²[˜‚(ò@ñ d…­Õ{š5 QÔÇžÅ\ÚLÈØ°UæfÍ`N†F&Š;K4‰ ˆ;ˆ—6±H³jÕ*:¢êÚ rˆ÷×%DypUÅ–%¬|[xï¬1#Ù-߈L…ðR¼ŽŒ kO­î¨5w¢HOU•k,È(v#&£ô„¹˜ê·~Á.ÊQsM½ð¬çÖ±ˆEII‰I€ UA( |þ0%çÂ'kj›ÝëÿÔð»sR%£Å¢Ì(ß,¨,3K„¢­† üŸ—)Sæ¢jJUe¶¶Ù³Qo–È7/ì8“oF~é©ÉaG*“òòàâ×Yghi*š¢+66Ÿ08IÜÝäµ.úùؤ ùe÷¿Õ8sBrQž#‚-ƒ±[þhQ–Ù N,ì¥ 3+öaÓHÒYÄ®óÌ)•~™Øsjê)’Ê$4U… àã%Í”)Sž|òÉ[>Üu "=‰„ž&>–ÝÑ·ï¯ØPŒ˜»³æá‚¸8,4}Pj)›8ÿÐ@^°­ MO95ƒ”ÒGWÎEªæµ×H5Ú_é— ºL‘8™—×Qû…&&&Bá—˜*ß²Ïë§R9ExJª À)‚:¼´ͨ¼ç¢ô‹KóB°[)ˆ¤ÁþJ‘qxàYls`[ÅçœUIô¨še¾ÆDT¾…vÚɊʖ쇑–œçª«®‚ëÕ"ýÒ¼ñÆ'N¼úݪ©ãÒe‘k¬ n„TF;å_#ЧÎþ}ý¼çÊÍ×Ó aÎw‰¤†bΠÈ$¹˜¹eRIvÅ«ûYú±žSº,3r#8Ë Ë '¥]ÿ“ ‰&yCÃvý¤Œ¹ãããÕO “4&Lc/U8¤Ã÷×àÇIatõñiw¿)õÔòd›‰=U ¦PÙÔAHlíâ`{† ÄQøgbHh‹.Z÷ÉRÙnøTFö»nB†°Å‚ÕE|$_ЍìÄë’Å$ m•••ÃÝòõ/½^¨mü@;hþÏ2þøq3ÕÕ)uŽÿêÍ™š:!¹Ï¯ö ƧVPŒ ¥0’DQj‹Ø7fW^¢8ËÎÂ[÷Áµì[[f™"Qñ\Uc–¶ÁƒwDØLpK}Dt«¿b6)b}óÛ±¿­ÜX¥½C¬kË8gçŽÇóRS”"C¤g ƒG‚KÓC¶y)¨ºŸf™¦`Rü…>ÎÓÿý‹ãVÍÍ×…ã5‡¶ “|cÀ7-77WÇdÃ)))MMMýؼ}z æAu1›@gÁA­¹¹`ÒÕoÛ•c‹~ÁÊ”nx$7' ŠÚKã´d ¾„5í P,Ó(û-^ØSóÚ~ý]láei@ Ú1³gÏV¿5Ë~Ç$Mcc#%@MKt÷’‘̇h¡23@6s…ö/Ós·ïŽŽ¸±Âs“A¿daÀ±ÃïÝ™ÅE "n…8A3JY:ÄÜ’ý|ýŽèf'{‘ðÒô\Ë(µ¤»L.°l#²kç«©Ô içÇ+W®,¼Ÿ•C#’³ ±ˆƒ»÷Ë5Ü_TtMy½¯„îšM‘L^¥™í«yC!7¤i£iŠpJUÖºÃ.­î Ã§ý(éÉ)Ù&c–¾T,µAqæð§··ó$U8Ÿ¶³Ï>»«¤¡R†sèÃ[¾¹¼¿ …ØeLeÛŒFdÇÂ>g?\óêšàú=+?kË%а_U–×Å oõ Í;%õâ#S ÓB&tÁs× ‹Étø´ZSŦ’Yùœ¶ .¸Àÿ”.-ƒiU»Ç=÷åÊ?žZ|—Q‡mDˆ,ê psÛÎòÍï ݨÏÌŠ¦VÒéãbµñ£âO—tÉ‘)Â:÷¾бæ>ôŸ…ZÓÓÓÍŒˆXÅ3»º˜yíÚµcÆŒYþm㆚œA9!i>Š3O0Àæ„IT®H…D³ò¥}@Ç«mŽŽ¾®ª$7¼¶C~Tš*È ="~ÞÉà«–J­+=u™.‚ÅPvkJ%Êqü劻GšÑ£G—””lÞ¼yô[jf–&')ã!÷`p´YÀ-IadI“2+1¼ãž>V’Z y‰¤×F¹Z”¿Š„ F°AmŽ£«æsºð…ºT™t¡ÍSÜ®'¤¡mÓ¦M‰‰‰”%çÜ·q׃’ˆE2Ú%.wI‰‰Œ*L9±LG9´¥ûIÓÁr¸tƒ.´ÝtÓMæMŸ>½ƒ÷í^M Å’³ïݰfJÿ¡9q8DDp’O"µ£¬†‘äÀzy¿I¯ËlJyTAAD‰I#¾»Í"As?Úòóó;®ß“MâããÛÛÛÇ>¹õÄÒ”&ªÜL«$Ì«˜xg\ŠA¾$s¿y‰l/7BÖl2L*sriË€ÒEÈöÐ¥¸¸ø¿øEÇoÚ“Ò>mmm”ÞÕÕÕ¯mlÊZ²±vV)BÆä2)⨒u”R%¬—±ÍK‹ãõÏó–DQ<ȘD«+Ú{†í8A kÓ€D1¶péÒ ž_;kÖ¬¥K—ÙËœÁHleˆeI¹7¨ãc1HN+äÄ2 ¤˜\¬`‚$=ƒäÌRÌeèС5wܸq§œrJWޱ絲–,YRXX8oÞöØc°Öó²7vÒpÍù#Ó™X`…g+ooa;ú´»^“Ý¿”j]—д}RŠ™ÊH:¿^}õÕO>ùÊX|úé§«V­Rk÷žþªþëÙÍü¥1TKOOW!Ú½lû°€÷I¼Q¢üõ¯=78ÿöÛo¯]»–ò#Ïî#±UO(M©)UcµaÆyüÞ{ÙöyÙwE”Å‹{>Ž·Þºÿ!CN;í´Ž©Ö³öÝm8§H¡"Lm‘ÔãFE2U5=Û«õnû®·˜pGñÎH$òÒK/UTT444˜ËòýrÜœœ*n&Mš¤aöuûonL‡Õj¾ïaûa¤ZOÚ{ýüÐzÒ~ÀÍ­'íÜüÐzÒþ›gžyfþüùë×÷Âæ­·P(tØa‡=úè£ÔæÝ×Ïúï¶ÿO᦮®î˜cŽY³f ’•Ѻõó„.L §Äã”°%()Ìbj­Q%¤¡Í­ÛãÖìéä†ô‰|ðÁðáÃ=ç©xá…>ùä“ÝêÏ÷¹ýoãfúôé>ø`àW 4yÉ¡£û%­«iËN 1,uòДÜäå8uRK¬†c}_Ù}éÛ¦?ý§¡¢)šï°eBõI —7ñšp„üž7u=…õŠ+ü{ÿ¯´ÿ1Ü|ýõ×#GŽŒå;(H Y”ôQùž&äý¤D®Äž¸ŽüØ“ÈCÐsy¤ ݹìÀ4±îÙˆÝÓ¶bcóô•UùÉ!H*„Fa}üñÇëž”••õÖîäßAûÀÍ_|1f̘À¯ŽëŸôUMû ‡e]2Vîô¨ëÚÙ‘Àˆ²?Ÿ¥ë͇:©jÕÉkÐ ƒ“6îo^ÿàgõ·ÿs×®=QPª¬¬T Þ)))õõõßs }qC§àÎÞõ=´]8*RüÏ“xÁÅK ”˜5Êü艉%¤b',ˆëˆ÷”8$ö)cý«ŒV‹ Ó~”Fÿ©¬ÅS^(ÿOmÛÖz‘ÞÔÔ¤04a„7Þx#F‡þ›íû…›êêj3Ëa¸llÆŽ†+ÙdD3ÛÀW½Ì{^ÞÒäzÔ|¢ŠxÅ ˆÚë=ò7*y`$ u¼|f¡ÙÉÏ—¾³µ¦E(g+W®„P~ZZDö¾'í{ÊW(wñœ,N S[æËKû§Æ9^¬(¡ãŠ¡ÍØŒÇ¯å{Јþk1 U H%—yλòk‰™ʾEbh÷2ìÑÍPk‡¶††PBBB·vJßGí¿Œ*Å=J.µ}¨ ²æýù×– ÒÉ^âÇü¯U†¾aVïõÊ)ÃIîcHÉ1¿~¬ÕƒÍ8æWü ®]*H]&eœ ØÊHFW „ †>²…-Uã­µµ4pàÀ7vÖã}Õþ;¸¹ä’KüqóÌþù ;›£.À>8D±ŸmTÉö" ùÀd\ƒ<Œu¦w¢ßø0ãAŒÉfb*DàzØþT¥Ø+ ‰r£5~ò›ËûƒŒ+~psµa›6mQ»aÔ¨Q1:½¯Ú!‹ÂÃ`gÆ}vqqœƒ-¸˜øÐyý\·ô IK( ¦ ™e]©>öؘ‚æCL›q$›`¡ ›ÒJe=ªŸõ§äW CÛf”п{ÚÑÀ‡6ÕI[Y 4è;pˆ«ö᦭­Í“V5yHjZ¼óÐ yDlÃE޽%¤l$êŽLÈVŠ5ânÈkUÉÏf6+ b3â¤!­<(Iå¾m˜-±3‰ ¨|æ@úá¼W*_üFlT·aÃÊ~»»sÏÚ>ÇÚ[5jÍ9(s@FØË`¼ˆñÁ%PHéêáòRfYâÉ»Ø1†<Šé2VJ¸72‰ýb3 Lê¤W¡1P¢@¦™ µ AÏœR€HÁ·5‘CžÞÖÂËÌ©µ~û:­jâFm'¯Ú‘ý’þzzŸø'0?,œp R¶jlH¨ ƒ|¯¬ñ€aðòØR’HÊ&l®Èð*4ÄZ[Vb$ÜðIˆb8b‘™d?CrC»f liCý—mj”uÈ)zââ⺵Ãy·Ú¾ÂG9}hêc'æ#ÆM]‚Q ºãÿÖ4ÈMôúWt7ìp#6””â¢Ý3ü¼”Mȵ•☠ԗM‰UïDÜБ%Úˆ\¦á’¤DTuåÀæVÒÿ¡ÍM=ííí=yyyîÓ½l½­dI¥@Äxa¨gêN ÕDZWk–ø½rJŸqHƒ”MB™Jq ’ÒK¡ `©ÝÞÙW¢ð›2“Qõ•7슌~b œªªª¢è¹òÊ+—,Yâ{áž·^ƹN©(5|Ü€ä%?ÉUzLLÄÀ zŒ_ÝQúoWÔ`QeK–ßÓ—Õ‚‰7Áfw§ˆäLRƒé¶B#䔿gDË5!=¼gPv¸åêA§-¯xm£X±téÒ‡zèæ›oîÙÂCë5ÜœtÒI¯½öšúH­ëµ—ôçƒ'wÂ]@Œº õLÝñ‹*q`mlë—SÝB%§ä¢¿å»¢ñcW^ ×8÷P¡QìGWÈ{x(î%´æ&"ckkkë 7ܰqãÆÃ?üâ‹/îÎ ´ÞÁÉfÆæ%L—>eLºB‰…%ª`°%ˆ'µŽ÷$Š¥îxtdį‘#ä Òr´‰Üd¨C|ÐçÍz¢~®ä=’'9CŠ'‰*%†<u$GA†B@°'%ïÒüü$žDÈŒ}¨Uºøãºy«j ƒ=öØ3Ï<³uëÖk®¹Æcçv«í-n<‘ÈŸ•¦ü™Â\²=ð ~Qåá1 ² #Ãßch6ì`…¤7ÿ©á‹-‘aE¡Û.HeûÄ2ËÊ}Ôrï$ñüß8¯45TH E7?ÓøÅ¶È°>¡ÛÎM‹cl.û%ã}rüš¯W2$KTAeV×¾Ll€Ï"WœyÕAYé÷l€…ÀÔV¿ýöÛu©=v»Ûö 7žt»¡Yqæ»Ì°Å'ügkÍÈÃ~’pYúzóM´V ¿÷%zx¥p‚‰Â“кž\«DJ!´dy󯟶–[¾÷zøMÑŸ˜ðÌìL-Ë\@Å?©ùÑWË'ZÅQxR?4‹ê¯*í{ÿ¦Ú=Œ¹Qû|þüù3gμå–[®¾úêÔÔÔn¾ÿ^àÆÌ)N Ï=$ëұ邵ø´=ð~ÆÓ+2äp¡Ç{ÚIÁ”NLM¨ÊùÂüôãÆñÖ¦Æ c5bü•g°ŒY¶¶’‚3k:îÆ_?m͸ rùuYãGÇÃÃöŽüvø ©»hÍ×RÈÀ“y†ñ3`<¢² |[6cà‚ÔÝòwÑÉçž{®¸¸ñ’&f‘Ý®´â& ©EïÒã>™Òe;8>Ù¤XH ›‰%ª¼Z³É±Ué-;£ûÍêd´T;m~ýe''Þ1UÊõ@8:^ejÇìhý¶èAS½ûyÇj“Ô^>1éÎ YŽ"á²C×ÕÅÚ/DüV·R¼ò²UŠ“ƒã%“áj!¯;,óò±é}Ü„¸ŽA[MMÍ/~ñ‹;ï¼sîܹ]ì?ênL-ø²±ÌÒV ©ðAÄb3 Uê'Þ36b< 2¿¦ë öð+{®:;±0W»Iwí)„°áå™ÕuÐ@{è–9““ 3B¢h>û·-¹¤âµðPgl†Dñr“<:Á®ÍJvšfN¹GA©Ž¼hÑ¢9sæüæ7¿¡Vz8Ü%Ht7&hΑ&Aƒ$h´BÓ9ãñ‹3Í”ýe#Æà@ôn£¦u4ÐÆÏªÿòÙŒžh9RN£Êfô9»/ÏÉÉ¡Öocccà·ÇÌ«ýzYŽæd±Ñ Ð…‰²­4›Á`Ï[lFný$tØ|aãÐ2g0µB|ç¾… .X°à¶Ûn;ÿüóÕ´îáÆŒ7±Â>?Í·@c`Â4‘:g<â2C*Hm½£ºKb<­œþ*¬lxû;Ab㼸зÆ0¦Êbt*#ÅìÆ.—3æøÀèQ H²™ dH6ÃåšÍpöp!rC Д[®¬ÊqQpßqÇ—\rÉÓO?} 'Ä*Q¬Z7p“™™©BNN_61/&hbI+S6M-ÍxÔI„Ü/é¯ô†ê èb—ÛêõѱÃå肜²‚QR³¿v;eS1Û¿7·ïWÂöv%&zÈNCïpA°à„Žd3HI(-ö…#^£yöàd)°¶mÛöÊ+¯œ|òÉ+V¬ zÏI'ÔAÏ»Š›iÓ¦íÞ-¸ñqý“–2ñ„4hplÐ(Lx¤•_6²i{Kþd«É=m99DãZW´­Ù½@pn–ƒBÚê&®Ä£Œ!p^a0×ЊM6ƒXÍl·ØeAÐáÏ®¥Â9Í韪™¥y÷‰|ÓO?ýôàƒ¦–ò'Ÿ|Û"¶.ᦹ¹yÙ²eâž44•E¶-EØO¨; 1D1M-Í®à[b²"µ]S·Ú1‡ûIÒ#ª°ñW5bˆFn îY7Ž= ®Oã+XÅÌe+\:XT3&²\ÐH(¡»˜( :„6’Hjž{pÖ¼ö"m?þ8ÀûÇ?þAíó8 °ó]ÂéîŸ6ý4âe=vµä@] AÖ5R6I0ùÙŒ‰ªšW³³Oìö& CK w$ŸåoBøÎ 9¤ʦåÒíB…Ãû‡Äã ·Æòj;[¾ÉÚuÕ•´&’”P@®cê:&Ä.'·™½ô³:Æ¢:2TD£b+//|<žÖ9nößu|ÚÐÔ§O.cï…%†"Œº bs#/›QrRâG#Ÿ¬ëÆþ)û wn¿6ÁÛâÇ1K«FtJ0m>ç|À¨Ðg_v£ŒÁØ!¡Û§%#iN+;[r™ ˆ8^DjHƒ–Ðaß*èðÄBÍ„°üèJÕjó+k¯¤Ì+ª#SÿûßßxãþþwŽ(ï€x¹†)cÒÄÙ`b£u4¦BcÈ&ŸÆŒ‡¬¼/õä9®étF vÞy69|>*åÆÒrbð©Ù(Ø)'V>tâÅ-¯ît† ½»,rÃäÑfˆà$"²ž1¿ÀõA­öýQáŽ4Áˆ ,ù.pÑ#ó)«à®Zµ pF/^ì/ÎÚ n’’’Ôqk”°Åú¦„’O%þØ÷­WŠÁiÉW´ÿF¿´ýÊÒÔv—ôŸ¸»5vVä? qrø¼IaËyèOÖQoa6býO/àue(“Õk¿OŒFQÿC›:èÆ‘ãBgNL8ï„x€ lI*Ù æŠ ÁÛàšrtXJבª®÷# Ùߢ€‹Ï¦pSWW÷§?ý鬳ÎBÜ»CóóÏ?ß|‘Np£–æ&…VW¤ªýuŠÐ–Æ#•ƒÇø>1j@§Q ±4'>Ím=:"eïR­ ͽ»åoG7le´ ‡Ð1‡†¿ü6úÙkÉa¾˜" >jЧN-#!›Tú• ×d íøÓu{Ûßþ!ºFG^·ÁýôyjO ½' ÜQHØ9]*Â@ôdGB‡w7TïGŸx5È5B[öóÑùŇ<½ zV^^®Þ{Æ ®ëšÞ»Žpcn¢X*ɈÓѤI,“" ùÅ™ú¨$a EËQTœ&4>ÆCh‹3C³4ciåaƒÍ(‚˜ïb6{¤‘7ýJHÄ´ÑóâÅ0ËÀŸÖ"5Ë`3Hê°K}6:’(ÝE¼¦ë[$¥•%ØäÓä@Š!Qå/_ï[LYÎÛo¿­ªLß}÷Ý×^{­ú¶#ܘë¸.ß_× `6x²™€83ÉÇ,îeø ;­Gû xyF!Æ ñôÖrôi(i/ŸL°Ó~á«@sYæÁ–ı ƒ´À’øà?W†´ñ-’\9PÉ RB>–£hîâ F¥?õ¥(`°víZ…›æææªª*•k7ô:u|RiÊ/÷O èxÎÜIàg– cÈ/Hó£aá#‰Gþ¶CÐHw¢R‰ü™òžHˬ`fãñò1œ:þÓH¤ 'Üü^=W°Äåû>Â`#‹ÈßjòZh–ƒüø0¯á¨×<Þcß*ˆpÄœc| éõÑŒGû£µ¼CCâÍë ”ï$mæ“sÞ 69z®Š!©çÊì*KâöN§û†èæ˜êŸÉrTk:AŒ|SS¯3ÌIªÓüýïÿñ [[[#‘Ìcâæ£>RÇ#s´Ø@±ˆ€'?sòþ#oƒÍlô«zgjßšü¨@cú¬‘9 _•jÜMSÓËçËS°ˆŒ{ü¹R-å7²D ÑK›?È”8|°µþA`glìá(†èZ ò¡˜âaÉ2i‹ ]GÂùɡ͡ðùçŸ+ÜÐöÒK/Aõÿ.ù‹Ï•f}öù€‚YQÐ'=ă0“Ù(-Ç‹'S=ÒÑç´¥›Á”ÀGÃË'5_+«’8H™0Hxd:µh<Ã/‡ÐƒbO+¢¢ &õÐ ^¸,FRõ:kxÚ½Ÿ‰t"OMÖÊÊJ8èÂfØ!|ÆðTJ<×ðƒÉw»˜óújy˜ã?Ó™‚嵿º G#ü/ÆÇ‚HÝEr O„HÿP›0 æE¶ðÁNY#m_ƒºŽ/°øM좠fä眥pãI=VO縜ðäWÕøgp¡ÙÙÝ´ˆ1¯ âa62d“_6û#¥áÇ2Ä$q\d*¦²i¼Ž=örŠ]Á ¼- "›Â¼H£¡£»Ù¼-7I×éõ¬0§*ζmÛŠ‹‹;ÇMZœœ}>”¼N’‚Z¬Ë:eWðÐ.0¿ ¹i ;ÉÒüÒMIF0¡‘ˆW»>‰ƒ$ì:W6»Ì |ïADÀ½“Ëb ÉYìóAÍ¿»Óš5kº„›H÷Sên]±û†Ó;»ªË}÷´.b®‹?%IiƒÌ˜(Öç{Úån´Þ~Ê¿w´5íA‡ èážnþr¸àÕënTj‰— ½#¿fÎøô·”¯»¥OÌ›0РGøž|îFˆ÷·Èw7d_Fä"7l|ä‘Mñ6y+Tök÷š äQ͈ñ×ÞÓÿ5ê@Wø|Œ»!tøÝ;#×{¾‹ÍHßë7Ûb„šý#Ï'ÇãíuQ}Y!‚ÐÀÌYÏØcûçj,•` \5q¤O—ˆ•lB/&X(."Ve0õšÂUƒäj\ÛBä>ËÄê¶á…/€°@…  —=ÿYË…§x/ h¾»É–˜˜è9šr縩n‰®«n‘o›€Ah€9$/wkÅç7xUuÝ‹[«#¾Ëüg‚,ýCÎD™‰¢8 û–w>º2M#¹_·tÈšÁN¥)Ä ŽB‚ q¸Û3 ßì;c“ÂųC§ \Í÷ËÿPsÂÈ$äo¾û›w77Ëõo„ gºä¿yæ«Æ[Êx¶ì噾¡õU‘–T¯˜ëãbóÀT£ †@!Üï\×0CGa:Aøýt†ûàÈŸ»b1¹—ZjH\‰$µRNÔÀZœ¹+ל–nò–žH0×kÁ¶oßî¡DCCULÜôíÛ·¬¬ ŽŸùªAãÆ£˜]1Æþ?¿î“6gû‡Z¯x¶îÞó2ᕈ-w0¸ê›©xŽ|p‰C¤½$q„F&ld@‡uD¤P¬†^KÁVŒG!D€ÔKœIvåÿÌFãÉúˆƒ4w OôLæ¬ô𜃒ï9- ©þxÞ%«´f§¶¡ X©Ù`Wܘ¸Y¼x1¤í ^ÌF?ÏÃ2ý0’C›‡÷´“'ÿÞÔ73týIiþkƒ5{ ,`KSâ`DD"Æû‘ÿ)·öC‰µø‚T–£‚AÜŒ’9MvWÍÙé·µ¤Nª ,Ò'L¨PµÙ é&Ô¡¶äÅŠŸ?Y±ï5eQþ¬Ök`âGOŸ³âQG…ìÖ¯_?ÔnÎ<óL…›v´T4F Sþ±ÇØŒG õB ¡ú΢ԫ—»ýµú—×´üãÆ<ÝWË„áÒüƒ½£Â‡ï£d¹ <¶ì © •$uX我 8f¹Ô ‹‹dªƒÝ ‚kšÔ?,¤òçÜXz46Ž;шÁöGäûhȯNÁÍÓgî xÎqi¿91ÓRFoWÃ&ïy{‹Îƒ())ÉÍÍõPòÍ;Òo¨ ¦ŠœóJå»çéÇñÍ?ä5ç”üÌ¿X?¾ØÑž{Eyõ½}ˆ_â–Ãg§B!Oâ[ ñQ­á +:Ä«çbHÑ‚»…„l"X'ÐÀ}à†H^܈E©îHCŒIoBD1©úHÐ`ŸJ$‡S0*û£{øhI7x•ç3vˆwÀ(;Ù‘]µ=×ÄÇ{žšüæW[[ë!5¦Œ:ÆÍW_}¥¶ükHÂF×47@¾h‰ƒ¡¶GÕCçf¿¸º¥¥ÀÒ¦•m¼«07¿%q¤ã•8Òüñ'Žîh‘–J±=€G¢„׈&›QN?rÌ *ù­îh™e±"Y…†¶x‰ ­)f]¦ù–n¢¯·¿Ò°àUm +ˆ›}LºÍl|æžGòírO¬p8<}útrrrÄ·> éfn.úùÎÖ™+«î›g,¦Æ ¬¡²pSugQþ¯v4·‰Þ”^[AÕ¯ïÌ÷I"ää!/DXªÔ:Šë˜z®1˜XI›\£N T‘ƒ'ÅY`ò 4ì 4Æ6Œ°9™[ ¸ˆmÍaŸ¼ÓÚUéÛÔM=%îÍÖ‰¾|ùòÉ“'Ãñª{dG –C<ú(†›~ÜyGQñ eµÍb:—ÕEÓ/+_>;û¸Ñ 2›ÿT&¬°—óCǰ¨YÆ‚Y–P œ.pC¬*yˆ{ª\`G–@ÃHc¡`óÛ߈1ãáî®qžèF¶¹î?£Ä™y½â^Jgò1ªC]ýUY»ÙÁ!ùáϯ/?÷ò'/w±Å.oÒYž ˆë- àfÒ¤ILðÙûÍ®¶Òe[6N ¦·×¥¦Å“ÿã¶Ûúf_»£-¢gÅä{vQ|U=X¶š„HtÓuÒ^…²•)NbK p/™\§KuJ!C6yÜÄ(ˆåëX“[ §áÝA†‚l )È\· ¥uCÙJÅxˆÒ£…ì0Q5åºÿ°ÙÝ-§¤ÿ|ÿäYaK‘²\DJ\ùih^ÿ¾.Õ3tèPÿ#âããÍ}Ñ»„›çŸžj×2øŸ]mܼeZ‰W)LÍFJ$:c ã–ôëw]Ùî×ó”asØbÁCǽySŽP„ƒÍi•©8“ÓÀVE¿ ðò©fž!¾oM#V 1¸ ñüÃX2þ¥5k»]Ù;>žg]\õL´¾¡9Ç¥þF4ă[鑚S’!¡¨¥}øá‡{A5›©S§šgºZÿ&‰(iµ³9:òÑ­_]Ú_¬\Tª ²•b“ëpfû‚¾ï­ßó³{½Ì–¶Ö·§_TBkçõÉr,sÚTDz\}RÈ)€$ߊéåSX‰¥ßØZŽözùšÙ¶œBG±¸Q›ágî½yÞcVº8û ¤™Ç¤í× hTg”2C­4hÐ\àPrrrVV–y¦õ¶˜·UBgÓîöSž/ùô>†ålCб"D@JrôàĆ¥E§>PýÎ×ÞŒ2ÚÚ£hø•Uˆ‹íòÇóãå9*úm£‡È––Z°à@ +Êˇûþ:·¦|éÄ€”©ß郱 Š#Û×üÀkM×?\ÚØâ¸áqœŸ­ Ý‰–gÜYáXƒ&kéF5† vÎ9çøŸ5dÈsÏ=×s²{õý¨¨R[[¿¹¥ùª·ª‹m;bpvL:HEˆ08YØ/MË£?tCùÎú`.L]p1“_!-¿.ëè1qì¦~ô+ ÖÑÉí@®vØåÜ3-`iÇw½ZŽf< + ïŽ2¯ f`_xæÃõOý­“Ýê(bêšÜææk•…Èh—‹0u*àؼGZ¸ƒ 5 `á‹§u».d]]]ff&|\¶f÷·uíõsþIª´JB!ìJ>„ňS{Ãm,3ðÈ»v®ÞÚëÑTºŸr»p{LJñÖÇr“ ŒXÜ$Ž€\_‚¥lÆŠ’-Ò>ÇÄøÂ§å`¿–ƒ¼v–OÝÑèµú©w÷Ì|¨K5—¨<ÊNu^ž‘+܃6_ÑŠ‘¶ó-i%/Ç™K6¶FEï©"|æ™g>ôÀ ôþu»- Z´‡xlÄ#[×ýRê:ÀO Èf`ÇVЪkóé/|£áöWÚ£¾Q2Z[„^TÇôfïÞž¹ÿ 8¡E™±1 #WÕßO‡ZŽb3>uÇëݹñ©¦{ÿÚŒºÜfŒO˜wù‘;Vßz¾?…Žâ:»[Ý’e›7_^"tp‡Í`奓lFùíˆZVÍœö[ïdÂkKmä'wUUìî@ª=óîúÏ<“O=,aÑå©É‰X³.B°ã“”5^xµœ®kÿõÓMÝ޷쬅4´0¼üŠœ¾éa-e'8*U`À÷QŒ‡ß×Åmí(c© EF,Ф§§ûƒšV'÷â™qN‰ƒ•MѤE>8§ß}„°r‘Åf„FÉ%€º­Â‚05ÿf@VøÛÛ™þÔ°ÇÝïæÕ Ýj-mä¹÷öÐ_F5þô$';d:ýòœA}C-dcy´¬ÆÝYçÖ6æÖ½ÁC'í˜á _—Gþý›ü¤8,5Y1–ûÇ.Õ¬ÈËxÄMf¿UýЗè`/~ýú]rÉ%÷vo÷Ÿª¯¯¿í¶ÛTéÀ#žÝž“Ú>½D*ÜmLK¦¢Î €ÔBŠk¯Þ㊌™´øÐ¦; I,\ÑøÒg-(Ñ=kÑ(ªmtkц²nË”žµŒdgÂè„ÄÍÏ—Ó‚‚‡+(Øžo¸T1•`V$,5Uó‘¶´´´c=6°À,Õ@ÆŒsê©§vÚó^ØïîÞ”k§¦%š½dcÅŒRjõÆlLÅ RH˜îvÚ¯õ[®µ\3!õš‰©à\öNÓâ7Ëë¾£‘ÞûvÈàø] î´ãR.=:Åv®ÈcÓ8G]@Œº²U`~Áçå­?þ£Î-§ö¶?Ð âiÒ¤I¥¥¥]y‹^Û_“aРA7n¤Ç-’±dCvbhÇŒöchÐ`¢_sÍ5wß}7œ™´¼,)Œ¿¹´$7rï8B ÍWñyÒÐr€ýèüN€”MäØÑJeictüÈDú]ãñòñM­äo_µým]ë?¿m¯kv+ê\j|e$ãô$œãC¸¹Ô6¹uM„íª—áä¤9Š;fDÂ1#â“ã±×¨³ŽøNêè•!Œ‘$§F~Ä ´b}óä—tŽpVVÖÁ|Øa‡ŽW\\ÜÑGídvÚzßyÚò–‘‘åR¨Ø*^¶)5ΩœYê8D£ù€âÑr€ý 9äØÌ'W_  aëYŸ;i{â;‹ñx<êJ5>v¢îH[ YzscË)ËËÌ¦Â -99™2!Êi:ÙmâTÎŽoogfsS»Ky=xñÔ>?œ,cHfÉt[¡ÌÖMHåÖlF3$hRê¾·X6€ìÜuƒñø¢W ©ŽÕ¤múïÔËVn¶B#.¸úê«»÷¦¾¶Ïq Ê6Q˜·´ˆxïϹ N§Â‹(d(¢' Òøè€Í6ƒ­lsÉ‹qÒøÛæCŒ¿ÖIl2k©€UêÀ`-¨cuǼúÔ¶5UVÆÒ!CJKKci¾ÐÆwÌ1Ǥ§wZ̪«í;Å ´wÞy‡þ½•7Uì†U5ô_œƒß:³èà"¸‡Ü P Bã –VZű،J*°ÖÏ{؈ôgbguÙ ÙXA~uÇ<‰¯z»jÙïꊃ9sætÜGªüžp ½ˆhÿÜ@»‘7jv}ýõ×O=õ²v—ýsnR¸Ü|Xöu‡fIÆ#u d±b§LÈ#uÆül4딳@!…‚ØmRyÍ V´²Ï»øð?nû¬Ò›I åÙ}úÄ.gÆ[qqñ”)SzE*ùÛ 7Ð@ƒ»âŠ+þò—¿|üñÇo½õˆj;·ü}ןï®j‰f$8eÓJN÷ä òâÃc~ÃH؂ɫCSLÃûU/R<Ê'§¼¼Ç5~îêËŒä@uƸž º=nß6†½äÚ¨Q£ kãBÕ¨™––æI#ïõö_Æ ´±¼Ñƒ PÉU]]ýøã§¤¤TU±ä¬Ý­®Ú$ýøÉ/ÿ¼/2R†¥´B>óÛLÕy,ðî‹+¥äzNÆ`<–©åUÄÅEË6ÕîÑQ6 Æ877÷ÜsÏõ¤…¶áÇS>¤¶Þاí{Õ`ÛˆÆÆÆ¢¢"P}žxâ‰mÛ¶©²oniVvDj¼³ù²’”x #¤$QjŒPL{ªgÍoOxå±öãË÷óÜö@é7lذh4+–äi#GŽìÛ·o|¾{Ó¾_¸FíIPEEERR˜îT~-]º”Zd Cmn®ÜÀ˜¶¤0~ç¬~û$èA“ša#Sl!ó¼!‚‚›e1­ñŽ´z¼äÓÚë߯‰¥&Q#™2Ú3fÄÅÅŸÄj.TQ·+÷zû>âFµÂ¹sç"ž v×]w™î¬W^yeãÆf––9ì™mž;ŒËOxhbþ˜Ü„‹ë,µ¦{Ì'ÐkŒ„Õý§¯®{¿º¢©£ìŽ„„„~ýúåääœxâ‰]|f(0`e-]ÌvØwí{ÕÂá0ljøF5ï¿ÿþÉ'Ÿl^@ÏÐó°Ñ œÉÌ̬««û|gëÁOyÁ¤šƒYMù!™ñã Ž(J<²()Û(1ïoëÚ?ØÞòaÙž5U­›êÚëÛºZ§CN»tÐAqÄÝú!5 (Óí4ï»lÿ¸1Û!¼Áño¼ñÅ_P}è(ÞÌËÊÊÊV­ZµeË–øøx:Z·¢ªçÎæèÎf …–û>ëµR”S˜*õ("Ìb…rSj©kß«ö¿‡³Mä Ž·oßþôÓOS~ëØ©ª¨êúÕ$¾ùæ› ÞèqFF5_éµ··GxsVá€6ªNÑóTç gè_ú…)Qj¶P1J11tèPU…joí½ÿ˜1cü¥¿‡í7f£º‚ÚÅñ˜Æ‹/¾¸k×.‘:ij²ý¿ƒ–˜˜^ŠÂVþ?ö®>Šj{ßÙÝd“M%=„ "½I°€‚b¡ˆ± ¨ ž ÿ–§ÏŠ‚ú|>{Á‚Šõ©Øx (  ¨t=…ô¾ÙÝùßrçÜ2³³!@àåü"ÎܽÓv¾ýÎwÎmcÆŒQgÌ;¾ìÄÁ c˜?ø8¶°°påÊ•›7oÆ‘¦™pÏ 'Ê´HÛ¶m1ˆ± 6n¨yÙq†8'ocNŠÁ.cxŽç‰³’#d˜‚h2}ûc¬kª#ûdú²tu÷Xü‡7ëä»~(þ:¯;2Þ—a)vÊ)§`-Z´è¦›n²}OÇÞŽÜtêÔië֭†µ>Xí¿´Sì=ƒôA=ôÊáO*€À(Ð ƒ™d!-8“P ÞþûŠÒÅ›+÷T0ãwƒSjNSì–[nyöÙg랎–¸Á¿Èõë×óå˜P.99nwEÃ[£3Üêt\àwOcÅdd¸=ŸÅ›Œ¸!}!vþm0²¶-Ýwz+üWZë¿pÉÁJo`{›r\°`ÁÂ… }ôÑ™3g6ê¶Žž5kÜL˜0áÍ7ßäËOJŒˆw;¦ôŠŸÔƒš:4h`ön‚-ËuílÈBî¨+˜÷hÜŒl¬\Ô*Ú¹rB¼ñ¯õó~-Ë+§Ðƒ¹gÖ¬Y³gÏÆq;\ϲ¹Y3ÅÍûï¿/œ²pPë¨e /œ—68K™"”,#E ÂŒwÐ.ÁLÙ˜NI¡›¬×“ØéM¨ `…a0}![ÐoI–nèÿ–ï®»ê³üb:þ XÉaÕœŸŸLÆ]„´f‡›úúzÇØµ­¬á­Qé™±Ê=;X‚aghÓ¶yecî›D“ÝÈHŒ-⮘ x(Ê $£!9Qû¦·ÛSîï÷úžJz(VÍ©©©íÛ·WgoVÖ¼p3tèÐåË—3…¹‰XI>7"µK²’°7VXEꆬoÐ3 èÇs@k3øÊ$—˜xJ…ÜÕÆ` mî¤ µMpÞÒþ·|ïèÖøÕ§Þ¡ ]»v9ŽÅ‹[ #<úÖ\p³gÏžœœ¦+ßS[GÝÖ7qtGeÉ.1ôŒI~¤lS¬c>•ÉaXÐa‘•îµ AoxˆhdY›™Ð =½2"wßÔnɦêYÿ=´¨f,zÆ?qâÄššš#4V¸Ö,pÓ§OŸ 60…“{&D»¤'ÎR†Ð†D _«!“, ƒxX3ÉÜ­`©‰ €8¥-ÜÈ¡çÒ.1øoÆ7‡ÞÙ\U^oèìÁ±âyñÅ'OžÜØ›n2;ƸÁ? ˜˜¦°_FŽ2žžœÛ1†·2ÞŸhf?DU†%fY` ƒñ·yæé«´R Hý˜¡' Íž2÷¬ä6Ïç1ÙÂ)S¦ÜqÇêœâÇÐŽ%nî¿ÿ~¾«Ê9í<·÷Kšm¼um¡^½ƒ`léb“PœDK!ŒDF2„sÒ˜0¥‹5WE¡çiCÚdÞ†$r!)ÿæö_í¬½á«Uô¨VQQñ矞|òÉ¡îøHÙ1ÃMRR3âhvô¡Zÿ'—(³~8bˆ˜!Æž.6Å$7v™†Nu¡rð)¸Å[C¼.&ô##¤-•­.¹¥­7 ©f½pD‡èÝ7¶ëúÒž] Óãóù:uꄹç_ÿú—èaޏܨ3ƒ0…»Å_Ú9fx;¾„현ˆ1")ýAL±†(j "—éší­X]LèGwUz”õMÔµN$Úmý5¹ígÛj¦-+,ª5ˆk?ü°$¾mÜlß¾½cÇŽ°$)ʉ¿·ž§tÑupމ¼c@,bD±•Fè ó ™™á¬ÏbeCºØ¡£Gªt¸èžK_¸„q[2ÙÑsan»ŒE»à<_ÅÅÅn·»®®Îþ’cMbG7/¼ð3¯îøÎq)ç“8h’Á4 ÍТ>2>Õß—Æ&현S¹c6e¬ÇVÐ1鮊]¾š ë¶,ÜÒþÆ/‹^ûÓèuäõz1tòòòZ·n}Ïž=ÜLš4éµ×^ƒ%7õNß5v@f”)ÍÐŽIÌ@:b ábë4¦U„n Ó°~M¡(Ç„ô¨ŠÔQ+}øT÷P²C'} ÌÍWu»äãƒ$¿ÜÐЕ•õûï¿«½ ‚%Ü 4è矆%ÝS"šìvJÐ@šqLÐË@ˆrR@ñPj—Ó:(DËc|®¬1©ƒŒÆ)ŠZ`T ¹ÇðMºÛ‚Ä£*½äŒ¶QySÛu|q7ìXسgÏ/¾øâüóÏ·÷$‡eG7;wÞ²e ÙtJXÓ¬™˜Üq¼"CWP"òYôG±Â™dгŒÁö*Qn ‰’5ÈpL‚t‡Ã7én Dù,O¤´Z»ô…”Ü¹à‚ °¸á†L£Éìˆã¦]»v»wï&»ig|¤cãõm¡ 1¥ó`нy'e&t /D—M}$QÐ!¦§ŒÂ€H›¥ûô`[ƒë›hâù,,wÚÿsw~µ±xñ]wÝUVV¦Îû|äìÈâ¦W¯^4''E&E9¾¿"K{‘Ö¾ÉÚg!1ž:Œ 4#ÖÎ*¨/”Æ„çB¦û(å+òM ñ ­\K.ëÐÙucN¿×öþy(¸JzBLAyÅÌ™3srrŽh;èÄÍÈ‘#±R#»™1.¬iÞ•.4Ä1IDÍ„òY€ ã°‰Šë‹ÃjÞ,*ZÂ%ã«tƒ.¤j)岺ࡵ³/|ÿàö2ïžòjõ^ÆŸœœ<|øðPOØH;R¸™={öçŸNv»&GlµèÜT4€xBÐŒyœ…,€Cf¢8Üx ‰Ôqé>= a#‹E±$ÓÐq¹ƒ´ÝÏ/˼üãü=†Ã:çœsV¬X1xðàð/´Ü|ûí·>ú(Ùm—‘ë² –idã}[¤s'tdr˜IºÆÛfé>³„&zXâÑZ¯ž\ËÕBè¼;&ãÌ·ö¯É7†Á2dõêÕGbœMÓ㦢¢Òc‚Û!}ri¦ñÖÕÉ0 Œ§¬¥1ã³LÒ9¦º˜‡ädmZ‚˜>ƒÆ. ݧcÅ4Ýg+aÃŒƒ Rb•2Òvÿ{UV§wÖñù|\¾|9þ7Ô³…gM›„„²¿¸HG0ä–¬@£ šp¥1A€ 7ÂxJ2Ùæ£+þSЭب`‘î³›°Ñ †§È:´èl™’“¾Àν^/füqÀ€Ü“4Þš7.uÂô×¶r¨èÉ&hÌÒ9bŸÅ!ÆpR¢&O~–k¦C@¢ö(#ôCA<î p1Ðc+aP"Û‚NÁÍí“ì¬iÐî CÇV_}õUö»hJÜ`Dù FæÆ¼Q†ö†ˆ¦Þ*è¹FñTXéN) B*:rèxŠ€‚¯Œ§@²|Z! ¹“°ÑK(>Ò:ú‡nÎMZ°£Î§Ý^^Þœ9s,X‘‘ò™íX“áæ×_]³f ÙÑ7ñÖ~ŠÃÂß Âȶâ üpÓ9ÂJ»+Ùf0¤©á’ ƒL·s¤I˜ dO©ß†$€Ž¤çJ9.Ý0±mç—v“[^ºti·nÝn¿ýö&YºÉpÓ¯_?c;=ªkJdpÀŠD=€x‚î‰ Æ1 }–€ªÀÞa…ŠËÚa0ž’õ“HT E6 zl'l$#ž’­”1h!tdˆ!í¨œD×cg&Ïúo±zX#?òÈ#÷ÜsÏáwnoÜDEE‘íà{‘ЄîqFr…>PÓ P  /#BŒ¤ – p6xÇ6¡c †§´mY÷P‰¡.ƒ4ô .&¢X—°A C’QMÖ¡#£Ûú'.Z_¾·R ¯Þ}÷]ì^gÏžmãi­¬ póä“OªkïªÖ=Õ£Aò")ˆ > ©ˆéGD3¬Ü þ#‹½+¢Pœ B`êE$Ä `PŽaZ1Q𵩕4z  ˜‰b…ˆ´Œ°)Z¡á°@p®æu$‡$ d[§ä$=»³V:7n<÷ÜsŸxâ‰ÃlÀjÜÀ;˜Ö;qÎàÄà–düèY š—EP@3Lî!ˆAòVQlA9ª¶eêÀ–K¤»!D¥ûd:G"a£æU¨=Ž ±F3ŒFþ뺜öÿÊ#wýüóÏãWöñÇ3ÆüCØáâF¿NµÄ¨ ß .m e Ï+0z²uô\H½„úÿîOï+ßÖ4øÑø3£.:Õ Ù…ê”n!Š™r³ à—Zåo6x_û®߯§Géôã‘,@«Û aÃçúÔ'•KÕ&DkdIΈs^zrì’­Uê­ÖÔÔ`o…7ú÷ïßè.‚‡…›Ï?ÿÜëõç’¤`O(kÈOßPÇ0H$Ì&³ôCkd¤ý¬G>Zúã_Æýüg]Ð{ž”é\ûL’ñÖ¡Ð:,ÞxxA—„(*Â?ô ÿ^úÓ_ÆØå6Ê;âÛx"E‡Rô¤1ˆG(aBq$‹¡ƒX €Þ™þñüj2ñÎæÍ›±L~íµ×È*ÉáÚaáfäÈ‘d{JÏ„'ÏÖ—'%²†‚D݆ÿ¢C*dª ‚¥Y‡iâ„áÌÛúÓ®<´ï­äH—Ñ=à ¦0GlèâÄË‹„H܆oãÚÂ}/¦FºâqèÄcx(º1AœÖC´þ5‚)¶„:§µOY¨ÍO Ë2–8X?öØcpQRûÖxÜôíÛ—lG8¤ª†€ÖéÊÕQŒÌC*4tÐ4”pUÅ­z}r΄â}‹“F~|,Qth#1£%^b5$¥Þ'gO-:ðï4§â¡$‡Dü”ᳬ€Ö1`!TĜБä·tF›è÷Õj߉×ûÛo¿õêÕëçŸnDëU#qƒYnÝ:cÅí¾éî—/H#@¡= ó ΋ɬ ¾I®ªÝÔ¢7\ë•s®.Þ÷ŽÆˆ‚ B! CøЕ‘­A¨Ý•Å!o£߯ÔÂ}ÿNS.CñH–Ð!ˆÒ¿°D©#ÁõO¿×:á™ê,Ì8ÿè£0n¾ùæ›~ýú1 D!­‘¸QuKJgá¾îygësûÄJ# ""!lšf°í*ò•VQ#¨Í¬ªV~ðêû&z´}ÞCwu(CÓݵQé¾ûeÕ6¤B•µò?–T͹4V¶$™÷Yê3še„iE̕ʔ·Ò ¿¼$ëì÷ö¥D;)ã÷Þ{ï½qãÆÍ;7\oÕÜìÙ³G•ÃøÆêýòo…Þžin#†¢='tèܱĕÀ£´ æ@ƒ+ôžúWNlñwõ÷] q#zÓÂø\Á6(kúÞ(X¥ÜÌ^ÿ¡vθõeËŠV5|–‹Œ0‡±¬ÑIˆÄV ÊvãKÒ}ªSmÖ×ׯ]»füCZcpÓ®];²}m÷øgÏI!<èoEÉ^–ÅšÆ(þ#Þ*¸Qç³Å4ÄòK >¬½åR=»m_‹Hƒ]}˜ †ä—žý¬æÖ‘’°Ñ|b ƒd&­Bÿš{+ÙÈ%·ä&>»C½¬7-Z4}úôeË–YÜüôÓOpFû¿Š½.‡d¼]P=£f8™Lm@!,þéðÿ+ ÷þ»ö–Ë¢ H”^±eŒ4–ѰÛÞUäñªoå¹¾ Ïb¡´)—˜BÊ1P »#¤¬8×~½ñáСC~¿;ùóçϘ1Ãæý‡›3Î8ƒl_×#>Øû“dÕ„ EÁÈD/Ë4D‰@ƒÿÙ˜gt§µií«§Cñpâ)E k‡«m î {%µ‘ ¸å@Dê  ƒ§ˆIŽ˜ E-PÖh‡§•ÑöÉí¢çm×H–Ÿzꩻᄏ¼¼¼¤¤$))ÉÎý‡‡›+VÀ]ÍK¥B¶Õ²)tP/sš†“É6zϬ¶^þeSÀî.6‹Cþµ0.s£P˜®pÀ’™™yàÀá§5õòš ýs#”T "6 õë¦õ $I2EBTMˆ$圃³¢Vî×ükmm-¦œÈÈÈ Üÿý¡¾… …‡›ÓO?l_zrì ç²2ÓºD1$ÄT``«I4Ó 4ªÚ]ž¸!6ÿݺ·{İâÆ:2] Úµ_|øwŒA“ššZT$N<ýQÍÛw'HÄ%1Ðѵ]Y£õ]×°¥Â"IÛþöò6ÑO”óÜsÏÝrË-Hiø´3È< ÜG¯.«µóÐ~Üà3’“\(.3¡¸Öx)ÂÕŠ¯~VÌÍ 4ÁÛø£ÁP t°'Ô²y„fìë_UÑ(÷H„’ö µŽZu@£2ñÛ—_~ÙĸaÔõ=âžK“ ሚcBëeÄÄçh€âù=|q£Z¬GΔS6<’¸ \ïqügãŽF.“%é¿ Ùè^ùFÅD8ú—F’ŠBDÁî;L9ºÊÁÕ;ï¼3~üøšššï¿ÿ>äTívqƒ© 6aþ¡Œ*¥È.A%aée [4žŒø\«YQÓH?t±QÌ| [1e©¬*ÌpL· nñ¶6¨J()AòšÉGÈŽþ! „´fƸêcˉ[»vm“áŽÝÂÊæµ‘ébeÃs åÂôúb¡#35ƒ'š m”.FZ,CݳÝ` ÑÒXPDc›ø´ËS\J$‘Ðy+sý‹qR„rh•³urNÜ3Z.§¢¢bÍš5ýû÷Ç”³téÒ‹.ºÈâæí>4\ãtÅ:|‹ˆV6ê]²¡ÞPH½L°e$A|®­ÊÕ³Rh³ÍÛ§¬¦N¿Cr3vXqÝ'ÔÞ-©Äou âmIQÄ$ÞÖÁÄ ÙDµ‘¤ÂÛ”rËe, ˆí»ï¾Ã¸AÊtzÖ7o 7Ë–-#Ûí"–Œ5ÆRÈ\8eѹ^æ<2d2ëÈ”:g÷‰øèGÃuÚ7ŸŸŽêÉÍ#+âŠ2hz‹æY§º>ý¡1JK’ÀË6šµa¼Mô@µPH¢‘¨œlôÕe­Ï~w¿zKj@ît:«««üñG˜«cÌnàN“#»&GBùB¢• C6¦zYè¡´B>>WuÕ¹Q·<[mçþÃoÚ8Šþ…&ëÿPA–ö˜ÆDÞþxcV&?û”ˆ €ömEÖè]:¨ŒŽÎ6býkN9°(”ïjñâÅW_}5ÞÀ>ëpqGÓµŠÒ_>d DçlÌÈYèeÞCÁ@]¯éЛä7¶Íœ Æ (®Ašc’)Ð dƒ³‘·1ë* @3¬ÐÞ H! dˆ(‡¦ýá‚Ö;ͽ¡PË&”””¨•••›6mêÒ¥‹ðæCãfΜ9d{TnÌ¿ÏK£2¤,ñØ&è¶ôr‡"d&Úp:?Ì j@/gN¶r¼q?"e£–ÈHг‚ ±Ó«FÜÆ©]]Ù’ž†!ú(Þ[‘mÄé_!å s9é5¼¢ QÇ7………iiixû³Ï>ko•ýãí¯<…‰"¦ô¯=éWØb^¿=gD1·ër*JIßýøã§L™‚”ì^¯722’¿ÿи­ßÓúèsMÀx;ô.çÂà6”Ã< Q0b“C3®ˆ 78fþçÃQJ$pud%Šõç@hÈÌéŽÉ‘aá&߯Ý1¤}›Ö¿¼‚¡³v@AH9ˆvF¼fwƒŽÌùd»&1\È­¾þúëÂågBàæÃ?$Û£scfjES ÓÛÒ|—qatFU£Z×Á£ ôrp£C–c§I o§övž–2Å¿\…\YBŽŸ"ºXGOû6Ž]ûlßFw×ù§Eè}üdNÿ²=fô ž å˜;#ŠÄ»€Þ™;_sU¥¥¥„f°Ê>BÜ\{íµd;¿Æ/vRæG°+Ù#n›ÖËFòÚ7â“Î¶Õ '%Iºv\I1¨5Ë … ô}ÝšO=)}ªìÜFj+iÊEn!P(ý+žŠãƒ-,r3œš»ˆF J4 „_|ñ…š÷«¨¨Øºu+?JÜàÃâããñ¿x»Mœ^™qCŒX±Þå< 2r`ÞCÉ ¿üÜlÏ´G j53üÕŒ$#°g¼Ò¡ƒÀ]i$ê¾èJ¦ÉÚ´YÏ>à¾õÐÞÊéF‰ÐºÑP’0IC%` ÊA”úá¼… n—®¬W蠬̘]×ذaÉcŸÃ÷>­oTиhÁðTK¯ÄñÕ®L# œÊt[(t‚»ãGD¾ûµwùZ«ä[V†ôÛW}j ƒ®Œ Acîœ4TÖ~›ú:u†€+ǺÞûÜ÷Ó«fÎÖiŽ?Þgò¿2H:ñÎÈxñÞÇdÆáÆ©þsiÖÉÿÎ+¯ êE8׉pò +Ü<ðÀd{ÌI±IÑVèH*,ŸÅ9Ù@¡£= åã>œsçÜÚW– ÒÇÑQÈ¥€F/jÝ pI÷‘II”{HDbé¿£þö ÷Ùå±y¢%OÚøAœ1tU-L«5ÌóBÉ¢½zþ£p}UeÇ`ÀdAúþÕÖÖþõ×_]»v…c…›ùóç“í•zG žHdº$ Ÿ¥.R<ÈTÉÂü²$Ͻ;ê®ÉîS/¯Âz®¸4X¡s®#.F7ʉe1d‚œŠ4{ñÞÊÌø©¬µ¡OêÈ„àö¼û#gÞ9è¢ã6:8âÐe#"®ŒNˆÏÿŠ‘„h•Ã:#ÄgðÂñMê·I}Ã0_±bŨQ£ÔíO?ý4 ÜÀEfÙhþÝÛòYöˆG¦k²dÃmC¡“žŠò¾Åg¨¨‘+ªå6™Z°ÆÙˆóÐ!XafÉׇèê½õPFÚµ"WÂß_e•Ü&Ý!ôl¡Ö1ê_edfäa¡fhuÌù&aÌ…HIjŸAÖþý÷ß nàüFªÙjgpJèŽþ‰VÈàK0…Æ¥xLɆ ñBGGƒÅÇJAmÖ[™?—vaýS¤7C Ó‘i% è¨ÍÚ (!Ρ $˜"èÁ‰8gDMðŒfõ ë›èŒŸUÚî£g¤ŒûTëÕ™’¢¥D¨¬¬ìСC°Ä7lÎÌöôÍtÓ­6Ôë$·– £œ©/ü”CÂ4ŒÔ˜†tI¿ È‚PNq¡8ìݧA!va:‰êèi¼? Ưœ‰Œdx•°"#4ˆ~K¼3RPK ?ˆÐ¨“Œµ• ¨!÷ŸþùĉÉ®)n|ðA²œ0‰9&2f)͸0Ó]Ù, “(ô˜6¤‹ç¼ÕOC*ê$Id䔪me |GOQ³6ׂMP(YøX"Ñn ì†tF*t,16ÀÈ9Ì*ž¦¸Y²d Ù^}ÐÅlÜAQž^Ú…™;)ÄCÍ" c¼H¾!Ý4F‡TÐÚ“«”‘S2˜ÃF93’á|iºLæšµ™wÏRŽª—MœdÄhgdÓq¡ß›ÊF°xÓ¦M7Ìú¦¸Ù»w/Ùî”Ae!PB² &“p‘iÅ#ŽÂÀ6ÝÎôo×®&µà„991#†’´a¹Ä%±ó¥qÍÚˆ~÷rÈUÈ*x¦vDΈñ½¢:jI‚ÛQ¦¯tq3lØ0u»²²²ªª*66Vݵ¥‹GŸKíÛ ËL¼ Ï&,™ì"žxDdƒÕgƒêAƒÈd*-$4Y¹¤¤Ã"ˆÐåJÇyÿ1刜‘Ncü§Hr{ú®Ì9#!ŒÄ|ƒµl4ià„#™1Bݶ…›1=!\iIH)Íy‡m¥<¶L¢0´³3ÆAг1íVÐÔ³JpžsE_”pXÀ*Zÿ½Ë0âÝ Ã‚]ÚU £khx #DgZïD‚›¸¸8ø5¬]»6 ÜtMŽlŸÁñ%ŒF¦ž-D‰¥ã„]Œ £Élƒ nCE¬ó²ê(kK®3¨9È|iˆêèÉê_ÒÍÊ’f€P¼¢ªúõaY„ƒ¢a„X/6$;š|Âð :.ÆÏg´õ´Ð.ƽoQnžËº6 L"’‡ ñ'öFeACÇVÆÉU‚AÚw 6†‡ôÿE ’ÒN`Ú™!4†-Ù«#úù ±¥Xi)5©5¨ :B¿üò ÙŽ´jq7g¶Kî,Ô¡¹J–Ð>ŽÒβI0¿Ì&ði_(Ý»OkŤg‡`ò¿°;#‡9ÏÂ9#ñƒ_Tøá—@Dˆ-Ý0}àhœ´k–••ɲ¬VbÜ|õÕWd»,3,B ‡ {#Û“ ÍHਮ™‚Þ%° ùe&1È^€6&ð³£AÇDPß³KJ,2.âí¾¨vAsîZÂmXAAAff&Ùݾ}{ÇŽ‘nàœ{ô v˜Ì„ÃI¾š^¶˜‰óPˆ“i6r’(1ˆˆÏ¢ïÞhL@5c¼T†'Î(4D´kÁ™~ˆpHÁafn X~~>ÄÍæÍ›­p³gϲ½³Œî`Ë15¶™‰‡Ž¥¢$J ò÷ ÷° ^…Ië Ck.¡"xýˆç î«þLyˆØ¡›Ê†«F†Å¨–——§nˆqƒ=ÙNpƒ ý×/´FW y : ÉQ͸0 Êd¥fq`:­§ËBDû×Jä Y„g‚—*’,6‘"F5`uuÔBµ2à ìÑi-ŒÅ&¸%1JDòÈfµF‰Ýå{¦ÂL ¬ŸÏÿ *ˆ…´°É"ff“lWM7Ø ®ôƒ@?@1n`mŠo„f“6‚fƒ«=É,:›XEñçaÒE|g1¥ŽòÂÁ¼ÔŒæeP$Yb!b3}BˆD ÃD(‹pHõ~íÚ ß±T¡ó7ñ!q´F>¢];ÂŽOÐY éo4 ³ ¹@˜fAh;Ü—ÊšM¢ Ç‚«è¤¾!ƒéBã&!ÒÉ~Ü„W5å%ÄnÖt)Uü’ ¡‚×4ÆóTÜáá•Ûé.äÃ7šô'Ôo&öoû*ç·iÌ™m_¢éOÅTÓ…*ëAŽ7‹½coÕÜl»2R1À¨ÍtŸ¨®Öš®Ä¸‰ˆˆ È*÷Ú™¿®±?‡¦¦m›»ýf°o’aa€~8™{V°"åMdf§:—ð‘Ýp]:èGŒ¸:HE}@X§Qf ^’Þôl˜^\`j†B¶œ>PØZX.k}ù$Ò9F½™šÌáÎ.˜ÚŒ a?no¶ÕQð=ÒUãÆãñÁå!qý-·KúpCíÅ}¢óR£öÃäàÔ1¨ˆQê3O¬bH¦Æ ™ Ë$»`âMt ÐlžM·©o—vJ—«üæ|ƒ¥Œ ŸQ— R­¶Oߊˆ3è·•ë¸ûò n,«Ù<›íj,DH‡£¾ÚÌD¢Ü€žG&”£B‡œ™\“Œ›”A7Qó(<&PSƒ‰7½æžRßðNQÚÙ¬ï\! o|ƒ]•)n’’’vîÜ©n“%„ë…R$Ù­œ»KxUd"üa’,X}™;-¡a¤(\£]SVZºÕOÕ&§`×O:ðNÕ\ÖQ‚8Å##ªáI°ËÊ#*[«1%œÙòhônÛV.q53£«A¾q:ƒ‘µ™‹qÓ¾}ûµkתÛmb:‚7/zÓãNñÜþAÙ²MuçtsÕ$’,üˆ^)‘ 1Nh&HH}è“uYT˜Î‘ÈUA£ŒD`„Tº’ ’øÞÕ,-Ùá!¾Ä®ã –O}«$Ê%èe^-4¥Á¾Zêt}*’ĸ4hÐû￯ngÄèùÛÊãêþ±7×¼R|pnkµDœ5åÉ….¡hCèŒà-ѾIRƬhÇrµC–ÚÞ.¡UÁÈú@„ŒÎYˆ~©Æy4 Lj ¤ãƒIz{uÍ)Ù‘t‹V嚘äF½ãŒŒ æcÕs‰q3räÈÛo¿]«çùb{ÊìTë•­pF#ê0¼¼³KhAÄ(úGcý:ʈëQ_@@?‰þî%°MÁÅ: ³1…Óo{ƒ½Ü ýbÎL»éééLu+¾QûX¨V^ï7NÇüô%+ÎðËhâ+%¯]—d"­ BsL—0¾ Ò ½­PŽlÀcKïd4sìå(ÐÈzÈ7.A‰ÃGalPfƒ‡Ø¡!¢Û£y⌹ÁÑ–•µtd(ŒøÌ-11Q8‰ ²“/Þ^¦&à |0Iùè?¹‰}ygÇ“–À);PÁ%¤¹*ýÌ”ç¢ô¯.kˆ·JR ÌsbtW…t}#ÉzQF,ñ@±l…É¡* pl‰¶Y\PCéªz.ØS™6«ÁYpTóx´ÕICãóÍö’†“’"B:H?׎}ñ§ªÚùÞʾ8Á8 öØE,Œ§¢‚gº×…¤EÿªòEOëáãÉ nIóPF1]ÏPš€öVh8t¡ÃêeJñˆÎw-Á$×&B§Óÿåã£#¤ëň†%Tø˜¯ÿYAÊùÅ¡Ãw÷ÉöêÛ$R×rxýO\”€qƒ7^[U£áF KMÃïB 1»jêE%&*ÿk¨(„%}B '”@ºb'íR´ÓÑQ@##Â7@/‹‰‡saLFAGäÂBòäóËõ ÁÒgÇÞ~v<ÛH‚h4gÖ â†é쇔(uÃ78X'Ó¤³¸á£eÄ‚)Âáp»¤zŸ\V¸mqÙ3W&°b(Td¤ņ»†«¢v¢õ –%}¥ ;RAVº$éBXÓ:êÌYp¢W‹×C|“á­´r‰@JÖøÊ2Ä—!!ñ0ײÎñ÷F½‰v3óÕ¶y眫_Ý„™ø’_ Œ¦ ‚bj Yà¦G6lP··•]ŒÙ¸Ñž‚ÜBR\›òƒ.^]3o|¢C²vF&™\ë]å ]ÿê”C¼•Z‚$} MëOéÐoÉ!î4f|õDXøÈdD#(‰ Ú% ÒM<,°¸†U‰‡ŽR²å`C¹®…3â IËú8øDtIHóvîÜ™ùÈ*SÜL™2eúôéêvÇV:î8Ï"HŸè0Z|]rïG‚ØÇyö÷ÏÓ3‚¤œ¥o‚»0cF9$ÿˤõzFX–€o2Z1e ŒõçLСÿ$*›Ì')™ls^‰Ûe ÃðJ…~ªv~æze^[¬C=>37Ó›âfÚ´i7ÚZÓh¹|àŒNJêu_ó¼§´¤xEàŒ IÌÌì"SÊ@цHÚ††Ž6 !CéÊØÊô†¦rŒmB<†‡ç—9²Û” c¢0ÆgQ/~ÀC…d;Ö-%y¶€bòÈiiipŒVݺ¿cûª|kÔõoEçò• «ÈHJ‹sVj_ö9s‹Kfʰ>ë}hWO?R<œd¬9ÔÑ-:Ò6Ê)TâEüsmƒr,AƒT’BG{ Ùð~K.Lñ; }›½4«ëe¦‚~»Œd²G1„0„cËÎÎV7ìö÷{jMù;cô¦QDÔ[€÷üg뙉whkb5øå¶wäïV½•µ«‚‘Q0`ÖgJ7¥ýlDÖÿÅ4& €ž‚‹±­ó›Î¡ACÔ1iH·È/#á6tañpqV ½ï7Èæ¢^ÑoLJ6¢<ÖDZþˆü¬3Æ?Á1tÄÈÄéV¸éرã¶mÛÔí_êËgp¹]‰Y~üô])Ò%yu©UZx櫪Û΋5@Ã:#1šWD9ðpm¬"FÊ9 ëhÑ“‘°1ЃŒ œûZÁkƒÁ¶ñ/øˆ‹ÏЈ!'8@²aIJ©vî2›š‹où¶zêœÌ©ÀÇ©J댼gÏž=gDñXáæÙgŸ%+Ý¥{\ÚõP(‰¿d}?#í´¹ÆS=üIåuC9÷΂ÂEœL ÄöÚäò¿(z:¿'!:OÆäjÄC©7¡|s&"‘ýÞÄP®J"\¢½r@ßX·à²V(îǸmËÝ€'¬9å”SøG‡ayÜü÷¿ÿMMMU·Tùô퀠±vHØ]3+½ûß©‡¬¬“?P´òÁõ$’CosгvÔÉ)YCò¿t³¶d£ã0ÒzØh*GÖS†àÎÉÍC£—Á톷ˆ> €†m6GL‰‚*¿Ì‘Mü”ƒÌmŽí=ï’V”b´‘ù®Ö[F±˜˜˜ .¸€ûÐàÁƒÉvÜÀ©Õ+¼‡V–Þwz+ãîIn îê®Æ²dÔ®•Km®‚'ÿcŸïÒù¥Kf´ÒƒÒ¿Lþ—ÈYOëÑù=½„‚Žî¡4vÑࢼ ɘÖÐÅHK/0 ‰< ÙA Ñé}‚†¨ãÀ/tq$”4• ¶õ{RbÁúPÊ‹_ÖIÿ?äý¤ ¿t¾%“MNNÙ ­oâââHvù¹ en,|¯u”w^ðdVâßö1'ÿzcý…O”|>3ÉDÿÂü/‘5$­§³6´ŽÖ˜ EOT‡þõ9€¬Q‚páÐ í)xè0ˆ!L£³ŽDV.Á°aD¥s$@»ÕuùûžO‰†ú—iÖÖE ÑÈ„u®u$ÐÐ-éÄ£Þƒd’î£u1kÔ+!$¤·OÉ4Í Ž~Ð0ê˜ Ôñ ß]Q;å_ƲNÐæ\z®Û`>ZÑì"n¦xøg#µ–––vùå—óWaƒA6q-IiC?ïý¦·S/o¨c Ê   ºGŸ”æÚ^(XFÕ@™S >›•tF· a³¶ ‡E&##aC÷°‘EèAÜíY812xFØ ¸‡÷Y€x(ÐPêX=9lH—ÆÍ+ýrƒxz€ôxç×ÕÍÏ’ àe‰E…$é« ÜÔÖÖ 0ôîÝ›)±Û>}úô… ªÛØÑ²ê8ÊÁ›ëçd¤Þ¹¿®AìF>VÒ£­ë§$‡ð Ý:](ÅÊyô @HæT­Mæ6øùŽ1°¢'ŒÏ¢²ÉSÈ6›+%I×åó¡1_@þîoi 7ª@Gkƺ0m;¿Šúõ2"FµŒŒ ¨qU³‹› ÜT5Îx{ߊ«Û¨÷gHW3Ê¡ËÕúEO·NþÛ¯O {|I v=Ÿš &$àømD£DzH÷P†(F ‡ DòýÉHTùŒhp@S5ø”šë"Fwd´4¶ MÛtªZx¸)(( ù*ß¤Ï _½¦DS'k4NB¤zdE|WÚW™B'xé²@•…Œzå¶x¶µÒhRÐåÉ#=\ºO4ð…ñW|JCPÔ§Z>†Içˆ]û®0V:Þx¨Èü—Cì†!1× ô¤Å:‘ ‚&ÚUjÝT/+g<·“œ“ÍW\Á_+›ñãÇ ï$<Üà€Üív“9mƒ”Ãja(Äϰ‚]KىΠ÷§w¿¿ ¼&Äw÷áÏuøïš³¢L•z{ã›»ÈúGˆòPdÅe½—(0ˆ$ "FŠS½ÇioED§s Ï þ‹9¦ó´C…塃mT¯è‡F'x"ƒQºÑ¦ƒƒ…‘X/kÛÞj5LBq“››+7¨óЖ••aô¨ÛùÕ¾Áoî[9A ¬‚é$Ô¿„{4 pÞ o$F9¶?’Ñ~æAñPxÚ^ÿ¾ÿà~óŽ`rëý©‰"n‹p¹¡ú\ÂÁ‘µ!uÐa1NJ(‘HžtCqyµ]9(7òõë[¹$ ꜇‚02ÕËÁ£’ݲÌÈÑÓõ16n¢¢¢’’’ÈÈá-%Þ¿ô|¿Hÿ €’xD E9¥Oµns×Á “‹±OW×'\^tZ—ˆ/H¤{ØIa=aC»èß5Ÿ¹At¬$4F#d‚DÓŒŒêêåö“‹klü¹sÖ8ÏŧE1™ Ñ%ÃZÈ$‡å²T['?ù~ÍËËêÊ, !íº3còËüïNMîèÃN*[*à2ƒQ°0e¡{{<a'b¤(3çE¬ñ¸¹ãŽ;fÍšE–qørWumCpŽ'ªR¤ YCJ¤³‚ÐÁŸÜ–\Xè}Ae]£hA±­ûü×=]‰ÿÔÝÞ¹®›GG_z¦›BIªécx¼Ìm(†îãïÕ¾ù]]QÙa…˜Ë2ŒŽk­¤õx¦!©c½¬ÝöšƒõÕ Ô}vïÞ]xåååÂ^8Ô­6òõ P­Ö'çüsWá-퉷âõ/ã¿ "Öà…d:iqŽó2ÿöNù·Ô‡ë¶„¶a‡oò¼JüÇ”G»¥„)5ÁÑ&ÕÑ6Õ™ÖJÊËì.ô,ª+kMÓ‡o÷ŽŽ+¯‘¹$žnì A"DÄðþHà¡‚Ñû™‹ÎÝ;w¶* e¸YXí°pƒ¹îÔSO%‹WzÓ¿.Ztnªv÷Ü0JJÄèA°X@GÖâ£yã|2êqoû ì%ʵÚzÿå—6î:§7µû.Š{seí]çÅ9$@*ZA¥A’ZþHâJ´f=¿^Ñív3ýÌõà¶Ÿþkò†-l~ãÏÊû'§Ç:¸N3ÈLSÁ”¤Ïú}$—CÞôôª¹Û=u r·ñž«™Ø­çÆ.^Usó°Ø»FÄio]¦IÑH2@Ô1'}$ƒx‚‡|¶½¦ôÍÌÌÊa,„»víz饗ڹóÃÅ Rz‘¶k×NÝnÈÞØ³û¦v†·21ˆ¦c&Øï3¸!å=•QXè{_ae] ’¹9Ø¥ý£¿ý«þöóbÿ1VéOεzŠ5 Ã+B™Œ K.ûÄlÕ±cGf¸1Œ›„„áG¼5nrrr† öí·ßª»…5þ>¯ì]m¶Ñœ1T,D ƒ(‡Õ€ °·CÆ”¶w~FEmàÌGá‹ä5î9 †õö%ý£7í÷-˜I ÝU‰éGߨcCèeMÌüíäê‡#11‘Ì%ËX||¼°Ë„К7ؾùæè­6—x_X_1µúK"ýÉé±ÊCˆF $v . )| QŽ äÿñiÅ—¿×çò‡l=V6yhÌûÎéî¾ëü8DÞ.¤YÇAŒI=<Ôº¬éÿæÈÇÑÑÑ^x¡ðö²³³Çgÿqš7HYy&ïüáÐb²œúÀJÓzVÐQ &X‡¨«ŽîVÎ@œ3*~Î(´)¿áêçKÓ?mñ oòèۀ܈N®µ»¦ 󜔜^“š¨ ™ø&¾œ â@Ãha„Þú«ê"ã{èÕ«×E]dvŸ@ÀŒ‡„Öd¸‰ˆˆxõÕW'Mš¤îúò ·öî½±6,ÈÍè ÁL2OÉ%èQ˜HY ^AO—Œˆ_Lßî+ñßøJþwo±ßºÃå²Þ9žHÉ!ýóÚ„Lüã‘¡:¡E3À7©PÒÏ4F¸®¼¼Nžü¥1H¯uëÖ]ºt1Kã°óÌ3ëׯWw‹kýé‹@FG”Öý>ÁL–¾I#FºØI×Ú$º>»=ÕÔËOYõü·Õ}ÛGÔ7 UÛŽ¥Æ;Æô*­,ÛX?mxÌíçÇFEç…t®°¢¾œ b@£ñMÆ"£§–5Xðò“«–’’"œµÄÚš7ØÖ­[‡(YõµÒÈ\¸ëàÍö #ƒB8ë§Ð7“’¨!u¦Ö‹FùzñžéÞ1qø/XGB_m¬{nYõ–ƒþ¬VŽ¥ý¥ç¢ÄG×,WB´´>¯¡[vÄôážáÝÀ¼™ÆÈ:ýˆ}W¢dH?4’hÐÁ=ÏÐÂHI³YÓ \þǦ51n2vËív“‰µËê]þ½gÓä¶VБø\Ÿ#Ö7AâAúGü(L8· ɸ;äÝ£ð_p[m锂s©,ÿ«~ùfï®BAy ¬&‘àHŽsD8¥HW°™ª®A.ªä—=¬œÚ§9ÏêêÒ%ƒ†ê|ƒÀë‡ëH!DÆ ›Jcè³D9@Æ=! 40€BÊR7Ýt“ÙËÊÊÊšÿ½ÿך‚טÀÊkQLXÄA{.R z÷A !ò¡ ೋ^Ϋ•›ôÅÑËES»‘Ê&42ƒ(MÓjÁ¸$G§NN;í4 X`jÖùÆŽ)Ü`8pà»ï¾‹Ybbâî²`w¡öÖj©dÝCIJJoL0õMÂyΡcRÑc” ƒE¨wŸâ³4À˜Á…1™; bà„£‹‘ bÂMç 4±Ïìðÿ„P¿~ýø%U‰effÞpà öžVlG7ØÆ·sçÎ{”l.ñæ<Ÿg4`Ö!jLø&˜°qpèÑ„Ž16AsIª1½û€,±‹b2ø×(݇ˆAŒÐ11£«`g F5kx’<ó¶ÃINNîÒ¥‹EˆÔ­[7³&*ûvdqƒmÖ¬YøI º küIÏì,¹µ”ÀIبk}‹FHi_7tID>#mW›O?\Ä@ãâ)j°0/tÄ:4€BÓŒ^â÷£X:zÂLÓ§O³YØ:tèзo_~A²píˆã)KYab„¾Ö'§,ص{j»`ÿY„ôº– Ü-aCVŠ×]•UºX©@#Ë"iŒŒ †Y‹Å]D±UˆtŽ0¡lšß ¼§¾¹ÞL×®]O=õT³‘rHi¹Ä¿áöíÛ[=’=;¸AÊ‚äË—/:t(™|©º!ñÜ®Ï.n=$' 4) qc‚‘°aǸÓ}ÊGô0:ò:‰ áA&>hRÿ'ÄÄ ²-t8ʱ‘Î1¼ÕÍËŠ^Úh,„‰”e8† ‚a!ºÅ aŽÁ¿^³>ÅáÚQ ¶3ÏÝGéb(kètŸžC(|Ш&Ì6UްpÜ÷ÌvfjNc×#œ‘˜ÓélÕªY'µ íà))ðwÞyç©§žzá…à8äCµþ¸yÛß™1êä=n+dº×ňO›KãpÅȶ.F–ˆAÍLø<ÉvR£ìììsÏ=׺;ptttzzúĉÃ}&;vlpƒ­mÛ¶÷Ýw_JJÊ“O>IæðÂæ“ѸOó£]Ráô.—ÛBæé>=ˆx]Œ ó œÂ€Lí›Læ>‚º8«ÑÊ— ÆÀ 8\FùUþöÿÊc®–˜˜èr¹®¿þz“»Ñ #&--íâ‹/¶®Öh;f¸AJfó®»îÂßÂúõë?þøcÒõ) ¬xÆœûÎèt%bô 0E”56Ó} E!¢'áBñð€ôyRëçw•ֱ݃°oêÕ«YÕÌ:uêÔ®];…XW;;–¸AÊl:÷ÜsÏ#<Òµk×Ç{Œ™;ã“íUqó«Ÿ–zm81zøt¢t1bÒ}à¤P9‘L39>ø3èQX±ÖŔۢ뤋—øÏ®æv°Kòù|fƒ,¡©19–5!kŽcܨ6{öl,t0€¶oß¾dɵ»`JR«C%¥¾€J–þ¾¢„¬à '¨Çäƒ ;yÞøøø+¯¼Òö“4Þšn°áðjíÚµ_|ñŬY³^zé¥}ûöaÐO½~ùÌwö¹Ò†‰ms[¹xe¤û €þnˆ¦¦ÎÖÓhu, ÅY­c*tȆÆ1ÿÜPö·ï©5 h:wîŒiæê«¯y;˜`pÈ}óÍ7‡ÿ$±æ‚lýúõÃÎ{îܹXôaÊÁÑL"%¿Üý•ÝéÝQççzø)ƒXY#L÷F®š þ……0ÈÃÁJÂTúÂo‚5;0ªªªÆŽëv»CÞöò]ºt±hÎlrkF¸AJ öV¯¾úêîÝ»çÌ™sàÀ7Þx£¶–š}¨! _üñA§$ÝÑ?ñÁÓ•æ&ðÖᤚ̸!®Ãµ °¡8—äj*g.Þ·&_0mþbccÇc¢ÇƒãíK/½Ôzš£&·æ…Õ&MšTTT„ÑÓºuë™3gþþûïË–-ƒ±:6¿,?±ºÿ¥F;½¦mjŒö?‡(aÓ}!‚p34Y F#Ó,¾ÉŸöÕž÷Á~83#1 ‚6mÚà8ó‡ùÅ ëÑ£f#³!˜GÔš#n°¥¦¦â‹åüüüžŠ­\¹rÕªU z°ÕúÛ¾°Ë!¡Q¹±ïŒÊPÜ–UæÆ¬%\F" „\¦¡8SsÇRmƒÜÿ=;ÊÄó]º\®ŒŒ ŒƒSO=Õôèú89r¤Ù}GÚš)nTÃbûø… âø|°b[·nýè£Ï…”î:o¯Šž·h`ë¨Ç¶ŽÚ·ãž$úÿ!—ÌmÀØxJÊ+oþÞþýU¦ÓàÇMcÆŒÉÍ͵¾2ÆŠ:»Y§Npåþýû‡º×#hÍ7HiìÅÖòåË׬YS]]}òÉ'cÏU\\Œ©(Yâˆa­Ü_—ºpg´+èñ§÷N|à´dez^“©ÑU WëhŠ˜#'+õþÀ5_|º£Úz±…Ž;â°;e›¹ü°ø‘på&ìÑhkî¸QmˆbÏ?ÿ<Ö=ø×™œœ<{öl\þÕW_ýõ×_åå‚xÄëj '×”â?¤øŸÞ©î)=&v³ÑZÂÃïY MŽÀÃ+KßÙ\¹·2ôt*111˜crrrFŒaÿRƒfÊ”)ö§¨9¢v|àFµ›nºÉï÷ã@Œ#¡=¯¼ò RÆû‘Ê~úÇŽ÷ÖÖOû¦ÿ‘BÌIÙq®®ÉîÁYQgµîžbñâ8nõÁºo÷Ԭͯß\ìͯö7„š³ æî°€mÛ¶mYYÙĉÚù‹å””,~ñáö:Òv<á)°Ÿ"¢G-Œ‹‹»õÖ[ñÐ'Ÿ|rèÐ!Ì@ÂÅÓ«õÉ[KðÓ¯¥© c»ŒžøøøQ£FYôÇFLûöí»uëÖ§OŸ#q{‡cÇnTSEOEEÅsÏ=›´0€ÔžoøWŽƒ¯+Và £´´Ô†šÐÒÓÓq˜ƒ©å´ÓNÃñQ#2+IIIøØfˆÕŽKܨ†ÄêÊ‹-Â’&—ñ«Rã/uGa«W¯ÎËËÿ~ìãø`þpL ¡ñ<Ø®];ü²1½±ÔÔT-Ž7.;;» o²Éí8ÆjøµÝvÛmxãã?Þµk—P#Ÿ¬ÙÅô³yóæ½{÷æçç'ÂD…} Oø#¿bØßaa© _ûGÌØq`Ø©=\ÓÚGÅf+S†emøŠXý„ëÎŽ‰÷¸!¦ŽAÄ_½ª‘kjjÌjâ×ÜU±£wsæÖ¦Mìц*\K·ÙÚ‰ƒÕ0CÜu×]xcíÚµ_ý5ÖØ…!¥™ c}w†eeeaêÂÑ8”š„®Ž²h¸!ÖO1¼e ²šhÔ„/vˆ˜]Žhg¼£`',nˆa­ªFéX©¬[·î§Ÿ~ÂbkO GÖ„†ù‹§}ûöaãðê¸Ð.vìÄÇ 1,uû*¦înÚ´ d^áÐ #©¬¬ìpÎ¯Ž‰ÄÈÀ'ÄÎë§Î;‡lu:Ní7Œ¥)6dÈXXRR‚ñ”¯XQQ‘W7·b8’òxŸ¯¨¨(//oóæÍ»víÚ¿aaaiiieeeUU•ßﯫ«Ãÿz½^u¾¬Þv¹\jG#u ¶ÈÈHu† ¼“’’’™™Ù¡C‡ÜÜÜN:á \íX?t‹3k¡›ÐÊÊÊ–+¶~ýú;v`a&hm#›ä䘆Û¶mÛ­[·žþù˜›ÿ´-Ö¬¬…nŽWÛºuëâÅ‹¿üòËM›6 §_†5T±b˜"ß|óM¾VL999ƒ ºêª«†þ¿ÓƒûD²ºiî†Ã™Ï>û쥗^ZµjÕ @+6ÐmSìõ×_WKbccqćeQÇŽ/¹ä’[o½5--íØÞd‹Y[ Ý4/Ãîý駟Ʋ%//O8¾$..îð'_IŽv¦yœIQθHG„#8É\@–k}r¥7PV8TãÇÿF¹$ü甤øÈ Žˆw;ò¸n§„)­$º¾ªóðR×k,¯Ç›rmƒ\ï—[E9Z)—ˆ‹œŽà©|²\ã•ËêýEµòzv©’pMËˢ͛7ÿC1µ\’$ÌDguÖŒ3†z”§sn1 k¡›ci˜P¾þúë‡~øçŸæçCš5×8%”›™çò¸$¿ŒJjýÛËðï¿sRd—äÈ“[EvJŠèœ‘“á8Ö¿A@Î+÷m*nØVâÝRÒðW±w[™×¤Ö±NLjÞ€|¨Ö Êg6ob‡×Îrñ¨~ü­ª³ôaSK0ã´nÝzòäÉ3gÎŒŽŽ>BOÔb!­…nŽªá_Â|ðÐCmܸ±Ñƒc±¬¨j Éöà ¬Gþ8\âm`ë¨AÊ_¯ôH—5—ÀY½>éèËva½“Û*ÿ!ä1«Ûà—7Ô¯Ü_¿ò@í/ƒóÆfź0î©hØW†8Â_õþýûT )ì“0a„{ï½·%þ:šÖB7GÜ8pçw.Y²„Yɦáçô¬¨ØHÖ)[K¼Ãr<#s=ç¶IŠåJµiß¹ûÌL²Üm“j¨;TŽŠpJý[Gá¿Û;¿7Žø¾ÚYûéŽêï÷Ô´Žuá¸ogYƒÐ…¾#Y.++[ R¦œÉÍÍ;wîèÑ£íÞb¶º9"¶bÅŠ›o¾yÆ áØJ!ü[[u .;Î527æÂ\Oïtnæv•V,~±ø×ŽÕ?ùÂ𠜂¬G¯¨b÷pn=&RAJñ8¯ê‹ÿŒâZ_èýd[Õ;«÷UùÒ<®ýU¾*¶mÛ¦N$ªæ}f̘1{ö쨨¨Ç¶XXÖB7Mf?þøã”)S¶lÙÖQí"0¿×Vî¯=¿CÌu=âNkÍ&7%f É)’¶ÖHØfw%á±Æ‚“ÆñöX,(iZGÛâÖ[–Ò)‘§d$=pF’Z öÖ¾ñGåç;«Û%¸ò«ýE5!B05ïóbHYaúôé?üpKƧI¬…nËvïÞ}ýõ×÷Ýwö1‰nÇ9íb j|›‹½—wŽ›Ø#®[ ½D\,˜%$§…µŽR¦&Ìki‹ ÃôAds&‚‹íÒå‡tvN4þ#%jxù÷òÅ›*±Š,¬ñW7„Ð>õõõO+†UObbâüù󝹿›Õb¼µÐMØæóùî¿ÿ~ê{½^›‡ôJs÷KwcO›êqÞÞ?ñÂÜ*™Ëó‹ ¹È’)ã„ΆH&ÛÇÊèUNMï_O-‹™ˆ$Q…ú™eºPêžñô°ü‡”¦±·Ö<µ¶«|´ÅÊ•HQ=¥¥¥s:½zõzíµ×Žæ2Û'†µÐ]ËËË»øâ‹×¯_o³þĄ̀6q®o÷ÔŽÊ™Ñ?¡K20B~±I.Ìb3_s´Åg@Îhfv'²NF|G§vES ¢ÙÇé.îƒÿÔ‚…ÞykË>ÛQé°¦¿ß¿nݺVWWGEE=ú裷Ýv[Kï;ÖB7!ìóÏ?¿úê«™éö£Üî:Ñ@¡ž)î~™îOwT_Ð!fΠVÙñàëe(†§I°0’LÒ¥f2ÙS:FM¢lÔ?ð›åMB1#5â3ÈÙaeÅåi‘/_ 5Šç•ùXQ²,¯&Ò)åW³ÔãŽpúH]S¨®®îoй\®ñãÇ¿ð i»~‹µÐØæÍ›7kÖ,³p sÛ)y•åÝŽ‹;Æ®)¨÷¸¤GÎLÜ&jJÕê…¢~1KÜ„%sP8Ib>+ÜTÔCµ1)·+Û8¿ñL¢§#OÅgpdîÛS*S߃¬ìKT B,õ´Kt½zašºûÞºÙÿ=TXã/©ó×úä”hç¡ZA¾‡Øo*†yç”SNY²dI3_Ôò˜X ÝPöøãß{ï½v:øöÍpï©ð•Õ0ÅLègô¬³¦^ÂØ ¬,§Li…ðHãúà„õ©0QN5ÛßÔ'‘V²HÓˆš¥Ô·Ä¥oà÷/1ôÇS’†æD­œÐoy}ò++g-?ä‰pÔ˜ç˜1xV¯^ݶmÛˆˆˆ“N:éË/¿lVK¼[k¡› ½õÖ[×_}ȉ0§\Õ5ns±ãpÞ°”ž©zw&ä —bD•àGeÆ,!£'‰Û°i‚ú<¯pZC|ne2·#5’$ !#VbiE|W´Šê2õH‘.ijŸxü‡÷~=P?í›"¬wVùü&m’ ›6mÊÉÉÁzgÈ!|ðABÛYñÍþ§éfݺuçœsNII‰uµøHÇø.q_íª9­MÔßÏHJóèD1¬{ù2ç`l„Q&©âÆ÷Á92bî×fÿüLÎØªe ™‰–‚e=%‰C–¬(lKê €¯]9[ßÖî_® Jžƒ•þ;¾?ôã¾Úª†@OL wH|fxŠöÃTȰ"°²Á/ÂT±³ØS:ìûׄ¦Þ£² Ü$[lÚ׆MK<³È´ðQ“>Õ£æz 2<[@ÊŒs¾=:oÖ6 Ç~.ùç†ò†@pl½ð¡±ÞyA±¨¨¨E‹aêV;í‹n^z饩S§úýV]K=.iR÷„OwT]Ô1k™çF(y_‹p‰2áPŒ Îé $bK™c£ã:Íá¤L²Ldd;[,l«’Yí#1ìÆ$}D¹ò‚(ÉÃT@ŠŽ@ž‘„ÿj¼òÝ?´­ªÒh0Ï^WW‡ƒw Åž={~óÍ7­ZµV;ñì‚n*++±œùõ×_-ê`]Ù5î÷"o‡Äˆ9ƒŸ–¬}µŒE¸d.ylP ÇPˆûš´XYæ‰m$‰ùë6¹QíSºœ±¸IÓðu„™ô C\H%Š˜ŒìŒà @Èc­yÇ)-<7ÿV&Y°¡°Þlä²p8Ÿ””äv»_ýõqãÆ «Hv‚Ó Ž™/¸àëî¿§¤»ÝNì‹îÔ*7QªM胊w,$w†ÃO嘒‹™Ì!•íðÔ;TI£ŒkÝ£:J(jôä“u¦V²–- ‚ ¿ÆÈõ°Ñ8¨0¾Z@J‹q|rI&ÞÜTÔpågùùÕ¾²zq{V}}ýå—_>a„3Ï<ó£>ŠV;ì„¥›{î¹ç±Ç³¨€ƒ¦z'¼õWåÔÞ ×tÓJ!æl² %y(܇™Êp¨ã_˜#ªm¥ÃœM1“V—PÇI4wXÜ›q “4QÁVªØV²žMU= ;#1©mQ9c‰œÛ”w”“wIXm6Þþ熊ûW×ùd¯¨5 ;EX%$$`½óóÏ?çææòuŽw;ÑèÆï÷=ú‹/¾°¨3 3*Í¡wkß„G‡(Aü©&Ëf*ñŽÝU!hEb×a˜Cdš›ì‚Tõc–06Ë SÅ<û[©ÂNÖÄa¼tÞaã,ãð`Ñ}âñßž2ÿØ¥òkü%¢î‚@àСC't’ÇãÁì3hÐ ¾Îñk'ÝÔÖÖ8ð÷ß7«€_ø„nq_åÕ\Þ9vÚ)z“ÔŒáî,XÆ,\²²¸O›²ãß1Ö µŸb¨Qà’([l3UÌGL‡›¬ Í;Æ­À[#u”cÛ&:”-ÐSkÊžX]Zi2#OMMÍàÁƒÝn÷k¯½†C-aãÎNº©¬¬ìÑ£ÇîÝ»Í*ÄG:&t‹ÿx{Õßú'¾pžÒ9ÝŽœ1MËâú,.Åðü‡ZÂóÊ6;þ!îBGÔ`ÇLÑ ƒPx&ÄJˆ#Äq‡8O ¹ œ!t²Æ’w`tÛÑá-$Éî<5ÿý–ï½àƒÕ zQ„U__?~üøI“&=ðÀ3gÎ}YÇ“ßtƒ=À)§œb1£UN|Äìè …õwš8÷l5n hqúÆËXÆJa§rP¨PKXú(›±²æá˜Á2¡F[d‹E™Óp V³¦mHå ûÉŽw¤‡fT 2;½2"÷Oo·¯ÜÎûû‹ký¼ØILL,++›5kÖý÷ß¿`Á‚)S¦ˆ¾¸ãÃŽWºñûý§vÚ/¿übV¡krdÛø@ž7,Å¡¿sò ´–3æl"Ž˜,x$¼Të·ÃɸšÆGv[ÄŸÜ Ú$ót/U™hÁy‡ÛJÖ„¢›É¨†É#AhËÐ2Ú{ŠåBmœ›&·­¨“G}x`S±W%œx×î ™+n¸aÚ´iK—.½ð ÑqhÇ%ÝLœ8‘¬mÆ[fŒë`µo`ë¨gÏIqª­°"ggL‚©Ð•™úæ… ˜Fwü %sBät˜“7®EœÉK lq’úTMÄÇJˆþf˜.ÅáRu²¨!È;t²F/'íè0.ƒ$E2;4+ÅGI˯Ìjð£«>ÍÿtG5æþÛòù|#GŽt»ÝË–-;ãŒ3ø ÍÙŽ3ºyñÅ1Á›}zrRd‡—'ÂñúÈ4{D#¬›Q*!ö§Ø¸ŽfŸ ͨ)H+jCÇnçZzÂ8D§>‘¨¡êÛÍ7ºgˆw¬’5œØU¦H‡"œè½‹2¼ hìÒƒ«ÖU‰FŸc¥3dȸ¸¸ÿüç?ƒæ+4O;nèfÛ¶mÝ»w7ë°—í¼°CÌæï[£2´Ð‰'ø«ÇMàBJ2«lF%¬9ŒT_y"x esxؤc×ÂÉéDcÝn’©aD^ÉL¶“5ìYc¬aô‹Á/ÂÊšt"#Ðç—e–×ÊCßÙ—WÞPÇ%’eY®¨¨:th‡/^ܧOîKlvvÐM 0`€Ù„H§4¥g—»ª:3)U«Ý¢…¡(‰b“£œÊé $þ¹†&zã¨2–D£Ô‘Ùrn »úŽR²Æ¦4*¡c%aEפ£ÜOB´´þÚìýþSßÜ[ZççÇ`544lÙ²eàÀ—\rÉÔ©S±äak4'kîtóòË/_ýõfŸ^×#þ‹5×÷Šc[ÀïÖÐ)–Dcx?3â8&©B‚_©0°Bà‰„ÆžöH‰‰Fßb>¥4©Ìå‰eú«h’d ”1±‘¬Ñnê)aMý´‚œŽr3YñÎ}ÓÚý^àÅJG8Ü«þwÞyç³Ï>›1cÆ¥—^Ú³gO¾Ns°æK7UUUmÛ¶---~: 3ª¦!Ð5%rѹôˆm›D~Õbî™Êæ}èò¦`Å\Ë´ük§œ­£¯\Ó´¼£½ ü„ÌkJú¿ÜLÒ7û@êaŽjt²ÆÁ^²FWFvH‡¯Ô›‘ƒQgÏôÈ’[;<¼²tÞ¯eüt‚ê YO<ñÄ7ß|sá…N˜0¡Î"ØLéæ¾ûîS×ãÍã’®éÿkAýŠ«ÛàH*Xä`9By*š9ca*ÇDÎTX‰ÉÅDæÈ±<ÜbצÁÛT~3²u¶HFFîDÌ5t¹iEGLä¨F%kX½ƒèD¸Íd ,$}pæ¤ˆÌ r¥þ½§µº½_â€7÷æUøøàª¾¾~ÕªUëÖ­+,,ÌÌ̼ᆒ’’¸oü˜Y³£›šššììl³öÆwŽûfwÍ•Ýbç©“]q²ÄDa¨2ëþgÂ>MʱÑÕ M™ÅŽÒ5ƒ&îÔÿŒùÔâr:õi'â‰òÚG£†ð“5fÃÌ’5ÂÆ&: ‘!æI‡©FúéÐ|äqK\ßvùKc+L:/¼ð©§žêóùâââ¦NÚL n^tóÖ[o]}õÕÂ’¢œ}ÒÝ)çÞií‚ûä÷lð‹(ËËÅS6ùH|639c6ʤÿüó¹/úh[3¢›>}úlذAøÑ•]â¾Î«yfxŠ6EôÄA2X(|LØ' ícÆJT9C+ôO òsB¥²¨+ bMQúæL>éX›ÍS‘ÀÄþL}H' ðI2]MÖó>ÜC‚ÑÉS*)½ÐŠMøœ¹ºèl&±•üÖèô? N_¼—Ÿ)YÍæ<õÔScÆŒñz½˜z&MšÔºuëPoèZ³ ›½{÷vèÐA¸ÜJ´Kº¼s\I?´¨áÕ (‘ìQ5PºË&Ë„h¢2öX #T=Br1k´Ò‚:ãÈì¶'¼(ßü„DÄkUø°‡Ù54Nã“5B*!ÄG1Ç&ê¥ÙœŽV DaÜÙt²“´øQðýuK‹(¹%÷¬wö­-¨fs–.]úË/¿\{íµ/¿ürjjêäÉ“N':vìé+½Ûo¿]øÑÐìèe —tŠÞNY™0,QçiÌ…O>çŒ'•cÂ2Ö*F@1öZÄmÍJAo4¡Éô¦ð|Cu—šç¡…@õ]HˆåãÄBý‚è¡•0ï ’ÁFMžM ƒ($Œ‘¦Ô¥Ì‘òWd-ÝZ}í—¼ÌÁÒf÷îÝ>úèÍ7ßì÷ûŸ|òÉaÆõïß_ô&ެcº:tèòåË…]×=þ—ƒu¿_×6Ê¥¼C%j¬R0‚èɆðAöøHx6Xh•ʱÅ22¨öÛßÌ×+Vokð‹&EqH¨K¶ëÞËc.è 7ùUKà_¡i5Q¥ÿüõŸ¢)Ñÿ§E¶¨ù·¾™¯VY|ݲ]s.=¿¶þ—Ä4~#°mÆ;L²S6z‡b:ùÂ瀩„[YÈåI/ :æö]^Ú-\çËœ… ^vÙeêb{+V¬˜>}úQ^‚æ˜Ñ ~øÌÌLa·š·c@fT›x×¢ʲ§ÜÏ; QC¤üI[›|$:›˜’Øm–‘¨ÄÄwx¯œWVëeÝcX8ÿ¹ÇwÅ“åx;Ò%Ýs¹gÆÄS!1Å׆¦V1…ªO Þ¯Æ2æä¥ýö¸á—úG„€–­÷N˜[QgãÛØ¸Ç7þéàøiüm̹$fÆÈí^Øî¿"Þ‘A~R‰Pì0–Y³<¿…„¡#)YüRæ ŠŒbÝÒÞ›Úß¼¬ðÕ?*øùsðnÉ’%X×`uS^^>wîܱcÇvîÜÙú‹mB;6t“———››œT¿Œ¨¢ÿíý‡æD÷Í(žGxQÓ¸ö)rfk>ž­):Êœeð}Î]ZýÐûUü×Ò¼>ùÁ·ª{¯f@'×ÿ—€oÔ @ )søÊj®Äª–þ{fÇÌdÀG´¨AäT=þ^õ£ïÖØ»QÊð·qÿ»U|X=ðäˆ%w&Fºô³ZðÒ¿.˜Ë±Îûš²‰ÁT5^ &nÒ#Ã2Géìà`+BOòÂsRG´óLø¢€Ÿ²«®®nÕªUøxýõ×ã ëƒ>ÈÊÊš4iR#¾äFØ1 ›÷Þ{Ïl2ÄkºÅÿgWõ¯³©ÑODÔða_Ô€6M¶ð|$*4OëÛ Ë`û-¯aè½%& ÙµúùÇ?:L*¾ñ¨{¯Ša¯ ÍfÇ?¡ÁŸ¨¶)SYXèN}Áë·7 »»üð¿åzÛßT4í|²ðo’dÜMy‡mí6(tÏ`6¼ %ahúÐ…©#–9<+±Õ¨“cþHÏéñên>•ãóùöíÛ÷øãßzë­ÑÑÑjZçÿÛ;8)Š´ÿWOÞؼKÜ%ã‚dA‰Š (bD=ïÌÅóÔ÷|ÏìùWO¼;õô̾(ôÔ;EÌ( (HÎ lÎar÷¿¦{º»bwÏìì¢ûÁîêªêêž©ïüž§ª«!}òòò:u»-Xwã.ìñ¸}>ýµÜW–glªõM`°€ë@©9c€] °&|˜Uap1‘3h\í¾â©æ7Wû@‚¬Í+-~Û»äÿ†§³R<‚YbR:̲ÖMÒþo2©ïw¶¾ý¥ÉûÚ­[›O‚šñÅO½?>–“ì–O€r‡¤ÒTÝÂG1MÒcIÁ4<¬…A%znéXEr–dØk¯ë7èù‡Ûô1ßYYÍ­­8^¯wñâÅ×\sMvv6”9/¿üòˆ#N9å”DÝv¦u+næÏŸ¿téRmWa ù SnGdm¡ÈŠ\ÍÂ㈑¨‰e¼¼“ Arâ£TX 'ßÙ¸~Wq¿:aPT7Šƒ.køæ‰Ì’\› Vä~'tLMÒÏÁnƒìXIê4œ“oiþ~cJDg ÞÚfqÀuµkÊ.éá@gÖ(?˜Øá¬ª.MŒ$ ß'2 F%`Ñ±Šæt8Àî+ûÌ[Qµr‡7‰]Ô#ÑRå%—^ziQQQGGǺuëöîÝ{å•W B}º7'Ÿ|ò'Ÿ|B§g¸mCsÜó‡¤^VžÙ§Ä ‰‰(5šÓÉñráCågÊRïDÓ/x¤)á¬Ñ¬µCšp}Óæ—²2R´îÄÇŠ@mtÒ4'…ŽÑè0 WKÂY£Y«W[ÃOOäd$«ß*•/’Š¢¡ƒÑ$ Ãò‰h™L¢V¢4’¡ƒÈPÎëgæ?°¦ñÁµ Ìàñ’%KÎ9眲²²p8\UU¬n¸!%%¥+>‚nÂÍÈ‘#7nÜH§÷Íp¦8……£2Îì/_ÞÕMƒ¾æQaÁßx9Æ—ØAƒ‹?ó¡÷à Foøì¼‚àôÛšWÿ#COBÛC›rO F”L-ZÔ⸎¡§Þõ}ü]W‘W±@̾¯ñ«³Ñ‘o”/Ñù7¤ZQrÒJÇŠ„‰%ô«‰#SÇŠ±Š”`KÙŒè9ï8!«8Õqã§µôõ WõÎ;ïœzê©Ê²@?þø\зoß„ßÿîÀÍ Aƒ˜/K8.ÇÝÿ6=wB‰üü/0LêΔÎ@Fs¬‹ªFtËÔüÌ£Zb´ý¾ tûËñ BÅdþ ÔÜ&½ò±ÿâSÝzª•8qô¨ÄJDŒüöjKóÅzüÒç—þ÷Ùx¡b2x7ê[Å¥_y/šì¡ƒÁš–‰zXtX‡é^™H=Å<ô«´Âر¶ØÈàñoŽKËO±Ï{¯Š&N{{ûÇ ý©ñãÇu¼|ìØ± _¬«Ëq3pàÀ;wÒé'yö4ÿs~Ñò5‚5\ àþ‘f1㈑¨1Ÿbœ5?Sï0 Ï~ÝÓ­Ìéj ·Cµâÿì˜wªËN>ŠeY˜©¡ˆIÈÿxù%íÄ$ì®}´5/‚m¹¹¹N§3ÔÕÕY-£Úázñ¶—ÚæMöØ´W+FÐAŽ"žõ¨7_æXý²+26,±3(¥5‡KMŸUšüÉùÅÓÞ<¤ˆÓÚÚºfÍQ••¡äY¿~ý¶mÛ®¾úêXï°u-nŽ?þx&kÆz¶7¿½¤¤$Mn€EÖ˜kbÍ%ô",/ ¯ èXa)F ¡óÎ7 |1µ’<Ûc¯{o¹˜Z…@@þí¤W‚öUb6ì2¢°ü«œÊÚÚZA²²² !q‚ÁØ\°ž9öÅïvüþìd*òb:̵¯´ Â'ÒªŠ?ô‹Gj¬dà W‰‘ÑEî —ô:þåƒ!j–Ass3$Njj*ôª$I‚’Ççóýãÿ¸æšk<îBÜLŸ>ù„÷„"϶†à÷—–¦v†5œÈ±ihÙJ4ÇÀ{Òµ=†®#Ìù{{µ¿{¤b‡kÅw?Þ²ÀÆB¡C ú,r⛟ú­K›h9Iâ-Šdj•â;kü¿?'ò +ÜËHæ<ŸMùV±E°©A2àšèýTÉ¢ŸO/Ëvlº´×q Æùè£<Ï€€ü67HóÇ{láÂ…GXÑU¸¹øâ‹?ýôS:}xž{Osð“yEF¬á©JhÿÈtnŽi4Ç@Ô x’ÈhXä¯ï>i­¹M%±¡UÊÎP{m™øÇ3XŸöæLh”ô•k»6BLXC«Øá—Z¼Rz² Fˆ-@G‰®;‘‰(œHâ0i¤Ð3(±áx‰Sšåøì‚’io¢Ê¢æwÞ™?~II ú*7Ýt“Ûí³.ÁÍŸþô§W_}•N/Ít¶Ä¥g 6Ž×$„5¦š…bk¢ Q×B„¢AV5v£¶‘­G†PÝ(fgÚM°ý‚wNì¨18ç£ÅU ä—¾«-/ÓVÙNOv ž:,”!s†oEÈ Fsô)ÃÐ/ªƒ‚5â"X ŽFºÞ8£à‚÷ªhâx½Þ%K–\uÕUÚ£Ы‚çú믇®Vgn{âqóöÛoßÿýtz¦Û–á¶Ý>>kB1kÊØ‡ÒXÓ-C˱e`‹}éOìs¼f91ÀZó±K-%Ihj%›zÊ÷Õ:¬mcC‹¼m4×}ŒÃëïššZEæ$=ÖÀ6úÅ|+ZæhÓsú• J‡A–‰3«4ù±i¹7~R–Èûï÷ûŸ~úé›o¾Y[uTy ¼“‹'7555çwã46¡<×=opêeÈüšÎ²Æ %ñ‡–é±* æ´ j()Dœ§§$Öi1·Ö)'YÑ 5°èQS`N·ZIÉC>–™•ÞÝw£¥CÊͶEL@Gœmr„;ÒÓÉù/4§b ý*Ä¡ÐÀ`V"ˆó»ò´ÍÁGÖ3fEñ¥—^BG¦”%¯½öÚŒŒ :¿K$n ›×¿‰"%´¹ýS Sä¼á¨XP3³F0d9J¬‡–iÔœleÄ#VÏ€žöO6t_ÀÂa•µbI²"¯fÆ2‡ÌÉ2 è˜1Ê#0òÈåú÷±}¶ÞBdN8R'+Ïvhð…0¨+Ä•9é%‘“zåË4ýZlb ƒ"Žò!ðˆ#¨£ãJ6!ʵ{O걡ÆÿÉrÒS(jkkûðÃgΜ©%§žzꦛnŠo­õDâfÊ”)---tú%CÓ·Õþov~d‡¤ $ °Rq†{Ô ¬È1Ç25´÷D©ç·§{žZž°g2Mí¸‘å"=õG†BgV5.…¬;F&ª‰~3×õ̲®]Zy?¼.—ÜM9«kÝ’57O"£9À’cÅý"H²úåxUÆÅ9œ‚µ½vQϧ÷Ñ‹rAÜlݺµW¯^C† Ñ•iÇ‹-Šc¬*a¸Y¼xñ—_~I§Oí™´bwÛŽ+{Gvß„ö’p!Ã&j7¶ê‚ÅZ&êj3hDb>—D¡cÌD%eÅöÜL[mS7Œ=npö 'súnµÑI‹þŠâM»ù„•ô¥BL¡¾ÉÔeKŒ¹œà¼)n(ú´}„› ³eÖáuÇ ¨># È’ Ð¯`Çш£ŠTËO9 •o¸¤W¿g÷ÓCãP@¼ûî»%%%éééZ¢Ïç{òÉ'.\ë|œÄড¡á–[n¡Ó³<öêŽðg¤»”—j–Ͳ—„E`-Õ-¬Ñ5 és‘‘º*†ÉóèõÉ—Üßå1@+ηÕ4H—çľJò/™.±Y·èWœ5.©ÿ ‰ðö<|«ûwì¹×3ÏVß"]vºG $Q>‘î[@!dFÑ*á†r” *.8È0ÄŒ0ÏçR®]Us¹)¶—få_úï*ú1NI’^|ñÅo¼QKE±££ãù矿üòËcºù‰ÁÍèÑ£™!› Ež1…žI½uùt÷ »l/ íºŠy[d oЉ sŠ^:ƒë…q’kPoûöŒeekÙ¯qaíTLù 2±MŒ}ŽA èÔQbµP)Ú)æœâ|èÙÀÎ}].÷2R…»›lm„› ÁˆÀå04X&Žò51v‹×OÝ%Ã4\auž30õ­©ïî&ƒÁ T1Ðw™4i’– ðY¾|ùœ9s¬ßüàæ±ÇÛ·o>§,å@Kè­ñ™‘MÂhÞGt—Câ¨!\ô®Ê t @‹Óahq‰L—Èz˜ŸVTØøÃ¿¦õ;§)Ö µ1ÙéS 8e’úA äÓÔ!=Ì×;ègùŠsÄ‘¤~ÁQÖAÛýàùäA'·uédëÙ]aQš>ÆÉÓ¡_"R#_K³(WU'X XHØ*qxn‘âñHsåŒy=…ôÚùOîm Ÿt_V¯^}üñǧ¥¥i‰­­­°ãoذaäÈ‘ïgqã÷ûÿð‡?ÐéÐú©>°äôüè>KÂ!æ®rA3[wÁ°Úج‘éX~SŠ[’¿Ùé©Â‡¥Í\ÔÚEÄ9y¢cënqÝ»Éäø7Áëo†18ª- Ê .ôÞq£»YÂ{Ï%Ͼ¼£‹îÆ)ãœ[÷…¾}1#ÚHùf°ž< +’ Z Ñ>­ÏÙ‹•8|·=ƒÁ‚ Óð"»j¤I=úÚ…güë0½l+8+V¬˜?>šØÜܼråÊ^½zåääXù:‹›¹sç†Ã wà´¾ÉinÛˆ|yÖ³Ù¸!å(¾ËQ.l~Åë‚©Ù˜¬Ñk㱆Ô,üÐ2#A=Ìþ¯‡Rν½=”h§jÖÇ–áµï¦DföˆaòE Rb2fY ù?"jHúDçó‚±ÇÛÞúGÒy×yYß©NÙi?í ¯}! Þ ey 3 ¡_ı’û<2H¢Ácd°)ªpb"áb>#Äkù(Ä1r©¦õN:¡(éëÃ^âBaQWW·}ûvâÍ 0ýÅ_üýïoÓfò­S¸Ù½{÷þó:}b‘çƒ}íû¯îÙáºQÈ¿1Mˆ &oÄÇ­6^°Æ4Ò’I£^M{I«é»M¬Ûy§;jë¥ÿIFï¿~‹Ôqâˆ×ð,Òe¨÷ºHê?êC&³ÿ~ʸ9íþŒÃ&œ=ÍU×$n|5=zŽèÄ9É,RC‡~%<џ͈ƒ£Äb\FŠ2 ÓX âàG)i=úîÜ‚'÷Ò1c¨e–/_>pà@b@ î¾ùæ›óæÍ3ý,:…›sÏ=—HqÚ„§p 5ôØÔ·]½$€|áiÃÜ5ŽÑĵK¹`8° GÜ­²Æ(´Ld QI¡íÈÇ7<Ôñöª`'¡3i¬}Ç^qÞ™ŽÉãíØµ¼ñú.­›Ag¡CáDMG¾€D&þKŠÀáoS¯þ£ï½U¡NBgÊhÇæÝá³]“F8¢'“ôQ¤pB9›õk8 ÝtøXÃñíZr¸°V¥º„E£³žØØ”ì°5!ïE155uíÚµ'œpz“ÛÛÛëëë¿ûî»Ñ£GñãfçÎ?üð‘¥ÑIÕí¡yCÒ¢WÔë¡Å ÏBóÐàÎe#)Z„Œ '„5ÚÕgGO¤Öð÷ÿIúË’æßÞ¾îÇp»7fèÌšêØ¸%Ùù¯Å©Ñ>ÆšõËŽÔ‡~-Gà'Îbm¾L ÔÀÔ é4áy81cp߉=žÜØÔà#}ÚÚÚÚ¯¾úŠÀ 4èg­\¹²¼¼Üår¾ÅÞ«°lX4&3ºÃ”6x(‡éEØNÍ)cб‘Ý“ˆó2cæ¬áÌ<¤(ê¢\.iÙâÈ:,Ë?.zÐç°ƒúf£žý哯Ø}~Jw/r–övK(hPo¥ %j 'þYS: -X“ú ‚5Ñ‚’ ßõ‘%˜ît‚·þ™,ÿÖá[ÿ쇻õ&wcÒhG‡W †À=×»û•Ø"@4PÈ¥|‘é.8 -ôk‘8`±ŒÇG«„s+Ëv©°]º‘lTI7ŒÌ|ø[ƳTIII›6m1b‘AóÁÌ;×àŠ7ÊÂ_túɽ“7×–H–ä [•˜pйË{ÂP˜èz0+‰“5ŒpžaÎ4çœé‘RS/½õqpåêкMa§SÈJBa©±YJM¦ž`‡ŠæÔÉv;ÚNIk'záÌmôºôR¬Îl…5J6æ¸DPwÕŽ¡}ï6eD#@ïE‘Ã"8÷tû¹§'ÃýªéB+¿ }¿Yl #*|ÐØ"e¦ 4§Mv̘`÷(sJu¿Iiú¥´ •p‹øÄ!:<`ŽÛ¨³óñÄâ˜Cþ¨ŸSàÜ5¡ÇâïšèyÆ_ý5èRí—­OŸ>€cqâæª«®b¦'9„›GJ–x1Þå8Yѽ¸œ,¼~.ã$½ÀïXb ŽFq*š£ù\¹¹Â5¹àQBò° ůš0f8V|¾ðÒ%Nµuˆ¨‘O©îêÐЂnG‰€¾—² \s±þE’Dµ"uà<êúÕ(‚ˆQjf-:EAÁ¢[¤fBbß~ûíØ±cY߉¸pYãó1oéŸå<¥O’æÞ€|Õ d×€‘hâs}Ûð,$/´þ= XGÕ²&.˜D–b²†3IG"òcõó`Ä ”!'û±¶ÕÉbȆ6|¥>-QOш ˜¶¸/šÎ]¾ùýg?Ÿ=È}²“ıQóqRò„8Ê âð “[„ž¤‹\\6a•ì´ Ïuoª!º…Limm Z`JžFõýœŸ}öÙ˜1c˜Ooƃ›¿þõ¯ÌôšŽðM£ñuwØÐÁ²Çt¬ ƒÍ)CR¨yŒ°E£I±”Å»}¬¬áÎZ¶ò :o‡2úØ™ftŠ©IJ1ÌÐH0;Ñ!"DÂÞòѦá2Ÿ¤ˆHJŒÄ!c·ÈXžÄäRÉ TZd…z69‡!DtTƒjí#×seyƵ«jèÏ9++kÛ¶mǧ¥¦¦nذaÔ¨Qô¡xpà )tïj œØ3Ii%zÈ(Ùe"`‰Zž¸\0fKð]žð]ÁÊ®!kt$©MU®š7k™ˆÔÐ4A6$â@À„]Ä“ÁÖ/Û´jÐ ú¨)Ø«¸QîhË>¨qe]éH¾A=Ÿþ¬32ÄE}×ЊÅK2éÞ³ˆeÃ…#ý3eÁˆøÕ<— K»þ“ú™èßðpS__¿zõêÄàfݺu~?ã-Å)Ž¡=Ô…ÚÙßјbLdµ€H´ mØOZ°kà¸`ÄQ‚ƒÔQ¡ø#î4GX0ZFB+ž“…&ŸfĽ¨CX°&ÚZÆ *¶ÖLÔ½ÂVŸQû=©W V„ Ÿ3à‡vm€Ö«©0‘[Är©8ܱ$p¬¸E ¢(†TFX» Êvm­'g[Bgj÷îÝЇ¢Ÿ]$Én·C <˜83n¸ž”7|ɰt,‰É˜@a‰(N¯G°P“‰l–aÕš¸Q†1fþQùëCŸ×˜5Ô»D½´Ÿ˜‰ƒnS?gÚ ÚWŸ Á&ùÚ¢²h5Høàt4"sØ >PöÜ€Úoiâ(ÅÆ§;ãRa1¦"†ÕJØ·XB1ôóc$>téì©[×0^é•““³cÇš)@~—Ã×_ܬ]»–Nì‘dÿ¾Ê?£_R´Ñˆ‘ígò…‚„…‡… 5ÇûcíÒàŒ )N1ÄŽ!˜Âc@§D ïq-´6€Ó­6­Ë!W‡”T?@­¤Kk—¯ŠÎKT¢da…~‰Ñ¢(dLü "Ø¡ïb‚¨Ê25¨ŽmÈíÆQ€ˆ#FÆRȨ X4*ó~n ®9xð 7N§³¦¦&//M7‡¦¡Üê‰výN©f…/ô!}ÃL„±aa)špJÒy­Õã,ò.=ÏèѪ2a gÖ¶>ƒN‚RÀŒ¹·ÆÄaš„´V«X@RZÂÈ‘eÉh­_U h"…"¦(Ç0µ†•±–Ӥіí µU«§¶¢D !‚¶„™È+¨–‘Äd§-É!x©WµµµUWWSuEÍívoß¾½S¸©ªªb¾9Ûc+õ8Õ¦#ÿjÆJdëã>oP0vŒ"Oœõ°9Ec 'ðkÑ`Á@Km°ñ¬e:l†1öè}c9&©×£µG{QôÛϙԫmX$ŽÉcx0ÅÄib©!°mfç׊(Ç_¿"Ö% ý‘XsÄ£ÎX’æØÕHvü–––P(DŸU±†††­[·¢ ‚XqÃ\nZH’ŽËe=šÅû ÄŽ&HøXÉ“P0õPñc~{ôDf =ÊèGI)»j«¸S )ÐxÃÐ; ˜ˆGYƒ?¥=Ž€Î ÖG¸Õ£ª—d´Ö/{iÎc¦^’¶kì›Dû§\ ÊGž‚ÐoWœa·ÇRA¼1lú˜5˜gÒÃMãF±ÖÖVt‰?Í”÷Æ455effj‰±áæë¯¿f¦×wˆÃrpÜ|;Q"yí–ùÂ.Ȭܘˆ‚ÀÄÊC¹`XA£‰>¸p1fõYË8Î0âPºè‘ÿ©èa9Pæ³~âhE(â°wÉîmá €o³!Œ¬B q r”HÜôad¡Ú?±È³œZà ôx˜¸QŽnÛ¶ }|<6Ü@uÄLßÕ(ÏUßF›Iä3èØL3“ÁÑ„dñŸ @ÒóXQU˜(2bE83Ô£¦£`L¡t(ÝÀñ‚6P “”ɬ_€iÀêÞd¨‹éRþ‹Uˆ€æït—¶Ts”6&Ëð£x’aA&à¨"“”ùt”¹\®šššþýû3úýþ;vÄ›ºº::1'ÙÞ³“íjƒ)3îüLë,˜â,È>¬"dÁ8ÁÄ>£ ¼ E–RmÌ£`˜†¥èǵ OÑ^w«IÞ$=@8>;€µ`Jì±¶XÀ.L@XQ"d¢Ù½—aÆ,è,’,˜amÃóÜÌ#ápØë%—Õ¬±±úShJl¸~˜ã±Ùyý¹³Ô0Ëߙں„h¬DKÍ Ž2áÅ”6¬sé4‘ wµÌ8k¨tnìFK”€¬ÁÞ±-EÛª‡x­­½`@ R‰0{&ë>ŽÞË&‹e¯„4† °VÐú‰ân›Im6Ðs‹!n˜“~5óx< ÙÙÙÊnl¸éè _$ -Éi£—5ÙŒ™‚)ðäXk³”¿s|äsÈ‘ZÄ•2*— ©Ç™0m¶˜À¿ºç¢BGRÜ"ê9z⬺Kê¦À1vU $ ÓŒšÈ-bP›Yþ8Ú†[ Ò)ÞS f‘z6< 1ŸÖÖ,99¹ºº:NÜ0_ºd·ÙˆQ©X{{WY"ÄîÆEb8Ebe F ì(Ó“Ð]öˆ;`©kÕ0WÕJ Áô*L]+Fm²¹öA9Å­ÇìÆ+ [["Îî´ƒ õBI’ŒÕÍfƒ¸Ñ¦Ɔ›@€±PuH”2Üö˜êÜËï â8s7±Û¤–…ü-øuj‰ê“¢QYdGF»Ã¬ÕÅÑÓðÜ"âD¦ôá]Zûp¼§èf•ÑMF]…<‰—qaÆêÊt*`l¸aÎêù¶Ê7¶Ðc^¸sràÿ¾mÿÇW­kÿo”égÈŽî±Î¶ÊÁºg‡ê£¨.À#©ÚÑX;ê1‹ËJþ÷ð¿®ÈÛ‹¹&¹/Ìš±^Ê™Ë×ÞÞnP Â_Š 7.—‹ÖNc <)N íg^¥åKÏMµm9ÜYêŸÏo³¥Úˆ AŒ÷>ŽÏêèžÂX+¡$Q+¨¸#r4%²Â€ :_BŠkŒ±«Téjiß)º¡Uˆýá¦&¯{ç8ãkaéËE]kµ,ššjP „ºÎVl¸q84n`mÍ~Ü«‹ß™å²`DIÞ®jyz~vLmŽßŽY, Ð2YL ‚æQ£Á\4B4,gÔ&àIò/]tž¯V¹¤ÑRÐ𑮎LÁÄÊC_)ÏØî¢…‚ñCÙÅdÆ 6,K¯­ŒÞ”dF3qÕa–¼±Ûí‘g#Š"êmņ·ÛMk§Ö ìüДYG-LŒ¶ÿk“÷®ÙáBxs+d,ñQâªÖ4o›QA\z5%‚æÑ†‚PîhAQ]ú7º«='©- ¬B;˜„•ñµÊí¨(`™ ʰÄÙ‡-ƒ‰ý™X*hL–…[lGÍó³/ëæ·šÚìN»ÐéS˜X€õe¨? L "ߨpÃ$”6±á&^ ždk÷‹|ܺø¼LêhÜd±,(,i fmVT^û¨J<,‹>†»º„8†dâèÏèo¶Ž2Fê¦ÚŒÊí¥k‰„’Gߥî]Ä(Ô” q7JºR¸5uˆ/¯mÛÇ%@03é“azÖMijŒÕ 5 8J¶Øp“™™yäÈ"±¶#lÓ›j¡¿a‡Œ±‚EömUâÛ:æMÕÛeXŸh娥‚‰å¿X…» º« BÑÈ9ä xÊ‹ P¥€-š”§AGó­ î Ê­h€Ð7ä<"•A« Ná»Lýbܽ%n"yÙD›™Æ.h’1s©uÙÿ5Àä)ý=»jÑœx‰ÆfV´6ˆ)N§ÓTÝ(ßxpSPP@?6È,­®#œ“Ìñqâ¸ìéÚVlòŠç>S·ë¾B3:Ö9\Œ¡ ËÕŠC‰ày8LÁ!Âóƒë(MIÉ?m AGƒŒÙ§N€pðßE1ˆô¹ôl@o‡~ C ð¡cL¤YæKÌ‚Åø(ÿÐæÃÁUÛ#1‘¶€8¼Øi¥%T£È·UìÑn¨n’““ù§ŒXkk«¶jMl¸)//ÿôÓOéô>éÎ͵©½‘ç¸âî½²E âÝ슉©¯}×5]ûµKŸYÅ ¬‚ìs1!Èìü¼‚h †‰ÂȘd=,×I/¢Œi,`dŽÆoŒ‰#¨„T6:@Uf¬Ñ* ÝÒ{£ªM-…` gœ+Z•€ï²Ý+BÛ¡"˜ˆkD ÷a”hD V*g•ÿù÷ZøoïlÇ;›¼+¯Ï³H óDö!áó öƒQP¶ hÑ–’’¢) Øp3}útæZÅnÛ7Š1{;yÔ‚Ø‘mtO—Û!xƒÒŽê`‹O|ó{ïù£“¸ýœÙ ´óG­”ô— ÈÆT+Æ1t‹RƒšÇl´ˆp‹0iÃ Ž„iE’è2…Ž ž›¸bú‘)¬+MÔ†Þa°FB2¨»¡wp5¤;YÆGÑfÇ& (|qd/6à,Iýçjøýò€üõí“í óp ²Y)[_ÉV7ÍÍÍÐã1¬1*Öâ;±áfÖ¬YÌô°6×1&ëÆêÒ¤A“‰þ©ô§¾Þ‰¯lßðZãðçÀ‡¶˜+ ð¡œÞ0&¾F,Ðpƒ)qŒiˆR] Ñ,È RdCPŸ±F–G°"§ê*âÑ–mèÇ‚~.É ¨a„2@Bî.-jÔA;¤3HË)º"R Ú6&(AðnŒ5€q‡ÞWÙj‹0Ë(‰{=jÐÄ9OÖÁŸ[e;–æN±XÓ*³ÆÈÛ½ÛétBgÊxÞ Ÿ|‚9•íØpc·Û¡4¢ÇÂ+ÛB­õëÀìŸÆ^‰iA5ñ©yY#¬Rbäé¤Gj¾»#¿W»^\ß0<#y%ÑÐQZÃcf¡1!0ÏB¸E†4‰Â/„¨BQåºÆxô]·Ñ%±m”)ªÒѰ¯ €üþj2¿²ÎyÚ±BBïÐ0"uÎ&‚5ÚÑ·I¬à»"À‹˜×@‘Ȱ–ÈÙ5¨G¶ß¾ÔøéލÐè—ãØZœ7 $†htÁªvÆ0xNNNR{Í h21/Þ¯_¿Í›7‰»›‚n»%»M ú¹ÑÈ‹f¬ÎÏ,Ø/ÇÙ§‡co]4ï Hc¨þá®ü‚L8¤hb ¦0AÃÚåÁHb ⤢ÚçËñ¡G‹l*fP‰ª7¤Ü#uP ýRšHˆžªÌƒŽ€à€ÖhÂ…ùÝEM‘MÂ;›1htdhý_˃×F±†Œné‚ü(“êÕO˜&.Ö N¨ˆü™%òÜòVÓ²ïõ%æŽHÚYJuÛˆz¬é+Â'šgos0ȇ¬ÉÏ7|¨H~£&º3nN9å7Ð÷p}´Ï{Zi2·Ó¢Æ¤qoW þí¼Ìy/Ô·û£×5Έ{«·ßW™bãÔo0…¨AÍC f¨…å%éeÙ.Ä!ˆƒFv ¯ ¡_"Rƒ5ƒŽBíŒÒi•©Y¬€S©Ü4:YèÐrŒ¬AO ð–h4ÈyŽr¤ zTçQ!ׄeÑjÿ߇-ÿüB÷*fñ¼³É»ô79Z ·µE¬ÊqãüëwM¬Ü  öîÝ›yH3lÚn̸ùŸÿùŸÅ‹Óé)Naù®ön€!bˆŽ­\Qà 2µ¿gL/×ç»ôg) z†ÝUýã=ùÙ8¦}žK ›ˆ£„/ÃÌ£ÕÓø´æCâÐ^•„¾!¤§Jm¶Ü8w€öñÅ>W°¾µxðëÆZ:Hf…–,³Ö°ÒMFÜMŽâ»&ÈôÖ*cÅ$Œ’‘žú¼í°•í8{g;†:‘² žg¡¶‹’çÃ}Œ‡0ív{eeå€X…uƒÎª€bÆ tØzôèQ__O¤o© üTø'È•÷ UFÔ ’ƒ3ëdÉozô»³ÊÜìËïª^±°ÇÈÞ.Ãñc ˜øG?ªu};¢N}QhY Öi85ëWÓ2ÜIzHx Íj9Z€èæý!1€‘„£ ¥ @à‚G#=A†(1²†ÛíyG ñb|«Š$b›ß˜_kza5Öá/Ÿ˜úšö½wÑEÈ_yö©ÍÁ¤å ˆbE+cˆ‚‚‚ôôtú½„‰¢Ø)Ü@›9s櫯¾J$6Ä¡9®/ú&÷òP ××ÌÞ® 5Q0%+ÉvûŒ´û?lA§:Bâœõxý=sÒ/›„(,hN =)åÚŒ&™¸TÑ0\ž’6HÇ2ql<[ Ëô$=-Ö6@kÔ'G²´{O¢èÙ¢Ÿ‰üËŠ φî"Ž•@'ò& %8kz]‚¡„!2å àŒ£Üš‘ÕÌZ á0(¿«ê`¦M÷ØjZß•év¬ð&!Õ²y§ÛûŸYïÏòºYÌ÷gæõz;‹›{î¹‡Æ 4§MX±«-‚@1E1ö¯=SÂh½šé ·ÍHê«¶º6ìIôÆñËšWïö?ÿÛ,cyBpÇÌÓ!ŽZØÕydF2²K¨íWn:z­=g Ë5@›4¥€~€ZJBv†ž¨Éï€B~(“8µñ(ƒ†rØô!αobÃâ¬e#Ö(½¢ If»ÆX!v8ØSuou˜Z@oÁ¸ä Alü‚SÌ“šÌ¤„eSîâsÑq ý*§#ŸÏfÉý¾!ÐÑÜ+õ;‰À…Öàh´ÿó% j4\´tŒ8D(ÍÆ  5  „„t*&kŒfª¬1¤IŒnq”¥2ðÌJ û¸íÿÕ(+/v¾ù}Ç‹òñxFOkÐ`⨩yö7™žTïÞ½!q\.æ‚^ºåææBg u¸âÁ ´k®¹æ¾ûî#E @êé- Çd Mg¹NdŸ78<6Wä|pNæmï6ÑOU4„ oª|óÚì)CäÙÓ¸—DÔÏu©çiF£0 ‡8º7D÷’T²h-‹¶ˆ-a4™XÐøãŒ™5NÔKЌФ1:(JN€PÝf‚†5j6V4¯3Öh=Tql×dÒ3SïhjÍ¢ÆÞ[³£ŠÑÉ“œ‘)õ/]Ò£W¦¯/mrs'eí"Õ^ñQ Ý ¯Ñ7uêTæ!ÔRRRˆ‘ò8qsï½÷>ôÐCôÒÅ»ƒ~׸pt­Vâ8X ×;×NJÝ_zêË6ºGø‚ÒùÿhÛÏõÞ¢ª†¶î%q‚8¬JÈÙ4OWÈ‚ÏúU3h×k$aTrð #h"v€ÚiÔ[†IíFI’îlÆaU' CÈìÑŒ/;}ˆ‡@±†1Õ×&†Ã[Ôˆ;&1,`U²·:4òž‘r €Ìš‰¥î9åI“ËÜ8p-ÃÜ%Û†íò‚Mþ°øõaÆ£R áp˜÷*;ÔÚÚÚ¦L™‚¦Ä‰h^xáË/¿L$6øÂ#óݯüÔvñ°T3µÂ89J¢Š¡wž›y°1ôÁ­q q¾Üá﹨ò½E9Ç÷v"ý“ôÑg‹8ÓvÞ€X‰#i‘c'€Q´Lšháat¢=]«¨ß!A½•Ú!A—ØË`_=šššÊËË™ME-777''‡HŒ76›mîܹ+W®ÌÊʪ««ÓÞx×ì“â+[TjÅÌi²,Ô£Ÿß”7ô¾ªÊfæ’c™óñOþü*_”qñ‰I ¿pDJ4Ä q9Ƥ ?RÝP¿„gÓZFpèÈ_›èYL‚5êa¢MA-šFÅ•%*;U³„gŽ5”CcP‘Z³ÐyÑRæg0b„´Aφ5»¥]swMekaNÙ\vá/çf>¿ºmõïó)G ¹È.ý¨À<ÊTCðèÙïA»’ N§vùÔÔT+ãß@žsL]Åh¯½öZRRý&ß:oø÷ŸÕž7(Å­ Qé]NõXd1–?G6aûÝ…cªÞ^ÅÖ8@†Îµ/7ݼ´ù³?æ -qacÀ"ŽÂÀ"ŽÀ_PXkýš<Ÿ­Ë Py : ö` ReG¤8cü;ú I*Ñ4cÞa )Fg ºˆë$±…rX Ñœ#¶Þáäa x©-d²FCI|¬‘ÛÁé©ÿf—Ñ: 57Ÿ’¶b“Wf uIyBˆêv+zÀ ¯aoSðãØûr%I EEEõõõãÆ3h³bP×Àœ¥¥¥Dz§pwûí·?ðÀDzP”†fºnù¬þñSr” `Än8³øãÞ…÷}ýmùsž®ût#Ž£„Î ÷ÔfÚ×ß›“ž‚D1 ˆ#°¼*º1$PÌP #tŸ|Ì„Ðc:¨Ü@•‹ BZ?D®ØÝÃõÉX¶0&‹V±D¥w&” a00€b6†QܬÑ#ÜÿnëôCsÚ…yc’ëÛÄw®Ê‰^ Z›Écø§F†{`BÎXv˜×ª3Î8C`¾·ôôôáÇÓé ´ûï¿ÿ¹çžC_”§Ø¦?Ô8ßW¦*tz„?Òd<Å9 °>ÿîÕ9W/m|õ[£WmAƒòµ÷MÕ' t¿ss–]{S-8tGâ­õK…x€Û‚„Q7¢¾:(SxNšhrHÛæ#ç\ò ÌÐzâ3fœX='!sp]ƒõN(‡Et3í= N°ðad>­™b¼ñÉæÀ9k`ºü¨9là¤2×À|ÇSÒð³ '5s”¬Eîüïƒk·1†áûöíëv»hÒt9–\QQqá…2®Ë´°©­Zµª¼¼\¢Ek@¼jeÍw—ôd9†kÐY=ÊæÑÓe•åÙøwkÈðS…jöómþâë«'ôw½~C¦Ë)°‰#¡_d1NH èŽ•ÖB\ËÏOanš\„†à¬¡ˆ&w€ªS°]‰ìö€Ð‚4.@½$q°]n(Ó,HÏa8VhWÔji )ŒG½IeMCË‘öÔ„ÆßYïšßÙ‚t{vŠí·RÏ*OÂ.Ÿà…á´æFì J÷¯e<µASYYyà 7˜6ZqqqAAºÌf ÀͰaàÄZ±b‘Þì SÁ}ß4þibVd_Â\ª8Ã4€9õ›/KÜrrú˜>î ž©k˜|º~iÕÏj9þ}kvr’îwðC¿H3¼t¤&úU£>^@Ò_“A –MD@¥GÈèÈ`kÐÌL"Æ¿i#ô‹žˆ%à^„)g˜RÝF*a…Éó<¼gÐéJ~¿`çÿ½1Ä cvå¤Ô囼ÏÌÏ¡,x.‘  x!` 6 èGqtÜ+˜¿Ñ½zõêÝ»wJJŠiû!e ˜Î9çöQÓòVìÝwß…MñzÉIAÛëKC­Š=Óû$éìàÌm!v£xa„£<“8“û»÷ý¹h܃ÕMaÞ£fÞ€´a°ðºê’lû×÷ô—ΡŠÉ‚¬H SæpòDê¡¡÷*Š;9'5ò­ß"é H^e7ºIˆšÈù Ñ{½YƒÛ,±20Vä2#Gý“U,˜ ¡‹‘¨!…¬LaEîy»íÑ÷Mb4š¥y„k'§}¶Ã·ãîB‡ö“@j™8\¹ÇŸÄÐ\°„>©ÙÕ¤VVVÖÔÔ4þ|+W … ÃÅSbp#† † B»T[‚½WµãòÞ™I6} G2 âX‹«´áGŒLÄüñ΂Ç?k}dekckª&n°íõá^××$¹„ÈWæ4 ýš>ŸÍ—9,-CA‡ÖÈÿ’kG>…k°îvmš~H@“è{g¸«UI)šh yˆ!Žò(ÃÓ> ÐPzÁªðÁ1`¤£¡Å+ùHÆ}Œ®Ë³yc’<,Íuüï¬2Xsê¬G.Qn¯x°è†7ÞÿÑG¬Ya`!¼ðyÇK_tägÚVÞÑ£w®?§ÆšÌѼ!cè~°;ÒÙù?õæHèà7 Ð4Ž0çÚD?Ò͉Õ$Î)´£ â`êI0]ÃU@ÌP`;V† a ­6êî7[`2JÛŒ!› T5‡·ÜU!¬a&¬fÅ©¹|ÑFH€çö1ã ÐÊËË3]hB±¢¢¢ŽŽŽñãÇäI$n }óÍ7YYYÐÓ#Òw7Ãû:mj¹bD:­eøD„SÀq¤è|>_}õäÀ)Õ¶úbèFPU6ŠÇÝRëv ·ÍIùý©Ñ@¯.aø2àáaKÐ!(“` @&ìàE”] =jIh”æ Œ£q›Dm`‡Ha¼eD⡜‰Œ@XÞ“¨Ñ…¿§ý¹~O5c䨨àmþã¬ô%kÛWÞ˜Wœig†°Ë4gˆ7’ç‚×. “^;TÝÁˆc÷ïßßëõΘ1Ãâùýþ¹sççI0n íܹ³°°0&/`_sð±ïš²=ös¥Ðhà #ºËü8q$–D@›äƒC \G.Z²®cáëVG 4ó¥{ßjƒn‡ðÈ¥i—NIR% .sÐH6á[3è .î@qƒ5ZY€ ÙÅÜA•.´Ò‘$²xMROCUNò €ÄhAR}L@ƒÈ=À¡h0 ©Ÿ÷hÓ–Š˜)£ØqÅÎêÖpy±ó§» íZÔs'$Y£¥cí8é°ø¼÷*׳^È ¥JEEÅ¢E‹,^T@ÉÉÉÅÅÅÆÙè¿}ÿý÷£FbçÖ/êr“í“" Œò‰ƒ `QÄ‘X^攩P`#iÁ¸”㓯\Ò¸âo{,n¶bþ´ðùø—䞺2cî87.aA+â)0è$ MD%æ` Ònš>r¢Ù¸`xÔÊ]”(kNÝå†r˜Î`ÅŒ!hУÖ…/þ[Óû㤠´aÅN§ Lä¹çŒ ”¬Á؇5Œ=(n57}Z»|7ÃLOO‡ÊUW]¥½lרJJJ:d…M‰Ç ´áÇ/[¶ìœsΡªŽ´….|¯ê?ç•繸ÄÑŸTÂך¢_l° ¬’¨ Ï,Èúۙз:Ô®·ÐAÍ~óDÓož)áùk3frc¾°  sDå [ìPB&†`Ö7‰OCPkâÁBïÔø')U hncôÐpÑŠ E] 'ÊcÊ1Z|uø’¿5ÿp †‘&Ú†÷tN,uÿt$ø¯k{¸[œ(!2ÄîÁë…ÿ·®ñŸ?4ÓíTsÉ%—deeY¹.§ÓÙÜÜ ó›.“º7Р÷ä“O^wÝu4q|áSÞ8üÝ¥½z¦ÛˆCÄe‘Ð/ƒ8¨"$q™•ä«o˃߀3ž¨sØ„Êæý+ÕÚ}Ҽőp•Ón›zó™)‘•Ш~Q/0ƒ5zºÞIPNš…‡­* —"•A?þœ ¯”d!vˆXC9ÅÊ1ÍÖC¡yi:Pç·B3šùã“ÿúqÛÂé©Åv lR3”ÐÌÃ=X:ÌÿÔ¦¦{¾!_¦äEˆÓÒÒfΜiúæoÍ ÛU^^}+™» 7@^`´ªªêÞ{掠ÄÑ/\· gŸL‡å8 B¿\ hNÍ,µ ÇzÀÐ"çÞ?îª ùDt”j[ãQ:ŠÃà·ÚàŸÇ) ïëx^y6:X õbŒ‚5HϯKÅ ŽèÑó°„Ô=dŠ$³ÂJ¿(‰¤»G ¼2€;FŽh¤¬šA…—>õþiik«7ŽË&mDOç´Áž÷~ðÎ>.éšI©ÜX à“Ââ(A?–ÿýÇÆ¦ßN.4ä%e ÇWVVfñ ””4räH‹ù»7@~gCccãã?N‚Ä™ðjÅÎ)^Àòª¬…~y@Á™E…rXžWÿ<Ƕ{ jÚçÿ­®ºY´2-ÐÀ|AiÝÎàq7F>T—CøÍtϧ¹@ $GÚo´v„Z;Gà ‡b©ayO †:IÚ$íÄì£ WŽÖ>ˆ†”á†r°šE ¼õµïÎ¥m•úÐQƒŠfp¡s_]èæ“Sï9#]n€™¤Á(”ÄÈQ¸÷›†×1žŠ‚¬éÛ·/ÄÇqÇgñûõëW[[»páB‹ùAWãÚßÿþwèÝ=öØc´WÕèÏ|çÈ˧LéMEŽc ý22hÃC¬G™PÇJÕјK^Š}ýùíiî“u[c2çY $=ó‘þÁm‡œ=ÞóèïÒÒSÔï„ò£&ó` .y0J­‘r Ý[®’@‚‡ÀQ“8§ÖŽš:Vƒ gåðB9úv($¼ü‰÷þ7Ûâ ÛXy‰37ÍåíeºíÚ®f±À(†Ð2q.áºU5/lfL†¬)))4h•UAËËË«¬¬¼îºë,æW¬ËqíÑGÍÏÏ¿ýöÛiâÔt„/ÿ°ú¡É9êè8Ž˜B¿T(‡Š.£s|¢ƒ(*¥8…•7ç†D銗Wmõ7uNé  ƒ7¿öÁ?ùŒÁôr×߯J-ʶí÷›Ç ;„k€„u6"ÐC×@æB×5‰ÚÀ™ˆw*”ù¿?(=ñ¾wñò޶D8J´ÍîÙS>¡Ôõð¹™zÔÔœ#f”•Jx#âkÎzçÈGû±E³ƒj ;;{üøñC† ±x¥ÉÉÉííí¿ýío-Î6Ö¬;píÖ[o-((¸ì²Ëèç·…nÿ²®Î¾êøt1…~u‡‚©‘…-Jæ€èÛ ¼xY6Üû|‡ÿ7/4ÀÖg$[1x'>Þ|MDÙÚm ?Óö›éIל–”–‚t~‚ÆÁA1}´ª$8&F•f˜Å.Ì$‹vˆ"©‰(OÊ0”Ön>ü¯Ž/¶bfeÝŽ+qŽ/uýçGߢSÒÆöu1a#€ëBË´/&Œ}åàæZÆÊÙfΜ =)‹× ñäv»çÎK/EljÝ„ ­AÁ6cÆ m>ŽËa/Iµík j ÝñUýÖúÀßN–/'K¬¡_n¤†¦’Öɹy˜š2нÿ¡BHºýíæ÷ð5{E¯Ùº±ZXGÄ?/k‡JŠÛ)L>ÎyûyÉ#ËœÑL±k˜ô; 9Úÿ‰ƒÕc6…GËÏ’9ìhŽ5Ĩ ¿¸Ò÷ھꦻH´e$Ùþ0+õÙ/Û§rß5'}ñù™‘fS{Ù3É~žØC˃àW«çÓû}a¸o‹ü¦ ¢ºÆDfff(ºð ‰·At» š:u*ñŠ‹Ö}¸6mÚ´~øaøðáŽðg¯º(t{P|c{ëÚ#¾o..¶Ã»BN½1‹Ô0+MI€+sŒó `r;„Ç.È|ìðã‘ÀEO7ÀoÛ‡:5ÃØ ò_¹!ÿ´”¬Taêp×Â3“G”:¨` [Ô0BÅ(AhCãÄÀ`%Î6•-–‰‘RÝ >¿ÒûæWþýÕ]&](ƒßÍëNNmn¿Ý˜5,éÆéiÑæbÄ€À‚¨¡óX‚™³º-\úìþ°úíˆl¨¤¤$د»îºŒ ä%”Æ×.‡xFŒaeM?¦u+n  :´ªªŠ‰Æf¿øS¿äû¿¿´WQšõDuL¡_ö3Ühá[˜älåE®-÷@2=õYûƒ´¦' ë»ãëÞØ&ýëk?üSv!xÖÛqÚ÷%'{ò³Ôp3N ø¡b¤öxBœ¤ž–W_æ |i÷Ißl ¼ý•ÿ³Ý \˜6e{xOç«k:æ;.=AYÐjíÿˆÌ!Á’9ür"ügþ¸äùã“aò¿ô-|µÉå*ºOÞ3 Ê-Bðï¥àÙm #Å–•&äfÙö^¹¶>¶þÅŽÂl[fª™bsØ;Û€`@£©M‚GêÃ{+Ń5áCubM“X×,Õµˆ¾DÇ¿hðCuœ~¾[ÿ>?sê w´“ó¤ çò`Ù€EñE ÒÒÉÁšÒg÷U·3¾½zõ*,,œ4i’õ»át:333'Nœhq% ;:¸QlÉ’%§Ÿ~:„N(D>óVÓ~bcÓ²mß]Ò3Å%°+<ЫJZæàΗ1M Þ$X1€­qZ¹ç´òÈìoøc¹ã° í>q_ÝQFmð åCC+ØsîÅÿÀá¯ÌFôvž7&iÅFDám§¥ì­®L÷mcЖZ1òžøÂ‡UŠB¨ Uþ_«` C%F3eÊ”>}úX¼!@󆸙={6ä”õR<;š¸6oÞ¼O<±¬¬Ìï÷‡¼!ispÀ³þ9#ovÿdÚ9bøD¨„²ßÄ“04Mh5ÈehȘšS£˜\Ý ¥®õwæÁM¿(½ðeÇ£¶fØ÷×…8…ç˜%Ä 2l—ž”üӡЦÁËNL¹dBòÂéÊû¦Ù> z#©‚$2@:6f’W“¨Z¾›í@ 8ððáÃ×^{-Ä3j/ÐÛò+z}>ßüùó->ejG7@~z½½½ý¸ãŽÛ¶m}´Á¾nUÍ?p¯8»P°1â»Ün<Úìûí¤”NIMu"Ã^ètA΃WM–ë„å¤!b)llEÔ€&ŸÔ^Î7jذaðçü–[náÝÂÖ‚P__¿hÑ¢ôôt‹MíèãÈÏ¡nݺõÙgŸ…ôe:V«t<¹ïóy%ƒs–d!a hB¨!Õá’…œ/øó–ÑáŽØ‰B*Óc»ûÌô»ÎŠ|x‡Â}ÔöúÚŽô$[M‹4{WÄ1ë¤yœÂØR—Ã6^8>é¦SS 2ìJtbOÎp˜ÂˆÑ0s²Ô¬‰šû×4<Àz9gÖÀáoy¬C׃ ª©©¹æšk˜¯‹ŠÛ~¸QìŠ+®¸à‚ zöìÙÒÂx¬£% N{ãÐe©ÏœšËÆ6’0ì… XjèlbÇtМhXw¦¢Õ6w õÌ´?:/ãÑ #î4ô´¿Üéöóö/¶JóìÕ-âá£iþXY¾cÊ`w³W\µÅ?}ˆûòÉ)ú»"ôuä¹”ALΰ"4øÂt Ô °.|ÈZRÙ3û`×`Þˆ(O®ºê*èqo§ ¤ŒÅ·/Äd?#Üy±ææfÈT¨tèÅ›üâ’ŸZVìn[vfáIÊz€¤–!$ 5­Îåø24h„XdrD_;BûZèÕ2òãÜQ‹˜<Ð ÿ”Ë Šâо¾èØUÕ×ÕÔ!~»'<ÆCs;„™ÃÝ£û:«šÅ·¾õ)v^>9ù´ò$»6IâxF€O^Ø<”c†$Z¤˜ðˆÊ/ 7¬ªyŽõ¼%MÈÍÍ…¿ÜÌ7ç¤L~~~ii©õg5c«¿+*í¤=õÔSÐc>|¸ÏÇÄmö‹ç,¯ì™æøê¢’deÐ ¨qbÀò­8Æ(îËŒã|a‰=3°È€qMIvÚlçŒJ†Ñ£Ø^z£ï½¾ýµá’lû‘Æ8—ü5YŸ\ûÈ>N¬Ù‘„³÷œ9ÒSšY>éÁsõ©1¸»„¡Äe.¬‡rCª° K yO’ðCµâÒ žÿ=tèÐýû÷Ÿ{î¹Ö§ +–““{ÜìÙ³­¯­«ýqäe{¼^/t¯^zé%:šÓ·Ö<{à¦Ñ™·ŒÍäúV€;3˜„Žq„ðƒ5@b@厒ŸÉ€pM+…ô pƒòƒf:o™•¦}[ÚÄÿüè‡ úr»¿4ß‘“fó¥Cõáý?¿A÷ÎÔ}¥yŽa=Ù)¶@XÚUÚv$4u°Âef¹;#Y–.”7$ýÍpdX¤LÜ¡‹ Aq‰„7RžSsü˘ïºò[å233¡®9ï¼ó˜ ¬¼¼üÀ×_½õyÆqØÏ7ŠA—ê‘G)++ƒ.(}´ÞþÓêú‡Ö5~rAqy¾‹©eŒgsc:¼œqk€„*]¡\#Jzô ÙÉöù'$ÍŸ€½? ~·U×ï ¬Û\¿'XÕZìÌKB"¨j·A$Y¸ëÝmI.ax/çGz’Ðá—¶m<ŒÌå-uŽ+uîëTä°!¢Dï~HÏ4A Ú±‰£DÙ΄r8ôIhäl‹>«}zcuaÅ ¨©««»ôÒK]./Ól6[¿~ý`©›nº)¦‚qØÏ7@­Ã›øæ›o.X° `©(ËžŸnËNÒ“#‹BÁÌ^¿Ó½A©Å+5wˆmbc»h BW¨O®£OŽ]Þ°Ãâ,‡À¬ZR.€L¤øBÝ1¸!ŽÆÊ<9Ãrˆ˜™™99 Yº­õò«y¿ÅÅÅÍÍÍ£F‚Ôàdáô›Z[[§M›VXXkÙ8ìçŽÅÎ?ÿ|¨g̘ñå—_ÒÐ ˆRuGøø—öJw|r~IF’ÀÀŠqÜ—!fNçKt°ë'Lô`ÔB8kR3Ë×'ôÌrÀ¿IiÑSHȶn’”7üAÐÔ!B}ä D&Iò³ÑéI¶dWdŒú5—àq‚Ìdj9~ 9±º¢‘¡¦“×My© Áð¨%Êðä;”ƒRƒ‘È Z•(¬¯ôM{ópHdß8ÇÓ³gÏäää+®¸‚™ÁØìõz¯¼òJA >ø®±_n@Ä>þøãC‡9²¶¶–ÎЪ ônÿ¸BÏÛgFf>ZIFˆ‰! úE ¾ NSçƒ5DAº,qR€e#í•Þ-öÊÄzm‘-6`j¦Çžé‘wzpêAÍ „­qÇ:<²Šz¢a6ºÂ£ʱ IØÓ½ä 3sv‡ãŽ;îðáÃsçε2Q˜0è4Øíö¡²ÅZ¶3ö‹Áb%%%555›7o7n3Bggc ão{攥,9½Àé ´ œ/ ‹ ÖXpšâÖ ɲjý¤h%LQ#)kɰº. ¢#ᦾ°“{^¾Ìa”¢1ôK åHÈ!®ÓîÆà¸W+:‚\rCURQQ1eÊ”ììl^1b,Q—F…™ö Ãbë~øáYg…>l•—‘RÓÜ~°%2’µ|w{Ñ?ö îázÿœ¢tÀœbÓmÁ‰„ ³81'X£Q MDÌ9ÃÝf¦b‡ À–9d,˜"2†²äd™ÊŒ>¬ ¡ëTå›þæaƒ)æeeeGŽ9á„.¸à^ËËËóù|ƒ š3gNÅ;o¿HÜ(6sæLxïžyæ™o¼rº¹¹²ÍÐáç×ûŸûò’í«Î/陡’‰X ¬ÈDžDkоm)Xƒv'ÚW2‹Ôð|í–å Ö£c,`dµAµÍaÉÄPB†[°I<¦Ä¬A¹CkòJ–?% GIÁ¢H0Ü¥D´*Àê‚-fE²)Ó©¤Y'.#Vª2ˆ¶Åv¸(7Ê$ZlèIu:”ÃÌ#4ûÄ—Vìn2ZîºÿþãLJÙ LY8¢oß¾óæÍ‹¯†ÄÚ¯7Š] ÛªU«N?ýtæ$ /£sßš†GÖ7§:>8§¨·òÖ`ÍÒ¾6[°àñó`áØ611 8!µ`ÉoÔ5Hj“ 2wÒ$í„f§à9PZA 2'Á¡œxfå°ŠËù—nm½reµÁ‚ 6lÿþýÓ§Oûy‚äää¼¼¼´´´³Ï>;¾ºÂ~U¸Qìä“O†^Õ7ß|3sæL¯×K?dkOSpÐ󠨹kBGgÊÑ]° «N“¨Ã…¬¡©Alj.|hx©gQã×f-€Ð2–@³¨wxd\™Ã˜øwB9h6,:Ó§½~hKûWP±¤¤$EÑÀïp¬O©ÏJ¨ a.hbym&YÖšÅ/MìðÊ&|âA :I(ƒPŽeÞßÛ~ÉU¼öƒ€tx2‡q"–ãÄ?\È ˆ“SÞÞPí;ã_• >“Gó !kÒÓÓçÌ™ëC•¨)Ц¢¢bÁ‚?gÐ(ö_ÅÆÈ?•eË–mÚ´ ¢þ0#;@î¼µ³ þ¹ìÂÅCÒžœ“‚q‡!d¸AÙè&rʤ>Àîü£ÅtAFf5—v1ÜsÅâaE;Ê–9 Š¢j6ö³ „ qF¹àwU¾sWT2_·‚šÇã8pà®]»&OžÜÉ÷¨8Î~ýúµ´´Ìœ9óçé:Ñö_„Å pÇwTUU5Êçó}öÙgk×®å9YÐaé…Í-ðÏmÆz^˜™_’.¿„ Ò¿‹Š«…JXœÔ°/7'T¬fbƒFÝ2§ŒZ‰(WÏjX0&Ó«2kšŸç@ñ¢9ŒÄN‡rH]Cø\Â[;[¯^YÛÎà@1¨Aàj¨²'NœØÉG"322²²² &:÷Üs»–pWÛ/©­ ´‚‚‚Ûo¿½¹¹~l§žzj[[Ûûï¿¿sçNž“Í–¾:äíÿÜ~¨wr“íÿ7«`B‰GÏl”ĬaˆÚËx¢Ñð:6úUל,ê]btç7ÉÉŸøÇv¬2ñ/dä]Q·}Q÷Ô¦&+ëÙCÊÔÔÔ”••Á¯Yçljúôéãõz{÷î M·=Æ@û/ÅbðWâÆo„.ÕÊ•+SSS¡ÆÒôí·ß®««ko'_ƒ«Ô;‡[CÓß<”ä ƒîŸ}˘¬ÈèfCN†èQs›k8Šf4ŽÑDU’¤oórvµi41n€qœ˜Ía@Ít⟉cww5/þ js­¥3C þ˜¥¥¥Í™3'%%ż€¡Aq4dÈýû÷Oš4©oß¾¬í(Ú5nƒŸåLÙŽ9òÊ+¯\~ùåáp¸µµõßÿþ·2‚Îô³r’ìuÞˆ£~ßšøç´ ù)ö¿OÏÕ7Ev¯,£°‚5±FjŒ£ÅjAIB"2G…2´™> :Ìh+?k⟉cu+üiYôYíË?µ„oÉY®ŒÑøEêß¿?ôÓ¡™1cFç)ä‡*ív;ÔàgœqFg"Ê?;†ÝŠŠŠn½õVÈèXmÛ¶Myè6 }ñÅëÖ­ƒÐÑ^÷¿u^,Æ¥C­¡³ß­„ÛN»0&ßýÌ©ù¥YNùAóÑnó'0MDå' Ê 1úaG­KFã™±ë„æ±èCYá `«eè(ÝóMï…*5ð  ½)$99z7?~üĉá!þ5X5XIyyùŽ;¦M›ë+¢~Îv 7¤ÁOzŽl‡^¶lt•§ËýðÃ~ø!o¦²fÁ°ôÍß°Àm‡M]à~dr.üWî–("0ÁÔ¨ûF®SCàTµtš6Fý1Ê(‰Ú`f çÚ~4Ç‚c+ KÒ#ß6þõ»¦fbƒ¬ñx<>ŸºKP'p‘ª²²²ÆÆÆâââSO=õÌ3ÏLTµ?;†®Á\Y,zûöíË—/‡ˆ.LihhXµjÕž={à×Î=!QZ{ÄwÒkp:\лc|ö¥ÃÒÑŸ@kôT·áM,&ªR̸Ñc€-ÖÀ3¶±X0ö‰LùìJÖ›Uí¡›>­û`o[ÈòKt búöí[QQѯ_?ø ÷s´Àß9§Ó9{öìVûs³c¸1·A²Á èR}úé§1ÙÙÙÚº!»wï^¹re[[T=¼ÑtÅ ÃUÙºþ“ødúœT’ôÇñY‹“ÔŸf h>ƒ° b×­‹Â:zµV‡ÃM&þq£9̩Ƒ¸þ#ëŸû±Ùtv j6›­´´´¥¥ÅápœrÊ)}úô±^ÖÔrrr233›šš éžÅÉ®ÃM 6N6(g t6lØ7 zÊd²À^¿~ý—_~ £à·Ó=@¦Ï§;àŸ² Ý®a9®[ÇfY–b· Q pBÂLÐYئù7èÖ!pÔ$­!NÍ ÙÃÁ)9½Þ¾wMò­¾ØÞ¨ FźººOγÊR¯‘Þ3Mž3¦,Áeõu ²už2Z:QÃÈTäÜÍ+ö´¿¸¹åÛJoüÈŠ§§§8p _¿~1‰Eü@²À¡TVVBÖÀŸ¨ÔÔÔžâgÇp“ëÛ·¯WnhhX¶lYUU:VZRR¢-§õÎ?þ}±ææføûi0Ÿ0ØÝÂØÓ|qKË£ß5jéA6Aè•æ_ä™Û? "(‹"tÐÄ8Bdú ƒIUñúhtö7—nkýì ÷§z““,IÁøak¦)+NUWWgee1bذa]ô6è+åççC… ½ï©S§þ²5è:;vlÙÙÙW]uˆÌ©“¶lÙòñÇCè@É£eðx¨}˜‹Ÿj–™’ÔÐŽ½ñöB(Ð÷6÷ʓȯ &Ãe+Ju”e:Gä¹''-ô$¡/­$ø¢Ï«IÀ#š<úìk~Yáý¾Ú¿µÞ %Tç óÞ©Ä4Ÿ…' J ¦²ºìÓ§ä  w‘4s:ðWþÒœ|òɹ¹¹çž{nëjÇpÓU¦¼x Üöûý_ýõ·ß~ %Š Oó!Þ.{wìØTWW—’’ó£Ory­Ûʦ¬›üb“?°µ>}˜Š+/ç¶ ‚¬¡€ò²nøoP”œ6! DDbÞ ¢¼$øIꦈ<ôLÑUÓགâEExaW(›²Xo×™ò‚m%B7mÚ´N>äý«·c¸éƒ?³Ód²·õÕW_mݺþ2=©|Ù&Mš¤¥@½³{÷n…Að›­¼-¨¥¥¥Z®80¢>ÊvÔÃËŽC ™‘‘…¡" ¡fdݾ{ÖÊ„ˆ*& Áò„N3fÌ1_É¢»MÝm°«(³–ÇY¿~ýÚµk¡Æè¿ÌÌ"° –H‡_÷ƒVTTÀ^×ÜÜœžžðia£_¨ÁÒ£G´´4Ø·ÛÚÚêëë333{Éý£î ”NEEEPoBºMœ8î—ø@öQ·c¸9šæñxN’ ȱ(^V¯^­„­ `eË6bÄúô2`ߨ­­­“­¦¦V›,ìÉÊó_PÿCOÍÊ }¢ rö[xÕ‹Š"€Í€W  ˆ˜\ÙrrrŽî²Þð#èÓ§l$¤9t‘&L˜›tÛóë°c¸ù¹üµD% äÅ–-[6lØØadz8|®ìÏE²YÉ UÔV°Ïó@y½^Å˃m˦,?uãPp»±±¶YÙÛ°vÙàÙá.LL‘ Še£ë´7H–’’xiÕÕÕÐ5;þøã{÷î}´õk³c¸ù™ì±#eSv!víÚµqãÆýû÷ÃÞ q¡À,¨L÷ˆé\i²ýÊæž±d  ƒ ÛÔÔT^^oõ1ýÒÕv 7¿ ƒDP†Z´Ø‘”øñÎ;a¿‚šB Ù(£éG±©?ÓX]Hè Á{J¸ #x'¡ô;éf;†›_ªAÄ ‘ M¬­­Ý»w/dPee%ô §»ô’bÕ;¿Pƒ÷$;;;)) zÊ4(a YÊÊÊ`âÑnÝ1;†›_—)qÖqãÆé8Ê0–ò ¯Ä\ Œ êŠa,(%xm1%äñx€ÚøP(TRRÒ»wïž={BÁrlLúçlÇ>›ÿ ƒs(]1¨}šššêëë•‘,¸ý2EAQàt:aVƳSVùñù|PDÄÁ§lwÙ`ÍJVköûý#ðÔ‹YYY=zôÈÉÉQ†«Ž‰”_´ÃÍ1‹D—³dëäbÊЕ6ž¥,£©Ä•”µ£ÓÜcö‹µc¸9f 3ÅÇQþ=fÇŒ¶ÿòŽÞÖ~ŽÄyIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/arrow-end.png0000644000175000017500000002150212412506713021060 0ustar sergiosergio‰PNG  IHDR<<:üÙrÓiCCPICC Profilex­XgTͶ­î‰ 3䇌äœsŽ’£ aˆ’“‰‚( "Q%ª "**     ‚Š€ ¢Hø¿µî½?ÞýóÖ«µº{wÕ™š®Þg¦ö>°Jx…‡Ãt„„FGÚë‘]\ɸI@ Ѐ p¢%*\×ÚÚü×¶6 ýÁÉý¹þkØÿ>@ïãE²F†½}¢(!nB°%<2ÁŸ,Ž``¦Hä̵ýÿÁ2ûØûlð7ÆÞV‰qOôòŠô€àƒô“Rü‘y`B}C +A°%À g™@b$BBÂÌŠF°¨÷ÌãÿØËËû_szyùÿ ÿ³ä“ÈF…{Åÿ½ùÿ<…Ç ïëoÛëDßP;äÊ€\@„`äˆd`Ü퇬ý°ðøÈ@ÿ€h².Â’¯Ù4”"%A–“‘•ûœïǰbû—Kˆeðß}”%TùÀõý»/YX½¼½ÿó:Ò‘yôŸùö_#À E²‰ð $Pê@3`ì 8 ( „ O AÈ9à(A9¨5à&¸î‡à)è}`¼“`Ì‚E° ÖÀA8ˆ1Bì/$‰Cr ¤B-äyBþP(%BéP”]„®BµÐmè>ôz½‚Þ@3Ðô Ú„Q0f‚¹aaXVuasØv‡ýá8΀ÏÂ%p|nŸÂ}ðkx^„WQEbAñ¡$Q*(}”Ê凊D%£²QŨ Ô-Tª5‚šF-¡þ ±hF4-‰VG› Ðt:}}]ƒnAw¡GÐ3èeô.†„áˆcÔ0¦gŒ?&“‰)ÆTaš1Ï0¯1³˜5,Ë‚Á*cM°.Ø#ØcØÓØKØìì+ì'ì*‡cljã4qV8/\4.ww÷7Œ›Åmà©ñ¼x9¼ÞŠ?Ž/Æ×áÛñÃø9ü••••U4)4¥4-4Ã4ßi©h…huiÓ&ÐÓÞ¥¤]¢£¢¦Ó§ó¢K¦+¥»O7N·JÏH/KoEBš¾Žþ9ý<ŽA˜ÁÁ‡!ƒ¡’¡“á#ŠQ€QŸ‘˜Îxñã,–I„É”éSÓM¦¦efffGæ8æRæGÌÓ,(aS–`–\–;,c,›¬Ü¬º¬¾¬Y¬·X‡Y×Ù8ÙtØ|Ù²ÙØ^³m²“Ù ÙƒØóØï±¿ã@sˆqØpÄr\æxƱÄÉÄ©ÎIáÌæ¼Ãù– æã²å:ÆUÉÕϵÊÍÃmÌÎ}»“{‰‡…G‡çO!O;Ï/#¯o o!ïcÞ¯df².9˜\Bî"/óqñ™ðÅð]åàÛâáwà?ÎßÀÿN€  "à'P(Ð!°,È+h)˜(X/øVˆJHE(@è¼Pк°ˆ°“ðIá{Âó"l"¦" "õ"S¢$QmÑÑ ÑÑØ*‚\:0$‹)Šˆ•Š ŠÃâJââ—Ä_I`$T%B%*$Æ%‰’º’G%ë%g¤X¤,¤ŽKÝ“ú.-(í*'Ý#½+£(,sMfR–AÖLö¸l›ì/919Š\©Ü¨E¾Uþ§‚¸‚¯Âe… EFEKÅ“ŠŠ;JÊJ‘J·””•=•Ë”ÇU˜T¬UN«ôªbTõTSTªþQSR‹V»£öC]R=H½N}^CDÃWãšÆ'M~M/Í«šÓZd-O­+ZÓÚ|Ú^ÚÚut|tªtætèѽ¡û]OF/R¯Yo]_M?Iÿ‰ÊÀØ Û`ÀÁÐÁð¢á{#~#£z£ecEãcÆOL0&æ&y&ã¦Ü¦ÓZÓe3e³$³.s¢¹ùEób‘m–°¥™eåÔA¡ƒ¡ïY+S««wÖ"ÖÖl°6Ö6¥6_lemm{ìí<ìêìÖìõìsí'Db:iÝk× œò¦¥“œû\8\]Z]q®Ž®U®«‡ šuStËtsqs~˜ãpðáG´^w=1žNžužÛ^V^^«Þ¦ÞeÞË}ÊyÊ¢ŽO¡Ï‚¯¦o¾ïœŸ¦_¾ß¼¿¦ÿB€v@qÀR ~àÅÀŸGLŽ”Y² ªÚ v nÁ‡x†Üe í ã ‹ {.ž>¡Q±iYE¹GµF3!›kŒh̉˜™£ZGKnÄ:ÆÞ£ ë‹ÏŠŸK0J¸~ }Œr¬#‘/1-q&I7éj2”ìÜ‘"’‘2›jœZ“FH J{y\æxþñßéNémÜ©ŸNŸ¨Ï¤ÉŒÌ?©~²üúTà©,ù¬ Y»Ù>Ù/rdrŠs¶OSN¿8#{¦äÌÞY¿³¹J¹—ÏaÏ…žËÓΫɧÏOÈÿT`YÐRH.Ì.ü]äQô¼X¡¸ü<á|Ìùé‹’Ö ‚Î]ؾpñu©^iCWYVÙú%ŸK×u.ß*ç.Ï)ß¼xeâªñÕ– áŠâJlåÑÊ/ׯõ\W¹^[ÅQ•SµSZ=]c[ÓU«\[[ÇU—[×ÇÔ/Üp»1tÓàfë-É[WXrAcLã×Ûž·Çî˜ß鸫r÷V“PSY3csv Ôß²|/àÞt«Kë«ûf÷;ÚÔÛšH=¨~È÷°ôó£ÜvB{FûÞã„Ç«OŸ,=õú©Ã£c²Ó¹s´Ë¦kà™ù³Þn£îÎݞǽš½Ÿ«=¿ÿBåŽ>¥¾–~Åþæ—Š/›”Z•[‡T‡Ú^i¼jÖ~:b0Ò=j:Ú÷úàëWccãnãÓ>óo‚ßü|{ôíÖdêf*ûÝ»â÷\ï+>øÐ0­4ýhÆ`¦ÿ£ÝÇÉO”O‹Ÿ£>oÏf|!})žã«—›¸`´0ôõÐ×ÙÅðÅ­¥Ìoôßʾ‹~oú¡ó£ÙyyögäϽ_§WØWª+üîXµ^}¿²¶µž½Á¾QóGåOÏ¦ÓæÜVì6n»dçÀNÛ®ùîÔ^ÈÞ^¸W¤×_-€BΰŸ¿ª ¹À8„h1š4ÙßPˆ¤ÿ*v "@+²§;A 0 |ʼnz€ŽÀ¨aiqÔx.*sB6õéÍgºteÆ%æÖ8vCNW'O™“¯A@Z°Z˜(â!Zzà•8ZB^ò°Ô9é.™M9)yo…ÅgJk*ªnjYê-óZ,Úº:ÁºEzíú †ŒFZÆ“3¦Ífæs³–s¬æ¬¿Ú,Û®Úm:Gœ3“ ›+ß!a7qw©ÃR’ž’^bÞB^v_z?‚?ð_ X\<2ô!ømÈxèë°Ñðሱȩ¨™è…˜ÕX8Ž6žœ Ì4Ñ;)!¹ ¥1µ3íÅñÁôÑŒ·'f2çNþ8µžµ›ƒ9M{†õ,9WüœRž^¾Es¡OQTqêù³%eê/Þ/}Y6}éO9óù«ö1•e׺¯ÿªæ¯±©=^×T¿p“÷–}CVã“ÛëwśܛSZŠî5´ößÿÔ¶óõ‘L»Ùc¿'éOË;îwŽu­t3ôH÷Z=}‘ÝWÝÿìå—AüÐ+aÇ‘Ñã¯óÇÊÇoL4¿yð¶c²gª÷]ßû—†¦GfÞ|œù´ðùãlÛ—¬9‡yžù/ õ_ƒÅ–Ê¿Ù~Goüáüco¹ü§öÏ©_±+ô+5¿µ­®n¯å®ó­7nho üqÿ³´¿…Û:¿-²Ýºc¾3½³‡ßKßÛCøG#zVØ"*°b‚< {0œ‡bBÕ¡mm4Å ã×rÔ§ˆ»4‰t4ôƒ˜É,ØJ9 8¸Óx9‰oÉ?¡ áó"¢ušÄ:ÄG%楀4£Œ¨¬žœƒ|„ÂÅJ¥GÊoUVԈꂪšVZþÚ):º×õÚô_Lµ_5É6 7s27°²d=ˆ:øÃjҺצٶҮÐ>Ã!ÆÑ×ÉÑÙÄEÝUꟳ;µûÞáYgž×½2¼½)Z>œ>¾ã~Íþ…G]h “‚ÿ„| ëïŒhl‹ºÝsûè•Øœ¸¸øÀ—c‰šIòÉ¢)\©Li„ãðñ­ô•Œ¥3'N¾:Õ“Õž}7§ætÅ™ú³s_œ›Ê[.@rÉ[œ*ɹpûâÛ2ì%¥ËAåׯ|¬¨ ¼Öt}§Ú°&¢öT]eý“7Wè%n›ß ¾{®©¥yê¦Uö¾g۹ݷÛe¬¸òt¼c·‹ç™v·gOFoíó?û¹_ „^†F”GÃ^׌}žxãû¶zrrêç»ÍÐ4v†ð‘æé3q–ðýegnu~qáý×áÅÎ¥–oUßK~d-Çý4ÿÿjY úÍ÷{bõÌšÞÚ’~¸þ ofoénmlßÞ Ü%ïŽï…ýåF+’& œ/ ,t*GÔy¼€ŠG³¡_b ±Q¸|"Ua’(NÊ£Y§  ŸdÔgªd^eUg c/â¨æ¬àÊåŽâ±ãU"3’ð òß8'-d'¬ Â,²":~ U¬HhœÕTלÓ*ÐÖÖžÕ9­+¯ûF/E_P¿× ÔɰÍÈË˜ÊøŽ‰»)É´Û,ÓÜ‚d1`yæ …ÞªÓ:ÙFÉæ§m½¯=¢JœXœ&œ/¹øºJºþ9Ôå–ínà¾}¸Å#ÂSÂó«W­wE”²àSïâ'í÷Ë¿9 !P-pûH{Pr°vðNÈÃЄ0•°õðÖˆc‘:Q¸¨Áè’Ÿ£ò±èر¸úø´çcr‰¤Ä…¤žäë)™©”4ƒãBéØô¥ŒñO3N^9•Ÿ••‘“v:íLÚٌܓçróòò/\)¬,ª*®;·dôÂïRæ2¥K®—Sʯ]鹺RÉuÍèzlUMõx-©Î°>ùFÛÍ? êI·ßÅ7Ù7W¶¬µZßox@ÿ0áÑÂc·'£¶#Ϻßõz=_ê‹~ NѾ*}ß–¾›Ñü¥Õ½mæQÆõNúnÔsÖ~ÃÁ“ßÇÌÞŒ¼óœ¡þül>sÉeY`åûú­ ¿ÿ,H…Áø#쟷À3ðü€Ð$pï’¡¨j‡F¡¯0³Á²ˆÏ÷…ÓàKð#ø¼‹xyTêjFk¢ãoþ#‰Â4!Þ[›†íÁÑã\q×p¿ðºøsø*Eªlª‚:¡˜ð‹Úšº‘ÈDŒ#¾'#œËÓÜ£U§í¢³¢{CïO¿ÁÅÈÃØÄdÉ4ÏœÎÂÇò”Õ‡Š­Ý‰æhàtç"r=å>ÅcÃËÃûƒÜÅWÆTÀVPNˆ^hYxD¤E´ø@‚˜›¸¦Ä®ä{©é«Ó)r‰òÇbã”b•UUÓÕrÔó4.kÖhµjwëLé®é“ Ä MB‹LÚL‡ÌÞ›¯Xb²[IYëÛ8ÛFÚ°/q¸éøÈiÀù½Ë7×M7Œ;ía6²§°—¸·EÉGÝ×ô/Ë+G$ƒÂ‚C–ÃÃ"FîEëÆ¤í£Ž·LÈ=6˜Ä˜l’›:rœ5Ý5£ìÄÇ“ê§*²Ñ9§ÇÏjçÖä1ä§,Ùw”È\(¼¸[|i¤\ãʵ beÔµ7UZÕWk©ê2oˆÞüØPq;ð®bÓ^ËDks[Áäö'ž‡º<º)½‘/’ú‹j†º‡ç_7OäO†½·˜Qþ,0GøŠZÚþñûׯêïÝm†¿üÖH%)4‚—`‚!.H ÙAü¡¨ºõC_`æ…µÊN*| ©ä¬¢øQ¨³¨~4-Ú]Šþ‚‘äa†°‚Øì0N —…ûŠ?ˆ¿CÅNu‚ê'B¥6¡n'ªïdIÍ44Û´utžôlô“ ŒáL&ÌB,xä·<Ã6Âþ‚£‹ó W+wÏIÞh²?Ÿ¿—€¿`ŒPºp‰ÈmÑÞ³â@‚SRAÊJ:@&K¶Gž¨`£xAiZEL5V­[ƒU3Xë™nºÞ¼£a±®Éc3}ónKÓƒ/¬-lì¬ìûÍœº]ô]Ÿºi¸ß÷PölñV <ôÕôë ° |dÜjÖ¡Ù-SK—ÿë˜wâ»dÛ”¾4ËãCŽ'Þþ¸Š¬»©rëBßÛÎwš›¨š=Zš[ñ÷Ú*|{¤Úžú¸ó)¡Ã²3¿ëu7KGïÕçŸúDû#_6 왽*þ4*õ:zìþôFïí‰Éîwð{å~Óù3÷_²;ËþEzNoÞ|Áæ«ÍâÁ%³oªß…~¬.ülü•±â„(ˆ¯«kQë ëß6ªþ8mb7›¶\¶v·+w wæ÷öùò“—Ûß=DÔCÊï÷öV„‘úe>;y{{[{{;•ˆÙ˜àIð?õÞý`,R/;´žØw¥î_ÿ³ý•)cžT *IDAThíš[lÕÆ¿™½zw}Oœ8ë8·*PѪ¡U+Ú"…ª-BÊ ! x€´©P$ª*å7RûÀSi¸hZ*D•ÚRRµ4)´@ n%ÆNœ¬³^{í½ÏÌî\úYÛrœI‚“¡£Œç²³çœßùßÏFrŸ§&ž`ë%à‹]â—$|IÂÙ \Ré‹L §á(§=¹€[ß¿!ÕýÉX´|ð`xì…/XÐÝ¿ú½¿HÑl·¨q|%Ù‚H4$U 3¾=7cUpãh<¼æùo†V,îDò3ÓúþŸ¤îUí½›{û¯½,†oübjyåø íŃ^è½ôÄ—“òÛ•Ñ{lãeWê‰+»5mÝXÑ~"µ Ð Ê>Ó°îûñu›÷-ËWáÝá™ÔÿF7œì¿c]áÛ½;°Ã×1\€Ã-’ï”íÑeŠ1¥*Ñ”Ž¶ë••ê]J-')'†wËcì’Ê{_'3š[7ŽtJ{?¨¶–¦^¾s¢ðúkO~Ð)@'O)…B>ˆFPË‘¶–Á˜|Ù£o"wì/^‘ë†=ÙˆŒLåPZÓÿsçÈÈÏo^鯤 dið0"(T‚Ð5ÀFše£:s…\ù‰éO¸ !³*J&Óº6¾yä­ŸÞ¬¾9ÙÊxª™çÌÎú¶éÍ­ =‡]OX%L—ÆQžÑPöæõYÂb’\ízÞAf"‡¦¥HGhÀtŒ­ï¾öܦû_½¥oøMiºYÁ2°mÓæ ʵ<ôZZMLæôæ« £Z¥mQ׊2&³1œ(L#˜LHéÞG*l=°g÷¦ûš?’v}?×ÎTaš2,'Ý)C× WÅ5ƒB÷h>s®.j6NN1<•EÕΡ#½VZ±f`-ÚÖ=»ßÙtÿ×_¸¤mò8œ¾‚-€¡Â°f`Ôë°LÒÙGþ£BGB`ÍS  8å _©À*X1p…´ªÅZÈÆ^Û{àö­XÍèyêí ëP¨Î•&/ê:=(—¸¬¢RT‘¯Ñ4DZ{°êò+¤ô@ÇZ«Þøá[¯ŽÝvç³ñó‡¶ ,x‰þK"v”·Øvý?ñl>K˜6\çD zP]E™ÀS¥ihF`ï¸}k/“Ò«“k˾ghouÓA bÚ®C « K2=7û·éó jí/0yaÒi‰Ñt™SÁdÙAÍÐaË2‚-i´t]ôš~©7ë§nyO@?r¾’"–!Ì9Bä€cñšÀ®Có°ßa‰ÄB-J¸Áe6$}¶†`¸ÑÔÕH.ÿúúäÞÞP¿mâžoUo=/èY•¯! à A–ækµä†¥šH-æJ›4i]¯Á´+e-Ñ4ì¶“«MG¶ÍÖ?fÜ{`ŸܬÄvýöî*õß;¤œÆ1Ï&!$`é’Þ Ñ§½Ü|à/pŽv¤¥È”²L)sR¦IgÒ(ØB"܆h,«U"´UÔÇü(}â„þƒC{븻¿{òãCÓŽ·¯Ä‹sUžÀߪ ’¨K¡4lÂýNð/ÏUqn¶*/æ®NðÙèÄ~‘Ô†%D¬2á=Po-«ÓRvÐêD$~ Fc‹*¿²Ae´GÒã™ê–·ÿ]"ôU„~ÿäì0ç<5-Y"ð¬ñŠ5h®Ãißõ~ðµW®Uƒlï€TáªÍ0´Îð\žOh¬XRqM&÷ÌI»Ï¯¡çˆKi K º,´Ä,$ƒâ½ÿUé¼'P–óè ¶¡öŒØ(i7%ô˜|ÑîËfK[¾9†½7=:¸á¯%~û­éw)_¾G“;‹ÓòÎü} ‰ê£WŸ”`?Q·¯¹8ßìP@‹&΢1H„Ç*>ˆsU „£&X«2!0˜x”¡É3È),wÔ’Ñ–ýtj5ÔΖ5í ÷MMä·ìý£wàÞW7ìüÐÍ©¹Bó™›/7O`”{š Äî ZÛ¹}’$·Q¢‰p[¢„ó”~±¹¸Œ¿ü€q‰8B‘ b´å w赚 ­†±™ˆL¢¤ÔØ— ªе šXÓ(£Ý”húr_!óáG‡úœmÏýspý&ohW¸œcÌÇW1ž;Cï?ÞÀ!ŠT¦¸ªQX“(ÓP˜@8‘Š  “Là0Õ:I`KSPÑY²T“Lô˜GGÀÒ›ª!òÜ$M¢­Î?f|–޳“Le 5`$‡pLƒ¥[0¹º¦ÙøâtîÐýá¡]¥ëÕ b#GZÜÛäåinÕÝwÎÈì ÜÂÉ —§²“Ff© YÖ[YE‡"›Ö´LÒ©‚f˜ïðp*¤+t[n FÕ-é&ãpƒGFƒÞÙéÆWå>KØ'SÊvŠs˜•N†ßË2KG#PAƒ³2“tÞÁBÙ’Z‰£oDÑ·XÈ´ ,Îó>«|›Öç.É)R-M›”h‹"sª„9+I\e {¹¬(KÄçg ®«„ p~¦I„¶¸PB*^g,ÖY9êÈÔË0L %c˜*¼Ÿqzªú‡{£,K=ÌÂÝ´—ÅiÓu,~Ÿ÷>“ØaÖ&°E‹•³D‹°¸Ú…œª€ÕñdtEôџܵ-»$o¼xòÜ놨bÜmjÝ]®BZP8žPv¯æ/0åP*¡MV?‘*B, Jô+%a³„ETo[¾•׬Å3¡Î¢Ve¾/ö°Ž›%²—\`®ƒ#vl½¾zîõú9ž • •æ:²R“L¡xË\£Àê7‘å‘ǜۜ,ßòœÌ9z?õã0Å(¤Ì”Jl’Ó¡Š\ëkq®»ØŒðhþ‹ÂbÕm„‚·Ö„³*p³à©ž•øUíöÚ8߸pX1N€+jê®ÉB¥Xù/³º Èa Á(žÍ`›A–Ϊ¥i1¯6dÌ‘#G8yò$®ëÒÛÛKWW†aH#­Í~^6s_ÜÞr·åyÒcW‘•2Ìžç­š„µB__úЇøÐ‡>T|ïÂ… ¼úê«<õÔSìß¿×uééé¡»»[AƒYIÿû[c“zq\ Ûè®´A^ à8ŽôaM³yóf6oÞÌ?øA†‡‡9vì‡âÈ‘#¼ù曘¦ÉÀÀ@@l‰¬ãߨm6b;…mˆ¸ÓÓÓ^ooïx3¶mYÖŠ»³VRŒŽŽJÖ›6mbÓ¦MEApäÈžzê)Ž;Æo¼çyâ%¨‘µ2êoUo‚ô¾Úh¸ÕTJ­J§XI 7A€½{÷²wïÞâ¿GFF8vìdß¾}är¹bišÒ`°jÏÆVßn#GÿÐöéííý{¥ÔGy!]×eãÆìÞ½{UÎi%DÀìì,Ï=÷œt AX„‚ 8tè‡æõ×_/ND"‘uÕ«5R^/Æ¿r;2D«5'”V ëºôA¸7ndãÆ<ðÀÅ÷†‡‡yâ‰'x饗xýõ×ñWñÔ@ooï_)¥~¹Ñ€¡¡!öìÙ³ªçÖL022Â3ÏúñÔJ²ÑTJaY®ë¢iÚªÞͶm“ÍfEÂ2âþûïçþûï/¾÷£ýˆpèÐ!Nœ8Qôtww·´(h•÷z7þ @@òB;rï½÷rï½÷ÿ=66ÆÑ£G9tèPQ¸®K___Kˆ‚õ`ø[é>ÎÑ£G9|ø0/¼ðÇŽcË–-+&ZͶ›ñovîyâ×@ooïï(¥þ¯F»uzzz¸âŠ+Vu `^‡h å?øÒ‰¡+Æ:tˆãÇãy^C½­:ã?ñÔ†Ûè *¥°m»%r£D@*•brrR€ ´6là¾ûîã¾ûî+¾W𔊂ÂÔAOOOM¢ ÕÝÞâö¯Ž€UÄqœ–ì8¦iâºnËŸ s Î9r„ƒòo|ƒ\.W&ÚÅà­Äq¶sÚ`µ‘Xo',1‚°~(Š‚Gy„‰‰ Ž=Z\uðÚk¯áº.ýýý-»ê`½ÿZPëñ¤E‚¾ ¨\uЪ¢`¥ h«ÿZ¶% 6Ö­\Ž0 ƒt:-½GÖ ÕDÁää$GŽáÀ<þøãX–EͱË¥ÿjŸ¡¦Î´T033# (ë„þþþ¢(xä‘GŠ‚ààÁƒQo¾ùfM‚ •«ÊÓ¹MhG ë:³³³rñAh{*ÁsÏ=Wǯ*Z½d°€ÚhÊd¶Rª®‹Ùn"@Ó4©(š¤T¼õÖ[UA£cmDÔF˜htP›çyär¹Uí‚ ÂòYH„B¡=«‰çy"êÀmô—*(D‚ ´6¥‚àí·ßæùçŸç“ŸüdÑCpìØ1¦§§qÝÚLK3žû’ °M‘4¼‚ íCA|þóŸ`zzšýû÷óµ¯}Çãº.Û¶m£»»{^ðt³²Ѝ —- Üꩃe€ Â|z{{y衇x衇€ù‚Àq¶mÛFOOOCŸñe¹Zä2Ô|±þN)õ`#•˜mÛìÙ³‡M›6-[ᵪ…B<ùä“ÒAê T:t¨è!X® (µ5⨦XØFåÊoUO€Ä+‚ ÔO¥‡`jjŠýû÷óõ¯C‡á8Û·o¯KÌK×.Í\3-ï-iÇJ‚‚ ÂÅéëëãŸøŸøÄ'€rApðàÁ2Aµ©×jƒ1µ3Þ)"@aí³ (L8ŽÃÆéëë#T݆€ÚixUˆfêVŽãHÏAh2•‚`rr’£Gòío›ï}ï{¸®[¦iX3½½½ª”úFÎi;ŽÃæÍ›ÙµkWS޹DÀÔÔÏ=÷†!ZSaµ˜œœäÈ‘#|ç;ßá{ßûŽãˆ¨•f×ub÷îÝM;îÕ±XŒgžy]×¥ ‚ ´“““’ °Ú2œ]¢ðA„JúûûEÔÁ¹v=ðÕ2òAhMDÔŽÛŒ®”qön¥=Ï#—Ë­I÷¹çyèºÎÌÌŒôA„CÀ*£”*ÿµ*A„ÖC@}4ÝO/SAX DÔÇøJìDD€ ‚ÐlDÔG²­–`-‰Y ‚ÐzˆhlÛ®úþZ’ P¡õP ·È¯ S‚ ­‡€ú8·;­¥èŽ ‚ Ôƒ€úXÕ¤ý"A„F! ¨'P;Š),‚ÐzˆXe”RuWl7066†eYr±AZõ‘h•i§¸Ã0¤ç‚ ´"êc¢ÕHâA„¥  >žÑ¦´ÀRiu ëº$Ah1D´–e­iÇI$ZföDA@@½Œµ²¡mÕcs‡l6+½G¡…P-oÅ$i ‚P "Ö("A„ÅP Ïh£”Âqœ¦ìV†aˆ Ah1DÔÇ8M( lÛvÓ d+L ¤Ói&''¥÷‚ ´"ê§-׳­¦0MS<‚ -†€u„aA¡€€úP4)ÐJ!"@Aõ’ÒÞ¨eY+Z1o¥ãt]'N#‚ ´"ê#dš±áÕ™¯Ô>•RÌÌÌHïAh!D¬sVB(¥¤€ B‹!@ì‚ ëõÑ”al«àfƒ¦I7Ah5äÉ\q`¢ÑîlÛ¶q§%Üäͺ®311!½G¡…P?n£7ØjóãöH†eYÒsAZ‚H\€ ÂÚE@}¸4©$p«FÉ‹AX›ˆ¨ƒééi¿ PCq]Û¶[ö¼—;% ëzKŸŸ ÂzD@ý4e¨îºnËŸøRE€®ëŒŒŒHÏAh!DÔϺÎh³o€$Ah=DÔϸ4Ä‚ ´;"ê')MàS€ Bk! ð<\.×¶Ç~1! ë:³³³r¡AZ-ÀZ/&D‚ ´"êG&¿j)*$‚Ð6ˆ¨ŸsÒ‹#"@¡õP?MY°ï8Κj$ñ‚ ´6"Z۶פÁ,œ“¬Ah-DÔO¢Ñ\ëÆÑó<É(‚Ðbˆ¨)l¿Ú!Õ± ÂzB@ý4e¸..rAa%Ð"X–% ‚ ¬"Z¥Ôš˜_k«AÚõ3&ËÛ–Ðhccd2iA„A@ýd¥ êÇ0 iA„B@ P˜Ï‚ ‚°Rˆ¨Ÿ¦Lf[–µ¦€®ë²ÒA¡…P?ã@Rš¡>‰‰DBB¡E°4$@ضM6+á‚ ­‚DfÕ¢ ÔíŸÉdÐu]×ýåAåoAAX."ê'¤ðr6ây¦i‡ …B†ÁÔÔPnð•RÅùsMÓŠ¯KßÐ4­øïÂ÷ +e=äA.Ž€úIKZÐîyJ)LÓ$ ‰D0M³êç ¿=ÏöíªÛ)¥R4,U8~išËßúÖ·§¿¿ŸP(Dww7ÝÝÝ„B!z{{ …BD£QYn(‚P#ò´\ †/F1M³êè¼ÕŒñbº ꚦáº.¶m‡Ù°aCCÛ •J199É–-[–ôý‘‘NŸ>Í©S§p]·X\Èqœ21‡Ñ4ÎÎN"‘á°ï¨Ù´i===tww QJÑÛÛK8&‰ÈôŠ ëM¦0Ú…BuþåR«pp‡\.G&“!“ÉÍfÙ°aCÃÀr=ªÅH”¾ö<×u™evv¶8åqêÔ)Ç)H¥Â! ¡ë:D"B¡P™·¡««‹p8LOOOqÚF¡P?‹KÝü]]]ƒÁ3úµRiômÛ.·¦iär9\×m¹ã.mßz_„C5ÑPÚ.³³³Äb1Þ~ûm\×- ÇqÊÄGÁÛÐÑÑA8&Ó××· h¨6Ý#‚°Zˆ¨Ÿ80¡”Ú\:¢­ ê[ÉÑ~-,fô§Ö3…؉jmRð,8ŽC,+ІwÞy§8EQðFTzJECÁÓ ‹¢¡  ± ­(ÄAhD, ·0*¬%¨oµ¨×è ËGÓ´¢Á^lŠ¢T4¼ûî»ež†jSQP*J½ ìÚµK.€ 5# N²Ù,Á`P‡¥õ5›Fýjƒ«I.—[“ý©°êb1ÑP  âñ8P.,Ëâ?ü‡ÿ 7¨ 5# N,Ë¢§§ç'‘HÄ ƒ}š¦Eðsx@' NT Íé7ÚøëºN:^ò÷×Rî‚…âê¥rŠB¡DÔ‰mÛΞ={~-ªóçχ=Ï 1—h ÿº"øé–·]ù¿»ÀPþsùÏÔ- šåÞWJá8®ë6Ô¸(¥˜™™Yò÷»»»9þ|[͇7ÊÐ ‚ 4K`ÿþýnþe"ÿSàl-ß¿öÚkÁ Ñ›Ëåv'“É÷6sN¿°ÝFRš¡p©ßo%/@-+Vú8AêAÀ*ðꫯ‚ï ¨[@tuuÝ©iÚÓJ) ÖO Ÿiš(¥°, ×uQJ³jzI^áý¥.\ìõj"F_„F  ÍÐu=Ç:¬âøðÃóàƒ’ÉdH§ÓX–E,Ãó<²Ù,Éd’x<ŽeYÅ@…ÄF‰D×u‹â( ˆBn€jé“WÛÈÊ‚ ÍD€ÐD""‘HÝßó<¯#Q¹\ÏóˆÅbEñ ”"‹…E!¶B)E2™,FÚ¢î ©“ ËþJÅÃrj*ˆ¡a¥ ¬«¼WÈØÐÙÙ¹¤mX–…ã8¤Ói2é4¹|ŒD©€(õ>hšVô>$“É¢÷AÓ4Ç)z* 0µ’÷A„µ€öÃiǃÖ4‰‰‰¶lð@ PõP(°”N§QJ§/âñ8™L†d2‰¦ieÞ‡l6K6›-z\×-¦gª ˆÊÂO‚ C@û1$h³vËåp§¡¥u ÃÀ²¬uw±4M#EDWWWÝÛp]wÁé‹‚¸Xm+ÂòОˆx¡iÚ¼ˆM›6I°,¤Êˆ°r¬¡l~‚ íŽAAX‡ˆh?V¼Ö€ ‚°öÐ~¤€t3wP(G+‚ ¬]D´) ÓÌØ¶ãø« %t]ÇvÚr£ šD€0Ê$4ðèºÎÈȈ4® B‹ @¨™å¥”.‚ ´"„º‘øA„öGµ-1.ˆ€vÌYŸI§‰Åbœ9{–x,ÆÌÌLñ<Ì@€Û· …ZRæ>A„v@@û&”R››5w]·x1ÚE¤S)9ÂxçwŠï›¦Y,TTȱ_8¥CCC\}õÕ\qùåìÞ³GzŸ kí‰Ûô¸õí¢–2¶+-¬l–Wàà¼{ú4žç ËŠú”S¡"_éûñxœç_x§Ÿ~š7rÛm·qóÍ7K¡í 4ŒÅ¼º®‹ÅVìX~òãóÔ÷¿Ïìì,¡Pˆ`0¸à1Žw¡×†®cF£Äb1¾ûÝïòƒü€|›nºI.º m‹¡áTº®3;;Ûô}ÏḬ̂ï[ßâØ±c„B¡âh!ã^J©¢xòÉ'yùå—ùèG>®K.‘‹.BÛ!«ÚȶîôjCòüþïsüøqÂápÓ¦”R„B!FGGù³?ÿs8 ½R„¶C@›1==íãír¼+•VøÙgžáÑÇGÓ4@SΣòµ¦i„B!¾¹oÏíß/S„¶B@{ÒÔhºfŒœ›)þö»ßå›ûö¡kZ1¢¿Ú~—óz±¶ …BüýSOñÅ/~Qz¦ mƒa®ë’Ëå¾ÝfH€ƒðçŸ&‰ÿJO=(¥‡Ã\¸pï?õ”t AÚíIÓ=ííïÜ™3<úøã˜¦¹âû®æ)…B<÷üó:xPz¨ -¬hOÚ& Y¤ þìK_@×ê×±/‡çyèº^œö($ò<Ã00 £Ì³p±é‘@ Àßü&@€k®½Vzª -‹€ö$ÙŽ­50¶àï¿ÿ}b±XÙúþ‹­é/ýH$ÂÆ¹îÚkÙºu+‘H¤èEPJ‘J¥¸0<̹sç¸págÏŸGSª¦àÂÂRÁüÇâšk®6L•,Âú@€°b 7¨ðÙwßå¹çŸ_0¹O%Žãàº.;wîäúë®ã=×^Kwoï¢ÆyûÎþ ÏãÜÙ³=vŒÿä'd³Y@qš¤šàÐ4‰É }ì1>ýéOË…¡% T¥ÞTÀµà¹.xÞ²GÅOìÛ‡ªÁíïy™L†m[·rï=÷pà 7@½ÓJ±uûv¶nßÎ ×_ϳû÷søÈ‘²Õƒ?~œ³§O³mÇéP‚ ´Øž4=B϶í–<ñ©ñqΜ=‹‘ÏÙ /ÝËd³Ü~Ûmüú¯ý7ÜxcýÆ¿‚M[¶ð©Ÿÿy>ú‘Fç­”¨<Ó4ù;Y B‹" =9×Ì·re¿'öí»¨ú)Œüï¾ã~擟¤£»»¡ÇpÇwò¹Ï~–,ËZðs†apúÌN—TVžÖ”²‚°úÈ@{â¶í‘/c `ìÂŽŸ8qѹÿL&Ã·ÝÆCûZ“–nظ‘Ïüâ/òõÇgff¦êt€çyL“g÷ïç3»vI¯m0?~¦ðÇ`<oÇ!bÀ[iÈæUb˜q [ƒk#°« úÃð¾K`ïn¸|3èÒ”Â:E€Ð6<|xž›½2/—˱}Û6>ôÀhMH \ÊàÆÜyûí|óÉ' ƒóÁ÷¼qò$ÉXŒhW—\Äeðì«ðíŸÀkw å¶t  Ã®nn¬? Žçÿ¸nþ7àzp! §ãð£ ðÖ?Cʃ["pÓ<ô^¸ýjÂúA€°bØŽƒgÛ¨%f/—ãÈÑ£‹.Å+߇>ö1:{{Wäœn¼é&†GFxáÅõL<»?yðAéuòì1øîOàÎÁ†0ìé…ë·Ì…sØŽÿc9`»€Ê(ôДïp*üöð?g»p )2ƒ¿ÿ[8µ~aÚ ¿B+pŽÉDͽšF@{’hö IrÉøÄÉd’Ž%€wß}—³çÏZÄÈZ–Åm·ÜÂeW^¹¢ãö[oåäÉ“ÌÆbhš6Ï38t䈀™LÂ<?Ìý+á_^ á€oÔS$3¾áw=?-fÄ€ é&h€®ù"AÓò¯•ÿ[)ÿ;®ç?“ƒ¬ É,$²ð,Ìdáž…ßüüüøø p×ÕÍ;ߎ߀»ï¢o÷fÒ¤¸)ºCÁînp\ÿg¨z"ù/º°cƒ^a†ú¼×c°"!ÿü·u·ÁEVíÉD37^HšÓðÎf,½»Åb±âë…ÖߣwßyçŠ_Œžþ~îºãö}ç;UŠRŠd2I|zzÅ<íHø¿…¿}.ë‡y ôt€®C: ñ4$Òþè= CGØ7ú!Óÿm`êyßñ—tâ{P² Dù¢Âq}/B: ±4\“„©¼=Ÿû[úüÚðsw5Á+0a[æU:& º7Í|7¯¿ßš[öónbîµãAö-Èyvýé ÛƒŒ—Ïææ4¸¥nÙœ}¸.”þ&ˆhWÚ7½Ü½ §Ïž]tu‚ã8\~é¥ nÚ´*§uÍÕ×ðçŸ&ÉT9eÿœ_>p€{ï¿_zo¾ú}øž‡+ûàcWÃP¯o¤g0“ôGüJù#Ýþˆ}£o”ü¹Ÿó T»kåB@×üí è ÃPäHea6 WÅ`$_z~ïøƒ['I î¢4ƒLì&6WômfC_~z#?¢÷<ßð;ù˜¯$ÆÁÍ¿öò·WÁÃá1÷7׃£cðópüŸ çÂ-Qx`|öØÞâ^‚WNÀŸ}߃¢·3ïqaÇ¿”íº=píV¹êE€Ðúxãããekÿ+Ig2¼ï†VíCQöìÞÍ¡£G1 c^0` àÝwO˵¬à©á‘¿ƒí]ðÉ«`ë oØc)›DôF ‚P‰‹_•ôR]©òÿóJÿ þ…÷ótÿ‡ÜœÇÀÌ ‹ÞÿgË€ï}¸b.ÌÀã‡á{~¿QB PÈ ©“sr$f,n½2@4’7ä¥?ÌùÂ{n‰(ýw©h(¼ÏÀº#‘ƒ—Η¾÷Âo}önkÍ~ò7ÿ0J<„L'?Ö1¾ç#sÊ÷~¼þOà}Aî§z ´Øð‹Ðj1‰ûNd¸}gñœM÷lò§† S%7§á™ãÍÕ¨F֟ܽ 6 IDATùÝÓ\º{}½ù¶waçßWÃØØŸcùØŒp^1jøž.Åêµ·aÅÐõ¥-°ÊålR©Ô¢Ÿq]—P(´ªç·yÓ¦²ÒÄ•^€ÙX +™$®ë~pümø­¯yØJñ ×À¶ þCüÌ(L&:CÐõLÿaZhÉJã]ið«½W“ðÀSs•ó=€?õpÉlîƒK7Â5ãðÍcðW‡áwîí]^Û(@Óñ$d²ó“W|•Wþ 怫|£ øñªkÎ3ÍÁU[áÔÜÿÿÂ~nº¤5úËKÇ /¥“Ì)BØÒ —l+ñˆ¸¾h\i.ŒÀS¯¼ÍeÓ9B½—ÐÛ£©BlF~¹jÖƒ¤çÇix…ð*Í©ã÷½÷wÃm[á}»áúËಡæ¿€öd¬Ñúåæ„$’I’‰}}µÉóð×7é:ˆhO²ÍÞeY¸®»hÁ›z±‡l¶þCO§Ó$’ɪKì +Âáðê_¥Ø¼i““EoGéñ:ŽÃÌÌ̺] ðïÿ«Í_ŸR|l‡Î¥›}—ÿø ŒÎúÒþüœ{8èGôk%C~¯D€=!kA.ç{BAØÚï ƒpj| ^ÿŸ »†Õ®¾½.÷ókšò]û^±[Uýžšä°@ÜT=Ïó ”íøçT˜îؽ ú»à‰—ü}_¿Êµ¬þæDš;wDIؾˆî‹ú}§¬G~e,"+ßç£8psv…èËÇaPÃQ%~ÃqÊß·l?øt: øßŸ„«áß|¶õ4öÐE‹ôëU^lP2êoåú¥twuáºnÕé]ÓH§Óë²/ýεØwJñ¡Û7øÆýÜL'ýe|CÝÐ…HÐwSÃ|c]‹ b޼°ÌOå®JËÿM]d)Í" °]ßEŸµü)ŠHØ_“?Øíg&ì¬1Õ…çzT¥‡?ŸÞÂ"–&¼*û³mÿ'`ú«!n¿ ¾ó²ï%¸n•‚_< ýÁ(” Ñ€Á†_T6F4gGaà fÝ.N»ä;”ízLÏ@wGÅT(VÞ)‹a)Õ~%×yë / ²9?Vcb~ïqø·‚w7îøE­‹ç•?­Šo—{Z뽼ꯞ« ¯»ËøÈŸfxì§pßö{ýÎðŒŸ„§+ýÐõ#ü5E™uº˜P%]ÅËÏÙ;ù­ëæS;s#-]÷çóu=¿ô/è<Ãðß+<œ=b0]¥ñ-Œ¾ ïg-ÈÙþè9ök•«#cSs… òÖ@©…o…† ’ö­ø ÙœïèˆÂ-WÀ“?öó.\¹yåûξŽpIoˆœ«°\ÅPÈ7®†1¿$ª©Ãë§á½+(&¦Ź…ÂÔý×V®âZÕú˜*,O-™žéé€ÞN_üð( OÂÇnjÌñ‹hOœ¶=òz vþ鯔º¨ -ü5œÇZã‘?IòÕ“pÏ–(º}ã?•ô×ÙtB_‡oüU þBïoÜs6d2þü¼•-e-Œ•Ãq\×#ç8¸ž‡çzhšBS MS C×L‚&D#~ö¼pÂaÿá»Ðå*‹/¸ëÓ™¼w ŽZ¾@«èÄê¢õ²”¢úR†zî‡ ¡Uú]Ç…xº:á¦ËàûWG<~"Í]Û#¤lÐ5EoÔ_¢J…bÉ£%•[ÙãK$-?]c¾Åuµ@Ÿ©U äÿVˆÈåKYjÊŸrº~œ…ׇáʤ<ОŒã'ûZÛÑdž (¡ ‘p˜Ôîs¥É‹¬XÙãöò¿*<ž×r‹fòÈÇù³7<îÙØÉ@—oô§ãþÃmC~Y]W$è‹üR—¾ãøÆ6™‚dâ)D*K:k‘ÌZ$³9²¶ƒí¸¸ž‡›os×u‹®M)L]ahAÓ `DC¢¡ á`€Î¨Nwôvû^c,Õâ Ix–*õ4µðŠ×…Ù˜o”*?®ÊäFs˜Ë› kùëå®çÒÏz%ûŠÅ¡³6 Àǯ_¹þóÂaßý¯4ƒT"ƒÁî¹et•¸t†ýʃ+ÉÚyPƒj.ã¤WÞO–ƒëùBW×aÛ <÷¸\½ÌäG"Ú—¦ %•R8޳à\ör¨Ùþ"cðS‡‚A’©TU·ºRjAq°Òär¹u7ʯÆoÿ—iþè$<°¡“N…íÂLÊ–]¯pC/˜§ò]"™‚xâ)˜MXLÅÓL%Ó¤,ËqÉ9¶ëâznÑï_vPØ¦Ê ßuÐ5L]'0鎄ééŠFèîÐèõGÃÁ*sû•Ñ÷õdÑž»Ô‚+LCxøÁ‘ŽGNf0t-ïË{Éðƒä ¯çþ–ŸÚPþ÷ :"¾Ç£«#NƒU!ܼ'` Nž[ž°©—}?ºÀîßýo{Šî°òÝÿúÏÏŸFzþ(|òæ•9Æó£qØŸooMSõ=ç.ÚAÊÿY¨±uÀ/‡-@h ¶m7|´êgÈ«³Æ€ç¡ëú¢•öffgç&yW‘x<^&J…Šëy‹3Z+üûâüá«wmè¢'bà¸Hù#Ó y㩪®ïÏ¡LÆ7üÓ³06“b"žf&%i9XŽë¹Är£V>’Ívç‚\”›ú¦bÈTD4­Á³5ÒJ¡”ÆLZc"‘$dt†CôvD›ŠÐ×bhz{ü) ¯âXan: ö;§<¯`¸ #ô¢(¡0¼36C2“-z4æ@!"]•ŒFUqªÂÔ5‚†N4¤#¢§3À¦AìäêI¹®ð¸cüõsð ·¯L?úÚ‰ ÷n’ÎGÿ÷Füü‹-LÒŒ¯`>MžOää{X‰.-éू…DÕ|É:w=,Ë øîOàï_úñ‹hOmX Í055ÅÎZ¿PÈ`f ô÷söüyt]¯êˆÅãLÑ»JµÈ埘Xpé¤ëºtuv®éŽùò—_}j–ú:è ™  aùí¨¿¼¬»ÃwE{Þüä5•.uËòóåÏÄ`lÚbx:ÁD*KÒ²³l&90Èåøüõa.ßÚÁPŸ‰i*:Â=]<Ï#•É1=›a|*M:ãðêÛ1ž;Á‰  ž¨A©ƒÒp”NNi¤4x6ÃDƒƒ¾+]QR€Ç­'è[]ÈÅöX$ ÀŒoÅüuE7”Y"-¿m 6èQ}n®:kA"£1•L2KO÷‘µz¹t§?ç_Y[ÁÒi?uí?ö6·/íûÑ0—æ£ÿs®bcD£»ÃOÂDK1Û¡ëOœ†ËWàQðîù=ÆÜ*CWUE¡íÀÁ“S8Ž“Oˬе’)œB&M¡kŠ iÐ 1Ø«±¡ß¿&šFÙ‰;t„๣ðñ%® О¤€Ìz:áÍ›6͹Ī×` Àá£G¹ó¾ûVíÓé4Ú"óÿ†aн†À¿ÿÓ3DÂB¦‰å(\|·_~©ŸiÌ_×^)RißÝnÜâÌdœwãYÞ™Íñù½&y7ïí¤«솆L>ùÑKøäG/!‚GÎñ­|‡/>? f€-A ÝÄÕt'GÖ¶Hd³ÄRibÉ.fl„þ´¾À©õÁ:15 zauˆÊÿGYãxP¦2|þÞNöþêµÄ“6S³™üòÅ’©¥H‘µ\×áØ©~üV‚ÃÃtì¸JÃÑ Æm ËöWM@?—íô—z¥Å“ð#Ò;¢ðæ0<Ðä¾ôÕiîÝ!íäÝÿQßý¯k³î\n‡áyke@Îöæçý Ó-þs©äóýg¦’Ä3é’¥¥ª¤2eáº{(  +:‚ú¢a¶v³g{€ÍCó½ ˜ˆ-ýøE+K]ËóO ×c°¿Ÿ``áì*š¦qnx˜Üì,f÷êÔ6=ùæ›ÅˆsÿðË…ÊÆÁA?¤| ò¥¿çÑw®ï‹2MüÀ¿Þˆ¿Î¿¯Ó_o_:§=O0è76gÆRœšHrh2Ë¿¾\ç+ŸÞÀÝ·4ÏéŽÀí·låö[¶òÛg“<ùƒüÑáÝIÅ–¾†Àó‚ćL.GA¶_=£»«‹þÞ^&«äÙ/Úx"ÁK/¿Ì÷ß¿â‡çð±c˜Fõ[Êq:::Ö䥺pþû§¦¸¢«“iúem]EW:|ã_­LC¥p¾dN Ç94‘&ŒÍw>ÓË'î®hÔ˶mQþÝ÷>þÕ¿°ùê¯ð?\šÜ¨z_Ê—0^{¯ícïµ·óËó…?{‰'^K°µ¿ϵ‰gƃtEÂô÷èë™|9ÛÏÖøü ¸íªæ´ý¾]àòž¶«ùÉÂú<÷¿"¿L1á÷­Òi%×_=Ìtz›\LÓJñü K})€¯f ‘@…2QŠÑñ©ŒÍ±ŸNñâ[ Ÿ· Ë÷Ò$s:V.‹ã¹˜Æ&BA?Ípé4ˆ©Ã‰wE $—Ëáºnã7\ïÓ1Ÿq%sõWð£çž#`šó*í„B!~¸?·Ý|3Ú Û¿ò c„‚ÁªS™l–÷í½žµÈüËS„L“a ë:ާë:ýQßøwäGŒ‡NY¤¿7éŸLÁð¼~>Î? 'ùÕ=:ÿ˧7³ckÔ÷ôüÖ¯ßÌïßÁþâßy}†¡þ(!Ó!ç:8®ƒeÛ$2Yú“iL}þ µ?V+ÝûPXNV~»”|ÝD^{õ _ÿÃ3ñ¹Ç945K4ØAN)¦1†§f¹0:HWGy@]ÁûÀÈLóÚü/Ndx`[”Œã·E_‡ß‡´ W¿eÁÄ´?µÔ-‰šÏŠß8 7_ÞÜþ19ká›QµèÀ@9ÉŸyfE/Frb‚#¯½ºèE0äºkV¸Xù ðÏÏÍðçÇ²ì ™ºŽ‡Bi=?â¿·«bDäU_Ö”Jû#ÿ×Ï'ø‡ )þâÃ|ù‘ÁU5þ¥¼÷†Íìû£yô7v1::ÃéÙn.…“K“µÒ̤\˜žæÐ©Ó¼u~©·t! ÄÍ[ [øízÕ=*õÂï~n/ÓÓ8V7—IJRŒÇ“ŒMÛ¤ÒUØåËÙÎ6)íÆslzM¥t2Ž"bôwú]©òöH¤`tÊ!•™ÿÈ0:MÓÉ•]¾BÂ¥â¥Ëwö\ ¯¹¢›Çþð>u¥ËÙ‘ Ülœl6Áèlœ³cqbñy§‹iÀÈbD´'q`¢ÝÎèšNf© {—MCééî. “j% òÏÜÇðì,n.“ËO§™ˆ%™—”.IT’£«áìûÑ0Wö„°= ËSô†uz:æâG ‡áº09#Óqb‰¼W¤ä=ׯ7Ñtæ¢øP¨2P±_§3U×áÑÿò0÷îÈ‘HÏâæR$²iFfLLûÛ+­04á%Oí‹Ûn¬”bf¶N™Zìå.½ýýÜ´÷z¬ätÁÝžN§ù¯_ù 鉉¦ŸÓ™“'ÙÿÒKòKÿª‘Éf¹õ}ï[sðKó/Nk„MC3@iºNT£'êWg+Á–],ÿ²Ú6LÅ൳iNÎdøÚgûøÈÝ­(¹cg7ý‡òèo\ÂèÈôœ7 /~|þ\7FÉ‹Š%€Õz”íИdy~óWî…É®ÁssXv–ÙT†™XÞØW|Þq}ƒ|¡ #ì?>‘!0±\?)S_Çüä?~â&¸0 ‰4S±¹v©@ˆ†`¬Éµ· ³¤ªdþ¿2‡ƒëúY/ëÅ0àwõFf†§q DZ˜Ne˜œu±*º¾´Õ"„C©‹9™GéPQ׸qïuùŒ‚ {‚Á g.\à‹_þrSEÀø™3|í‰'¬NXx­i÷Ýuךº–™8üú·Ç¸¤#ˆ®(MG)® áþ+“ä,àú'áÍ ?Îðןíåæ÷¶Ç#ÉÁ/ýœï øÅË4Όϒɦðì djOE—ÉZs«J³Ä•ôýŠÁmqy£ØyÉî¼*@ÎÎâ¹6®ë²lâi_ Uƒëúgokl›>÷rŽAÓDi:¦î»ÿCóÝÿ©4œŸ!žI3³ÈXóá _°™ìÎRê²)íóÅöʧ(^ ÷Þu5[»023¯„œª\YâþWª9@?ÿáË™LdÁsñ<—Œm“LÛd­’ %‡¤i~q§F²ïéa®é áx~ôOØ(FÿÏsÿÏÂÙÑr¹,3‰4±Šé Ïó›õø™æ^ÿÎ%¦•ª<gþÚßùÔ{MûnŸœë’²üëRpŽ›­Û"ÚÈ6s¶m/p·,êerÚŸPÁ÷Ü~{™`! "à¾üeN8аS8~ð ò•¯H&1òÆ¿šÈd2|à½ï]S/5¿¾o˜]¢ñ74®AoÔOõ«JÖWŠ¿ÁØ4ì?âwîrKÿR>ùñkx÷Ñò‹—k­ýI¬Š•zòÿ¦|  ²Ý<–gLâÆëvÃÔ\{ÛñÈälr¹rÑVøQÀTƒÝë|"C8`’-¸ÿ£~u¿Êeu¶ #ã0:3Šíäˆg,fãsÓ¥«%Œ&¯s W €’àÍRçårz÷-7]–ß3<Ò–SôÌ,å±Zöˆ]SO¦uÂôô´‡_¸i´L€a• µ=»vqÏ­·’µ¬’ º ñ'_ý*O<ú(çN-ùP’cc|ç›ßä+ßøéLfÑ‘¿çyäl›+/½”kרüÿ³?9ºé»þ•†R~%½®N_—TYɤҘÅÓpä¬ÍÇ/Ï}<´&ÚeÇ%½<öGràÿü@í_š÷à.ý{•Mé5f`%»wmõ‹ (Ðpñ…†íÎí»r*¢‘ÉvöÿÄ¢;ŸC"ë¨yîÿÒý¦2pnt+3‹m[̦2Ì&˜g]×O4:KÓxsÚ΋&ôoT,ß,¶ž¥ï# CFMÃC‘s=l§< “«Û’ }i»b@𶽩ëåaÇ`šÜyóÍ;q‚±©©â(|±ý†‚Ažåž{ùe®Ø½›¼÷FvlÛÊà† ‹Fç'FF8òÚkbþüórù“>´%‚åú“è}%¹ÿK±ž‚SN°³xŽE6ç{b‰½Y‘uÕø©Š….aq6G•÷}Ï˯ÜX"‘0 ùÅ©”ÒPš6OX+onEB=ˆhï§ÆŠ²\!`èz™Û¾f´|2íšé|o¿öÊ+ùð]wñýgž!T2*/=Þj‚ à”~at”ó##8®[¬Ú§)?¡ÍBÉ}Ú¶çy8ŽCOW?ûñ¯¹N÷ÇO¼NW8è?Œ4MÓèt…½sÅJJ׳ì„®üìmoÂÝ[\î»Ý\sí³Ü;¹O¾rê¤4`¸ ÍæY€ç”ަ´ò¼óúÿÒÓWòì3„MM3|÷¿á'ÿ‰”¸ÿ mLg9\©Ÿå¤cb:¶cO[Ä’þc¢T48®?³Ñ\À+”oRåuJÚÍqapS¦ „C(Ýo#S×ç2E–4ÎR™Ä´/Mp]wѬ{K^!°”ïJׅ燮‡ ñàp÷>@:›-[m‡Qþ9MÓ0 C×1tß°)Ž-X¬Ý<àá½gw} ’š´ù«×ÒôÌ¢û? Dƒa?9MéLM¥ÕPÀLÞž´ù7®Í¢HõbÛ.J›+Ó[ÞIç¿Tjy£É…˜žu@¡ôJ÷Å]ÀÐýû^µ~Ñ]Â}Opcw\!ú?ZâþÏÿ¸žŸòöá[t>ûÑ­LL$ðì ®m1›Î09›#“™{ÌxùQqÀ€ç_k|›ÍÌÙ¹ÆÑ55'>JÛ-¯UP÷µ™0Ñ5ÿ¾3u³š¨°®H6{«°bKumnhY’ì:èÁw|àfnzÏ{ÈZÖ¼Tõðz }µï8ŽƒçyüìƒrõLüóÏ?~ 0PÊ@)Mé î°IW”yuÐK—Béšo¸Þƒuƒb×%rœ™¥_/ŸªR•íWÒ …uåf|2 FM i&¦®cº^]Ì94²þÓƒ\>ú¿7¢èŒÌwÿ;ù¤Q·¿~ö¡;!žÂu,\Ç"“Ë2“Ȫ’h4h4'P)À˜óùR8—¤,(^¯ð2ÄÒø”fÃð=á€Q¥ûYJ €aÙ¬ˆ•d)†¿®Ãæm[ùìÏ}ŠßuÙ¬UV’·Ú±V{]ëç*¿SšÈv~æ#áÆ[n]“×ùÛOŸf°ÓÍü×ókÿ#AU þ›7W\xÐäK·ž†OÝ×b9~WÇ™«'_¬ _‘ r)@3nµó#Ièé@ÓƒhºIÀ0‰µrCãÍÈm›†d#|öÅ4ZÁýïÎEÿGªDÿ'3°=ïTëì‹Ðµ<ǰr3I5@å¸Åõ`¦ µ \_75UîÅ™K_BWtéû¹0–aK_Ó`ÝÑ€ï)íKd"„†Q“XêCCÓÀ0+²ËÌeÙÐC!>zï}|ä®»Hg2Ø%ÓÍùäòë>r÷ÝÜô¾÷-MŠ·8Éñ ùJŒˆáG‰£4tM#ÐéUäj¯tý矊#3ð¾!—H÷škž¥ß3s­TL\œï¯’ ÂWJ IDAT°Y«~øò[º:0Ìšn2M"!ŽWEÔÙŽ_éq¹|ë™>ÐÂEÃö]!£<ú¿$™ÎøLy â}ÛF†“ÉbšÜx&ËÔ¬¿Êʧ<ü¤Sdt< %K 1E±”o,×]Z€^¿{a’«: ‚†IG˜âÔL¡‰KÐÕ"„Æ?ÔËxzù0[¯út@(ÈGî½_~øaúº»ÉXVI2ŽÆü=Ï#cYtutð+Ÿúyî½ï¾5Wð§Àät4ßýO~©X@× ¢á*îÿ’æÒ4ÈXðÎ$üÒ]òȩʜ „ºÀâ5'`2eÒî h†0Ñ I4´ðÜu: [û—¿ß“c‘¼û¥ÑÑèÈ»ÿËÌ$àýï™ûî/=|3Œ%ðœ,®“#™õ§²Ùù}1h¼ð\·l  ,PÉÓÎõ–±u±¹· à ÒV-²e;`ÊÀºÂkù¬º®//» R —çÚ,›p1BAn½õV~åSŸâÆk®AÁEW,e䟳mlÇá¶÷¾—_ÿô§ÙsõUÁŠk‹×NC`.翦é ƒH@ŸsÿÏk/ÿi ¦°w¼ç¹qË©| à\.€ò6,ÜñÐÓ`édáïjôF;CÍý:"sy¸*“ÎLÅ¡™žœ“?…óÐ4ËU„9÷¥ÅLeaKgùû×^¹ &Rxù候ü4@,Y.@ ó㯟§ÁÌeq,,™ÔªTrR@ßÛê³ ‚݃a”f2Ф§³$Óf~V®ÙYÿöe`ûr®™od&À‚áÔ5‘ñqq©9: ÝŸ Èå“a˧•øÃ”Ƕ;ùÜæÍ¼sæ ÿüâ‹;y’t6CÀ øuë+òToµ%~®ë’Íå0t[¶ðá»ïæ²Ë.ƒ`²2nkoýèú;Cþè_ÓÑ5¿ìo4ègþ+]ŽTfÎòÆìÜ4|æF¹i/zß•õÃüïâÿ*AƒøÂWƹ¦¯‡Á®(EÐ4éï‚h¸z΂[}Ó†åí÷è\×ë»ÿsžFÈ,–þ-;G3p÷•åßt|îS›øÛŸfЫ˜p&Cy¯TI»%sm·Ééä\)`EÕe€ÊË×LðXÒóáï^‚ΨâÝI€a²­ß¿.¥©†OAçR*Ê-×¶4µ°ëºär½cŠÎË}€…óuf-«äNPswœ‡¿HÙ0صg»¶oçÜð0o¾ý6‡çÌÈ™l¥†®cæÅHµ<Žë’³í¢Ñ¿öò+¸òÒKÙ¼qŠ“|æKgWBb$ÁWÅÙ¾©£8ÿoê:‘€Ag´JÕ¿PHä8„;öÊM[‰¦æþç ‰ZÄR(ÕØ€éIxú´É;{ˆe`ƶˆôwù3n¥·ká¨:‹àé£IúÂAl×ϽÑÑŠÑÿe‹\˜ŽÁû«xn¾n _9ð6[#ÙbÀLÂŶ5JSx¸ž_WàÜ8llÐ}‘´J¦ü ÀjSN> ÞD¨§ÎÀÉ1¿=ÆÒŠMÝ›æ»ÿñüÛ›ë?šfg½¹Ñ{é“¥Âaÿ.ÈYs©°ŠO+5—‚Ëq@7غ};[wìàŽ|€ÑñqffcLLMqvøçFFÈær$R)<Ï£3<"á0‘PˆË.¹„«.½,oôóÃ"7ŸßS)Ê º¬5^<ð&äüÈ4 MitHÐ Zàòæ_š:LÆ}÷¿ Ë}UÉäL(4LÞëT2\ôªdþkä2À/|Ãáý—öÐéó lîƒÎhÞW¸Ò•ò“ñhË~Øðõ·sܺ!JÊÕ™FU÷¿ÂwÿoîªÄ#Üöþ+à?ôðœËb:ž&žŒÒo–‡ ÒÿÜ]~Xž™ÌKУòõêux&“𻣠aùÇ~Ùf*¡4T–;—ö ¬,•!²Åç%ˆHRžöë¹Ìó6¨æ*¨èÁ ›·mcóöüg]7›Åq]2™,á`†ÒußÀ£ü}Ãyów»iÔ/íیə4t™/ü£”†©k }n8ó/Ÿ–Oß02 ?{týjŒ–©J¦Ÿ(û]xÝ(ð¿ vPg真€D¶tæþÅÝÿ#Óðð2 \þóK)¢º‘wÿ+úƒ½%îÿb]1¸ó²êÛ¹üšlÝ©pì ®“%“Ë2›ÊHFé롬sj ¦R»v™¬¯þ3Xy½ò˜º˜šÏü œJB¿ &\1Û‡üМ]~ÃÍ$àÖÝK;íK¢=Û›¿Æ© JóÖ:§‰øwD:=Wq£Ô @…([HíF ѳj¿ª¸ƒóÛ5ŒüÓjíóÊkÃt :ß@ P@ùëÄKÓ‘2wÙŒ¼+7–‚›®¶&.Ò푃ßÉÂþÞŠÃ5[a<ïNBwvùkÖ‹£ÿŠÑx.ŸŒgï2K\<¹œ+:ØžŸü§'¢sÿ—U?ta67]¹ð¶î»ª‹'ßÌÐãXØNŽXÚÏà8å+rݧ¾0–˜ TÌÏ¿^Fãƒlþóðå7üsßlBW.„«v@W²¹ùÓÙ8\ùÒÎA@û2Ñ–Ï7UÍWŠªŒâÙ¨i€Þá‹;—_wSíûÞâû¨ËVþÄö:1þ1‹=RŒèÓ”†¡iŒ¹¥±^AÏå³ÿ%ÁÌ¿ Ý”·)ZIYÙÊ®¯/u¶É¯ýþÓ˰«v÷Á™IùËävú9냥]»â–˜MÀ¶å®ÿ·àÏß´¸s0BÚÕ™:ýùà¶ŠsK[°1 ú"£öÃ×ñW/ý„®¨¿ ‘É21›% Ò™;ÇõÏíÕ·àÚÝ,›BÍ¿iTùu+™ÈÚð?ÿ¥„8ž,?G׃·cp$ ›tH¸pIÂ:lŒÀžA¸t ôvB:S>QÊoŸžK AÐÞOަâ8]p¬k±DÂF¤x5#<ÏPù™*g¯)ß`çøÿÙ{ï I®ûÎóóÒ”m?Ýãg03˜p†ðtàZ’%ÊîÉQŽ¢ CÁ•vcÚ“B{qw{ÜÞ^¬DyJ:Þmˆµ¢r$" ’ aC±ÝÓ®|º÷î—Y•™eºª»zÐCÖ/¢fª3_f½|ùÞûùïF£U©DÑÙ%ÐÜÜú"­?÷½ÅɼkeþÛKì=0Þ4ÿ›†vä³4óÕŒ*7Û„ªoÚ |÷ÆHn©TA èûÅUøúsZ¸ª¥rÞ\YÒÂWd¿¸¢ÏÇ.è×pKAçŒ_ZÕÂĶ"ìÛs“$ÿÒëÁé+ðž fs<úÕ EÓB _jóÿTÊüºÿK%8q¤÷ýÞöæÛáò#¨½,°K©Ú V×@üa2—êpð¦ÑZZc¡5§/18ÙØ°&(gÛ'5“¢õ4õÃÌÂ&C1#ÖÐÌ¿˜é"Lujœ)ô²d«­uššxéüÜ ؈\‡?|ÅåÁ¹ %ÈYÚü_È'S…Ðè‘;ÇÀê#{ä§ßy„Ïø\3°ÔpX\•ìÙi$äö _•yعA/¬ã½¾( 0Û°cl›¦­ÎC§m1J^r(•ô4Íþ±± $¼p~öÛ£GÀKó×¥ߦP< p˜–€®ÃÐ9ú6tT«"+‡eWù¬—.ϯÀDXþW˜!°ÃR±qœøf @ÊPvà–½£qìE1Ý¿;P,³õ¦°{–&]“ñ- 3:ÖÂÿ­P¶µÃwø:°,žD“6ÿû\Z€ ápâιÀùZ™\Óüo0‹þOog¥ÜÙgnûëϣf]”Ô逸R@>/_ܸßk@@)7†!`µ”ôßG`JqŠþ–ªƒ0–jwölÏ4xÓ½¹ =ÂH¸qɹa{Þ1 0šîiÆ>¬6tÎk²¿÷ÌúƒÐÉs× k6Çφv"}4ÃK\fÆFãØ‚è*ƒ†K&“ý-m2ír<Ž¥p=­aú~+¥°#@W¨‘/­À×N¹üî»2„!þø¿\ãÎñ 2Â軉ý')áò<ЧõèÞûŽÃî¿G†Õ?„®/&Í4àJiãïÎ0DÌu#’Ó˜ÀQkôÏ´÷'-Œ)®Â3§*üѯn|a€]_Š—4ë¤ÁÃ&0ÿu¦Žˆ WK¡Ÿ³õÎLC`šFËWÓ›‡ÂcE ÄÄh»Ñç.ÕÙ=5Ýü[—•%ር<¯]“섟Þ2}>Ò.ÛùU¬-æÿÍ“>ß·Ïç7m̦ªðGaôC ²¶ÉÌsíæß×ùí÷ëóæøå»¦øÔÉ:–ïàzN3pç\ªCI¸R<6äÎX,y²Í>Gi€±Ë*:ß@m‰¹<¿Xâ?ýø8»‡`Y #êHB<Ïcøn†xÏhk[‹‰w:¶Ž6ñ] Z¥¶°@­Ñ Z«±R*Åj× ¦''Éf2lŸƒbA«´¹Ükþ^®7R‘O©úíOn¦¦pˆ¡×9ÀAÿ^ i³•Ø–EžW´O˜ùùí ¸Ç¹èöqA!u¿ €åUxþL€ß¨òoÿ‡×p~äk«¡ù?³Y‹™1mÕHo3åœs‹Ã›^¿›¿øúiò]°ÒpX){x¾M6ö`w~öïYÿóÌ—<@×1 ŽQ‘µÖØ÷>¬›—+pþ <ò%~óm9î½{8 j$ܸlöH¹IåÔ:bÖÍüE3¼Ø¿pç^~™¥ÕU¾ù œ¾tI?gXµÐ ~—J1Q,2žÏ“Ëf¹çÖ[¹ýèQ¶ïÜ 33ß“l©ä È¥6%Ѧ=¦c¢ôÀ™•ÝFÔ╟æk1ÿØ5j-`¡Ø—èw]®^ƒ—/ºéòÖÙ<Ž2šæÿ&öL`ñmþã€ùí³7Írd‡OÙ«#×w)Õ”«86¶– /^wl䙚¾.‰¶1$úd—Mt>ô³û¾Nñ[*̯TyéZ ?øøONó®··ôH¸±é†Ó­®.."ë5Œb!µ¡ ‘ù›\—Å—ÏðO_ú~ó›ä2&bp¿ÝÊþv;—±m2@©Vã<ÂßéKÜ{ü8?pâ‡}÷Õ©DÂ4;5ež”9:þZ¤„É`wJŒ]²®|ú|·z ‰€¿>-ñ ÐŒ§Þ€kËpqÁáäµ*/—\>ý¾î»8,⑯-ƒi£„I D3ú?›.ýV¶»i¬kËpóñ‡yî«^ Ï«Sn8”ªš±¦a TÄ:={_žw›®F—€@©óP© $R**Œ×Pú˜Rx~€ã8^@Õõ¹VøÖŠÇoÞ‘åßÿÄnöþv?Ft]I*…” #a'órn—ø§Çå“>ŠTŠ\&3£_뜲¶RŠ/?ó ßxñE~èÄ Þö–·À¶ï"Ô›J/\j°sr²9ÞñÔ²æLU¬kV°0>zRsFµ ZãH,¾"vAºñå%îË Ñæÿé‚­KÿšíÖòÅ|¯à¿,®Â·ÎÀ©+ðüUX¨ÁãËàÌÜÅž™»ðÊU¼ÊeJ ‡…å*E íCRã)œ_€›ö­ï™ÆâñBc‘g! \W¯ÓÏÌ÷.ÃWçáë.:’OÀ[£f 8”ƒœ EÆvϦ p¡RÕ±¼ñß²Mxâåõ yS4ß]§:Ñw_ .•«db AŽT4”âZ t4WCAÞ)ù··åù±¶ñàƒ›g4n\J… Ÿ\×íÉ׿ñ©%×ËüáÜ·žåƒý×”j5òÙlê'7®ùw;'„ —ÉpþêU~ÿ¯þŠwŸ8Á­÷ßÙ\ý•‰_U3p…jKSƒ”ƪ´Póoì!ØT*78·ä±·Ç²Ž f‡e³´çƒX ™ ™Œ¾%¥ÂÀVýÝ$”223û4n2Y0±LÁ=G'™ž°¹ëØ6 9‹Ì4×FÀK5 NTLüF¢®X]˜‚z0ÿý5åZŒeÅbwfžÜ\û?×ížYÛæÊâ"ð±ñ¾Zûz(Õon¸¨¼(%u©e%Q!#ñƒäF—xµa`“a|÷ÆGƒ¤çC3@,fJ©¼ø°½aÀÌ|õ…eVBt™HŽnš•IÿAdn}ξR\ó×êLŇççßµ“ìÜæLÎe‘»Ç²H4¼öTÁf¼ØÁüjÿeü,ì3à–1È[šÑO†Œ~<¯™}1…¬®Ïe‡÷2hÁ;u¨I]D'ÂGˆS A˜ÐX…Ü YŽžJq6cïM)ðø™7™¼ã;·ä 7.Õ€Æ Ùóf êùwµèÅwöÙgùƒ}ŒR½†mš}3óõjþ½îiùl–üÊW¸ãÈQr‡†;O'A†­-ä2ܱ=˳%‰RJI¤ÒAÚÌ™¥Âêfßeq‘C_"Y ¸S`4ÔRi¦)¬—K‹B„–™Ö<ìL‚kbÅ•à(ÈÂoËòî{'yãíSLîݼzþ"üÉI7ÏðBðŸé‚A!Û.äøVªphLiF?ž×L¾Ó¹û¶Õªsà…•¿!£wÿ%s{ôMªÐ ð|ß}w´Rb €©/ñü†Þª4Ft])üÀÇBµ¯–A­†Aõü«|øï>M©VÅîSóßìs†,¬¬ð{ù+þÝÏü,¹ƒõ®´¦eƒ-'øAÈì•l~´)¹Ý× É (aÀª‡­¶S~½VÞ¾K–“ËšX½Jáÿ]÷×4¸½hphÜ`ï”ÅÞ?ÍÜt†ÃûƘÜw}@­}òZhþ·0˜ÎèÒ¿Ùø »~d?LM„Œ>䯞¯§žÓ€ZÐÒèƒ ¶”âõ”þŒ —˃?W½á&Þ__ QÀ¦ÜÂ%[FÀˆ®+]+•¨Öjä"[ñ A€ñ¯†K‹üÙÇÿ–óóóäÂ`¼ALüÚ/*ñƒ „`5L<X¦‰ešZãêSÈÚ6¯ÎÏó™Çã'vîÐ(‚ý<‰“¼¶i°}†J¤õK )%ì<3„öÁâ3:ÍITÛ¦£õãdmR>±ßæ|ã6&Æ2a;…!³SY¼‹b¼˜¡˜·Élg¿6séO,q×X– ŒþŸ*XL„ÑÿéDZ¼Ôs]­ÕG}¤Æ'2Ñ;t¢× @JXuÃ9:7\-×ÁS1×M(’÷$F€݈´倭¦ãOõ†ÌZK $_øòWxæäIŠ1ˆÞµ´ÏÃ4 íÚÅÑýû+Ø57G1—×V¡}²ÕFKó ¼zõ 8??¯ñ,«/! —ÉðèÓOqû‘üî-oIÕÎíó™“[_Û×M%Ó`ªhH…Æ()QJáù% „Ñé7¡‰×„ÕE]zvD)ŠçK6_lwè>…6)¿ñ(|ß[lùÇóàONù¼q[ƒŒi2U0)ä:Ìp¥3êNg—RbÚQ£¤6˜œ<‡ °7†ëƒCˆdj,-TÃíS[÷€—6• !ð}s²"ó¿ê'èö6¦ÁÒ©S|æË_ê[óWJáú>¶eñCo~3¯¿åvoßN&ŸOb×&FWpôÈ$n£ÎÉóçyâ[ÏñÔ+/cÑt9ô2–Ågœ×½Ec¬ë™»ŒÃfÏÛbï\ÕËÌ) e€'9¦Õ2ÿÇ¢ÿUϽ§ë®± ï@ã\\Ã\&eä+4*Ò)„yÿ[ø}€—ÊÀ5!ÄîÍÊׂ)%ưîZ¡Ëƒûý…€j…Ï<þEV«Õ&œo/Í?)yÛëïä»îäÀž=`YÉÂÛ±zèÌï™|žãÇŽñºƒyéS|îk_ãä¥KMk@7!À2MÎ\¹Â·_ú6ÇÞò@gÛîZÏÜw±á» òßñ¡ ¤’>žïSw[EV¢Ý.Q·^êáÈÃwæakÆ@¿¶To¸Í,€PÓµßIK–rk•Åé_]æõÅ,’°ôo>þ£úšÉœXkÏé~Ø^š‡· p»ùÅJ¢‹ˆuÕ—l’ä2ÅèÞØtc"­7ýÿ*) ôsL®œ?Ï#O?MÖNÖòŒ BÑ÷Èÿ³=ÄO?ü0öïσA‡ß[)"Q>0ì ·?οùÉŸäûßðœXÅÄ´ ý±,ýÆ7 Ri @úûùÐëX§{«»°>ºåà,Ô]mú—>Rúøãù¸^‡½56\~ Sµj£…Ú‰Jå8ª§¥ë,$– 0y$þºW$zÊ'giíß6 & &ùLÓQuû¨Á? Ž,’÷þ¨à- °ñF€ ž½KpÀ¶ñ­ú–FÀˆ®÷„‹ äz®Zº38)yæ;ßY“é‚Öü•R¼çíoçÄÝ÷`ÙvŒñÛÖ`þéc$S(ò<З`™&/ž?ÏÕÓ§iæ õÍìé=>H(¸yï\ˆ  d€’~àãúA :hªJqålXtÑe«FÔNfç¸õn¯)J]Ûêôè7"ó¿‰Ä`<£Íÿ™L˲±Ö4b€O|Œdë„Y®§ëÔêúï8R×$8­ÿçÐâžLa4½ˆñZgÁ·Œ\#º®TuªµÛÒPÀ°¶¥Û0¨_ºÄ¿<û,¹˜öß)@†‘DïùWšù È9ãâ™q_zÌùÚ« 1€ 0²YÞýÖ·¢”âŸ|²Ù§ŽÁ‡JñµçŸç‡‹…2°©Ô=ž`ÏŽivÌ”Œ„Ÿ@ú¸¾ã¶†¨ £^ãÂô$Ô¬ÌÃÔÁÑüOP·h7hó%Ç/¹€O~m…;ŠY¤ÐÑÿ“y›ñ¼®Â§és!CŽ,G±ÊxQú\ÄÈ£¹Íz!àO¨4Óý¨àŽRøRÑóí.°{G²¾r n>Úßó-®Ôcï®eþOp d;LóV¢‘pã’DgXßPH‰ãºI1ú‹|yòëœ[X ØêW)EÃuùñoãÄÝwǘÌNgá'¥)™Š²êVHŒL–wÝų'O²°ºª³h2–Åé+'¬] IDATK¡^ƒ| ”|½´f`?cÛí~Z­/r|Úä…Z Á€¤ \ß§ÚPaµ@Ü?úê¸úøÎ)8½wR“6éø§3PbÑoÐ¥s=ȹèñ§§}î›)"›Ñÿùlû³ùœ~V+N¢2^ •vß…°ÆR†ÿ‡ßƒÔߊöïºM«èŽ’’‰\†mvÌ&‹wÀ’îª}ØÅ«u/ ÔÔ¬!HT\4ÃôÆ­J#à¥ååe5==½pcn|$³š´WªÕxîÔiòÿ’›JÀ‘Ý»yðž{0L#„¥3´I2›M xµU°‰wÒm‡!Îz²;á0µm?òÖ·ò§÷wM Ý?C^ºp• ™:rdí(¨ô³%HpßHS€mqÓ¶ ®zìʆ€ÀÅñѡDž¹ xì,Ü}:}Dáü€¸c:*µL··©º,›-F}s a˜Le,¦‹!ö¿H‚Fy>\Y®ñò%½•EpÅš‰·Rw;ýß'“]¡Í ½RMêyë盬tµ°À_«Ÿ‚ž1+¡×w jÁ oU 76mj* çyÈͰ_©ni€©'‹“J…r½†±:_ o»óNÆŠ½ËX!ã7„†§KŒ^'ów¸)Û°lBA ðÛÝRrËþ›8°c¯.,tÐpœ0Ax@íü5!E~ôÄÍ|ø[/¡ ~hpq}—jÃ¥îh ÚãÖ€@A£SSð‰Î[™Ù ϵE(‘H@u|ørë—“øÄ×W¹-ÄþÂd2o1^Ðæÿ´k£Z‡Ë+uk5mŒ ë¸ êRQ•Šº Ñ uÍܤ! úªv$w¾„£“Ÿ8·Â^QÅÈŒÑpó,—ëTkù¡”ÚµòÌ9¸· á­ø !’–tj쎴 #Zc2'Š’eÛT™^š¨æ$g.]äÂâ"ÙOÔÇèo?8¼s'÷?Þbü"fêW2Y¾a‚ïéreiæ­ ;Vä÷ÞËŸ}ö³ DÁxÿ¤R\]\d§¼Ô¸ˆ ƒÃûg¡æ‚ô’€ãRoÀäXl¾Ä†  R‡™iíõxî4Ü>š$¥ËHL5·ê¶2 ¶vTyã¼ÃŸñ¹wZ›ÿmSûÿ#óBA–pq Î,-2©ªÔ}Åñ)]Ëcû˜ÉdÞÀ6a÷ŒTŠÓ6¶%(æL¦Æìp]Áì”vN-2¶‰e òy-•Ö«Uþõo}•'—³¬,~àRª;”ª:>¥µF5jås—áÞ>žóòb-B €Ñ9 0g¹­û¾FÀM7Xm¹Øj‹{_Ú¿?àÛgÎXVWóÝó¸ëȲcã±5óoÞo@—Cü˜`‡*F£‹ì‰\’»v1U(PïPF9Ê8}é¯üçÕ ÁÁ=³¼åÍKŽ!}TàøÚ PªùÌI«U 5…†Voè®ý³ðϧàöã@qcÎÞ¡ÑübIk®M7@TP*µ\bËFªXÉå-H=u a˜HaP°M¦bæÿ8wl¸°Ã†oü‡ÌLíÑçBÆm„H{á÷uΗülž‡îšáÿ~™ü˜Kx”¥ŠOX1«„’PWôU»BÿÞ´B&·9ßgK'kÒolºñcúIuó=PŠJ½ÞVê7ýÝ6MÞp츮*ŒuäÓ÷:†¶äBwBüœ”LMNqdÏž0Ú¸Ýzbó+Ë­Pæ~S!_Ë”¶Mòî»gYl8 H¡à²R©'ñRAj~ÕL`Å€«çÑ;b·ÔÄÄ02”e %XIð¦„W*5.Blý€O|}•[‹vhþ×à?ÅøOü/–á­‡fŽLÀ\QÆlýÉšzl,Ñ}-öón½y;,Õ¾ƒôj®ÃR¹N=UKÕÀUpöt{XND8¤„ýX¦‚d$ŒhÓè†Ë®¶ C×—×èÅtƒFƒsW¯bI5 Îdý àØž=ÌìØÑ›±oäƒÒÁ„™,-—BxÎ0Ø77‡‹›ˆRA Õäð¿‚‚erìÀ ”C ðƒã9Tå*í+±"uË%ýý¦9ø§—Wôù^øž šñ©]+gÔÏÔøÐÙ€œe!…mLæ3£ÿ¥„Õ Üu0| U›ìw^ÊÔ§Ûz…ûn?“8(éáú.¥Zƒj#5Î!,ðÉ>Ôªó u&LÑ|_Q‰â´p6™eK¹n úÈG>b¢åÉñC‡y¿ù›¿iœ:uŠ«W¯6ÛŒcYÃy­qæ5,jø>K««­EÛy$a—“ß÷©5DWó¿Üvà ®¼—^ÀÔßï1ËÔjï%"‚g'§ ·NqÕFC«öÜÅ»™YM“{ŽíÃ.~¸(é!×kPuV*>Û¦¬Ä&¯h™ª+umØ1_½Õ ‚â †ÁÐí‡SÇŠö×tƒ‘Jã¬QÕ.rlU ÀcO/6±ÿy»ý¡ùO&w ûºî}¾ã¸é$Õnú¦]¼çpžÏ^n0h7@©î°\‚mS$Šø˜ .÷\éŠLdÃÍøb•ŒÞÒ0Š3æØú-Q¨ ÌÅÖõvtÅnÂkfiÁRï ÿWá5…°].ÖnöÌ™3ò×~íצËå2ËËË,,,pùòe^}õUNŸ>=¡À÷}ísæ„3 ”Tíªb´pU['‘PwÝÄæ™Žþw}Ÿ‰Ba ábX$4¬™ï·†” üU[£¿›;Ä>ë¾]ÛøÙ[r|øŒÃnÛÓˆ€¾CÍi°Xª²«1I1•ï=aÀJ &Æ`×6ø›gá};MÈt™[ëÙ0·’p° Lõñ»M¸H$¶æKû²P[ÕàÃ'Ÿ,q¼C‰$ö¿e¶#E.–áíû<(˜­:Q¼Î°)Ÿå'¼™þÉIÆ ߥê8¬Vêø~¾™Æ ša_v qr{»ßÒÉ7fíé›QõÆà LøÀnŸ››û¡½{÷î(‹†eYJJ9'¥ìȘi1ï­øO „ ×K§"64ï´ÏÛ²,fff˜™™áðáÃA€ëºÔjµ¡BˆM¨Ø- u>Úí%u§A¹^O&ê$ì›Ó÷PrSÿdx¶®Lˆ'›Ï”IiGkÅVz2ÙÔIÀ±üôKÈüFà!}ÇmPª7(U´×òâÃTª@ÃÛá‹×àÒ)Áîc2‰ÄØO_Ú¹†Î× qŠ_}^ñ|Að_~ž>RUMNt`þ¤¦\°E«ËÕΖùй€»§Í0úßd2oSȶb¢¹ ”ªpß!4Ó¿yòo½û0TžÓn€À¥ºê -4]VhXàW—àH7À‡ÅŠ"Û'[/«ù¾$Œe¥ÞÈôòË/ßqîܹÿôÒK/±{÷nvïÞÍøø8cccØ)8Ú>ÌåmÀßéë5¹«”¶™ÍfÉårë ¦¦¦Ú˜Õ¦Tì ”")QA‹‘÷ªº`ÅÈü¯âÉ8ëåø}iµ0H•"ŸÍ`¦Â¸}V7šKš ƒî<ĉ}/óbÃÅ´µ+Àó¡ Îìt^çzKqÛñ`yöì„ã{á¯_„ßÜgCÑ …€^L{€yµ¦LСQÛ¡u ><õeÉýšÁÌ,}~éñIºzÉÛJi^2¶ÓÊ{f)ÿ±P o™LE«ZdŒ"óÿøŽë׿Ù3¦$®ç`†ñ++µ¥ Œ%çBÆ„—¯Á‘n7s}ª"âÔ¬(‹3ÙÒî©‘°Ö"â’ëº,..2??ÏÓO?mÛìÝ»—;v°k×.8@¡PÀ `d*,*JÓqßðý.‹]­yn-æ1ž\.G>ŸgÛ¶m>|úÔ«Õ*¥R‰••Ξ=ËG?úQ¦§§7P;1Á&.*&(˜z®NjÆ4‡èèCP0£<"ÝO×ÕàIÝùZƒhû]Û Æg'ùþ×Oóø#veŠÛt,•kTªy¦'[m†Ñí®­Àä잆 ‹ð¹'ï|£® `Øð¹~ÎCÂß\Vüý£Š?}ÞàîƒýC¿.®ÔÚ´CQ›þÆÄÞj»¶£øä7ʼ®˜ Kÿjí¢ åãôÒ_¬À;özP¼Žªñöþ—‡öñ[_(³·à"JÃeµê³KZ ,xq Þ½‚våtÚ¿b/¬› ªŠ9Џ±Éý’#“¹RŠsçÎqúôi”RMËÀÞ½{¹ùæ›Ù¾};Ùl˲šÌ`PŠ´ÝøßÚôú ‘)ßó<J)LÓ ƒW ÃàÒ¥KüË¿ü Õjµëo ‹T¿˜¦’ª9Lþñï†Zû¾®‘RÉŠÕF=æ¯U‰1”R2–Íj“úÐú7͹2´»ã¡ûðÛÿð T 7Q¸8nr½ÎåÅcÅ\Ó ïh+ÀÕ8¸nÝÿíØQ4¹ãž.V€¾ûµBNq >ôÁ?\1xã(daq•Ь­º»8Tën¢`4†ÑÙ•(7»…¨z¶ÄŸŸ¸kJkÿ–Ñÿé_®Â½×ZÀoÛóMä´ƒ Ü0°F½1A±Ðêg \_…|'@J¤Št„p–áÙ’@ØÑ‘°ž¹$¦i65þk×®qåʾúÕ¯R,Ù¹s'{öìáöÛoçØ±cd2-_Q§{­õ½Ÿk»õ3N^X¶¶“@bš&•J¥Mkíf…ØðäëKК¼B%Y¼q! ŸÉhüõÖ°MSÇ’K×®Ehämýô¥Ô.ŠN»âzÇQlÖ©¶!¦Âëîá½·¿Àÿ{®Á.+ \|¯A¥QãZ©ÊÎjŽé‰Î…î°RÖ³3pâ0ü÷Spd{žü¾HÑ£›Á軜cóa”OíeÁÿþÏ—ëSçæaaè­þ5ã"Õ­VHzz†DY[-¯ü‹Ï.5±ÿ%&yÛdªht7ÿgabûõïço?ˆ˜z廨ÀÅõ\Ê5‡ZŠ…V»øÕe8zS‡U|uÙcº9´ò!Dò½IÛ ?@ Ø GûÀHmÛ‹E._¾ÌO<ÁþáríÚ5lÛn éO¤!|l<ð.ýwÛk^#î :}¢º~-›‘h §Ñ_>{ä:QŠœ¡˜É¶õ'þwÅqtž}´[^/0Ñ®ÔëX†Ù±Ÿ¾”ܶÿ&]_`]¿%×ßGÙç±nÇ s¼À{<€*U‘a@• ê*«µ—Ízëª $Ì/j„À›æ`f;üî¡v®¢KN·ìñü²ŸgðžÝΣÀPPU|ãqƒ_ý¤A½wì/€³ó°PŠñý¶œuÕÑýÅèb@©;ÐL+[/0ΰåâªÏ'¿Yá–B%L„a0™Óæÿ(ú?þ³ËUxÃ^÷úšÿC²÷nçŽpý:*pð}—JÃ¥\m… EÛ€'^¥s½U¥(ÆðHšY¢À´ù¾úút™‡éÏZ˜=Û'ÛŽ€µià<8!™LÛ¶Û¢Öa¨ƒ0êA)}MÜű™$€ÕJem>%Qaœƒ’ Ë4È…A—Ý„)%Õzí5B̓FµÆw.^ŒÁ‚&ûéú>ÓccÃcàÃämÃùñöûó¾;²\ujÈ ô|¿A¥^eaµL¹š4WÇ!tøùK:ƒòu{`b~û1¨+ö! ø ÄÞÍS‚¿ø´Å~JpËM°o–+ðÊeX©ÁL1D³Moঠaùë,qúf*}@å\‰?U’3-$–a¶°ÿd{©`©Gwøz.­W@Qëüä2ÜË ‹åÒw —R£ÁR¹…fÙ| = MbÁ-ù¨öoˆd"‘¼Ç1k“.:2m¹Nf?ÃïÐv$¬M ¬qÏu]êõú†öf qÊårìÛ·oó€NÑð]6.ZvMO%rìÓÏïóËË×b7ܹ_½z•‹ËËsÿ¬e±on®¿ zØÚþ0t—5^à'Oì×V_[ßÁqë”ju.]«áyí›v“© í XXÔH¯w‚â4üÎãP??¦™-rŒ~B€T½'Ÿÿç ïý¸É“a [>á\ˆ·vÍ¡«]'mUH¹úRjdš'êêrÞ±ì&l ð¾;2 Ùýƒâ‹Ï.ƒÐæ% r–ÉTÑ$—iï¿çÁ¸‚=Û×X‡rÏz×…aðƒƒz£™èø.åZƒZ#)|ù`Âòbøó¼JSÕ–^h„.Rž½¦ @¨–}>Ó˜}§öÚŽbúä[ë¹HJ‰×¶¶C¿vý¶äžñöq úºP¿1±6ÈX”aìEúy-àk7£ß¢Ë )yþì™¶`ŨŸ 8²};ãssÚ¾æ=éSŸ7$ Yxo¿ïf~åŽWùóÓ5v[9„Ìj+@£ÊÂj–ÉÅ<»·· R?þwq^›‰wÌÁ›ŽÂ“§à·‡Ÿ?:Î=·×!ë…q¢¿ç]ó\çLŸ!£­œyÉà÷Ÿ°9Àm{a²•\]º«µþS°sN_¼Il#îcÐAÕM#)vrå, «:߻ۭ…Zÿ–Ö¤O@ÉáSOW9ZÈÐ¥§¢è3õ¾”ë`Kòa îÐãÖÚO öï£X ðüVàâûËÕ:/ž6xÝIf&[Û‡iÂWÏÂ÷”1é@â{M䢿PBƵ TXì1*gÜo¿Õ:žu¸€Ø×‘`mlR çfYºµí$ôºo:a¨ µ_Üýð»iìÛ6›ÀÙO÷ß4 Î^½Òg±ášÿZo=‹NÒu ŠÙ\+`³ÍõƒhJr€ß ƒ,í‰"ï÷-Ш£ü*,´Òpj,W+\¼¶B¥š¨˜ÜF~ç/kK@1 ÷†í;à7¾ ûbžàòDgk@_–€µ´ýã`H¨Céå öwY>ðXîݯAb®,k­_JØ7£Ýc9p°c ŠÖþ-%qÜ YR6Úf„ Y¡.mÁ„²c?V‹5Mþr0·A[Ü‹¢|®¬Íÿ!ö¿eLämr™Ø4§%ï_^…·ður¼ZúÐë#»}Ö°lŸæwÞ¶ƒ…ZÆ\]]áÅ‹WøÆKó,­¶Ê[ÀU]»"æ_W Ëh¦Æ’K»åèö˜ýåzÌþÝ,# @?Tê´`}û&Ã0úÎÕï—¹oFÛná¤í†SÛ,]@x¢v!øžmÛºjØB2¦Éé+W¡^‡|~cV€æ%¯ÎÏsqeEãtxŽïsÛþýM:Üß§»e¢cü ÇS AÀ]GvòÞ[^âÿ9Ue·™E˜6oS­WX´3\˜Ïr$WÀŽ3RPí¡tö¢Þ£¶Ï¡`Ãßœ…Ï]‚_;>ɽ°­¡o Dïþ&ú¼–¥ ìE¤í+ jRºšá£O™|äU88÷ìÓQá«5ýQæÆaf¬ÊÓp¡ÚÐ2æó‰ÔM^ÀåÅJ ˆžd†a ›¯R¨µŒ:ݬÓÁ®—¦«ù(¾ø­ý/LËd"g’íÝçù:Vâ ‡"ØluýÓÍðÀí{ážCM¹^•jàbXY^¹ª‡{í`zBÏÉe \3awB«Öž›Ï‰ý(<&ä#wTt²×;ÚH{ÕÖn$¬M5 ±ž ƒ  \.¯ý ·ˆvt³¤óÛ!m*ëÀ0 Ý'¥PR279™L †¼pù/]bÏÍ7oR*`¦Òpxêä+m¨Œñ¾Ù¦Év~îøÛn4}дÀ÷±ÆóüÏ?w''ÿi¾íÖÈ›6°p…I©ZæŠm3^̳{NçJÇÍÁ­S3‡s—õ°lŸ…ã7ÁÔ<{ÞÿM¸çùï¿-Ç}}˜¬‚%cÂ@&½Ý#F(•TMV¯äøÒi“:ÏÕaç8Ü·2–6ó/„5œ&sšñO5 ´ïƒëµÜùJÁLÈ´|ÆÝµhBÿuNÿm«i”Mm.›'F¾A“¢f‡€’˧ž©q$4ÿc˜Läl&‹`ÛÉ).”kp$ï2¹Ci)æz›ÿ›ÓXptß,Ô.Ö}v[u,S—¸–2àå+©$÷ÛÅÌø^¸·îŠæœ¤áøáÜÓfíZ±9H˜È…1$mîšAý ×ô×v$l"õcˆ3‰×R°,‹©©).\¸Ðÿ’[‡UÀ‚ÅR) íëGJ2Y,²}lŒùJ%4 tðµ+ÅÙ«W{ƒ0Õ¾^2§^=Ïç_x¡iþO{ %·ìØÁÄìlªJázûµÁ¶=ïÑÇqÃÐ?àÐÁüú;vòž^f{(âáÖY©V¸°a¢0ÃÄxl#J B3ÒóWô+›½³0ž‡]“ðÂexß“pÛ³ïØ1É;ÁMÛ\˜ªA&f WqÛBºï„ÁsáV-V¯j¦ÿ÷gàñ2LgàÀ8Ü>¡™»ã‡¿‚ñ,ÌLÃdA#ñ) FXïT ßxš^·}¹››®Ãéø°5-Röž´ªËA-ç<”ÏWø‹ ’Û'5ø ÝJÿ^^…¿É‹™ÿ¯·úR°óøA¾óoçSO\å¿>Yá|ÅbÇXެåãHŸ.º¸žÇ›oßÏì,\¬Â­¾v{ JÕLß4ˆÅºÄ*„ë Çq³û U]Þã/{@+ÀHØBôZ 2àØØØ†ú®×Cï>Y†ëyýo±v9Ûfÿ¶Y.®®6MíégËZ_~éۼ宻tµ¾½z2Z!Àuyê•“H)©2HJŽÃ½‡n†lVï BôõSƒt«w‡`H7-­‚Ÿ~ûq^<_æýZ•ÝÓ„aãÕ†ÅbÙæÔ%‹Ã{&Kjµ‰½(^½•š¨›(Àí`ç4Y€Ó×à/.À:;E†ŸÚáî:ènï4ìšò ïµ÷Û±p“ŠcòÍó°âÀã—à «úÚ› p÷,d-Uwõk² ˜ÊÃT&ò!¯ÒE¢òˆÔðDû|Tß¾ÛKmºznçÉæJ )d$íe×£á«5.ïrO©øâs«Mð%4øÏxÞ"c'1Ž"7ÏJÞp(¬×ˆùGB¢„¬ÅÑûò[·îâ—ߵ§¿|‘ÿù%®–m&ÆòLe<^¼ì>'î:ÄËãðЊ S~ #|l¸^Àù+&A ñü€@)–\u0ò½÷ñBaöCj;Ö¦ë ⸙BÀõêsàD(å€hŸ´M“{n¾™/Ÿ|%fœË0xåêU–¯]cz÷îÌíÝ÷Œî3CpéìYþî™§ÉZfhñÏiÇp!“!gÛÌÇxàøñdpcß¶ê]!¦Ÿþv=ÞåÞýoZ|Ègø¥‡òÔùoñO«5vÚà “•ªÂ4ß¼gœ±B2(P¤ö*?€ùe-ì˜ÕÖ€Ó03®ƒí-À¥UX¨ÂßÎÃ/Âirî±löeì„»U*¸èÂŰM8`Ô ·NèÂ/¶ÙbT¶¡óø§òZÉgôy2~×kYöãBL”½§ˆÌô±¤}ÑaQ^¤húBÚ‘.;¿‚Î>å jøªÏƒB@ÉãSÏÖ9œÏ‡ÑÿÙæÿÐÃR©‡æÿírHæµ®SmÌÖ2Ùvp¿´g’~Ó Ÿûæþﯬð¹ù:ó—\·Á·§¼œa|Ê 5û0&|gŽïóÒÅkÔ]©RH©øFCñoŸe,1àsU0Y¥2p Ø=è…BÇicRkïù›ççDBl(5°»U O`˜Z¥ÑI)Ù=3CƲzV,9O|ûE~`çÎÍA@>“á?þèQÈeÉg²ä2 ¬dšdlr9Èe[nA2´ízªüîoéXÉCÛùõ‡öðÙ½JòÉ&W¬T „a`‚ƒ»ÆšB@|¿Šÿ’jNË0=cZ˜ƒCuP¶T†«%X®AÇz‹ø1þh ±ŽÚs c‚-´voš¹çm­ýea<ùlh Z ©ÕÁõÛ7 ý[%‡(aæŽçôÅíĪýé[ÐÖÝ_{Oz_þ8°¥óþâ¢â¶ ­ýÛ¦ÉxÎjaÿÇ~EI¸\‚ŸØ¢ÿm•J˜†¡_f 31fÍ𞛦ùñ·UxâùþúË‹üñÉWëu¾\vø¥›rïíûYX®‡½Ž‘ZªVY÷IG*¥X– *Cæ@æû€oVƒÇ¨· ýѺ¹`µZíÖ{ßœ€AiµÚA{èo0’†’’¹‰ îØ½‡§/¼ŠÂ'§Ç!oY<òâ‹¿Ùè|/&íz\\¬3e÷‰~O¥M$Ä=HqLàôbuiøk ÑË(y|ê[ n.䛀ãY›©"dbéRé¥QÍÿSsÆ@TýöoˆdÙ üVPGþP>Ãñ»vó‡gø7'yþl¤>ß?Îã¿a17•gÏD¡€! vLN’µm,Ó¤Íê Œ¶ÝRmM4¸~fE `CtÁ1BÇ*ô²çn–`hÇYC@³ãè.kñÞ‡oÁ/ó ÿß*{ #…Ô\ ‹"y¾Ï¡=Œéèè$H «Uý±MÍpƋڻb[𩛆ÆÀnÝ2 šhèµÀñ4ão¸šéGštAëH§ì:ÇÕÊ•å*çWjÜ<–‹AǦ$…ØØR‘5’7©ê€ÑUÑwÙËÐepCÂAs1Âê«Uþò’â¶ „ÆþŸ*ØH ®‚/¾àù^ Y ,>pÌÙ"æÿ.ŒÓ0!c„æž ÕG 2»s7ÇîÓÚüÌám¼õ€G§ dX[¸=þc >÷ ! ¾ßHXƒ>÷¹Ï©w¾ó ë¹VA©TêèGßl?7Á£›Oß¶mæææp‡|>Ïf‘! ú_q Z)¤R옚âÝ÷Þ–à á8³Y͈ҋAÊö¼>ƒHûï•ʨñA[í‡eux­„zœ‹ ²?õà!{ñ)þòl™=Zð… Žžƒ~àKɾ¹)¶Mµä$‘ÚHU"o¾5„‘¶_m$5z+ :u5e¶¦²'“÷îæŽˆŒLýQJ˜_v¹ºZåÛ«.–ôùÝ»<02òôÓê|§'‹IÆÓ%U,ûO®ƒ‘öó–î5P|ñ…²Öü… aôÝiðÜ™eêžßŒÕ‘¡ ·¨2Üÿ° ›ÀüדK߃¢bh¾ŸØs´»ñ);S°±èžõÓmÝ÷ûÜj8íF@´.±Ù0Œ®µôûžv?è½;7 ×u7U0…`~eUKÛÍꃽ|í&ôh,ѪŸny^+°§}%vÞ;úŽ}KŒlÆÃTé`«°­‰-ì>‚ê¶òñžçR®€@‘ËòÛÿúfìOŸåOO—Ù>Ù‹5BA.’ºãr“·íÓf³~|‚÷° Dß›Å[BŸsÝiïžHM©nûeüšNIvQÜX­ Ë «U®V|ó|ÿo~ìïýì*Û'•P¸(JJán°TcçÌ8³SZ›oKìaHw#zÝç}»E¼gýœO.–K0¿Ra©ÒàÛRðÁ[Þ÷–€â\hŽH˜ÿ;±lÿM´…Ì÷5ôh„VäPÖÌça»EX2¹G€aÏ]lýà?+jüå%Ø3fqÉq©{U-ÈË$'P`*0·ØŠ_š5ø•û (ˆëgúÆïF³èU‚Á§ªbšáùØ‹¯ýö{˜'×¥R# OZØÌ›oU!@çy›4¨ú\ú¼i˜HßëÙR†çkgð†òæÃäå^ƒi&pº«mô‰CÐã77õ8½…¼Æ0ô¸ø~“ÚÅ,¿ðöƒÁ)~éW¡ ÙWÐïÞSŠŠ’¸¾GÝqX­ÖY­L°s[ޱB² Llt×´ ¤‡]ôÛQÝã S¿¯ã–V «UVk ®Ö<ž¯¼w»ä·Nø?¨tôŸìÀìÒwÑ …Ô—_õñ|‰ºJ©ðI6kóŽƒÓë÷¥¯% t%Ýß§O×ø‰9ÅÁÉ;Ç$sã‚©‚`ºh03¦Ó:Æó…¬A1k-ša@½ûÛOâæm¾ÝÏYVKó7ŒÎï1“YãÙ6hè·nH_A”ímF@T]ÏEƒäÑ¿ÖBÀzέÑ¡„Ñç½Ãäb…JLSÚµçjdtøÁµ˜z¿ý^SÃVÉ ¶-Ãì×!¬uM'!Ú4#µUµxßC‡¸ãÀ5þ·ÏÌó©Ež1žj v/ð©{.5×a©\`çôS6żø‹†s`«ý ñXÇ(+ Rƒ•ŠÃj­ÁjÝe¥áñL#`·|ä ?t§dl[8N: ¼Ï2×F3ì_Dz¸ÏùÅe«Ê( AŠR ¹oBÆ‚ÚvœÎ0” ßwÿßwOLt>¥Art«MÈg¶¬«ËCØ»â¼1nÂ,¾7ôáµëK ÐçGÀ&’a¬¬¬àû>–µöPo¶°e2™ ÿ ´:ú.Š£sÍ ¡¸ZÏ«šjš7·+©‘·Y¨¯Óí¿31YG$Å]Ý)r}BÝ®a0!‚ƒ‹rñ„ÛäžÛwò3lÿÌ%þìt Š>û³y” P2CM¸¾OÝq(×3LóLO™( a5åh<6$ ˆ¤_tãhäºrÍ¥\s¨8å†KÅõù–#H>x<àGï”ìÝ­43Œÿ:2‹.ãíú,Õt$yvUw]ê¨XƋ“°"%)ÁS¸µec]„çARÉ$7Ù‹¥SküX4éù9àV1ÀC­óþ©ª6ï÷†Ìì;ÑHèóU¬'~=þõ×J0 ƒ©©©ë2˜‚XXsb&wW¯MÛÆT´Â½ÓMœ¤z ˜wß“‚6Ÿaüÿø˜È0(ð›ylëRsjáÿ ÅjµÆR­ÊÑ»Øwøp¬(ùz³_=î—>—B 0PÜ|pš¾¯À??~|•O.xLòLdòÚ éS÷=2u‹•Z««eŠÙ,Óc& 9ò9éo[!-IôöØ~)CÙ¤áhMßõ TkPs\ªŽGÝó©¹>5_òmWïüÎM¿ú&É]‘¹Ÿ †?,Œn:ð*ì¬ëñÊ’Ë%/t›¨Œ*ÅmÅÁ¼^¯s9Ø–‡c‚mcð†ƒ&˜v5lhn®šV­Èö~£«µâzìÚƒ>`÷aø>1ú>ÛnÀÔßíüHè.\OðœaGü·6AeY]ýú×ãM!(7êÚ±ÚwÀÉ»ÖuŒÞ÷ʮ҅ywC‰LâÑGç…ŒÜq¨†pÑ+µ¥zÇ÷pƒ€•Z•zŠãP÷<Pv]¾ MĦ!4#ó}~é¾ûÙ—¨‚¸^†.ºäœ"Pœ@‘)Ú¼ó»¹ÿÈ?õÔ"¿ÿD•¯”§Áj­N©^§áiæ²R¯±\«Qq]ÍÈ”]‡†ïk%RÊf!!ÃhÏ1BdÃø;B †Ç¢òv׊ŠÕÝíg<¢ã0Æßéœ )ÄÆŸœÉóSÿjo=^åS__æÿzºÌ©š‹™Ë²7“A6Ò° ϰ¨{.fÝÄ4 ,ScÐ[†mšØ–º‚DâõE-Cà@êàº@*<)qý]*ÅJ ¸âIŠ÷ïí¥‘3™Ø|‘©üþ.S±åÇ:šÄ>î€þ[à­üÿ¾êõŸéÖÙÄdÓ• ?/RQ𑯦MP¹ŽA~Ãp¬‹É÷yM¿mûi×w›äù‘°‰$„ V«¦inºÐoûnL½Óq×u7!]Pµ6´a¦¹‰nšyªm¤‘CS+¯‡Œ<×÷©4¬Ök¬Öë8ž,×j,×kT‡ZˆïPv]ê¾®-ÕÜ›ÓLÜ0¯XŸ2¦Ùq\û ØL×@hþß1X)†(ÓM€!Ÿ OZéPqìh®îÞUä?ç'ßäðÍÓ>ñLÏ^mpѳ±sYöØ6Ê´ „‰oèêsCˆðÃH¢èÑ¡²žvŒ„AuJ¡ÐLÁÓ©ïß.yèf¥™þœ€\ølqS|¾¡ÖOa11۾úÛLhbÇ-Nn½Ñµ¹DšuÄœ0m±j“º5ÌûªÍ»nØmû2ó÷h»~$ôG•õh†aP¯× bˆqƒš÷£k†…Ø}LLL\¿íUÛƒË75¼p³‘Jk"aåéûÔ]ª›b䵑ÇLëKµ ¨º.U×£ì:ÔÃÂG:I!JAL#_‹¡wªb8”6Ñ¿q¦2PŠ#C>ÿ½(ÈáVÓï=P`Àì\އçr<ôú€W¯5xúlƒÏ¾Xãñk&ß©Z²Õ¶Ùi›ä  DÿëA"ùðúXŠz€.üb)~h\±c\ñða¸ÿ `ÿ¬€|l~Ê.kÎHÁ *ÙCêº;·ÐûßP:XÀºÿ™š…½ï=´½ª3òv¿c2Ô=fƒ¿1¨p°)Œ~ƒmÖ8?ú£kCŸ››ì·žö ³®Åý˜ýjûJñÂÉ“œ¹¶@¥á°\¹RT=ªëRrêß܇d¨ñYiFÞA#Ï®S#߆>hcþ‘¿½W†lžÆßí\`¥“ðZDÆ`ÿžû÷øá{–«——}Î,ø¼t¥ÁsóŠo¬Ââ´g¶ÌÍÐMÌ€üà$lËÂLÞ´ß`v Í öÌX&‹ª©¤¦ŸÖh#ÈcËêà"ê¥íÓ;®e-¸XßX·FýÛú¾1ÄŽ¯W@x-}?íÖq~$ôG›N¶…€ë·{åÕ†o þÏ¿ø"_8{†¼i&´ó8åÌä´NA/FÛ/ãÝL?v¬ÉZ%㓘ö4þŽ«b !Z>s?Hú‘Ós#ªñ1˜ÉÌlËpëaøA©Pޤ\—xªNs¼ÕwË€¹ Ë:o=“Nk˜áÃ6¦™4÷wµ²tÜqÛã"2Œd”|7zǃ¶¨­² ¨¡7ìórµë_+~?í6& Œ€×z=¬ƒ©ë½a}Á[B h2ª^šjçë,CP´,¬XA? z=Œv«3ýŽÇ”ì(9lk¬-\Ðã½ZfÓu£‹ªt@ÏKçî…$2‚‰¬¶uºw§Ê>]ìÓÝ Óگݱ÷[öÖŒY0º^×-Æ Ç}<}cl–C|°õhÿëÒü×h¿Q Ÿßéñ# ?š_ï…¥R‰F£Ñ³ÀÎõ ôz!A Ý’ :µ1¨ÎŒ+cš:ýmÄô“×ÅÛ‚+×˰ûÐø»âñ¦®ít}T*ØÚ‹¯è‡£'qtS±æ®¹6]\à"Œ7°Hª—ÖßmcP0èÆäÔš7èëô– µî“¸ÿ™öz®ˆQ÷Ófç;Ü$ôGκçblÓ^ rw³…€õP$ “’éj1¿f”¿ÁT>ß Ðû^aúÑÜ BS¿ ³ ¢q° OJ̤¥kñÁ5¬ý2óŽxÖ¸¶pM¥Y6k²‡!ø=™zÅ$K÷6qS»•®%Ñ!’]uxˆ~5þµù A„ë8½¹Â&›Ôw(‚Á×lŠ@°N¡a`$\Ҙ窯vÀuóóǯ½žñW+j ‡b6G·JãêDzm,oD¦¯ˆ¥¤É$CB`…q 9Ëb< Ì,Ø6ÅL†©\ŽÉ|žb&Ëxø}çø8¹L†ñB!Y…n½ÿ¦ t· B—™ª¬R }—:ü¦YÉ1búÐæ6XãïãL×·îã!Öµ\·ˆ/`Ø™C´†©ùw›[kÜg@Í?¢‘°É$¥DJ9¨Îõ ö‹®B099yÝÖ¾júªû¨ØTµå@txxí˜~¤•Ç»T-†þÿ³÷æÑ–÷}ß§ºû®o™}Á,;ˆ•$‚!R$‡¤HQ¥$^E‘e+‰ãsbÙ99'ñINü“s¬Ø'9IÙò.ÛÇ6iÓ-R’ )‘’ H¬$ˆÌ Ì`–·Üµ»ù£»ïíîÛKuß¾÷½ÞÂy˜÷º~õ«ê¥êû­_ýêW¦ÿÓ²,–j5–ëuš–…iìl¶ØÑj²Üh°Üh²Úl²ÔhЬÕhÕë4kÞv3Ë~c¦”ásšÁ†u‰Eh˛՗µë4Îíͱ ˆwÊ\ yt:[\qø@€Èñþ³2B€o†w $|k:à®C ÒÊæêr3Óíhÿ—áì¿ôÌ?CV{Ö®+#Så-€^rÊìt:t»ÝâßþŒœÓâÌ3Ô±_iŒ$Xü =öp0Š’×õðÌôÃfv þõ¯1@_®ÕYª{ ¾³ÕBv¶Z,7ê©€^3MLÃô‚ª&FÐ':kü0ÜXðåTÞú1+ŠAŠäÈ/ ôš'øÀxËÜh+9x—f ˆ;󥌳*g Îö¼²ºz2u¦*Û¾iV;¦™ý%¥€>EnZ2  öñ¾6þuAôÒ¼#—ŠT±À1…¾ëmêPÍ` ã-Mi&ñ,(£cQsœ“þúxfîÅð&†–2F€¾£Ñ mÕXi4Xi4ØÙjaÍš­Õb©^§U¯ÓªÕhø€ÌÎñc D}|DÁ½TpÅMAÝŒ%ƒDMôú"ù¥dbÏ(S.l HXÓWY£¥J×u]ŠÎø‹Õvïß2'52…)X¦* O¹(Uæëç-€~š>VÖœ}Û“ ‡­%x73–õoWÄ‹çî¹ãƒ»© j†š¡/‡fè;›-ßÜÞ­§7ë5Úõ:uËâ•óç¹û†Xi¶B ¬&v¥I¤CùËЉ#•U ’‹4Y¯*Ч N|»ñÏf·'éËM Y³$‰úKʤÊ1 ºE>S>¥ŽÔ‘! \ ôËi–¶i¿¯X°üì*/"+ÅuÍìKå“¢$0b'Þ•t`ê%2fþáp8:Ë Ò‘ ~¢Yª%@FŽm®¸ÔM“c««ìðgç ¯4¬6[( ˜Ükuš5‹šia™¦abúæö´cž=}šß|ú)~ê¶Ûøéûî§Y«¼íÇŸ KÂéöBôü˜´î ì«R&ô1EÁIn\‰æŒ?±º@># O“I¹”«/S6E^«\NYmiÝäZØÓ§Ùß+/Rv7D3ÿÒrÓšùc*È[½ÔºŒ#…k§Á`0áPЃr³,3¯PÀŽŽíLž6Aˆø (Ÿx×»øä=÷ŒLî£C`Tô@µDÇqÜs»R`*ƒ—οÉo=ýÇás/¿Œ>uï}#: '?–Q`5P±FwTüQ˜{5yäj¡Y}"P$¿´L¬©2 rEe3åsÊi•ÕБ¨o⫹¶“̨@ÙXEˆA•„ O¦p~5y  —:@¯Ô÷/‚ràÇV, d•Í VTez§ßg³ßc§0Žþ>cá "´ÃáXº ý?þkp!íÎ ¥8uñÿú»Ï²6R7 ,à³/¿ Ÿº÷^Zµ:®¸ZcRÒl´ËLB­ y®«ÙGÛÓíO7±S×tÀ: „§z™ºîl¾Ì@JÔ¿L. î*=+ñÛÓ4\‘úR{DÕE¤dy) _Rv&d@S¡¼ÅÀöè"s^(›_e² rLˆZþÓ•ôí‚&òìyx’)Þ4ïllðÏ¿óm~på ÉFMÓ䳯¼Œ+Âo»ý+«þsжeD>T(\­(Ç“@ÝßâÞ{ù5áZÒIx¿ºÖ¬=aá>+f@_’ $ d*õb‰Y«¬Lò…õM“Š.TÜ™A¡²ä`V¤  À²€žW¿èé\€'Ã0´À·ŒÓÞ5ãñ?‘b¡kG_f0ù2Bx¦ŸÝ=U‚:j1”b£×ãsßý./\ºDÓ÷sÅFÀ#ÿþ¯ðsçø‹?ÌŒŸ{äЖÐþr !ášJnQxýB%täR`EJä§éO¼”!£[W¢\QÙ ùÄö&fj`!äŸñ¬_ô:ËÌ“T"’+\È'dÊdæöIy P¨ÇO¶m³¾¾žÿYÏÑ/ ¯ ñk3±ŒŽ® G[Kò ‹Z&fúº !c³»€¡ ¶Í“?ø_=szþIï£išœÙXç>ý4õ±Ç8tð`ì4¸@WñýîÕ™™kÎÚóòu‰Baý::Rô$Ê¥è+*›'Ÿ:P&¼»¬á¡HQÓö'Íþ>U52ç¢2¥¾Y€|B¦T 3+«@ "° zi¸*ZPÇy-ÛlÛŸmÛ8ŽS½â¸ † Û‰¯õXE‚ÈxÁzÞ ß›Ékéj| ¾ðþå‹/PóÍþYÁ…¦É©uþ¯?þõýsðàŸÀÄ:š`—ó‚@_e~¤þL©Ù|YÏìR/Ù12ËÆÅ´òÅõ:V5EUÌ “WØ)Y¾$Ðg}7Ed¦!Uç%\_ýäΫ¢yø$ÕÑn·YYY‰Ž+3 Þa@dœÝèn„ÀÉðãä« mFÜI.Åû.œ/ÂK§_ç_¼ðü(ª_Ö³ žmË4ym}ÿó¿É_~ø}ݿߋ#Ÿè…?+0×ê ¾°ŽÄ åå&Ú•#›(¯YN·lVù$¡Âݨ`™ºÌ© 2¥>)XN4eE_&S®,hû…óô‰À‚lÓ4+¿€´¨yA¨Ýj÷û'§Žc³ÙïM€ðG;òÖSÔk¡í‰iŽsi.øá¨=žY€×Ïãïü韰>R Yh²" ×Z¦ÉÉõuþç¯?É/Ü~Ÿ¾ÿ~¨ÕsîæBtuGòKÖ¯£c*¹ÙÄ|Yp×vÑÄå*fýR¸ŠªTW4‚UX¿”(/åäeÖ22«@Ñ¥…@¡äRòH`Ã0è÷Ë&<_€n¹­p$tC{¼ Õ[/%ªNÄINMvö4pT.\à?ó —ƒ‘ÇÚ³H#uË8øO_züô}÷ù$ÀMnoªCЮifõºD ¤~]pÌT•¿·!Ð’×(3ÑöŒ²©åS„´»U‰þ77WùVékPvY RRP!²åKÎü ^_tâÄ 9~üø…²å777GÎtóôö×-—%73rÌþ]I“û,€ÓÈ3ýõu~óé§øÞåK´bÿág¿ï¤k oIàŸ¼ô"ˆø$ :¯¢Y{^~ÒÎ"@Ÿ¨_GG†ž @Í jŠÌúË‚».°Kf‘œŒjCßVÑ en…(¿fŸQ ò™¿T('Ó‘-"  ŸJwÁ<Ó²Ög½E[]×½`Ð/‹$d›xŽÝ¿ýì3|çâÅø‡ŸQðž„ñÎ+ÇB€üòKüô=÷B½–Û 2€èšæçÕ¯¥#¬g ¹Ôz5dóDb™´r9]\woxnW+Ù·$P̸=RR—”h‡Tô:2R¶UÍî3òBË•  ŸJõÜ´ãwË‚yšNÝrñ³ âmµ,+ø"‚ëº8Vº0tÆ{¸oåZ2øÄ| †Cþà¯ð»§_Où×:ŽÃO<Èéõ Îv;4 #Ó €¶iòO_y™³kküÜ]wqpÿÿÌúR“ Ä3ÊŸ¨?GÇ(; \uA¾È,¾ À÷¼@.ºË™: LV¥½Õuú*+ëÛS×]†Hõ„`Z™Ì13£lj¹e2®/€~ºP¥²²`”†@¤å5›MŽ=Ê©S§æ0FH†`Æy¢jÑm„O¾ò2ïùïSW*e8ú6›Ÿ:r”?wßœ[»Êÿ÷Ýg9×íN€ø;P@Ë08qî N®]åדºS IDAT~„ƒû÷G· –!•ç'Èúd "Rä‹|Î K©årÊ'êH¹Xfy@«äµeæTó™L¡·Ìì_¶H6wT– ”´”üxZý´Y¦Rеµµ‰#bÇïd¾Ö€¼”ÖÎʇ–4ÿXUГ€Ξ៽ô"5»_ÚÇqx÷®Ý|êö;h×jܶg/¿öÀƒ#Ð4ÍñÖÔw°dš¼¶¹Áß}ú)~ý¡G8¸o_4ÎÁ<€~”=k /Ü9úRe ÈGÄ‹€z kô¯²GÒ¦1e»øV’†igF ¶ÁÌ¿ê¼"×%úr`ÆÉ0ŒÔÀÆï©ü:}Ѳ3‹ìW YJ!AÀ€pdÎø³@ %_)Nž?Ïÿñí§Y³mj3ø¾ërÇÊ ¿rÿ\^Æu@qÇž½üwïyˆ¯¿~ŠÿxöŒ·|ã$Ø2L^ÛØàï~û)~ý¡‡9¸w_´3FÀ3\«è¼g—¢£P]r ƒO!BÍø”ï;$T™9Ê% Ú4çï¹%™A¦ EÆ-]Y¹<Éó•(êå¦üøõ(ðIU¿~wó_ÈjÇ,SO„ËÍX$À³¿÷t’ÇÙ¸µ@)Þºx‘ô½ïry8m÷KòøwD¨)ÅrÇܰ²‚㸾 ÁÅM;wòŸ.ÝCÓ4ùÜë§hù–€4¥”0hcƒ¿ûôÓüì-·òرcþÉnwV‡Ve¾YÈÔ®+EW¢¾²ZòËè †‘âú‘.QÐIUò¶’0Ìuæ_@¾ Bæ¹å+$]_ýt¶ 8†QÈ‹~+—’¬³ØhDj"`˜úd€aÐÝØà7ŸýÏ]¹B+Á“?¸/WüwÜɽû÷#¡åñ]–eñé;îD€/=CÏuifowÀÙn‡¿ý½ïòº>}÷»’I@¼óçyda=‰ºFÿ›N6m R:ŽwUÍúuðTÜ/¶åqÀRm»¦™\h¸æÃÌÕkè)KÊäÍèú‚è'·Œ@)ÅÕ«W±mËÒ{Üó\—³,‹;vpöìÙÈõápX½e@vD:–JcÓò•Bz=~ûûßãéK—hçxüo:¿tëm|ð¦›1Ix·âÅrÅ¥eY|æÎ»¸ß>þá ÏóF¯G3ç Ï/àŸ¼úCñH@:xV@‘É{†èו)lTÕŸîUÌúˆܭ ?”©¿ÌsšGš ÜKuÿ:2áÜ”d ¬\^ÝIòºßí4Ä kМTXù„¿Xý[ªl[Y]EÊÍ“T=»ÏÊK#œE®gÈ.€~ÚØ ç¹YY¶"p¬ãPÀÁi~e‰€ÀÏW^ý!ÿïK/FÖüarfÞu]Þ³c'?}ëí¬ÔëÔ”Bù~Çô;QàŠpÇî=ü×÷ÞÏ—Nä›/Ð mL‹Ø6 ~óÕrãÊ ÞtsÔ÷œûËñªdˆª®9 ›`J.D 4Ú£U¾€Ž¼öJ*ñ×jû“öÅÕ+´»"×m—¶Œ”+¿U€Ÿ{}±P&],Ýý§ÚYYÒÂàÎ%E|žÁY–B¾î þé_ÁÊ9ݯﺬ7ø³wÞÅÁ¥%LeÁ‹¢n˜$@<ßÛwïæðÊ ^ý!Ÿ=ó:-ÃôN9Lyî °ôl;eûã<^“ L_BPtÖ¯S&ˆ‹€º˜gÒR{â¯Û2UéØQ!³©_W„ +¿ê¼~\vAôSéH€ÝnÇqF'íÍ{}?«ìÖY|ó"¦ ÀQå+ƒ½ý¿ñܳ\©g8ç9xfü¿p×Ýܲs'`f ¼0ꆉí8Ø)AŠD)Z–ÅOßz"¿9sš–axË )D@ÂG »þÁAyVÔ/¯ˆ è‘,¹}™½¢ˆlF[J•+£#é;«`x˜g׊€€Æ!>•ÔE¹zJ)Ю}^þL?öG©%€Éë 0ãdNg"¼îVú$]O;¯@)…ã8•ZL¥è‡žù?Ñ è“ò•ÁùKïð^xžKƒÍ„uÿ‘i°]—¿tûÜ»oŒcý'˜³-ÓÄpI‘|'>×'Ÿ¾õ6ö6›üÞÙ3œëõR#ŽÊº!ËG&ˆÇ,#¥e@ ÈEÆ“"²:e4Êe–ÍÓ‘¢ 4`O{¦}ÕI*("T/%ë¯Ú̯óަû„ü2y•_Ï–]€­êžSμ«ž¹»öíÛG¯×£ÕjòòM XëõÆ»ŠÌøGJ 676ø{ß{Žg¯^¡mš™Ûò:®ËÏ:ÌãGŽP7 ¬ÑÌ?䃫Ã0 j"Ø®ËÄA¿!Ð4M>rÓÍ]Yå7_|sýÞÈ!î à-Äw?TôÈ@a¹¢²yòeËd j±‚ZÝ£è‰sjªìÙ &• •¨O¦l«T'_ìSd¦É¯ð#N7ËÏêo  ŸÞ®¼ßN¹w¿ Țɇ ‡Ã¨z‰@V戀 ê“Òëd|´¯ÓïñÛ/¾ÀSW.ÓÎØë°é8<ºk7?{ëm,™õ‰™¸ÃDÈ4 L¥8Ž7 T‘·õß9p×.~íî»ù­—_ât°M0Ö–µ~?ºô‘w¯SËÄ2KË•MpÊ”I.MR —Y(™½mSUN„eõ”ú ÙB`žp¡Pþ6™ý”]ýÔ/[0@·jI M×\Æ›ðzxä Í!Áv¿×^ãߟ{#w¯O\î\Zâ3F¸‚¦ÕAQ7 ¶ƒC €‘_À»vóßßÿ _;{†Ï¾q–v(ràH}Ø â ¤¤”LY¹˜@®lž¼Fr5áëp£ÙŸ¶p#M¹¥~™¾Î²:g5ûŸ !Ø.æþð˜4žd 0‡´¶¶F¿ß§Ýng®ÃÃÖ8Î?)ïKLŒ@‚"Þò¯½ÆÿýÃW¼µöŒg8a_­Î/Þz;‡—V°,ÓH¶:„ëˆt5ʬ›Cß0ÁBKÚm>}Ë­€ðÙ7Þ øŒÖýsˆOZ["íєɔ‹e!•ȧ –EféÈfV¢Þ)Å*ë3³¨_*ºÁ2‡"É´ò%IÁVÌþ%¯¿Ly½qðÿYýä”-Xäž­¶ÌÍ v†KœñÇ.ú!€¯lnðÛ'äîGúÌ?X³ÿ37ÝÌ={÷b Þºd[L qsÛ¡¨&†ë0tÝd€ÂQBË4ùôÍ·€ÀÏŸ§8†ï; ˜«$™rúŠêÍÓ=úSÜÓ€®¨§½.è/[Ʊ¥TV¥…¦! RÅ=I9¹R2šÀ•_FçL®§Ë.€~º€w$ðÒÌ»zÖ€¬ò–e1 &®+¥¨×ë‘ J)†Ãa¥÷§5Z¹×%‚^•mÇaݶ#{ýã÷+x‘þ~妛yü†ÃX@Í0y¸ç}N;Låé²ÅsŒªòœ]åíø¹[nåÁ={ù?|…ç;Pð#Ñðd  ¹¤ºóä¥,¸ë{Öloç¼if¹ó`՜ז¾’ϧ2 @ÚwRV® !(œ?°—)“®´œì‚K¥z»ëº…½ª9ï0 ƒ;w&¶¿Êd*¸Ôë‚ëÄz€šìVã5÷ŒÓø:ŽÃ/¼9JÝPÔTØé/4o× ÉíðŽ‹ƒÄÄ|€wÒཻ÷ð×îzë…ï3í|ˆ1‘T -A´å˜-!HÒ¯[.«lbOÔ™ìKevÌ,ÉŒš"‰Juåª&[øYyiõM}½AðÆÃ(6”BãN§C¯×+×ígl H“Ÿe2ñ¼ê#áöTøËM!NäľÉ{[wß±“Ÿ;v «õúh;Þ¨.ï!Ù@ŸI”¢n(úÎØ0.åŽëpÓîÝüOﺗ+ƒ¾¿ý‘tO«/ ä‹ÈU"«#Ÿ6Ú©ôA^‡d•OÕ•¥/­3\+>5%ï¯p±i–!Šú/ènϬÂÜ»˜•_YÞÈ€†ì‚è§ÐZE ±mj¥úè6‹PI’„N—EÄ¥cÛ¸"‰aw{"ÜÝjó‹·ÝÎŽzcä_VOÂ… àÍ %þõ†a0tÝ‘s` 2*nŽËM»vs!¿§J¹ d3åýÌ\pÏ` 9aüó…4ueê×­g&™aÁ²ñdFò2KÉ/_8oÖ Ÿv}a¨"u€ÞV6 *kÀ´ù•‰Ñú?¤‚«’ˆ|ßqq\w´­.ÜŽ¡û¬¿xì/-aÞ~IYôÏúà˜Öщ…¶ã`Õjþ!6çS3 Çe(nŒ"ÆØì¯˜ê¡”—¯ŠÌ$мY^OÏ€¹'Š_ÅL|–³y%€°ÌTímLÙø/ã¹ë8¸þìyäå·#p#üsGoäžÝ»1fhݤ>eaW¶"ÀÏ˯:¯ `Wr=´,º ú©t7w]7q+Ýv°ĉD£Ñ˜‡Úõ"’2€¨¨çŸëzf|h™;L“+¶RŠuÇág÷í磇SW eŒM÷*Dz0Q×XÀRŠÃ‡ Ä&Î ÇåÇ ¢¡ úâŒÅG‘‹ÎøuÛŸ#7!›Q¿Ž¼vÍr©e3º^‘5i­.R²méÒ̸}Ó’òeæi(_1èg啸<ÙÐOëÀEàP¥Ýw‹­qU§¤åC)Ï›_&ŽØ‰uØÐ zŒ·ÿ¹¾ÎMÇá‘å>}ä(+µ&íxIàœ F «šÒâ[ “tùY å9z–ƒ¤% ‚‘Ë“-`ÈÓ›+¯Y&±\²‰÷…ž>-Ý)BÛq€ÌIé´Û e†ò:Ä`Z™¼±° €gåIÖ’‹ÌæºmAŠ¥Râ ÿŒú,€Þ 5þ‡nú=\ÛñvHNwY'˜Ñÿ®Ë¡Z?ÓÍl·1#NYã¤×'9}R$JrIE€ˆ ¦úEC_f½•ÉêÈ'•Ñ-—V6ã;ÐÔ3?ý‚ýâºpœEè`)©§h9Ñ'U‚yƒ~VÞ,?v}AæÇaccc.^öy:æyàOZ Ú¦"~N¶ÛcŽxvþÒÍǸeuÃÏé/¬+‹TèÈÄŸ—RÞ,>I‡T©SWŸŽe#S6E>)|¨¶þõ¤–MªWCO¦¾”ÌY. Tš4¢Î¯a*ÝeH‚èËëŒaUÈHÞ3—ùäÍðú‚è'—’'í®P‘5’‰@–î¹Y&NŒuºª°œ¶¿zø(÷íÚ…%Ð4fÙ9¤bRf\_b»²®géš‹\QYMùTýºe"ò‰ãW€—øf¥2¡9u–é¬Â" 3.£;vÎôóòç ü y%®/€f:qâ„?~üÂܺ|E{î‹’‰ÕÕÕÈßJ)Ç™Éò‚ˆxàž×)B–Çuùøî=\' ¼3| N†\20ÇÐ_‹ ¨ôóµ#;ò@o ’(WTvZù˜ ÎCR]ZåSF/I)Tº»è®oW& sV+óÑ#U”‘ét—ÿ¤o¿h~:Ê‘€(˜Nœ8qøëÇÿcà·Ð$ó\F×–žÓÐõØ™í‘Ãñ2A^eèÊËÚ@HâKºútÛ“Í9«'“°!©òeˤ=¿±2¤ ©-…tj}œ×ï &ßû4ä¡LÙ"d¡4øO!W…ÌÕ¦_@ø °41ŽÄvh÷µ, ä%Ã0&œýÄ߇_¥ÀÛ¦kÛ´Ãu¥9ß…?ÜB Ÿ|©§ØùÓIy†"©;µ¾È}”Ò9­|ÞsÕ,§UVS°4)˜¢pŸºÊЭ˜óJƒÌ¸˜T 2P¼®l%:¥ÂzK•§'N¼üÒ£>ú7—––þ#8>þèK‚gÕ 0‘a‘­‰J)ƒ«««¬¯¯ämÛÆqœÊ‡"7¾ `„Wš€™Å瑆1±pDè‰Én(ËPc¹´Ó]I¯SàÞvÜ:còE–2å5Ÿkf9²)"ZzÒ¹©HA!ÓU“—7—T]T*Ð7ͱÇ2}™Jåg,«ÛÖ ¹¨0}ï{ßÛÍÎ;K[. ÜP Іo¤8À§Ëy¿8®àúg x÷.®•0¥*“бÄ#¶… # m‡¸\èõè8§;>¸o?­z-é¦2ž ÙòE¬ZòEÚ¤YVSDS(}°+c ¼’-N²EÅ¥"½2¥Ž ˆ@™2Eä+“-(·X˜]j4œ={–«W¯rôèQ–——½¡C)ºÝn%{éÃÖ€˜ Ùé]×Ŷm†Ã!›››¬­­±¾¾>ü‹/rîÜ9®\¹ÂùóçFŠFÓ4¹ÿþû¹|ù2kkk¤Y3ª§Â€tÀ;DDã¨Ü)?£3Iˆ tDØ´íX(àpÛêUŠ·67xöÊeÞ9×ïqªßãªãðÃအÀ#Í&Ù¿¼r¤&s‹‚Þ’HÒÀPZ¾@›ErÊ& `ªp%zz Í]·1m B*Ô/SêêÊÊ,Ê” •Èe Ú´aš&ëëëœ:uŠcÇŽÑn·1 cDŠ¤äƒŸ¨ƒ¶mcÛ6—/_¦ÛíòöÛosùòe.\¸À•+WX__çÍ7ßdcccƒ ÑhP«Õ0M¥ív;úYø†V«E£Ñ ÝnséÒ%z½ÞŒÆ+‰’Sït¿Í$nh9FyÕÑ^³Ã²"¡€`à8ÉV‹‰¥ 5Êøý·Îó7ß>Ïà®–Ÿ»ª Þ—íÚCÍ4S–B&þHCt€}ù"eRËefÐQBWVÑ’**V4mgÚVj¦ŸÅkš–P\ׄ`±0ït¼y§ÓáÕW_eÿþý8p`üJbfü0Àù™~8råÊz½Ng诿þ:›››t:Μ9ƒaôû}šÍfà•R,//~Osî ÿÉ4MvíÚ5"Uoðf½áí‘AºÇß–% áŽdJáH””H<`Zÿõ­½áo­_åfÓ$ÉŽ²¤ï^Ý‘ìX︪(PgY˜B4¹Hl[Áò™:JèÒ©c*UR…’ŠnbkTh+¬z¹aZ¿…²„¢(‘*e È-–fšF½Ý0 †Ã!§OŸFDسg†aŒbضÍ`0`ss“«W¯²¶¶6úýÂ… œ;wŽ Îœ9ã½: ›Í&–eø‚-{ËËË#ýÁO’Bæç‘ò+++¬®®VЫ0ÝÙÎkp~ùÜ£týÿMyé?|.áÉ{ÂÎÀ°`¸ŠW××y¾ß÷Î0ˆ¥ðh³ÅÑf+jþÏkT .0S×±6$–-òZ¶`ùø@Wf©¡’z®¥$[R´”âY,ALkq˜))˜!ДY€'Ó49{ö,½^/ùËt»]Ο?Ï;ï¼Ã•+WxñÅyë­·Fò{÷îåèÑ£ÔjµÀÇgñ†aŒdÂ)n]Èü%ü,NtE°]7û¨V€>öð½ªð~v 邱‡¿ŒDT¼Nà uJ®¹dÑí÷ùgçÏ¥æ_v]>´c'–iŽ­ yËá{Ò–¥ iH|*še <(HRõL©¯p=Yiîûü¦¼¹ÙˆWÖžªÉAn°/5þ‰(C fA¦$ Pmz; @ Ãàõ×_çoü¿1ú{iii4Cßµk×HÖ¶mÖÖÖØ·o­VkdÎ )S|ü÷­J—Dè8öØüyÊ]©s*rt]Ûf(Â…AŸMÇáL¿Ç‘F“VwÆzSü„äfìNˆ„/N!(Jqª³É7ºVRfÿmµùèž} á%ßòȪ@­Š‚zÙY}‰Ùü´$`Ê¢Õ§À¸n’T"2“väÕô5×õ~×+d  ¨Y°{´[°¼ ›èõ ß‡õ Ú`;Ñ@†áõWÃÿ®ÛöÊ@¾€\l\[€jS?-#-ºÞÄС/^dss“[o½u´“ ù]¦ƒúvù¬d…;dÆÖúh‡ñÀÖv…—6×9ÓïñŽ=äÜ`È©aŸ5×åUÛÆ.ŠË'›mþV»MÛ´:AÖóq³ø †q‚"ð«WÒ´pÅuùÀÊ*m«õ×£K˜l ¯¦sŠ•ƒé|KI€J¸¡EÒzU?.×ÇÛÓôÞÍŽh6=p_Y½{`×.è—— Õ|§–ëB§ãNú=¬­ÁÆ&¬¯Ã`çß‚Óg½OÁªiè?Ÿ">%€>MfA¶a v ¼öÚk:tˆ={öøïk{Íâ§üµxT8 mŽ5Àq]>ÿÎE~«³Îaåy×›xŽü«>À-)“?é÷xycƒ÷ìØó²ï¯ÑV€ô”HBöÿéÚCþpc-qöïµMñàòJ6ÑZþ@ã™ÍIvš23I30¿GTj„Ž^¤iˆüKa°·,¨Õؼ±.¶ëî¡ö2·\½Â%qI›/,£8±¾ÆWvÒù™è éØN¨AV QˆîÛ™t;ö?ꤛÿÛ(\Zž ý;7§9]P/þE<&O‘2Œ£–" PlvšŽðÇ8Å»(∹“ˆ¿^ïxæŠöËKpË18rví„=s÷ÚO ¥x~8àT¯Ëí¥D3ž÷︻L +TO„˶nPpªÛá¹á0Ýü_op´Ñ˜4ÿ'gìb*¸ê n i+ÿ’D]yB!)HBJ†2:ÒôÄtV‚ëj¾6Ç ˆÎÐöÀ^‚ýû`ß>¸ã6o½{ï^ÄæÔ¦²`_øµ cã£Êo¦çØèE Wñ ÀW¾ '¾ W®xÖ‘¢~)–`‘¶0×ÔËÄ‚ " ½Â¿ØÜÈœH_áw®^â×Í Oë@$²¥ÃRLZbùÎæFŽùIÓü_ÔS‹!!}¹$Á—Íó2²ºò±2*&\¨\¬Pa¢‘ôuR1iHëC3êž'þÐö÷²›°o/Øïþí·{³ü½û >§mwS‚}áWRðuz·ö`L>òaxÏ{à«OÂïš'AZs|N`‘¶,I¾úÑ7­ÂÎyÙø±FƒÔ›ü^¿K;Å °C)Nôºü|¿ËÖD‡Ðë¼i€Wœ!ØÙÌ6ÿÖÝYuê%™„‹©2 Éæ’ _6ÈSdµäÑ´$uA¢zèúdA'žƒþÇX ©üËN°ín8\³o/Üv«Pç¶Û`çoݾ6°7·LlªƒRõz3– D»ßÇ0MŒðÚÿ®ð Ÿñ¢~þw ¼‹)³1RHfAæÒÓʧø1½×UJÜ8ù½æ}÷ueð‘¥e~§ßÍ|1EøæÆ:GêM$—9kœà ü°Ûåûöå°)£õ:‡ëyæÿªÀ_ÔSdÈ‘Kè"@^V–(àkÉÇ„òHEЗ²&Ñ¡1œTr<1cç¼`f_¯ÁþØïöÃäÎìƒÏt.`ŸÖÏ«Ð/¢¯Ï÷âöûÞÙ/a"ð©Ÿò¿ûÞî]Ç™ BÎZ€jÓ:pQ)u¨*ÐvÇs$¹.“ÆÁ<¤¢‰pw£Å£Vgaj` Jñ§½.?íØ˜†‘«’wà¸m=„g:©wa)øÏwì¦7ÿêLéÔ‰¡g ÊL\*"º˜IŠÈù™ZD‚ÀÏ{-ù˜–Õ!í ¥ØÒA¢®ÔÆ—³ Œ¢ç ½øô;wxfû»ï‚=»=/ü]»`yÅ; g.Ý^p'ìgfÎOí×è¯Âr ”7Ö;VxgÄ'Ê{*ÿæs b!èîððÙ§±±‰Eª:]Ç¡ûª’ @²m9죯bË;L“?³¼ÊSWÞI dÏØCžïvxpiWBá‡uÖÜÃÅh;šcóT¯“–x¼×ªsOk):û•O¬[‡!“˜Ÿ%££'EW¢úŒY~ªú€_ ì XT† –ÙÖ€\]šuDFfDÏÛµÓÛv÷®»Ç`ð PÇœÓ{ìã­ßŽ`_¸Ž"³ü‚ú†ý>†a`˜O~Âs¬üÝ/Àù·“wSÄA~L©…à"meJ\Ès€S‘;<‰»·Ùâ!«ÆóŽúa+à›¼«Ùö¶ö…¶¯EO¦•‰r‘ø¾³‚«àt¿ÇK¶H®Šðx«ím?”PXÃ4ž‰¸ó’““É#©2!¹‰KEeü‹¹Ä€ À×5å«”g¸Å–(n ȹœ©T`جS{ìƒ^Ô¼û=°o6æPGñÁ~®fü”>[y]UûdèSx»Ü^Z³é]|ä!¸ñ(ü?Þ|ËŸ ÉujZæji‘Ê$¥Ôuy_&W½ŒþIúçK¨œˆàŠËªaò±f›µŒŽÕVŠo zœô|+‚D¼ûGÓzu¨="BϾÛÙL5û´›í(qHº· ’¤ÈÎ'9?M&5¿€Lü¢$ÈéÈL#‡L˜’¤1I>­r9:Ò?¨zÓl{Èßyý$_lÔ¼÷ÝÞþûvkvàkÛ¸¶ØöüÓR£ó˜RêŸìÅë+TGz èó€A/´³üàøoÿ8¸é÷ºxB_e²¯ãç‚T›\ _©B×½.}úÀ× )!"0þ@eð‚#.Cqé».®Ë†¸81rðP³Í-†‘ È ¸,ÂSMo Þ!S"z}H&/<Ý連ÿ©Õ8R¯gàìÓæýªˆCÂШ âû´¸ ÐërÞˆ_ØÉþÉHŽ?xç~ÿ÷~û¯ÿ5ï¼ývuUñ>ö~üÝà:ó{˜àSVo }*‰ü•¿Œºá è÷È¡ü¨0]¾|Yðª°ï‰ç{Y,‚wdòCÁ¡/º¸¬‹°.¦z"8x¤`W„–ÅÇëM62:Û²R|µ×åác46ktþð9~¿º~•ïÛvbGº*ÂmšÊHî¼. ôµóIlò=I¦P¾®¥€)Á¾€@ è)f  $¨ç•~CÇa¨7\][ã›ßúoŸ?_fÀñ<òmw8ôߟ€è€ýT@Ÿ×JÔ]¨®‚uhëžVŸO´½ÞXßÁð_ýEï4A7™°`ŸeX€êÓâ,í¾ž\IÓ'®€²ˆO«ÁÀ¿”5>ÐZbI¥G°€¹ßëu"Ek@ð\\¶m¾Ùë&nýÏüÿ@³"=?£¾*I9–‚ÊŸ’€_ØS ЧBIYS@/`ù’˜–…aX¦‰išœØ»£V*µ5Sõã €¾t»~ œGº‚ÀAþ!C|âc¨C7@¯ŸiM‹^Þb`õi³Z|†Ãáõi˜øðCæ. À&,èü!NÀŋۯT^î®7yÔ´xÖµSüQw“{M*¤GA Å/×›ÜhYì6Ln¬Õ¹©>ÞvsÙ¶yªßKtþƒÀû?dþÚúŒ¼¬óÈ3óFÿ =ZÉÏKÍ—ý’š?~GÃÙÄcÓ•ƒèÈÙTù ZÉuó zI[õ$ÔOyq üw¯‚sé•òÃiWd’œÑø#sn̰©Xo¦”RØÃ!uÓ„;Qõ¯ ÿûoÀf'2.HÎÖÔ¸F’ Ž£½ÎÒÄ=…ö¹€‰DgÙÁìÅ­Àl9P`J"HØiüg­%žÚ¸š¨­ßøÔ`ÀmˆEÌ:V¯ó×ê{½C8'>˜Ÿôyѱӽÿ­GjuÆIkÔ䀞–y>y•~„ IÆÿ£4)H“%è³ÈÁDãôËNÜ«&Ôê†Ìz&Ï?ftæ€*Òš„ïlý|ºAb>õÎ*ŽÀ ãô{=­<ˆñ‰ã8ÿü_yÛ?UFß ¥Øfßúã“ Ö/UdÀ÷~©vär˜‚AÏÁ "*QÜ[oò^s“\'ñCm ìu¸5tt©Èxæä*‰`€ p”ð\?Ïüߤ¥ŒÁQ!|Š‘Ð?™d Ë:0ÚU~ZˆdgÈÙŽwpÍ`èI»w¬,à 7xNöîñΟ_^öµi·½sÑM#È{}áÒ%èõàâE8ÿ¬­ÁçàÜ›puÝkW­õºG‚v‰Æ°«ÍÊBpÒ3Ë®'ð9þ…vJ?Ár&©ÂIŠÌ±þ-w ¬è$ÁA¿O£Ý†{ïÁ|ìQœ?yÊû¾ãÖ´PZ€EÚº$dƒQÈ PWÐKê0aS§ Îx—€ <Þhò/‡=|_ü‰TWŠ?vl^ôx¨Ñ&º<ZÃXsžöSœÿ„‡-‹#V-{öcp˜¸ª<ò(¢¾j¦€? D¿f!ÇnB¸c÷¸ñˆüͦ7[/›š ïgeÙûûÎ;b/io½gÎÀÉSpêuxý ¬­{ë¦/H•–€<}š*Ò’Qnd»°Š:VÏ3°D^O;´õÏÈG`ÐíRoµP|þè[þÏ)GqÊ‚Ì"m,Á4£A2¸×ÄX7ÓÞ_ @¨‹·à*8fÕø°Yã ö€•Œx OöºÜ_oaENì t{^Ö§‡^N1ÿ_x¬Ö¤9‹` øQLL˜ýG~Ív”˜¡Ò¶Í'Ÿ¤É¸®7¾{ÿ}{v£ŽAÝx#ªÙœï÷U¯ÁÑ#ÞÏcï÷®]¹/½ /¼ßyÆ[>0 ï´5•²åpâ}å}×UlÆKƒ…Á Íú ›JzŸºý¯ê®]Õ¸0ëz¯aÇ@W×¶1î½óñ÷ã|ëO¥à öóu—ÆŸäXÅÀ]‰P†Êó²ŒÌlb²®„y{¤ï°ê|È´ø¢=¤0«SÀE¾ÕïpK­N¤9¾‰uÍqyjaþ7-[5Ü º=éT(±¼(¦¦ûdçEŸ¡$ä«Â„€| €ˆ7ËW ÷èaœï‡ûîÁ¼ñF¬••kë“´,ï(Ý[ŽÁ/ý"<÷=øÊ“ðý<¿ƒfƒð¦Ðr=_%Ÿ&Ù⢠cÒ·&²¤V-øo—%…møõÏÄ1P{8ĺåÖGûwÏóŸIúܯ­Þùã™®×s$ô?ñHÅ?úÐf,x¸9!ë+–,QfšJñáz‹ßµÓÉÔ_öù¸3d¿¹mPá™ÿÝtóÿãõKÊÀÐd§Âðìü,â&}]2 —?i‰–ØöõKŽýv³ÎæÅ|äaÌ›o¢µgOŠéüKµ<ô^ïçÔëðä×à[ Íq°•D_­/?9Má+`ùÛ'"ÆœKõÓj²jÆŒ9Õ{-ìHÔ§ö`€U«¡Ž¾õ'Ðé$Z€êÓÛ×íÁ=&ƒÐ¬?øW˜œå+<¿apÌeœ4„f¯C¥høõžUà]µ:&/ˆãEø#Þ/».Ïö{|¼mù¦ o¶ÞønŽùÿz“DûÌ—`ÜÜ”µÿÑmDäY|s¿,£’t8. ú  œ›â>pö}÷Q;v3í¥¥Ù|,"ˆëz?"…@`äßoÞÚxYÛo‚_ùeø…ÏÀW¾ _øt»!"R±v ‰½»’)8Ä* ±˜‰wï«2Us¬ÿºØ JÃ~ŸÚÁƒXzûß~ÞÛI«oAªOýÅ#ÈOpY\œ‰Eùñù>úÃL 2«(v4}Ûº ìPÇë þ¸×awʘ¸ üÁ Çc¶·%Ð׿&OÉæñÌÿG¬Zp*ghöóqH%0é  ’”à(¨ ,äçOÊHHF¹.ôú o:‚ûàý¸÷Þ‹yãQ¬;¨MãµØlÛ‹{1ÙªÔ¿µô:‡ðþ Ã0PVapu>ósð‘׿ ÿñKÐI UX(rã2: # ô·3ÐOÕ¾m*x«ÃÛ¶M­Ñ@=ñ<ùÑ9a= °ÍSp€>×I2A`÷,…Äq³&Þ!AIòa ÂÀß `„â7Z8þ"™áW\'Ñà*ðx­A[©Ñúÿˆ”DÂñg‘XO F4úUÅ8ƒ_cë@Ò3ŒË¸ª×gpôÎCï¥ÿØûiÞpVEÞûîp8>¥.ÔœY~éaÝ®ë"ƒÁhà4MS¬®ÂÏÿ<ñøß…¯|Ý 8 )Z©VËRôw4ãŸÐVÐj­óú8¨T½Û` à4:ÐïviºëC?ÁðsŸ‡V‹0ñ_€ê“SµÂÁ`pÝ€ÄÏ<Ó~ ìÞÎV›É3,6BÝpE8`˜|̪ó[Ã~j` €']î¯70Q¬áò~7UÖ3ÿ7&CÁ«pð Õ? åÇ,R!p\T¯ÇàÈ!†ï}7GßÇò‘Ãìh6QFùâ®m{„Öuƒ¡=ØÍêëW¡v„ aµZvá}{áW~òCðÙ‡<ûœ·µ1nÑÅKßÀúp€S7£f¥ôžÙuzPVÝ“n.õ$8Tnw?Àš¦Þÿ>øÂ'Ê,@õéÞ‘À•,ˆê¬á]ÓIâ=2#PN(*^à $ÄA(,¼0©àY¯7ùWö sKà—í!Ÿ¹­^çä`À×ì­,ó¿iá iî÷ƒ …ó¢&ö¯›/)€¯Òã™ú‡o`øžØ|ôQ–fO³‰a•.ü}ÉnðK|Ósõ¬ñOØsýë–ee(ºåüõä×á󿃼u•æå}RŒRŠz­– x;}Eí‹óèø3p}òiÛ6Žëb‡8Žƒã8“zB ¯”¢fYÔêu,ËÂ4Moù(ä`)SÞϬ– Ý.PÇnB~t2EsAf4|,AÁÏTr¶»Åfù5ñœ-$GÞÁ?%P˜\ª‚¸Û~ë@øyÄd&B »‚êõÞp€®?ãoº=KKXy³à¤ä²\ë±þ;·/Š¡2 ̬çñ“„÷=‚úý?@þÍ¿óH@Æg¯Ý?4Ä"Áü¶&[í˜7¡¤úóâ€ï8®ëb;ÃáǶ‡£k®È蜕ð'NM ãñŸ£a˜†išX–E­VÃ0 êõz#Xc/ÓÚg•$é:,-a}ð /¼ù&àJ™êú±øëö*ìЖå¬Ý!PÇóÎÏ”†JÆ^ÿ"4”âã&ßìÚ©V€À {ÀƒÃÏØÃTç¿' “Ÿh´BÝ/awA2) óš¿T{š„@ 8ËËt?ô8ý÷½ëÆ£ìn·©×ëÅfꮋã8cóþ”ƒ™ÿ±oŸÏÕ÷Ç N^³d¹v >ó³¨ï>gÞ(X‡(¨Ä¿Â'ª),- _Í´WU£ÅÄ}Ç0z`ï8ôû}ˆx±AD<'SÛ†n·?À¶‡àºX~¬•Ñi¤þY"ÝZ »^Çh4°LÓþ€Ê00 ˲h6´—–h6µ(áÞ«^6ÐÚ`ÛÔî¹ÕnE–;`Ã[ljøÄ׫®eB÷Í~óü€š Â§Ë `‹çœgúì\D¸Õ¬ñ~ÃäkŽM3áùYJqÚuùçÝ ~à:X)Ω5¸Á´<Ó"ŒN"Œ4D— LœK#1'•k€,B qú·ÝÂÚOǸë.––—=¿ëüŽ?«‚˜¾¶±aØï{GV§û‘×Ïz–å}$bþ×¶ã©imS ãâ`8dÐïã¸.ÃÁÛqpDpÛ¶1:¤ß§þÎ;Ô×7h¼õ6æ•+XW®¢zýÑQÌÆ`HR€§a«Iu…îÎH³Au•îŽUKË Û-êµZz­F¿ß§ÓéÐh4hµÛ´Z-j–5ŠÃ°•»ìÁ€ÚžÝï}7Î7ÿd䬺 Õ§ÐZU)´}Ç©ôwœàzÍ‚Ð~½< üÃ,9þ.Â…Z«k(Åj ¾ì¤Ÿ´XWŠg\{ä?Omà~?j`þ#‡ã¨¼cqK“5qpò„Ý$B ¨Ág©ÍÕã?Iÿ‘‡iïßO»Ñ ÞÒÿlg ü×@ îyØïc(…Û o_:hµ&d¸f(€*à\Y¼ËÎç@ Ëw\—Á`0üáÐ[ËÁu¤×Ãíõ¨¿õ˧«]˜Y IDATNÃæ&so¢ú}ÌõÍ``DL#ÄIR[Qëô¨ovY9÷–æp-“ÁR›‹‡nàüÑÃ\Ù³‡ÆÒKFƒþ`@§Û¥^«Ñ^ZbyyÙ#<ϲ$BDp- ë'>€óõ?òÎÄ`Af‘:„®Ûª´Ý­x1FVóÉuíðú¾ _ˆ- ÖÐǽÅ(¡†mý»¬:÷½Ô¾Ì”Qw ÂÆÉö?ª0è;)/¤Ïþµòã!†CÏ+R¥¿–½ñà½l<ñŒ;ï`ui‰v«•ïñî'g0ˆlÝ ßÆ+†½žϲ¼C§Ú% Iϸ4è㲤ïù¯7ˆÌflÊxŽA ÖçÃ!ý^Ï›Ù;6¶í`û€¯67q{}j.°üÚIêg߀^óòU”ë"– ÊðºJâY¢õlEù×0Gílllrä¥pðG§¸t`/o9Ì…û©­®²ÔjÑl4hÔëôzÝ.;wî¤ÙlzÛºK<Û*¬Ã~ŸÆ·{΀ožÿ|•Eú1HÛÍJ`†µ4¯w‰{³‡·¶yy†‚þ!Aá21«€+ÊÛ8òv+ƒZu¾3貫`û¯Î‰=5 ¡Fšèå*!Nj>™Î‚¤ÑÐß¹ÊÆŸ ûèûhïÝC»Ñ µ´”T"ÞŒ?g)¥ïzIJ)lÇÁÁtÝ©Cðêß@Í4£qBÇ«Œ÷:¶å½ÿà÷û ÏKß7é¿GíÂE–^;I㵓Ðëcln¢ðX&‚©ùQŠVã“vÙ‹i`:6ûÏžcïo²¾s¯9ÄùÇhîÜÉj»M{i {8dhÛ¬¬¬°º²2ö(ùÜʼ?û;H«…ñž±?ûyT»µ ×ÊÀ2“޹…¤`µL™ŠM%“¯GOµòNþ4I]}À|´ñÈãVc×DRMýI© éý8¾÷ýПá‡ÃDÀwz=ê.°ôÚ)ê¯Dõú›ø‡xZMk‚wÙ=!eî(D DyvÅ—¯pÿ¥+¼yþ-¾{ì&6`÷`ÀpyÛ÷IôûìØ±ƒF³9Aljïû _D¡€g’*‡‚­+–eÍü` ¹‘‚pGì“GHœá›€)Ax`ü±v²Œ«¼‚uÆfÛƒ†ÉÇÌ¿eXÕlz`þ?lZ ³ÿH´Ÿ„{N'Á/Qß½Bgɨ¡Ónqù?AçÑGXÙ»—V½N»ÝžX³Ž0á5þÔg--mwÁÄSœ³‘¦šz 5 iKÅïHŠ>&0xÛñ\w øà×.\`åä)ê?:‰êõ067½J-ËSj™ù­É}Ü2åMN ¸>Ù:üöEv^Yã¹[Ö8sä0{wïfÇ`ÀòÒ¶mcÛ6«;v°ìŸ1·£…ýC‚j BÞ8· 3HëÀE¥Ô¡*Áz+J«{zb°—Fây±~ /ê_d_}‚3áoK áç™(·^` Íh‹W÷[5–P8~|äÙ†u`‚ $å{¿H‚ß@ä¤IÏ?ïò`@çà~ÞúÄqÌûîeee…f³ÉÒÒR¦gºØ¶·ï]ç›+ò]^ב,ÇÏ# ú§Tü8*rдÏ\JµÁKá=øà;®ëýˆà:6j£ƒÓëR»p‘å“'iü(<ÃÇz¥<àÝÏM*¸1™ª¬(ÅRÀ{^ù{.]æ…c7ÑÙ¿Ÿ=;w²<àøAˆ,Ë¢™b (Ó¿t$ÅuqêuÏàµS 0£äþ8ÜdÄ@Ò– Ý >Á*`á™ô$gÂP/V³oÀt”p³iñ!Óâ÷›åŒÜWxÀªG;^Ðg]š³Ýüpt€(ðsCºÇnä­O}óöÛXi·i·ZÑõ~×?2ÚÌÈæ´z·3Ð2çJž@ùGCè  p7 Ú–òìª~ÓCÛfc}¿?ØïÚ6jcÖ70®^ey´†ßÃÜèxm´,D)$ì1_䛩"ÜrYr0±§hˆË]ç/ÐXßàëÇ6è9̾]»ÀÕÇßÏÒþý´›MZí6FÃûŽÇs ‚“øqÐÝëàûÚVɶ¡ÓIýЧqLŸWtE°üØô•úìš ¦eÑ|ç̯œ<Í7L“·b;5”RìÚ½›FZ@©¢·›·SÇuaen8¸ U§Ë—/Ë®]».T©3é°Šë!ð\Ŧô£%ûð1±ùË ¨+èØd!À0BÇê6ü¤Yç ¡À@Ž/Du4 Þ˜ÿ§Ë± “ÇŽÅbÄöêkYâ2ž³ŸÝnñÆÇ>Lïݲ²k­f“V«E½^‘HÃðƒ øa{ƒÓ 2,¼ÈL¶ né­èéùß´ËxÍ?r`ð¾óR…pés ¾ñMXYñƒi^ð¯«T3ʯÙKžpËABW)Žuû§Ïòe¥Â›GK7{öîõ)ÙMën£Žºåæ˜Qª|l¼ÞN4€ ¼5{+´y|‘åüq^Ü^¯‰b@RèÜhXÝq` qœ€»Ì÷*ƒÄNßmR7(“»-‹67›&ËÊϘ³À>± ù*Ï:àg«áî 8ûáâÞó.V}g¿V³I­VC\Q Ó7ˆÙ?ϳÕgÕ1¶Y’ÈïRñÓKV#þ·—9FÌk``]²jSÜf5$! Fƒa£€·ÒÄÎÜ¢­p#WÖ¹Qå娖Me4 vìÜYlÙ¦¤“ k˜<¼ 3J‹ÉQNò€·/µ¡²¢âÅgñᎨ&0^áímÄ¿ø„ãxm„º?x BK)~¹ÖÄTŠ–Rì7LÊ‹¨|âÑ"ºµ;Ò½„xcÒ;kÒ`gþ „AÅØtàÔ'?ŽqÇí¬¶Û4 šÆxÛ¨R˜þÀì³þÿ…Y§y-4¨íҖ̺*+€LhŒøÌ1¢Ÿˆ ëëáÀØ•¾í¹±¤?íÀaÒˆ]‹—féŽþ¡­Æ¤, äÜ‹¡_ºÊÇæ Ã0T«ÕX«×iúQó}§Ûà8æ¡C 0£TéÀõ6ûOü˜ÓÖ¾3¬c2Íó¥,„Ê PX†¨‘Uà]V ƒñú¾È8ÀPÝocø(]…JAr–b/9»“ê &ƒ!pê§>†yûm¬!H LÓôLþþ¦#ð™<î4ÿ¼ö>©k¢’'0t]ŒøI€[ñ}Îw¶ï|ËR¯$ܶm7ÏEE %" ù3ƒj|ÑüfíOu €ÅÊ€¤¾%Ç;3\†¿ypóš8^˜1åCîÛ¯¿Šïõû."§—; Ýn£Óíbyy¹øÜC1³µÚ°?ÖšGd;0Ã|Ú¯¼xø­€?)­øü‰=ç›t08,lå›0`n’ ÅMõò‹­Á¦‚ßnÙ;Œ—~ö߿疺]´Ûm´ #ã^žr‚çõ»[^þ*Þ³ÏâýSÇ5¥™‹â7VBh<èû<-À®„Õê¡>kîƒß‹:ôQömÏúfGͻ͆k.‘µ Z”Æ~Êtð•+¸é¥n·Ûhy¼¶'ÌWä^f? 7@C{MÂ)Iq’+¡àpÃüìÄY2{΃‚9¤Ï;jI«„00›wó™ ƒ{bC–¹€9&kËxþgÞížsèw»h{êCî…qÎ]ïo ü©O‡ÄÁI¤ðY0³I*‰-wšåPs²—ô2·,oB—éOçRâ†/åÌ—ƒø¯ЯŸW;àG‰> «œãç¶vð¯¾êÎã9 ÓncýСÌvUhrÔ9÷*Ä( #é•AÑ‹î݈÷„OH0‚u™`2VEÄ´@ ,#ÑP¤Àè{¯‡”‰‘[³# ˜íÀî´qá§þèÜ°ì…ø†Í÷7¢DUdãº[[dŸ‚™ÂåÂó¡ñCÿüâ+å(+„9hsSÊ µý± •{ (‡¡«$þɺ!)‡îÕÛ ™Â$Ü Ž{¯]Ç¥~]ÏàGðô——]-@™°@‰þs§j¢Ë* ;ÐN€ ±ô3u€UÐ hÞt0Ø\ä=,¢¹gÀ?‘ç6s [H½º'´ÙS‚)€ ?V»…—~ú§0x˃Xï÷]›¿a@Óõ@åŸwâ“Y<!¡ÚpcÀx ln#H:‘ÚLÑKc¥…„ôçj>§,Ÿ!Åio6C fÊ»±$|0I>ËAhÁÕDZˆt Å8Þ5žà™›7±½²‚¥¥%ôz=ôz=ŒG#´ C¾šEyÞhj#¥zW?‹ÖA£ @pxŸßìÙšÌ ™Z,”é}I₃{úŸ›…¥„Ø»R}fÚÀ«eàÅ÷ýM Þú¬//£Ýj¡eÐu=ðô÷M•û¥À½°Å&¯ZΓrÊ`1À¼[Íâ*%98î²Bc+çd¬þWZ{@ósÄÃ@ üü[ÜŒ¤K7oâö‘#X^^Æòò2&“ F£–ú}èš&±Ÿßœ±Fhho'~â@Ή£‚èy:…÷…š—¸mãÒý÷âÚý÷á°g÷7tÝ=õ‡7ÿàOC FÃh8ëv’eÎ/ňf& X:àò“²d­˜ë6[/ ð|!ÕäÎìš*<›þc:ÜÁ6ç87µðÈö6Ž{Ž€“éSÓ„mÛÐb©‚U„6@=tƒš“Pñ áj–æ/z7Yàó°øƒ €I«@Ü®›´ÙKÜ“˜•„Ù6^=}Ͻý!ô×ÖÜÍ?d÷<þÃhóojh/‰1À±> U}¯` ! ´Ëxþ«\§,ÔØë•(ÊnÐikKyþ¦¡Ãƒ Ãýz ŸÝÚÂd2Át:Åt:…iš˜š&Úív±¦Hôm#ÔCÓ†gZä`=CÜKB.$ „NA®'2ÁÎÀÙÜÐ;Ísß)&RNþ…µÞ}I¦á`ÜïáÙ·½ú‰èyР†aiC5Oà)'ÙÅ¡êÎÁ²ˆ1e‰¹À€Ã1?'„[—]:Øh8‚Õ»d콂ÄB•ØC%ð)"èû(jµ±:ØÁp4Âd2iš®0Bôûù澂 i€}@Œ1X–…ƒ©UðNH) ;³õ3)±Žw15ž>6Ñ |Â×ÝÅÒ$tø°¿ÑC:¥8 Fg¹Œv)»=÷à}˜ÜyÇz½éO÷Uÿþæ¯i•íþ ØúQ<÷÷.ÌW7]5AÓô¨?HÈ@»ÔîªèƤ8w@t}(?þK{ßþüÃI—sœÞâúpˆñxŒñxŒédË4!º®§$+*Øõòܽqó÷si'Ù§®(ñÄ:s˜à9€ 6‹K0ƃ=> (T—õ+ªðⶃ ÷Þ…Ë÷½ G< ð–aÌ…üi!¸ßÝ"U#OI­ÓÚ^r~Ô6«¨Z½ 1Õ÷£…þ±šš$W¡ìÍœTÕˆÔ½J²ý2+3¯gx—nàcƒÁÌ à™LÓ„®ë•ê¢ê¡›†–V¤Ó&€1ŒXhß.†£O… ç]‹‚¦ä, Rრxf‰Ž„Ñ2G`§¿„gî¿ˇé@V º¦êÿôïz—'LþÁËZ®’j.ˆÜTØŽ|OJͽ$HÜàgDŒ#íº]ÃæŸ¬L ¬%âÿ‹öUöƒTÖôñ¥OáÙ…t¾+裢sgô†Ç{B€eY0MÝ^OÉÆïS#ÔGæ4‡xÚ(-•T‡¥dÕxaŸÄ„„îOøÐÉ?i-`!€ˆðý{ï†8qÝvÛù÷ÐþtÏûŸkt]÷d¤4ï(É…a¿&ŽŽÇq05M!`Û6H8B¸0_·7ìã²ëºÃ0\ÿ ßÒ ˆvEpuéôJ Ÿúóp”¾?üÎ@ã1hs ð2RÖË`‚äFMžM+(ij¬ëV·600ñà€}!€„P îÔõ­kÊVYÆØµÿ#ABg ’î„¶þÔt»ya‡óóëœzOèKLhð‹àB`kuWÞpÖúý@íœü=À]×ÕÅûK †pIް<'Ó4Ý^¢Ùéß;ñ‡5þ'<ÑüÏÿ€¯Ð47Õj»íò×K¢Duòo7 ò4%ˆnþA*à2ac%y0ÓÆ±r›•͸ByrV #èƒÐ…>ç¸Ë´ðêxÌ Ë4aÙ6„™xÅøÓàÔE#c]Uš¦ ":€© Á(" (AsÀ ü%ìÏiö„9¡Á}·ð̛·!†—â×ßüý÷®‹*nžW:Á´šN§°m¦eÁ±m8ÞFïǶ@ã h:ߣ!`Û`¦ } ÃZPã ¿D”P´?“ø¸‰«æœw’üe)5”OµZ?ü3))§¼-_¢™ÐÆÑ‹cÐw†0- ¶ïàiDÖ>Ð . ÜbŒRå½oÛö‹ù‹EÜV3ÄO‡¬²0)œÈE–2£ƒæU,ab’xúÌIØ'O÷ï£þéžPµÇË<_fó°- £Ñ¦§ª¤×^CëC;ÿ´{Úgp7ý´¾H «Ìi]Ê’ç× qöéïáäó?Ä­;ÏàÂïÁcGÑóN· »Ý†mÛO&XYYA·Û ˜Š¨^w# `äØˆbxŸÌ°Qåc),‘¢‚IÕ#ÅfI‹¥ÞŸe} =®áËÁUÏaÖ¶m8¾ P ê#Ѱ ›¸ÙùXxÑÄÕ§Ø‚},Cˆ-ƒ3ºo>®0gÕ`s‰‡86–ºx鮳X_^vO~¼z(Ûß^:þÑ.¢ NÙÄæôoú£¿r è´°_æäÄòÞZ¢²¡B ]ƒfÙ8ñüqä•‹¸qçxþ¾7apü(VûËèu»èv»°–ea©×CßËÌXˆw‰ ³ªó9y¹8׿2&b(sÏ™¦ DêJ§BVƒ”2\”¬xNg̘Nõ¿å áÔÀA ¡Å¢9\ýŒŸ…§ë¼:˜%Û ŠE ÌU!ß‘0rC\ „o<:|ÈuFóìÏè¦A7 ñ/<ÁÌô ¥ïÀ IDATÃàj¥Fã1,Çíì€?û=´>÷wã×uŸ —¢àH,™±É}œv±ˆ‰ £lÒ4h¶S/¼Œµë7pñÞs¸ü†»0<|«ý>zÝ.:Û†išX[[C§ÓI5Í}EäzÃo`©ùâ;‹ò&5Ùy=GÞá0m`©ªC]…Zp: Òeä§*,¤AH8¤tˆart'@Ō̫ li€}B7ÐÃ`i#6HgnD'D Pì'†œ¬|…M¡{sÍð<ÿu\¹ã/õ›³n®ýßþ1|¼ïp åÏ4MŒ&8Ž\¾ý3ŸüÛã ´Sò<,ÍuÇ<ëÊ 7å%QÓ8zƒ!îûÎS8|í:~ôÆ{påìZYAi K½ž‹Nè8è÷ûX]Yç|ÞÉÎÛüÅÆ`Ûµã£äµ"eÔ ÀKöOQNÕ‹ÁÏGœ©A(XÿuMƒã%óÑ0¨`ˆeÖk PœØò—÷g‡1˜žïy€/(âT#ÔA´¾¾~³áD‰Q*}ê¯ „î‰'!Š(P‹jæªB‘jìp†¿>vÄ5#þùñÿú.OÉš!„›£Ü¶A››Ð¾ð%ðÏ~Ñ ûò7ÿÜ>NßÐû2£<éèr–WzôWÒ4´L >ý}¬ßÞÄ3÷¿ Ó“'phu}O+¼(‡õõut:D!€(!ósÅé1_uò»'¢%dU7ÿ2(sŸ#ÎQËѾp˜½š >é§R ‚‹ÔŸ=®¹‘4qì @Ñ4ÇP5É€ŠÌ‘J&€2f‚нs|ŠÝ%©˜0w„‹«K¸râ8îñTÿaÇ¿…ýñ6?¼—¯@ûôgÀ¾üWÀRÐS¿0Éi {„b%§XîœòNÎqúÒU¬olâÙ7ß«w߉#^8–pœàT¶~Èõç˜Ç ˜? +×ÃT”F@€X µ Eµ"€|Ó‡ÂM=ëÁÚ´ T¤HªôîÄ  ưÄ9 /!–/À×P…qÕ@ï 5@¡•#Ķ2Â@â=±û’s©FïKtHöH>¸& ‚?u‹-Û¶E Æ?vØ l‚§ xWI© €bHÇ,V2“_^7Sð¾(0D/ÅO,þŸÀ xÍÐpéÈaŠŸþ½xÍËN·hDáÍÿégÀþè_›[éöþ¬~Ëê£,’Õ$¤–ŸûcÆ{ÁÚ¦…w>û\Üà…ûß8¼…Ùñ4«««aDÔïà~xÜþd Šú‰ó´£J—QÍÙ.þ˜‚M>ãÙìà–yq£Ë5,{päeÅ ÿ ÚF¨†* óÃ@Ml1rOÉI{shð²ÝÒ÷Rhƒñu_áë뢮¯aç?/ÝoÒ"±—"˜š&Ç{êià£ÿØÚv‘ü*,:Å“8“U¾"Î…û1´L ÷¾ø2º“ ¾ó–"𬓀c½Þ¬€]ЄùqôBëC¹›YÅøôr»h7PÙâŠ=8צÏéŒa ˜·ÿËð¶nhÑIÆ)åÆÔSBâdüÂ@ä–j¾³Ÿiî§¼xâŽöû3àŸXÜ¿)K]@²IõBoYl!€^ýÑ¿¶.¨Qr¨žl¤'V¾AUOÞ)c‚qŽ;.]…žžš¸qúOà«gWÖ×Ññ³*§ã4K°÷+Ö&Iq“ùYåJP‘Ñ7±üʾÕ·RšÚ„1«3†® ˆ€orJì(à…¡ƒ¥¯ßM–åìP 0‹?Ö,/ž\V;€B„ËË]8G¢ë'ýñbÿ5ïôß2Œl`™]páVÛ¶ Ëq€+W€?ûp{ÓEõK|WôT”Çϲßí/j>à.#€'•´ /OÎðÒ¡5ítÐñÿøÈàŸÅé Ø¶ ˜&èóŸ}æKÀj™ ¦ Þ„ØËáf€4B©žãÿBUa³¤Ñá·¶-²•°‰0bÀ¡ðƯ8¹S#4´Ç”ãú¦D@Rb€ä7Æ7• ðÜŠ›PÆð‘ÿ4ÍþÑ4†áª‰IÞ&X˜ ,B8DÀÆÄ'ÿp7…of¨Õ|ù%ŸôS ʇ¼Ë+(í‰@Ð´à ¹Új¹úo0Üqá ZDxfjºÑœ¡ö<ßÓŸ±ˆ+Ø÷JƘ–‡Pc b•ᕱÓx5CICÉðTKŒ¹»Fø&V¶y)ÔõÑNÂ’#55ûžš¤‘ëœuÀh›Í¹mÃE…DΧgèKœBq§6–7‘)V<ƒ Âw{môz½ ó_÷ŸÇ'õ“â»Ï‚L¬ÝНEsË ƒW­Î㘥gEd7Vz†€Y(‚ ¥ÄÝêBÑ`áH!žâUê”ôÎrxÕdSªäŠIò¨Â³‘KnX¸æªþ¹oH1ï‰ S#ìZÈ$1‰ÃWóû͇ƒÉñS*˘x2Ú’Á„/tZèF"ô¯¾@ÞÿþÉUüð%8Ÿþ,ØR/s­ ÛÓ’$2H,9m/c(Pù×¹ŽŠܨÔÈ=è2ʼFØÂ…‘Ž¥f¾cànäÒmUoê¹Å¢d„UlúEæBz™œkóižËp2¥’PÝ8°^ûµ,#ù©zƒ?dçK~Yè† `1¶²‚ŽþãŸþ5MƒÆ9 }q¦ Æœ'σ®ß[é#éÌäÛøÛð„7ÿ×¼a.‰ —~Yr×U`*àp ®YÀ)³Î@ BÕPþ4ap3IúµPSª¾–ºy иü"¨t¥Ë…Ò(PñÆúéZËuŽC<Ã3Ùå׻ɰW4mX 9·âa€ØûóixTjB÷—<ûÇÀ`y'½Í_Aÿrßþ¿¼Üe8„øæ·~/ÑÉš{‹…×Ã?kñŠ“ßå$B ó#U`v5˜ï×à òÉmg‚ìnŠþ‚B(€œWhyiÎÏ&²p$p5*¿)ú„ªrsëU1†³Í[ñ¥i À  ™›\.Jg棄)Ó„ž‘\gû]ô––ïÿùÏ ÿã¡•i¢‰À4 Î¥KÏþÀMñã© Pl=©`Ý_yâƒÒiá‚¶¶á SÈ TºwJn‚³£ÿ̰„y©²ÐÂâ¸Z-U­uÁ“x9ËUüy¶ÞŒ4ÖnGß ]ÈjrX²mûà‚¥Í –qdŸ»”¦7ôÃ|H¿z€Áulüþê2VÚm´ÚmýÏ·ÿ+Rÿ« €ýÔ3€íÌ¥5æ ´ÁB‘]iöÕX€BBB‰% ù”Ì#¿·ll©Bw{ŽÎ£Äí* ð\¡¤à¥ªìøÅn¤*åRTeÃ2&º†V»5‹ò4¾€ÊU ›Ù‰1wc€B-a™5ƲÁN íx‰¢UD”ÉÕ(H¼Û!àjÛMîG…3V75@}$c†“/Œ1X–u |8\/ëü›“žwndÈÞ—ê¬ÆR¦ŒEØjè„Tþ¾ 3=ìý_´/U D˜óòîn šìFVJ@ºX~ÓfõÏ™y$*ð âjœ©H…$1”1%à|ÕÀF硊òJ7¡B:â /ãvýNg. @+‘fºI´û4‚ÉÑUU bÿrCjÐ{«ËÅU´±gd#2‚H§“Àº´=ÀÂj!$/5|ªNŒspâÊU°n:fAFIžI /²êÄ/J±D’ouïÿ!‘ް&€ A©¤¶ª™§M/0´[ãh®®JÊ/~Ä.Ìõj¹„«å$ÊyxÊ®tÚèÇ£ˆt½P±&ÐÞÑ.Ô}CEgFXÿ. Ã+¯@ sAÆ…ØÏc¦ízÞ„ {îúª¼…Àÿ÷ÕÆŽqët]C ¬€¹³öJ€üÊcNÄ[Ç Ø1tŒÚQGb_£Ø$zÒ „— ÐWžf%ƒ+˜µOJ;07k({ƒJM ï.$¯é̃ï BwBßYÍØìEÈ_L: Dóc,¯žeÇdQ¬¢Î†E^-ñúÅž;e ÄÕÕ4JTÕ…3•‡ø’öøô!Z}£Ïã##Âv· ­Û rˆ„Ã+a^3Ö5’òÛ4M!RÁþ¦ôô½É{nUí@Feš ž ªN¸Ò2`´;Ð|©Ý³ÿs¦uA6OÐuhgÏ@<ö¨×)ØemaêÕî?*˜‰‹*h§)¼iæÎBi©‹:–z{œs,û)5Q|óO¢öU2êC:Eq®ï,v = ìÿœƒ‡r>”ª-ESI7@}4p‹1vJ…ç~¸ÇÁ Jÿ-#}/¥ ì` d2¯T+8DØ4tt FØs× áÑ(P˜ô7¾Ö`tÛI#/ñk©'w—}I‰!¦ææ…™>Ê?dØ5–…ûs dynx ©çU‰8…¬…Gþ1IAÖp¥ßsíÿáü!!û¿_„F¨¨Û¾âÞ`W™¾—’&ëÜVR ðÌ#Ax©×E×0܉Ãð^$áÍuÖvl´»ïra€ó›—WÉ®SbYfª*°¿(ëq»‰l€*òÐpll+Kùu¦Ú‚Rhƒyó»T=$@‡ž Øèõ°Ô鸢±ÃD±º4Ù ´Ó¿àc° SÂ<É…Þ•Ü|ˆó–ç½BZ ðæ™ÃZ(y‡æCÿ†#áF°›Dá¡þáÔ)àäa Þg2+7Unm V•|Fz"ÖÑ%/ÓÌÙÅY†©P)§üMÆvÜÔÒD5¼£|íåÞJB à Í•£¶­^‡Ã&?—ˆì #ø5N€µ’€â”À¶mCl$ûfÙåR¶DYa ø*/Dc©õ‹¾&)v}ö¬ @tÚQèάå—Ÿ\¾Ê¬?®ÄáCà÷ÝñÜ‹ ÝXµ¥µJ´bQä_Z¬b}›¿G «=@ìZ5=%n* ÿr“m¢…a§ÓÂd©‡–aN€zȧˆÊöMüÖÉÑ›l!hccƒàæPFŽãÜl€‰–9ñÇ~J.ÄûåÜ›4á’_y}ð¼I„ \€0üïn‡’Ä„o«e ú÷ãi±Ò(Æg’í§’­ ¢Ÿ:êU_¿%À&›…t"üQZùùù‘X¡ÔÆfôSQ.$Ù<œ/“JvJvoåÞ–û’ùŸ˜,õÐîõÐn·çL¹ý#=x`Y fz}%U¬‰œËÄãÍàtvêÞÌÉ/\"7¯M` Õ⻓]„D¨Æ}oÂts¬Û)1’eÁ]$¦ƒÒ£t¦Â›j%[Æ!Õ°2öQI‘¤*`•w©Ž)–‡ ´w¤]€ÃËë«Ð½º§ð͉(ª›ÚU âú«P35@¡™/Ñ¿ÈRÊŸÅ’A’ÓRl" ¸(€cÏá/ÖØoƒ„’±“'pR¹Ôh/Vª¾û`Ö¸Ã,X&  ªf‘1`:ÒàÊK¦νKÕŸq«´èQE* Ôr³×ÅJ¯7Sÿ{&E^%HRMÆP3)5X0 ’ðT®=›dï.¨%ðOÿzÈã?l]ľ#ä8`ºœ=ö$·";¿ìšTÅw ÂíTüå Ö[IŒœºìI p‘Ã!0šë%ú­tëH:”áÄX5¤4CÈ`Dö»¸ºÜÇ¡P:ñ `Å4À‘× ûéï6>5ÓPea–eà„@H3²#Ñ,Õ¼—og“ªD܆œó” ÂVØ+v* &¯ÌgWxNp|?€#GÐÿ¿º¹YÂXM>ò·1éËú=T/e¯>I\§`l…“…¿S¨¯ë_îŽ1Ox”˜0}^˜/…X˜|êF@”6`SžLn­-c¸´„v+ ø¨Øü _¬Ñ4´·”w8ŸÝT&£_ÊE*Q‰-p8×¢Â!¼KÍÖÝ!f‹À/ÿûпòUØŸù pt ò8E:·‚¯{,Y4Å€$È¢ ß“¸?Àn:“lŒ‰PA•7SÑ"©b}f¥Á]0ÇÙé`¥ßG»ÝFËrËpbgôò…FhhïˆØ>ÏAŸ·‡K› d +˜O©‹ˆé=ÉËî-Ì|AÍ7qR÷¿ûo°óÊEе.ª[•T½EÈ²Ž†•©fáBŠÊÖ3Œ…ƒ w# Äv»Ö~Ž ]C\eü*mªW•pˆ׈̹È.;ŒN· ]×gžSÅ!ÎA›À`Ô˜oV¿~ˆÃÍž †toäIʉ´"æ‚ÜË’jj‰®qæÙêâ ,‹JÂq¢Ž['O¢ÿ[ÿ1èÕtöäò¿d°[=šrÉiºx*þüQê"9º>Ÿ  Æ-9Ò@·7@S+rsfÄ_“RAv†•üÙ¶¦âó>Í^%‰L„ÑÊ.®­¡khµZ0Z­ˆP´Ò'½€ýäy`4m45Óe¥“Ïs=èÞéc€;iëEô6¹ä=i—‹j f6P-îè/Ê šÀ‰ˆ0™LÐéõf?þ_‚ñÈWa}ö°õ•ý%A¬ÜÚº,òЗî?ñÿÁx ã(X/¨He -畵dJ,@¾P1{Av$còUæ8¸vì0¦+}ô< €®ën ¦Iie›H;;p¾ñ8ph¹j&¥{ŽãÌœ¶^/$ Ë›Š˼Ìñóf“¸"®CØâîÂËÃIYÂÈl *¼Ù–Ç4¡µZÁoÝÿòwa?ú× ÍØj?cÿ-xÞ,½ÿïïT¥I ’êG 9SÜ Zm ²‹2ΟÊžn§ªåª ,“Ó‚·ÖWÑ[ê£Õj¹€P" ¼¾”~c€mƒ v@oL í=QX_&3Óbæ‚<ƒß¼vŽŒ iïA®šÒ¯Ó´ˆ`$Gû"ã˜L&QåìY,ì_B{×C®9 --WÇ«~oO4ðå ›ÿOaÅœéÑøÿxJ ÖïŠ"Vêþâá ò Ÿyˆ’ÅÆãú`di¦ûîñrË^ü¿aP–ý¿pŸ1qå è¹—B#ÔL; $çülV U** mñH^´³Ö%Ÿ|ÀQÇÖañ0@ŹÙUƒ‹ 8£î¿Kþg0~åoƒ®½8 ­204Ùë¦[Jêƒ ”5hg­—Ïrþ"“*6#Ê€æ/Ì=çx_ŽÚºí@9—yo‘‰ÁÅ™hY¸aÌ.œ8Žîü>:?ù.lÿêù°¥”ºš©|a»T뵑˜zš¦,mSí ˆ€ñبd(üê(¸Pl€Ä ò•d¶ƒ§N`Úï£å;zöÿxÀÒÿëd zú»`‡–Á À.ÌP…$„8¸>23¬Œº®¢† ;ü êWܳlh¦ Û¶á8® `{ÿÒ>pǵþ@þÀ¯`õëí¡ûA×7 íí ¾Hî ý‡D°‰qZ ÊS~ªv.PÿWTiÄOÚs*ö*c£ØøÌŸþYƒ§ÀeÀ…SDZ´´ä& ©þyC„ÊöW¸l Ø5À~£‹*¨—T-” Ü‹‚n `<í9kú!lÛÎZ&Méh”̃÷üM,ýáïC{ß»@—n‚ ™ÊíÆiá  b8Xò#âZÂjÎïò&9–÷B‰>'*ÙwÒ&¦bMÎ^+¨ØZ‘&EÑ¡U\;|˽ž{ú÷ìÿšçÈÊö[œ8‡óÊ+ß| ¡Ñ4´× —?Áâ“£L™T¾ó/(ÖS¡Åû?cè;ýñ¶m»ªÿP$€ã8ûÞ„íØ6vt;Hî€TzðA´|íßúð×Ñ£Áúø_Ï^»ï$°ÔIïŸÒƒxw¦$)¸CÅÒ‡®{ÑIôs€³bí®¸“RÖSᲤÇ@ìFfZ¸u×°WV"ê?ô/ЪX‰àœ?ïyÿGÓª5À>£ý† /P®€é³+²çg^Œ–$-$ÜÌäjîZ0]0±lXž# í›ˆ@B àò¸˜}ê™ød‚V» £ÝΨ×~/z¿øÐ߃ó䓿ópþïÏ ìŽC€@X»ÈL ïÚÓžˆð*bÿW¬ Ú{ê*¿²ÌRÄ©˜ t ×ï<ƒ•ååtõ¿ŠÍŸ1ˆímˆ¯?[…«Y‹F¨—"*è :F}˜ÜÌËЄ†€É¼$C(ˆûÿµŸLÜP@_ à}ìý CBŒÇc˜Ó)ŒV ­NGîÁ“' ýâ/ ÿ‹¿üW¿ óñobòñO‚¾ò4°Ü;™á/ p¸%ÎVå…Ö?m4„ÒN+Úø 7Å÷ ¥RU¶’¢FÅ'%åð©…+ïz+®ßqÇûýèæ¯ëîé_@pÓ‹ AžwíÿäïžF¨—Fƺ +’I ä)ì ’:ýA䆤yœ±f² ¡€b9tNì ñ½€/8Žò¢ 1¸‚Àd29¢ÕnË pÏ=hÝsZ¿úàù0ùÚ×a~ñË /?é]-°¡±]³½W#RVʆ÷ÔÆeOÕjÅäÔÿÊLô¤ºÑ‚HQ‘ Ä€ËçîB{Å=ý·ýð?/ç¼&Cø»pÎ?¨ÿ㳤ꥀIÆtÚd cÎܰ–2‘Ë s·f› ÒžÍ÷(©ÿ鉉ó–'„à „}æ"In*xr„<Ó@»[@îít€‡ÞŠÎCoEç?ý-àùç1þÌça~ú  o~ìî“®ó ¯äf¾¿‰xÎk‘”ÀE¢V”‘mƒ"_?Ú… “º×±K8ãÓÇpûÄq¬v{ÁÆo„ÂÿÊæÞîÿ8>æ©ÿçh€}DEr|ïÒ"ÃWö¤/íõW^K q9º–Ë3„CmOàúÁv>{¦Ó)LÓ„¡ëhµÛÅÚÜé=„îC¡û~ôäyŒ} Ög¾ú»æé¾¨Dcмl€²Ï¨­œ– ÚªÕZ1¯P•þˆÕÀÇ&n½ñ°ºŠn·;Sÿûп%Ä—*Îa_¸üÕ“ÀÑU€<âØu“òʲ¬†«I°Ár^%´±rÞM èMM8“Ib( ã…¾.>LË‚išÐ4 º' °"øæ++`ï{½÷= üÿ9èɧ0þÆc°>ñ)гWÁ8´[ˆs”ß¾J7¨ÿ“,­Liþï¬l@¥Ãå$8QÙ®ŸõƒâÐEÇÁèî“xáÁ°²ºŠN§Mý["CV gêÿM|æ5@½4p‹1vJ•ó—Ÿkþ`%/,E&C|âÎ=ªZ(Ý[àVa%¬ðM>²›*ß}@þfäg:ÅÔ4Á9w“žt:Åúxuìý£÷þ‡ý=Ø|£O|âÓ_»ë”„‰`ñ§€äÏéÃ5d PqB»åÀ{º†iBunòØÄÂí{î†yøŽx›¿îmþEOÿù‘®öÿ×ޝc„Å« ¸~:¨ù{ÎÈ”]Ætª³ ö¸$Ügüf¡KÀ§&¦á”Àž`ZÖØüKå»ñ6'ßip{k £Á =ó`: ý7ÿ.V>ñ'Xûê'¡è×A¶:˜Z‹w9…AeÐñ“0”þeçž/Њ ¼ý¼òÓ ˜• Ð(ÔraÌðÔ>+I,ÔÒqãî;±ÔëÍNÿ¾÷?ç`’€T­ƒsáðµ'fàL Õl€†öUY ¤&pñ2’Λ:^» s4‚iš3ÛÆd2Ù³PÎEH`^ ÀvŒÇc 671ÚÙ•s ‰ºuðüï±ö…ÿ½ýع³ §~ìŒs—âéüD„(@tÙZ¨„ÀÍÐp\¾šV’錕119ÑtF‚ÌÁ^>M°_66ñê{Þ×î<‹U/ôO×4óß;ý3É*Êö£8ÿ4hâOò„§À>¢ƒæ87¼)3@?å™9&[Dâ?°´%.™xÂŒœáÔ­Mzõ¶ÆÊd‚©iºNq¦‰étêB7C:è3`{9ØhM×ÝE²UÀ¾ú4ZÿÑo¢õÿøæ·°óï>û+/Ý»÷ íîyGÏX.Ms=Ç9!@®’Õ+GÌÍ@W§Ý¢Üä•.BÇ`ØÕ‘ ^}ӽ譮b©×CÛOûké¸ÿe‡g ×nC<ö-°S3ï óР^PœØ4ÍåÀ#£¼Jf¿ÐÀ®¢F”>dÑvï¼tÃímŒF#ŒÇcL¦SX–…ñx á¡6"O•í £áƒ­-Œó²Æ©ÛÞÿ>ôÿ·µ/ü;t>ò0Ð÷¯¹jjÅêûÔnÍ鋉Ü(€0òŸÔæ_G:`ÙÑœ—Ê·dª`ùdôZ³ÿ!)û6œàÆ{߉»îÄš‡ü§{ª÷ý'ô[éá#Ö¾ñ—ºdÿKê÷F¨‘666nB EëãÁÛ2&FsŽ[*Rý†ÊªªzÌIKÊ’Ô³œáìÕ›X½z ›;;ǘN§°< Àx<^þ/,ù€°, ÃáƒÍMŒ‡ÃbÂÀéSèüg¿ÕOíÿùw@/ÝÝÚ.U¥ÚÌ!e+z{<ðœ=¹Æ”À ¡—çmîU¹˜"xíÎ&Ÿü@°å'™mûÈ*®=x?º++nè_»ínþ­–«þep,=®¼¾ƒœG¾vסˆ­?i÷h€]Xʤ“`år(G ¨¬%¨†”-É¡‹¹Z€._ÅÆæ&F£‘ ’ãùŒ'“}—ס*`'&"X¦é [[˜ ‡ YŠ;Ï¢ûÿ!ÖÿŒüÄÓ¯€#étïTYS@ê>¡yvL\tjÚô—9MƒªÍ=UÛ$œ²Uoò€Œ·¦Œ¦‡ Ƹõ“ïÀÖîé¿Ó鸞ÿþé?ÖwåSø;=‡sá"è+Ox&/·rZJÓ`Wf†ÂªÑüWdrV=–UpTšƒ^õ«¤qÜuíÚ7oaÛÓL&X¶©w`¥CéͬdñBÀ4M  ··aŽÇrå½åA,}ä°þÕC{×[!žù!h{äšÕd6ݽs›Ì]Ò„Z»Ùÿw¸\{­Ð”MgQÒ ;ÇOé&OÙæ©%0ÛÁäÌQ\|óýXYYÁR¯‡–a@×4÷ôïÙþ*žú)„p×ѧŸFv $b&ÍF¨Ÿnª,ì %”Éœš æüôy­XKŸ`›ËhÃÊÄÂ;/^ÆÆÖV 0§SØ–…ñh´ø}Yú”º{ä8Æ^XáxgBF+ðð{±üo>еGþüÇî=spT#“ániºÆgö@åÈ`;€%$7á|I V_ñ&Ÿ¥DH½’°X±Í!6ßõc0ÏÜUïô¯ù¿ºk•7~Ÿ8‡séœ/}8³†hš’äÆ5@ý4T½Ø\ `ˆMæôNpÈ©I(às:âЭÇÝ—_…qëÃ!&“‰ë hÛ˜xp¹Êl¥êæýAaäÁÁ;ÛÛ˜æi:°÷=Œ•þŸXú¿þ‰{zzæj-Ž‚•L)79DØ Û @âHg( )I.´¼ šM>»é}RY̲1½ÿ,®¿í­X[]E¯×ƒá¡ýùÿ–î§´1Mû‘¯‚>ó-×ùÏ#ÉÊÆÐÐBI¨¥m{™9Ὴ{C,’!¶x€þhŠ{._Åm/"`2™`êi†£…_G›vä/tÂq°¡\­ÀáChýýaí³ÿßû ç®Žƒ=G’™;,ªþ ù5KI,AQ¨ê6ù¤w€A}*™6nüÔObzê$–—–Ðn·Á8Nÿ¥6ÿ¬ùÍœímùïܱ -,GuÚ -¥À¡e.’ëDÁ……ˆRÉJ¡µioº|xí5 †CŒÇc ȶ1Lšü5QX+0 0 ²ï<‹î?úo±ü'}ÿ;Àö Inšá´Ôa(à0&€ªjäÒtêbΜ¢R&•›v k^ÒÎ4]‡V$–¬D˜ú÷¹/pÌþ¸×€ù0寰«tYébvÓÇBš Nļ‹5 ÞB£å•Çî¹xÖíÛ†´¶ d™æë>½m]D³É`N§Ø 0eœðß÷^¬|äŸCûÅŸ½tCaMd=WòBÝ<x 0P àõn¿¯JÒ{ c "L' 67ÝÂ$:} +øah¿ðnгødÔ·D´¡E¯fÞÿ>`>© ˆToÍÚà©pi)Àž¥½#³á£‡ ×ßýãX[_Çòò2tÃcÌuüÓõü9^Ôœþ¿tôH<ÁoU#ìÇ…ŽèÀhü3C²—*-¦P@åÛú– —ÛØ0žL_€ñh„i£(Õ­¥»„1¢ QbVÂÓ§°òÑÿ½þ/ ç^lQjïÏ…(É â|L&oÊÉϨE2Ô 0Êï ›|ÞZàPÛÀµŸyŒ“'±¾ºŠn§ãÎ{/å¯ïœÉ‹¢Ä9œ—^†øçœX‰vKBÕã|o€úi§aìì’™|% B|r~Y\¢:Bã8så&~êù1Eø¡[[[˜N§¯{!`×átƒ£Ñ;ÛÛq§ÌC‡ÐþíßBÿOÿwÐ~Êð¨§Þéæ“‰¤æQ”ÚŠEœnßìIò=uE«d„O&›PT ¾ù‹lcˆÛ¿ü·0º÷Z]E¿ßc œ1WõïiRyYvÜîìÀùü€®Y78àfÿKŠhQ“ °~º¥vîÑÁĘSHÜýv….QN|r»ÉÇÚÎìMÃéç„ÇŽàU/)çÜMê-ä«««hµÛÖ$°­òOǶ±3¢×ëÍe"4~ãƒèØù_ÿôÒMàÜÑ꭪ʌ˜`m¢£Œê-µc–Š] Êå–»‘m0~ÿÛqý=«GŽ`ue†®Ã¶mWõ¯i.~KQžæ‘úÿðÇܱþÑ%[л°´¨,Ìqœƒ‹!O¹¦J(H›9,ï¦A0cjáÝ=ïh:^Õµ@òºoocueeß ûVlñxMB`4¢ã8hu»‘[Œßø ÖâÝØþþ'8õ°¶´ÇŒú%}ŠòCŽJiä*Ž êEPµúN-8§ãÚÏÿ,ô'°î%üq'Pý“3¬Â|Mc7M§ßúvð÷¬‚cÀ»µZ ŠÅçć±r¡ `¡ÚJ,u°3œâÇý6žÐ8nhnŒ0÷T·Œ1 ‡CW;°@急ÈY„Éó °m½ååèÅ7Ü•ô_ãöÇlù¬—goÈÏ$'U„€2›SàƒÀ$Jµ‘D¥Š!¥·p¡£‰pë¿„éïűõuô½±â;þ¹· å‚ÿnll`{0Àp8Ät2Áh<Æ`0ˆžs»lºEZåíÏ–ea8Ì?ó¶‡Ðÿ〞¯å›œñ±‰0rÿbXeùS’¿´µ\2”¡oòÝ*€+ »¶…þnÿÄ»qøða¬¯­AÓ4!àQt»wúw¾ùm`cýu×!†´ä?ñ†6€úiª¶ï¦ƒIûPÂ×ðé§lRþÔ¤ÆÔRúO¤kho ñc_~OqŽ›Ü?3ðÂûòòòœ& )Ó‘z²- ƒ­-ôz=h!¿€Ö¯~úÿ÷y8Ÿ{8½¾«Mel"Œý¤2R£´>^Ñx ô D”>×p’—- Cϯoað›?‡[ïkÇŽáÐÚZ­ìê_8Nm§çÏCüþwŠTÕõE’çQ#ì3BÀÉðBÞoÄLXŠêPz3¯I(˜«¥–ÉÀ<Ô-xÞÇLªlá ÷|û<YYvMœ¦ ‡`úžÐlüØ¿G ‡Ct‰`´Ûîí6VþÙ?ÅÆ¿â†ê»§P [{à üh—øæ¿sP­eu˜ï¥ ! žßbòÓoÇÍŸÿYôNŸÆáµ5tº]Çqá~[-‘»N+ä9yý Çsþ)`s ^ŽôƒVW `ÒAsp&¯Ñ+4]rôñUgcÜ d©•Oñ^64¾pïþÖعz¯mnbÇ 2MÃÑ;;;¯‹4Ð3¦,V²#@a4EƒÞp7úÿô‚^¼®hÉÈ{ãÄÿ­™oŸ©Øý<ļ©ÂèkBøÛ™À9w7?ð@»ûn^[CoiÉÿœ£Õnƒ1[1`›¤pmÿ/@üé_g͵‹\7 @ýtpŽë5 }¢8Ö‰§h)ïü¼å*þ§m~ãd†¦(5 g¾ûC0ãIMƒæåxf§»V»Žwú<ÂÀ>kóø>žL\'/èÅø»„ñµGaýÑÿ vßñ* )U«`Õ ˜UsÓ:F¡6¨ï~ùÓ|™ž`¦ 24ÜüO~öý÷¹Ný>¸(ÕnµÀ8Çt:uUÿŠ[DêŸý©Oß½ œ]›SÿmÕÿµ#P>mÎ86IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/Jedimark.png0000644000175000017500000050565412412506713020727 0ustar sergiosergio‰PNG  IHDR'ðB¢b ­iCCPICC ProfileH ­–w\SÉÇçÞôFKEJèéUz E6BH(1‚ˆ ‘ÅXQDDPt© ®µ ¢ˆ²(v]EE}.l¨¼xd÷}>oÿ{'Ÿ™ùæÜß=3sfîçs W°„ÂTX€4A¦(ÌÏ“ÇÀ=ò“2À’ÅÎz„†´·-b7Í$±þQö¿Ès¸l Päq'ƒ†ð)¤å²…¢LP6ˆ_wm¦PÂ1ÓDÈ–ÌCKšç\ 'ÌsÙœ&"Ì Ñ4€'³X¢$H§?#‹„Ä!ÝBØBÀá £veóX„½6MK[#a!† ‹“ô7f±¤1Y¬$)Ïïy™Ø›Ÿ!Le­›ûóÿìÒRÅH¾æLéÉ)áȈGr–Ífù„/0Ë”œÙœ_˜é¶ÀüLfÄóÄþ‘ ,N‰ôXà”5R½ aiÈ‚Ÿá…ä~>f/"z9\oŸ­ “ê3²Â¥þž×ÒM2+@rÞskc‰úsSý¤ó 3C¥ë¤.•î%Qä+Õp3þÚo&/Â!N¦(BªIäû2ü<‘¿Ô/L»Ósk‰Ã¤yà "¥9ä°¼¥¹| X€ÉÍFî^k„ëDü$^&ùõ\SSÀ67eXYXZÉ7$ÑðŽ>÷m@ôkùÒ»p,DÎKr},Î<€úá/ŸÎ[äxwpn-eÍë$×`ÈP@3`ì€3p> „€ V6à4 kÁ°€"°ì•  à8ÚÁYp\×Á À(˜/Áøf ÂAˆ ©@šdYA+äAaP,%AH m€¶BEP)T Õ@Ð/Ðè"Ô A÷ 1hz }Q0¦Áê°>¼v€=à@8^ 'Áépœï€+àZø(Ü_„¯Ã#ð(üžF EGi¡ÌP(/T*•ˆ¡6¡ Qå¨ZT ªÕ‹º‰E½B}FcÑT4m†vFû£#Ñlt:zº]‰n@·¡{Ð7Ñcè)ôw £†1Á8a˜˜Lf-¦SŽ©ÃœÆ\ÆŒ`&0°X,k€µÇúcc±ÉØõØbìl+¶ ;„ÇNãp8œ ΂cá2q¸}¸£¸ ¸aÜîž„×Ä[á}ñqx>_ŽoŸÇãŸágr=‚!„À!¬#”Ž: 7„¢<Ñ€èBŒ &·+ˆ-ÄËćÄw$I›äHZFâ“rI¤ã¤«¤1Òg²Ù˜ìE^A“wëÉ]ä{äw EŸâN‰£dRvP)—()Ÿd¨2æ2LŽÌf™*™6™a™×²Y=YÙU²9²å²'eoȾ’#ÈéËyɱä6ÉUÉ‘»#7-O•·”‘O“/–o’ï“®€SÐWðQà(ä+V¸¤0NEQu¨^T6u+õõ2u‚†¥И´dZím€6¥¨ h£¥˜­X¥xNq”Ž¢ëÓ™ôTz ýý6ý‹’º’‡Wi»R‹Ò°ÒGåEÊîÊ\åBåVåå/* ••]*í*TѪƪËTתT½¬újm‘ó"ö¢ÂE'ÝWƒÕŒÕÂÔÖ«VëW›V×P÷SªïS¿¤þJƒ®á®‘¬Q¦q^cR“ªéªÉ×,Ó¼ ù‚¡Èð`¤2*=Œ)-5--±VÖ€ÖŒ¶v¤vžv«ö#¢ŽƒN¢N™N·Î”®¦n°îÝfÝûz==žÞ^½^½úúÑúÛôÛõŸ(0 r š R Ý Ó k oaŒRŒ ÃÆ¶Æ<ã*ã&°‰ ßä€É)ÆÔÑT`ZkzÇŒlæa–eÖl6fN72Ï3o7½XwqÜâ]‹{·°µHµ8bñÀRÁ2À2ϲÓò­•±ÛªÊê–5ÅÚ×z³u‡õ®ÍA›»¶TÛ`Ûm¶Ý¶ßììíDv-v“öºöñöûíï8ÐBŠ®:b=7;žuüìdç”étÂéOg3çç&ççK –p—Y2î¢íÂr©que¸Æ»ruÓrc¹Õº=q×qç¸×¹?ó0òHö8êñÚÓÂSäyÚó£—“×F¯.o”·Ÿw¡÷€‚O¤O¥Ïc_mß$ßfß)?[¿õ~]þÿ@ÿ]þw˜êL6³‘9`°1 'Xø$È8HÔ ï~¸To©`i{a†ìyjšúë2ì²ÐeUËž†Y†më §†¯o ÿáQñ Ò0RÙ%µ"ª1êc´wtiôhÌâ˜1×cUcù±q¸¸¨¸º¸éå>Ë÷,ŸXa»¢`Åí•+³Wö­R]•ºêÜjÙÕ¬Õ'ã1ñÑñMñ_Y!¬ZÖt3aÂÛ‹½—ý’ãÎ)ãLr]¸¥Üg‰.‰¥‰Ï“\’v'MòÜxå¼W|/~%ÿM²ruòÇ””ú”ÙÔèÔÖ4|Z|Ú‚ EгFcMöš!¡‰°@8šî”¾'}J(ªË€2VftdÒb¥_l(þA<–åšU•õimÔÚ“ÙòÙ‚ìþuÆë¶¯{–ã›óózôzöúî Z¶lÛè±±f´)aS÷fÍù›'rýr¶·¤lù-Ï"¯4ïýÖè­ùêù¹ùã?øýÐ\ S *¸³Íy[õèù?l·Þ¾oû÷BNáµ"‹¢ò¢¯Åìâk?YþTñÓìŽÄ%v%wbw vÞÞå¶«¡T¾4§t|wðî¶2FYaÙû=«÷ô•Û”Wï%îï­ªèا»o羯•¼Ê‘*ϪÖýjû·ïÿx€s`ø ûÁ–jõê¢ê/‡ø‡îÖøÕ´Õê×–ÆÎ:üôHÔ‘ÞŸ~n¬S­+ªûV/¨mkèi´ollRk*i†›ÅÍ“GW<æ}¬£Å¬¥¦•ÞZtñKü/·Ožè>ép²å”Þ©ý§©§ Û ¶umSí¼öÑŽØŽ¡3gº;;OÿjþkýY­³UçÏ•œ'žÏ??{!çÂt—°ëÕŤ‹ãÝ«»\йt«gYÏÀåÀËW¯ø^¹ÔëÑ{áªËÕ³}N}g®9\k¿nw½­ß¶ÿôo¶¿°h»a£cÐq°shÉÐùa·á‹7½o^¹Å¼u}déÈÐíÈÛwטּ3z—s÷ù½Ô{oîgÝŸyûó°ð‘Ü£òÇjk7ú½uÔnôܘ÷Xÿ“ð'ÆÙã/ÿÈøãëDþSÊÓògšÏŸ[=?;é;9øbù‹‰——3¯ þ%ÿ¯ý¯ _ŸúÓýÏþ©˜©‰7¢7³o‹ß©¼«oó¾{:túñ‡´3 ?©|jøìð¹÷Kô—g3k¿â¾V|3úÖù=ðûÃÙ´ÙY!KÄš«PH'&ð¶J,R; @”™¯qç’~Þ$ã?ð|<'³ Þ€È\‚º8ˆ4=„ÉÈ()×"Ülm-mˆGb‰ÖVs‘EHiòivö:¸N¾‰fggÌÎ~;‚Ôâ÷èJŸ¯­%j¬‡Èê3”±ÿmÿ©ÐðŽ?7 pHYs  šœèiTXtXML:com.adobe.xmp 1 72 2 2 72 582 474 ~”@IDATxL½iŒ¥Ivžwîš7—Ê̪¬}¯®Þ»g8ÞÑl$5")™¤M’h¤!›`ÐÊ€õà?²Ã `À° Û°õC’mhŠ LZ´¨93=3Ý=Õ[í]û’µåžy7?ÏûUά[yï÷}qâ,oœ8q"nëÊ?ûϦÃÑvymïíÔÓµíz¶¾SÓv¯N?Q––jßüBõzÚ kÚªêv:Õoµj:Ú­íõzúìI=zô¤:\_XZ¬™ùÙðêR¦ÕêV»Õ¯ÝݽÚÙÙ© uôÚÓêµ&ÕžìV¯øOj´7¬­­ízº±Y›{£švúÕî jaa±,/Õü W3ý^õú3ÕîÌPo/u·¦ÓjM©«5­ÉdT£ 4Ö¤¦®§üåÓ´SÖ öÚãõÛÕéÍVQk°X…cÕ¬îìê fk¸· Ý35Ú×ÿð_ÕÂî“Z˜Ý¨¹ù=ú·[33ýêÀ›i»[лU÷WWéß°8VG­öt\ÓáVõioöÆã‚ÈÐ)Ÿ§“½ÐµµµWkðzk{T­N»VVö×¾}óÕïÓF¯O?:”kÞVí ÷àÏF ‡;Èa:÷j–çV”ÏÜlÇ£ÚÞÚ­gkëµ;šVµÛ5˜íÕìl~·às«Zò†ç6·àñ6õí ©kR‹ðwye¹æú³µµ;ªG›ÐLÛ3ôóàÌ zÈl4Ý©1ýÙEfö¥ß†W£ª‹W>«7oÖ‘¥ƒuúÐáêÒγÝÍzºµUÛ;»µx`=Oèól¯ -=Å]Ó™Ví¶Gµ±9ªÏ®­Ö{?|¿Îž9UǪõµgèàÓ:~òx:~ªºôˆ~Lá㔾OèÇ~¬£OkÛ[ÕêöêðÑc5??_.~ZÐÇ“×Ro¡Þ}ÿÃZ}ü¸N;Y}ô`žö[Ð?FgP toÄŸ1Ÿ[ÔÛª1úÝîÂ÷W—ë]Þulª!åzãNõ¦]%ó£Ú­Q Ñg(+T‘2Þëå~q%„_”…æñd›·êâ vÔŽŒFJR*x|\m~[^Þî¶k;Ù£±©4QU:øŸ_lKÔ-ô½o§È}s}vÈU(â¿IÍ`‡½v¹¯Ó.Ï »È´M#}ì“nÔdˆ½Ð[j¢_´‹í´Ð!íÊ~ŒÇCøÜ¯Ï¡ÖP7DúC€ƒš@«mNÐ!>44µò ¼Uè\†êЭòø,ßU®Ð‡ÕÓüÆî¯>Z“'4ʫӥ•Ç{ ñ舿ƒìŒó×ùŒ ‡vñ}‡ë¾dZ˜(è)Òj v›WÀJцuü…XfÞeaÌm€yKÓÚ¢@´ ùisÄû1×§r…Ò*†/ih˜Æ5>¥zIÏ fÓ¤àåÄ4  „ôoŠ`»QL ª´ÑNz|´@&\ŸÀÐ(Lo‰Ø¼Ú³Çó]Ú§S÷Áuh¯Ã# Zj¥k8Bà‚€*ÏíuZòÚì{äJ ÊM¦ÈIùðüîî®6ų}èžWÒú|ÐÀP‘Š!AD#‘†6ž ݃þ€¿(6ÊÜn#SÊJ×ÞBñìh×fiO¾µ >]䙦(°Ì†Ö1´xíñyr;Ã]Ô†?CèlS¹º¾ Ý~ÞÖÒ3t·¸ SNcÕÐ;l°ao¼‹±ñ,å¥Ñÿ[| æ"oë‘¡]Ð÷‹õz³eÿ¹¦ÞìÄÊÉÌz:È_uÐ6:d[|à/ºHýêä„¿#Êhè¨s~D4Â=À6€‡¼ç`¥1«Ö¥.ĸ©ÏÎk”cÀqÚfБç¹ÒÁn,~R7 §£ÔÒ¼·s HD‡7á›ÏÐ^Ó.º¡ Pí¶ÑW#ÚïSwW:(:ÄñèÑn¿3 ÕnÍð—a+º3¥¢÷"côfÊKl=©Ã²Y€™>×Ù %À#,¿lF§F îè :£¬¥Wëóù©õ s-øÐÅÁP÷ÚÊ}ó‘3¼U×´K^Øä!EŒÌ“É¡Œ5ÆTÌ Œ˜¤j˜§Í(À#íeÅp B@há.D!äÎÜŸK«)KS7¶%œ:Qh€P5˜O]ˆÞÕë¡Þ6ÏMöø‹'ѹ¥¡%á(r  ñô„—u >SÞؽNOdŠ¥BŠÖ‚’Þ†žW£ìÀT«P6Öë±_FÝqÍ è‘CŸNÔ7áþÐtÖª¯Q2²;ØŽ<•0‹µ¢t”}n¸“Þ“÷ÐÝÁ #-4«L‚7n#zý)l ¦¡ßÚ °ˆö°$NÙ&€K‹¶ût`âÀ¢!f`@6ôSêc$kFY “'ð(apu`ÜžJ«Ãs=¼ÅéŽÊFÔ‚Ž…—Œ,Æt°ƒ§<Ö¸)+ÀëÎúµ·»ïáE¾d8Õ£t´íí´ á¥% L¸ÞBçZ0uŠ.ê k 1N DÝ1ÒGËè¿2Ÿ0·¡}àm+DÞûÜõìB<<àZŒ$2™B+ý¦ÛzØêb’SöcÂkä·ÛòEˆv Wãõ×Ñ5…NM¡§‚TŽÁ£‹‘ò£]I ™÷<룱íxrÔ+tܵ iöWO¯yaÈá¦Në½hýg¼ê¶`Ûåe]X·¡GÂz;ðKYó´×h“zè—À‡¸ ŒÞ)'ÚrÐTNÚ/݃W~ ôÚE&Ú˜8 xä%uèéFÖ:!‚þXªžÅÉ =ÁHš$Ë¢ÜÅc¦ðˆÑiÄôCbz= d¦SÛ»tãE>0P•—H;àGÝ=§TÑ}Œ¥¡ÈB¬£Ó”tº»Aà¡áÙèHB‚†F6¦B§c-êÖ˜lL”•–†›ËÞÊ=ߨˆ´WÖ‡¤Q¡úãû–ŠÊûx;´e…mú„©SS¯ ²rËð×ç»<ëˆ\IJ|à*w Ñ‘]€ðGaÄMרà¡à®¡·D9Œ?Ö)ÐqÙUú™Ù¹ÚÚÖƒñèqÌùŒÃT¡K‘< ÆÈÔ5ÚY€^ã:í PN'uè™ýb‚¦ŸéKîYý›L· ºýNíbäËšô¨ú<³7ÞÆ÷è.íÓÝ¡ F%z–>]JŸÔˆ!´i ñ(쿌ƒŽùùÝ€\`Ï€=zÜŽÔz3ÜDßú5`Z:‚Þ1ýó§Gv· 3ì0ekí5N' OÏö#šŽ®è-Œ¯£¶Ä9`8à92O©snfYòž{Cô|ým1hŽž(ÖŠ:ù ÜÕme5ÖC@?Ô3AA© >ž»â¯€à@ÍS‘=7€÷4L܃ôߢÊeL?Ôû°ÍÊP1‡o½©è!¶ +¯´§ŸÖO­ðÒ'…;ê†Îx¸|Ö#çéÈËUº ¹Œ˜ní©Kè¥ýqúš~@Èò¸…F½zú!mԭͧð<ýgÐÊxa!Ȱ?'­EŽÒIí”ASÁV»„&ú0eàµòf„ŽÈ1Ì‚ÏT‘%ívBCbÁ‡v4w$¥B¼)…«RLè”HZ\Vª—»mÂ*¦CR*²J®ì¡ 2U†f:E1+ é”bpÁ:;(eg×f¤³Ð$-¢·à0Â3p|òe}Öp¥1@+–2\ àJB_&² f*úëu9,ðyÝzôÆ¢€hœžÔãÕLŸˆ5õw¹«²7m`§i²ÒÁA£¥+¡S ³¢pÔ¦‹YaŸi±Qo Z9hŽ2Œh´ãtÏX]žÐZÌCY¤™:´Jþ6|Ö„¿˘¾îS €¦´jÐô‚è0fÖÆcö^pP+'{Ô¯ÇCû>¯BjòOœdu zå¯Ó¯; ’œ1#ó¸ƒüÑ|8=]#ßÕ›¤nª4fð¡Œt$ž!8ðo úh& Û3Fész´ècKÆR·^åìÜ\mìî@ úcTê©zˆ.gº­qÀðUJùt1¨©öÑ'­ë98{Uü±mZAì/¶Á…„ÂLÚz®W©âÐ.ŒH‚}g/¸ƒÓŽ”tAŸ<ó[ho»³DÖ´MãÒ¨Nò 1lx/ÈQ Ï"&ÕÀ7<èóÜå‚íÀWA¶UP‘þÕÎlÚÁMê1…Q‡¶©,3hb[.ctHÃA˾X—ecƒ\oÚOà+4Â(½Fõ¥Ëtu¤>3`ÒíÑh$S õÏ›ê©Ê†ôEžA?כЈªHÏuD´£fŽ­[‚îJ0.¿èÖëΤ’1.zÁ†ý<w•ù×iJê€A}4p®àìü ÷uË5º6JÙÅc@†ëhKîi*ÃsåRÑu“eðˆxÌÞŽLSi@á2*)$Ê¢ƒÔçHâ§æ.„ay¼M{ R1Ã5.(=ž§Ë2Õ)cÜnËqK°yúh…¬§›”'vbY›ÔÐyHºF#ŒšÕ[GZÔ }Ê´RÅ™ø§²©ò’ÚFx‰oÁA°™ï+̦?„§² *"ëHØÏM»Ñãƒzeèá>ÔÐŽáƒÒë´Ÿª©Upʼn€)ÓB¯T‚¹JâTN&¡É‘_VÔÓCõ9cVÇ|ƒ…" d˜Hê’½+ºýŒ-Æ MÝ $Håñ%XXGC˨Ç= ÖQF·ÚÊþH[‡6C ”JæüßiIãq( Ã0ƒÁ1G2`£¶Å¯õGQ:®*h€25¥=0–99÷e¦õ*h–bù+ƒœWOñÒ@ 7·¡›6‰¿Tä§Yªå9 EçÑЛº4Á@þSÓ‹¸î^Wy˜ë-Fümëê,WÁÈã@üv™*y<$F:Åèµ KøÆža_L«¥ßØ’qG§ŒlD¦ÄUШxÑ^zhר4û ²·lÀÎô °q¶ W+©§nÐw+À ’vÚÈè&Â!ÒÕK9¯;õ2;r•–ùŒ kD‰kÉu[ž(;~_âз´ Á‰eBjøF»ñ—xÊ癆ãv3êµA<Æ)dC ŠºK@RÛN Ëø=‚VbTÒt$ÄSˆËKg¹Å‹xO4Axÿ“òœ©ÃNûRQâ:#ª¯]¹K‡çøÜ¦ýÓš¬¥¤À 4`»Nã80Ú¦¸³ö£#`B“6£'mb`–S'„§ æŸ2š ®ÑžBƒÉ® 1–èT,ÓLEDE‚â£-z5m<‹–® ?×Ü“þdTA Ñ“¢jµVåäšKðæ:I“S]Pݤ²råè¥WÁ5…ýá½(z•ZV…Ò €Ê‡6FÐ@ë¼&<Í“vUgWhx‹ Ê/6é#¨‹C€Š.ÿô\õz:¬<éÍà5ÈA›_œ¯Ï}ùÔûèÉj­_¿ ‚КúB`]xÞÒ»Òh¨Ó•£ñx‹zð ‰…4zF{ÐÔ#Gi2ÆBO4ä…|Àâ…š@,+wô—¼±>^ÒîÞ6+¬ôÁ1•¾5S\i¯Ú®d©=c½>ô‡Li#<‡<­<*Á³ˆ( SŠ÷,|£-Ó-øæ¢ˆ ’82Ó8å7•¡wJ‚øß¯èÏ;Èá##|FI¡~ž„aÍBdp±Á7ÊJ´(O˜\§•Ø7¥@ïsŠltY”6ÄÄ”zðê t8Ы…ÊÃ…‘!•ÅÓ§ïÚ‡S}ÙÙk7\3Äà_Óö›‘ö¨;Ÿ£¶è bÃÜbæ5…3pÒÅÐï¬Êfá™ ,r&+ zsÑac¢ð@FÚ¾#­£¯óY9gftµ#•HPbK*2LÉôâù{QÜXɉ}ºþ3¼ä²„н0Lh–Va:ó~ÛÉ ilS„¥Ì÷yAF â8ª:Å ‹‘ˆïÛ"Vh„VžÑ V)Kz¯îkøþæ'()ýv½yV¤ÏôŽ2É7z./ºJ=’ÏuFä^@Ð]nÊîeiÚÏŒ]CVÙ¶ˆô„”£¼ £çæÐ˜¥SèVIÒ2L‰B9ÝÒK£Ýða:MõB\nG, òæÿ§-’UYm›Ã[Ñ« ­Ô¯<ôí£Ý60Ùåšê'@xÑQLÃÒØåw–€Y¹Ò ŸÒ¶Þ›q•ò‘§*OEJ® ÊK²ÀeÍtR K\Œ¿‚ˆ#ï`v¶ÚÏx¾íލzœxõá'Í·ñˆy¶kÐ:ÌùÙ\ߨÑ2À± ß Ž¨K^8M£MF½D¸>tó0•#R Nùæ ÔGgûLwv6ˆÊX™;( Hꈩ/0 òLž{öÕi[tˆÚ~5ä ™=矣¿¿>£\èÝ„¿nyiÒˆý¤ü‘ß £`ŸF—`tÀ„ž4¥+¹Xè‰í*5‡ô—…ªÍ*ª¬ðndí<ÛhvÓ*—¹ÇtËÒ.&p¡ kX?”óšAŽz†Y¼AþªŽP®ÇÛå}ºÒŸ‹ (ªë♜¥ïè² ¤÷#Øš_gIW Au4 Úé z)x¦-þ¦Eõ[Ùrßé^³Xá bç1Ô½’ÊPzQY—yb#ÌŠJ̳ù±2F’ðÐÊ|¡zS2_q³„®ÑC¶;rè"˶€£ÌæN ›/êió,d<ÜGñì –>—UÐŒ %Ìk’%ëáš/*°¿Q4Ýd…À)Â~AWâÌöµnó‹ âÊpïó_€Ivê½eê§áñß/t;’ø"÷–QœewntfÚ¤ káIëž§ÀiWì§´´0PÁ×i¬ltISQº|ÖÑ[R+ŽÉn ÞQZ/DÁŠ”@“i}aÒÂ3Nwq—€5˜'™¸oñyÇ5˜ÇSÆ6àŸ€8í1R$.ƒ" nš$ˆ‹–ftÇ3I …Ï®ê™uo ÉOD¯n“þ~ðч5;£·3$OMìðºsx+¤)oÕa*ç¤0a‚ðÕGǺݺGÒÆÃvE}Ê.ñ—_hïG6"w4îf*ˆÌЗo3Sâ f’CÛøY€UÓ˜ÑðÕV˜VÇ8 ʉšà‘ƒ`T˜§…æϨ3/²íæGu ‚‰A©÷<ÙÓ‡xXÈ]z_#CÄ8Ô4þˆlqyeIÿÄ膱;î PMf»2§]d¡µ©§ü¡mêP/¤:ä_XølŠÃÀWô ²#¥ y©±AP¼lË£cYõ”&ø h8ÃMkkRÀ…ØÀ$;0fŠ ¨’ÖÑ•è¡Sf=mlºÄîØ0ü@Qà‹Pé'ÏãÞä³|<ŒaÚ¤€Ô¦2Áí*qlÄCA-*t‹­vkÛ- Ì?™Ï »,Ì̶ê”Ç•Ô5))§¶(·¢p‘w ù? %±=ÁPTjWhŒ‹´1`›×«2ŽåÜ?˨TºcúÎs*™×e"U†éi“çÒ&C‘ɘ~T!Tì]s²ô<ô5h•9Ó‘f„ŽW”&XŃž^¿Y%²>=.GQxû˜6ÚNÀ[Aå:¤R6š!Êíd‰gjVÁ ñ‚äýÓå5ÉЄB Á)ŸAßt(šNËNuyß±åT6xDßcavž—ôY]鳨°G·‰Ù¤>Ô\#•>=9›òn…qLÐ7G+uÂ'Ýz£?7¨å£+äHÍÕ6J·±ÐÓÏõ-b‘#VòLÔåïÎ#gâHé5,SP’;ö³7Fm|]@W’Ì}’Ö›²ðÀaU Ñ`i pGg¨ˆ`øæ½¦,JÐ$HÇû£ŽLõõi´§ÇKô.› ~A¯Ûª(?¨Ÿ“^}'~Ää½vÖ´®0P¹õ)Yè!Ð4ѦÿªÃÏ]êQ3Øã ¦ÒRÊÛMmN…î[Æø™u¡1<kêÕëÒ›SŽ™’i²Îû螃”U Phhç³ý‘zUÑ7‘’î±áÅNXý´«c·ñ”3 ½LŸ•Pé³¼íÆŽµ#nz?ŸéŸ÷’ýŽM&ÀŽ ^$ó&müRí‡W›Ž]jøGù,~qÁz\)΂Œ’AKÎ3ØàB£œ·tù’ Å-‘2Œ@©}≆l…z3$ì¼ù 7Ñ!so¥ÃNb8Ö§"a`q!(A[®;*˨]æŽÌíx)KL—2è£Ö‡Ìo"¢=GÑHÆvá,…Ы6äLä3¥¤ }²ìºìƒÞÞfÙ\Ço<'sQMm^7׸RµöQGã Æ7Ú ¼ž’«Câ+ª˜Ó¥>mÈÏ@¾6”V¥EW;A]äÖ Ù F—iÂ4¶â¸#Jºñ²TAû)ðš©‘:å3ˆ÷GŸ•—Ò7•ÁÁQ2œ$VÃ"ȨµS$IÎ,@NyæÉZç¹] [yì’Q<Ó^@)Ø3·½YØŒ»¶ÆëÉ€1WÙ}µíwï?düDñççäC¯ÙÞ1áROÇ©% ¿mž íô ©?»¨C Â{lê÷÷!OŒ™è ÑÉÀbý¬ Fy:+¤¯zÑ yÑ+z‡ÍÆ{´5èÏó,þ”ÉF€Ñ£TŒwz,Ž^“GÀèÅ¢¨ð>Q¦™¾Y†õ¡…ÈZž!_ø›iExŽ1¡7žVC³ôY¥ ”<:ô⚺ÑKÕK !;J:åÉ3Ïû =˜$Z¸‘>#¯›‹4eÄ@~3-‚fø¡WBk@g —¿‚šŸ}G/hS{£Ô{T0¬Lå½^8u©'Í€J9e…L’ÊÁuëö$’¦þTÞÔ® ¡«I1` ÎX´HÃ?AOú-lÁzü ]ê{úByKjpƳ»à™‚ÆdÂïXç9eˆÛEa½ŠçÆÈ!Ä6st„NC1`'6aÇÌöÕ7weÀªÌÈ$=ªx1²DÈ0#AY-±Ü ËgÁ$S?§4(•ñZ*rðœ¦Ô;ij›eãæÞ™âžÍQÑGmb ¼U˜6J3^“ñË;—™Eõ(† @›zhB«Ad•È8‹£j‹“Úל8R" —Ž >ä¨Ã3ÔÌ3z`z›Ì•ᜠ©°á~Þg£0S']*ïD9hÝ‚ªÓU®$ABZä’òøg¶@™ÑRv¨±ÏÈH·qqÍë´Ç=ÝaA-q;ÞwÈnŽúp:ê&`]d¨FIö-,Ô¡—NWŸó›p+ê³®Öå÷?‰Wròìé:÷ò©­?ÂÈf¼Ÿw¿ÿ^ àݹÓ'j¥ˆzPlxtýÞ½ºsïVÍõ8këȾ:xh í0²AKb¤Ø# ˆ&¦IÛª"­R'z-€ó^éÏg,诀=ã‘´áÀn'²TGyXGìüà)Ÿ5|`›‚©^F“°¼E[;鈞eVF/örEÃHWw ~µo½[hýkB[‰Â ƒ°ʨ0ºèehP@ ‡W–a"ÕB9Œƒ@syff`6¬ÓК¹-õ„ 0TZL9S5‚©‚ÓôËb•LqO__¥@0žxH„nÚ¹~ß|ÆT¸§²ÑÏš°æ+À¿^ŒBnв~=–$JÂS³­à亣‰/ r”sE%ól”^ô±¬ k¯ìÝ€Ï ÿ¤$!ZæêTF;Ï0‘«…{ЛHŠk +³‹Lmè'Êsÿ£OëÉê“zúài·¦C;³ëêðà3¬³§OÕ>«þì_×Oýò_­}çOÔ€X¿s»n\»Rï}ò)¼z«–çjß"ÁìÝõ,‡@n¯?¬›—>”ÖjƒÛ¢­ÍǙ­³Ú û~nn8­ý ûjßIªþ›Áž”Óþ¥EÞcAÑω@ºX¬—ôö`Œ¤¥O>©‡ù‹±nG×½n·3‚FÁ*„q1á©$ Ë%¢‹ÞW_»®ôH{t­r°¦^Ú6sREú¡Û*tXlÁ–­GGÁ,É oeWIB?žç¤k¼Ø²åº 0X)#S7Ä¢¡p½1:ñ.ój@ƹ Îm–©eLì 0…é5JJÇõ¨œŽ 5J€ëx)Ô›VeåRCL0”)§32õ0`Öaº%ºç 64Ö<(Æ•ªGÑHÆ)ÍspI`SAðŽ\Q8¡²sóÓ¼gÆgC“P1ÂOÊ L0( c_F ¿à‘åj”꣘å˜xœÂ0{[òXˆ£Â‡7ÔJy ôJ2`‘r<< )d ‚ôÅM6®ç¨ä‰ž<;n C¥^〮q¡žÊã ™ð(ù0Ä‹L°›Œº&©™-Ì*ììG—Õ»÷’E<ݽÚwppY¬9êèçÏ_¿|¹ÆœÐùó?ûóuüô1䌑èvZôä1§>ben0ªc¯žà”Ëõˆ×³µÆI™ÔqñæýúÖ÷>€Wûj°x„xÂ\Õ&|„±=ê^À#uª¥ÞÎÍ×Âø]]ÛÞ=èìaî«r‹I›ü¹ý‹Ë°Ü;§.£«b嚟ÃÓÚ`ªŠœTx§Œîóˆ¹îùVFŒÆÓGru3«¸|a=ÈPïA­Œ×ÿ­/[,‘ºh£YqRFð›ÏA?xƒ|ýÛAþȉ™ ,ԯʨçz-Mü&­ C+¤Þ´JkÖÃjuBÌYÍíSoL¥1¼`½ÚŒ¦Ìh:ìg~¹ïô_Ft ¥E-MâÓI ÃêVÏo{L_õôƒ ©%VpÔï”.zGÏ÷·MäÓåˆäbT;¬.ö9JÚ@ûæºGN› fÚ‚¼4Õc«¦WÏàú© y;phÐð±Ñi¸ªÝb(®¸:°º8d,6yÞi‘ºm‰ìÐo…v’û£N"›€²1+ÚñY…w¹¼YСŸÐ˜Em ý NZ´Q98À5qA µ]Ÿp‰t¶ÐÐbàÓº£8 \òåPÛè6a¥\¶M_ò»BF³R(Xìz‚ï’d¼ËQÈ*`bÒ´Ùðe}k@Ëx!‘ÐRO›Ÿ$^ …&AÕéµû°æ¯8°¢ë–—'GoÓóÀ¬z`O¬¬°§Žãu»Ä2fQ0ŰNši:æYkê!½…^óCnŸÂç½±Ï1^e ÒGª›iÙÿO°0V`˜AYÝlk¦ù2aolR'†‰€YX(¬Êº4׆ùŽ,a”¼ T~aFóœRy>} j 5Óï=”¼ÇÑ'Ý©çŠ7ŠJÃ$Žò ¤qG›‘ÑãE¾Œ÷Žm§Á€Ò,#{‹ÏºÛ)ƒ¶ Ã*^‚³ jn‰í²„¾gÀ°h¥Q°˜ä ¥Ÿ/F>•ß>û‚•îÙ3Fgÿ“D¶fÿg‘÷0ʧ·ëöÝÏêÉͧµ4Ø_–Î6ŸþÜkõòO¼Å˜Ó«­›7ëéÝ[ùF’2W=¨gNÔÜ1âEÓÕQÝy´Yz½æWŽÕ/ýõ¿Å9ñýºÿ~íx{Ϙ‚sìuëkï|»êÔAƒÁlgLò.#§·\GÇ'H_ØD®9|›Ÿ[¨%¼¶yÎfÚAnž>¢/ÃZ'½£åÊ#½»u÷v½ýÆ«Ñ-§I[]¶1•;§& Ó]AxãV=} Oà\<°ãGÔ³ÇÄ`Ú‹˜Q@Jä®f”v Fê5×e œ'ÙÚÍä•@Ñ6ô CÕ@ŽÑ t¾ñrc™–: ·ÁzôB( UèÕùõf@¹…\éµ¶¢±;Õê +§WÊã•ð E|˜ÿÐtíJ¥^íŒ?ÐÂ-õêùè†êX*½âž`¥>‹ÂL¨/<4 ”ÔE½®ÞëCè†IB§×@¯TMß=[ù¨whÍÚá=Us¨<{ÜðG’Cñ.“r›­,¶ÐÐ"0ªßöÌmüÎSÞœžƒá²7›ø Ã{;'sü› j5Ý MMî» FëY@¬ïc¨ž2Ľäkè%H°õIF(¬ <Æ Ìw‰p†:Br¹ØztÍ(nŽ}€ÒjCŸ\£Î•}]”‘‰.Ù*9— e¶S Wì¢ô¡…ºVü]ÊênËlÚ•%7ïnÃ'{;Üa¤†(xÄhçqNÕp¸ ÿ UÀ²çä¾iVsð²h_Åä.ŠÚòYZG ˜Ú˜Ÿ“À¥r€vGäŒ.–Áõ÷dC½·}G0½"®Ä!o½¼ÌÕëuá½êág™®-Ô=¦rˬÀ-ðÜ[/ŸÉìܽYOˆ#=¼~@øFí0;z‚gÕʹc5· °"p~ûFݼõ´V™º~óT½vþµºx铺uår-8Xû¬¥îýÅ«azé?´ç&1£Ç›,é3-N¾ƒß2KúN;–X}=täh=~L Ê/µ`õî1†=NFÏ[ð .î?zD|«ì¿ I¡«LÆÎD[™“¿D×3q/˜¦]" ùq„ˆ‚rÏ¥P·ìHŸ$¾ÈruÎ/0àv™î’(èª[‹Ø…”C‰ó˜uKwjähá%®í WOÎU…äHÔ¨œ ÈMø ŽØŠQ@sd1SÚ¿/·¡'ÉãÊéy Ô߯ãÙD\¼8ôÒñZÄÓ±m"Óµ{ëN}û_þI}ô'X§N}¹v1Ð_ûb#°½¸X¯¯Ü­O?¼\Ÿüð#€ô`=w–©Þþºzí¦Œª¯|ýu`ÿÞL?8ìîñ*öµq­ÏBÖ÷™vèÈ,ßÔâ mÒB·4¤Ý~=z|ŸUµÇùÖ·¿&¿j› »]¦u;œY¾IþÑ“ÇLñ¶ëàò¡zÈ4ïÙ³õ¿„]2É3­SæY·»vñ²"Ø%tÙ›fìJ¾;ðªëIpDðx@HÁ1(©3¨xF=u@y¡C2êsï¶÷”­:,Œà”¨î‘¯ƒ(âÁ¹`BµvÔëÓJ—b¼ï©¸ ¥?OªEw|\gÀëÖ£®ÂD‹[Ô™·ÚšF›]Ÿ=/OãðÙ¦<0 ½òrózVï¸í>ÅžŽm¤@«žáYÁCõ4Í8•g}é#ðÄ ¤'+xÒÈ‹iÃ&SNZõÑv@Íò…>S½äÛ‹¦ŸB¼Æ1½‚€{»t‘¹„e€n§@bœ‡îb˜T o­ÏþÒR:® cäŒ#—O7͈ƒ†Ä]•Pã¨È>cC J€’8]cøO[L="ïª wd|U^° ܤ”´À¸Lï(ßl‰‘iP"Æ%vôB‰SÊêŽ ÏÏ*¦tH£íªt&„¶XÁr4 ÇxîÈî ñ<ãtnYÉq,”ÉIƒÐ œ4ÊáLt>/Oå-dòá9´gDÉÕ¹¡;¬7%?e¹<1œøˆ ‘íПÃ/Ÿ«CgÓu#ÅOëÞ‡ïÕÇßÿq]¿ô¤ÞøÙߪ•#+½ûuþ­³/Š¿ÊÔ `*<¥Óªå£Õ^€˜6®?¬K?­‡€Â3èúäÚmÔa¹ÎŸýjµgæëå·_­Ùe§a-@éYàÄ××êµkõds ~¶ëÈÉÓôzP·ï¯†ÏçÏž­ŸÖM¦˜~e˜g“oðm+wWïÀ_2ÊI+аŸ‹¾,;LyÕͲ¢÷µŸù+xgLÍ¥;·ï0ã¤MÒa]0Y'Î6o@žʶùZ3=·•ƒ+5gÜÔ­XÄ>œÒ¹ŸP㲜` G‚–gyˆÎ "0A¾ã) $®$i¼Æe^CÆ9ç¿ÑuÖbüEËÔ<¸à)°z¿CtÎñ%I‰ôÙ6\Ro&h‰}QVLýªvôFz¢™@׌\£¤=[T_lG€Hí«•Ecl. Ðè—uò õHÝzÔœ”@‹Ô‡ÿ€´. ©ió9ýš™õ[^Жþ@¼‘t£¯±L-Ú­3“ämà5OÁÈLF´íOú4hn›ã!Sܧ~ã¶QN·ªÒ¨ÜÄ}õ2;×a…-7y. _>gz~]–q]Æ:òˆ_º¡NÛâ¡AEæ´N݈% ‚R¥—!¸x¢f ˜g%eþzäÂåk :EÛñžìQŠ Y‚ Ï œ”"^¢ÀÒØÂpÒí9@¶yç÷Ãz¦é»åŸ‘A½Éþº¹ŽÄÔ‹ ôÈãad“Æ9SÈãb0 ÏÜÙÕ$Eªc4¦pX]È7ŽÀGù—é×ãýñY7:n¬à2(y™ çW/©‡«¢ØþX€@ïœÓR„Ë—½ÕÎÃÏêîÅ‹uìäùzç›_ª…“§0 W6ÖX1{R«nוw?`ÙÞµU/Ÿ;Í´‡/"Ðëa ÊG?þ°>Z¯¥•Äæëоq=y°Vƒå^½úÓo×¹×ÎÔ>ÉQÔ>ݼtµ®|òa 1ô…ÅClyˆG´QOˆE-<–`µ›šç—öÅ ÷\ñuâQŸ7ÖÂ`›ïôˆ^bL(ƒ±¤%æ´Æôðñê´NÍJÞF’lêÑôíù—vPA¢þ$Á’{–±uO m¾¡DP1ž)|V-`}ÐDÍ›á9tD[r¿¦ÞˆÞ* Ùè–v­šB_‚øÒÚ\â3µ*ÛPJ›þRÐ…-"]þ§p¦d:2Ô§SbÒÍ=iÉbmÚ^jVæ0ö8 ®3›ZÅ–ô䑟•7(CYâ/4Î_b1.cbsxŒ;$DÉK àÄthLbd‚‰˜ÎÚ–¬ÀœsnÉnPêð9Ä›¢{–Ó)cpêé„S5À,u¼GÀHAF`JŒ:0߈1ŽZ4Ę̀§4pºAÊXŸI˜§`š>4à:àË<à. }~É š0Ü~ÂAgŒ†]F#·­ (·Ú¸Û?n¼íÒf¼)æßùn=ÚmbÆ}—¢8å§Ó=5AžDR^(54Pd®†0€eD6>‘­Œ Ìéà6GôÛCê»L_NZ©6†»y°`R£KRã”ü zx¥¦Ûx0wY‰»õ¨n~zŸ£‡ñ`“üˆ·òÊù:rüHmÞzXkx&z>§NœÁØÈUÃCÙè@½ô¥7kîÌ!äÄ7øÞü°6ª/-,ã%9åŒ@IDAT(ÇÛúøÓ+õˆ=l» Lž63·H~Iž¬ð±À[óLï†Ä7vÕæÙ«hîÛ ^6ªO[¨)2X}ô´n]»R?ù/Ô«çO֡Ëõàñúuƒ© 1°_íÄ—h£å#'jz‹X±¨1GÛ̱ÍÉ#FæI9P+d¿Ïñì¦*\z¬Côv8€è¶Dõ0ZÈoèõË_¶BQ˜qï@ª¬” ùU…‘5e2µÖêÕCôÀ ÚˆÊf)õÌÒ,¢éÆ-ÇcÍȆ¬xO5‚U‡ÍãÙO½=6cHxÖ(¥ƒU4Ûçi;TñÞU2H(µèKsöÙsOHrì¬tØ,ö!U–õAË+*‰ÈÞñr˜¦º+\5ã·±Uøä"R¼,k¡lWÊ&>eLOOH[Ë}®CoÃOíÑ6©Õû€‘tØ^S¿åZ-Óõh öK tÕ%ß³­5´>BK xè‰l¼v‰^LC²4Î5®ÐÏš½‹2èê°l×"!óþÌùÁ†C'¨yk«25S%˜`_•/}bÂ>ƒájïÉ÷p4d¾Z ·Á‡€tØ{™ë”Uà.F¤`3 âåéµ¹Qv€ìæãÛäÉ9Ýbäç^‹LBeôà·œ(Hê¢$ÞÄ}Év¤©î5#F:e£”|I`ç}P—;Sßxš.Ú*È{]ïi“mA~£îFº÷!_ŽþÄu¯iÛÌìy¼W@jxÿqí^a5‹øÓ½r×/ß i’ïcŒ˜0M;ùöWØnB Ší&‡¬g~_ߺ^wÖk…dÇ1ùCÇ_{ 9Ó·Ùš[éÖ“{WÈ[­rè#¯ÑêV ׺õƒ/Õ»ß{¯fö8Ø};;ð9¨kƒÕ±Ï._f:wïoïg¯ÖÌ<]Ô“(ýBÖ>+n«VëÌùsõë¿úËõê©cÈ{£¾û½?©ë7>cª¶UGŽž­Î‡ÌßêrÂq—-<(Ï‹  s ÐzHÖû‰“'تÃéÊA€Lωè¹@ŸU>ø¬G“\'C(£|øß#†" (‹À2EŽê–ê¥dÚ£[o²‘ecìŽþ4§*ìŠÐUÿðx3;‰x]¡n­œÅ û&ÎÊ{u4ÈîJ£DœÍÜ]…á£ÂÔ3“«ùì#2ÐJ}Э0êý·wÈåAù¦ ›I"”+Œµ?‹‡ç§â{oÏÊÜ¿ÓÝÚTä½!Xè“Þà)s}ÞÊ› ;SP>zC9xÝÏ™‡ËnŸ‹€šQFCp—x‚ߟWúÄc2•#®-’áÞ}ÿûuäµ/>Ëõéå«~/jòû# €èõÉŸ]ÿ©Þùd³d…oñÙ`÷ƒO®Õ_$àýÿѯÖQ¶ÁÜ¿q…<¥‡õñ‡±wäO6/¯Œº­ºy“Ïða@ ÈûC+‡jdÏm¦µÆ°¶Ø`¼ ƒwwnPÇk™{úܺ.‹ì·+²ÞMÍ Ðá.úí×xJÖm(ꆎåaPêW0tK›ÑCq4rÊÕ|»‰µ˜ÝïuêDn,ƒ„Ü£¸* ¡«'nPÆ€¨‚ê+÷[ÆòüHV¸ñ)Zcp ŒiѾàÔüu N±Ðg ÜÕV¤×ÄêB½Y´N@3I9ÿ‹7ÇVÏOËv,úE÷Þù:1 àÊV‘Ýé‘ð4gV±*\=BYZü^‚|ãõ j ðNÂw ¿"Í/÷|uì‰ÑN½a`ž%¦Ç¨ qY"®Ùy— evQ,ãî%Sye`rq(n<%ÇhÒ˜ÂóWÁ5Æ&7`n<¹îÈÓ0F!gC.4˜ ˜0÷"1 >«(4d]Y4ˆŒçÅÉ_H§,16|ÁlËûÍbâ÷ÿè4ŠùU*»Ð¢p|ÄyÔˆiP›í"ÇØ´ —~iÃm)ºðV³ÇÏ2~Ï½ì ˜®±5“)[d†[¹ÞYEÕö!ñ9 €O檴Ñ?¨T!ôÈ¢ \ÈüæÝÅêÓµ6Ì!`‚ZG —Ô“Æý1ëˆæ8]â Œ&ñ•ôg(çñ¾p‡á²òTˆÂ£Ø© ;Žp½À„D÷qÍ=¤­Ë ?+×e®BŒ´ä¯Ž7Ö åé¨4y»ù°`D4VFbå);lãÙdsêïÁ’b¾ÇùŠkl˜ìWFò_ºi"$IÀF%ˆû “m_qº©Óï‘‹›Í—Е„ç·! U‚Ç{Nƒ¡×>Wë\ 8öòI¦Y‘Ùª6îa`0¯¿5ª'¯×ƒ÷߯öÆÇœªÙs/ãM੬ß`y~½¾øÞÁ¨7–òí»³l©áûøjõV-2m9À¾:\2‚û´A¿§wjº¹YcVávoÞdÚx¬6¯ßª?ûö÷º^}õM¶›,ÔÉóç LÏÕßýA]xÿ€ž 1¨-¦ük¤8¸Ž|ʉ™œB©qµÉcRîC¦{óóóõàÓ­ú+ÿÁ/’1¾^üÉwÀÇdœ{>«¤‡NÕ“5r¤˜ÂÍ*zíž;¶€'•øqƒÝr”þ^½~5úçTïÀQ6#ã¹ÉW|d¼¶­ºGç1,/ï§,炱ßЄ«°1nŒDƒ\ÂÜÚMt 9Y\ã 1ð\€%Ë’8zñ‹?4mAGz ›ÒR¹I¸+:¤à鱨HxCãÔ‹Žs§(ÉsÚ D¹ÒFtÊgyHBÚÕ±lçrVAhÆè}§}ÛŒ®AåüQëJLÇЦÔÛ& Mü&?ŠGrjª^Žåè†ñ=1É6¤Y/2rE¿0¤gvÆÆ©Ñ÷¶kMáÏdè¶³™¬”ÔΔ„PŸ8ed €´ëZ¹[ßÃÂ\öK.5Q3>Ùp@˜Ïbœ(µP1^ ‹Æš3ˆ›Ž‡”:û¢ŒÕð¼›mý?‡ö;Õ£¬F/¯¦êm\‘¢Îx_CV­`„ufÄÊhe¬«l§4]kZâ ïš_ÝIŸi„êuáú2÷¦ÅŽñÉ„%vòŒfH>”ÜoéO¦´(­ÓI•^ïqÂháˆÕŒ(Ô mzuMâÂÀ:S'Ñɧf‘ hd¦’(„€ewX©k3õ™3°mŠ•»‰u‘cIÚçIE!8ωm¦wøsë£+uÿGÖ!<†K7îÔâ±—0èåºþàfí‡úÊ¿õÍê/’ö°w·zÛ(+zOoߪ͇€Û&ƒÄ*Þ yK…;ÄŸ6ï³òÄV.¬r¢?Y¯3gΚûëÞ ––êÓ|¡¾÷Ý?ÅÈØÀ‹\ú$q¤Sxè¢ÉìÀ½nCöÔ-ãAqê%^Ê&@Ô†o#bI§^>_ÿúþßúG¿ý_d:}nÀyäf•'„…Á“J’…~òÔ¹:rä¼SÙ^óÖë¯Æ#ºðÑ…zÌ*ßåƒÕaKÞ¾L]Ù¿Ÿ8Ú‰ºsí"+‚›ðv»^{/X#·Jlʯà<”ÄÓRÐÑëÒàãù«©ÈÛ‘›ƒµ+XÍ*¯’<,¯|ùäi¢i}0ÔLµNœQ–°¾æK9µ±>_ ˆa#.É»;B NÐ<ÔQÞfôXÔiÐF›uÚÕ%Nj~«±û5Ǭ×ç´ÎæÙ†,u5?ÔŸÙ õ¸È´ÃLÁ˜ó‹}¶ºöÇ~Û. ñ¶é“^~ [BÄôZ>Å[‚Ù8,ÈÁ‡Ü`À‚žœQ›$Pûà2¾M5mªÊÝ_Ý„a#€Æ—Ó„H3ªêá¸Ù4_G#±¼DNÓ ’ÛÀÚ;QªnŠ[4Hç)fùÓ2ÿê88,z"žÕ45–b|V€¿S4Îå·9£ë™Ô4芙S@G ë–*X¡äâl?®",Ì(–‘̘™Ê˜©| anùÈ·ŸPwÀWàAø;[xM,.úEšz‹c˜îºÅ¡2.°ñ-éDÎÄ„ˆ•!4G W·³’›XŸ-ŸT Ö±I’ºÝ“g•ƱT[ÖXÞ Û vH\Ч/E(Å‹ Œ‡RšçµÛCsqѬ7ú튼S—Õoû™tÙÁÞæÅÂh•6s•¿X…FØ·)ã£Be°ûA0ÚOå³›‚¥.…üæ'Sh©Ëô—6à#†c­> QÙ¥`éâitî¥I€–JU6—g“á*͈H%–vXâ1©J`P@þÊY½Å´çº#ˆàƒaŽŒ4=ÀÅÃi¶©Ò: £Ç#ÝÀ±'€äóó:¥›¦œ»'X’ÛvF4Û§gþÇSŒ~2“öè.0U€"ŒÊ© ®  ß|º C9¼_Ã¬ÄØduæ;U5&…äº#´+W]’Kãl‹¸ÏôŒpöø¡êïç½=FøÑCvàð½Ï4åÇWˆ¹õê©g0 :²ÿxM9¯I L·ü’ˆ³w8³iÏëS¤›WîqÔ [?Ú‡ê'¿ô Ä—fj™­(³ËœâI®Pg{PÏ>ƒÙ®¢í®·£ÍZÝ|Tï]ûå/×ßù{ÿ€´ƒúþÛÿª.߼ƊÞKä²¼ýÞ²•Åy•Q-ÍS7{çÜúãfè R6ÜvBN« ÃÖh­EèíS+cT/â’sÎÓë ‡ß6ÓK˜2<ž ¤zÆ7º‘Qù 3xa©L4Ãó4#WU>O0ð"ƒºO,­ÃªTí$øô>m(vêEðæf9§ö›‰ÎîT&ê1¯£Æâåt<;IE¦bt‹2<Ës2ý òÍ…çùŽŠè>€OC‚q¼H<µLãNª6Gå>ºú1Säýì<ª>üîǬÈݨåã§ëÊû$).ÕU2¿$S¾Ä†ÞžÒæê½úàýÕÇ÷k?Þƒ^Ú­[wkYßÝC§ëí¯}£V^{¾nÕþcž§Ädœ¡{wbÌ›u|ñ`Ý¿x­¾Ë1¼ßç”Ì{8¥rùTýýø_ ïÔ÷Ÿÿ—õà)Gñž~«“0dÛË ^ÍÊ ÙA‚Ïçˆu‹$MΰîQ­z÷o?¨Ó§Ï|¬˜a8Ë<{ðÀñÚ@éoÛšç„‚gO1•ís ËãšàÑ"Û{`ýgŸ‘&@Lêó?ñN}áwê$^þÑÕ©Ïÿt­1 L™ºñúÇ¿a:åÁïé‡ïçØ–yŽ”Ù ƒ|«NBßòòrݾu;+‰¦Å 70>‘%Bæ‚i‹zêéê‹G€Rs_OC0h±È[ùk]t<“ qÏU½À† ¯6åÕ/›{Þ&:âo€\BÛ0ÌœðÐÑ5÷Á BÆw;Ä­X‰ ¨{nkÁg2„Á؉Ësûbêîµlçòz§Mh³PºŒÖûÍ,*¦t¼p(\=ÔL€3à¸h0§Éb×Ãx$ÀYÚu, C6èÐ6v™¶MÛžÓ£ ~B¶«ŠžTjÛ‚UVDVI%ÆDçX4G \B¹Ï&9“­#.ñw R 1uÞãK%$Yä¡Âð¶\XóGÔñã3æõ8ÃÈPd2M)È@oÓ!AÐÎ¥´ˆ ]vN`Ô;Òm2í>y*ôL×°Ñöù(B)øôøAKÀMÈ9øžñ‡>Ì}ŒÃ ½‚S›ãZX£Øw#;J7ÇS:tËúäV§¦ôá«ÄzROK( <4Û7^ Šëâç‹Õ!¿‰ÄÀæùf]VÍÏưɜ¾u¹º|¡À\o\wß»Xwï=®[Ÿ‘”È(¿Æ¾µ){Ý®<¾L@ú7ÿ“ÿ˜¸6¹PdZßP®¾÷ƒxX¿òËÿ6{äÖëý~\;ûûEÎ'ÿòWÞa*¿U?úÑëþg—jñð‘¨H7˜Yy ]bµˆAfT‚ ¦g»œñtñcâTœDààqëÆ½ºK²ê™ÓÇë$7ÙP|‡ØÙâ|«=\ˇZuó6'¨ä³­¯£_†# ]ãK˜A]¡®‹ÌÔäÖ°Ñ…|A€ÊŽJÇcVŸ¹§ñk|Y©ŠÁ›jÀ5=_<×``]´§Þ.áõÓ¦#XÊ@—Ï3¸¹i9 FÜÂDz^LçQÕêzðS; *‰Hý\—žÜ—¾”µ>t“÷úÙÌ\¥§ù«×7ÃñI.ìP;†À+qùbÒAŸ¸çêþ”µØ!lÞ~gß¡8i¯óˆ•[Ȝ­^´Ýõpþ1ފߺÒ$Â\hÄÝ#@iCº%ƒ<t2óä¾P8Íÿb“©°œNÅÓÉÓŽ8>ÒáŽÌÄcâ©$šro‡tƒ©œhO渣«6~E¸^f×T–gARÛsYWzÓs m¨”@ƒs¹ÅS39G€¢MZ›²GËósüIí0J:¡ÆùŒ¹Ï5•É¥Õ /ÞÁ"îGúÜ𯼰?´Ï´Ñù€i2!m ­ ;¸Çn:A®Qo…9뀯åf:ÒbÇþˆ}dŸ^ø¸ß{XÏSgÿ2§]KõÏÈÂÛ¹}­¾üÕŸ©ƒL ŸÝ¾_—>»ZW/]$¨|¬nÝÄS9òJ}ã§¾\ GT÷ÛRØ2&óÝm¶ìá`:yàäA‚ØËõÁ…s†Òƒš?t®VïÞ­ßú{ŸX͹úî?ÿ?ëÿÉS‡^9†³É·µD_ë›?ósµ ÆÜ™ÃuæµsäáïrŠÃ:€ñë½z`Ú´ê~þ+µÂþºï?xTóèÔ×ÿÒWëÇ.ÔÍö?Ößüß®7Ξ‹'ó­?ûa¶âœ}å•L#n^»+ï&Fxáã÷ëß|ëÿ©ÿã¿ÿGuà¥6ø’´É çÞº5W÷¦;lôÓZt,øuVX¹|íí·Éǃ"6C ie©Nãá}øñ%@ŽPâ=$ÜÁ`ÓÁIŸGŠÆP¬”9bÍ ²À¡œ‘«Ÿy‡¨5O½AÂPO SYqÔò³”©Fzâ(o1îØ]î;Øq<øáyÊ\ŸV’úN9ÄÅ=áš‘&¸•  Æåæœ(n«¼@E~”ü^yÜJê5(OP%že¨ÌFº©®4âÆ¥) ;°íƒ¿òDš(£‚ô‰™¯³ÚÆ62æ=X½ù•ú‹á«õòçëÚ§Ö·ÿ¯ÿ¹½Î´wiû©7ëWý7ë~îKÕ~¶Z÷>¾F\Š,ì*g™“~ðÉG—ëîU¿ñÛ½¾ùÓ_â—?®®_«_üµ¿¾þ•/Ôïüoÿ˜S3¿Q_ûÊëâG߯ ?ú^Íy2½wêÛï¾ObçÕÚ€m(Öw¡Õ/Ùð¬syý„èf™{P~À*\¼Zôl›£X^yý «…3uŸã…=Øê”)ïo½VLj=}ç;\_ûâ—Ð;ˆ}{ï‡ã5¼:V_­+u‡`:©ÄJÕß^©‡ú•h›g}Ã;JWò-0 2ÓqG¢f>¯eF.xsrdð¾D€3éÑ,&¸)´Ä› È’6`ŽÀž@YC•-ÙŒäF‹‘г™âýHƒC”Ò„Á~\Žhðžœè%°Çs ì€i/)¶CYÁUšâuQV3ào2½Évî3Z/üe٨ƬÉß»v¥æÉ1rzý!Æ~ðà!ÚïÔÓ ÎhºGL•ò\ çñgOœä“9Á÷«Cvô€oËÝâz—晽R?õ—¾QK¯œ¨ÉŠ<À­ñE( ù>æÑ¥ºr…ÌîK—ë_ü»õù×?Whøñwÿ ) £zý‹_©ãgÏàx½~ÿŸþ/d^'ÀN2#[yïÓyó«ÿNýÔ—>ÇÖ™[ +ìþ?<¬—_¹Ú‹$¤²´ë╺wõ~}ó—¿Zï¼þJ­ß»YW/^Ÿ{õKßüJ=¼{›DÌÅúÙŸú:^ßûµvçƒú™¯~žÀGõÉõË|_ݨNŸ}ºùŠ{ä¸-_ȇÑ[ÝÇÙMîÝeõÒ¶]íð•Ù”ë—.}Lð›S9‘^°y<óœúâm÷nÞ¬·/×â¥Klg¹ôÉÃø2½c•3ª:V¯¼t f{«¤Ià鱩ÅBŽ L2°œ|é¹Ç#òs®«;ê…Åô ‹fPÓp)Œ† Ì, gOŸõpKƒn1Ð)_þE?{¬2ªóªç–ÈêaÑcÌÎNÔ7쫈ù×ÑI š{gE½Ð&`jÛ†£|lÊú bÓ™úik> ØJ‘çÞÍjßCn”×H¥j—‰A`#£#ýDÝWeY–Ø÷“‘aÓgVfù.?]ÝÓc93l¢(‰¥A‚ È}:=èA€1Ii@r¦gÚM{SÞd¥wa3R¿ÿ:•£ˆŒ¼÷ž{Î6˯µ×^ÛŠUˆ=$v½ÍÁ›Ôt p‰Ñ°ê³ÿƒØ¼ÏÕê~ š%åÚïÄÌìîšÉ½ÁrBÙ=ÄÑDCÊt£íÚ)IíqÎ^7{fƒ–LuòÇl¶L 5~ÀK¼M`o_à×ëP‚E É«¶J@ 0s²°Öeâõþ³à:õmÀœ†"ÙïYÉr–ØÝº|ü“Ÿ-7ù3¹;o.Ÿ©«ôH eO­£¿><Ô?-ŸkyÛîý?ý“¸¼üÒ…å·ÿL>Ö³åý÷W¾Ð—Ë…ãsË{ï¾»¼/¹ñ¬9Ý!쮊¨*YÅ{ª\¾¨Î7ñ›ŸþÊñLO—ôßÿÏË¥«¯Ëob©)“ûÍ?ø=é­z-ËþÝ¿^~.óü­×Þ]>»«”îWw­ÜÙ½\XþéwíÓ;+“üÁç4ØöòŠÕ¿ yCG÷¾X>øÑ_/?ýá¯eÙ?Zþø­ ^Úÿâ{g—ÿáüoÆ­ÛÿüƒåýgèxrÂìÉm¹T/.?Tmó/œ£÷…8Û"–‡Øå«íØ­p[ÅÌ}q²3†*îUELŸÁ¥€î¦]ü[jSmÁÓ+sËù‡%²¶ï­W_±aú.Ãï®ÚQUÉ0 '¾¨kõ“¿ýÙòß{›U ·º¼ÿÍoÉ­zÕëæ«–U»öµßaÏXí#”Fñ@ú™)æjcûœ7Bøè%+"kjâœh«àHô=Árô:BÁµ^³`¢áqYìm»š­cžZW¹ÀC¥hoí­d&„8µ¯Œñ ïØ<>BñHÌ?«ÝÚìþ\¶©?åÆYåFŸFñ¹¼Å‚×±dŸ·ŒÁPe ˜¿†…— ŠŠ(E@mÿÚau¯ÎO,HîVtŒ“=;00ÂJí$ŸŸá8[â²à\“Jðu2¥bÔBc4|% £FêI™­&úÆÙ¼iAÛ,±®&NþY$hƒ™LÑðÓDÝ´ ·šJ¤Ôá‘yˆÉ§ŸÁËý¢¥:6#¯0g•Z¢uÓÄDïz~\¹Æé»š}j}§«‰ÿx¶ŸÊg‰Án c¤Vát”Ûèz ¯¶ŠÁ%˜‘-MC têdzîiîÉj\­Æd:gÚ÷ìL}~ò„ktàä[Œõø—j’_¸¶|öãŸÐò§Ë¯?ø &Y–×^{m¹ƒ™N­È}ÅjºÿX¼éчËï¼ÿgËw¸';Ò>ûè'Ëo~c9Ïe;T´ï7ßC¹hUï&<;Kç'_Hz|Á’ù§.›Òv®_ úpy¤®øwþó¼l½òÒdâ?zø9¸>X.^%>“Ø(~æÑáòÞk//Þ¶5… ¸{ç·Ë«/gù¯ÿáw—o]ÇwŒm^Tym9ùê‹å¦´SÖÙ3çd•ÿþòÝ¿ÿ§äSµ·|ëw¾Å%t²ðçŸ,—oØÊròåòÕo~…tž-ÿÛÿù–ÿ¯°œÿ]«0Ž{°Þ(ÿÅ‚Å[o¿Ë½»¶üøéßJ¸Tê@r'ºØó}‹ [‚ÙUeHyÁB˜—‡ÓVˆJɤíòÓ/ÜÁ ânJ¿v±s…eúùc á¾Áפ\H-8üÕòê+/.Åôª yõ²„pë®ó­X®Á7ÊLé¨*fäDT8Ž˜«k ‰hÏ¥¡JÚ-DH-Ë>¯}Tœ.B[Èï<ŸÅ1)Ú˃Ã`0bYÆ3ÞC vxLÐ+ê‹5©•^ÇÒæôÝc®¥!'*æ—Gpj\$‰6³kð—¿14ô¿AèO_N |Ú4LXÛj)Ëg°ˆ·Ÿj·’È¥õ¬9\É<¢íÆ<Ê\Ø#¹Pæøl2¹Í#ÚÏ#왨ÅFf…­Ç5˜ëtʬ¥› À÷1¹ß`ÓjÝ5W4¶£ à¶€Œ/»3’qs“‚¡Ãå¸äòðèݗբχ¡{íÇk õ¥ÏÅ龜ñ©•…('*¤×öÆæ™Þ×&¸hÅoCi,Ÿù:€7ô•b’äæi‰2)_ìèDE‚Ú:ËÒˆ“"|´PLn§•! p†Õ˜ŽÊÜŸ¼üÒÆÛ ó ˆe¸Ðà­²={úx6£Þ–ɽ)iððüèg¿XÞýöû>Ód˜®MÎg÷–Ï¿º³|üÅ][Jî/ßþ{ÿhùÇÿå?X~ûë_-·>þÕòÞ7^^¾ñò«Ëõ‹±zŸqŸ+øÿ‚}k¶ÉMy‰­_~ð9Wìîò§¿ó_H4”ì æ¿ûGdŸ—OḬ“ מ-Å­Õ{º|U@ûñÞ¤Omñø•¥øã‹×—ÿöŸÿ/Ëï+8w]øêéÁ§Ævo¹òúÛëñOb“¿fùœqDÔÉ¡Ü)¿ï½÷mq»ýåÿøßÿÕ°ùþ|Ç~¹_.¯÷âÕeÿçV!öáòïþæ×Ë÷>pæßû3iàFà JäîkB°“^ŽÑÈ͇·–Û’[_yEít‡AÜ#ÛÙs ûµ7¤*Ü’ê4ãs¥ˆ׊©%0¯^Ÿ²ÈðÕW§ŠÝí³˜þ:}¸E •”Ð Sî[óx"‚~ÎOãt'úL€F—%ŸF¨ë‰t†v£[ïýmz>æN@cÄs,.V¼Q=¶èúÔŠb1 ØúӔׄS¬qeÍ­–Uª¿¹%¸P³qê#êúêÊùŒ·ÇŒ5~£¡UL ·Z—8«†ñ1ޙůÆÚ Úª1Ü<†Îšk¨·ú©ï¿ëy6Ã%ƒèØbQdõÊš ·Î IoÐèBMæ_ŒÂq10Éh"Ó«)Íë0 L00H2ñ‰³x °C)MTFúmv6׳΂ƒÐ5á­AeâÉÙC) tzšÆ‡ÜN–á±»w€ÑK«Î'01Ô¶øß¯/˜ýüåZŽY !5HM}¡,BMØËuSmª‰´eÎÀxÍvµêài³C{™Ö­öå¹ÈÄg`s×¶Ku—Š¡•?õTöò½›RÔ•Te¼_‰¬žk˯tO·ÎËb¾,f´kKÉçܺ/Y%[Ë~iuLÆõ•W‚»á„’‡Ë_ýÕ¿YÞ@¿,‹úÓOoÙW&¸®¯»Jœ\$¬"šGÎ܆ÇßHCøÕ‡¿]þ«öÏöt¨F;·ãÐ 37Ÿ9‹Œ`ÝWÊd¯ª“ÒdWÀ}çÜÝQÓê.ëqkyåï,ÿäŸý³åÅ‹g–?ú Ižw–Ûju߸öæ”/9c{Ì—¿ý|ùáÿó¯—×^y}ùáO?^~ûéãåÏ–÷WÿvùÍ_ýûåÅ b?Ûæò÷ÿñ,—_µ×ïÖ­åÏÿüË_þù÷–SI˜ç.ÙG'G§¼°#4³m;J¥a6ÚdNûorÿ6NMOpEÌ@mµˬ/q¯C8LÞR)ÏJøPh{ž'ôÞ’¢qï‘zS2ÏŸØäüàø³åʹ«jEYõ³Úwù’dWÏ•åÞNûònžŠ·ÚÇxýåW–—XT»{/i÷örO>X«®›,e€óßè" ,æ³¾¢1ã-” l3¸nwà “É‚ra¶WEË3í\› $pi>øÔGóëD¢\¸±Ð‚‰gF™{>Eý%~Êö®þ}ÌŸªÈð³þ41Â$á2©ñVüÄ ªü1ÉÐH hí_ï>hÓ8VëÆ}”BAìÂ$µOæ6Îò÷ÂÕXMõÑ}®§@Vo)ö˰€·žåš· – iïf ]³”¯ß´KZcHÐ4ø{i ™V]Ù~ 8Àqi:Ëd þk^Ós”Œ2ß ,AQûyÏ#ô¢m. ½sgùæïÏ+âÿˆ;±-#zƒKSµ€fö²}dwîÜ\þò/þ×åý·ÿdyóÕ×poùH|ê&«êuß¿ûÆ›4ö³å‹/?aÃZþâ{ÿjùî?ùŸ¬R]_HØ<µ’¶%ð블Yy{,[:ùü—ÝGpQ‰½”é~Ѷ˜‹»Å´¾C@½$ÅáçËÉ“Ÿª³ô1Ëá_^–¸Ò–4‚þú/¥\_~)¹ñ'Ü\öTxŸŸÙ8üä¬Âr¬þÞ?øC9E—G¿ùÛåßüË¿Xþ¯û³åè¢ò/O-º Ò~9fµoØü»'¼{,“œ’Æ·Vs㢑œ†JW{»´†ñ4ü‡‘‹ñÀñK²˜S{üöä ž=AKG,Œ§‡æ*_n[ÙßãêK‰=Ý}rß çTAص¿òܶ fgʸD³Ÿ[mô·÷–ë\åcñŸžcB4a2îmi}H/Â3ÖÕz@c]÷ûœ9ÇÒ늵žÕçöÙ‚…c•V߆×Ðr*t¦¬•¸F[å­ôŠÑczŸÛó7ïÑêÊoøMÑ«pâEÅ…Ht± "xjS)=ýŽ×¡¯ Œøb¬½jP‰mwÏô]»]6¸nîU±¿ÎbârþZí>VwkGãpÑOA•0h÷³œ><µÙ⇴è¾gI­uIÂL­9b;éÎŒ­£³¦¬{ ¾ ÊÓájʺ®£Jg†jº·•­1 PIu×›X7¶êÄ銬v̾I{A¼gЬo¿ÖFs'¥ÝžLó¹FIÃÔÓŒ1a—Äõ¬›"Š}>Ïx=§£ò~¶g+·A³N¹tÅÖ-iŠf ‘Azäá7a…H²û™üão;Cã?·j]?´}cò/ÚwVnÐÏ?úÔXÁÒ>aù¼úÚ;ËE…× ö>~p¡¬s~h5j_÷‚k‡ôÁ¯~³\¿üž€õE9E,/[@î±òγ¸n\{‘PU䟵s(°}ûö]‡i~º\»ñÍåm‚ëÑWø«b&‹n»Ôì«ìTÎÒyåDŽF™xª®ømüÎï¼Ãj»»<¨~ñ­×}Ûjâ/-ážOX‹Û/,?þÑÏ–—¾¸ªæ÷µeÿ¶R)be¿ø¹g»É (‡„Ç™gç–oë–?üÓß‘¢ ÆøíÏ—Ÿüà—Ëü>ÁdµîA¾ƒFö6Ï4'S ¡|¦)»/g7IJ0Ì}«ŒGÒ ¶-Ùá³Sh)‡ÜгV;viÜcVih ;¹({¬ÐÂex‡»êÜ_²Rºïè±'BÇrÌ>þè1!¦ÆSÞ‚èÂax !Xl³&7ê»|uwN}ÚRîåxÜÌJÉ´Úx"|‘’ì'že’RĪ‘ÙÐn45îV4 gU¾ÿÝMÆ?Ñl» z_ j=éÅÈñQ¼5×&¥7¯hØÃæ]Û¨máðõ¯g“»sØ"î#ûF™_Ò°ZµvQ[øÏç¶5²ÆTšFãlð##ãiý–W6-sÿjC¯óÚ¯Ã- ˆ\W¸ÑûàAÚœE1¸é'3‚Ô8T3—8Ë<Èò?½Ó{O~XËr@ …ïÚ†Ê5²Þ²ê:ðùüoè?›L@HmÌÄj´Ê™“‘³;ü†È „ôC«¹lùó™Bëv€ó±Ú3SkÒ3ÿÐá:9ÈžæjÔ}ùäß²||D ™ç5`æ«Aâv~åiù2‚ˆÈÚèœ6Nãùî ðýME††86iëú˜ý'ÛûÛâ>„ý‡V/X5»b»FeÑŸ´5… ¼ÈB;=$ÐÒ]ï·0M¥M>H|ö‚Ü oRrËŸÿ˱¼vÎëÙÖÅå†ê—·e­KÖ’Õ-·ê©=~¿ý@íðNja)9\áàþ±ÄË㯠ˆ>^>úô×òž,ÿï_þl¹£^á‚K›ŠÓµ7 Ü+ç{™Ð<ñq ÊV­³è._>î&+ó y,n÷ Z¥:¦ù'V +kœG<æ¸ow<%ˆº÷ò¥Ë,¥èö©ø•“¬YSUJ¸Ë->wEI”úL& §PµY9|KºÇ+/¾º|öñÇ`SÍåö­›b^ø,â…pv6^´•äÌÅ Ñ_.U‚sè «øñŸï³ŒF×%X¦×=œë3§†âƒÈPË…RÆÅrFôzŽlì›ÉD–æÑHæ/j,]iÕýù ^ÞÊä?i¥ô˜Ùðë¹Ùb¢ý’‡KÈ›ˆÏ ³šQàç>äzV½dí´PЪtJ÷k›@s} íD3'#ÍRÊëhëBBcÎÊ3Ï€eðܺ¬¤$\”önºFÑNýM‰Õ¸i¯KæK Ýóû‰Ýуc©if€Ú`Å:I(¬­¢ÒlY±§°³nk kýƒNŒ8z&ÁRü$ͤšÉaLq&×€õäz/Äh)-•ÙÃÞX]µ½’Kà eÚ÷\Äv±›Hê_-£–†÷,åÎ"(È"ÊRóÔÓ¹¯ Ò¯“–¶0„Ùg°ÜúâS–è¾í%ŸêJQ7BáŽÔ€ßü†kp‡¦çZe±]¾ø"%p†+÷ˆ€x²¼â¤Ý3´ûý¬{âö¹wïÝçjl,/Þx•+ótŽn Ù/ܸÊbÂÜÇV›l]iÃæSL÷ÕÍ»\‘Bëu tC1·ƒå®ê­x<½#Þósµó?#?q›pÏ=71LùÒ[ï-×0dµ­~ñ7?^^`©œ»|cùÛ›÷—^}S:SÝÃmµÃ`ü 9Cwîñ#ñ÷ö®‚ÚA`åmìnHxº|ðégâbûηSÆÄÖ’‹b=ÕŸMžðz–ò+a¯¨Å9‹ çT¨ê‘ øžeóÍs/,÷ß»6'Ÿ÷ý'7¿ÐÖCb» tÉqjYýÝ¥uŸˆmqëªÈ™ö~·xC—[Ó9îÜyëC„ŸÚ²ò¹ÄËS9¯V­“;ÇnÉó»sïÞò†í?o½!ž&M¢-G%å¶ ùòµ\Ç”X•äº ž¸ð“ÀHâx/&ˆ¡ËíËd¬´Ä}œ ïæî^pH@Ä?ã®i¦Mã-ÊT†d¬«Ì‚=L¡Ó›w)1jÂk„„gzÍÛI ŸÖZ"—äzçDfAæ˜â“¦Qì7Þ¬êB,7ý_Â)ëG“ÓÞx žGê~YH SŒNWÆežîüúyx.žžÜE+7clà¿¡D_Ÿ‚Ç™B ®°F™ú˜ñø°- ¤+¢ÒæO™Î-§D‹™žû„žƒ$Œ['uÝ`fÜŸIEãÑ÷ +–¯Ê¤t_k «FÀ Ù@R?ÉàÒ rfèúdº£é7Ž-Àß6ȦPÿeàêe~žÏg¥¯­ ÆHCHB¯Ÿ„P2ûOõÆê'¹ ;é‚ù²ªÀÄØ‘„o ´^\+x·AÃ'+’ ó!ëá—?ùÁl:½Èì?8þˆ{Må“/ï-·%ö=CPú;WmKŽÐ ë"íG;~²¹|EP|NˆœÁ¼¿¦±÷¸IW/_«a_ê‚ç®ZyÚ¿{á”|æì¹å§¿øÍò„«öâKŽç=è}|ŸÀ1¿›V¹î<¼ñ,dŸï È?â¾úú[Ëõ7–”ÂýTÐþõ·¹`¯½…PÅÄþâ/ÕÿÁò¾ûŸ,?ùõ¶´pÃÎû L‚â±ÓXZÉít߇-`pÏÎmÛ^‚¸¶«7å=’C·õ´XÎ9Ûn¾@¼×—K,§í,™ NUÜÊf•€¨lË·¾-“`yŠÙºrMp\@[*EÙ£O>”oåLB`¹6Õåž}d(¥àùy+»[цåû-ÖíàìÛ yÇþÀ T½sƒµyqïeµ§¢ç¾:O—ëúß•ö%KòÍ×®Ë#{kù’‹\­í»¬®›¿zÀ]}G-óWÑBÂ}"5ÀœEõµ ArÈG]YsŠtê/OC¦x“cQW¼Ûà Ÿˆ”„Xm´cä~A¿¸ŽƵ¬se‡xÝ£¶¤•ÎS8&rªÚ†¦ýžêB îÍòw_ð†‰35 ÜšgÕU$˜„R´ß73ØçZùNt½9¯uϵ8¼f¾dEr±-o€?#LpmãÓ­Ý’9Écílæž´'èY+g4^ÁïX>Óó¤<§LÈ$Z€—gT*@äDMƒqÖøÂ€@g I‡±Œ ԇΟ9H œ©Ì!á¸ÁÿêIƒ{4õ<(W ¡–aM4,úÉúë}¥CSîaÎ?×\?ÅÒDÐêSc5¶þ¨í´º&öš€cï[GÐÑE‚4^R}§A\é»A¦›êæ¦@ô¾÷ìÈwŠ.ÁñÓŸýãØ‡¦ø­bmvjMuœ¶~5t·Oó 6-ßT, ñtKpͤ!ï°U…–£ô&+Á¬L7m­m훚“gOÒ&4QnÝôé½üÙyÒ1ÁþæûóþÅ÷hW óá'¿Å°—ƒ‡mƒpR­Xª T¯Å¥.Š/±®ˆ½hËEñGöÝJ€œ ’i|.Èä}˜FÌT’çyÁõöÚUä?yß<>T/)ëôÚÍucùàcw‚¶•¯¬ÍÒ%>wtxs®þRËÖW¯¿æõâò‘¤ÌO>þjùî÷OÕxzsùX°û#õœ^h?'ü©ÂmǬê\£ 2‹òˆµqØ©/„hY¿—,ÿOípàKYì´Ä®ÏgÜŽøÕGŸˆÓ°þ¦6w1—qÊ:w?æÛƒ×-Ì»qÎ"e¿GèÅñÚ-_ZC+¸ èR.Ɉ Lv¯¢„$”•JǬ»oÓI9Q_Œ–Fn?bÁäà/¹\±yøòëS6¸ÓM¥@ZÙ+‰5eðXœJ(Á§(³ï€ã%ûõ¾ñš}~’eŸÔW¯¿ètcÕ:)œ›>HK–×¥L»‰¬cs ;)1± ¹–q6ãšr½p–²Žñ¦&ÞÇÛˆ&ÝýVé3%;<•°šË¹k¨¿„ÄX 5Ô}^bøVØG fT¸·ÔŒ1¢i÷¹m~Fعâ_h#¾:k…¹X4ÄNy‚©†Ûºr6Ï!ÁÄJÀd%,s¥·Xü#œá¯±Äè}‡¥x%>z®t)°—µæž±ãið:C±õŒ„Ð:%!¿^"G}&̸ý<&×™ukâ*l’ó“¥@!¾m,gÎÈUð›Öˆ‘Ó"ý¬Ig„Ô X i Ù¥eÇÅÒN>{BdLEc‚²!ÐѺËU›:8ÚnEc0ê¹0‘5§? !-D4Ÿî-V"RÎpJe;Í*=ñˆ‹ ¡± §BûšfY°šó^[ÿÛ·™0¥Z¿O9qœÔw¾ýmÇ!]]~ö‹_0¹Êª€i£;³T\åñï`ÎVM.Y-»n[Éc‚鉿§4Ùé!&µªÖàšó䡈³ÝÚ±×ê5u éòÀü½{kFu§d=Ü*’»¸Ãº8ÀL°`n‚Ç*œÂé={Æ^;éš¼¤_/¿ùùÏ—oþþï-¯:)ø«Ÿ¼üä/ÿv9{Æ{Âò{ùÅ÷Ûï[%|Hø®b°•¯«6-DÅXÖx(¸€M<7š™`ˤ?&\/pçFùÁHÌÒv“Í©-ÅZ‚?<àUÊxï^¼DÐ9›O¬(k¥UÕ‚¨—Üòñëoç·änu°fYý;Æù9¦ïa8޼ï Q91È4~mYêœdÔMp;0¾Q·Øì„àVOY¾'6¦Ÿ%„?’©_îØ#ŠãœVþ·vÎ`ÆcŒ—isÇÖÜ•#€Ñk®Òä¹c }˜œk¹x}žaÆ8}#Ú¬$d-~Í=C¿1¼o3Y´wDŽúr1æfÇkñlýõW(ešJ ÛVE§c¡àËècb=IÅùÓ`‚Ü7ãqB›Xi…jó§Ò}åÕx‰qíq:(¾-—ç¦xÕ/‡rn²PÎÓÂOô· #†²/£zô—#už»˜Åðæë¯Äsn[õâ^lr1õ>ãb‚QÖÓ$ª!î#–Z ÁïSï¹uû,³Ò.\1íó)MŸ›x˜ú7ä#.Ï>´g~bz_·X#Ÿ}öùòý¿þžà·cÇÿ[SCüûÿá{ªbÞT‘ò]Âépù½7ßE˜¬& Œ­&ü;´ñ‘ ˜'Ú«Ô’Ûã~Y<)ðÞqL#ÄÃGbme¶“F»¢¬Âñ›¬á½´íYî4|—N² 9Œ¾—Ò ØŽr%b‚e>AäÈ\¾å"¸¿ýÒË\A‚œÈìå .ðt5..Ƹô®?eA(Ï]|,í‹iÄojHJ‹x]†{V¾=y`W̦Ч„ðÏœ±wE²èUµ¬ô»À©8ߤPT ³’F‰`±Â¬7J… Í­3Ç7,aʃj¦œ p™™Û¼x®­;]+/nbÀð>ŠY?öVƒ€ðBCÁ9Ë£íÔ¨êcuÊ&<ᛄ}®üêƒqCnly¥c O ëááqÃê÷k+Tû&0ÅïNKÒÄoõϬͯB+ë*«µv’°l¾+O% šhFÆl"6¦B]¬Ô2l5A°Î ²˜ŸÑ´ãú"Sprbp„N•¤úÊ) ŽOôü˪™ GœëŒúJÃHѪR÷xd~šD£ÌïŒDS¾êø¶MD#Ñ]ŸÕ†Y ðDD‚„öª„Ÿ–ý¥ÜëZn×ó¸Ó|5½ºK»«  $‚ÇøÛKXÌ+sûé󆬯Ú6–É€u¥HjÚÞp=")Hyœ`À _Þtb‰ÓlÏ;ÅäÎíû\ä'v·¿,¹C%ó±L‹ íûÛݖã\ή_·©ö:F;´ÁÔ¦TAä{‚¬Û$[ {ÌŠ; ˆ.k÷‚ zZq+ׄ0®áàtµ–ϲž=:qr"à³Ï],—b) ±Ìð4n.y@¿©,ï}Ûi¶eÚ_æ >Çùå±üüû?‡zG¤'2·ÕF×ùáßüÍÐ… —¦¨Û0¯êeùWÉ3³>&L°°v±o¾O¹tiÖ+•Ï$=vzt¥Jr`€wŸ9LP7ŇpŸ+¾êZ+Ëݯ>S Æá|c“€©"‹p;~‚vv÷6‹USþ± ×[þ%q‚“! m¤œ€ˆ»†¦«êªÍ¶eLW^ú†„SñµÏnÙÏxS NŒ/¶èQ¬ç–Õ¹ßyô–º[\bxÌîO =$8/È,/l1«^P”'œ£ó°P;Ã%âfSH-ât¿™0†Ž™£µ¡UÁ0žÍ´˜4>жÓ1íª ¼D«~'\D'~å³ßž-Ƶ“m.rÕ GøaÚ1ŽÆMôã%£¤öŸg}ÇËý¶"Wxàùâи‹€YÂåˆ&´AÆêÛ3)µåšÏ5Ü]å:%¨ê/šIÀÎææC ‚ýG¼.5nôô¼“Z ºAň¯2¨;ýµ¼‹Xž×¯—)ËEäq„ü|ìòÜ:m² h’­º«þžÌ·VŸmЬ„cÂbVϦ{ÂmµžKå^–Ý!ÏMÂÆ<ˆuóšÂï!Ou-DôÞÌ3»+’07ÏOî@´ªP|¦±Ì17Æq¤Ÿ§!>Á9.§ éäEù|[ÒGl£íW\ºBI%käò勬ƒ.ogûIÁøòPŽ0ÏnèmÆ…Ë*Jª õË_°üú¿~‰%óÎ{o-ï¾ûŽ4…Ï—_ýögJ¨¼=¸8ñÑzbUhs—•Ô M[ŽöX#¹XSúƒ0Q³À7³Ë¤Ëáиsp¦FKÑ åÞÎxû˜Ç)ƒ D5p,>­}Η³:D ~óߘàô8ïÿôgpF¨ÁíC±¹•©bLIÆÚدº%¦·x o¹Å¯¾`å2k¥hÑcËw‡ËXØ—w:r°¢—°y,o«`ü s;+Ε(@|.!««ˆWÚB·½/„⵪]‹mö]™Û8À,¬‚ ÕmTŸ@!Pã¹Y)¯±Úëg^£]mo¸˜¤gó‹€Fõ‹<›öxpêaÊ`]MÓvR›hmø4¡ׄ‡áí^Qk²"/&‹è¹×ÑSå)­lÖóñ¶1ùùÆ3.øõ:cM0ùJœùù®>ë"ÖX¥£d{¯³¿‰`IΚí,K¨‚kýe½ Ãk¼A%lL_73­y×èDC|ˆ-V¿Ü‰:o©8D°ˆ¢]ÝÝS+™ÛmWØ,ÿAi:7ù‚¼vÜ4!üäûž@óS]3÷ë{ÂR€î5ðŒø”Œ$Ÿ£Ê© y¹“mI9ë}ËŸåzå¯+ 1L§ÄrE©ñçÇÝQ7»ɧO –ƅˈiãp¹iå¬ü™ÊÑdLDt³gÁÅX'%/~vgùàƒ$y¼Üx…æ0ßa!íœsp¦ Å›V5§|†åù—¬ÀuègîâCVÚ#nU±ž :¹<‚Â'¬£ÜÅYîÅ”e8çšì³0¶e‘Ûwv6 ƒõs 0ÝcUŽá=U ³ XZ`ƒðïÿÑ?XþäÿxÀþÛ?Y~ðã¿UÁäúrÛ–•# ª"c ¾ó ·¶1çX6ÂûÆ+x‹°WØ#Dò„V𜙈ÝÙÇ#á`bh®²¸ÇJÅ °eó‚çXa;è§MÙanN™Ó#ñ¶S.î6‹r›ûqDÞúÍ·ßš±|ðÁöÞ'ˆ¹Á¾óð0V +ÌN ¯—eíwT¹t.ì_ÿûj¶ïMÅ‚]VßlŠ7†6Æ·ªwû¡ʧ{r©(/tð îß$äoã•>¯†?žFÚ5z›ZH`úSÅ¡ëkxÝFófÙ®ý~Rn>:ÏJL1ÎùrxsµZâ#·ø‹zƒúKa»ðœþ»ž%v Dg Ê yÕnü #Ý÷ìįÀ?^ɬ þ#`<3n2¾hƒoG¥eíå.Çá}\òbxß÷xwÚÑn‰–>è‡Hƒð֌iB^PÃß¾ÃÒÚ#œ6i4Vº©¤·I¨á,‰Y€œ`Z“A¤þbÞT“êw D€BÐ6 ²Éú8Á¿æ¬Í©Cúä&ù%V}–0l"4qZ&’¸'j,(é¦;ƒüÔ$˜˜o‡¸uýz¤þkRÚxL£eD#žfgŽ®‚ìµR@¹U½ÚtÛ,É“1ê;MîÞǶS|ö¥J‹Ží¶ˆbLÞ ¾}aÿÚI‚0ÿSÌÒQ:«ËS(–8Ôvp:²íâ{ßÿ±ÄÇûâ/aöÓå’†ÎXm*n… îY%%feŠƒ(¾¿–ºH¬ø¹Ò6ŠÊ¯8ãmö3ä"å–>¥åfÕ±§åqmŠË<`å=2ƈñ¢3æ6ÁòþýÛ#d. Ì_¸°#!ñæò!Át×v˜ób2çغò@*Àkrâ`\ºCb~’õÀj]Z>kÕj=DóØ^¾pØý#xLh.Âc̱®Øj°O£ÂQ4x(öƒh–͸ÐÏŽ~·å{µs¡Šs– &É­PÂÚX0ÊŽÕÐW¥œ³b´ ~öÙ${Þµoqß=sÒxì°\„Åó”+Žáà꯿÷ý媸Ý>7”îD/ú×W9SY´O(®þÎöý=XîrÕ™A{° †à½g«Ò+önn‰ÍðØè)ÿ‚OuBÈœ’³‡Ì¥ÕCY]ˆr¬ŒXM LJßÙ†OM‚›{ZÚ+À½æué ?¦¢ÛÙÜ«±u!D ø2 O8jÁ½øLñA×˹ҭﻒÂïžÆ‘O |Ý¿±$”ÎZ¹H u{¬6gíÕ§ñ‚€¡•=·>I²_Ê|JÑŒ 7£©Íæ”d\à5«úUÓP/ k¤š‰÷)÷­ÝÉSz 'ÇŽŸ›µ ½|Œa­“aÅaõ™l’yæì›~! ‘uþÖXDž‰é"Îäiˆ–¤ 8&$ÛyßɼB§^s5¹ýÒ,²7z?Ú tªYß…pжåÕp±GÍóǬž•ÖP ¥®ˆƒ„Ú‰GâCgií'Ü©iå;¤ÌT/5¿ü–C(ÆñÄ·õFŸ¹5ׯ]Æ,–ßiðô*b)ß*•:˜²¶U°T}µš¾Œá„ʶÌèsOŽÕÞ–©Y•60Ñ s|§-É뇄€xJÄøÛ÷ô|¹ sϵ:ÕÆÙ›·¾"pv¥1\1æÕ> lÐðÞò‰|¨mî},.sÅ=OY'7¿ºgVǤ\±éµxëCãLæ¦åf‡‡¬§]9K{ÄãÇwÄšT9À¾4®¨+þd±6‹a$X€Ü\ w¿µ“nÂfmVVK÷YõÀå¾”Dî ‰i¹¯;îß[õTüÏ´'6…Ä——®.ï¾GPd™Š¶e³³ lÈŽ^&Çuîý>KôHBj l¶½hïÌé. 0Æ–‹vÇ\Ã''iå5]“bqlö–tŽƒ\/ôºAØUZùãÏ?Y^"³‚Û¯ÚÖÔ6þ„I+‡áijÓ£ïx¦\¨ý\wk±ÂŒ€þˆ¬À7HÏ…<¬»è;:îƒÜ\ˆ»³Ã›x¨•©Ú‹/†?|èÒ¼h׌š—“H™sᤸÞ)Ø:Í"3þÍñ]=›1“°ÓÞêvŒ6'kË´'7­Ò>ÇáaºJ¾$ÄR´)n7G×^—bsÞÀ7˜¨2 cÔÛI‚ †.ŽÅƒiïVüöÏ0üKûyÖ+%ݼLÞ+nI àr„ÖCñPþjÏf/eÉ$!g;Lƒ4ÚÚ Ý”_!<'Ðð4PRϦ=ª8³h ®ÖKíÕFóðnEÐ\Ï]ÝZ¾Ça¹ªL¨È -ÖÐÊÑ>˧ý],¢*1nÆAp'íd}ô±œ¤‡47%ÐgæƒYÖáSÒR™®¹<ÅsÞÆ$GV">ÿ䣱Õ2°Ìo«Bw/ɂœ¬]yU…~1+{ÇÚœ›ºÛÞj5Õ6W±­åf•BÐ~•K«FÐÑYÅ5CÙÛåÅtœW5¯BôŽ9”[µM \ í!¾'4àç>&{ʽÙ,'Šݶ”ˆ¤íDl2Þ×ï^eLôAœŒÖ‹À¢°ÆÙñáçwd|2[b/OËoË9*‰/"=±®YæÛB †Üë › i`²«qO[ì(ƒ~~ ¾O¤Uœ¥ ³ۧR@KîgõÓl ºv<7.J-_æØo°@Y_åòeÙA×$…f‚LÉbÝ<ñþÚ¯aZ1¤O¾   $³JêìO¥`lÊÕÊ ,«þŠ9UÖåSÛ†®^¿ŠVX¼€‚øŸ¦_¿úÙrñ}ÇcQVm“)F·%%£Cg£=ܨN;c1|Í ÅÀÒ­ýeQ ™GÌ•+Öðã¢x+…ŸËÒŒð§Þ¿7Å‘¸Õ«:í¸°hbRo¢ãùñ\´2÷—Û”’Çs_ šn ^c0¡í„Œwåo­Ö¶Ç»Ê"÷‡ž¡•””fnqcÇÀMòu‡¥ï«‰Å䦸4“g1iGø°‰w­{%åâÈL®®ÓÚ¾ Ù ™_oyÇm¯@¸¹; ³Açn•Dß\c ™â ÉɈ+’VIõž1 °n÷> ô—):’×D×t†–»NV‡‘šïþ„C ©Ù0q­« Yf£æf4€Bø… €ˆˆGs›K«YGÃ;snTÊ>ùOȑնr˜²J±H{ŠiÈ Û)£ûs©e ²"Òˆ­ÚA¹åòˆÍt”ºÎÅ}•ÔýTuLn¨{ÎsŸÚ"3ÕZ7𺹫n0¿ÀZÚ 6γ .žÇ|ætÏQà÷¸nÇ„ÚÀ &¶°=ŽP.h³}J³¿Ìx[²Ž´NÇ2Æ’;˱Úá>žm>¥˜ÿQ¾ A‘ëÚjÏZR6¢âîóC9Tè{ýŠÓ[0lI£YÅ=‚m.(±ìUò¤Ó†ÃOy@}½³89GP›{{ÉÎbÔ„üÄá5•#Ò'3‡µŽ—;¤œø3 ¤c¯Ÿqòô¼¦6©&1̫󒅕û¹­Ñ^B_Q¨®3ñ¢‹þê§p˲"çNÏ‹½ñÚ+äÖáòÕ'¿´¢HPëï8«­PÌåPuTûcV3äLÊÈîùîEñ.Bi_£ êñ¶õ¼pã%‘‹'­&çÌ%¥š%£·g4Øý%?¢e·¢É¡å¯çžÅ…‹ŒC*¯£äTHªQ×G̘SÄP›)¤„Vtî[4Ö8ÓØW«ZSÉéu,Áß»a†ó<¾Ü““Tª=â1J‡J<ÆJj)pžH)Ž´ ýõ9Á<³–Çå‹V> RÔ6¦6×Bë‘R¸^g’‚í<'4Q.)pL4#çXf­„¦‚`3Y°4"i13#>ß”ˆCOpY§ ¦YÂ7¢äUW0¾tÅé'ßó³ra2êXUúöf¬8÷PÀˆ‚j08‡ð‹Pkðb>ežPœ \m…ˆ‰=™RŸ~Âë¦xØd•»Þ˜F¸ÖYÂ̰åò„´„›g ÷w%KVgÈ3{b+Y-YŸ$ÔÁ¬@i«›•LiL­ŠíäLÈÒY-CsÀY‰³‹'$ ŽÔ/À{ѱâ 6–Š ©UA¸âDû¬¥ƒæÍ•{ÞVê²±wòåõ Ù>(n û~²óC‚þO×XÅ™çO-8°<~œçâÝâÂ<5Ÿ¬ÌôòN?žOIµJWذ:Bðù{¿{x¿$PcDÄ0EÈ€2 5îFÞÜ¥x¶-ä—{ežë®xDm<„e¥!m3(æƒÈŒm[ìíQc6ŸU–ÈÁæ>…ËsW.JÛ à©p–&ïŒr“Þç={ •¹íP÷GÏ»qÃq{ì²>Ë;ûæ»ïŒ`:à‚ß–r<ª÷tLžX¨hëÐ})÷X›W¥` ߺ ƶoU=ܲñúG¿üÍòŸ~÷Ï|Ûð€6‘Ze¡ÃGB`à÷š@ö_3¹±À²?tçZeæîýÝ™)BÖaaŽ@“4X ŽöãÑ3Ëm\±j.à]ç^Ï¿&tð4ë*/éš;)ž€»9ÅÛýtŸv §\¯3à|Í3‰ý7òa6$ÇkþNÜû4~é9´cD`JÙ×…³ÁªKø$-RÆnžllácý™ñB ¦ßGe·¡KD‡R0l•éL€TΛ- :É 4\Õ¸Fc òe•–ÚÃy®ÿÿþôøó jÚÈ=¶N¾õ|³Î×îŽñ½×wúõ}£N€GÁº§“•Ãh¹ÿ)w¡ªåÅÌÊ€q…xÝéÆýÓvÀÐÔŒq3 io˜:@úë§ÏëI€N@(<«®OcÜG‰_Ùh>OÙ³Ô_7z!”  \ÑdÁ.Å›ÎY{$'çÖgIûˆY¾ÎLoÌúŒácò„¤O5ϸ^2±¹ˆ÷Ô»~Œ):Œp,ÄáÆº¹LçÒʘð1‹ï —C£Æ›Ö ÑîE@ÑHÅÿK€Ü§Ãr¡¼XË$r’'h™`Ö×¶g“ÙßSBE ±%tàÓ¡ÎkþTÛZi}Œ™ ô- ŸÐ:¢øZÆ7®£nî&hþs8ÓO_Úu#øG'2&Ša–ªxLšŒ¶¹‰p8Ìç¦?ò:Wþ“kmê ?¹§7䕽ùÚ7Æ¢ÝÍŠ€‹)¼oL¬ØGæÛ§†®Û”L¹Fó‘F¯³:¸»ºëeçç–­{=#‚,-V’ò¾1܇=}ÝŠìûï¼IiQü~'ax¦ûÑW¸ò—‹ë Ào¦ÜMËýÁƒ@˜ Y7´sÏž± 6wÜ’¯„ËU@(d¬ Ü=nî1¢Ûç¶z¦ {ð˜•ã!ø›ª <’ý}”Éo8¹ªÕKÚ†´öÀñõ]ÂuËØ.·‰–ësÛøÅ”•Áˆ OÁqÜ60o‹Ê!\ÝÖWy:í{¡yÃÏk «\˜Ù” j à)ÕÉŸ‰|nö@x;æêíZëóDßs((—ý„K÷ÈÆ×öøÅ”a «»@yÏ•‰iõíÊåR"ÄXÀ{ködKíïJ]h§AcÞ…·9ëMÀh5û݃Eù«jÜã›Bn‹ù'(²tZIë˜PÊR#n|-õ ùüµÑ<£ª Þ{ûÝYYûLõ…ãs祈‹¹/ëå¦ÄÍO?–Wþö:æªLۨ„Htrˆ>ŽàX7Yòöå•€YÂi;"Ãe‰­§ÇçVc/^¼·¼ýÚ«`ŒÞŲښv¦€á<º%¼×8i±üõOÖd±¥„Aº› 6ôÜóñJB-«¤µù)Æ3̈? D°lµ|R)¯¾BÀ£ñP¢ÿ`•JÐGÂ- ü ínýg,ÔfÖßê‘D/+~ÖÄPèÒVíEé1c¤G:£•b³@ ^ï¶BÄˆŠ˜[ˆÑw˱ùŒ5íŸ{«ÝóÇC±ŸbJ'â‡T]æjš?x‚˜Ë/zb©ù+eOªÀX¬²ZFªÂé2ƨŽu›kub €ÿL΋r†^è,;Ä|*Ž3A¤U Š`+0 á²„Ê#Ú?Á8Í5|SD²Vh€¯`˜ÿ#9Má<§»w­^Óó Íh ¾ÚâáVŸk8bUnÅ6Œ¹ìîÛ–æ0 íÊÐ1n+a¢ðÉÊĸU¬ŸÌ‹¤ «+‘jœ™¿i¶ÁXœaú]©)BMÿ†s.kÊÌ"EAð2Î#Óù1ѵÈÙzoîQ¸ ¯F1–dVÐ9p÷wXµ›àôèÀAêÜÍfwDÉÜ?µ0qðT•|±åïL®+¶*· æÒ6*Cs•ßfµ¯nè3[_^eÉÛ:ó™ƒ^zc¹æÌÀ‚Æ¿ýðS­¯ÎŠíÔK3è1ÌwŸ36mMª Úîcе™ ƒQ³I™âJgÊngUǯ­¼¥Ð %0z6ä•å7–q#HW!—âGüÂ]÷÷DB ‰ºæaxÊÂéøÁ2AçqB¬k9‹½2.¥„4O˜\\èfÏœïëgí#|Df}šÀwBH[u ºöŒU2 †ÂŸE}ý±¯Ó58K 4FŽT¬éÑèG(|ÏLŠk¸15»À |­z±ÄŒá[ΊKbœ9·{uŒÐÒÞå]$$z®ÉƒÕL,¦_9+n[¥Bƒ‡¸öµzs±íäè„RˆÐó­ãk;µáóÔ˜¦Q‹'D³4 •0ÁI6 ¶²”Ø5WÈ>^Œ‰æ+ñóU–¢™¶2wÈÔ>tíÀŠgUŽ&7®F_-’„ìȬŸD{LÛùwùæsi%î†áÉRÇ4…<{Ö T§åßH‘ðÕÖ‹/ÜX^{ùÕ‰ ¾ ÝàæW*“¢' Kq—GR v=ûT†ø–XÌXb\Ôhòr4N@ÞúÊŠfî€ÏÈ«˜Y›²÷¹µ_È«zïÝo9 á5•(îQbOÔ]ÿry饕x¹Há3ŠÁA‡q þ&Íç$,Â#~LHY6FÿÑÚÐ8”-fYEIÈá!pXƒÓqp‚>¶¸©RR&f‹þóX@Îw-†KrmM˜5ÆŒ5ìâ{ãIØÍV”wo–}¿ãí ¾ð€±Õœ[‡ž¢õ |¿V “€ ŒÞpk³ûµ‚Þñdrà˜¶>Ôã’1d«H­f {“Ž9 Æì¯Ÿ™†4šPÈ,ͺ˜­7¸(óë‹#ô‹B ’ùY¾Ž Ç(-åÈ›’Öˆ½wŽ¥³Ö¹Ñ[–ôhx&„Öõ‹Ý™«ú[-“tÿØKAVì¢Àiš·ÌÜ\Ï\‡ç ¹,Ä“ZJ±„˜ž\ÍKõè «ä/YñúäÓô•O¾ËRzÊŠ‚ ‚)w% ïâ«وFË4q„úꜺ‚Ó1Þ¦Ó³—.,/]½¶\ʽŠqþU±²‡hæ²V­Æ„œ„R"aÅíž[¦»>7!ÓжØ1Öxçšf¡d¥î«Ã”ì)Ë|ŠL“”TçI«ŽÜ§ÉÌJºf1Çø`èö·uÚñêž:!ý q )E ¨Ø[äèÈ9HJ8ÀÁ¼ž<±»ßÒÿ†\¢§Me‚§²ís]ÏTzÇ=CäÍ¬Š‡êx –æ;Yj$Øîé†yokß° ‹„®þQ"/w:EzAˆâ­7ÞVöøÑÐYó;ÌÊЗ+!Â_BºÄÎà#´¾–ê‰^Yûz¢…tûc%'‘·¶Oí±¼iK‘ÚðòÛ>úø®smµ‘bÑÉ"Í»¶Žå¸JˆDÃA.ZŒ=Óá”Jc/öÂJÕaÜÅÖRÜYЍßó¦ûÛ瘀8“;<|©Q0;" ãÁVÒ³ˆ¢äI¬Äõ‹u‡”ŠõÖ-ÓoÞCß%°Šf¬ø4ãlÃvÀ牅—š> ‡d œ$ôš`Êi„NtkLFÐ0ûÓ>É’p=..e9’-+ñ—þžyfhžÏ\›þ ®I'…×× Él‰‘˜+P_ÖS#0(m<+1…`ª”ÊHé&èg"ú›éê'É\Ì(i=."šf %¡’æ›À®GÝFð™,??p†´–ÀWvÃ@ØH~CÔ0)@¬±§fènc)ˆ^šcOÌÀ³¶WjjT„}n@¹nTšœcƒž1BÒ3åßlx³[«'äZº`[9I»„ô9ñ˜,¥mÊ •’'8‡±Zuëäâ'í›ëˆ©óg”N1Î\ßÒvl nÞHÉ| ­2*ÅàJ˜Ì²ÛcETc*˜uX@H‡™!´6"¨âÅU*cÛÉ! Ùmµ½Ú¿-Þu&!viÙòo²rgëQtVáØãCG¹ŽÒZ){.BKØøËÎ9)±Cm)O³M!´‡râ‰ðÔŽ‚ÌZñµmEÎW.â–lhC?&à}Š¥ƒª½”Û}œð”›U™¬¦u•9A­`dã ngÌëθN—¯½ä\=Öî¿?s8K;b •ù=§è ›û6m‡¿4{Ûvrßš3UB€ÁAô&rÙ[Í‹r·«/uÓ&áJÛ^±oñ(0‡Q؈îg% ×o +$ÔÃŽ7w@‹~ ÛàƒEK+ð¤Øê7"ØvG¨X­)TáZqã\º€V ¨] >À , ¯Á[}ú™8’k ž±šºÞíƒXÆšAÓÊòàÁýc”€çȨ†ïM _%MÆå‹þͧv›Î0»ïfM?Yj# t ¶'qbidÅ<'7'x0‰¤r–^ÁÝ5 fõ¤€VÍú£fŒN3ah¢†í¿DyÉaSÅP-ŸÎ§©e2ƒÂ*3qÏ52ÿ¦æR€u½øÀ° ?Gq'XFØtŸ?9…  “†Ìš $'sbbÈɉ™±B¨¹e'œÒ¢ÉØCÈ¿`îC  _;!;«©ÎH |Ú*‡åŽ<”ÞªØ1£Æº-}ÈUë´‘˜*0œC¼n¤;j³ðYÈ- ùæÜÁT{>_P¼'EtùÜ›S~÷-\$æH˜º•\-Ð\¡±¶²nªa¹¡-(¹Tõ“Ð &ôûà"í6DeÎÅ  Y ® çYpý¥`úk´\Oø(Á"NÔJåë(…1»I"¤Q4—¾#~ý”€XlkN8†›VPs &)/|äö “€)÷ûÄþÃÆÑ ;ÑAç¶&¦–C9w¹¢ÿ7Ý´ZY_×K)Å<Ú|f¯á–úÝ09ã ¹YƧg ÌÌÞ}®çÞ sÒäÁ´ƒ^}õ­ pÿöÃ_.Ç÷TŒ`ͦã>%ˆÒômñ AÖaQùnp¯ž1¹ÎºÊª˜X–‹Á7!c­Y®zÄšÐdL”Í”`zH’÷Zb­Ý,„ˆvÆ:Ò>nã™wöÌÔ¢Ö&.¯ÐGÜ‚æÃ‰æ  æî¯ßæù•aû)N²'›û¬ÇŒå’Yˆl¹7³¸¹ååo OîPùC€qÑën®tV¢v΋kd›ã(8ŒZTˆù²¢‡¿Ëâׄ»® ¦0¸jÆ3 úm;ÊJp ® ¥hæWû½wCds@°ü̵‚=M™@ &àŠ°!Æ«²ž·£ØÃÍT5þ,”ÙxŠqwÇX?Ñžï²Ä;¤¡U¿§¬”ÒS*¢¼/ma¶ÿÍi¼Y‡Wo\3Ö%‹rËî… r‡ÖF“ö¿q¯vw„mD/àÞvžqQŒ9 ?‡cLÎ(N0šCxÊ=þÆ7Þ9ú9a~÷Žn@Žf‘‚`È .×­DÄè!Í)T•âŒÓcÞy÷ýåõ×ߘØÕ>á´k¡ê·î}¹lgÑJ¨=#YøÓ[_.o>zþ¿——g‚ì³?Ç­4Ê©NS¨ñ®ÿBrHø Møxš¢ÂøYóYíµ£ÃSWC¾K`…Ó¶‡…»”Mä_Î AÑújDýŒ%9ݹÆ·+ˬÕõhox ó´R*Q?Yrä÷(B<³¢¨ÿ¡±„S°±ÅŸM'<Í´Œ¥'?ˆ;Ãé1å°¶ÊHñNè&Ÿ–©ØÍÌå<'«¦2Œq&ª“nÖî|?.ÉŒdÏ’j(^"ö`¿dòNBd´æ¼þyïXýé#È=~5dÐYJ³lÙßÝý6¿t¬7sA¼¹‚—„RãKãßîC’~€¢V»H‰ð3 aS\^ì¤W7‹Bô#„¨I›y¤mð¼{ÇÙm_\Û·U ÞxÚRrÊÚé ˆ§VrŽ¿ç´bˆÊÄ®¡cŒxÆ&Ø öÏíºvAÎÑ9Bð¸\p,±¯í'Á ÀÌUÿV sÙÒ*!w…‡)ø>WpÏóiØæ—fï$‘Ób$¾ÏjÉE/y3ÁÚ8™ïãnyN'Ø/_üâÈØË€®¶U­Ïû6´v\®].L–d–h™íc# ^ã*¢!›g °Æ*³b˜§ÞWÊU͵9O¨4¯ÊÈ´ŠwàÀÊ^¾`ÛÇ{î‡C¸y‚ùÚ÷vÖûÒ,&×Îü¢©‚Ð¥zDÐãÖ»6õ”ÌqÓi*U§|†¶gÏV¸çŽ «¬„~Àßxã݉¥=øé :Ûx(†²½¹j Ý@£¹˜<âv¿öìòù'ŸrùžMiä Å _yÙñU=cƒð#‡£Þ-~E)]¾ ytßQçbQ¯¿ Lð¢­`ÛÓj‚»U¸ê»Ò*¸@X×w··'1K+ú,îšåb¾ƒcãmoàÔ%K±ù[ñ;¨M1¯‘Ò ?©à Uxæ" ÿ÷Î8…ëøeô’7#ÖcÏ$=øö_F›Cá>:# KEêŽø¼¹®ôÒœ½w=;a áPªp[œ*YS©ši›{$ÏÉç&I(œ˜X£I;ΟfÚ¾‘0JƒÎÙu¹8Z¬§XЩ”±Í„º¯ íGÌ £É a`^Í_’WI]œåþUh¸äÞ!îécˆ?ºq%µý¦%f•gW–òùÆëß zJÏ5÷ŒÑ…üYú÷ÞgÖŽuƒ eÚ¶1kÆ2ê `Ý9«–æ<Š16¨[ˆëðàŽ#^U#èx¶i<‘û’|ˤ}Ì×7ìùÉtNóDhg0YI•W0Mg¼ìjküÎv²°8U™é%u_,߇5A`´á¹U¸ŽGOhìˆ+ƒ9ÄŒ´»~õÌ)6•VG„Y#ÅâÌlý@]ëâx¹GÁ,w°6Û£–ПR¨`ŽPmÇ “Â+ý^ãÏ't4í‡+ Y¶YKÅ%VË Ù]´Ó̇À´Ú1·åg Ÿ‚òY!—U=¸d%¯|ªs.É1zèôÝ ·zfý4Ñ*†&£‚*½’•²E“ö6ß± 0lN®„û&oªAù©§>9cí…R²–drOÝóîÈJŒ¡±à<±'?¦b÷¿ýðWïªC$­tKJ.+#w!ØÄø“gRCuBë‡ØK*'^·švÞø¯!àÔ®¶w„Õ§r­üSnfUJ€¼/¹/ž*æQÞHï2ÌYL|›’8@üÏgöØé?Az>\Õe±RZ¢N+ÍÊ!l—ãuÀºëQ6î-È<§Ùr2ÏsÝ: a\9×Ǭ˜8œ¹¯‚ [€”÷˜­ ¡m"ÞÚºY_õã®<ÏÁM¡4½Íýž-”œBŸM(¹¶Þöl´±Y¬§´ûra°@wbÞCr§wà “‹PÌèyà®Ì\-¡õUSLÂlb/£ zf§dšVC¸¸Æžkò ïG2§Š÷ '?àÖ• ¢]é{`:MZûA’I¿|ôN¶Xaôk\ÇzZòbBž!Ü3âÍ3QÛI¦Ö` Àé)²µ¿¸ù)Kí" ê¶XIçJ€,ó7kGHܲ4bV@ô˜dO¬d×Ä"P«€¸U9ã™ABµ4Ž˜`µ‘õ˜•P8>h؊ߟ—UÍn´‘£÷ œ7Óh~ÕA)!.è™Çæì{ôqìŠIfUï[ØÖ‘ÿÞ3x„ßí«W)¡„¾ÌQ"Á>úwßp_w„Š1ë(Ë0µÙÏêU¬1!I,¾•Ñ{>k´ àãUp+M‡¬óÒrkë"²,ïu‘ ž1@‚oVñ’ðžÑS$ÏûB4F»âOcáÖýÙ*qu¨%5Lwf °Ù7G£×Þ±íç׳㜯€o~‚æOÙ}¯M°UIz ¦‡òdŽÊR¶zU†úŽjûÙ b^% fièmíñ!Çšé·XKã“åŠêR{—GÊ£$²N-ëæpû¢Ì-Ë“‰ÀKGh_Û–D€YEYZ£ý^ýÍW^1W;뉲C9DU„–J½ô;ápøÖ¸údîÛÆUBdp«úgqšâ¸„Áy¨ ±ÉÑJÅ­G¾'-wÉx²Àëwóuìs}ájãÖ.&I¦D ØFcOs£ŒÃ%±"}qw¹ÍɲÑàCø«ÖZΨßT‰â`Uro1Ž3¡sV •–Ы¸:…½n|3~ÖòX_hý^*ÚWÔ Ž‹ÿÖûßYîØØýÁ§ÎìÛäæ±+¥›rËÌ2Nl®jA°Ei„!A~ö1Ë鼯×ÍUûRŠÝuB˶ëÀv—Ân›éw‰VÚˆG&„â3ŽÑo‡1xƒ£„G°Ü LÀÕ–×ж˜)¤©‘8Ý“Dý,¨à0)¬ôⲓgä«åÝé/Ú Púž¼àjœÐ¿Ò“q¿j,%À®?æj¼†„¨Â£y™_ãHnÌB YŠnеÍ8gâ©-žEkVEë;ùIŒŸ9ïy–^å Ó'³2Êâö`Úº½eyÀÛÐ t™¹W]õÞS 챚|Î& à”`qéÌv&)‡àZî×Ñ3ãk#à©×@öåѸ:D297!І¬ÕÚ?@ð+„×Mª!„ÄîY‘?®¨×©$ p\Ôßr¯/iT1` ¨ #nCà÷ ¡s_l¡â`_ݾCXUŸÇª áñ#h¡½[ËÈçÙ•–½Hªœgå\o8SÛ¦PÝ ƒ¶¿mË )•þݘ5CæZ§"ÚV¹ª£´£ŸcGo·Lœ…»“¸ç¾Õ­K/\[^²²õÍoH(UŽ+QP»2Ó£—\i Òwv\ÁášÛ‚XÅL©Ñ\¹±Ær“0U1ˆÖá:Å´;¬Ó‰¹Mâ8¤]ôè7T1‚%Zml•-ÎÚÚ X:ee—Ëþîï|Gdön‰=sTy1MÕw x>¥L´Œß¦æÍâLu5ª*Êv÷¾ãÒÏ?Z^pgûTÛ¹ ¯¼¬v|µ–Æ0ÆøÆPDô†§×è<‹~‚W÷e=¹è[®$>›ÍéÝ|kÇøfÅ[$ˆv4 W«Ç„Á_}Äóy0+/¯†DB¿ƒYô;‚äëñÅÿs,º7Ý›Ö çÚ/^r¦cEê&Ã<‰¦’>kÃÅi¿ô…uâº3Áµ¿™ŸAgu5þ¼NÀhÙŽ[B&>Ad¥Mà48ÁA³Ì|[]ÑÛHvƒH¼ÏSzµ1ÌßJX™ã=33›4bâvÓ”¢UÎv« ç®­,èt1O0cõ¯v¥‡$BN0†êˆrÏfÒC%nw«óݲyœår$”6¿í8øzv‚²¸E¹‹è³ Ûy}µ²Upù¤„K£}ã•—–·^yq¹Al‰Y ˆ}{玩ô*vΩã>UNÅjÞà)­J)?¿Ò·¹× 'œ÷YA.‚éîÉ s-´D¼}».ãDý¿'TpU”eЦàÌ®ƒ1Fi§UÆžOÁ%@;ꪻs†(Ù1¦Œ‡Úõ_°:W2ÍOukÏÞQŒª…ój]u)„h§'‡òRî©4R8[[Õd¸ô`á‘,©‚î\‡î­}Ÿ¿nk7&öï ¦TA (Ä3ñ£w@M¶¹Š×Ü4í÷Úø¾½™G=3yŠðú<¨Ÿ‘Ñ ‰î)  aR-e?Ši[¹A,x W‚ huÞîÏW__YƒkëD`A/€¡€Yºõ,x¯«=¨ xLÀíÉ{Ú#`oê54õž\Èñ;÷jÀ, ,»žð«ïà`&Û\1{Z&K$ÿºxWûÒºV°9Œ–wÓ Aÿ©ÝàFˆI«8äŽn[M«|ínÄãôÄ"vÅÒÈ™ÆH9d^™•pjcð–%ãKßxE¿„™T„Ù6Y{\ÇHªdËCÖMÇMYaíµÈ"HsWöY ™ûÁ5Fîý‘í7×®:6J°|7ÿ]íîß»7+™â`DzÄG89˜Å¹ŽT+KC4¦^£ÇÀYЭڵZÊ&¾òo%À4=hMF Ц¸!:ðÀª¤ÏRRÚP»1®Všåݶ!8ì©S.m9J%N9|8>OIl]·Ê_åaµèñ‚ƒ : ë1Kºf5´R>"îâ2s>®;”…Eœ"Ž}~®Í -áXùç&-}ö)!I°¼ôê”&ˆ yJOoiÛêåfYæú«¢±:6+AÕÁ¥XŠEI™ÅþΊ‰E¿y)…bOÑåžë¥ƒd±EïYΓ\üÀ7Ŭgñmäñb4œ1ýk£Xm4—Ó4¸ÂÁÀü¢ÁðÕ*mI­Œ†·Á¥ëy%;—.±ÆÕê¶gú‹kwu;×g|v x¼†îÆS{þB¦÷cÝqÛê·ö½ÌøzÏÚÕ««wP´ÔÍ0µ1FÄ3ÆÂÜ?"Ûu_4™²+‰Z™Ùò‚j°èyÄš0Ì5JKåç›1âb‘x¿¨KÚ˜Äl•÷m‹…#_}·©ÁbNm=‘÷¾Ù5í›éĆàI#Õ»ð e„Q³)‡¤Á¢ñ:ù®¸î Q_íŽV¯}ßgK%¿­;Mp6²v;5Fܯ9ˆò£›·—>øÕ£Ú£|¢©#dþûâ h V"Ĭ»$i\I–]÷VþdÓ.÷5‚q mOËæ‡Äæ|ƒ·™KãN@ÅÀÙÄ»UÀÑ´¥[Vû÷Ø” θô‘J›_ܽ ò Èl¹T‡ý"ðŒVË'!ž ‹š}©ÏS;²ZsQæ'8z“\ψ}Örâ)¸®YâZ1Ƭ”Lòùž²+ý¡t‰b4H~,HœU…3lP7ÝJÝEI—Y—U˲@!lrˆÊé5mZ9Þ©O¿+VÚN²¸ï©TƒNtPÌ)&o³ܽÕ(Ÿ*޵Õóñ«³EˆÜå#0ºpùÚä?ÝTR¥ýse}’ºÁ/·1k|UHl%}ìˆCU§Å‹úÍêºzåšÔi¤&ûÉgŸL¨Ä`­¦:ƒ°ŽÖVÛÂRž+ÜV¾‰nS&Ù)&1ÖE‹&¥ÜôÜ(*sNIW‘ fŵq= 3a‡åæ¹Øà¯6{ßÍ}§õúèBœ,{·*¢àšõŸ0Zƒ:itcÑÁsÏ­{ –~ ;t01­ÚZ¨;÷³äÓ‰ÑIÖR–bá()»&[{§OÓÒ:x®Í÷Cc7ÀLE—Ï¡ƒ™Mß÷àñy_½ëû´JèઠD¿Ѭv1.ð˜QI´ª\ÊŽ v÷‘ài§÷f~öìÊ´IöîĽBÒ«ïKäŠZmÜì ;KX£u2ë[j’³öBB±¦ªñ…ˆV¶iÕ,7êmî ºsÀ£gÔYæú9mÞQöä7¿úíþ$5ÒôÛâ •ó½ã°€;· X±£úó&ÏØpšJå9lIÁ€±¢Û6Ò‘Mùﳚb¾YNSò¤§óÕ5†BÕÃØ1øuµ¦XPne]U²¢h`óotËórt±T¬#¯\00Ÿ’.`Ðá “,øÔÆl‚Ïr¾f“è‹\¸VÉ¢‰,ép“ <=7Ħ­Ú×Þ•¬ä”Yólþ”¬ú¾K°S ­¦M|Î1ìeÅwRo ðˆkÜëÌ,´ÀºëQYØ Zy<®OB`¶J`Ü-H))YJƒJ¸m1Y°ÑMYä ’˜<æÌúÞ²½èÌ×rTRš@ ¸~®*G¼úô£åîã{Ú»ÈUƒ]ì±<«,—s)¡ZVe±WŽ¥*-X´µûòëáYÇÝŵª|Å5Ü›ø­oœŠ®)a5|Ó7†ÏdD«ÃP]õΔÃF0î8ÆÏÀ#!MÈ»–¶Z¿ ¿„´Ï=U[pvoeb´m ܽØD°mÇ|VS1f•6®JÓ^°ï,!{$ßi›ë ¦…à,ï‹‘…à’iûBm$dŠýáø:ƒ:3&¯‡ÜÚŠ ®KÈþYC"Ú·„ËÔˆ6¦¬®yÞ¼JWžÂð] e@šÅ–äÈæV:ÅlL†ûR .°D #´RÖ\¢‰¶·oan©©´Ö"à Æ´u'Õ|s§cÂYí‹‹á²X!‰ãù௠#îqAä=ÄoÖhÇxÇ+já®gh¥r) ¬—>×o æŸ[Þ|ë½åKe}ó$ŽÎòÑ‚Åq¥ê;Ùçæ¼»Ã]W6¥ÍàÕG{øÕ¬Â9 Œð@îÚøÁ+AÞáâáʧÈÝ3šn1Ó‘ `첊;¦?—¼ŽÕŠ^g«T|nô¹éI®á{ô”’‚n¯[å¬ÏTQAŸÁ£N†#”À?ús#½ŒpW8Ïz›Êhhøq¥Ÿñ\ôÑØpñÀ=ï#e” bnN{£*3¥Õ ãA§“X]Åã^ksóPVñä8èx]i ±H›S\[Å(ŠÆ@I§\ ±™ É X"~ É:‰)¦‘Ž2?Û캫ÀYæw?³‚S¢ÚôÇ½Ë 9UOìà…Lð£}í*0ŸÐ 1·§ÝFd£ “Ô(I`C0e90qoŒbc¤ó»Šý‹¢¶Ú6þ:·¢·µÛ–“”DÚ÷ï(Ƈ8w$صì[²`%m/* wN`û‚Õ´Û[·1m£qΗá2 [.Wq“–з1圖XÇ\YšYOíåËîH© ÙÌs`ÜH.hÙþ¼›„;Mä‚bþç¸/»Úé„é »âç$wÞ¿ýÕÊY™Üâ%©3U>´°L¿³ôR2QHñˆ\ú¿dGþ(§ú‡·hª¿VË…›åópàâhê¨?H#ô¶—ìÄYE›brç0åžóïŽ%ZîJ,|ñÚ5.SøJ$ sk¤:ìË£3÷'_é˜! øð«¯¼¥qe@¥§²21Š/féÅè9 £lÂc¦’üFôá;ù;nf£-Ìwcå›×,›ƒÃ1‹'zFÅv®^«>øñòÖ›Mþ^«ç%ƒ\ì) o£”8 ÛWRìåËWf¥3åÐI7ôÑrý…&6uûΉc½ýj¸ÅCÆ<ð¨„P]R´¹¡Ëâ­›‹ÁÚ÷¢oqÅ”wÂb`â·)E4ü„†F’¯s˜šVèg’Tøiö_f-¸òœâL¸œà»w4m·q”š¡e[µèqÜsúÅ«Æ/厵">ejX ÷ùžóœ>VÁºZìÓ…g“qm«½Â.ãT2réKce§aŸ! 6 î§UtâßtªUdQã4 ¦pÇ.iRKeOÓÌÒ0ôãèÃ]Ü1fí@ï¬Ë“ws“yûH‘ùÇOî BÕ›>£ÏÒúOÓÚ '1ŠJRl‘òç+-"õ¿xرàim­Ë´ L4e5-á<°¸Áœù†H'æ‘ÃüÄ_ž–ûÉGL¹x%Ëu¾Xò`±mÑ€Áæß?|°Ü¹Ï*rTÔäÓxö¡j‰mC8Ë”A™ùY`c4÷œv¶ùéåaåЈ§^ï&›Õ†ð’«­v BAÆcnd¥.öÆy Ã! ÉOA°|W­~Ú>ç™kÏk×O‚òp*|*ç¦ZÖåY•ô?Åü²¤<­Ïêo¯‹´->ƒ}×¼ëF1øSºSENÀè¹ö^5, ßgádµ¢º£ÝˆêÀ€Åêû,Ü]«’gî„JYÒ¼×V*Szå÷,Ç-ó©øX)UiÍ",n¹®æ E´ y}äÊE{’-T‡(‚ Þ= ¥~'½Àû–¸§ô¹ŽÕï®i v +?6‰ÑOô´!îÚõ×–—_ùjÜñ;N\.ãý®ÕЭ¼éæªo)Ë[¹•'ÊéTçý<¯Â‡Õºzì$šÎ:¼¤†ù~i1ã,s}ƒ±Ù¬Gï[î÷fkUÐ?XTËjª°,g RÄêz÷f&D7Ô Ø7„É›Ùì' >IèæŠ‡'.èî<„¿ „ŽÑÚz—[‹cõ\oKLÖâëyv>5£-xOÉû…"7»× ‹^† ÐÏ…5 “¨´ç ³L2Öêg*(ÔLЦ_±L’/M @-C ³jÂS!h*H„ú®§a걎<ã‰L§)Ÿ=‚ÌÏÝ#ýª"ýðöÍå£ß~°|üáGª~¢Ò}.˜ºH l«Ã©³gì0ß¾ô¢Üåž@Nî€8ÎÅâLâþ:ÿ«~Ó*+¢+v’)Dåžk8˪AÛHÓÔi•¦ÞèVœÍ‘Þëieõž¥#ζTìªÝ DDPµËNÏ=-(â§ôMÕ HÀܵ²sb5®xQçºÂ&ªÍáŠÓ>vÀ+w®Ô=±¡6ú&L[ èøì]Z¼ÚXÅ-Ji`z̪OíMEPXí¤ëÜ¿=rÃr{0?oåo/âÎ!H`î”UZýÔéÁ[“S$eBÿLßGÌ42êGôy=‹ª•®TD v_ßÒˆ•ªmÅ'æl¸ž0}þ‡X[1s÷yîk¸•­-XÄ=¶x †5îoKÑbC¹|ÅWbæ)ל˜’¬(ÀÌ’‰6+Þ7*ÂÕµPY ¾˜óТacœÜž” ZnÑb¶Gg÷7Nâi½Ýd¹&ЭûÊŸ’ƒ¤IpôLq¨sjF]r¼ÓåÊ&[eÌÅL±…ìûU0@¿›p»=V›•Ã, 8ßfaŸWRçÙ¸îØÞ1_—´qY¯1EpõÚÒu„ñîÙ3[=v­ñÅ ›*\c¨ W xÇ1G§LŽóyÊ*éžÂÑЙ iíÊj4žsbAçJÐLj¦.; ¤%ÿ*!n±Dλ™–‘÷ÁvV/ÀµjŒ§¾/>°FiNï«Òf³¬‘ Ô•õSþÏiÉ¢Æe˜‡ ìøeuHFD ºÊÝP;CïY)i»¬¼ÜÔLô+Æ}¾‹<¸"š²¹AuâM“°,]«|quÀ—µñÿ1õ'±¾¦ùaß÷žsÏ|îAâOSNPŒ2¯U,ÈFó…ïSͱJÅçáÅW#HððœÉ:ïŽné;· R:“¾/ Ý^TàuTÊyîqÁÀÖyXݱÿ‚yB…Óã²õœæH•Fô¶g¬,Õö¶,©–ðâ K­,!-aø ÅWzRüj„S.Ædkš¬‡ÇØ1ó`$-Õ¼ƒù”þ×J"=sý¤Ó¦™·ù´^A\Uеé/þüŸ-ð{ÿƒâE'NÌi°ÈŒ¿âàÅ6kFÄUMçw¾µ|û×¾µü“ïþåò?ýÏ¡ñ™¬ Ÿýé‡êíc›Ç«wMœ)í„Ýâ2eŸnÞº1±ž4JL²‚Ø–«‚O‚C{\ˆb!Ô½«­æ»·IJT!¥ªácBµÏЦ“:lQI[rÝŽÎ?SûR|îš½QÏ™ðyõ-§¾+–ºïpÌ—ÄÖvVÐÁ@À‹'BÝ‹¡ 2û¡U ½ Wš»ªxÔhìlˆ¬hâ2\yV/Àìep¡bÐçy– Æ;€»#Œíúâu—²©â:’ ÏäÖXlc-ù´"ÅÐ]á^ëßbýU½?€2ÿâiCüÞèJ€¸·ŸÄ]ídëi]À¾sørwƒUì›ëX%ÖÝž.W.w  |§¨KÊmdú"è‚´%A‚gåÅæ¢²UŒ'dÞî‹I@.áƒÖõhóì7ÆM(ÇßÙܘj–M¬Tú=z¯P´÷ýF—Ç”T.í Å”ï¿ÿ¦±ORýÕé½”Lãš ¼YHN5pë,þa'òäeÀ$H®¢pýàÁÃeÿëêâ¬y’!pÑ:¢`ŒuMÁzÜã­ïà L§™˜Oyï.÷_P–]%”@ÍòÈO8ïmÃxZ¡¸lÏKÆßÜñ¬ž 7 oñýxv§¹Ð_0» †'8?‡u0?G‡Sgå¶¼™•×ä~‚¦øQ!†$Nk bgÎÑaÆGìÚ*S(SžÕƒmØÄOÝ•IÌ^7żiÇf=4 ¨nëÐóMÅO`îPU¤i詪ﵴþ!Bÿøþãåÿè–é°(nVÙ Í·4ßJh#Ðö-µƒþOÿâ^þòÝŸŽÿÄÄ:œñ·¾ów–·¿üÍåñ§–ÿñ÷ÿqª÷Äe‚¨Ÿ|2„š x¥‡™ÜÛW—¤ cñÖP ÇÜóeɨ1I“ÆQ_û/‚ƒ„ÃŒ@¸\/Z¤8P5Xõ¸®yØSk|&ë–;÷B| Êóçºvø@]o:˜ ScCÞ!¨ÓDVf5押oïÓ¸ËY£™¾æž™}A°=åÒ4¿I‹ƒO™ ‚—)Š3°šXSþÊÌXv[Zj/rÀrÌéHH'´&ýŒˆ=’°¯ã+ ±$,€e4^4KÕ×~8bˆ¹'0Ù|}²jØá¡,YÄ=}©†¨Æ8¹Š«¬™I°c¦}«î>FqPîUÛ.×§Œ#³Òóà¨óh Ü4¯´§·ÿsTÝ®³ «5ÂOx&è}Ÿù-Y2VzêDjr Ì{dëÈš!ØcúÇ;¿æ b„ ÚW‰ŸÖ¹‰ž§›u&~[W°¹fKËÝ—ß\~þ‹_,ï}úž`?KXVø&:W&÷®^W^B@†cÊ0×8_ÅûSíy_zå5®Ü>KuNÃãlcy¢·,UË÷Þƒ)ØfýOíÝÌ.̽¸çÌË:ãW4N¢)l¯9[ÖÊêSã%°ŒU TšƒèjÊïŽÐñ®÷]?uaƘkàŒ0ð]£ÇwY¨¬ àuDø:%’]›ë×þܶë,Äö絾̥<³kg@ó/4qLÑ?m¥VÎ ë —§ÕØz—¤0¡TÀ¸ÇFxãnÌëCé|³4Ȱ‚¹„€ô€M³½D ”ÖüÑOÞ]~öÑ{˹]áe2ÊÅ {4]5NèØ„IVÇOŸ¼ó¡8‰ TTü¶‰~öþ'x½%ÐÈRó´g´R{Ýê—ïÿÂo:n§¢¯é81XB2&iÞ1Y$Á4­KÝ?#{hÏ­£#ª ˩㞊Lg]%ík€u €­§Ø˜Õé[}ªúú­^åŠ~Dû€ž`šì$|­s_Û»”ÚË– ² ÅjVÒˆSO”ÙÄ+Þ·ÚB²Bvõ1û4õ…8Z”—܉ þIî«{k¬VA¢›ÆúÈ*ý,zoÜŸ“*ë µªËaõ þ,nA&û>o È%@Øu¬ª½ À;Y~׋AXÈ"êC*m»¯«å3Áå'Å·Mk<Åô•}ž@kÉ8 ò’!Á©€gš¯XSǵ¾„oÖ`f(–ñëJ‚‹ºýƒ†­™p¨êºï³’ èf=SÌØ‰1Ûõa‡«ÖÓYˆÇNMžÙÒë“ÏbbÌ“YR¢Ïõ%¦ì(—áÂ&ÈŽ]Úõ3àÊò@cE£ZæìÊ–a 7Y¥ciáÌ`5yÍ+<µi,¡_RãŠJÿ×_~}ùäÁ‡Ë³Ÿ,÷ÑÀÞîu¿Ž£§0;šþP=ܧ}²ì¼®Ë‡ãõêÚ¦¨öÄÒnêTp“ÛR,óá]Îé+xjækô›Ûs“ïÿDË.‹á»/ê‡ÆRŽ0VË(!‡Q}ÆLð–ýœ0MŠ×ço0 Ý™²ߣF€£¿Õ<(Mߦ$r‹G)˜[I „\1¼ Â×ô|–UîÑ ¡õo ZJ àýåÞ§NS¾?ø€*ŽÆ£Éù/”ZØqáÎûm÷"”θËgöbnß¼J81MG0E<.C“îƒLÕ›/ú3›]jÑwÈ*FP7ë„BVst9^oyvTܾ)¸ yúòœ@r™ªšLÕò¢Ó÷7BÒÎrïgέ¿Š˜M® ²¥êÿjy¸|‹utïã¿-¼4õ6w«E_Àöh¿PÀ‚d1M͆Øó©?j_ÈBE?½a®ÉÍ0ÖW/¦}/¸T&H“d†:áDæÉé‚êŠRBð×hÆ’ÍeµçO iÃ'pB ˧npŽ©‹g€_Ãà8gö ÁT€—ƉIg(+zç¯?ËΕÊVs ‰1yí„`cö{ÞœMF$8<“š˜[6ê‹ébþb8“ާ@ªoZY&ÆœïšF¯Ùæ:ÁqkŸâB3VFc“>à­X_ÏKöÞœ#ôU™‚k‚¸xÌXæØƒàâY~foªqj/aÖå¶Ì”Q–r™àqÌãù“ø'Ì9†”Q‰Œâv[á›Þd1Æ+ØÜ½.$ã²½ƒ°AJã™:¤m¡†¨Þº*–Ý0´%ÎYjÖYSÅ”På"ÕÃ­É _Þ»º*¼­MÊ)ÁTwŠëW¯S?×)¢ 'î)#¼#ñ­¯L7n-ŠÌÑKÖ …‹àŒBU85¿Ùö¹Aàc05'ó¸ã­IVø$…[ܪù…·p:É|xNë¯cüèÜ€£ÃsΗ?àž,Ì R ˜FOËayí¾þõÚfŒ “x3¨7ô‹»¤˜(ïuE̲òŸ~öÁòÃïýŠ2 ‚{°FØÃÃ;BwõÖ//Ï…žd¬]×ìʘ_ç£oœaÂÜ-&-Üohêh®º$Æsä€W06R sµ ÜVóaA„|´¼úòµå_ý­ß\¾û½˜TÒm~zÕÙ—Õ.ÕÜ!_¥n\½©ðеgÚTkßS]ï¼l3­Áá‘sÏh¹µsíX™ÔÏÌ ÀôUEA,ë`â/²«^N±^·õ` Ç>¥ÁÓ¹Z¦uH=åß-{cy53;DVi,¿´ø±g&Ävëb «ã¿+â˪ŽÈç¡uHeL\àuÝ·Y'6èV±±ÄãÃsæNÚdß½>P&â1‹njœ‚4B¸„ºKpjÿc¯OýÄ̵âÊi»‚8jýšÕ¹î\}LV–I M9F‹!`ä!bDjæCŸ}É* ¶Vîoó0é¶Œ÷"¿ÆÄ_¹™¾4LŠb8ÀÛ1ÿ ú(îþfMæh"h²_4ù ãÛuƒÈ-é©â›)²Í-Ö Øv”WǯpŽT³Ä÷¾Çp•$»¤Ä\7(Ƕ“àÒ¬ë,뉯•‚AÑûLÖú¦mÕ2ÌŽK6DÇ£P’æK›×dð‰ãÏ®t€a„©Ììò 6·Jhèj …Íc-’kÙ[þ©;âM·oÝYNŸh{cYÀe¶+…˜Ö_%øÊb ž «, £ä`Àçyœc›w0³ªÇÊE£çhh<_y7ã»™¬cLœî îð3ÚK©ãšÌZ0rGV}á‘1À4ÿ*«œ(Mšá!Vy±+P䉵éäøÙòÓŸü•m_?@rÆÍµg M¼MˆdB&zZAòòìÝO†ªÅk»S–áá§Ï—„ÛFû˜&s`ÂGõÅdÀU/aÓèd¶5i2<àZL©×LÓüô.4ÆÑ~ÊJýæ¯kyüð‘íª«cR ²~¶¥¤5H¸‚È®«eúÊ7¸h×–Ÿ½‡uØS ´·U-ÐÆò¥×ï.Ϲ[1Ý1!wH]¿~Ǧ̗À­¾£Öa‹fÌ=Ðj5·a×ö‘¤ýTÞ6)׺¡øÜ=çbÚwŽž?¤xu-¼Ä=óyšûYŒÁh„)Õð·ÓW³–¶Iø›*‚™&|çJ ;!MØE àU`´Ë…Ìh®Ó#QM«b³bS‘éµ¥#­3qctVý/¹ ï¢‹m@ÎÚªB¾Œ\ë¾¢o;FVNøHUƒéo˜²üȵɈ‘#­8‚Äúr RÖ&2óï²ÌôŠÛ2’›šñd*‘í,(â]U°g Åä7!`NÍ¿ŸzCE_eÚ€Çk‹ˆŽŒÕš«â}Ž'³žÜŠu+]9µYºf€g”Ɔ“j·.s“᱃m¬íŒ¾º*T.ÐY‚—¯Q"Üî§’7eÎ^ÿÒ—Á³^Êч›Ü†iËbŽs‡«É,ÂÕÄPÊ ¹6Zo©¹ƒ1Óžn¤×ôhzè(òàU;ÞgN[y"ƒ»Ïj:¢œ:ª¼z«™—ûw0eÁú²ÂÑK8LÏÀ ¬„Ž‚ÍYœ©@ŸD£Ñd–®÷“9Oi¥[Ü7ni߸f”Œš¶ioü]?…Žy2~úh¶ª|ΗÙ=Sœ}$ =®Æqy`§²o½O‡$Κ½/ °Ž× •Ô(«[)ET–ìh^eí-Ý-N‡Ö;ýßÿ>+$á²xb-˜ri§nRÝ5»¼ë0ˆ§J7þá”p"QÁö˜pZõõÍÄÖ §©T¨ñ Ì_ì2Ä²Ž ^F$3yº["ÆÎÝJI+ØL’øþ&|¾|÷öò3;@cŒ3Â¥ö²WHÖ ‹»\E\;öÔé©~IÖI@ìáýŸ.ŸþÉ/¹ZèwÃXBì¾1oß¹5Ç@Gèç>KÒ¶ÔbH{ÎKp¶å䪂·ÓáèLÙHÓ¸¸Ù&-`7îkú¾ œç²Miö,—Nïxbgý¥¯ hÖwûôx g×îréú}ì̳.˜Ôn= e›CÏË­¸` ŒXh¾ Ò¦í;1kÖMz' ¶õc›öÞ¶Ž¬ÖÜ `aä#×™³§çØŽZs/cÎȪ4"Áw˜pj­cr{Ž›G9ob7­×³sµ’šiï6gÍ%ŒŠMĹ‚m'éIS…íºzQÅ'%CÖ:o2o¡=éæ}š=‹¨¿>³Ï 7­o’,^6¸9ô3Up¨@N\1æ©Î5¯Ž ÐD1ÅÖ×Þ:HóÛ>&c^c@ýà+&ô¢¹ësR AVÜp‡Ñ0‰1È‹FOyImË JÑN°*‰Ô¾Ñ{šî­;°£ÏÎÑUŠ5ø¾£b8qbiO uÀK¼̧¼‹OÞÇÒQ‰§-v‹ù˜P{ŸbžU\"1ÌšU5kLãO ³¸y³å 1?úøýåƒ>Zžy`éùþëxíç*ÆïÞ~yªƒïß;âʽ´à®¾ÊŒòñ©}É«·¿âŒùø­ï“ê™Ì2'4QZ,‹¤: SZyKÁ£åŽ0]í‚&*7ËL}%˜škH7u€ œ¹-Áç\ÖA›@«Š1JeÞ0Ï7o/þâcB¾ûBÚe¢ÜÓC×Lÿ+¬¿ָÃÚ©ðr¥!N`Î׸‡;$Ó£lO{”jú–K¶,Îe!#3ç³²"ÚÙЙÉ. 7ÝZA^Lø§o98\¸>Ëíë+Œ0kš”ž—p©‘þwXi# ܱTßÞ›G4;E}.pž ˜;ך µÑ¸“OY“Q–ß´1§FoíÍWzþŠ1<"ŽXÑ <ÄxÑÍõ:.žµ•è¿ “ˆÉ*ͨwN¬…óâ™Ït#Í•(ãY¹AÑŽÄÊŠ8ãbµIúê-8P®pÄýŽ×Á*¦¿~çeÚ³p…Ãwq,€‚&q¾SÕ¶ë > Ù^»x`W»ÞKóã}‚!¡“‹—°»êاÏÄH-îcÀ¶€±þís ~1f"¼5^Û[R쫺BÂ'Úià2´j `šæÂj·¶æ‡ó~£ÛðÒ|Ó ¹Øýí§ŒÛ¸ôáÎ{¨¾ÅÌDá YlÅ«x.ðÞ½nHù+×_BäL]ã9£%‹¸Íï…=Rì ˜B )°’=%}šwG‡ËK,ÍŸÛ4}ë&w¶çùÍ‚6Õi´ÇU.«º+ëÙNKúÆ.ì+'¸~óÕå›ç_C¹ -¡F^™úIߢ&iÔ i> ‘ó_“rÑĦ@+€Ô¶»¼óÞO–?ü½?X^`×ϹjçMâý2ómë2 Ì ÞûJú¿ùµßvlóM‚èýåÇ?ù1Ͷ<üùû˾÷£é¡³g“k–™1ŠkU$xåùÞò+_ÑŽDËÖ„PL@M„X(̂ʥC3Ï‚e2"ÿI©BHY²ˆàè©: BôÊÄT¦?x_½ñê›jÖ$`Ì€»G0Íi´ÆK f,ÁŒõ¿ ‰³7ìv!!î=j›¡7Íå"*sëÏ5Î&¬Í¼Ú™O8xšß´˜¿ó„ÔÉý ÏŽŸ{í5…¤‚iÑÕ©®ˆd¬'œ/º6=›ÃO€€½BIx†kSA|eõà’å1‚°=;!öÌt_w:ŠÈ“x‚LK6í?™1²¨€YT= ÐJÁD[1ÚÙ‰ÖëZx˜SPšƒbŸEwò/XB)Êܯº˜hs"Ôs.CWSÆê¾jÖ˜KבIÁ쬣pØNŠÂÑì¯~í­eýG,ypž6AæR¹L{=×»ºôïÔ¯¾öòÔ=>9{¤«ˆ®¦6¶_ƒÒ§½ÅY¸{hš:b¡™<(#‹ñRdÁšÒu—Ôv7Sí9"غIí2ÑXa1kAæöœU¿ÓÊâ÷o]‡Øk´Vݯ.wîÞe2Ÿ,_úê¯.¯¿ñ•å§ï¾»üéþ÷Ü:3Ð2mÏmþà½w–7}¿{ç¥åáÁGž›µWÇD‘~°æiGÌËý+à!tïÔ5ó–äùìuD”´v?Í»™ZÌÈE¤oÎÚúÆo,˜ïëº\_˜!C¼q³<ÓT“ # Ë*ÅèÕO<®îªfrè™9e §aª,6D’‰‹vÑá;AI„œFŠÀ²Z¬uã\³®¬ êžs%ŽÔ–œxv”c<ÂÃ51^Ömõ]P†P‚!—£%æBÎOg/ ¾g'eư“Qro]f3²V±‹,š¬fà,ÓéAdìÄGB/˜ôÌiã}1’Ê ç iY¦e#µx&K*ë©lØÀR‰î¨]_ükÃðtõA ŽÅè.NíXÈòœÎ‡Ë­ð‘,SB,b½c°º²';h¼} r­ÑZ†‘ш`x›ß[kí:±%—6Eq¹Š…¶¦Ñ!ò#g»µç¨ašðáÚLMî.åZ‘æöÞ+Ëoý Éí°Á‡Ÿ¨q²«^­ÃÿëÿþYž)oºòº#v*û—±¹$ËŸ~P_ô”d/³ØÉ$O‘úÔðœöà60j-°Ù8¿k®LkÀÓ˜Í;ó¿žß²„“øwô%'šìÉ?xxoyôÈAZ§Ôb7-ÜÏÞ̇¨­'†jWÿ¶xÅ|,›ÒÊJ‡pF$ôÕŠÒâYE™4mM…ÄÈv¶Îö¢Õâø¬bWÿåšFì÷trh]øÊÊ%ÇTÏØ}:Bôƒûî™ø †XóAëþ8ñk?¦4Êä»,Ê)R-â'YQÚfµœù9fåîØØ||.sê-µ5')ð›˜ÒùÆyvÊ«óõ¢“¬È,­î@Äy‚ù[SøIÙä’çÊ›!ºàÂ;|$¬*9È2;èt÷o™_; ¦òßdÁmâfþAèŽ>2[²o;&"­]ÝÙ6aäCe.[=™$1Ø^b‰Þ¾¥Ÿ—É×;ì0æÈÆscu$ùåšø›5˜k ]Pü*Ëù©xV‚âô %g;”\â""ˆ~‚B4W7ÌK·í§¤ÐJ£oSTYYY¹YÃÃoÑTÊ NvO0ôÕˆÝÞD³ÁjõæÕØÁ'Až`¯¥{z¼»šrå@ÅxV±X3ë3¿#Ô‰xaªÁÍ· ï”V„÷`f‹Ö£Ï>1ÿ\;–6ZF ž Ìs–éŸÂ,èdDaóóß*Ûù9^ÑÓŠæ¡UÊü¾^YqyYè]<|þó µÿ6Ÿ° ãy eÀÛÒ4R-^™À¨…ø~ÊlôÑ”&ôë¼®¦RÜ Ö9‹1c¦\ÌviG×€}™²å3ÍÐø˜ˆ S}K˦ÜÍ'˜®\¾.Ötuyå›xõþñ/®,˜Â oþæwl ¾¾üèw—O~þžÏ0.­&ä)kà$™åñ=6¢«÷JcȯŒ`ã:-e {!FÆÕÀ¢*b+#Ÿ2Â)—®FoYAÏϸm,žÜÂö ^Ó1‹Èî,ïüðÀ GÜŒ7™ÄAóð³aý€æ…ï\7œêÏžR|ü5~{†“­AYІÜU!èõ«¶îÐÐëNÿ¸â8n{8X_Ï“çY×±9>ÁdΡ9ŸÐ’O¸@ÖóL‰‡å!³nÞ‡iKs˜øüEÎ›æ½æ°ƒæ6šÚbª)©AÚ)XUNáIJº·÷cm…ë¤ô:gü¬Äõ¹{˜•áñj¸"ô–ÎN³ÉÚ›X‹¯£•ÌúH¼Ï' „žÚÿV"!X›hOã8LÑiî øtm1gk„©tÊIB1Ì mWÀ…€l†Y$vpj…ÛNö‰–sQ*]Ø!´¶%µ Î'»›7ÐNutâ)&¿µ}‹b tL¨ x–Å‚ðÛ²X/Ë“|Z¦¨YR!þÈ™†Õ™rÙSæ§²ØK\ܰIüšÝ ³ýŠu75ÄŽNÀ²vž1[=Àpº ´6ãÔÁ¼d,$¨€I&Ùkxõ*Ñ7á?AWîÞÁG|Û8s;aÔ‚GHÊJåâ"ˆ,±I¸ö™Ï•ÿÔƒ*SÚœ0?A–˜Ö3gŸEËt…÷Åμpixê˾O)<À‹:‰Æ7­!~Ûf‘¶¯ö†rŸ·ßúuë¾PyoyâzC.·l;"7’蹞´éà¶4¼@øêá’¤ÏHÌ¿œc ˜ÔýÞ÷¦T_¼èÎùÙrïþ3ÒðT]ˆ}rÆ­‰y™³Ío€j !°vþa!šÃÏ|‘#þ`aõ–¾Ë­{Î’zÎ ;bYÕ.ä´ryßÝ×5·,mÜÁ„s” Â~Ê ½$½|Y`;­œuQßðióàñpxÖGbä²î ÞSÝ˱jÆx ]­QÔM,Ÿ¨~¨b.l§¯d¢·–1CYl«T¯³•EÔ‘Ô i¹Dm­n“Û7=¹‡drâçèä’R ãd™¦¯”Ã=O*Øÿ¢žˆ³=âߨG¸ ‚iû ùù…!²vŽÁ–¸Wž‡¹bìÜñºíó]¸Í5-Æ”Ë$TGø˜‹àRsC`Ê+±¢EH¹P¹ ÙÉøxÆ+l<ÑçLAÜ_e;Óu4_‚(íTcªˆp²iv¸ôtBƒ¥3»/9‡ÜÍU˜VN¸‚Á¦S6žµ*zÍ#ÌXZ°Kóvw€•µO!ì!ú¿lõŽù_î½b:d«¡:=½¼<×!ãŒp*ñs ^눰#l°ƒE‚ià…¡霖˜H™\8—*Zi3v–À(Â;>-ÄqƒøÖ—ßöl›S>®Å:ŠÏ¤ú£öØÆ_ý„£®óÒzVqR¯‡Áû“e¾­Ÿ(G–y&HºÇ+?ÀÀØçoß®Â7=®}>ç""¬2ÖjÝ'ʾayÏÈjŠ'ýmv•Ф¤RÇÈ›Ã3ÛÌÚÀÛm…MÔyYµj©˜»øU#ž¢Í ’ é,È’;-¤V9y`øR=&A”ØŠ'›³z´Ï°«Å&œææèÕ?¤|ÿGß]n¼&8-å^ñÛþÿù/lþÊ¢a9Ðö'4Ïãç/ÿ±¦øµRøÛŸöœp5áZ{Bu;èa§yKÿ×$m«ŒVÖïʺäÎÿÓ\£Se´t{¨/ÛTU|›Ë,[\=¸há< $Ÿ­4D<ÛTRFúJ­Uè¶.ƒÖù)N3Ö8ÍÝÆÊ­Ö9³Q˜5ÑüÂR²]5kF1Ï×7æ $)¡`\ëæ2W¬³rRй©µ³i[J-\jæWYGG‹·s ô@L%×á‚P| Fw­ÓyYò¤™¿Âž—52)ÐÕÖ¼(ëÜ^3Rõ},ÙâÐR±§MíTsJ‡¹ÑfR»xe}Þ|ómuy/¡+t(‰Â“QJ.Åw¿üim`9Á]®{ÖPÂdhyÙzÙK1|t7leÑ…“®@ ¸²fÙ3F.:(WÜ8ëÅóèŸeZVwgÿºøÙ§Þ£)×u½Qñ«™BæøŒµ,z„Ô —’ˆÖ²ÆE›(J<“´‡£ø#}NåMÙëµ<}h¢PÎ÷¾ÿW\]{ì_kæÚΜR Oo“å=Ø#ÕzUÜž;…qfö-«RvÁ:.‰‹¾‡9.bzõÕ/-7^C6 )í¿ùÖÝå ȸ¢ÍÆ%D/ÃE$ ôf—·ñÖ ‘ö—|ßâ“·¸ zÌæò«àÈ¢>»jOÙî› g]uÊ'ŸÞÓIóùr%$¡NCrCF–ØŽm-Iùþs;׫\®ãÔëÎ@k?W)ÿ¢µD,GÏ ’‚äOZ?üÌɯ ù fo©ËØs]ü¥ôëeQ ’–†¶åú.Kà ¸$˜Ì½@öæ‹I C‰ðe¬mklCpnõh7°K±TdŠ€FH%è"øê§ ÖwxÁdÛ"­¨ª¹Òš¹ŒÁd¥0VÛš:ˆòH¹@´X¸º” ¢& zVê•¥Yû•»dY†ò*åkW¸óÇÚײÀÕÁM}–*ò•”µ:üØ^ºM1ѲÓíÀNhmidX¯¤±„è%!21ø©ÏÕuUâYž ï6ºL™…“âe%Gn¸¦óé6…0´†±²Àç½ð3±¢°bmYžÅ×2 Zk¸jœqŸ\ž0ïÇ{fí¾È¾Š!5ö|Õ“J>kÜn¨ÏY°í³@9HìàÉ”›‡ƒ%A.³¸{嫜ဇV-“ÌÙ »’=3¼LÝÒ<ýçÁxÖ ‹úFm‚®fp=?™‘ …Ÿì*|ÔéÊœåÚë¯ ñ¤KbHç~SLûç:;¥¯ô¼ݹ+YÍ?+nšp4ä”\†7W4y“ýòÛo-’?¶GFPòW¾öÖÔ›ì#Öß×@IDAT°<¹zòxÈ$ßá"“&™æ ~Z–Ì­ÁMáâ- þòík\›ã¥3Ä"Ä«;×4¡;SBÐê@f“ Ìuº$¹m›ÖÖ+a1@ÍR¸…N#8÷ׄìÉ=sH¤…ŠK½óÑGËOuâ<_¿¬]ŠsÈn¼L+&õÃ1Q™§F®f’›cêˆ=â¯Þ¥zœl žtyðÂ<óÌeØ)öÖf×N.Ý`[ijƒÊš¼$€r•*¤‚–¸+Þç2¿ ¬*çØ±à\iâiSÈ(~–{>~‚÷§á3¢¡÷VPakØ<ÛMOàv oíàÝZ‡únh#«‚3¦áO`Û\ZqTé×ǹ¹ÀÇ‘UÓ¼[Ë6mZ|¨¤€I¬°LCw­ÙoÍ i ƒ­RÙÓÆØ»4n™Õ"ukëÀ(—oÓîvLWÇbK,¥Ú˜Tð×^ÐC¸Ø÷s.<‹¥x›©§4•&ˆŸš0ëÊâÍ¢jöæ»dÎÅ×fC8Ì[+~S÷Š=nd%çÅÀ¡núözÌŸùA—#|½ñ­×]G 'o+K‰(Ä2c%ÅŒñ¤ïWŸ÷6!‡¢íÁád¼UyJnôŒn ò}BĈàÏE$.(ÈŠy· è£Ëø€‹ÙøÞdÍ©)7·Þn‚mëž“Á£%pË ®F¯gìæF$ "Ê>dv ê)!?%*à·Íˆ¹tiG[s%·—3qëóN\n¿—á’äBÀS^îáÅNb¼D}~r‹É: '¢_iù;­=þø!3ì‘n7–7_}uyôɇËW¨j’H:IÛâ¦0P«I tö]ç¾ä,™8ÄÔ>·øÐÕ«W¦‘ÛöîËj&l…qémû”ÒÀiûÄu”>´Ü³woëƒü0.BFXÐ5ÚoÓø-£OƒtB¸ÄnÒ®ì –ôÁ©³ô*n¾ùŠ";‚Nàô•×ÞDt¹›ê0î-Ï™«-,-cf-E¢koÑ‘Hm÷h³sÂ=X–ñÌU# ¹YY J àLÐ&æýH½Ç£G¦ íýKç+¶P—Ìê6%QÁâ6Í<ØÃä¹”ã50qWÙ"%0…¯b~/Ž1çZÌl¦pŽ•¦'–×S”é;Ó†L_§0RZ¹ñ\§•‰Ïs VnÃE–CD<Ö A›?õã6GnV[e<ÆOÖ[ôLº7²ð÷óywIL×r‘…9¸Mn¦mÑh1ÓܱöÝéˆâû˜™²ÿ}±žÝZ;ßàºy?q8B‰á ¬Wp5U‚Þ¼xGí­7œU¥ÿR{DO¥¹-ßO½-F, VZ1©Ö#*i<…™ EI®³¨s§bÎŽo÷ÿ‘;öù%1ã£é,_…"?3ëœ×­¾5'¥ ©Ìú»ÈÚÀ-¸ÎþLä&')‚m¼2Ywï‘=ˆ­\°L`%g3¯/‘5UÓæØɬÖʨcãŸ<¶X›Õ©H Üe‘®º d°x–û:dtŠjÍaöN&”bs ¶ÄO/³À„kÔvµß¯ù<ßAïyf­öäâHº¬ø\þq ý2U‚“!#à·RâœÎÍ Ú.”’"@¬i#-®óò5õkVp¾#NG@½Ð ?جØÉ´M ¬ÖªÍL´aþÒÌ)×nuÙÂDôß:×—ó]½þLvΟœ|JÀ ’;_±Âßssi¦"®²?; ötߨ÷‘L>2±ˆ€í»Ö ¿Á¼¹–Ù‹>õ2 Ò{ÌÕ ,/²Ôù_á¿J?Å8 _+<5Ÿ®žŒi¸‰FÌ#šÄ½àŒFe„Ï”œÄ»k”³`…¹Š%ÄÐ¥c¹%øÍ! }²úø9#c5§Ø^ìÈ= ®Jƒ¢]œæþb ŒãŸ]º æ;Ë?ýÇ—½¯~uù?ý?ÿÃå·ÿµß\v^¹å8®õåÏo»¶~s¹y™0­©¸¢»sÙ§5åñ¥¿Ó\U°·•äbí¹úñ«'PüÔܬí4ÓÒ³±W¸guèþ5™È'ª‡ÍíPÄbD·•NÜ{ð²ô¥rôx[ ^˜ íY,H„Égû,©â0 –Ë—íÍ‚üÒyÅŒvm-ùèþ}±%»×Áá(îce›O%>¨¸4ÛFFY´ˆ*ýßg‘sÄ3ÖOøòÛû œ»uFèTRQbÀ­ž×ý¾‚ßž1"Öb`ãj£²••ä)ž?ÖX×#Ô/\„ø§.©YÓÉBf¬r”²œ=·ƒf–ùuêÉìBO€¸oú™íNaÙ;ænî¹ÃM6KôE±H“ÂÁS{}d¬TóÁšC5(‰\›gjt6¹\¬©»Ž‚¿aS“uî šo±°ëøäYø°5‹K™–‹Þ²;÷ïPÓ¸¬€²¬)â²±í#­³ž]Ÿ÷âšP9_0[ŽÎ‘V,0Bú¹îY —Œ?'Õ㱪ÍÓDÉäX¢õÆa žÐ1î,\Ð üà ؀Óà;aàºâÁÙ›é¦iN±åe)Õúz•(kœUy ü&\ ˆx|®$T^œë@ÙÔ`áùá#0ܱ¡þ Âg±Óx2^_‡W]9ª0ŒgÇØÀ±ur1èýØÀØY~պ庤Ä|-·wW%{n-ïÝÛ[þÁô÷—¿÷¿ù×—_ûö—|§¿¸yÔ eíBñ²¥µyÁ-š‚*n1븰‰ qrÚ. ŠH Æ>sØäœ=Ç­Ë”œÚjA®yis4½Ž3šzSqÚªFžÙ?µDæ4m9ÒZ1mXÚÿ!†½ZòVo‘ ÛwÏ U»û¤YÁö{ýÜhLÝ,çDÁÏúøûè$Ú¾>¥ÛïôLìêÈqãdý0ÆS»Ë³&p3³´'ƒýŠŠÙM=„Â2;O¨ù¹ÌŠzŒè­ˆkÇ…õ*¥Õý¹55¤«½o̾—…ÇryHÀUí\õí5Œ“À<²Ëÿ!¶Õ'xcòÜ£ÒçÝ[[TT@àóªj{Y Jq€à¡åJäÛ§Jƒúx¤~NQ+Z “ÆÃé^ñ7*ÁìY#˜ºÊgY<ÅÔ\8 ¨N¤{8w;cÔE ÌØ©ñO൴þ¡Ø£‰q]ÐLÏÔ€C$@cJDK ö_?í‰"öŒ„^ êf×>TU}©xÝ) äŽ\½Éý*ù€xï8hàòå˃Ÿ/?ûî»Ë§7ï/_zëβù𳺜ï×΄{‡6AKK×}[滉¢“ДwÁå½ëÂÏô0OHo‚ì²@î!F^ßns1zT[·/èþ–ýž¹pï}ô¡{ÀNÝÝþÆÍ9c:Áàg6XCbôU“Ç•’G°(³³“ì)¹QV #:Â)±Õ˜+¡‚+Ú…µ¡ÁUÃ3Ý—ågöxqÿ7®CQ2Vµê9[ë`b‹)åuñÕŽ‹J™ÅÅëfCºgwYôl£m`Á2e;ø‹>åê£Îqãò€Ú]P8ãlä/¸w5‘üOþ“¿¿ü;ïo/oÜÄIh½®º¾Ö}–\L€'¡ÇýA4éâ™u“0IwÌÄÄg1Œ‰ö %HjjžÛ—yÿÙû.×î:`GºÑÞõ"ltÄ΢Ö&°2àÇ\1LL¦šX×D”¶I¸£Ù\WKŠm°Ts#z¯ß~ey£¶¶\–jpBì±bÅcÇ3u|R§Ÿ¦e{èúºdj4Õí哚g{Á^u–^÷Ÿ?EǶ2XÛÓ³O1Â1§-ZYô|9%Ä6m½ÂBz¢—Ða5$Ɔ!ÚI¯uÜð]ÖX–Õ Áüšií;.Šá9‘Y_Eí0-b©P-T°u\mc®2$e;ÀÚ:Š'ÔC¨, l³84Ù³–K¬ö¹$eãbUÐ78ZWÚßèeZÒhÅ{&Ö—YÈþ¬°ƒ×Ç šúÝPòAšLÑÜ¥\VŒÚæÔôM]:—5S,17Ëæë Ö-ž3˜þC&9%”*Ɯ̑Ϸ̭#œÊlÈmÖÇY?®Í-0o˜F|Èß\º={ØÞüÊ×–_ýú¯ Œ_gé>YþäÿÛå'ÿô\Žï¶'ŽGñëžSÑêjY¨Å%Ï)Žß1ͼ„G?ùéÐõ¶w‡pta.)ÃCEÁÛ˜ë¥Û/Í&ö së6±±vÙÉ"·—¯¿õ5“2¾­0‚ð죖ûYM¬‰Mt²®® ŽÁ«ÆÄ„T€‰y'Öd}Yž•4LSGßÕ#a==ü ¥­qÈß—S¶¦`äºgªÔ T÷º¶.YJ«N£®êÁ0þJТíΨËlΎן.@ýÓZ¤¸ÃgåO1,ü?û¹Ó_’œ²¡¿®´OÇpõuª=>7ÎgŸ/ï.?ƒÁµåí·^±¶ULì&Þ¸q®åY½óÏ/ÿÁü¿Zþýð·—ë{p!ÄQYQÖñ†8tBw‹,ÚÁµÖh?N̘{€(.”à@ÖC´}W½Äkc…ë‰K×µ…dK=Ñ™ ò'}†9.9©â¶ J€cÊÍ4¥@¥/†è"μ\º9*‰<'Uà΀ßó3ýæðCZ-ÂßF•þR¢¾Ô‘.¤*Ÿ`ú{ÎÏÛD²Z½Ïœ½æú„QÎVL„iraª¥X÷¬®ŒÍ…×µq¨nåŒ9¿bß2nâ^*¥k›[“¥A"(½¿œë~x‰0|Áêéèô9ZP“Èj,ÉË„ÝuuKû‡-Glßx0¸~½ƒ¸wõ‚ÃAÿ„q±¨ÍLtDZ|ŸkÌ"³&s·§sÚÒ#àЮöéE…‘Ö¨-ý°j€‡}^káÕzÇú4Þacä’Kšåž_$´ÃuO%å5x Ïœ¯ÖiǤêaĦxŨuR¬0rgSçÑ‹„»L¥ŒL1£•îÏ ~6j¼A4ZWnJñDŽ6¡œ‹K³ãØìÑJ$ŠÍ=ãîÉ,¥$ÝÓ Ë(7×kÖù©µm«™¹tÿÉò‘DÂs»¾ú¥o,ÿÊ_ûµåµ»ÿÛå^Þ\~ðϾ»l>€lÄØ&òmëê¿SAÙ¶ mïÜQ¼yÕ³[=kc·ÿ®žN›6 O j0ÉÚÎÂÇrÓxîøØäb)Y¯Üp:p1Iœýå»7–_|ðþrà(©â£ l«©9¡´ LÍ>áM<ŽÏR£(¬/Ä÷S\# •àÉÒ¬ tú™¡ã˜_\r_¸¢.± —Ò[·:¶³úÏþìÏвu³¸¢Ñ±º(²µ­ºz|¸Ü}õ†L5ycž ¢IXà®hÅ|’h&ÐÌt¾ð|N“-ð@³†qÑ\W†&‹¢ â]½ÎÏ~ñ‹åá±É¥:˜ÛŠ©.ï\%•uĬ¹dz™µ4dH¶ùWê{·ñ[¬ÿ’;u¡m!ÐI ç<+ŒµÅ¹ºßÉ+[ú>ýÕòÏ~òC©psã•.ëdcV@¡ ̲öÔkÌSæ‡X…^t²z;¯Á\,k†”~&‡ÚÚ´Œ¡ìЭ^eƒnh¹ñŒõ¸Qc}ñù«‚¦ì x¯?úM;Ñ_(íàÀZLL«X¥‚à D‚yçùt-^\2¦L8ÇžˆÄà)„Òô5Ó?¦ÚÚQÊúÖ+¯ÎzÒŒÏh{ÌÒ¢Óm!¢+^Âr™Ö¨ˆ²í(ýTOUaDZŒ'Ëê\LàBtU ÞðYyALÓQïëõ°jv)'c·ec‡0îá—U}líÛð²¦ne§Xâz¢õq^<¾7µ,1Cfe-F7€nÍY[­ßb1„9ƒauU1Ðcî ø%4ú502MHi#îó”›ýoüöò%ÛŠUþO¿ÿÿ[þ|ó-ïüÆï,¿õ[¿µ|ùëßò¼åg?þ fÕRwW_¦â? †Þ³PŽ1c‡N멾M7¶n°.]>ŧ ‚ƒ½e]ÂcS\õâœÖöµñy¦Õ¦{¹4Û²Qç/žª…ZC9á²ÎÝ×a;e¬ðB‚8ÅP2 øWx:‚ÃAjbî«Ëº"d1{7=9…½Ç%­¾{ äÆ¿¹}Á®µÂAGL€Yf^Ά±R 1q®ZV[$aóããAöy=Œáå°ÿâãn€"+›Dw¢a>Øõ·‚œO>zÊeû?/ÿÝïþÞr÷«ZjǾˆä\²©,`?›¶ ] ­Kçªàã÷$É÷$ŽnKèä"A7âI"fòõ3)a3†Q#Ö${¦>E¸‡Pê]³mûJù}ö놀Ono_Ñå’9-g(€ÖÍ1)‰ ®#í#ÔÊß¿H)»óà\ž€]Ew-7rÍ®ßyC¿žësضŽ{_úÎohù›VÀ¤˜ïÈ1Ñëj(ÂÅ9+¥¾=c“ðÕSåVvÍj§;«ÃÎè\‹Ùçõ‹Àêp@”Ž‹Ù9rúIÐJ ¤˜êóëT&îØ3v0õ µ-{®»Â¨ån®Ûs[Rž*=Àk´gLúD!é!as¬H/­2tls%dŒ[gÇÌêç9‹‰ˆt¸ƒ¶Á¬±ˆ©,ß–×cšëgÿ…ù$¨rë\P!e„ó9Ý¥‰SBÁø>rùŠå›‹Ò&cRÅŠb \Ìù}Þž]Š^Tz’ Úô¬Š/m][®;‘9Ú?¼5ɇGÚlHÑwxÁ¸¨ÉøŠ ¸Pœ'3zY;w/÷2EµžeZË~–ˆé`ÇbG[—o/;·^Z¾ñí¿¾|éå——Ÿþè/—ŸþðÇË_~ï/—Oоýå·—·¿òvÒ…4xàÈ:+®RvÏë:qKZ{‹B­õM-AêèÚ‰ R·¶î@1š4ýã‡4wÕÆõ“g/ïþÅ‘[Å2~¤ÁµçÞlsç‰# ©zBs ®Öµ‘µe¬Uö̽È~‹%ZÆ®™,ÕŽê…Rõ±r  kLÅy–RÎu«=…¹ÄÑpðÅO&ÏÕñ<ÛÐý2”pž ßÇ×ÿWpÚ¦ýºTv^âÖ='Ñ€ÔÇP8Áó•Ôv»s6ì »Á}~"™ð‘=±ë·6ì Õ%t;Ñ}Þ‹Þ,Ž?›ºÃÛˆt½Ùø-%špŠn)K)`š5# oü†ã$¸ ®3ÌK#¶×iê$"f¿Åœ>þø3eÚ:ƒêC§ý>ÑxkûîkËSÀ¬Z÷%ÖÔ ýœ/¤Ë·˜ [÷"ºiõÊ K`ù%ºfñ;WGŠ]`øC@ýˆ<‰àoÞq æ]ßoh:÷“åoýÆ·–ßþ•·¹Ž¹i‚Í㯞ãqßYGW!èrÕÎx(ë€0þd3Õš),S¬ 8D‡A˜¦ZíGBœ`tB |øñ§ËÞ}oyïÃi "PM!Ú°[Ö=MùŸ°|."°-cxÄ´nkJ[+"ˆÌëÜ©±á"Óùij<Ž=¿`í5YÃ*ÏŸªžÍ½ÿø‘vÝ 4ù7ÎæÍ»\õF‡;=¿AûLËˬ¼¬êŽÂknL0ˆp+)+•p.>!ÕBiø _Ö–(ñàòh,Š٠¾V%iúvý¯›ë¶®;Ç'ômïªîßhƒ§8 A[àïkð‚ ó!eL$ãè,üqÇ›g–Lu]'Tòe’;ÙåÚœ¨Ýyé7–ËÔöå¯|}¹sýîòÃÿlùøžŒÛæÇáb¹&pþBLéapœËNí|ßm-YRè/ vÇž¸“{%îßhÜ 4OiB}ü),íÅ£¶Y.§æQÖïùý–Ÿ|ðÞòÒ­—Y×o9@ó:… F7rÑÑwoësI|”„ ¡í` ߊȫ{‹¦ã:bä‚ÒI+ïÌýnV‹;î;ãóØÄ […´CoKЧXüƒ“'ËSÁÖËo¼½\¶Áx#o0ç7ÿbyûö__Þ$½pk¡Ü°é¸òƒº®¯sI˜œ°aÆ3M´N|Nê—½Xƒì‹*¿!ñ9†ÏeªùtGD0KûíÊR¶Iµ€8y³)½&®qkG•›òá{ËU‡ìê9áÕâK·×}0Ÿk!rßV”Ç‚›?ý‹?_nüÛw¹­&éáw~¡wO®ÎýËɃO–Ÿüóï.ÏþópáŸÿ‚€š~ìÏsm?7¨äè@ì‹Ê.«—k0™ÇÖ¹èÜIèl^VÛtFÓÓF—ìñy!h½Åª3lÐ’xÄ“ÄZg€n!ôZÃÔ*Sºt­7!ë˜}$0}h}¬yÖ]‚¦Le%…æ’ õ~tB.²nÈELËR(^`íO”f|ö€µ$k´KX]„5åñܱ¼Ë,Ë\ï!Èpí™)’‚ÎmÙWÿ“`Êb™MÖ¾Ëji>Fëû Ñ„®íbM¥Í+ú¬f'§0×¢¶(/òµ¸`°-þ²¶u]«X“ •% †‚u×®¿¶Ü¼õ¦ø“âY®Ò6¡Z§Ð} l6ëÄŒUÞUËŸKaŸ5Ñ¿,Žr§5(+³ö" '÷äŽðúµ_ýÕå˯ æg,™zÀ3––—_{‹‹ùÊ”²Xr:Œ%∲ýýUÜmÝ–ÁÜb•eÑŸPeˆwe(˘U>R0'yb¶jáÚvÕ„g6¼k¶J¿sm·Xq·ÕYÕ&f‡´¿Äb->3ÙitW NB+wªŸèEPVY®fI±åÚm; Õ­—èa –±°*q c jB®sÉ¿øIÀ„û~zÝO¿xÝw_üΫ÷s‹k x¹í R2¶÷®Éøèþ<+˶¯5þ'dÀ Å ½äŠ:Ðmù[ëíåµÿl{ù‡ÿåïéhۉȖ#á”2“Y^=ü)xUv°kÓš½Aç*fì *£sëüaÉ̤çÇúˆp2£n UCj–X#¢ÄWÃûÞä&ÚoJíOª‡RAÕ¤r5çáëþÙ½ûâ.-¿ñk_\­–Å"E©Oîƒ+Æ`jwJjm;Ÿãȳ­——´ú=½vkù·þ¯ÿµ*__þ‡ô‡Ëÿì/–‹[zF+®|þá‡Ë‰”ÿ=Ìú‚¬á¼ÓáήC¨4Éê´YR…Ô^6R sÖ Ì!¿º‘²˜kï*Jʬoܰ¦°·w2‘ËÂ!d±£Ä÷Zin$÷'fEMžU?òÃå  ›Õi=æÆÎž´,pëúâ΃çýdÆ q’öðß=¯M˜SËd®Íá³OðåmÛ!^¹ûšSa¸)(¦ÂÍ*{?üT[Be—’ÈEŸ*|øh)m§ ?Å:d³xʪ{£¹‚ß1f™·N dŒŽE¿†±Š'tfÌ1Á|Y‡6ì–¥ÊÎmè ÏZàDZ¢dÜÌe "Äu/½öê²5M&Í1ßÈÎR/Y¹Ê¸”Ÿû= R¨µ5]ãjI%0ZámB±ZÍñß|c¹«ö‘¬ØgÏì ¹êktĸ~{ùïüå­7ø½;4þ™8G›vÛnÔö•æPÙE}´ê°Ð<Š»¶ýåÊ~Öœu`ü\úâ7­iV±ß¹Šíž?Ñ¿lbÚbYíŠYnÚÙ¿çùWÐn %—®Ã0Æà½Oc´.ŸŒ²ªÐq*Ñá)&Û&(vέ.ÍÀpC—ø0 «7Ö6X#à¦ôg.ô}¼Ù=àݲÚV?¾ëöÏ?Ÿ!¼ŸŸþº,¸Çï%O&>Lq¼žL±¥\Ñid£ç6ƒN‰©@·«n¾|{ùkß~sù?þß¾·üÝ—òÓQÃ=)¿6Nay`ÿ¨*ŒåæutîYOV0<8Ëĺ†ˆôŽûXEòac‚ºÔêâ5€òà|ÖˆKkV0è·ú ö„í¹UbLJÎ|ï=þlêŠ6ó›¿ú+Ë·ç·–{Ü_¾'PøHæu±£ýÍãå1ðú¯²·—OíYûÃ?øÿ.¯þÍwùÿwÿ‡ ¼µ<±±øÇßûþòTFæ"ïáÇLK™% Í×̧úU4«Ôë®,Y\9‰Ôûg=ÉSñ\½•²Wa¡…ú™Ø  B8T˜X5t¥ õ•j«Â‹¤S“³tê3Toë¬ÈÚêRùùφ`q5¦ˆ›9µ üŒ»RÀ¹4m1½À:I¯¡{$f9¡¥NŸá2"ÜKYï›ÿ$¾u‡gŒ÷ßûÔþC§ÕÀCB$Fô@EªRÄÆ;1§âbäâÇz¬«`a5½Ê: œ§Í¯¸F²Ó{s)yñ¹u“[´]¿²(®`Ôb>Un—DØ ”ˆ\òŠ vTœäθ$Ûö*n®½kƒó}® %Ãê®è¯XGîZéîÙÂdNÅÎ.0vt×™iË>çýuøê†„Èž³ Ÿ¡—º¬èõHpõ·_[~ý7þæró¥7 ¯æq¬> ±­œã¸¾Øp·vÀS×CLaëcõ›²KxRôŽÈ¶{‡ º,VÕZëriZé•Ùt}ÕæÞûçU S®ÊR¼zSç åN©Z¾˜ÐjÁ$"(j8ñ:L™°ÚŒƒ}W¶UVÕÜ<9K:¶Žú‰É›OXèïd/»õsËn&Ùû®Oþò§ûûE¡ÇKî‘þ&Vf´CZ`õœ®Om~.#,~eÇù¸Ÿd¶ù”áŸÆõSÓÄeù‘¯eæB™XysÃI>÷UíÜÉ=¹¾W”Lû ÏëŸ8’€RžsUÑ~É/ÏÕæ áà¶£ÍpS6vôzÒ”ð„ªb@ÍMÜÌ¡Ö)á&V« 8ëRLŸå€æà£ë'ùÄ…/ýßâÀÄSïVŸ…³.H€·~æõç×Ì¿üçsÜÍûšŸ!…ÕçÀh,¯3<¼Œkú N«W«ñ“A3yçšnñQ4´œ<¦gÝûµ›öÓ>É„Òì,±ŽŽ{¿ñÊ¥åô ×®3NDÒFÉ Û€ ×d/Þä!¾hàdt„WQælàôw¶¯ ÒÕÂôD¨Â¸O‘ ï¤Z׿V<ïtÔ#]4†{÷‡ß]~t÷µå«wß\þοù· “åÖK É\å·þM‡|sy²Ë’ºþæò¿þößZ®!š³O?Yžüè{ËOÿòÏ–~ôýeoCzÑ?~öé˜é!«¾×ø7Õ¥˜17-Ëf¥•@ŸÆîVÖfÄ6ŒÖH¿øYÒyµ}'†±Œg™@˜ä'ÁÁ¹ÇI³'…Ý—y1fl$cÑY!W‹õ ºÐLÓ/`Ü¡¥I(ü&Õ&ÅK*ØÐÇú^©mMÖšcVUx ³çpÍõ†4›yæ±'înÂYûÃÆgÀˆ¥‘'Ëm°¬7óh°$Ÿ–~¡(d1á…4övaãØ(¾êêTeV‰‰T“¶e³²¤6cÛŽÿÜð„S­\ë3^ås-˜ÏÆÏòý´ÙH°™ÇUmœÏ¸=ÇêÖl[Øoºr}_‡ –à}óõÝ&¥“u!ÍÔá*úËRj%Œk$<ñîr…2H‘—Ê},“]<.ØåÊmj•|³-%EAIf9Õ^Å sCû”sLwÌŠ½XXâþ+ ’ÄmC÷‰¹£ eú’¸I]$ÖsqÌomܱó‚к÷¾ ¬^ïß¾³œ4?0+ögɂ欽¨‹pJø%„†_À´gW؈È\Í¥DáÅZ‡ó·5ǵf÷“Û nŸÿŒµƒŸ=þ‹O¾xáo¢dõ³zõù{›™§õûùUè&k¶ŸÖò…œæW7~¾¶ù ÷dÝ&)~.•â0$&°Ÿ§b•bm'ßýÌ JO–ã¿vÇšÑz®8{Êæ‡p”¡†&híþÉ‚H ž!î™zŒ¾"œ€Tà5â®QÚ=¡Ï”ò_…Ìm–Ĺ˜Oí= »X.K»ÞûèãåOþè1À­å7ã;b<û ì¤Ë ¯¯}óvy¿Á¸Æ<>Zž¨:=à~òóï/ÿôOþÑòÃòǺe*™öâ>›™æ¤;Nf)ž2‚Ôœgƒ&¬¯ªm!x¬¿bamë0çÖå&Ž]«1r4nˆó²×€ð«ûŠ9Lõšîþ‚—]8ÏEð{!¨ÖŽ"K®žMçÊ$mº]sòÌ¢L»_Ñ+|M`pSTñÉ‹çÝd(p¥J3ïç—« OÐLÕtŒˆñKÃOõ>B?l¹çÔ+ˆ£™Ü‘Ê_]gÈ Ò<Âñ×ÄŠŽÛïf܈- w€ÃTÖÇnºê}ÓÖœeZ[’N1ÞeMkØö7zÐl¯Iðå>é‹g1 n%˜,!P“’Òëâ:ŠX¨ÞRM| '|Ö¼m*·oÜÕ²UÉ+ûMtêG{êJl ³kJÖT¯­K ªiÝÃDmíBê:ÙFä²Ä>ýÅòò15§ôâ2Z½?r;O€IÜÎùZ7û³ÔV—‚A\òRߧܲcVk%”0:gY­©(¯mò¬^æÍ™‚ŠŒYÂõ"¾G¹gÜ@3…V cP=|6 ß|ë0𣴉W6P)64‘µºªÊ÷ ã`  ¿”xêТøÛ×Ñ̼ôO7üË?Ÿûø—ßZoŠ~x`õjõoc[ÜIJ´…vYCÎwݲ¢¥Ùõ9_tA;+¨4œeº ]€<ÊŒàª“í§ ‰¯Ú¾!‘ÚºJÂõðX5ÌJÞ¥© "jÔÞ@½ï²&ÓŽì6¬Ãô±"îËÚ~ìr[î)'¸ÊÔÝöàƒê‚S¾lA’oÊô×—ÿð™¦ÿŠ °¯?’úýŽ^<ÛÞ¼*о%Ö˜¦@ú_ýó¼üÉïÿîòø³´=UÕ+ƒSŒfCðñŠRƒ£ÓNj1K„»jî ö쬀>§À°–9®­XM-‚'å`#òK¬¦µþ³æÑ´ÞâXIû®ƒ*«9AÇ„¸¬ŠïŒ— qNKd9¶·0A–Ö(¸¹Cx]Q“sÓFã}L™5´#xÿÔ:=âgC^ ÞIÂÑþiÏ,“‚¦5¶‹«8O!¶¬* ¨RYÍ Aµfó©Oi)L‡`ÂkµBùðÅÞÎ1rû—jô—E²§‘±«,¤Ýê&u¿m­¥ÔÛömˆxOï=Øe55¿X?«¨,ßuëêäèâR´Û\½ÚÓ•e™ž¯Ó%ÁÇZlF›Ì¬óó«ŒC[‘6¯kT(nD_Öú¸„Á3XtÆ\®ú¶“K 9$X³ŽÚ3ErAHË^^æThk‘*¶Y9häÚ5ãz}â/.Û$"å 4¶aøÐáµx)‹«ÞX·xÙ¹´s®Ž¨’‹:odqeeµ_1Ë©ú½,öcð¾uÓ1bZë .”flnv0ºE˜måÛ›sîZVxsƒÀTrw/0çY‚²ûÅ"§ ­ÉÁ)Ü¢±¡Mÿ®~¢U?!|þéE¿«ëV _½ý—~RH#LúÌ忼ÃuÉDÔêgõ÷‹wså|¿ºoxÄü>— þ®^­xhõÐxfY$«ÎßôÛº+;aU[¤ûçxùèƒ_PÞß¡ÐáÝçxûRýßiPo X±­5[¥3Q”6´4b–6‰{¬žHñâ©ö¸lcDsòkzÞ›ÏüFpàj eþª@¯s0ÙŠ‹1Ç!º]äIçâ‡Ü‘Séñ~¶XŸ1ùž•1á„à=-½§.§¹NÜ…eãÓŠÏ1}çÆ¹ÒÚݫĠ· ˜cÜš²‘+ P.*†°ZÃl«ðŒà½­]k^13Ì}ê²àoïRýŽ^aüd¹.7•FÔþÙó:8Ø( ýH¥qB𠺞ä,ÙÂZÜöB:¹]b†Ehw57Ðv¢û÷–lyé.·‚ }¦6*+¿sŸ‹i³ ¦º¼ú6{× ¸jÛŠŸçžðM±ÀM‰†i¯‹8êÄ1ÞÆ,Õ_ùÉ[—¾ùæ×–/õ+Îisb¼vì8À%–’W§z=¿ÝŒ~#\ý2[çMnçêA«kúw¬ÐùëÚ†ð³úÓõñÿúÀ­y s¿?VÞ¥}蟞çå|´ºçóAVß[wï‹ûö ù7e o^UˆúBïíåúòÿàŸ,÷ïþËWÕ„f@ýóüχ®Î 1Ó:c%Ô¢ ˜ÿŸ¹œ?p&N"­Új4û¤aæ7QíÑ«2»‰´a0+ 7‡h°{Á[ц¶šäÿðùCrPAÌû·¾´¼õõWõ義ûÝ?çÒ}´z÷ýå蛿&}ÎT{wAðí*Š­uL6o´Ä.‚‹à,W)å–1"<t«§ù4iƒ×¶“UùQcª6«u®Ggó¢×G'´¼ìßèÈýÿòOßEø#È+Z·ábn™Ïz9#ú×CVÎ0 ÒØiõ¦ç4 —Ì5=Õ'ÑK¼è'xvÕ¡2Ÿ$m´/(‰dËŸã/–¿úÓŸ.ÿì{?X^ûád…TàŒSФѹIí‚â¹:&ì·AcÖf—ÚD*7 Áfݳ챌hp€¬f¤XS1”7‚-óøzŒˆ=„ÛÈÏí¿yf¢?àÞW=üïýö¿µ|ý+_]^U¯²'%üßþþï-G÷~"X~}©ºm £¾üÒ«ˆ×Q§÷GËÂì2‰JÄÓ¼›ñ 5 lrÛBÄçÚdZ dø³RkbÄh JàE,‘Ag†UTh=ÛëR݆x$L0*µ¡ïŠx¸u(¼¾:¹˜[ܯàP ºß#B^'3UÎO³ìfÂ×~X&­6'sk¦i¼‡4ŸÂÓ,lÖæµØU¿&Á.mp`îÆ¬úì “ ¬6÷nNN±¦=·s9HZlîdItàôHá¦z?µ=]ƒ™§“òÉÍ)‘°'à~¹ \ßbß"”^þê×ÌE&óá’ÂbQ^(DÍX$®+&ðÖ#{Ö.ʲm¨Z'ì³BJœÔÎ5âÝáò³àXfò>áýèñe'Šo•T{ÆÙ¼¹ÊòT¯‘Xé{"äN–‡÷?1—GÞÛ"%6ÌoÜ´VƒT÷†mº#¨.¬kÊ;ÿµ )n˜ ®5uVsu{me¢uá4áÏðùsñÑûï/{ެ¿|*™àûKâ¦Á¸pÂÄ=ñÀ.a8Ê3: 7Í ðaq×áÝ÷ß³³Ãm­3ø‚wcö#—PйW_úw?ýe¸ÅffïKJ‹ó,Y¡‘Ö:cFo^C¢¹ Xôl ô¤î±×Ä]ª{YG@â5k/Ó¾›®ß¸áÇ?_®º¦]<'ùøæVJý‚’—õ*]?›m ðœ‚sx€µTÕ|bìæP4$–ö/cWg„¬’LìpÑ~ºðP¥ñøã>KÛ?¾÷ˇS´@< &Æ‚c9¼ˆ81`*¬+2˧Þõî$àVD*u¾.îÑž¢ç\KSšùxŠg`.›$§ùXq(Èy,ÖRm’–愌Y²D »XŒ­S]Z_ûš.0BãsoÖ q¥Ît› ªÜ®bWn°:Ï÷=!ôhò„ŸõVñ=–æ –ã:Âs„T½Í¸i³ªfñë—//¯Ý‚7®Ý© ð–½!µuݬòÛëtäýyG°jNÄ1 }P*mÉê阰û³Ú´Š3mÙ‡‰ŸÚÜÎI¿æú²^B_~ûŠ*ÙÐûÑòðÑ}VëŠU¶C!TktæY1+©Æsòý¦Ší)ÿ2vÁ‡ÌYöì'Ýs¢ôw *e‚ÚXûø#÷­’ ÏUZ£ÍÛ¶ñ‚Õ¶AÛ®Û’‚¼X$4µçײb (NvÆê’ÙZ°‰yŠâlØêP¿¤+21Y'u¾,€z‰ËYlb5 ªÃ¢«Ï‘V±Ö™;ôœ°Ý…„Ü ûÏX¬®Ë²B½'UGøä–î±Lj•ûÜZ²Ø£V0¤Q{埶yTÉoŠ)Øûª4 Å®ê¼VfúšŒ#ä;¸ÌqOÆü… ø æ˜WïÓ^dj¼Ü—å–Hãn±t‚Ó¾lÞ5qœ=k,%£¡æR+=¯§k ‡\ø:KtUqú_&¨³F«¶ÏuŽ+Bnt;n“5ÓÊ%®Ø¶ªñb€@=¼ØæçöYFÿF]W¯²FÃîMé>" tØø=3G3K,%é&ëO¡1¸¯eN^P¢dŠºy~3*Ö¦ e½Û)œPZzÁzL^«èì8þ4Ÿw~ü#´TGÓÖ¡S)ŒÐžŸ/×w$„(W0Þ+Fë9 ØÄ™9 t$â zHó^i:¯¼ßyÌ‹ÕDý;ׄ€Y˜…7h;¦³ŽŠSí ÀǪ¦›tusʫǶð°eŸV¾rVÒ÷?ýxùÅÏŒñ †NÔð Oª´½XGVOý¸Ëdlb„R¶7h𜸈e„ ^U‰PY>™’³Éh®ü|­8JçÕš5Æ‹™Úz1=—X.^ÐðˆÄ<^ ¶3ý¦+u8~êÌÃC=‘þÿt½wœØgyàùLïUS4£2êŶl¹J.Xn` HØ@‚Ã-!›p[>—ìÞÝ' —Ïfïnï.’ØB ÕØcl\pï¶Ü$Y–­ÞfT¦÷>÷ý>?9ÿÝÈãi¿ò¾Ïûôêýøäpàã8ŠÉ1ÚnY“{/M1ЄQ2“n€¢³Ã©½–B0¢~ž$U``;£vIèÂ]æQ5ÃpêÑÀèhËtÂtô™–c‚; ªÍ…e°~‹|¹Oíµ®#.µ3=0c•§8Sçξrk1’j{{EÏÌsÓ×ejG¶òáL…¯‡ëV°Ÿ9êg~æù,Þã|7\==ž,ë!0“UÌh–ê‹Ô`½›)Uô9pÔiÅ‹:DÁ ­ Æâ²%{²ÍâSc«<£°t®Ëdx8°$£»bá=i0eá®ç"“å®~|h—D˜ä§Ní¡lm Ǻ-@¿ $` W¢Õä,­3g‡1ÕÇ©¤ )üAšðCò"qñ‹ ùñÇ‚+§[¹X ÄÉæ ðÉY¹`Á+aF0êâë9`.Áƒsh@y¨³H'¥ ²&Sííë²Kà¼"š“õ<gNžÀ¡&Ñ@8¶ÕJïT:9ª‘g¬Z»’ÞÔ Àäìo­âW£^Úèu¤+8uÖq4FÇ”õ¨÷¯‡ŸÎZˆ?&ÓÔ¼Õä«ä>[¬XŒœõNÀÇÉš:vF”ó›X9mGJ ƒ§è×óâ oıã§aÄ:3ªÊ¼¥„żÂ[ ãá[og¢%ààÚìͼ”át´ ¡HlEã`&îÁ­pœËöTåE*`Ï»=hc¡¦4%Ti1R§+sLVõ¤Zˆoû™¢%" ÀBjW)¹Œö¨CI*AòýÉìÔ.Aæz8úûBò.òâyκ“ȶ!¦+,Í#¡“¡ifñT·œO¥4¢[ÒÌ…èr7¬ÙÂ^ÇÌOàG:uô‚DfSA(*)Ѐj8·šZº]BÔæ• eK0ÁLÆ”XMAÑ š'‡F¡°£°ð[æv²ÈØ™­¤Ü¦­× qMØŽÆ¿I  oõ}I¢šÕΜc<[-­`ù<; 8 ÕçÒ¼%5ô½6·QZƒöšƒÀ€È½D:«‡­éC¯M¦UÍ=j#ešÆœ“0—yÛ@ä˜ÜEò+Û»ØãIšôÀŸ%pÕ˜¸³2—ˆ3r¤“g/ód—'hY|æÌkÕi§¦\´çA(ð.»uèJy?oP¦ /L&5|mÇ<…óÞnö§š¤ÊaŒŽ#)ÄÀÏ~ô3¿8Á¹OĆ‹:è±F{Z7§ë„5‰³%2üº/,mQ_RËKÁ¼å7ê‡|ËH¤:—j= ó°¸–rØp<®r|¶%ˆù¸ð’LÿRæù ™$ÇDäÎi¬P¦DŸôK™ÿ‚,$kDÒoï±þs䌘·‚ò~H#Cæj3æ¿ 3DÁìo›Î!aÏ~g*¾/µ³Ôf@Èôˆ1øÚ¦áú8× N’øP%Ì„–Iä̩⩖ÀÀPyahH5—*Z·ÚªÅ<¢*ž/°Õ˜xkbö‘Ùð§Xðªã]ŸŸæRfî*ZøT£4÷J ]Æ”š@Î÷s½TFÏØWJMUzV„bPh8ÀÎÂk{îÔ›îÒ›}Êð BMĬã{™e<ϼ fÆbb#GKcö•¦;f°®¦v©¤%èmTBÚ@úS¸K Ǭk| !öÌ{ƒÌhL Ô]éG3 ^_!+‡i/$—±N–åstœ‡mVÔ?X8H'Ö¥F?o«Œ–u˜ÄZÊ4 §˜E®Ya¤ÒŽžæôÉ@¥üœÊƒÀ°]³ “àuÎÏzÀ·œŽËº&¹N†óŠÄWê«ÌÛšŽžu›¸¾‹k'ÚJN¾õx»bíÀü”@ËÑ&Ë û\ù÷ ð°q¿SÒ¦{cÔ¨ÚÂDfx0f3  Ï}»I…”QÄ¥ ç&<ØP!txŸ? 3q/)`ýej×*©ÜOš\vÏpâJú”| ,žÅµÜlÎò+é] m’Ö)à)‹vó\ÜŸù•Ëâ¾{ÿ@t®k½…©¦>Á#€›Õœ‹ÂÒz6Ïs¡¾[Ü6‹•å%AÈ ´…]´Î8mL™æÀûáÍ”*pv Êö°ªve8K ”ì")ç•ø@b™aqéj73 C)¾mWÛQŒÐ“»œÊpø" óW$H?U½­á3bÃdž)¡£qŽp|‰ŸUHóŒ® µ¸Y˜˜‡œýœ`zjkfØŒ_©ê‰M êSâa'jî*1qiAxEääûŠ˜•М PBÒ©­ðO“ÉLõ–úÃMI¼eîMÎ3mAa÷«ØÍF7ÿH­T‰ZŒ*ÇAðïúʈTi"¸&yŸ JÔ§eŽæ<>¥ŸðçO\ãÀ a˜ ~Å{EEþÎï<"½þÆ¿*Y“©€°žzΦg}YŸ§Ãšu¤Hà:ómìÕT%c¢`µ†¯ö 7#ß n9[ųü„IA­Ît³É²\ÌŸa&Dml©\J·‚R²â­NÐ & Ø—}ÛÕ)ïÄè@Vº @ÔpZµdµ€ I©> qšÁ^ž©'Úª!ð}æÙšq<† 3W{c½‹j¡À©Ä¾^…•pçjI ®äæÌMŽÚæ£V‹6¯‰kÔnñQ%|=>óX´ÕåD,«(ø]É–Øóô܈¡O;µ¤¬Ãq÷ºLìÝ¥UЋø1Í€×쟃~j0•',gâŸ~Û„QÕ ©3öçf=à}L!„¥„|æq)Ï÷c Ûé=âVÈ. KŽì,¢&"0ÐÅ%‰§¦äø.6ÖÄïMgȺN|I&øª1›‘z¾‡€fâA¸ k» ÙYMDÎ üµçÕ²ÆNÆ86½?ºJv&Üíî”+FPS p'¬›¿¤ GÁ[`°?Ež»ã„S‘‰¤OI„çâÔš"£ΰbˆï‘Ü®/uà¸U ì†!ƒQóðgE€Ç)"JB\Ƴù=ؘŒQ¦ÊýRCúm1ÓÈš6  )—9j.êøn@{k€¹d9 pÕ‰lù^%Ã]:z N˜Ì9;5‚N•:ÑhÃïçÀ…E4³ô¯É4x޾>ëé̳¤…§J œ5u¦h9ÈòÕ[ýDXhöÃì–‘Sƒ–3ÁÙ+Xv¿¹‡v 'x&?¹YÎV4®®i¿rë+5…Ù$Úö"Ó[°^cŽÄX —ÇÁï9Š£œ`G‰\ɪšñ“ ÅŠU-<“ˆN–“DëÈתÂ×Óˆ…V6pf„’!`(§™[ÑÛ aŠÏ0œ>BDÌ¡Žs‡tÑ€›Å¡j”úl äàE¤F&L”zt”ôÌVvÁûGc|t„4:frž³´Èë3qª¯76¯¾œfઙL}¸™p© šHïž^:z89Hˆs¾ÒVëCqÀ‡èR"H v~‚¨ijS¢JV{,,V{ØkŠº<$f" ÜUtaņ7‚Ü‹ž Ë@ ÛQ”‚莾¶±[;5Ueålß)Þ£ÆÒ!¹R‚³ mzɲŠèšùãØ© „wçààöº²gv%¡m[;âFþj”Êf r”!ØUæTK>ΪÕíH4{ƒl® ªsY 'D¤-Ïͨó[®º³q)Ží#/¦ŒåaY3’u±æ‰æôAƒŒ¼Š6&­°×E¶üËJU>a ð4{•ôœ@‡ì`”` „…¦ˆD­BÛÐ4UòȧY„N Hqàœ’Ü>Ñä ð,ÖàƒùO Ñ<.øE®+µ˜µš^fù‡Uµy­DCeæ4‡&£¦¨Æ9o~Š’‘û,´µ£NðFÌ£:~®Ôî²9>÷«W— YÌ"Ddpe„¿—Èä·Èsn~ MŠ¿sŸ½¿E¶ßU°¥HÏRàjú†/Ǽ›9KIg¾œçÁJ³Èí~érÚ !zó’,ÓY`p€fwæ¤)öaÞ¶ïIm g¬î ðˆSõ<¨d×á·âÂdЀ¦P €Pv–è„/ƒñÎÌûã,—`Œó$–òEL@ù¸,¾Ø¬ eã†M­Ùì\ 0ÛW­Ün±û¥`.c1F­ßûæ ]*ˆj=è»Tef÷Ÿ¹ !¼ ¿ìRÜöáë Áði%ŒÓb˜ÞG‡ÞLÆvËÆöX»±ÂR<óÌkq ù€×^¾:VÑuÒ2#}¾ýüË/¼O?ùt¼úü«4»CÉÙ«ÌéJ àAȉ©Ò8z¼$þÇÿôyŽc>nÞµ)v]·½¢Õ:6œ0”ÞõÓ£<|÷û?½o‹#‡NÆÛ/æ"zËcŽO“ R^=Eñ>}®ª“8ÏÅ?Bžyæº-„¯¢º^+FA >8°–#H|Ö× ˜ [´RÕš*ú |²“l¹ÉÙ©@¿/q0òä1š‚i²qµdmŠ¿©£×ÌÉÏlYÂbôüë±_dÂ8=€TéênÊáäÊQ?wÉÞh7CIܼÓÃ^À¤«ÇŸ`èRÎ[œœ8òÉÀðœw?OQ¦0ì¬fgøÖ WBüãlnmŠ.¤Ò ýÍU[ —ª]qaz@ªuT`ç«I9j¹ÞDŽÆÊu[¢ɪ¿¢ÿÔÉ8qø-´—b£-Ly©áYóø lå¢ÖéG×ltL ÓLhùYÌJj³¥ÍªážEÃç~9Ú_RC¡˜K¥þ˜!Zû3$¼€ùÇòS³ã…dÅ(XýOñÎ?Ö‘ê:pª…ñl¿j çŠæT1E[yL˜E|P@‹žù#¬z!ÅkÏÈóR7§Q¿¯Hm'ÜÌã’oÄ÷œÎ¤Ý\0þÆë¬53Ú>3¬jò÷¾@Ádt¬ª¶!PƒÒÅ ¹׬©¤g³ïUÍç >ÂI#.Ä\ #NžpÐ¥¶ªõ³Ý7¹þåJpó.Cíé¼…²x¨ùHKœ’æ‰m`K±[§éÿl—æ b¤ãˆ$÷ ‚€•Ýš[STßWÄ(ã—]«½ˆìS­ÏÂ*üt&CdL-¡D䆺üæöîXÕÖÝBwÌÞÃIÔ#ë'oÉœÌFd‚³±Çy˜œóÖWÉ’³ó ÕY÷ŸàŽ­tspÀ#ƒ‹wó;OGBIMÄUã’Y¹”#è„_q,[F,$<ÞÏ{Ñ¿åõÞ—f¥ æéíc¸W?óÆ2’˜Â‹Ps¶ã%Œs¶EJ-æ]ÑMƒjöT‘š _¡„ÝF5™Ìãáuy^(õL7AûárRU:A·Öà Ëúzp¦:Ò‡vÌókðÏ X?¿Ç<¬cþÜ5×íÂ)~*†ûŽ#…¹ [bÊ^ç€vš¬ðþó ˜6홺áY+b ͘ÀäõŸèH­B +Á§3H_oS3ì¿®¹c¤Oéo@CVÁõæ•Y¶3† §I3Awtcgqcµê«”Уi/>Ç3õŸS™õ¯Ì™ÓD¦ÞÏ I5Ï?Q3ƒ?¢´‹û5Iì$º'“V¼,4ËšÁa*}œø‰œ-%ñ—ôO +ì꣱„ã‘’/Û)w*Ç¬š›‚¹ÖƒÒ+«´Å±¦¶}ôZ/88HÝ&3ù̉›$bfßy#w¬*.C²Î-öÓÂFÁZ…ï 5ˆ»„Ù§/yQ7Ž œSàçìC´¢ÙЈ°fxm#CÆiGQyˆ!ýF ¢x—|@a–‚Ox“&¤¼åUp«´í Ye#:ɳ§=ï÷Y49äåÉ&9fˆ2%,›µªZߌNy‹jKR’‘˜‰ìFXô*^@ƒZP-N£ŒSæPX]Ž®Y RF·Yn }êT@Š–eh@¤"˜Kd¯"^£ƒ;CäJ++ǧ Ðj´“—ð~¢tÜ·fKÖKi:r–oè‹Qu5ºh¡sówÆ¿õ4*|‰gÀ,ω5)ìDàÒDQ°oý™jº¥Ì½çËYc)šž¾ GŠY“9K&¹yI2ƒR€ÑÂ\Á þ²-+¢^† hæ1‡]»i³Ð‚RæÚø™\ÍbÓRªi¨G›îÁ3Š?*±‡}ðL|@ÜòÚ‘<ƒâ+˜ÃÏ,—µzÝ!þ8ÇÑ¡nÒ·[¼Ažð½–ï@AZPó€Äõð ’ˆ:ŠÝM¢Ugñq~Ã#ÅFŠÏÂæCf*ðè.c`‰Ÿ%ZW§I’ÕæFóA¤W³ñþtx¹nµÕª\§¤1Á±ˆÕÑ‹Iig6ï<Wib沆Çë\} š  «ÁÀá«É„Ä+ÃûÚÒ:_µe Ê›Ç$ÓÓ\`ÉðÖÊSAR€2™%Öº„ ƒ`ÇñÕ8"ÚT'Ž,pˆ³HV¥k@äð$`‘CÂ’Ä•àü¢‘è•@° c#Ùoët¶+,Ìj/Õ1/kÁÇìäGù8ÁBF¯6h„É~Ì2#ýmî'iwépÕ/f¤Ïóó÷Úrž§ZiÓdïJ\ÛÑÔa¾ÕàcÐ$,²“qsŸ&ºÊ¾9Á63f#7ÇU‹ÔH²¦ Ó)`2S0‰p ŸŠþÃÅÒñX|¦iˆgɶ(ëbFc‰¹M\9D¤Üû|\¶ýªxñ¢­±ÿÙç£rKŒØSàqì7+îÙ‡x#­vÉ«aŸúÜdÚ 5›•É\Ë ãûlL~3ÑQ3<Μb­‹\ëdß½€QáfѲ‚ÕÈ¥î #‰K˜?‚w蜸Ƒ ·¢çøÃžÓeäÉvÃCX[íÚ¼Š–Ó§`F g¤i›ùJF[cYÌÈ+©å "\†¾ó•¬Zªgî—Ú‹¾)Y¯pRª+e²Þ ±’¢¿[9ÒRä*A3Y%T™[J"žÏ‰læÎ(,ôUx Feä~È–]’ýˆÄ<“'ðåµâ[J¿ ×{Ï8‘CF-Ô6s8%(Lbˆ"÷ã¾Ìm¡&ЦpžÚ°“èšg† NúÑÁóqâ½cøûÚ©Ék@3Ö|)´ŒŒÃ0nÓÄ™ÕÁäáÚ7\S¼õø3é_Ñ™]Çÿsj£j8ìГJ“þEô Gž%@³˜Û5ŒE/c™ûW£Î–=ÀDAa¨ÅÔ%˜`bû{µ±›Ñ\K,J ÜÌÀtÑupL3»{‚WàÄ©)N€©Ç¤rzÍNi@“p­ÔA”3Á“õ,àè]D[›„±;"œSKÄÔn,Å©B{郱q`ÑÒ^ûÌD?Îá%λ–5¾Ÿ&bþ•\„¹˜T…MftŽŒlƒÝø”x&ídX ÅZ4þF,§0Cv( â4¸0—µ’«Ð_h$Cû<رšDØQG’òfÇ–`DÒ7ø#¬$6Á?p&ÙØõȸü07ªœ²3{‰™Ëö~…IÖ©*`ø4»*M­ŠÅÀLMá3#qþì'|Ë6`‹["5%jûEZ3йE‰í2#‰OBç– ¸Å"øSËõYЩö „p3j9"jo²;£© 2©ë•ÃÁaU˜öÒ†¬“) £,IÛ,r”A+6o9~¨ú ZÌM°Jj¸J‘Öšö(J†‰ÔÓü™g2­¹*íT ¯èh%=´z!;Ë}ZÍÍŽqè2˜3NîuX£­=d £H›Ur½’0+Sš Ó"ÕìÝmdÏlî…%ÂàJC‹…ðrÖéÅ… Çi (ï›QMâÒœð:ÃËj_é†ðe Tl×ÙÏR.¡é½iõú„ •:Àо~Žœ_†¤ÑüH³È(h^BR´–H±ž*8µ"¢ÊßÜÚÌœ´V-¶eOífKcNŸÂ‰}˜û„–Ä Q³o³ƒùõš=zæOu¹†=ŠÐ:÷gèÈhÎJ”™ÞFqF¨¤îÆW³D½¹Os„é¦$ñ¡Å£{dÿYèéùúˆÙ„D –Ùx4q¦×GÀ`Ù36¼NAO7 RyŽÚ! .2.ö“PZÃŽR#)šÜÉ´! ˜Uú y†¾_ç"ÁË\ÑlèEÎ+-LeFÍ -·’¿ Û1Ìm£ƒ²>ÀÆÛ.¬ ¬E)Ç|óÌÕp5#Õ2ðõ©]ðìr_ÆÎÇ,# S8Ø3Ñ–s–á.âS€9—ú&- €–U]ѳ2¾Î¼ÂúvpQí­ “€ÅÁy#ÃÀ½æ oѺA€—š{¦M ‘•aþLágQc35ÀÞPÂR·€A QðmWçtž05 ¦àÊ®1·±ã«D²[Øì=F‘xÎâ,‚\.>§fÆèOt 'ˬZƒ/Hï"9qCL!R°[—9ÇÙæ0L„ªÌC¢,+§y" «—lk!P‚?­ÎEÑ\—n%ç­ÓêP`Ô‚Ã sñEÓ^¢N΂>j·³hvu8;<«9ƒ &t¶£½Ö’ YÇ^ªP.F¨º3tQ(^Ç01=Yñ¬€6ÏõàÅKþùá„!kN^ûa…ò'lgœX!<¹>•Î:ggîŸi*Ušu> S«Ú³+†s ÁXt ËZŒÄÛ¥(‰Hç`rIÅÓ’SrPÙ”]±âãX§‹öm')AZ™UÐ%ê¾¶zAE""C×ú!3¹}i%IiÕä'•y-„!ÿU…õ9æÌ¨.ª=@õäCÙV×vU”T°h¦ š†ÑYM-‚Ôó¼uëVV]Ôæ¨ 4M8X‘EÚúÎZσ‰fv²kM‡(Të{Ñ÷Ù·ÕòÔá@­€`ìå4eë ̃ˆ@ö%£^ö"4©@™t©tƒI›ü˜ÂŒ¿ :{\WÃü$fvÉ=Tc£‹£È¤('s˜®Î"Oýwæ7ú–‘:ù%ý*u2B~§9ž*,²~,s òÌ|¿ã9¼[† )Ia òéã€)A4tmOä7à_ #Ö\6n-ÔÉ1¼ i Vï«ùÓœŸaî×¼g!"rL^ nŽ–sÔ©Í1˜B-|R‚SÓN¦èƒç|æ!ì¹ÉÖ(g_#¸ÑJo¤%|œ:x¥Y¼dB â)øÁÑ íÁ-üeæîx2‡}¹_˜¨Ì4¬®]†ÿ¥& <];ÄÄÿ,Õ)>ÐŽÄ7ö’•0²ìiCÐç"hS+õ«©)¥Ìz8#ô0ÎO¦ÑEþ6JG…ó³ƒ ’Ž×ßMŠDstwuqFc©mŸë˜Óí]­œë‡ÈI¥XÖ¹2.®ÝSÅd&µ§ÍÕ¥*ÆG!^pºŽ}Ôð>þc¿ì@º•ˆÕàÅ*`erëÉÇҪŌ$.ƒϔa¬í]$ SÊ‹Îõ3PÐÇ(À»lLÈ=JQHçò7¿ðÜü†ïìЈ iÀ¼õC¿dâLÍTN”ߪÁCœà˜àoœ%g-Þ¦Qì¡n7øøÂõ˜±æÒé+×!Íkóur<£vé°MõDðÐôá¾M„—¾Zeù…aUhZùät2šM]â–,á¹VIgT-Í ò¤¡Ü[¦'1Èéý¨¢ôÁC°sªé5@GLû™q»qåšØ¼aM¬äÀ+ˆü,‚ åDæ— õÙ¹÷€!}_ú¿Rú³n5ÅjŒÄÁ~ÚÍ £zr Jaìh;)jRØR£ )ÇK`…Y1®¤ |Í®‹Cä»49Ðb ‰æˆy5&&¬>1SJ0edÔ€m#T¤Ô(ÕXÑÊ‘$"Ï¿X%? qÉÔ|dNF'³… LžgËSê@4Å,<²dˆIêÀN"Ds!Â8,Æa¦*¨¤ÇG24ÆBˆUæ6a¾$%ê¼PTËfA@‡O˜8!ŒÐÎìR9¢ÕÀ0f)˜ÅúN§¯c¢€v2îZˆQFoçGë§x¶L·‚LqÝ1ÕÆN†q‰­ ˜Ôó¬W8ˆòâ]Ö~ÁüÓD©Xµ˜ Žçs•XΞÊJÈ Â'VÓ@Oz‚6˜Ë¤L}ƒ¬ŸWœÈ#wb8{<6sšMz”à)$Ä9ËìÕÎs„Û!|~‹V¬ŸeæB) 'ûw5w~Š Õ-íñÚ+¯Æ[o¼ƒ}çKŸ/« †¦âìY†Íî?‚ÉåÌ>ήØ~0|IÀÃöÕuͱù¢Íqã®±jm¬±<Œê«¬€É$AJÎTd­…ùfsÏJŸV#Jš¬ŒL.ƒ¿Ên å8á}H%ììêáiäö‘œ,·“YúŒ‚óS_óQX-€KÞ§ßjrœÚÖIž=X@mç„" ~ð:¯Õ§ ¡zâ>(ql ƒ]pþh[¸,OÓ?íMV¨~…'ƒ%b¦tÒœAyp®ÌÇæµs¾•g§D¹%O1ay‚iÆá¡Îg}ÏNN˳µœ$Æ%²]Kk-IÁÑÊ/øL ˆ«šìRÇî¨) Æ2QÍ…ZA/˜Äï43ÁÔÒR´¢—,“ô7_¼>6mê‚‹+ý4³·R ;Ïý6TÓe:£FÖè©‚ öêža2ìíd-šÌ‹JžˆÙD3¼Â×Åz`ŒÓ0H¼H#ª¬•Ú¡EÉ:žß·»õµ¥4¹ù^­E{\†ŸÔñt þi¦„ôþ ®É4ô©MÙÜM k”YM7 ¬=×i+èQ2c½h¥\—áwNÐsHAãéÁ¸Ïá7ÀÝü1ó¼æ8£¤M8=Æ)¯&"ò#©“„ž±7ÈG³Ú^AÒB¿## "Q¦xðS{ÈV8pV ^ͱJÆidîÏŒgƒ•YN2F] ÅžHæri2M¬iÆï„§ç¨.€áóÇ@ì>ǽÅNTÚâ¢%ûä¥Ü!ñ½‘Q™WjLüî l8g’s§©q›µý/8X‰g-xIÁ˜-ɀߞiÖÐûâ?g™© Pµ‡Ò_JH"ƒiþD¥ZZ{“I ãÑwž¶?'NÄ_}ý[qû?—\´%¶nÛ{_ß?ýá}qÿÓ÷rr~tñ©) °ÑX9u>ýðd;¡'êõ0ycé'±q[glÙ´%n¼îæhë¶TÆžüµÕ·“0ÙŽÓ«ÁÒ.§Á¨í4ÒYÃÎ]$ùÖÖh"!@ˆ\ÎtÐÃTZG©’BÇ`MûdNS$Pê&É<#`, ýâ§|À•e‡o,†÷l¬Dph]àäîU‰çÂÈŸ B;aÌ$6yÎn£1æ΀sV$¨éé÷Õ/ÉŒ?®tPkR‘æ 9x%¸ÒIñTÕ9¨Ù¦ì°©éò‹0sl$/ÛMÒGÍ/7OäÉŠ £\Ô¦TJVQyb„É«NâÍîn B’)ÈPT—'Fú©/¢À$¶GÜ¿IØÂœ{›‘m\O{_œ¯³Z$4ºd¾¹.eH…rj»D²E®T€éÈtšëQb.·™; ‰ rÂcQ«‘ÚhCõ˜2JÍMŠL•Æ.Êi4c1é² Òx)ÞˆÓ7 \ÇðD@Ç72 ß–½©8È °&™…)„µ15³ DfÑê ŸðX O0d´0i˜‘f´e2™œSÏZÑ5 sÏ=T,4aêË•¨2HM"µR”ZŒþBS œ×ŠÉRž‚¿×~׆ù!w(e üíXï)ˆ°9µd%áA.Øð²|‡NЇ¢U„ïfCýÙܬûÌ"æwFm–ð1ÔðÞFr¬&!’„‡µ{ÃäüLâ|Ö´GX§¦.Ó·¾LŸ¦Ì(3åÑÔdöÙ²‘ {® 0ÏŽ—º ²Ú †p‰Œá Ø[Ë]ÌBžD»ZÐál ƒ³çÕ eæehæÙûšýɘ² >#Ä#ý/Uø·Îœí¥mÎqÎ?ÒÈTüÛóÇqãMëã»nŒ]»®‹ÿû›¿ü?Äwþáãû?ü˜ѱl#žJL=ß¼Ãò.3âe&®Ót†“gNÅ{oÜûwÌEOcõ©$•®$²zóêX¿ym¬]·26­Y[W­&˜Áé€ÿMV¯kŒ>KK L`×MjâAC•$³ÆŒIÅ„ÊY¤Ÿ‘lK½²o˜çËŸdL~•.‹o'ø¹„0©Õ‡ËiZ»W4±+èJ »p5çÃsã7²8 ‰@GåáÖi»HäšÄu2I;ߚƦygƒ.ÁSõâ6€žáCÒ÷‘<¤ö€¯à70. gfu}ÌËè­Gœ©Î±æ§=%‹y&À)'fq(·×ÓœLQ{áh;Ë£Õ<Šh! ÂIJAäy¢lMLTm ú{ õXæètÙzüLØîú(²Š Ë2bÚ¡/ÊpµŽ;iql[\Š·-[”š“mÁx@6™Oˆi³4£e“HÓ)ó\'mÊm9šqtZ‹et+'©u< ‘,ÑÚ"»Wr­63ÿ»°'59™0©ý³‰kÄÎÓ¦tÁŠWMJ „w[¢ ó]&µ„áP‹†Õöl÷aý¡>”ÌœYòÉp5y–¯†˜²Œ†3ÊòÞãy™®À1§Æƒk8#„£X2Õfk`ÎÙìvcŠ8r}1å¥ôêæÜ'ÕZ<˜‹!Ì2ª’ã©À¥Þ™Ù3˜&j—Ó Þ¹QS0lÑ+ÇçÊñk¡¨) Ó¿Òσ²À÷í߇oFcÔ‹j’úNÞ y*z½ )͈6âkR,¿D«ÓüÖà ¯²pwhà å2L%<îˆPSD 1ÓåÏ™ÎÒÇÅÚÄÃLÙ`¿˜áp ž),º–&ó–3x|òlôõG5ƒ5¯ÛqS\wÕµñàÏï?ùßþ8®¹~g|è¶ÛâW>þÉø³ÿò_ãsŸýõøÇü§xå…ÝÑŠ?¬–t5%Ê}ì8é8)] Z]´BFðIWååÌu„Á¨qšanë ÷Þx/z‹G&Ÿ#Wh6¶1,àâu=qé%›bùжøÈ7Å“Gâ8íˆfÏPaj´P…F¼õ\ªlÆL£?¿¦œbT¡•ÉRÂ[ž ­r•?Œü)” VãWéNñ•ÏdF¾÷y\ ¿€Ïð §n‹û [XJ‹º–Àk~e½g Z®åføJ4"m¹ÎLNT\•]gjA®¦” …è†ùÀÃd<|Á$FüD ÌJ5§B‰§c¹‘μ€b>ˆf™ onÆŒßy˜!`v_056äwÀ¨¡î‹ÉHÙ©y¢?3Cð»8ÕóŽCKÛ›çñx®¹ly· ψA½éú•³î›žÎw.Ößf9ˆ?àR!ߨž7ÃÌÞÍD?^côqšƒQ…vÝ$ÙÍ®æÖ„ï^ Zš:¬¾T)Ïb2ã˜ÊSFçÐt2wÿŸœm¬ÖöJÓ¸3¼ g¦·¦ ÅïÓ©ËY¨ý(TdDžÂ>µ3~ö{ÏȤ@K%Ôô¬y2e5/{iù½&­¹MΩ÷Yf²ËUÕb©a–ç*L$ßo ““b¸>{WhÂ+ëÔ`Ts0$*uíQKˆº’ ¼†Ò3zÉï…‘&÷šh- RgÏ÷eÝ× Z“Îò.N&\hz‚Om‰u³Pß(‚”ÔÍ›!òe); ”ÖW(zwo’E)Ü–Àjª&™ 93ûdÙÆwxnɵÅH0 ™—„Êß…=øg(8íW_ãÓÃñËÇ^‹†Îú8yúllÙ¼16n¹4z™É÷Ê«Gâ•çÿs<ùÈóqÛ­7Ž=þÛÿùgñÖžqÿOŒƒïLíe£5€a}¸&Ö¬^Á^ñKtà ï4à‚²Cm}Z;g ÓJ‡õ22p2ž{úX&a62@cuÇ2jöVÅæ²±§èjŠ/¶ßo%>bû,uâÁ/ ½Ô 4Ä–ü@e›pw80†ôêžé©Y\#kS(ÊÌ} —_¸…Û¹ÂzÕe‘>màïEÖºN[þBÛël») ÊícÞˆNa}‰©¦ƒP Dd X˜È§?#_hV0 .£”D[ÄS—¡UµY‚ ­W^FPŠÚkÍ«š7u^BiGȳ(Á<²½í,ڃ̳VµÚ^Bbh}Ku;ŒÛ&¼ª·ư€ÿjÞ$KÆñÓòNSÔ”4N-°°8~¯!?X{•­O€¢¹V»û.÷—r€{äuæ€èŸHÿ ͨ#Ëa«0$$×IˆµSu¨É…Ó}Š}âCkj¤u0 .âç@mE®mwõ ™¿.ásŸÀ™*ºå=Öí ²4T{^ÊEjLɈ¸jcy¯;Ö€#w/#S5W¸sbsbÑšàš#jkE©Œ*'Ã϶ÍðËàÖ¦>¨%d{Î '“¤Æg4¦ ¢Ðog ˆš),'óЬ‡³¿z6„®u؃¼ Áz”ÂÙ› šWÓFr—bN“íí<¿LÌs>ÏVkO@{ÆìÇš@C´÷yÈj>úÊf)5*›–91eÚuá:ð";K"/ÑÎ`B|“í9x…š²Â<µj¾/•Y#xÅ]žžL·ìŽ4! ¸Ùçy ÔÄí7¥ëÂR•ÿö‡ÂuñÂkïÆãÿ £³üÔ—FOw¹-ö¿s(žéøÞ~w|øv´š;âS¿òiº Äïù~<ûÄ£´`!a˜µQlrh]š ŽšúöŠoç°D(˜¶~r¦å:ä¬ó˜äõp¸J¢»jͲÏ¢qöÀª+éˆeh\-±£1Iسm<‚Ÿ¨¬BT§¶{öæ&å?^0|šâà á^Ix\¦¬Üâ}™ÆÂy- Oà¥r FdD°o®õ24tµg}†¶–YjP Tòl¹– M±8²rI_“&d' Ôä™A@Ô–a˜¾o$k)ézýÞ•Eb¢/@5v$¾õô¤q@ä0"ÆVÕ02¥ƒS-´³%ºRJ."Qj?J A/œçÇé_l„²Fk*Á­¬6RhéJ–¼$’ù^ŠçgB&Ï4‚˜aböšáa˜†Œ&Ë5@xµÆt,$Í©êjÖQè×q‡S–oÍž†2Ê;Ìn_Ö§ÏÂàpúš8“®æÙúñ’€ò4Õýô7(¯ìK $…†pÓ-ÑÈ4Ÿ5£€©×qrœ†?ðŸZ é'Oâ gÍß,aáéàç–ßÌòej+jO2 ›‡e™û“ðˆßƒì ­ ·«áÚÏÈjªA)Ò9S ¸Î{DNñ%Õ{¹"÷˜Ã£¯R ÔÌ\Òt@D,‚Ñóä;A\ìK¼ùtÈ&î!".i!^„—Ò6q DÈôÖ’æ2{÷<„…A @MhÁÄIüš“6lÀ}Àeà%pf/úFÁø„ƒæª¸ak”ëÄý ?¹¦P$ÚB ®xfDËuˆ§œò¦“}çã}ûâþä#ôÇâ½´Ï}ïð1ê±*(j€ Ô£õ™ž19‚aqj6ûÂ9Ö<Ñ€´NaR×ðûú\ÀM–¡6SQ{º!ªHÿñS'e~ášž˜ñÁ›oÇ0-PVpÂÒ®>Jµg`fƒÃ#½ KÛ´‡ḭhAìÎñ²äH8®w¥ðFÄÎ3Ø|ª –«ðÏ27.ZÙEaºº>ÐÏä?ñ lb;H(î×—#câÈ—¢núb¯ó¯áåE(Œ‡ûØ /º€L°7Í“Ü /_Ðñ c2,ézÁN£\Øj+¾‚ !=ö8R׺¡rL:»"– ­L¸“™˜© ¦±_‰ÙDJȘgÈý‘3¬¸eY‹áz/CÔ&žc=–~ U}^Ï3 rF?WæFùÞLa[OÒs¨?¯Qj@òlݰ‘á 1Ù02t4–Õ¯@E¦zû±Z¤”Â2 S%<Ût 7À \Ù3ïæµÀ­E f¥¶çå&§ºVƒ2,.Ë{”š&©ª!å3@™R2¾DVàŠSÔ€†LOÝR ™–&¯›Õ§¡fµ@ @ŸNöÛò]˜Øi ²g5(+ÙËQ½í¹m®—Ïòü’y£ášB8y¯Úœ°CßdñVÿ;ÈÓA˜ð1†Œg®—ª¼éB2ÿ Î6È3e{â€áo¥?ƒd@Ž})ˆÔþX;_}¿¸ê_åj¦xdï%ÇÖ 3äL¦u¿þÍFh“ä à J:ô=™ k"¤@5ÝDSS—„BJ~áÉ!{–=Àè¹FZÉó`-ƒL°>pâ É—oÇ3»OÇa4žæ¶®X»jKì¸î–¸xóöxý•g˜\|%’jÂû­tˆ\³qMœî=þ—?{âñ?åwã÷~÷÷býšñ³ûŠù…\X€{—,QÃüôï5”SÐ<¯{ Ÿœ¼:²¬ëI6n#ucÒò2†‡èk#ohKÃBñemqëí‰jÒ*Ž÷Äþ§ØSu\qÅe™5^åXµ®fБ%px'Sl”ÊÒ‘u‰fHª¨TÓ)VߨpÎD]éÜÖ÷Èoø½g ~ð~ÃQƒ2\èkµn¦IãÈC®dë/q~9ÔÄZ/ÈC—`xˆÂ>%‰Äƒlù¨ä§fpóÏjpšå­JÞr÷Á$tÎÚ[QÛ Xjv6k%Èaˆž‡¥"GU=Öl l¡ M¦Ö†EMUhkÛ2ç©–¡oa†-nmT&* 7Ö`˜—Gq ºÄ¢(»eº¸k†YŸ¦bŽˆ"²èø©Ilü:Pf¡ 6A׿* Z†Ù‘ýgø½-M<´’ßÝH«•qÉÆÇ–Õ+ãÙÇŸŒ#ï¡¡ [MÈ9‰JÚfæQS0ø;0ŸåP”ܪí~(Ô¼O³3¡Â½ÂÞƒõ€4»2ôËFM®œa/2§Œæ¹wM~ö™8a-…tɬpfQ2uŸn7Ç)¸é ÂFÿ 0k´˜LºòØûÌ$a¡Eƒ–œ€ÃÇ0g%~U8‡F‘5^HI…_#½Ö5‘$‚JÎAD‰Šw°O¶ŒJg©hmÒ§Š¿À¤&˜‰¶Ü?‘f8•Íà.|Œ¦ÃYÚMV mË -²å‰¹QúUlßc”4aîdpxe€!_Rš?ËM8Ö6UÇà@_ìÙ÷&£Ô›â†[š ÓS1|>úÎ °¿²¸i×m"(8Ѷ3´¿ùG0©Íë×FgûgãÀ{‡â¯ÿúñë¿òÑØ°jmüÎîŠ'Ÿ*Žôöam¨¡¡ÅÄ©©Xs#A¦[C^U=QlÓ êðsŠÛË—µ€›øqƒxÖj&Ö¥6"ŒbÖQ¡qüäÑX…ƳcçåqùÕW3ܶ/Þ|ŸÖESëÆX½q#=×j`Þë[Ê@Çs¨äs«ywÒ9Ðn av¨ñî&7cÆ{nZ©m‚§Üʇ8Ë'§iŠÊ‰’¥”®ºõˆ§“ë§ÐÄL‘W0`•ÿy›ê6·z‡*²ˆ‹6¢Ê—fOá™R…ó`®Y¡ÅWfÏ“H,©D2¥ìƒqÙE`Ö])}!üÅ‚Y/0‰é&‘ømv‚„8T½GpJQ§5Y¶_àÐpWÞQ„Ö¹„1AO_’#sÌ£)ÌK´Þ•íYéΘ¹¾SEf“š KÊjw¢bNzQ³h@[ßù;¦œ^&ÈïÇÆ©ì&S6í0Ñm[·ÅÅ7þK⽃Gb/¾…R¯sÌTu=ˆ”Ø2d,îWù«PÀMA•XÏ3²m´Ég¡ÑqŸû0ï'Êf ×p›L]X¤ÁÊX4KÕb$ÐÄ™žÚ.ðWQdy2)—Ä8ÍÊœ&ظi ³©‹Þª/Šç±N5>‘–íð³Œ\ÑHNQëÊà Sá Ukq5÷ /ñ;5m²sˆ !-3˜‚ùbº.a&$â±Äìi%†A4ÉLÐ.Å+*3‹5ëß[¨Bã@{(¡s¦] W*¬ôÍXä<5K/Ôð§1ɧ5÷À@ |x*¿×ÉôœûÖ<ñ.`ly“6Hoï‘ØóÆ+Ѻz ¥h×”44uDÏòŽØóÞ[Ñ@)ÕÖubûWÇ3"׈9mSýÑLˆÆV’5bÇ•—Åþ7ÞŠ?ø“ÿ5~ÿswÅïý›ßâþvÒþ1Þ<8£ jÄÚ·ðõÒa³ µ³‚®ŸÖB”HªD¨d!4¸ÕßßïáÀÄð7‘z`§QAß8xP¨Æ—~÷+qý®;bÇŽkcUOg<÷ìZ ¿øÇÛ良2¸k©¶ÈŒM2ðLœÔoiÔ]—B=­n†ß=ÊHyJu83ã°úBÙn¾Œõˆ{º,< ËœÊím Nà³¥â£S·§[@·bеƒ |¨ËІ´ëùTÚ¶"Ͻð³EÔReÈ[W‡Fö@IDATG"XEÄðŒŒzÈeAd]NN†°EƒH žRÍŽä"áRMaf³„#´šðûÌ<ņø D#¯• ØB´m†oa@Øà@*UA7 RÚ¿YBIµÓ=€ø"¶ˆåu?k…HبÎ:#<Ó9ò‡¿äÌͩ²Hn¬]¿L)íié=.øæ‹8.ÇN„ó8Q~&cn¼¤'Ö_´1Ö¯_¯¿úV<üسñ½—ߎKXͦžUÑš]£¤F:¨ ;÷˜UÛnLbåÿ<=³F™ðTÏLÒLÆÆ5\äuràÔ,YŸD›-gàiî‰5\äý2+_VœŸŒ ]Ä’9‰(ÀJÓXóéx'pšfov=PQA‘àï LÖ0pF¸>„¹ššŒ65\LBÏ×w8BÉFnîl„~Ev+à°ì¾–s„ùÙrÙYj Dñœq8N¾Û¸#&#r‹ú!$Æ¢,©•xVÓʺ#žmò©ŒÁþL–¨ØnÖ‘R¾GͰRÀFò4eóôêXÞWoë‰M»âX_o|ýï¾÷=ð<û¸¢“13·º«rB+m5yFÁˆrAÈ®Ñö”90Ùs©ø[?Þg²r1ü=s®ø‹Œ×Yî¢éI°™ìyfJõ^æË -xü UŸóæ9e˜¨%Ïr®ú[ôsØÇYáæ<ÿ\ Ôl›dj‰\"ž®ý’oN‚åž:’éì>A4Ö\lU í>0FÉC ~çì ëŒÚ`šxº ,žVæes2Ö$Üqr3ÞÅgƒ3vó&æÊLBV¨• ËqÒ³¶dø\+Žû·i`´¾úí÷„‹\9 lÖàAš‹¼WÍ[fg-¦]$Ä5 Kae4ùµÝ¯ÇO<]¶¥+¢¼­DÆûH‹‰ê6öŠŸ=1º1¬«kÀ¤2×ËS°=Ú–¯‚1ÖņµëI-Øwÿèîø‹ï'Øÿöw3>óñ_úGŒRÌ®Um+âÔÙ¡µVI,G»ÒfúN©8X6 °oÛ¿t£µµÔÅrºÔÙ Êæ`”úL"DV®Ý§Ï ÆÝÿüHÜ}Ïþø£?þb\ºmG|àÚ+â•ÝoÄÁ£§ãÐñSôÝïŽß~SÌ·ù=m0zŠu†Òˆ¦1œ8µ© S„PZ¦°@ ºdé–8Œ°L±¸Í§iÉg8oÏ}Äêž—uµXrå.eݹ嫅šÏArc†§ù“Z‰NHÖÃÁr)Q‰ f/ërN²†‡jÞq sëG³ „a@‘ :C¾P2‚* öÌi7Ë¢j»×Ð1`]Ì3ïìãÏHr+؃<ùô]2H“à&ÐÊVspä’XÿÕaGíðÊšlw:¢åèí—XÍm.U‘9aZimR`-LÇy–2¨ ¨ÂëŸq¶4•)ÉìY^IÒç9æ°-"º{6lŠuä‰?´Â9Ça]í-ñ“Šoí{ñÆ{'­NÑñºUÑAW„z´wi £„šó)Ãä/˜0ØÌ8¯”-qp2]ˆ"ÇfA ¦fpêÜ'c-ŠJ“ÏÓÁé`káä%E¸Þsó9ÜËßeàÉ!`¿ÓôËÀ‹‘¡‹À’sN|•ÉÀX|VæñÞôð,‰½–ÛšHÀj¾Cçgþ©¦Ä‡à.å$•N’Ã6<29i::UãM-:Ófmº[¤UKÝtî;}hæ¼zÃÅÐ ¥8þEèÌñ½jJB @¤1=LQ们jW}Få2á1¿‚ê™Dç•J-˜—­tÁœüÞÒ kž…ÈM=lΞ7ð•kÔfŒ™ª_I¡®Ý$\â60„ Ñœ9¯¤2¿IF“ÎTM7þɰԎ¼+3à ¸“ÏöqjzÙ.¢0Ý^ŸD5ŒIíO=C¥ì¹†ìbÇœ'ã…é:ue€èÈ9l“'Ij{÷Õ‡ë:®½j*ö¾xè‘gãÅ'÷Å ×]×4Q !3€)ë§¥­ßHSG¥‘ZÍA@b©©°“„ÙŒf™ ‡ß§¯†½hËkÚH(ÂK¢sý M(.O‚QSRˆxM‘u 4”0>-ºÂï'ÃÅWæM\ Æä×ô%r°J~³¢mhëX@Ç©s?/”©q© ÛâØGh.9‚ɪVé¢-™aÑy&ÀQ%hÎa–ùÌӛɎNR¶G–æñc“:Ú›`*œ€«Á4±3¤áäl¥C!86 ïTsAódcF€ì¯£Ö G­æ£‘H2¦Jš´ f9øË Z£•L›µ:^3Ç´2ÙX©&Ÿ‰ªŽ”7B Ð’±‰ùɘx—VXée³0|´K´.&ŠÅ[÷ų'߉«6\ç R ~y‹W#@Y¸¨smÿБ^Þ óT<ñì+ñ§ôå¸ý÷FÏÊn4×ãé?ýáýñxCe\}õŽ¸íæ«ãê·Äž·vGýž·Yù(~á&"Õ˜vìyÖœ5hCCD#’§p^ú}mcÑ·ß×€¶PQÙYœG£%Ázž`…#³vewì¼è«J!ÿ)Q<5%q9Ë,T•àJ|a2™lЦšÒÉ“}™N TËIž +‚à‰šð©& òÓÀ4ª—÷`ƒwÆ\ÿhŒ8J¶+N=šlitâbÈM°TRúA&Ëú¬:’I|Žš±-¬iûúU*‰BX”Z ²V¡¡¨;É•Äé씑UC8LJøÞЪEºDf`Ò³…È5#™û±oÏ4ëŸ'êRßÕ uFšGÏò6²hûãÇ÷ÝÿôõŸ3•eE\qõvÚµò\$+¡èá!$áPœ9Og?†6ÖQûgA´yC®Gfî&ñNð¸^ pΧ`>\•¾ ÏØ wè罚/’Š­i„Ã"×p\ÀÍ'¹‚Øk³Ãëù,¹Ñ'µ—àñ˜ûcñ°¾=ý8Ój Ü ˜ðY™ÄÇÚÄ+“-5SÛä«„ÌéŒ5©2SIx޾…ŒîÁÔ¬#ô÷¾×茎YM[-Ï£©Z\Kj}`ÝjAš >Û¯Õ¨'»€÷…~'sŒ²ý.Ú“øU…ö\ŽämhnC0©„ü,]S? À¸?­¾5…’ûq j@vóL³÷9B^xùn-€L¶díš$ÎdKM”gÈœñ#>xë.He†±L¯“äÙœ“s´ê0M+8·2^ÚŠŸôê˶ÆÇ?r[\~éÅщ&µ¢{eôôlˆK¶_—_ym\sÕN˜.½Å± hY˘¬²@ñü3Ï0}›ÈâeÛ6Çu;7’¬ér_‹f˜YâFÚòCdÂԪ߲35i¥ŸL[â–yÈôåè€ø¹ü ¥­X Y4îçú f¡/²Z\ çTO×Í©qÞ©@0‚ ù¡?Ñâ H¾—™á£’™N³O™tÄKòhŸÉ€Ç2˜R% ûkë[(»XFs·åœYk§ÐŒlà§Ù™í‹H†¸ë0¹5W3—É…‚ù=Uüž-q6jŸÀ”ëýj›œœ›Ç¦g‰Î™l«“ç_}1F(xeïz´$<¸2àœ&3x¹¬½#.ºäÒøà‡îˆ«wìˆMñÄãAÌt¨¢ÜGm‘ë²3%z#ë¯F“;xàp4ã+Z³®'ÏøÜ™þxâ¥ÝqâàèÂßyÙÖK‰_ .ODZC$žÚ˜‰kVuÇÎÛiu|% ã­·÷ÇÏ}"ž~ñµ¸ÿ¡_Æ“|}q÷žž$x9>Óͱí²-ôœê®˜YœDzvà²?¿÷…8râ"hí±u#Œc# Ã%d¯¿³7zâq„þYr§VÇu7Þë·lúeÔþ¡¹õž̲0[ûŽrãÒiæIJ{0)#³hØcÐÀšÅÚ5О¢µÑ{æôá[¿ê¹§ä•sðïÛÚ†ó”‰Õ"$Äd+SîùaÔÆy]'O÷¥ÍŸ„ZîÑ@„ÂÞÛ2<NÇètUC´®ZOû懡Ÿ:‚¹&ÐÝ&¨ý¢ƒZ§ºÒ͸Ì=ë@BÆ:Á¨ô³XY=“ªG£ª±@ºÌ^‡v2B ‚€\‚ÍÅmzM—ðã£NGµN]AÜyHVˆ§©{e´¬X ÂTPµ1.Ý´>Î â4üÙ/âÁûî‰Î5[có¶­<{{tON^Ý~éúXÞÑ­Lm…™OBLš/µôÌQêVHH„>0szŒ@-éɾQü,£¯„9¦ˆ:Lˆ7 ÌÀsáÒtäÛIßSÈrØ ¼KP—Õ¼—ÿ«Õø•;“‘jöd¦4`’ý¤Ðuiîê«~êƒD5NbVÃÒéù¾Ð²DÈ»uNÛ¾%3ú¹݇køäïÃÊE £ðŽr` ŸÊ¦øj«>Óêô¢+"DÍþôNøŸÉ¿9ÿ3l dõ8¤&™¾µÄ£Ç»ï­d T…½ÈZ!Êöh¥=sÖ ¢uÈ€eFºÔ(5ÇiÝ2ŒÃšÃHS'5s¾÷ÃäO-‰ÂoRh]ù3gá H'ÝàG»ÿÇ?¥ý,™ç»>i){”aÛµ­°žõ £qœO†¬,xùù½ “E ‚uš¼ILø1³«¨ž¹Xgðcnݘn>®åôý~z÷ÛqLOH,o_7ß|kÜñ±w~âSñ›nˆÍ×»¥xsßžxèñGâÿöOã¥}ïÅï‰wOžŽ}Åî·Þ„aý"ž{âõ8…4ÍÚWõ¬Á\»‚)<íÑGrfww7EÃñî»ã¿ý¿‹I±õ’ qåŽËbÃæžÔ´šÐ´ö¾{*^}c/Ì{:Z;—Ç·ìŠv]‡ ¨'ŸØ­‘ÙN€ÀȦAì±/ÃWÐì2ß°ŒDݑɒè^³æº>`Âçbœëƒ9ݾcãWÓ+Bò nð‘˜LJäN¨Ò­$±ð½Ü£¯eÑK†´µ9µ„*5ÍtEÖRgeèP3Aso‰´‚iæo5­Ä ‡t›ßþ_¾Ãø/VÀÙ«1Ó*jçãcŸ¼->û™_Ûnü@lZ·ƒ°ø™Þ9r³Ž |ú‚&P…«ØC3Ò*aM ‚–Y€©³B{T|°@ÿ”± IJµX(gcDOÁ_‚”ÖQŸUþ0'ýX2†~¬L¾„ɛ㔠Â*2*5ˆL€ƒýç»+P­-i©Têóný=3Ìž¿ó)azONèeÍ&û)¼Ôht¾'c”­à“49Õ.—ž?|%#ré+ãyEd ŸûÔœ¨ò½œ±Zj¸hs¶V³M,äþ ¾Þ ÂÆzá—Å}V½&£áÕÂ0÷,åpÒŠÌ¥“ÐF~úÌo2ÅDmÙ(“#ÂÇHcñænÕ7·Ðe¢ç @¸6#’jY}]2›LLöz6¥«áàáñðëOFNeû{u4¡°Öv ê«mΑŒyøÈù쨪©dss¡ì}>E¾‘¡Ñ8y¢áš‡c°"asàÈ;Ù\q9½šzVuʼ ‹í-±œÞW÷>õ\ìæM’[Ç¡ƒ)‚Q#8ׯSO¿?ÿùÃñõ{žŠ=‡ÎĶõË¢wÄŠ+(é§WIm þ³V9ƒñ̳ÆÏ¸—Á˜çH5±qÓ%±eëš8×{y&¶m+´ªþ‡Ÿ’õzúP{V­Ž®½Š( >,|F ´zkﻼÿHœïïõóóڸꊋÀ¹™xýíw ºX Á¥ a  JÊÚäÍü¿>V¬ß@¡ó&hóD½:Ûû6<ª€nþÅT{?›X¦dâœIn‰­‚›ë8·”¢"­ÌÇ*p}$¦”Ä´©9*Ç‚™Ã°—ÔäqþšDa Ä aj¶a…¥æW}ú¹”tj Ö~9¾YNêÀ@’·‚ J7MÖ(aÒ&¹Dds´$°Lià](ë€Ö\Õÿeô¥œçöl¾Œi¥ Q˜$«÷\lܺ‰¨Û欼ÿ›o?~ö÷Äå·îÄOrÓ®3þÕ§îŒu=+éà¹ÀÔßãñì3ûâµ7ÞŽ àCGcï‰XI)Á²–æ|÷äÂ̇Vö'‘±XƒÎRãÄ2`0 |ª”åšJ~hnÈø‹3Ï€ŸQólM# K!!ñ˜·•g%¡ÙÒšNšw楘@W¤°Ö¯¯ÅBcÿæÁ*qe––dr¸´XïÑå@N?‡®~³¥ÍÉ:?p-z‚‚r²¹©Úä^Áá@–M F¹€F`—§O©3L_Ø@?õl|di_‘©™.’¡®†™I¡àëS¨í;ÞÌ̾rFe9½§³½QÞ§°,9dªó¯Þ·Üx-M7âƒÒ©=ï xø±Gc5xׯìˆWOÅJ umv?îž:y,þê»ß‹øn.å_þ·Ž™×mÙŒIÙIW‚ºPø¤¤U{˜—”2’:u”ÙÈ8Vžzêíxê‰?‹/~ùhü»÷¹øÜoÜ=øpìÙ0ºV®ŠÏ|á_Ç¡CÇã?~åk+_JÑòGhɲ3n¸|G¼¹w¹[¤ˆP‚²ïÅñ­‰ïú­ÅoÛ-m…ámŒW^y*úzObe)Gƒ25d yö-œ 3ö49°@³^Z扤z”£êxH„œd‘ùM3¨ GõüqÌϰ̀§C'`™jHj–jJHPÃ\¬:*¡­IËÂQ˜Ü’-‡c²0‡ÿM Z屬d¬*çK37B¶ÆÍú6™gfsˆ?Ù&_yÚ‰©Jo‰Ù°/»‘,óš,‰`ñ’Ö8~‚j¦d4-_‘ q¨ç`Z9}ó &®ùÀN£‘ªñ·âÞ|'°8㊛¶2‰öÒØuë]HUUi<ñ˗⑞ˆo=øÌ¿ „ß@âh„¨ëìµäŸe­ƒÃ0 cŠC±Å‹ë^@µ5IÎS÷bçE¥l%‡Z& t(ºëì<; 3øÂoþ0‘ç’iuu´¡±¬‹žu³ãêàԂ˜ل“¼ ‚§ŠÚ©#°3Oÿ|È9(Á#ݨù|j¶¤´šhÛB|û›÷ñüñ‡ÿÓ]tKøD,{áùxàѧqY4ÆöË/ŠUhE»ŸÆßô‹?Š/üÚçãSŸþT\OtñÅ—^ˆ^4Þæukâ­oþæï~˜)·ß|G|øÖÒo‹v2¸B‡&ñ%ÙW©5W4r.øÖðíL²ì<Ï3w@–ݹcíWSmå@ÔXÔ6Òï€Ê®Ï$“Øø^5ñÊd)OÀV6Ʋ¼âÜ9œÀ ›­W¬Yª'r b[Ô˜ìÁ+uQ';pˆ×`ôîßO3¹49VH MñEžÃFòÚL­–Jj©_ÛÞn#„¾¡×Z˜‰ár͸÷£t"–ÿüÙý¸†!™-_¹6¶\t1 sžœ”aº œ¡Îè ¿_Cèö"lƒqöü÷ÿî¡XwQO|ö®ßˆÏþ7ã*þf§¿Ç)þü¿~3¾úÍ»ãõƒÇcÓrTfJÌ$÷]æ Éo»~…”Wðα 56u Ò°Âd9ìMmA…tO&$8ù &*T~†PÙŸcÖM€›§#»¨=„HxŸæ’,LlóÞ¢ÎÎ@ÄÂy޹?)H¸Ö\a%l¬ƒ,|K$Åâöw p.OFŒ«á0YÛájÎ¹Ò ÌHµ6]FH9sþUìŨdÎ TXøj~g®³VöÁÚ@ %bj]EšB!Ld22Tß ’yk¾oнp‘éIu ´7ÛK]ó¼¥É Lø÷±„„ílÇ ‚ B°¶!xqæt2¨l3, ðñ8 ¡Ö¸ÏE8š6à|<ô[΀îN£‚ ¾R´«c'ŽÄž~¬é:Ü øDal “ÌÆw‹‚Ž3VË+ǧ”Ów!¸1ü¥ý0`=uu¦/T#ôÚÚwß^òŸ½}'ÅÑC¢ïl?4¶˜>«Þ3çé¦ySÜxí•КØûäݸCh´ØJ €„æ:ü?uø¤* rͪ­­&‡ w‰*Œ¹!rüÎ2fü,}¶Ho1ŸŒçš·•),ÍFÆ•w0­híú®xû­ãñÍoü0¶\Ü7ßvsô¬î‚ùìΨó²ÖåÑB^Tû! e.>tû.òûVljcGÈ{ŒZ"~>ïoÿé™;{„Ù…½˜µïÀ@Ñœ›×Å–m;ñÛ^Í«zbª´!zÏÏDZ££uQ¿Î5Ð+ø]KÀQòœÌË‘£"‚D*Ñ^„_ò‰©ÆOj42VßF’’Â<¹òõJg½¬³Bb$ñ°šmfäZ†"BZÝ¿ˆCÛ™¥øsì¤äTÕÏi#<ÑkK1uæ%pæÝ8’OµÞïu”ÖC톕%Z ½ßHù8Ju­2¸›Ž™:O“Íýö;¯#9:ââK/Áñ·<‰ç™ç^Çþéñ $*þÓùBìÜñFuÃåûâÞŸ<?ü:%¬©›ÏKWwàTFrÓŽ‚‰Ó4œ³ Ö^N×_º5n¹é¦8ÛwVCöoG4…ÑÈš@©ÁËeÀ<§hCƒþÕô²‡ŽØ¤kœsá1ðæ(Lr3Ì€¥DÙ›vÎôdÕe™1šŠB£h·Zœ›*} BÂó¾5…NF¦ø•&Ÿå5üq´üì{SÓr1ÀÓ|7ÿq[îMìÐ,tŒ”­V!Ó7Ìv‡]ñ=ë$ú¢I—CJgiBõZ mO÷£©" —oã¬Ä.ÞÏ:7My™ëò>µ¢˜£ÙçÙžX¤ùIÍ·2RJdNæ˜ÉDMº]" [séC [Ä!5@†‹Ì3íÀ k¸ oG ÂáæÉšEs² ‰ášVˆS´ÍõÃ4nØÂ8}«„6Ñu¤6hú-‚×ÓäîHGÙ+Ét`qÀôÐÌÐ4I^6ÑDʵ0ÆÚN+mô<¦ãðéÞdfGw¿úgÿG|ù®_‹k¯¹Šû7âå—wÇÏïùVÌ/[õ0ŒÚ𥏸ŠK⣹“éò:¹MrnÃäa R"Ôß7“hó¶9À×5<ÌØ3¬‡ªÆÙhj+ec£nE[;°_úíOÇÿûõïÇu×îŒ/î³qß}æü½n|³u8íM½xô±ÇbëÅkãKwýzÜpãUñwßúN´×¶Å2ÆÀàÒö¸ÿþG°æc%Ó›kZÖÒ¯¾?Øeq9A%Ž”ºÃ–èꬦz"ŽŸPcbð*Á²"‚­­+ÉsºzÓWá@õ[Š¡4ï´›‹<'V´DzË*€Œ ¢1ù½GzšêiežÎX_ ,çk‰>&Ç8¡M€+Ö3Wny,2Õtðà!l|ZžR]’±ð8p8ß#¯ôɆiõi5à´t$öÀçPMâT+¨†áˆà©5qO•9©©ÐDZƒ‡‡hÓÁÙ­“¼¥íW\•LÉ&íjTG¢Z¼/>õ;¿¿÷¿mLO=~ôL<øØsñkÿñOãñW÷D vþ:2›I hÅ ØIg| ªÎ¶õ5³}ŒýíºêJ::Ä?|ïGY’Í¡Òb6X“ÒY&-ƒVúI4£ì¼Y‰fj§}v,7…Î\BÂ4,’¯Áø.Ï7× ¢`Kh´úÕ&‘ˆ€‡OL³`Lœ'¼ƒÇ¦&ÉáÚ?Û×;ÓEèjfe{§]8yY“Úœ\‰wªYù^Á¬¶ctΤ:ýMÜÀ³0¯øÖp¿¾-Ÿ©ËÞ½y¾ÖЉGl¡$×áֽܹ¡›ón>®[ֵʔ ˜É­äþ\£Š·ØéÂî™ÎÎ( øKS¨¿07Y®v–Ï"bÙˆÏl@¯æ«~4?fñ5ÙËÜà…ɺúMk41™ ó‹_>½Ãýœ &´îi†ç7aJ57´“¢thsz†ü=ÇJ´gÆÏ`VžÅ„#_Î2SƒMMh?S a¡µ1²Þ¦šÂà¬dZÚâè±CqïOŸ"7¬sïb†'lÛ?ùiZ³t3µ™|LÂøæ½êëݻߌ·‰ÒõbôÓxœás¦9=0p>N?/<ü\6Èo4ËŒpJ¶ÙCŠu$³bIsh6šœPë+ÐeZ&VNâM }’¬vžkã¸i f(gV Ñ?5¾JL_Mô’‰ÓÖ¬gÍ&5 vÄûíuMã?¸·ƒf‰TM#eÕ§0ÁÊp_Ðפ0Ðy>N”WmÊ 8NšudFóX¶8HÀ¢ºD¿ ¾ˆŸ.æ¦Ä?­ôäùáxïÈ{ñêÑ+RaÐÌ+k[Èþ/ ‹MX Å®kÒô9úºxLŽ–ä¼m¿ìöؾýr¿äI=û4¥,ocâ±>ò¶íí¨C0  r ˜2Ý óÄ*»[»a^ˆ¯}ó$IÒî÷CŠÛvíd*ËuàþÎxâÉ'èOþ—ñ*hùÿ÷q »ýÌ]¿7|âÎøý¯|9êÀÙÞs}±û}qnx!=ƒ‹ÑÖE«bç®Mñ×_ÿÛØGÇ„/}ñ·cóÚ‹¢±cU8Lò4Nþî5Ë£ÿl[|å?üaüäGOË•Öxî±W(mÁd¦÷þ¬(g ½~>þýÿõ…øß"G°6:ä6Ö7–a~Òµ^ÐÒSÊã.’ã‡w¿?òœC7 IÂ(CuÕtH_\بam‘TQ§Ê¬|“$3˜NSÇèNHÿ’ª«‘”R c8([ALO +.“•š“:ì8ÉÁ—àô,uÄ˳eˆ¯L‰£™Ù€”©£ ]牊hfºNÍ *¢(P^殬Y»`1^xþÙ¬›Ú~åÚh%rñÜî}ñ‹݃&qíõâ–[ÿu¬[»mjyÌa6þù_|;þŸïü„·F\ÞÓËšš˜ƒ·œÒɦÒ@äC$¯ àr¢,¡¦@ÞQ̺q9 ’©Åzìj">ˆ¿&¾VAØé\…8û‡ÎãûÀ^‡¨Ìÿ1ÕBiPtz€ÙÈ}‚j…ƒý–9–ü¹4ÿcïfçYê®éUÒ4õ^,Iî½› ;$“B !B >‡R9 „PíP ¦ØÆ`À[î–e«×Ѧ÷®ÑÜ÷]¿DHžûÜs·=š½÷üåû×·zå+ö‡c M0£O"$[“íŸ$Ñf•5gԈߞën)T&hbbí4SU˜”i"¾ö…8gUTòbw_‹‰ÎDVXˆ{J Gû‚U(ˆ v}1 H¶ùî©{î—šKN§7ל‡1dò'k·ÐõゎÏs˜ù1 3æ¹ Ù›anÞØ$ûmZFYÓ¦¤èGkX¯š²¾¡r˜q2*ÖSÔÔñÄà›¹oåuóÑ}óˆëVâ‡BÉ-àÄz²„‰+Èûõm‰ïæŸÙx.›ükó­jÐú!âçÏçr¹cî]ãyxæeYj³»„ K®*ìð ­Û°l¼&_kêùΰr:/áäs –@Efð&Òc-°O‡®¬›hfV;î×PâB4ÝÎÌŽDư™SÌÎ’”œœZðRkV£XŒ;Œúæ«ê›sb}XŽ?Š\&¹8ÒÇÏÄEW/Hñ㇟Œßq_¼êÊóâ•Û¶âX¼æhþÓLüð¡'ãþG‹oo6®Ûº1–‚HM´‹hÀñhF±y+#8Ð{©°GÕ×IjÒYÖè±8'ÈL#¥Ï"as”ˆËI´¨•L½¨a³v;Ö;Ì}`º8ùz1#+Ëš€ ñ 3cvÁZ€‘D…Äçyt–JèÜ…9¥Þ#ƒŠä÷ÂÈa¢ÂÙ—Úì0ð¯Z'û"£ƒå'›o£)*œkŽ»˜Dlq°Áý4®iŒö9èAÿº÷­&ÙR3^¿›~&Ž/_Cf2¤(k¡Î{ê{R³µ²{"LÃ-—ˆåûö ÓT­Áá½}’ÌYàhÎÙþ£ûã‘=»¨Ê_A’.#Îù[ö4>30%Tæz N˽2ð 8×´k×ÞøéƒÆe—\ä­y1ZþÞìÛÔT¯È׉¾Ø¸fUŒ—á_Åœ­ÂwÛ~¯Z߯Y‡`‚N?ñ¥ïe•Þ¦ÅÔ|örn÷ëë^ozÝ-h#M\w,îßû÷쉣‡‰:¶óŒTôánh\¶³–„f~*)0žap¨Ì½ ¦gÚH/¥_“ã‹â¯ÿ·ÇšqÝM7ÅÅLÄž]IVÞH€©+t¶Å ÷…ÔùUA¯º#œ}8~¢<>ôñ?Œ·¾ùeQK†ý³ïˆÿx/:j£c7~ÀLÜÞ-qþùZ'àMŒB?MѾy™z¶l€ÿ@5s2rÄæ$#Q”(þ ‘ Š>Üpr$Sv1”HEÍjX f…Dàu4]Ä—À3_Fø¼B¬D¢(náAÉ 4U”TšwæLñ5Ëâï„•mkUïѦ@XçšMÀȪ/;Vg!µD郞Ýù<’ÁÎV²‘×20ŒÔ+6¯ÀÙØ“TG!Òo|¹Ÿü”§!e€Dµ×\%!Øä(²Æ¹?JÞSwû3óÅZ6c®‹Êu+ˆ¸ôÅäñÚ½À(IÍ_Dè÷ü Ì [³!žÝñ4Ñ’Z¤CU&úÍÏÅæ Ï…¨ªâÙ'vFÿÀf"v8*oÂÆç•  ‰ÆŒYuIÍ[ŸªéÑ``&fµ›2QL°ÀDÖð~„çHj°ìf²ÚsYäÆÃI\\Ãi7uŸ&¶ðÒ9‚FWí¯Ùm¹G5ä5ÏP yœ-^eN¨¾`¦÷ÈÛĎĆünŠW¹DÆ9R娨$iœþ[äYáî:íZ ò*TL 4–B¶2¦œŸ€™ Ø±–0¸ø™©¢Ó„Ë(1Ó„/Áä6Wæ$ƒ2ը̣™Ÿ'£Ž÷øàÐërÿŒJ™¶âàQÍp{Ý«©ÔÂddtJ5M›ÎÍ*|`4s´ýiHdÝøcžßýB4ÁÜ,·‘ ö÷dÇôý€_xúòî[â.×)fÁ1å—È¡©ÍäÕ 9CÛn߯‰âimè=ûܳâlp©s鉙u$zü9®Jp…jˆEhð£à½Õj·ÐÌÚúîi¥½ ÌæåW]¯ù•WY¾©àÙ &ücü8¸÷ßTœZ€C»¾‰ò¬«ð÷òwÜ/§ Ë±Qʺjº ™Ôý$]ÆØ(™Ùwã±§`믋?þ³OÄgÿµ1Î9g3e0ô°jÛ“ü MKµ¤´÷|ëfâ­Ú_½ë/ãÕ¯¸˜º»Ö¸ã»÷Æ GzhŒó¿±‰áÖeŽ‘à¹ _c¼â%P<ŒMª>ŒhƒÉØ,ôdóô9ˆDà3–HÄoæL,u^ a1«õFîV’é©&'v‚;¹ÙÕã|Õñ 8²¹IrûB¶˜0§äïì5÷;Íü@lH–óS´dˆÞlo}Uš(“ã}¨Ÿëcñ²Õñ<ÕÒ;°‡7Œn n‰,_˜“…±µôŒÊá¬cˆ¼–~Âúƒ”¡´á$ïèŒ/Ýq{<ß3¬¦cáò¥±fÕjÜ¢èëŽ?¸+ÖŸÓ×£±á ¿HÄm)å6-„bÇcçÞÝ1¾¦³—*tÔ_Ù¦'ð--œŽ®c˜ ` •öóHÒUøºL]â¾G[O`Sµ½°IŽãa馯¡ÒXh®0·`Ø8LÓÅHXŸLJ¶•›!ôx.éú¦ÌñÑ|Êœ!×o¡Ÿªu—3’éaIJ/î þ0£™„×YG…ׇ¥ÌMàŒ‚)z]˜÷ÖiÕ»ÌÎA ušr,@-JÍÄW©à·ÛBŸ‘sGIlá\‹{5ƒ¨E#ÙØ,ä^ˆ“Wíc„|7}Os0…3LXíW&Õý? ­‰i…ÿTɩ椦oxñpþ¶Fæ¡£^©Q?¿õpU'é|‰¦ex^égê€xïø'Ó$Ò`5ñR›ø¯Ë@˜uöôÄ3ÄJ‚9v“œ¢ý‰‚¹MÕ$WSlôõé{•V’¹»]ü§0™DãwßR0M‡†¾ÞãÑØÐœõojåºSjÈ´–Q‘EŽþK›âªK.ŽË0ÿvïßßÿÉöè#³½ ÓÐá¦5hRûLøÿùþvÜüŠ—E³I§0âi"}‰£íí±÷Ùg‡>€èÊ•!AkÙÎ Eê]ÜoˆçA˯ |¹dÙþ<ºt6:]˜ü@²4¥«Õ+Vzs@ÇüÇ—ãõ¿zK'ð®¯}3V®[…ÙI;„âÑÃú/¼þšxÿ{ßL¢æÆØ½ý™øöwîû;@ƒÆ³2hR… © |lº7Ž”úïuÆÌЯÇÍ/½‘–Jp€4q7QF…¼å~@7%ý <€H̓yn‚ÇÁ¤€»g$A&ž¾G[Äêþ›pé5E8M«ż9) èˆ-w!ày -š,Õ|ð‡ÍÕDqsóÎ ™NQ‡Ø¬l’š·Í[ân~¦[g|ì?ˆÍKêÉ9€Ï€$0rO”꣼÷³Ú¼a¤xkPÒ•ÖyœÁ›–5à‹jˆÕhCŽï8¼+®¾é†ø£wþ6I™äÉ`²8“¬‹:>±=:Ù˜Ýûľ£öâ!’‚Ÿ#xi´u´cÞRªÂZ•î‹ñ)lÝz­)LØ{"ºûðA‘û%Ĩmž<Ïbš©= Ë*˜¦¾S$„¯™fGþ†€MÔ”¢ò3Ú•Vakª„ ûöð²—¶v£HÓ¼ÏR IPÆÏý i֒ߣIn¶¼SI2üŽ—P‹.¡2+Ò(ÙIŸïe:gLKûM¢UZ×U«cã™Ñ˜L³žg:…fS‰öSÎ>œÂ ]G0¨‘·"e9D¢_—qúŽi Ut/ г(k¬0‡Ä×djŒØg·™Ù)ñ!i‰SM5A‘„‹ð`@fF+ùÊà¾i2³ÏúAeRævªÉÄœ¬;Ï1–Õ™3ÙØ¨¤ Å'}j|f§PˆJ­_)µu¾?ÓÎW?ÛÇ7ⱎ,ga/¹jjKúü4‘=GT Xá«õpkìšÄ¯Éû„Ù/¾â2$—ÆET-l\½:ÚºNÄwøP P‚ãëÆk®Œ_½å%q)_ƺÏìˆ=ÏìŒ=O|?3¿™FE­èù$:6àò0 Ž ©Ø wD_œ¥Ïz]~[LLr‘:pŠWÕNÄRökhW›L“ްͺó|CuñØ3L•9tØIF¤7Âèk`JhJM+ãÓ_þ'¦p/ÅçJ¢iéLÜùŸ_ŒŸÞ³=¦èD²×Ç>¬èn F‹•2E®cÙïý½ñ§ùY„öÇ«^~C–ü°MƒŸbãôš((gñ44÷²!›É—`ÀfƒÌ_QúBƒ°Cýuª¸†‰ŽÚl6޳sN>Ó¬T™Ø4’D gHܰab‰ë‘Lç^_U»v0W`&dòÞ‰5ö!-Çai]šùJUh jIjõ2óE˜ê5ÕŒA_5•Dd™~š¿ÔìÿÅudfvøtF¢EÃjNiú縎6Á8ÚžÅÌ>³fîæâ‰zy=¿+Û±èÞžjKúÚ2pÄ>€œ¬¸Jˬ!AC&²jºf玑A“: Ú-ƒ)übF°[Ðà«à0Š{Ú¢³µƒDážmTÖÄ_þñïâ­Ã÷T‹©ŸŠ»îübzá'hB0d†l֬܋X§NôÉIRZNÑ%'÷Ð 0˜f\;åA37ªè-ÞÕs„¥ú¼v°ÞrÑ«èX°XzJ|È_<‰¥Ô\ŸTÅ{|Áu-h>ݱfëúøØßþE¼ò%—Ò‚û8å.±Wƾ}?LŸ*Âqœ«Q×rÉáž8ÄbýjºY–¬X Øüû}?‰N´é¡î]à@-tá ”fÖ[i£xsÔjÒå&¨.ƒÜJ&M »ÿMÏa«âƒP¬ÒAÉýN¤€´:dËÑœÆ!aDuV’ëÒYjÔÃÔпËA&ÖåXêQšÕ;zfŒˆ€MцõEÕ Šqáºåqÿ’•íSlþ¤Éx »!t¥ÒøÔ0 J“²*¯XŽ­OÒÀ±vªÉ~´¿*4ƒ7ÿúcýæ³ãŽo~'>øçݧ7j~‰M˜‹’$Ëfƒ £1ŠœIF´W3Újû¼n³ë7žÀ©Z‡1-$3Yica2Nik5Y xe˜/éœF»+ÇÙiDÓ=P@Ü'q©ÔW!ë4ëÕlõqdƾìBiŽæ¤öÅ幄A:™Ã¾O\4}Qìh:ámR ¡¦Ðamj»vb˜ò™xN„ÎÞ)¢:i.A©N¦Ñç§™§öt Ÿ Kà{a-CPž˜Ð?6¯©„z?e£9¾/g^Ü$&}vºäY᪺8ÀzyV3ï+µBh–çá!0‹ç¬r &0]'GØÀTä>¸¥ã­}~À³hVð^€K2{³Éí¶á,ªÊ¬ÇuŠ×j­…‹ÃbÞšU$IÄóÏ?ižç°pKB•ñSYx>‹þ¤à†üŸ÷SÓ1A-À3ØÇf¦'¨½ÙcßóMdöú^Ûò#ð «HWpZ%°;z¨&Õ –o·q],_Dðª¹è:º›.ßÃ$C[®]O(¾\Ãg7n`–CNÒý™Fð팒Í=; ãÃçYFµaúi ¶^ò{ogmD³5kc¶*|tGüÙ{þØË0éFFú2®@×J@¸ƒeÀYØVÅ?þãaLL8Þó`Üþ¹OÆ@/)µËIÒÜÂ}Ëâ`ß ¾X¢¬Àp¤s Ž9Sš‰~̉9,¨iÓâðnÜ$+)8®^0åƒ6¹‘ {)!tÙ¹¾oEØ"Ä ÐA#pJ†Y.< —0âR†›R\ŸÎS7OieC/‚¸pt¥’‡iú¤­ƒ“Ù¹±NhM‡/ÒÚÄ ›‰ÄXéß³ \3>÷pp*Ž~ãÎh^µõ“6¤„tÍ㙄À Á( !§y£ëÆçc3-ÇçÌCg炜¼1>7¿ø—¢‘ò˜ýÍ?Ƨ¾~_¬_Ü[ Ô"CDÌÚ \­ÃÄF(V3å‚gµ]J© #¨Ü‹V5ãO©çö%׃@ÀÖ—9$ª‘ Û“pöNõ † RjE_XuðwÑØ'l F¨O&_FîOEãâ×W0uuJÎã?¾Hí]e&)f ƒc«aº»«|ÁŸÔv¸B"sSXoÞýÔâôÍ5ëÖlß«æAge– ‘¢‘:i®á±v40™1Wå8ðIÔ+Ëö»d‚sœùLõG¹]¸–&M‰ÌÍAŸ‹x¥6‘þ ®iv±ÝT>DEäƒ;wä#ÁŽ NH@IDAT(5E'Æ ^PµOÿ¢H¢/ÊZC þé’+°nµ ôNÀA«¯‚ð2+5›‚‡9½-ŠÔ€ƒGAÄL¥†ñs@>cÎþã:é'x&qA˜4âæ<7Ú?õiÒâcdÝ2Ú‚iákdýúeHTÏ—ý‹ìmdI8™™>5ÆýøñHÒ´áß‘Ìc­­ñc»—b6Ù*ˆM¬=“0Á÷¾ÊU¤KràÌ ŸPp`VWCO5¸]öÞÏ=Y'¯ÏüÓ‡cÝʱ´q™ˆ’ÚQ9é›hÒ°f=¾«šøügnGôeŽ^ÍëšyJö­È0)AHtžŠÛïøTÜrýEÑCÉÉw¿úõh;Jžé\ ;T‘p¹˜ÜÀáé!"CÑÕÙŠ:‹¯ÉlŸŸÇâaŸZŸ‰·þͯÅk^{Mì}r2Êbc64!ñQKȈM UtÍ7Ò!ˆöë–'ð•463·A¥4{’¼#~Û8 + ÍÎ e¨qéü-"'„Qϧ‘¸œ²€Jl†Žï,¸·5“dl•ä­>ûœèÙ{8ž8q2Ö5Ó-Ö¦ « ·OÕÐ5 t0É@¨R$‚‰‹ªÏ6<!ŒÌQÎ14FV/ë‰ê\O{{ÜpË-$X.O}ú ñ©»~m\'ÚˆÄñ` ™CV…Ÿ‹€`Ôð|΄ӌš#ÓVu^ÄVµ_ €HaëÖeË–cL3‘ƒ$5Íü›4}Q©E $£aƒ˜—$¤O€ÆšI2Õ|£PYþaiJäsK3é…YFCSƒ…AÔZÇ6 “™ÈØÒÂÕ(æ)6¶5Ãï2/þn+k«8DS’åpßóÇÊÀe–‡˜T(ÁÙ^wܨÛ-R¿NëìÜÉí¶`.“ÙÃÙƒûW}‘èÈ©!!3›Û„vÎ\„¤®ÆW˜/îËæv¡ðrÈÁ)UtðÆÈbš‘`ñ3§)y5‰QxÁš¹—‘1ËkzI#Cë2ÙW!2Oª\…“êX[/â} â¿èÂøµ_¾%¶ž½ áY‡Œ¯ÿàÎxî‰{V# k㕯|M¼ø¥7Ç«o~%Mí΋ã]o?pw|ëëwIJØ7ÛñÖFûžñøägþW¼î¯ŒÑöcñµÿ дψß90`ré°&Æ`¨#0ú#'ÚØ9q_';æò|¸†éÜ1Þ1ïøà›±b^I LÄ^}§GŽ•ü·ju3EMfSÕ*Òüb3NbNˆÄhó¼w3<€‹¦ÿ‚M1ÊL¢ÄĘè*®ëô ¥¥yJe$ìUC„-Ë© Â4hkïÉÄÂÆE0/l~«ç§ 4á§dƒ_ó",{XÇÉé.rgcöG-Dd“~Ͷ‚lÄRžšßüÏ{5H ÂP‹†ü)g¾Øv•5 Wþñ`˰·k€%&æÝÂÜG£z^Ý‹H¨Å¹œ%ƒcè—ž\ì‘Z’Gå®G·½»Í•ªÆmi_ÖÞq=t0˜'ëRá`Þ×ó\eøV,²­Ç<+A£¬@‹åRYQ`ôÍ%«àÚ ·…ðmÊgU@&aš©À~f‰•Ϭ \GÈ\á6NÍ€s“¸ JðרtWƒ«A•Ò²DŸì*Ï ¯/~²Ohav?€ƒÆ‘Óû\ŽQ´|Z ÷l}Ìf°‚Ï3àÖ’$—4ÑjF _p ߌþ™I˜„Œ/5-öO“Ó)Ã6lŒU+é«Ülíó.#27D ‰é ÂMÎê¾êÆçZ?ÿêþî¡0±z´(™kÖA9ÚÚé­ÇqP‡?kÖ6Æ_½õ½´ÝÝ–72n2—Ö¶xà០åì§·6–o¾2l¶Ó%F?O Ì,ùy‹›VÇ/z ä6ߺóKì}áç«£}ß¾ø½wýQ¼ù ¿3cÇ㋟ýtltOÔ¬¢†nG7¥;;‹ùØzô0Åúýq ŸcYÍB¢€+b'k뺟ÕAïÍoŠýÓ«ã ¿ö šìuÇO錇|,Ê'(X-£.»Ìt&‚¦j(:½Õ¡ô;ˆHz§t:ÎbÃÖcú̃­r¢š›Â ‘‹$ÓóiÔ2ü¬IYhÅFðn iultt4»_÷tíú¯xLî‹é‚ib/.µÿ>>Uãr°§´9=r°*4] º4½+!òšz´2ò…Ò/ÄÚTÀR;åùíUnKØ*Ô>¨R7ª÷2»^èÓq8ª~™º­|ö¬8¢O ƪp‘_øüùÌ<·ÚN-æéò¥KpUÀ€«~Á*,$Öß9ÿ3[ù°9‚SP/Y±,ý´hdcý¨)<¸‘ºêÓu—xRøês­^uôfÚºi…¾kb¿Ï(9~ø ]û̱««'žr/©‹¼†NÛ‰¼ýí7¢ýÐ4q1…w–9’ÍÀÐ^˜Î O>{øQ4oº>¿2ùë¬&e¤·a’2š=»v±©m8äAƒ±”î³´Z.+õn£Œ­z |`&¾{÷½ñÓ'vEÓªµ1ã«·¬óÓäîî8ÿ‰r)´Ä)o¡ýÏßøã›)RþhôC;;;ÎÞ²š>W{â›ßø̳>Žlò^vVÝ…øaDrîdLFé|`¡Ê7(P ¦;/ò:3ÌŒ`Ÿ¥Ø÷6ó·Rë‡,ª7€6 r¢Pv–»LkÄÒ9õ€kH̶&VJ€<£ƒdbÆ۩ä'©‹*åF4 çÃC¨ˆª­p`˜˜&¦áÝr6¢L”ë«FO 5M[X„?iêoE#&&6òf—ÄÚKŸ íO=žˆTOêÀj’ÙŒ‚̃”óHßi}t×8DrjŽèV³ÛJרΦÅÍñžwý~¬ yØ#>Ìš‰ŠL-ÀüÓ‡¡ÄçÙ¦qZËeˆ°eÖ^ ,Ì÷šf¡ð =T‰Ÿk9ÏRZ³@S" s?därù©w¢íªEY<+#¾êLš9À}ãÄRl~;od:…¶ª¤WÛÓd*˜ŸY³æ¤§ 㺹¾Ïbçóâ$|îÀä(Õ”O±.‡øãš…½Âd‚úÂÊ9Ì(ˆJmºíÉ.†íUëÒœÂo ³_“K\ˉ3®%#b!ÙWÉ5ñßJœìªõÔ¯øý)r$qBH}##à,5[ÍÜ 8!Å“TUfÈÃ@`gnç!ÍÙ I"LÕ8Üu#}@™רÀÆgæ<ˆ¬ÆUhC2wÍ85<ÞsL|â6 pE8yMó¥ÔHô#Nó9Çœoͺ"Cš;Ù¦øXëç4{æ"Øf\#¹šVÎxœ·n…&eUþI´#àÀÓMà(Öáê§RVÖrr qʨ—[騹L ~ï¼ëIUÈ'h12ƒ$†ìÍöö½æò<8 Þù´jgæÕYФÈ({¬³<¢ÑhÆ$œæÇ)ÃüeøÒZ!94³»«“óaØÀŬó3É̹OÞãô}XÿÄèe¯%RS²ìÌóAP>kû¥+$s²H¿éï9N]Ús”§ÅÙ¤-EÃÒbf]#ysu˜êˆšµÐéßçbz)U"¨D¼ëð¡ØýÈ·bdÏ©X|᪨]DýÚ²«ç0‡éØa‹!í„whõ$…ÓQE’(®Š £±òD\´iŠr™f„LâOkA[cc[¼öU¯Î|½Ýÿ}|´¤DÔ"Øglyb™V¶ƒr–8IW}¦•0¾c­#±ùüKã³_lZÙÿøa7>†‹¨)™c&ò²•D…Ñ:çÊT"@4£8ìr*IEÔ`¾ŒB€œvQÔ!« íKŽmÏeh“ ´Ép¨þ&P[æ`¤8ƒ˜Y2BŒ@„æJXQJÓjRõ{:öÆîÝlIYR±I¨íJ^C¼ãHÇ5ÕÓ+g­.¦ŽØ$5J©ÆqIx¬ÛóÃú P½(ÿ&š ‡çÔsòêÉ“˜¬³žºzœéƒ]{ãÅ/¢ýèïü*-³Æ¸ïàÁèfª…aé!Gf³fˆ5’eBæïú(ÆV­¡à‘(D”7q?`è+ÓÛFš- ßO BŒ#ø"Lu½€MŒuñ£”=‰c³z¢šœªÀ»’óÕçÁÞ'#br`ÎãÏüb—x¾IˆP‡¸­W4§tW«Å¶/‰1; äÞ¸Ðîr ¦“­ALš•˜rAÜå†Û¢@|úî˜ØÃ^ÂÌ`30]GøcCâ¥Xæq÷~•Lešœ’ŒëZL%‹KD4¶ äȹ$UºXLm²Ðü8ŽïLE‘€}^ï£ö$ƒ0‘PÆ©ÒS©Ôge}i®r¬&rŽg1jy‰œJ`•é&2-`¬¯N  µ½•äÞC0¾*ðÚ w04°c­ =Á õQI`fw5S­ ó«XŒÛõñ–Wþ“k–YÎB¥ÀE oÿ±ŒüdéÅgUûTëS—rKLÁ˜DO Šê C̲OC~ï¤7[ h}”DëBŒ†i~©& ü9kȰ÷ )[Š¡Y3†¹dÄb-¤¬d*6mØ¿üÆ[ãó_ù6I‹Û)ûh´Råópsµ²Ìp`#‘<&M65Ò`‹^Ý dOÿs¯ð±xouX7$6óX‚#ºgHú2 ÙÜ(“&›éƒ3;t,nxÝ­ñ†×Þœí,'¶µ‹´ú®~Ö‹da=ã0¸a*ÅO‘‰[Z:i(׌y¶˜Hâ"^Óê-±ãÙݹns´l1ÜLw¢ã˜4# ÛTOÂ17(™½ Àå²D?ûûáßi´FžÏhj® ­¥¯c˜RÒúŒ†—mJ :Ìëàe3«€¹O™“NâdBr/®£§c]ÍÒtÀ &'¼ø^¸%£ô¸…LQÆbn˜¯h¾h5å¤(´Àâ>0±̲*½È\D'µe•˜]"è$È&Ã+ES^€¹Zh#$¸ŒbJYà«dçÐŒƒ+Ör ä "Ì€]!4d\'5þÓßÙ.'‡¢ +žÛB\òjfž“š“’ ?ó¬ JÖs²îZ­xµëÀ>ö _~IKNÔÊìpºí¤×À0x`;]ŠãÔeDúÌd®ÞÓ t­î“0õÅ¡¼Èïnžr&†{û£’Äl÷lŒëÀ¡Cq)CAÿýSŠsÎÚ?¼÷Çñ½ïÞMË–&`MŽ |@¾2M€kÞ\B2àOÁ8˳ ÕÙ*Ѹi"¯8gæw¿F‚›¿çf€¸¥0 TÁÈÀOΛÃoê<|%y-$è €dŒ%A‚äº×Ëh];Šub 3–Ñ"ôÝô1Ð=?xþ*±—íãÚ˜HÝ2¤S=y0NÎ8…äê§Jº‘|¢q3 €ÛÀDBMÑúªú¢Å È4-Òb¤dóešA ‰cÙÓ–œÎßz~<óìÞø«?x_ÝœòПýƒ1‡ß©`*JøzLE*½h—Ú€ÍcìÝ>NÍš±4Ø$ÇÌA|'hKa«ý6âlf sDÂ,״𽚖X?‚–2;„Šž—ÁðL¾¼'ÿóž ‘ò,ÂÚ/sÚ2Ÿô÷é?:Iû¹æÆÀÎ8×=P8x Ž—™AÜz¦d8^×™žßªMdO"Ž5¶ƒ2-ÒBúã àïy÷Ì=*Á’8‚™U]MA5ª2cšñ€Ý<.s²*IÀtZH%a~Ë}4½J¨ë2„Ÿ©(˜ š<a¸Y>£°3rçÄ™»fÞ)—÷ÌóYW1àÁçò{[~¶ÙöxøÜš©Å`*¦ý4>LëÍŽv´æüÅ*òýlAíÞÉ à™0Z¢f8õGñýÈÔ³TÇ=àZ2p KíæñÕ{©aªUMƒ»*(š½2ñÄè©•é†àî³hš¸Âße­¾ÔÅ“ á”–¹Ð›»½ÿšy-{] îU”²>}²ddã¦=Q; ?ÿúÍ_ÇY~“5lË(«bŒ8&Wuu“øG†úã…=­ñÏŸ¼ŸˆÜ3ÑxV éhõб-ñ‡oy#“\*ãÎ//kFÔm‡0'kñ›žh‘žÎî§þG ~¶ý‡Úb}ÃYd¿/¶ÒÎåžï}5þó?î‰åd»ës¢x¸§zp·#æñû PMl?¢àT2ËO¢§@WµH þp@è$ûñÞÈši³è¤JÅ2 jqkÅœœ1d5zSgV*bÊkÙPµÚQÑÝ}Ãñ­oÞ¿ùæ·ÆGþö=Qò¾wÇ};ºè§D8Ró‡% B("긄¶¶ƒí&XŽÖDÛȱG:»q,´iœ|ýæòóZBòæ6vŸ“½=Ƨ1™Ô²Å{Ó[ß§R¦bgJ…Ìé\çÖ·ä\~ä$^õëHaxú™Ä¿ÔNåÐ@sÆŠ{Ö_žC Þ±÷ùl9¡ÅÂ’a¨ö ±'÷æ~úƒL=°4Kæ(SòÇW~–E'ÿóyÕ¢„©>%ñG34sÐ8Æ÷ÒÕÏ' h¾¹¯©næ£qmöÓ;d>™ìškÙ8O8jòNÂÜÿ¿^72„à’‹·1É¥1Ö,_B>ÞÊX¾b%40Iju¢DÍ+ª¦¢yùšX½i}\xÅM±íââwÝÿñÕ;c=I”G÷Õŧ?óGqsŸyò‘øò×¾DéÐù‰ã¶5Öl‚±©@dW*3ºèÊyþYçÄ¿~üoâòK6Ä÷;¾rûgiѲ±¢_7#©ìÔ1†ã^gù4.E’øH`ÈÝæÑåèp"àÇ&©ó„%X²- ª&%Ü'BÍ#u†ÎâPË¢GÌ7÷ÕBÊ“n¢U*@hšpS6lž"®3AU¿ji=döìÙ_úÂgã·Þú–ø‡}4.øÚÝñ…/~#fX4^ÿ*Ú@à»yèÁb׳ÏÓØ½¦ˆti0©ô-Á_¥ùá÷\pIœ³™ãÙßþþOb)ÿ&`P›곿‚Ãs÷ 05‚Î|\§™{êD_AW²¿ãx>³£“y4¯ÀqÕ± ÇèªåõqÞ† ÑÑ}<¾öýûad§°KdÅWRž‡çLÃÒ©¹ðÉ—°døKñI‘ý‹ør ¦3'Ó×4AÅ­6ƒÂ*®$=sµΑ9i–ñHICKOò€jo&;ZÎQžƒåA²¬Â›ç"N/„íR ~v ­F3QÊÚË`ʥ쭎ûy*Ê…õ™Ï”'¨ ;˜°QZµþ € •鬣ýór¢¾Di:ÎVìì<ŽPD“dÝ?3Ù'}9â£Z‘×qxkSÃÂØ¶å<¦òСNrrÊÞa0]nk-žm©k(a²x»…\* Χ‰*nèñÂÓÔ°î✈ò3MŸZõ‹cÛe×ÄõW^çl½4ÞúŽ?DÃY~×ûâCïÿûx˯\ƒhF_üâWb®j5‰Ï é( ⺢¡ßIXºÔˆ ïLuÅ»ÿô6ã¡¶?_ýâ± i{Gá1ç”âp@Å$JEgg9‚mÄ›š–«+È&ô泈òz9Z–E€\`)@Te5aM*>„’}šUÓA:M›Boâœê«Çe>6÷¨Š{Ôc[NBíí>ÆB(õ˜­¡ˆ™00ˆV_ßLW@¢^_ÿj¼èÕ7Çën~yj/ÀIêráæuñ[·¾Ždµšø =½·’ðóøÐ„ìϽviCæÐTvÂf½pÃÚøÕ×¼*.$ VædÏ#Uçl!û³'Uµæ‰ ù¾°ûps ö{ÒhãÚ%qΪå0Q ±$ÚO™AUµ…ˆìÙ¤¹%$žµf5ÑÃ…ñow|#¥£Ó“æÒ@0€ !Ș/K­ã4s-PŒ/$nž’ FI«ƒÔ®9{ͬkm6NÐ<á54=Ô2¬MK–{éûѤIˆ—g!6Ö!û‡¦á½¸ƒþAIÊ•ä|ðp÷^sI&žÑD¹ _YƒyŽ2kÓÜ{µ.ͽrFMèð\Ó:µmÛlmŸ“gìN¡Vn´-[¬Àt$«AY§ŸL”34/~ÉL¬¹3'‹[s,Úš›Z9‰óB#5+˜¦C 3V ¡šWÓÙ˜~‘¦/Ì G&÷ ½`‚Q¹^ÂøGÛŽà·èyε)51þKFÀïn@ï=¦Ø¿3ÿžþíâó/2¾ã£ã³ô…æ/Öeµ„ô´paÌ‚ÉÄ´>©Å÷é}µLÜœ"ïpšN ²"i)/$sÊw<){§¯oýºLøe<xºš®&S Jõ“‘wÈ1õD¾jq9táië8Ï=×=Çžf ÖF“[—Å’‹V±ßµ±ŒvºÓ¸9šW@QðwïßììŒkn¼˜Ô©É¸ìE¯_£YÜÜ©¸ãöOGgï8}¹Öun¾"ÓÈ¿êïêöŠN‚1hÇ­ôyz÷;ÞÉœ;¬’GïŽ/ýû—PXScéy,þ,ûyôðÚ»Î>h¦v`k±_àôM¬½­h‡Š‰´Nð \. êoxX º+'yºÉù¢ˆ¿N__FO²¿²à˜½lòœIp 48wÂÄ®];È<}ŒHÀ|´vwÄaŠ—.fTQÖ_1X€>Irõ)TBÃî•0ÍKZ¢mÿs&® ·nŽ¡ãmqÿS»iȵ{ÓÐ ?@á.2ƒØX¢£ñì÷1L¡‰u±lacÜûðv˜HC"¶h—­YxžÔ`¬®·çýÄ^OÉÆUËb1›}Šœ:êš-~–õ˜r›×¯!5`1RÖþ<lþ@Ü·}7¥dJkšÀˆe`2úIù ³€ 90å-ôcþè( Y  ÿú9Ÿ*bæØE`Kæ“ 5ŸFWn’&ƒË¸¤ž‚°Ó´áûràSîDþKAÂþå>ÊÙ\:ÍÒÙ®uÆ¿¹FA£e}à,Ú¼(MÑLF„x¼5~NÀ©f$¸¦«š´ÄýÌíIÀ¤Êù­ÃøŒ™f!v9Ú§þ£F6œjú–,:NÓUX™S1͇)¸8Ž¢ÖȃKó£,Æ!ò„iãpMX…iëäw:ù¤2·"Síb¦Ô×"¶Îþ^h mË{ª9ÁH„KjÙÀ7a{z= ˜Ü<…pVÄ/÷[fktÖÂe§ iŠ˜† IªÏ|'µóæ&é%îø°ãö¶µ§OKfnŠBLFæ•é^ŸÛ5‘NÓȸÓv¬5ž~äÁh=t_9FûÚß¾³Ò¯G¾;Ÿ~0Ž’>Î\ºªzJf¯!*ÖÌ}ÎúÉ âÇðòª…ÀàyL šã§ŠgŸßÓ3íÃïº56oZ÷Üûõ¸ëžEÕ‚UDpah¸Ofdžâxëèéî¦óÚŒ¶ ÕYK®Ž¿úó?B‰Ï|úxgñ/\nÑ÷ ÚCD↡ëÃq:ìÛ‹r=‚36¾«Á‰>†3¿ì¦‹VÞ–v1.ÝøÀàQ¡›Ô¸È ·Ç‚3)sj@ (•ÁÀ$v\Ä0 {Öú³â²‹·Ÿ4÷<¹‹ìlF3mÛÌl¸_&w¢"¶ã§ÑƒM¦ÿ©­o"~zïvœ”LkAÍ®Dj"øhšõP\rùÕqÞ¶óãðs;cÇÑã4äZ„va·G5éÄ…X”N0˜G¿y4¯¡Q¹Q»™O Ú\ŸˆÜ]©(ú'A{3ÙNd\¯Š ³šÁç4‚V¦ä­ÙlÎféJ½æê·¹CÝdùÞÅÌy#7Óæýðìiøê£ñÚP©~†Tþ%&þSÛð¥ù!rë4t éï“añ7 y"üHYÒÔZ•¤Æ"1˜J¡é]¬_í”äUÌ!‡?&Bs]7,»h²á™R€Æ “ÌB`Õ$ƒRØä²iÂùµŒUy ˜÷œÁ/2ƒ³4;bÊ:Ýc®;¥ÙÅzLvä 5Z[3rº¯­Z¬Ñ3 !Cª ÜÈ­>G3 F•ò½ F“+ p¹§“…Õˆ, ¶ Ég5ëZ†1­f%…‚àŠÏ†èϮø‰­ÆdTÏ—ø©Ê(2ßMšÛƒv‚4Ûw Ò¶a§ïJÓ+#€ c˜‰0–ɸ–ý„]^ÙýÐB&2mS lG%>ÌIwˆçµ¶1Ý‘?qK?QLńҮÎÎèdžÚ›µ 2ΘkáÀå cåqŠKåË_¶Áq”û(©-{îînGÀOæ;I‚ñ0¾Êãíí™ZRÑÄ\Èå¢ õÓ¬ÕÁq˜¹Ý  úp[ ¡5]­Äd4ûÚñÛnyQ\}Ñùqÿ=wÇ7u²šk±‡šôSø‚ŽwDo×q¦,±'Щ#áûOÆg>ö!ê÷ÖÅ¿ð êê:˜«·œ!àŽâJ˜öŽúƒ$^ôÃÐðëòLè¸àacÉé@zOÙµç·Ü& YHÌãË_ø­ttóý-ªŠ´E9C!=঩‹Â $«w#QC¦ÐTWÏ>k#¡ÄspȵPà×EÑã¦ØH»“[^uSü‹®**Ê¿pÏC´2 ‚е- Ùxn —\DÎŒa†ˆWwg{\qíµ™/ñüãÅÞ®aÑ:6ײÜh$7ìÛûH¬†1^uãåq÷ƒs9ú#€ì3 •È£V ÖÈi Û\¬GK[jk4°)Ô~ÍÛ˜Tàðµ‹e›¥)wË-¯†IÒ…¦s;ƒÁ€À0!“ˆø-üò  ›+76!eT¥BäöÐ<üôšF2%{G6êÕ„Éõ’(¸ž÷5Þ€„Z‡fº÷TûPÐTž&VŸWm)+€m‘B"ò7t›3bëQ¬I§œ3åàõü Ñ8Ç nÛ´dËÖ¦”æª[ó¬Á–'šš2µT·+ Åñ Ž6®•DQkHn¬ x5çÒ Ò2#sæ’Ù°s唕cž3芯¾6È7ý†é„çšÜ˜òüì¥ Ë¨æ„YªGhúŸ»âFÌ’X8N:Ç$š×(‚ª‡DÅÖîv|Ôâ±fµC™†ŒÉs)ÅÔVð¥ò¬Ž{JM`4 )/ind’Hc¶ÛõY]“æ¶æÙ4BÛëÉP f¥¹Cv/¯Ô r24?÷ˆ5ûÛíS|¥“ÄñYFe·†˜‡™æ*µd½lR@°ù¹6ÈÓU1 BŒÃ¸ñ Ñ‚wÆÕEM+ŒdAãb=˜fj"YËÃ0aVÆ”C297Mn¯y¬V¶Ðòˆœ&Þó5Ç9½£HP:‰-›çË”@nI uÌ‹³;@ š‹†y1Cn]9Ffå:•<ZÆïœA3¶³d â1Ú#LÔ&jp#”ÀXÒŒD©‰¤¯¿íÁÜÀŽé1uöOÍÉžâ2vñÜB]ïÆëgœ»ün¢_÷꬧k!h¢[¡–âü4&›#ÒgÐ<¬jPKòÜüçâÇ¡m°™ha©¸ãg„ƒ~_ï(<ÅV® áip-Œ©ØC˜(ÂØkÊø§â–‰9òJÞÚa?©(}Ô£vtЖz„¼A» YÃÌS¸‡Ðàí…J©§ Y11ã#êОÎ8 óZ……ÓFŽÓC=A‹`}N"°Œ÷ž8Ç;÷q.ÌIêàŽö}ñŽß}wüþoÜûv?ŸýôŸÄ¢—àÏ‚1aBꘟ! v`ÿ®è;ŽÛÆ8åuÍìGK|ìÃï‚V¯ÇrŒ²«¶,» ÐAÆ8àÞ<´ˆ/·—€} M€á`%K–7pŒªàè8jƒ+[–S¢™}3Ëß‚KZÍ=DhÑd°ýûže˜_;ÆWm‡Á õžˆ]Ï?Mæk)ó¼¶ÆÆõ+ã2̽ <ý?(U\Q_G¤fA)×™ˆ½»žˆ­]€S‘"]Tôg‰:4òàÓ„4MDçØ/r8ã‘À çlŠ®¿ÿÕ¸óî‡b% D¦D `.šTÁ@ªÐ¢d4åH€Q¨› ôn2jm_:ŽcÐF]ްþÊ7¾ÿòÕïå¡73-@ŠŽˆ b§DJÿWækA/F Mb*à 4ƒ65-àzÚËDZÏ9ù*Ng?¼Q³–ˆ{`Û¡ì÷á‚Ó<æ”,AiVz1HüNb‘ø€s5Œ[æ]2s_Ev5IöX3Emˆï-Ö?âõÔ*лADoÍçTÂkrm)' ’{k&jñ™‰¿Ÿ›`Ö¸# E/“7KZFªŸJ‚ôG­Á¾N¶ tÁz¹¦ƒëÔl}3‰y¤ùÞGƾ„f8ÝgW3©Â,h¢•È)òš¸þXä*Œx(4̾i^M!lúF¢¡úSÛ~šh˜ûÃ8¯`-˜Ð¬·†ÙD„xþGáoÂà@/?}ôÇÜ?Ê>Ãй„œ4ÀÉ=õÅN{À^HW /™8cžKcö;7SÞçR0ضØQêÙ† ” ;fz²xæq2›Äˆ8­MLˆkA ”„jr+ñëiVšå zZUm+ÅÔ®Eð{ŒB£’&w–št'©<åz3œ81>§`îC˜iÇÛŽÁв̤ý8yI7\ùKñgo¾ßÖøäLJFw«ˆê’#EtÖî&³äŠéêíá  HOΖ¡ÁŠÏ}üñª›.©Þ¶xü±‡£äÏ^ɼæ˜LÀá—BL)êöèñOŽÎLµ+G$ëha•v pœ€;>t4V0Iu~fÑu`2vs¥3¯ øiV¬%á ‡Y=Dæ¨'scÊ*ð̃ȃƒÇst÷Õ×܈ɷ!ël}n_¼÷ƒÿL‹«`àÀªtŽ/…Ù¬ ƒ|†>ÈQ1ë6ª_ÂÄ•ƒäí ¿S%šQÇO—PØû‡ã=úÛXOÎŇþî“ñ™¯Ý«¹NEÆj!¢Ñn ªTOèÕ¬ðn˜Ù[*kËèǤï(qïôC-F¥§•ËI4¶r‹¦QÀI¿P&üi>ò_k±ï&>îGÐWÌ ¯ äŸa²¼ÅäÉ3û3k¨Zo"]§¿iý¥l´¯ôºW0ŽY4÷ŠoóÙm[ ÿOíÈ1íÕ;¥€0oM=…‚ºH¬”vÄ*¾üo/ŽwßùÞÔ÷9Msßú7ã™ÓTª p™ÚíŒ[^ ET"ç¥ðÉÏf´#ø»~7ýFFt¬xý¿¿VÄòõk9wùƒgo j Í!‰´wáî í ðÄÇ܃KeÆ@”ÍâhÜb0úÞÝqá¹K㓟ü`<²ýÞhh¾"¦KQ°ff@Æ£Ç:ÉCgú/»Ä°Ÿ#BÞ:ŸÿÂ;ãõ¯¹1Úw?ÛÉ ÿÖ÷3YTó}XÕvù“ï‹­6o|7æ’)Uô=@×ú{†{OÅÙÛÖ0%t)í5‘Н¬Š7£eè𜙊ïß~Ww„Ž \O“¥éésÎÃçè$‘}ç1߯G!4/È3}0N`ÎYŠJ#( ó‰å°/îOáŸs\”Q> ´3Bêó³'g4âd>|ö÷™ÿX(ï MŽËå§ÜÐ|_l¯›+ÔÎl¸ðKú='eùP&[žf<œ›5«#TR¦¿±¸ G×à€Dz\Ÿï®Å'{îæu±Þˆ5&ï"üd¶Én$i¹®V3óqê'eä âN^9L?òBìxî~+ªHŸ©À¤›9{èòi3-ÀÏèh æ_o|ôoþ&Þò†ã™í÷Ä¿þõ¢åÜkp‹`nfPŒ’¢ðÇÇYmcè'~ Ú=ÖÍ£òG´Ã©…ù»j;9œÄœÄ¼ë¤6„êmÍcZFóâ–¨Ã_1LÚ‡ LâœagÐRga´Ó/Ñ«Éâgê‡1M¥Í~ì\_p«ý¹Þd< Im)²ˆd­`CœS쉾ÅÓùÛO*äGÿù¯ïõ'¹¯…oÈÃTÜ·Šäã…0VûÕ /âÙë8µÔ~çÐvt§ë<^œÏudtÞÚßþëS¿}=3qó WŶóΉ>ÊQÊgaþDð‡°^Ý‹KESŒšRÌ÷£Gżåâ÷n½%zÛvÄ—?þ>º{ÂìWeK¤ËÔðÕö0þ©·‡àS#+:z,Âù~ìp'S€_úŽ·Àçã»÷~3~úÓ§cýº À "µ†¢9½þ !–àÝ0¥C1wŒÏ†®ibÇI_nå$y“h ÇZÆöÎü:ÿÙ¼j1ª#såX`#‰˜kFpjPÓO"Á¦&zð5ÕÄË鵘WÂ=ûã _¹+þñß¿\a%ÃøÆè>¹’º¶˜|l˜~°ar0¦ÆÇU7½4nýÝw0SîhüÞkß³ØÐ¥:ˆRÉ4ˆõ›Ö¦/ËÊôs8Zi1¬"7©X9N ƒþJ+Fãmïüã5¿ùç±l1â@ì!RÞ@ªÀËn¼°hkì;°7†‘8ÝD|Æ2ÏÆ$ÑÿùºKEe‹ÁªY£¤ÒbîŒ Ý,¬UëHÂ瘥ø;ïýIFh†¾§`@þÅ¿iÙh‚IðŠiOÅ2ñ9²YÇ8Š›ý–hÔ†ýe6¾ú C–xû‡&…?>ûx/"kÙÑã8}ØUÌ0˜F=ד*ÕüØ~^*þÓ¿cR§>75§YÎÓ¬sÿ HÅ|CŽ6Ón«@³ŸR5fm¹NdÛFl)¬LÜs4“­=Lz€AÕ©-à7¬®bÜ6½…uLL†i²ç#4+ëAÚmË–7j[D⤠˜öº,±Õ­à ­§1÷fL¶äüeG¦­#<õƒ9Ö+ñˆòþhó™„·_/à/£q8Æï‹¿Ÿ9âÌï3Ç>7%; ŸôS²Îtô ÅjPõHF0 Äñús<›5„ÖåI#2ËÂlB®z}™çÚbÄãÕºø¢ð%*˜8Þþ[". ”Ï2&}.ü#íñ=k2)sÄ }»QøD–¨”12ph‡Ór–$N‹…}éR‹´O„ét‹eæN{O\¼é'¶Ý lí©Œk–qµ«쯥„ÍEN#,gqŠŸÔÙNsÀ)*í*=Œö«³Ú+ÌSá#<’ëásñâ»3ï~ö9ýeþòƒ? ­|Ÿ‘ðó™\]2#ž f %a~“°RÓUHyv R• :û‡­7튞Þã´Ìb­h3ÂÜš ÎÏ,|÷\?™w(®ÀÛŸ­ž!m)|¡•Q˜ó0æn58ê’)÷[³.{üKW Ž2|>Ö`–¡8T£EUTâ'ö¦¡°HëOÁüÁ˜"• ¡éõQªòùùhwmÜ÷ý¯ÄOîûAÔ7ž ÀäG ŒïQhòD÷ x \ ª!AÙj|€S˜ïݰ(ûOãó_û2í“vYFCû)œô¥¥´¨ìÚs–Þ–„”R– q1™‰Š4Í87 ä)GBÙB·¥¥9Ö®\IRâúغù¬¸pËÙqýUÆ«^|ulÙ¼>î¼ÿ‘8æb›’NL«Q´Cî•øô¶—R?säÀþxæognÅËñ%qùeçƒÀcñ}œqKˆ(ŒÂ ?6Òo¦ŽûÚ‚µ’ìÑ]O=KaŒgŸ³‡Šû~º9£’Y«­DeL–è›X`" RÉë/SœFƒ«'ZaÂX=˜k™ó>6D݃ š`f½ÇÓ‚nˆl YM_‚1ïGÆíË2 G`[G–> ¾s䓚Rú}øm/îÿ.uŸ~)ád4ÀÓþ;EÙçs=ó¥Dv·ÒŸâTБïRXÀ&”˜ •l¡RX‚´FÌœ''¡šý®û^YSì>./9VMØJó€ì*Qp|-œgf³\ͪ‰¨™““D ìä0yP“ó§øœ¬"Ä}/ÃcÏ+ñ1¥“½YÍanœf™ƒ$“Y³ž"ïÉ'žh®È±Ô°ÓW¡IÖϤ_M¨¢5ëçü»ßý×ËOº`6þÍèpQH4Sß)@&¾úÖº ÔtLÏÐ×gŸ­YÖeÚÍ8Œ´¨R@ð“ê!ƒÉâyèÏý2‘Ù\«ði+òz ›á™>ašËf 3>*0`(•|F°€Ã2=µ\»WššZ®õ€öE·ƒÄÄÄCkô÷v‚ÔØP–ÒˆÆÞÞ~4þìO>¿õæW ,<·ÿÛÿ†qnCˆ õcöUàûÁ»ÞÓ ƒ"á*ñ¶€Ê€V†€~ôCÿ+~çÖ›£ÍècÿüQ†å©½Àî‘r|©#”´ õõDÙ5箸-¥ Șµp2&.™­PxXë]ÌßÈZ(¤ã0ü1š»õÓ&¤‹Åwµ„íefu\ƒ¹îºËãªË·隉‡(ЭAKPû£Œ!ÝôE¨%˜[UÆü«ý/ì¤!úd\xÑV4¢ëpjVÇ·î{IPKo ‚õg"› ¹ ö>ÿã¸áůˆK.¹$öîÞÏí?F˜´p%=˜¸:¿ë°Ý LóƒFCÂY© Éèi§¹_=ܺõ蓔ݬ£ø¸%~rwJ;7§‰š=SñÕÇAŽÔ~ ˜LúIyÀî‚øukêˆ<Åßæ6 ÏiüˆÐ¼á¥I²yÓ|V0TŽR“X“ÎTšÄá÷‚¤ãµdŸÑkd.ŸoòS±~?ý¿¿¼²9ÔHµ{¬°°E¦P¾8]åeÕLmÃb‚Eó)Ü9ÉsdÌ2-5Þq4MÕdbÀWíÈ@“/ÿ¶2en›÷ô{îÌ{ÌÂdò2:“iMé)„¥yn2~ t¯§–ëÂÍÁšÞý Àt4Ó¾íxg­÷ô`I+4L¶å.e#&ÇúãðžìÍ몘¶D[+.¹2ÞóÇ¿3'`L ý. ¥Š‚^˜qv‚?&eÓ:¸‹BpÈõÕsÝÛßòžøý·¾‰¿·Åç>÷‰èìÁY¸‚ô÷“€³Kfûc°»³hó{õ–õ·Yb`ôÃgñ¡ŠË%"TFT„Û’¯ÔË”NM‹$íÉ2‰Ê Y†cçÎ{â…v Ž.Âñ}A\wõ%qîÆ•qøÀžxŽâ«–-dˆ iBžÉwÖP=t4ví|*¶m» ®¾êòXÞ´0~$ƒ"ìÙ}œ²œŽ²Y=÷IÆ4÷õôŵ×]¿…É Üã !ÈF™ù?$"ríZ$8z"L€V¬tÞ<ûÜõ8ΗИ¾¦U‰ÆD„ Æ»ÓEÅÞVšÜáqºp-é¥HÀI$Ÿ™çÂ&µ6¯@D+áª!ÙkÛÌds ’Y‰Lù#¢Lª$®GewÙª—‘OÎ/2qòOËWjO^ dCqJÿ”fjêžiêˆÅéx欞Gm¥"ÍD IýI““kXdZs½˜²Ö ãÓùî:`JüÖñŒxNLÂ9#¹ùS2C³´“±qŒYõJìiR:ŒØ@î¶Ì™á;І‹{³=É( 6d}ß)Œtö³]Ú)ä-á'éBQ‹W[ ‚_’é#ö —1¾'aÉ}¼ß8Y̺dÆFæ\w¡éÖže=Ü&yW@¾€³ÿ cþÍߟ‰ÐU«õ„ÝQän„ÐlkqMSjŒ¬{)Y^ãw™ Æ5Šº:8éâ¯å/¯&å½eʈÔóÞ|ÉKüð¥Pp+LÓq†_-f™ŒI_UöXádqF¹XšÈžcÝ¡Ì2ÛsËLÄÍràeX0¥Xöiëë‹6Zµv´Åx7¥e=Ð:¾"¢sŽ[³Ð"Úöþï÷þ~\¾eYüà»wÄC=‚I¶>€¿_î|éþA$ôÚpŽçaÁjƒ½]qñÚóâ¯oû3òÔÊI¸üר¹÷mW–"Hô¿á[FK†´¡÷ÖèloC ޲ËÏYw›ô¡œK6N-_r0 y$/ìx>îÛÓ»ÛNÄx\ m¦‹ÁwCdê*‘ð`¡ÆÒ¡å,4£S±{ç“qq1›7oŒ›®½„dwcÒ=I_nfQ‰f©…>%‹Å¸NÊ}á±bÍêµñÒ—½gàÂøÚ=ÄÚÕ+І1V£ IØFtÚжƒ‡âº]kׯŽíßùqÌ¢¦š5˜ˆŒÄ®óhE“8píÅãš\‹e2®2+ 8§ÔK”ÏfòQ4bxTjèNa‘!ª%UcÝNžÃ‘;H”mh U_ ‰|§ÄQ<u0C'ŸDpÍ‚«öqÒôÕŽflʆZ¦Z ×öƧu=Þvo|÷ß_0v`W0¨âµ¤FŠ”eJ©!q’­žý‘!™‘ù0[ϾÅùêµ§ïÏM²‰{¡å 6fêM2#ö µ^è)ñÊ=ô=?îi.’ïÔt-îv'mè¨*ãôn«U_à‘{Í­-ÕmŽ%œ&w)ÌÌzÄJ, Ó;dLÕi‚cjòŒµ‡Zü»ódâÛGÍ}]‹pdw½{×Ûÿ0^ÿK×ÇÑÏÿë?Eù¢­Yš2j’+Nrë/GàvHNŠ9©A!ù?y?å-ÛâaZ"ýç_ˆ…‹Wc1üL& ×á–裑Ã>g‰&ڲ욭›nC׉ SSýÏoó_Îݲ…(׺ØvùåñÒ.g°ßŠxî™}цú·˜dËTÁB‘#–1è°’ í«)Y˜B³yò¡»)öóÎÛ/ù‹êtÜýè®X‘«–;ÍD RGÙÍÙëa8³D öÁÜV®^—^v)Ј»~ §7Q<œÕ½ôN’ùh.45.‰Žc‡ãÐÁ=q ÚÖ¶‹7ÇW¾û`¶EÑÙ{‚~äN’X¸v ÒºÃíw’!»žžßWÅr<¾õŸ÷EYÃ"TÍ/!>¾ëÀ¡:¤ž"EZé6n®&‡í~Ý\‰HíOFóó/pâg/ߊ˜2 ÕÐ|26FÆb’&8Uàó6ÿÉßy®_¯3—MäŸ3œÄgßws“2‹—“=FÌÔ·ö±˜åÜE áÃ=€?éÌrŒóät¼=R†MÚ|>ä1LGá¥I%²šü¤¦„ Êõ½”þ #}hS0ÜJB–oëo)ã^ö}RuW«3)ÓÆñÙ'Y¿ÓsÆÁ‰Ë,ø­Y.›tb¬“oú‰Y£i«ɾŒÚ™C3_Ò ÍäAYø:†Ö¤iqf¬•`(ÚŽ°Ö|É¢NÛ»ƒâåïÿ±ŸÀÆÄVó³d&&«“™>B2§mPœÄ¢`WxÉ$ŠBòÓ—ãW2(÷™ÿ~Æô%f& S‘àg¯‚™xsú|ÖW|fm^óÌ4ÐÏòZ>÷ò?Ÿ·hlÚÄ=”ø”ÔÜ4;'(A±û$ø±‘òòèT0Ljƒš4Ì yƒ² Ï—^ùu4‡ˆ+×]¾ííÑÓ¶/>û×ã•+’1D¢&áSR@„ß“‰Ôjôválo;FÊÀ;‰‚¿ _îÓqû?%$Žcá”0­'y‰Ø»]Ç“wXM¡‰Z¶mÃÒÛ,ØÕ)gS0çOÕ¢²ZS¤¦²67ÞtM\réÖ¸ìú à¨#ñàI êá–eˆ}-@ µ+£_Ê¢ÞâÀჱaãÚø¥W¾˜}eñ­þ?œ½|×uày‡^I‚¬{)Šª–UÜí8Ží$3¿;ÅɦŒÓ³ÉNè8»™ÌÆ“I<Ž“¬ãÌ8±=.‰»lK´E‘¢D±7±÷‚ @”ùÿÏ}‹¬Ììî#Þ{_¹ß-çœ{úy™°L†,J€dˆ‚a²½J¯„ öù ñî£; Ñg_’¨L€HàS mµUçÝØ¯³$Õê‡`>þèCpESá¶žO!4†j\E‰3ƒ{è‡ ¨žo~.-%/Ô}÷ßöuOO¼°'À’+¢4¢ß¾ûpìNŠ"W/ÏœJ?øžw¦{Çãév8Âñ”³M{(„)€dðv—+zàbWŠ˜]Ìùh¿$ §Ä¥€I[ðô-Ýx£—‡‹S*Âýîõ~q76½­mð wäœ92Èo‰“DìÒ凄R˜3:6\«ÂXpÎ"¦¢T&GCgeÑ#J"ÇÛD‚rVFÃõ-@¦W½éX4—G( 9]-È›„I½‡©h ¼ÕUc@‹.mD.#vì!D•Å'O D2•‡VHË3)†¢­„p©Ô1ˆ¿ëÇÂ%Ç.. Â(*µ_pvöŸ±¹BΑ³çw_ÔÎIÌ‹ë¢.++™õÏrs1ýÉeÄIáÉ–Ôùxy̸mCp"&ÚÌíFãù ñ7žËµù.zÃÏŽ=ƒ{ÙÊÊ-¸©I*!,¹ÃñéæàƒÃ0Ãq ¦÷Úg/0U¶Ðp$bìܸ  æ Äz©¿Ú’%ËÓÊU¤U÷?žyü]Ñß‹ÿSs:¸ë8.8[±ö‹8@noôL®ñÕ+méoþì£iÞ”úôÄ7>C4Éá`ta‰Ýê?FÈ€ÐźÐK`Á¤ã'ަ‡ßôpúýßúe¸Ûžô7ùqÜ ZÑåâŸFI9«{WV¥ñåàkûÑaŸ å¿´@•B©cr+:'Ìõc¨L¡ 5Ü»o?ÜÇéôê¦ 8<®c׫Jwß}gzðÁÓâYSñÝŸ^=t"B*¬k=º®³gaÉÁ„…ÍÐV9õ` Þ¹õ¥4iÒ´ôðƒ¤ö±µé ßÛ@¸ q]ˆx—Ù-û`ÍM±b¨“T–N?šVÜuWš?grèé´qLjBK¤t°bŒúŒEL û!8-mS §‘WèJZûêädʼx ÊLP/Ä-DkV3Ç_K+ï} ݾìŽô™ÏÿKX—.’=°BˆÖTE%}‘Þ„ãçG?òáôˆßí‹æ²‹b¶% hŒ‰õtˆ™ jÜn8ªÂ[ŽJŽK«L ©Ç¡;3çA¿ƒÏàÚ€·€½þøâåwôõ/Ÿâq-tá¹ÍÍ‘ÐLÔ¢¥5Æq±S{s†Û V¡ƒqkå`ЙxAp­CZûlOQH a Ç\€˜÷³{›`ÎÀÙ>æ(‹$y‡3Ik*•>•ÝÌp`‰*ÕêŽL»aKÓK@ô…SIl*™&,¬Æcõ`¿ QêM¢›H NšZ8-ëÄÜËA`õ‚0õ°Á8ePõ¥¤–Æ$8¾€÷K´%ã-щXŒËõÓz*·dЭDÊwž7›qm§ s¶êøráŠÅóy~RV>šûp½/åë³`î¥l8Ì›F‰ùn™ëáà$þúµE¿i/b¹O1žŒO ój®B¼gM›šeez p¼êž•iÕª{ÓÃ>šÞþî·§ûßô&¾¿%½û½oIÞû8ý{™ç”¶lÝaH÷§¿™»wnZ÷ì7Ò7¿ù÷i¨vœ6+ÇÿªÊ&¸°Çd Ig KB‡D·ÀíÞôÇðk„šMH_øÇϦ—·ìMMã'cd¶p®2‚œ4àðáƒà2p þ9±º‘”ZëK«<¨€g9€‡‚õø™NB[ç¹uO~3íß¶'Í=/=úðƒé‡îÁ…}Îc+9ˆƒU@G¹oêzõøë¨èRÑYM€à¶—6“â¤IY‘pæNÿüô–¨Ÿ¥?†¦MÓE˜*ט‰Ž®ñç½–}üíýø{ï â=Ó§>–zFÚS/€WSIrÉQU1äÙ¢½+WI±‚îƨ“è¨~ã×~)ýÄûÞš6oZŸ>ÿ¹¿JmÓæ§ž!K‹‘´ŽäsY9?œvìÞŒ™7 n‰Þ[¬T¿’RsCiµ¦ðÓX¿^ۀش3P-‹aª'@' ÜÝÒÅ£b膧¿  U¦…Kæ¦G»‹Ü´ôêúÒ¾3WSY$åΞè"ÕDöCÐô/ªJnZ÷4ú‡ºôÖÇO·Íž…n;ÉÃO{à¼ÜíÍ+ÃÆð‘6Ô‘pÇÚ/[˜^$ñe˘6ÝÀ \¨¾âŠ¡˜ß·sÜÖí„ÀL…óÚƒ¯ ÂBP#Æ‘Ñ*ˆ àõEjÓž^ûΫiîªùiæ¼ié3Ÿû:@Š.ƒ]PÑBQ@«_T‚Àpã kÒ¶µÛÓØiãSóäd”‡Š;\#á|õÞ­Î%R­‚œžg`Я–œ«ˆ*"¿âKš~ú*>-woõAyWÏgŠóùZ‰ˆ‚yF×JBeŸD,ÁÓCÃ#oº+-Y8‹ˆ†ÒéKwnO‡œFÕ2Že,®2¤¤nïÀÏo*Em;Ð/B„±ŠMáࡽŠ_K¿þsÆÒ>¾üÅHɆÙÚÞ }PÄwS‚¸ÿw†,¶£‡‰ NÏ”¿ÿð––vLL_ÿ¯ŸÖ=³.5áX}™µª„Ûjà}¥K«3¸'† ’ Ö!*™“g|Ù¢Z@7õÿñﯾçŽE„œ\F¯s8“©"ÍÙ³°kݦÖEîEœÒWŬ„5µŠV5iÞC‰Þ˜îC<ºûÎ¥éÒ…3iÍ«ûPH ÑNÃ) @HÂŒ64M 9ÝA€ð N›·¡‹jNëžß>ÀŠâ™¦æeÁš ĶÕiÅò%‘tí‰u›ÐuQ¬¹´ªkæEwàFˆÚécx¤ÃU-¾m1\Ýôô^†EF¶e§i вÎm\25ä„:}` .+ˆänO_þöSaJÕ¤ùTýEvÄ(¾žñ`»5¾Zä|:‡TÄÉ*©ÃLªâú.h‚ÖPË믛]„óV žgþŽO¾J”tN´è¢™M›ãZ†ü¤àšXj¹‰Æ(÷Oo®“øÙ¬í2Ù>‚QƧA¹Ù´Í=ŒÃÄmrBÿt÷°ÒJø¿Á)˜šQr˜6Ku_< ˆ¾LÐõÉ%†('Èæ3Œ†&_yŒô»Á´|êc…FrÙSÝØ äëHõlTè´`Ùá1Wâ\yã Ïî§?—!vŽSÎïåç{1iŽŒÁªž0G“~A~W×us÷,Æš½sâ<t©iª¥S*ê °HgÖ'Û.·elËŸ~—äÒ‰!ï#Þ$tXæuŠ´:ŒßB•ú+Õ"¾éê ñÕ68,×ÀΪîR7 •ð>€žeÂÀyçÒL¡c'‘•bJg‹¹¹ ‘¹„('ÇÔG6Æ>’êëö`HJ˜¢A ç,6à„î•'!z^žW¡ÿÀ–œ™z¯ðܦ¹/œçÃgœyôÉ3ê·ü*fŸõå9±à~Y;ç¶p-p‰pæ©…MW¯r%sfõUC…¾® £Ì§óm©®Ø<€ëïoç+œhÁ¿³¬™(óËBôm‚#¬c£>~äH:„[Œ¥Ö-·d\]?q<Á¥Ð~ :X—A_&‰µþ|ÂD:Ù&T0•¨36oüõ$×¥1XÊ뉚@}…ËÆ«j S#A˜Yƒ»ë)-uÂôÁ·½7}ô—~’²äûÓ?~ö7S?¥¨J´9ñaxpÚ:u“ßéÌQœ5Ñ5Abêã'ö¥þÂO¦‡X‚Ú·¡ñµ—VÛ¿/MÅeà¡îMwPF¿ çÖïÀÿ€l‰Ô¸…êž%säŠÄÙ¬< hU]Ô÷îÝDí¶%KÒão{ D¸–¾ó즚=ºQ°÷âG!µ*‘»c„Ô rRçN¢€F<š3{Ôt8mÜ{4âá.ãÙ‡Gj5–±ªZ-ˆ ɱNØ—–/_žf’hþé¯?]`çÔ¼”ó×'(* Ínùä¾à̿䛂ØqŒý8€ÞàÓà˜$NÜëûf½˜"aT[ánE¸Ýá˜DÁõT7•ûên® ƒz¹,ЇÝXs³n z1‡c%ˆa’<Ÿ£~OfSËÞ5¸Ï¶ ˆœÚr ×C^+¡§»F¬Ü ƒpNæ7µ.C­7–ç…±0ð½aÄü+>¹.µ›1~?‹Cù`þíß tñ³|Qqñ-Çâ®8ãUÕrf ©ýñÙRI7àl_™+纑i™¼Œ5²E¾-i¼6¥4×®h<»(¸v®¥óÎ)®Þñ]Q_ØÇ=)¸j7öóä½·ˆH#N£Zìž«¡ENé*ó§;±pèëzÙèO+>v]GºÓk{¨A‡2üä‘lúgq×a[ÏÝÅ:ªÞgd¨3œºØÜ‡Ác:ÍeÖV9/ýÅ_RÔ ©?}æ“ÿ{:Ô…E—l—èƒ1|]z/;Lè›™IC?Š4Ó„žùØñCéW?ô‘ôÓï{„ºGÓÆW_I¥Ûg·­>|ø@ze-¢ȾtùÒô( è9íxkîO;wQi®b &vƒk°ÆÖUŠ{5LÇÇŽœL[·l¥šÊìôðäÉã›Ót>Š>ÊÓîPÝBè¡êo+¿•MeóNîbæÜi,ð ¥–äڨ܋D ™1G &4óc=¢dïEb§Ø5W®ºùwš±d@ÑÑ=ƒc‡]]G%–ƒ¶§E —!Þ¾ø¤š8ŠÂ*7À©h=39¿i,ú0µ6µš³‰ê¿7³ûhNÂã:vSßî¬êÑÐ;±ã˜ö‘û‰)¼û¶t×Òyiñ‚Î4žüPý°æêWâU¾Ïö2ÒD3ñÃUoü‹ˆBY,Ì·ükJÛ¸ÞÆoOøòY~Ä?ɇ¿lˆ C Ž ‰.ÑwÇ'¨Ëå09A€n ÜË«©[ó%rØN¤‚‰Nx7:7æ\#@ú"ÞQ¶‰ëTRk½b E‘ó±J°Ï3VhÀõ@ì6Á ˆ^#ø– Äè–®ôQÎI‘ Â*^J‹É(†ïèíçÏâŒÇýç“‹+øzýå±’ÌéI*"ÃeúÀ/]x.¢Ò0¨÷¢A½0 f°¶b×¹3éÏÿä·Ó›WÍK/¼ðô¯>™Z&u†§¾Öï0!ŽwŸ'‰54 õf²V?~4ýâÏ}(ýÉþzªìë&4æËiízˆÓ’ùSV3ÝpãHîv2íØ¾…¤æ“ÓÊ»îH‹, «`^Ó‹Ðs $ 30“kjsBDZ *G?ŠRw2ŠÌÇ}sZ8EówŸg"úaeé ÖU^kš V.äü…s¤Ï¨ÁK-=ÊɃ§Ð;!âõœ¸_!·›rÃÔ) „<™&Ïž“Æ"ž8v*í8@ø ΓîÂ.޹}TÚê@zòèA~IKß–fPææÛk_‚[ÂÌò¶Žô¤rE"Êæ˜ñ1LH6ïNæ=2Ox€O@]àXe~{H‘tùÂ…é'ßÿ#i òQ®‡g9l²º^ê1Y]™xÄÍ6’*>iÈØ§¾>XzPc\ôÿáýôe%Jåÿ|ÈKx<÷A¤«áí }z€­»r3þ‰¢®Éœ÷s,#ç¼PD)#‹ùÈÕ1ÉÉ%I¼2—E›1‰úGq|W¬°|•ÁZDðô.†ZúHĨ^øX€úÈ(på*n)„Åô‘E$R‡å£åd—}°§öÕOßÅX=šŸqG½õO¾Ó qOžCÿò9 ß'ˆ¦îMlz¦6.Ddu?¾5”dnÒI£7-f‘ˆÏ çÈ´J/3/‹±ä5Ì}¹ÞÓë_òqç·SѼy¸ý§O–áCŠÙêÐ\GÅÊôH×`"ÌðPv™ uY%™ 0#X*)ù¦3´qt’87$­—µð`P°¹˜Î¥Ñ¼"鸞ã`Ž9–þ裿”>ôÇÓá}›Óßÿ? 7„Ïš°ÀEz‰ái\"ƒD³ññä‰ciéÌ%éÿá÷° ^KßÿúWÓËë·§ó0•¥éSƯ6‰”¶„í:1zñ™0ÿß{/ŽZ<ÆB9¿¾–œGS™ªh=G¦;‚"ª4ëª)K+×n\¿.Mš<‡ÍU鞋ӑCÒžC§1ÝâàÄkPOb€™[‚£RWv‰\ÏFwÏ˜Þ B„rPÑOq©‘t – òy#°üGîLwÞ{?™/Ǥ§ŸÛˆÓg @Œ• ‘xªèS\3vR:@aÍi3ç‘As~ÚûÊÖ´û tVv,5êÌBèâ ó×ð»lÉmMÏoÞ¿-¸ª@À%@ƒþÊ'¨7¹ƒðžEsçD¨Å–͛ҺgŸM{wH§a, c”‡@Q+·ú?¿Š/œ¸³þÿy]‡ß›nÎ*d$ö³D‘;»és* gÂsË Š þ n…OýpªxW²Q‰ÎzˆV"gHÁ±HRLضŽJhóz à%S–¸f¬T%ñè ØÒ`,Qƒè,¯Á)õ¡gê©X9KòöÛ·ã‘0åÙÌýóg{~ŸùøM3ÏâÞŒìŽãF+]Z–\ýÔtþlVÍ<¦|ସÍD)?5ú–¿^ÿ›çpˆ5ÎëBÓ±ùåuñ.L¼ÅWþní£¯ü·øÐÇ.`Œ‰Ñ2®¿gqbÆä\eõYVp BH_´êºYH$jÀ}3$XÔt+ö¯£Qk .õRà\÷E¤ ÆOÐõ\U3 ö£ÇާŸzÇO¤ßþåÀéîO_úï‡7¶; hå(ð‘d ˜ú=u½ìàF€T”Î)N>85}ú?ÿIº}î¤ô•¯þmzjÍ·q&žŽ+ :0ÎjkÕ×EÌy†yTŽmÝübêƒR.»}YºŸ0’)cêÖªA‹œ5å©@©­yl,7-»œ–6¬[ƒ'uszàþUiöœYióKO¥C'ûHêFJ\äS3iº“XvGª.šZcꔩa:tèR0±Š †Õäõ°°Ýdùk›4!Í ¦›÷ 3jFùž¦bjijõbC#µˆÓÜYóÓ¤©ÓÒSë_Æ„‹¤Ò=_¤R<è>¹7Ýu÷ª´ô¶…éKßþbFK^t7!Q&QDU1i„)pZQf>õÌsé vÄIû§×´:wŒ°€0ED-–B€Z¼üê®ä?¿ 7Ÿ/®û_}æn´ãõÅc^ÿéC.ÏX}>À,¢—¹![ ÜlŠãÐY9~æ*PÄëãrˆ™¸‰< œ¶A¾2Aò¬R†BBÐV#ÊùLAëÙzà`‘ÁàÝkCˆè<5S9 ˆn›¡ûŠgº7Fìs3Ar¤¾í[ñæëõWq¬øÌ„ÉkË£â[^‡È˜A_UÒjmóJaµËÁ¾rÍrŸÎcñÊ_s¿âñÅ > îSâP¼bíJ\ìsù!Ür³í±s—¯)·ó·Òœs©rÝ9‘89÷>%nã˜tŸ#!¦r‚W•„H‚„DÒ{‡XÆ%÷.gÓ‹ñÊС^²‡êÆ0‰¤ŽfR8ÓrµŠ®ÆCÖâDiÉô´4ý—OüNß<„ü7Ò#°<•¨Z€•*ôU:ÑžÇ*Úì,Ì/7-¡?~êtú“ßÿôîÇîO/®ý.ÞçŸ$”i":®1pNèˆG¯]]-R!aáÇ£ŸÃ ê 9tðµt`Ç‚€Q”òÞ´Óud 8K{z!¤Ñt=Òå~²_¢¿©$ˆo¡Ö²WÉûùêKÏÓÑ*<±ïJ+î\™Ø›öt±oa8à~Û "Ë—¬oQHaøãÛ¸9÷ô à%ÐØ¶9f²Ü¯âÆfåÂqSݘ¡4"×͇mÞú²¯¹¿7>o½âõ¿$¦^«žH+›„J˜ «¿µxE ,D2VÜñÒkÇ{0ÙhtÆÑüp¯<ý?½þžò3®8~3G‘BxãŸë ~¶“m¨ÚÆQhÇáFôÁέeÌìc¹cñxg&1Ç­ºYôÞ¹(½Ÿl!?ÿÁw§÷¾ýñô&\t–BŒ–R±èöÛ¥ÛÁÕ¥KnO{È»ôÌ:ÓX[lÑ}jÎàî1èÂÃw.I¿ðÓo%öu_úÒg>ÃDýIðM®Éçšw­‹rè]ݨG˜Wã>ÑŸ:Ó•¾ã¡ô§ûM˜ƒËéÓŸüuâ.)„[ß¾nú^èÅ?òŽ…3V·v¢ûøÓ†hžnbÇWyu Ø­èUЬëÏ´pù‚tŠl[ä‚à ì°Öµ+(ÉÕûÔ¨(âZ·¾–ï;w¼ ÛÌ“{äÑtâð¡´uß1tXp]v² ³êÂ@-ig;=V[qc°æ%Œk9g 'Ôd“m5¦[×§y ¦93;ƒÂ›ÓJ*½8JŠ(‚¶œ–JÌžs§0‹Ž¡Ö}{ºx®›¾…aæ<„q RÉvG®bN=•æÍ_ÀÂ,IÿôÕolÜŠbV %χÓqë´í«œ€ÇM X°ÃCœØâG'~ò×~ZÜÇ—8&!ðe‹ïùÈÿ ±ÂÅæÂŒô7®±í7zÅ39!?“yAÛùĈ¯¹oì°ô' ‚0î;#Ïáy®Í™P¤ª+Šq‡ý+þKþæòÐ)Y;O‹+;Ë—g&ç݇àžM×’S¶ÐŠót}®Ê“egÊ#ð[~•ÏÅ›¿çoþ,Îçy®u¬µò±s¬S×´+roŽ+ˆQþ£Ìã‹3ñ»èϧÜèÙcoô­¸.¯ŠkäË_L[¬³ónœa3¸ÙŠÒy,± cÑ­Ž… MDZh¤ïÂ_38d¼©„µ‡my”´óe›ê¡˜t}ófÍLo˛ҿyßÛÒ#÷.Ks§N TÓeʘ¢šÊáôƒgžNk~°&½üÊK鹵ϧm[¶„kÁ~ðµ5‰Ž”úA?sŒÞ6¦ÿþ·GôíKßùöç!8Œ®‡@%8,æ'Ÿê"É)GI@><ŠTF¾'Ë‚é¾ðçô{inÇ„ô¯}†È’ݸ M`c§`-]uûº¨X×9±iµ9š˜„ŠJ\ ÀT¨5ÅDbud·óöQ¤­þÃo~€*w¤mßûfÚÕ=€ry r-Ny±u¡(7‰ÙX¨»Ê´>L’F ?r8õc¶êî{ÈŠ99íÝöb:xö ÷Âíè·Ç¡ìl½2óMË…55¶Á‘ânpüDˆ@Êút€äìͱ³Ö¶rt÷ÓiùʇӜùsÓ×¾÷<¢»ÄÎJÕþ0ì¸éBZZ'“^åpš2cfjŸ:9=·q íQ}•V„HO;ÄW§i乿¥-,¾Šþ2KÏüHœ˜¿"‘U¢d\HíI^qБþÌO¡T g",;× Gùï‹›Ë$H‘YQ¨ååÅ;¼Ñ.–2¤Çw=·.qÈßâ™ÜoË×ßѸHâ‘üéw`&>‡=ã¸G¸Zp$Ÿç`nš‹œ'9/ç´†9j¦‰/[ %á&a¢… u¶_&îNJÑ\|)ÿȳG'~èeϼ¨øô«ÏTm¡/º.Þz¦Ôqót4‘÷cJûèÁr+ñåu¿lýÆ@‹ïöµÜÁ8ëŸ[ÏpeŒ£ŒÕþ†“&÷Á`Ucà-Ù®œ ÛÄQóŽëNq‘( ì¦8K±K$/ÔÔ/g_p²ö/ŒŽŽç®Û—§»—Sˆd1É‘uöÔñ´éå—Óšo}5=÷Ý éë6 egÚ¿ë~»ÒÞ-ëPÃlæ9 Ú®/Ò¸uòìñØŸ¢ÀÁÒ9iÃK/¤¯û›è¡(V½5ªJc<¯â©K8Ë ;8–SW{âì©ôø›éÝo¹'­ÇðöÙ¿þ»T×ÖIþq*Àð jªD.1žÒØúÒêÞÈgd*l•Ъ¢ß9YdŬ/V³ñn÷o ÝË–¤;î½/mÛ¸6êÑã°È‰ôŸ»Ηx˜÷sÿ,ŽÛ1¦Îiá¢e©yvç¡ãpP ?ÄPZY5ËÇ(K)U]E{—™ÌKøW˜ØB’f/1ê TÒÄÏE‹‘q †\àÛƒ#Sÿ¤UÎj3N—ä¾Dßaòf­Ã©“KØã9üÉ­äÑ›Ú-?0Ú-žæ5A‰G•ÈyŒâpIgç&DT‰!ˆ®_– w‰dÖ‘x·måÏ<Úë?ÊÏô·#ЧÞò™ø·è_yyÄWq‡€#á«q­Ì‘ߊõr<\‘>~Z©uÇTÜíÅßëüùs˜ñ %Oõо nFz^E(&Ni'>—k/ºÇ&@=Kø0ÀþݻҦ/§—€ñ×öŸLRã„öÔÚÆfL:“fRV™„È8‘`kˆ‘ºÂnBµtÆ>yæ8ÅLîH_øóŸ\Ú‘Ö=¿ÂD¶ œˆ1‚‰Vi6šD®ÉÔGº¨˜ë«ƒÖq Y¿úãÿ6}äÃï£pÂô‰ÿëwRj™FùDRïÀq]ÕøE±Ï^tÚç!¼¥úšŠÕ˜qa4$Ó —!«Û,¡¢AeT•º¡dfÒTü®_ûƒ0•ßu÷éÎ{îM»vnI»pƒù}C ª»cÕÂhʬ`ç¬#¡Õ±ƒûi¯”îC5 ·ø=Û7¥ãä/Ö¯)ª‚0™Z»jÈ+5@9‰F>ýŽB\£/ÆÑ±éÁ™áoBѵßݔߵ Í옞¶®{!è!›'l¨õÏ$`Öþ2Ûe%œÖ‰›ÒB¸¾ ç§o?ùœbú6ó7‰<ÆÑ”°JÀ†.Ddœ +¼æÅWhÌB –@º L.FE,#Æ}™BU`Ÿ3­j4³SgÇÔ° Êöb9¡×‹ãZÝ]Sb•J@ ï-7[è¼Ë·”?Š£9_YP/‡ÎOkézxÄI/]ÇcµÓ¯{yÄwA¨®£¸Ë;ó»À࿽¯Œ~<¯h:#wÏLœ +aq^áûú}qÿë:ôÿâg&„ebËõþ–à»ó)§í[NÁ‰ºÑïb<ùqy.³âj=EIDAT^ÍÏW8ãþÍoäÑ{„Wœ¸ÑF+7$Ne¡bYÎ}ì8#ÖÉõCƒ‡¤a¸Uc @M¢í¿~LÂŒó&w’Ý43kË;æ@íˆÿÊ“«8mµçzðö"îо=‘ÂM¾–š’Íéסª1Ð{&ïvTB€W;þˆ>V·˜8Y>üàcéc¿ûátÏ’id6x.}ásŸÀß Ñ°’…´¡ç9f^ž1ˆ±?½ÂÃuŽ NíÇÞúŽôûý9rD}òã(½I@Ür˜àYçÝD{À‹à$ÙJªWƒÑ -]Rg}OÚÆ‘MÒYebôsÐÁ1+<Ù°äí¤†Üe8¤û óQŠíL›÷`ñ‚«qçÑäè[ Aq<Ö±W©\Oö]¯®Mµä%^ŽÎråOã ÚDÄ¿lµ»sÎñ²‚`*´gLŸŠ¨V™ö?Chñwxr6ãR/²…Çs >Q(ÜV‘ÚwêŒÙi Á¾ZïtCظcê8§÷øEüêðxŸ>}ZÀÐ+Û¨ƒsÔ–úì¨'Û÷âÞ4~ÆÔ´Î/ç©@nE˜c\|vLE¸àöø®;ÄüÙiÅ’…§7Ä}†œë;wQgïó}ˆ‘{‰~Ù” ¥lÜ•:<(@Òüõ×Í߯ä‹ÇsøÂ}6§¨¤XÜϳMg¬Ìg—eŽ%ù¹ùîÜŠ½ˆÆbýÊ8æ5™úÝ^ÅßÞ÷Åñâ» ùâ^€Áó*Û][a#´Î™çyßüŒ¸çz«¹e[úŸ¿òs¢µ21òz‘TýXž•ÜÖ͸MÇ™û•{–¯È#¸quî÷ߎÚq™ý3»’0G̱¯‚Pԟ—æ{õ] –;2ÉáªÅ\Æ3Û ¦¥±Ï±F^%p)æÆùÌ‹Ç39çƒy n9€Tˆ«âE#›ºQƒ*Âå1 )í»;(…’›ûÙ9¢ÌÒßÀoSæàÓEÍ¡²hfs‘,ŸùËßK·ÏŸDäÇ·Òß~ê¯ÒhÝž‹t¥£":[x Æ@¦‚3ÃñÚ䇕dºt'×ëü?þѯ‚Ò?÷·éÅg^L ­„…ázCŠïHlˆjç"âêňÑ‹¼ºzµ@¬!œA;û ¾',ªl¯A„øÐQ[ˆmáϹZ¼íÚ½Oë~Pw¡á¿+س7m;t+™áx~ƒˆ¦ÙmnV¼ñ¢Q‰˜¶³8eétyßý÷0Aƒií¦]QF9R–0Y×ó˜lk¼EM0&µQ±‹¢. *+A5‡ùžµ»Ò2BHfÏì$×xwÚþJ_*3ÃÉ”¹`Q¡‹L<;4}Í"ƒ:!3g¡xìÀÑlWŒC騑£é,}•ÀsÍ?½_ Øåžä¸Ìà.™“¡rÝ tá÷ë^ óùíD‹Þæ3DE¿)6É5@ü!zp߸Ó+âQñÊ@oï‚Ë*·“Oµÿùé¹{Àäð7ŽßèXnÒ¿"Åõù3Nø§üºq4(zýñòYûZ~9¶ñâRÿÜ8wã[t#ðº¸/~”/ÈÍ?Š+жøŒ¶mƒ±@ äF#¶Žgûüðgž3k¶ LïàD\ÍÒ‰Sâe r® :$KX¢Ùh3?;Æáã‹GrØkòŠæoñ«¼Î~—7-¯ÏS·fü\TV‚Y¼£¿­ˆ’P¢àÙêrÝÈtŽŽ¾\Á¨t4Jê vIþ‡¿î»«3=ýýo¥/~þ³©eÊ\6:ˆº(Ð+î=}ú"… ðu‚!Iê‘–Nœ>‘þøW:½õ¡åé©'¿–þùŸ¾”j[¦Ò6Œq–#3ÞP·säoÓ)ܰ²,ßj};Ì$§áUšSF ¿Ú .Sò¤9{œ`¤ µm'\ÓÙt'ú™»Hi{øÀNBJÎB pº+I‰dFé ¿Çd`Ùƒ‚«U–>‰¯ÃÌYSÒ´)I°Þ“¶¼v(ËrËÆBÁh‹ZÚé⯋žê ß$kµ)®X¤0,QÔ÷œ?I`ð²à@¾íMX¹ÎÝ⊘¿ú® P@s,Ùf¦Ê†ê´uï!¬8¤aE­d… fìBF®Á?ªb³ùÅ °ž£ïŒ’VÿÂe ‘¨5°àƒì4ÇR)¹»‡Qv/æ›6!ô‚V@aæ&ˆ£¾$át(ñ@ù:{ïÛWùPþÁß›ÏÅÁâÂò¹7ºþFk¹™7¾Æsd•yüÄLbný 4ÒŸ|,·|k‹;}Þw1‚›{á÷⸟7^EûÅÑâÓ+n´àÑ¢÷ߊ³ÅïxV4Ä=à”kœÛºi,åÆ%8ú§©Ò7Oµƒ\‹›y&þšÜ†ðZkÜ×DÊ_ãËz.-”¾%RÞÏŸPÄžásбÚÏh3æ$ó­76#‰£„‘ƒ×x–©¨Ûg{À§ÌVNÅœ$Í6jþ¶Ë8¼öÑŸKXÏ»I­}?( „>s$ýöÏ}$}ðG¦ÈæþôÙÿòWx‡·ƒKøö‘-Ô%ôË4ÝÇNPoî"tIÌ`ãFòÀAœû™w½/ý»_ú7¤©9›þæ“’†k¦“£­‘Š=ä 2ù Y)Øó/©¡¸VÁ~ Y%²®æWÞÅ™Uj᧬Ëx£îÊpëÆUÂùT`=“Ð0}˜ÃäÞ¾qHw“×éNô9ûv¬Ç´¯¢‘U9,g1 (–×D Ýãã1âßæÎŸ‡‰´%íÙ¼%Ü€ŽC$•.…1>V!mi¡æÁ3&¥cÁ«!Lú3U³4’)á‰M‡ÓýËnK³ð?…en9ÎQKLäo謴a6=Çö§Î¹sÓŒSÒ÷ž} âW:/w7£¯ëðr‚FxÎâ¥èž¦ÏH/lÜœE@v>uYž€%QWY.±¼çÙ}Ññ¶¹…ԯ̛){%g¢º„Iå%ÿ¯©ë€Æ¸z2œ@r ßÇ\ ñŠëŠŧ7HUû_}Þ„|×/½õXîJ¹C´ï3ò/{SîQq:~{Ìkòµ~¿ñ.îÈÇòÝÅÍŧWKäÊ„Nlòíð¯|vÏ(Dã|ìægWÿëŸÅ=Å3QC`Ù²ï7s—(2ƒêIËÓŒO3Ü\Ž£Q,sn—ß™Ûá3t^pÓpG$¹bCqįùp^U¤ñ¾B n‹ëŽ@3¬®e»Ô{å*œä†É¦?qð2éJÌÝcdý ´¦u¯BwÀï ÜTÄhÑ‘SxL_Âjù’Åéž»VQÉagÚ}âlj‚88y}8WJ”t`”+rÂjp޼€åêÜùSé¶% ÒÄ©íéٻؑ“!^} ½â¡£”)nƇÉÄf§Îa¡Cp¾jÞiE2£àkñÙÐb*Ö=¿_ØLBuˆ„)6”ãë¨J«”ú!"õè¥Æ%äkóÞ£a¹#ËåNsöÌÁ4qò‚ ç¥í6Qâújè‡Ô—§N­âÍϰjêŸ~[ŒÚÝÕXäDU,š™ÿ ×™kßèõz`}£k2Øå¿ùüÍßß莛ymñöx¾÷õ-Üú›ÎÛ{`#^ÁEBtý,7•Çuó]~/_7½Á÷¸¼8.V|’NÏŠ@ÓuÄŒÆ^÷çõÏ*NÓ^ÑÁ뉠WX\µÒPÎ…Y_â‚DQÅfÜ€R®ßR‘F‘Cö~¸ 7Ù%‹ÇÜô)®HŠ©ŠSt/,ë¦Ë¹DŒ÷-Gùá˜b‚^÷Y/óB/ÅÜ(Õíųø®øYž´JBÙíŨçÄ~:nÓ,«W‰mþuº—ˆwœJÄÆþ½»Ò¡×¶§¬{WÀ59JTú¡3XÌûádF™Ÿ¨âΪSS‡öŸ>öïÒ²ÓÒW¿üÅôéO=M›?ëºmÈÒ€LêýWG•éÆÏ6"ú˜S¥_ù™÷¬ÞGÙðÓ¡Æjî–*[–KOM9ãàTŠÉ&c¤ÀT zlËe¨³šïîm[((ПV­XŽãbüŠö§-GOC(ò‚KÍý§Ôï˜ŠÖ çÎáÉÄܶhQX6ï:îEÍ-êú(1=R=’šQÔë~¾;›ãMYbHÃ&ê±0nb,s:Û!PãÓ±¯¥#稇£BØP„­¢M«ŸFI=m.åȧMN/PPSgL L6Iæa\ÝXªpóïœÞyµ=½H’;sN[Òóæè]‹ï3¢òó#1”(J4DÅp.˜r®ØÇ®‡®¿:î ^ù¾|[¯õÿ îûWÝz—$ ·TÜpóïrë>ØÑǧÀ®¸š!ôЉâ‰Lù%†Þ‚¥Å ?=Ç=qþ&’ìšqXaáÕuøĉ{$"¢ø­/ÛºùHþáÚ翉‹>s4T—ÞÜ^I=5ó‡…¡£|Ÿú¡ò’éïf^*9qŸ¬±%Ó<4ÏOñ™7Þž÷Úë EûÖU±†šŽž%ØPC ÂÞ|'áÄSâ`´¥¨~Z%ÆYeòøÖ£©uÂØH!óê† ©ÇDhÌ ^«ÏX´‚IpÍõ—¢›Õ)xI`Q_‘ÍÜeq„c²*^xý~¿xìæ£^«gp¨)ʈy빅➟·¶“wW•-~r}¿?p|Q¢0#ºd]ðGŽ©ÀUG€« ÀÄ)ÆË¦á ╟‘! q>ïð¼{.ÑuÀ³’K%"BTÏq3~ÄÛ˜ã2ôºë„‡¹¹Ñg¿gNÈó™ä9>Å1Ÿ…C¨À|]žˆRMÕã° M‚0µA ›é &rXiE2‹ºÓ³úÃÉ5«g IB„§®8yùÎß蟚;gáÆË+<â5þã<ĉaÄKxñå§cÈ×ø$åßLv\“gÅ~(ñ‹¾I@M§¯W*æØ™°Ï®‘„Iޱ†¾ökZkI"À¦»—-K÷,[ž¼{)e¡–2×z¾H6L=×q)b>ºñH×åÁáÒïap¢ièt×¹ôèÊÇÒ/þìࣵ?ý·ÿö§éÄ™6溇ktÖrMàm?™*P éãèf> …C _f -­¼mÖêùsæ§·¼í-éþ‡VâAÚJN¦mD D©ü1®ŒJ¤=ˆ…\ÁV½Uåí@vÕ"›Úïjò2­fHß”fuÎÄáq>y—¦×N]ÀãY’A¨¯E²œ´¥§3ÁE«äHš7gNê˜1=~í@¤hP±.`Èé-îÄNÀ•ßýúÌÙn¸«¼ÏŽ™ya*`?O¤Å+–¥‰øQm}n‰Õt¨4’sÂØý*iû¹SiÒŒNÊI§d:\º§«LL¥ 7ˆY@Pµq€bžóçÏMÓgÎLkñ.·ž P¹Hõaº:úÒØ×_( â{œËF‡ìo“-grš—`竸âw>Züò3„‚â²|ú_ùëÕù}óå¡ðü‰2‚ðx}ì®™w˜áIŸšá|'²AL`Üãâ=2B ,V™Z QŒH´@jr!Ç}–¨&oo¹Q¬µ|"Ó¾„+·í±Š*ˆáTõ¨"-»ÑõçI X‹Q|Ï¢¼¸Ô>Ú— ´JÂýgÆ9“çÙ¦JXÛ­d3¬@‡TÂèQUkfŠ|¬žjAÕlF°[Ô£•ª)„;MÂIqÂøvài2¾y”k¢cÛ¸ÉÀŠ>J¨ à6F™/uK‰B¡¹O™`D7óO®Ÿ°AçËo>|ùÓR^/¯ròšÇþÄY»z9€œïà¢o=ðÍ5I¢šßZ« *“un–hKöpºårj5Î$;épñ y›öâÔ‚~¨ΨŽI‡P6q˜”AÕHD]çÎ¥Gîz ýÖ/ý ô#¥¯óKT|ÙŸ©+ÙÛGU£@vŸ\JçN£'^E:bE'×å ž›³ç’ aL*عeõ,n&´_²pNäÝ~ϻފgszQÇ¢†:ó©“Ò¬h‚9KýXqAê'™£%JÑIzŠQczâÉ— ÌÃi ê™sg¦c‡÷¥£8fµÂòY¡6vNT]=”½Jèó…®³ˆ„ Ó”öñióËÛžËÀÝÁœP½Êg o¹¡."§ZžY‹¢9bÂý]Àq”kÜ•:Qb7 ¹aÇ®4¶ž^ø*ÏhÕBá¿óø¥´dÎlò§OE Ü8>Æàh%Rc–ªQh_:u"Ç{vVÇ Ê3ŸæºnæE¥¹ÜŸÎY$‡9©”/ÌŠO·—Iäaž?kYF§à6Ó®­x»YÜwþ« Ëð|3±)n(:›ò…Î3³o‰ýáu3r2A’`€Ðr, p}m+ì¾Ù*Ç‘-tî)vAÒZÔÖ·¤  X4K•ÜFËØöÔØ2 }"uÍêÐý¡£¨k„!©šc%*T×AÔj=߯¼Aø^U7>¼*϶¼}3„¬…7YXë&BHÈFšŽºRjÔOd pl%‹·Žåzž_e±‹y Jy¢*ò\KÀªÉ ZBL¨!&Ì’ÙrKÁ91ÆQ`wÀ ˆi#þw èIjØì4ª6Ô“¦‡5ÕŠÛBhWˆÞÄ8ÇŒÇÆDÜ'!]mcÆS±g<õä¦P¨cÜ„ÔÖ6™H²YƒÂµ‰å´DÇ HeœOl¬Åõ5ñ WÐc¼Ý bíò§){”TÈ7 /5¬Å ùZܪ¥@p„¦BÑåeþìYd›óVMqôèN+å¨&õsÂÁ}í[}(=BÛÈâ:µî†åæ%ÛMF’;7§Í[7’·‰û‰Ëp9gÑ÷醇1êžÀÆÏ»_Hu«¿ùáŸNKçµ§çŸýNúþSßKƒ¬‘úãÌ` †a~G Vê–ñ0À @@Ms.H〱QfivGÇêÓDoøú3ép¦sæaÖÌÎtV·Ås: D}i÷þcL>Gp‘x‰0HÓ‰RÇÝܸ´*¨u ;è0à­Ä£½L\Z}k5>PóÉŠ9+>d,bæp†¼7vÕrLéÐ`°ž&;ÒÔé“Òr š[jí¶½‰ß „YNõŒfÛ3Èû„Õ`Ïá¡ V‰§Õl‘¬•ã¯".à (÷v`÷Þtÿ =Ë#*›16!kÚÖ 7¸xáÂÀM;öà­NLšŠ­‚Š„ÊJ½Cæ…š=3AïµnÓöM¤9¡ì´Qö²¹A$ºÈ…ë„á/÷ÞµâÔAÜaÔ”ƒR‡§g¼Ž‘ÎE¼üoþ!)°=¿æÖA®â{,ß$ ËMðf¾|#ÌÒœÊÑ|NqG΢ Q¦T…–O9 këH ¦E /æš¹‚F,©(çÕŽ‚ÄúVÂ)H°+AÞa²(J˜%Á™¯Ä+ÍTGÚÎ Ä©¦ý:A-ïÊò³«IŽ/A©ÀjS¢Õxý×5㈉ëð©“é‚ÐxÜc5œ«µ?´g¿h¯„®hT"iÚ œÿªØ‰ …Ç«À›‘#l¤­ÆŠÚÒD¨FóxÄ~ˆ úÆFLç-¸–4Ögµ£œg´± AÈ™S­y%Ú«‚#T$r}ý\ü£âÕ‡Õ·1"•Sð‡0Ó?sy72bþî²HÈæí:9°B¬s]'Z ¢e`2_Ä ?FKXú›šn9ú…79cÔ™2JàQÿÄÆFýûÝ¢ S\ކ- “¸kDBGÇTÒxtÆÚܵ%=õ½IÏ­ù:þ/¤ÏmBDÛ5î0ªH[Š€Üó¨w®ôävçs+¾–니yÿǯürzdÕRbg×áõŠ àZg:L‰ªÁ¡Kæ2_y‡`ê*3z ѱ+•æÍi_­9T/צfXwJ_$EîæçŸÇ¡ª›…mE̺-½å±w¥Z®{öÕ,”qmNÓ%G¡RÎ.>EE­z”ÎèñÓ¶ »éÜ™ îN³æ/Mû@Îg/<ºï£· H…ƒòÉ5’~÷…¬O÷Ü{Oš8ejÚwdlÂuœ³ƒh2;x"Í]4œQþu¦VÂ(,x‡©3{V'„¬9½øÊæØQD ûi‰û?"±‚KR œ8¡ ñ‚zà(}%`"ìF´ËåTãš0{öÌxî¦]û Ö9C—$+÷Ð|f½;þÓaŽé¾@ñRRø"³k25÷“¢±l¶O œ ñÝPÇé÷:®‰ÜÛŒÂcüâzÅOˆ \ŽõéKp5 ˆ~&Æ2ú®ë¨.›ÃëàŠÔ‘˜’9‹qh‚¾˜šcŠâ‰•p‰Œo$¶²ÐÐÕÖ:ãÖN¸@a@ep¸¥ÂB—G¯$°:ìÆ9æ8+ˆ¥B眓òÜÊvši3‹ŒÊ{Üõ%lˆC£Ãèp`ñGÐM -€Ó<ȇ€ÞpÜM ÜáO͈8æ2Ƴ Øj¥ÊŽ™-ÐázêsÖ26ù7±Ók‰­~kt.&]NµŸP™¬G4‹*k ªdç—û”»Ñ±2”Þ|r‚·ëÆ|òÑ}«pL°a85‹†¸ÁI¸½oœ•D|ÛDôV“H1=ž\iSàÆÛ ¾…Ój†›sƒ4–Õ*^LE”±°æÍiÛæµúîч ò¥tÔäV&ý)Ò“OV ÂËâfÀ]E@Þ•ëÈ»2»×®õ›Ó@sçÝË#}ÈzbÜœ@WPÏN…"_ƯªOÜWÂÅ¡eõd®†¤Tƒ¸È=µ¢¼ì=w!ÍCÖ€…m×þÃÁÞÛ†ˆnX@3ÄsÿIBd: Nè¶îØËbºˆr8L<ˆã§ æ“áM[qöÔ1"¦QÈIxYG ¢Û„òúU¸¬¸ÂÉ”K®ÄôºçÄtPbV|?œ‹Ü·‹œE­NZ;#á<€&¢ø¿n§•®ÝµBØÀw jåŒXPEŒDÉ"'‘uøê‰£ªGœ–(™r£h=œ„ŠÇ*µ wj|Äj@Ú~×ð¾ 1Q†<Ï&²oððd¬X+;=èŒ8Ø i­Ëâ¥sèÜ0PÆ'ÁâÍ¿ÈzÀ\©‘€Ùš™‰s ¬H˜LÃaû´‰B%úVüÕpnfž±p?­p±ñfLzð›Õª9õÌ„ˆýûUê ±åX‰6Ll72t™É‡Á%°7óæY¾!šÎÝo*ÓJœ{ÄÉß§ ÒÕ0ß•Z÷ ’·’\&÷øÊtHÝm1Ö©ÝT@åÊJãAåìÕCü˜ë Öà‚J‡Qžc_†)è:êùX-gH"àPcÜ)ŸÎNú8uM*×ÕaM:%͘ªÚ¼)AÓZ•m °×4$¨ìw]ääàL€m¹kñ¡Šsuój6~ﻊbÛÚv^§[İ}#[@ÿð%ÆÍóÁ Íû—Qì÷á$ÙK!ÙK'™=À%\ ÀÞyt¹xÇ›ÓÛ¸›:”GÓ§?ñé< ”ÏÍœ¹O«Ut 3ƒè©t鑸F3ƒÂÔ)Ó õê"<æ cÐúÇà„‰1uõ«ñê¿HŠ\ ÒùX¬bânà$h%éÿê é(“íÔ=óƒT ^º Ø·#:œÊN=ÊCÁÁ2’"£mÄ ±¸ÕÙAb¾Ÿ3kfp^[wïkBÄÓÍ,;¸A€L¼ž¬S lsfÏe˜#ißáã ˆ”È¢y=.¦  ?!j„hE’wƒˆÐÏ3ì@ÔDã¾£L€„„4¿œ(a–”­,’Ù Ð{í¦äTŒQ• %  ZÏ”°I”̯cöF IS 9€°Š¶Á…6sm„KfãûäzDô ôÂ1úÏï¹bмñ 9D‰ùµ„»VGƒU+½‡ó€uèµf¢èVT¬d.äD*úÅs¤ó*zy"÷1›yFï•uÈï\èD˾ñ®ä9>¿„ô³w±pmc$”PÕZ(œp ë\ËؾqŒZ†¤WÌ«D “¸È-ebiä`áˆrS?…8ƒSpU8§\Rz*÷ˆcK7¹C° xÇ¿ ‚k•\˜çP=È JPôójÔ|ù[B Eç;çÃ2G˜‹Ø 8#éò¿ý4'ÚúÕ~s”‘Ÿ;-ptŽÆœ_ÆÇZ‡ÏX –W<ÓE #„%ÌǃS¦QyÖhôC•p6—.`&r‚v*+îå‰ôI%×Êüá}Ìã©Z¦‚#ô×Ùà]á¸ÏR¢C¦1U³Ïc•»Aº€8§xiŒž£RœSL>¾+­$Uï‡~ü½äNHO|ë[iß±Ó”“oM—•&Àg•ßêËÜØÎb G–‹Ùr'qãŸHP½9àöîÚÃ8 ytÔ>:k¥¶æºÕWÃêw#›šrV§¨wVÀ%  gaÊBQ5¾7öÝé™o>‹ØW•.ž›ÞöÎwB˜êÓ3ˆ]mT@qáì”âÊî…'ʹÛ+«n|vsš>k*® @”Á´sÿQDÌêPwÓ¨§©’<Æû“•{Çð4Ù ®Dž' Ýyð0–=,m èö½û`aUf³OIèDž=8Ð àÃB€Ž:qÝt/,ûžÀëü¶ùs@ø‰éå-¸êÓ_e{• Ùe_]èŽ"9a-]—º£\»ú.W› BÙ ¦A0µÎ옉e±3Mn—M p!¢É¾#F›/+B#«déÕ—4€*éZé§2½ŠYëñ5È!ÁAVÃ6Ïî‚5ˆÊ€v}ÓàÊhu­ù$r#:‹Ö0"»sZ¯…E1“·n Εî$rzîOkM4X ·¨“å(˜Îœ@ˆf Cˆy"+zxKÀPÇÙ!6 ¬_e±«•"¬­¨ Ô3ÊÙI”¬Ä#Ç%Ù!Hú½Eß\Tž"øæßþ¨»yuŽj6<3ˆ€,®¾Êt? Ù5¬ÌÙ ¬JÛ¼£$°"®È•ƒ06<‰Äéš.ŒB}]`Ìy­Jm‰êDB9>‰-XÍyÜA rn†9ÆŽÃôÜÖ!Ul§®¨þÈl’Œ7ðp(¦bPaK  ŠßŠ‘ÌŸ¤”HÀèâVODø*8¼&DÀöÉ©s¶î7ó!tcÙ´Á[Rœ¨nI˜›,•\%Wƒ7é7=TÔt€£XáÌ. 7¯Š”b+à|±{kl‰¤VïKêO>=ýòÏüxš@¸×SO~?½øüºTŒ_Âú.KàäŽ2~çTñÍœúJIœåëÛ'#±ïÇ…GWq9_›¦{ˆßªVW!Âi0ØM¨v ß¡£dƒd!Ý­ôqºBÙË ×R&ê•'^IÇ/ž@á<3­X¶0Í혔¾±æEAj¯Ã¦ì= ÑIÞæló(*×?³)Í×ÁkJ{:qèP:uX7Îi%‹…`phb5¾îµÝ»Ó ’ÉMÂÚòÚþƒgð2!##“æDôÃLÊÑÓ]<òϳ|¦Vn#û¯²0N ý¹ñ•;Åì“0¦?“¥³'ü« âr¡çB:ƒ£™)cNn‹vDúÖ5Š!8Šm-ˆa³fÌL°§ÓPއC2ÕªÖ"è]x0ór%îø.B(^åD4 ®]ývw§k   …>ƒEr6Üé ]Ž\ŽŠN¡æ³LTÜtª$Ê\/·¤L¢£NANDäU葉Lý–»»sÀJ8<1i±Ð„^Á€;&ç b*†ÍNêÜ).éáâ>XÏ»Âwb+É Zq•OÒí°S×òÖ V[‘`gT”lDˆbô? uؾé@X‚h˜o(æþÅÆÀ8Ep…E‰„©Ì¹8‘×±–h£ZKÿ]×ðvœB2©YÄ_y“‚+ÄýÀt²rM¾ç ó¾É«{æRâiÚ[çÝyÈ둉dp-±©díZ8|ò,­o"xsæJ§©q†21eC†[¦ï–ÆRßR‰˜~…<è ïZÙ l<{·º0½ÛC×SÚÜ„ßÕø©©cæ,ÊÜÏñÛÀÇë›Üþº¨çé$ÌêÁDØ”˜»¬«b±Ãû_²éü ¼'s®Çy$E–®À‘~ð=ïJwb”Ú²Q·ï¦«d®1O—y††šŠ!ÆÍ\šÄì4Ä›e˜+¾Ê5ë:¾‹rïW.¦iã'§觨ҽ,•&Ži^}¬û—½é4Ò\Û‡r M¾¡*@ –NÈ… JuÌÄqéøÞciËËO¥äàU+W¤7?t…Ö§c”+6Ù›­EÿÔ#EרHØÔ\Yý(Äm©Kô"?ž‡Œ” ƒ ¹)}¨.ÑÆù“Gá:@üÖtàøñ`÷µÎ8zŒ¬LÞ0VÀsŸ P (<ßÈÒïFÒ®¨DÖí> è‹/÷gwé;‰ÄKÍæÈ±“ V³mEÁ§)z":©ŽéSÑÏÔ#‹ã ŠÒ¹%´¯:Ýzoa>ús ïõ˜RŽ©$Õ1U#Bd¤t7ç-».çdá¹Y¸‰g DŒ"®r\ZN‹(, H­(§î?y>=îsØÏù$Â¥è "‰³šÞå}KœP&Ò¾D“ûÐ ô÷‘3 ݣ܀×Õèô¢& Ýð7†QÛÇhQ…ò’:õ¼É|:Lè!2ÂA±r\ßGë(?y_s'pÍ a?$J£øDÀ-³ïüÉÙHtŒŒ—3cÇÀè mêun}÷+ ®ˆgú,_"ò œ`TùMš —b{’«ÁsíïYòL)r(.Õ±ÓOaLÓ'Έ°…V¸ª¸ÌÆA? Xq±` Ú‘U„;’í±9/WdÁ‡j _¯Ü:ÖÈüX&ð«a…ÿؾ9„àŒø­þ&8ïœSwj¡±„¨qLKñ݈°À ˆÜ"¯}É#¬„ã+nâ¾j®””Ÿ ¨ÄŸe‘T­6öKØðU!&\»Ì'@„µrâ¢Á—+-ñ ›¾ÑNN+c?üg ”. zžÈ§c’°pQžúRÛVè»äöœ7úÄ4Æ5Š ®¯÷—$ݨÄwLÏl‰10kñ ­K¸¡s?-ãØ@¯$·4„w ¢ÔW\i1²²†Õ ‚ƒZ@‚}íj/sÃ\³¨#œ3}sìú›qÃÍC±wx˜gàéîkÉîÐoæÆxZ%ÔŠˆ£ÀJ%cfâ—›£› ²xÑ[NO帾]Ü-Ç W}‘*f“uä¸ÇøãåºÐ_1ÞFÂlƶ¡PŸ;Ô¼“aàq/Y)I‰ -ÄNɆÏt.oÞÌŸÁ ‰„ļå}ä!¿sÁüôžGßD Ú®!íÚ~0Uá®3!¦-«s_Cœëz¹>ã!íqÞÍBO{-ÏW ¾FÛ­èQg²á/˜3Ëm!íܾ5=»æ©Túà[îZ=}ξ÷GI@Ýó}»é¸ê€é<;³8§¹ÛòOºû’„¼+Í ¿å¶ŒQú“/§»Ö¦©Óæ¥7=ø ¾Q‹Ò+/­# ZvèK„‰ŒIÿùBç¨.Ç¡¶¿«ëlš¿p~êì$7ñvâw ÎRtE¦üADÅ‘3”‰2¤@ÎçbÏ%ÀÔÅ`Í`‰‹ŠüåÆlâå ÇÝõQÐÁt`°× d=íµ·OŒI²}u1­7!Û7á'äó¹(uîÌÀ@Ûüâ¡¡¨u¿d”ÂÏÏ∀$’Hô9ˆHOb‡²KLr$®£ÑüÏvE<žQLÏ"g,8ãÈÖ. ‰Î¤ì´ÏP8€šy cÁX÷‡0«K ·Ì«\`nh—D Gå,ýAhç8ë_h›{®¹>x.+,f6ˆ™‘@Îè#~{Ë• Ò*{™¦Ëg»ÎÂ×ÓïØÅY÷0Çó餸=ž…ž&¿<îÚÁ*@@™E\ç^‚8À«GõJ#è1§‚drK¸Ê¹P#‘@’+å¢) s»~]öÇy…0õ]€™„Ó†Ø@Œ˜F1À úN?ø-ÇÍVÇ1U Œ”ý’ä€Ü<áhS}Õ ’›Ø0â7óæ~ßà†ÆçÄ ÚÚ}:¦Úí„/WOüÆÝÄŠ 9²p 3êYKã^•\$hu$rƒ ÆÄÉT!Z€Am|8Z¹e˦¢§óâú9ýWÀRbC<–Ì“^µ2­¼}qZ¶ˆè ÚÝ´é•´aÛd´eqI>ÇØÍp ªXv|q½XHz%<(9qrüøqøÕµ„Þñ|wWÚI›çl.qo©ÿø³«‡FPÖ6¥™3ÚÓ \”{»ÏÅéŠ'0ÈjuA O…Y?HPl'E…1€î$tN¤„p×Õ´åéiìô‰¸ïOJ ÌAáw%:d9(¹,%=7Ï{• ì¦áôN¿õtáÆSÞllÌh„(V‚›B‰ØÃÖ±5·ÏÀת \ˆ:>H9°šgÒåéS&§w¿í‘ôðýw¥¥ g§Esf¦ÙÓg5¤¢ôRzuË&JÕµ²Bð;Àˆ‰ãòˆãdÆ ©Ë”ˆ3o–— ã½·ô•ºÅ~”÷=ä‚;yâ.LŠ×ÜÏæTš=}Þêƒv§Ã‡÷PMÂoælrM™ H”8“3¥/æÌOÓFX:Zv]'@wŒA:#¡IXg¶¯_廄«>D Q ærk±«£ñ%àöbŽ—·ôT%¦DÖæ;¶Jgë«»ÅK$ßÜë§Ö8a)¸WÆy3r¸Z ëUþj‘“ÐáMÇ7•ÞS'OCD ÕfÂ']èØ©UêƒP•„”˜tø"9EŒpXƒ8Às@Äçý Å+íp#çxÛS9ŸÍîžÂ6" B£ÜÀC 2?‚¼q¾ˆ2—qM8V °×fN@û}÷±›ùœ’b's‰ñ—½dä»Ï®€ð»®â €»áhIULu·ÖÒÄó´62Ó—zÇ:|¡‚#uð”Ñꥡ#Qjr—Žö§ 9<Èá’+:/ªpt.…­9X©ÇÀ4ÌøyK„CÄ‘;ÍÄP'Xßìµq>"$r-œ}‰”žü× hr:ê•-{ ªÄ12¬}Œ36 ¦ÕÊusžåÔªü®¦½¨‚”}—à|ð¿q¦Fo ç\æEœ$º õã¹Ì¡ÖT-|ú™iÀS’Ë‚%ãfŸgò{¼œ3vCPÑ-^°|²‘ë7‚ý—è§Èyp›ñËI‚Ò0'Œ+ŒÅ f Vg%9,707ÅÚ5&Òàá±Ô«lOð²%¢VÒ™:ybZ²dœM3Ï¥þ©{O?ŽGM»½¯¥“H;}nf´;@G¯Á Ôn†…˜+.I0ÝTÄ '˜DÀ&o9e]*®‘¢%Q+µ›¬kÆ,§ŠU·-âÒŸPý¡±¡‚¸£ÉT0é¤Ñ¬U¨s~*9|yœ´»PaÅgSQàÔto+ 1†‹T„¾€wúþä…ˆ â"XP¬Uÿ/ÓZ–ݺÛÌ!™œ&É*g"ŠY©Î…n²'5»ÿ%I¯Ûͺ¹-_&wwÿ°y|zîÙLÆA‡-î0R¤¥ì ¼J,ÙZqúªˆUy<½AÀ„¤:»œ%97æ;[XÚÅÙô˜Ý…q˜v_¹\ðí< kP’UõDðÚÓl…Fû-Ôæ5#°vËÑ„žw±Öë²µ×™³Ðó!×;Lñcr¨mÑ!ëçäoBØý zíp®!„=ã«- Ò±‘š¥XˆÚý£6iÉŸ]6žss½â^j7Øã£ 4Fk-LøCÒ”TÛgÀXl> œã”fÌ?§ºçVpÞz̼ª‡´èßœàÇ’qkÑxLhR³ë 0­_‡‰%ÄtàCÙv𓌉Ùm+ëÁ'F3áïZ>+ÚEp›“ÙRï<‰²ˆ¸¹ó4Á´áÐbXfMò§?ͽôA„Èà ×—bX rQ¥yT/,Í©¬ð}Ë;áŠ9¼„m óh^ ’Uú…9'N~ÛŒÁzh,4j~ÜcÚ÷LK”Æ/ ç5¬¥ÅuÍ÷NpÑ*xß¼I)šP¿g>ÍCð‚™®2}ÄÑ”‘\fNGEs¹0dx¶÷Û, Ú±)‰±îßR$ÞchyÍòÃo šþÎ|ß÷Ö¢—ޞ¸«z,æ©0ãz™,¥`Ñ9†3 ½hO¿Œ¡×P Ý3 |xؤåð³‘çqîÎè?GûµùFœÐ!EË›IEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/session-on.png0000644000175000017500000000251012412506713021255 0ustar sergiosergio‰PNG  IHDRAf]iCCPICC Profilex…TßkÓPþÚe°á‹:g >h‘ndStCœ¶kWºÍZê6·!H›¦m\šÆ$í~°Ù‹o:Åwñ>ù Ùƒo{’ Æaø¬ˆ"Lö"³ž›4M'S¹÷»ßùî9'çä^ ùqZÓ/USOÅÂüÄäßò^C+ühM‹†J&G@Ó²yï³óÆltîoß«þcÕš• ð ¾”5Ä"áY i\ÔtàÖ‰ï15ÂÍLsX§ g8ocáŒ#–f45@š ÂÅB:K¸@8˜iàó ØÎä'&©’.‹<«ER/ådE² öðsƒò_°¨”é›­çmšNÑ|ŠÞ9}pŒæÕÁ?_½A¸pX6ã£5~BÍ$®&½çîti˜íeš—Y)%$¼bT®3liæ ‰šæÓíôP’°Ÿ4¿43YóãíP•ë1ÅõöKFôº½×Û‘“ã5>§)Ö@þ½÷õrŠåy’ðë´Õô[’:VÛÛäͦ#ÃÄwQ?HB‚Žd(à‘B ašcĪøL"J¤ÒitTy²8Ö;(“–íGxÉ_¸^õ[²¸öàûžÝ%׎¼…Å·£ØQíµéº²šua¥£ná7¹å›m« QþŠå±H^eÊO‚Q×u6æS—üu Ï2”î%vX º¬ð^ø*l O…—¿ÔÈÎÞ­Ë€q,>«žSÍÆì%ÒLÒëd¸¿ŠõBÆù1CZ¾$MœŠ9òÚP 'w‚ëæâ\/מ»Ì]áú¹­.r#ŽÂõE|!ð¾3¾>_·oˆa§Û¾Ódë£1Zë»Ó‘º¢±z”Û'ö=Žª²±¾±~V+´¢cjJ³tO%mN—ó“ï„ |ˆ®-‰«bWO+ o™ ^— I¯HÙ.°;í¶SÖ]æi_s9ó*péýÃë.7U^ÀÑs. 3uä °|^,ëÛ<ž·€‘;Ûc­=maº‹>V«Ût.[»«ÕŸÏªÕÝçä x£ü©# Ö¡_2 pHYs.#.#x¥?vniTXtXML:com.adobe.xmp å? AVIDATX 푱 0 ƒÒ^–Ózz_`a#³%8#ß>0su‚èß1!ÔXò7uðBˆ%Sß1!ÔXò7uðBˆ%Sß1!ÔXò7ÜëìhtIIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/intellipap.png0000644000175000017500000027425712412506713021344 0ustar sergiosergio‰PNG  IHDR\r¨f AiCCPICC ProfileH –wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû2:Y~ pHYs  šœ iTXtXML:com.adobe.xmp 1 41/1 2909 121803/20 1/60 2 0230 0 0 False True 0 1 False 6311/1359 0 231297/38 2 5/1 2909 37/8 0 5 2.3.0.0 6 0 4146 00000a43a0 035021001653 0/1 0 18/1 55/1 0/0 0/0 EF-S18-55mm f/3.5-5.6 IS STM 1.1.1 1 Canon 2 72 72 Canon EOS 70D 2 Adobe Photoshop CC (Macintosh) 2014-07-24T23:57:11 2014-07-25T00:00:05 0 2014-07-24T23:57:11 1600 Lðfc@IDATxì½ ¥ÕuçyßË|/÷Ìʬʬ-kŠE€„$¥6[h³¼hí–;fÔ¹;&:z:fÀÓ=Ç㉞i+d[!·—’ÇÖ.„D@Ä&ŠJ,UUÔ–•û{ùæÿûŸ{_¾,ŒÜ (”7óû¾»œ{î¹çžsîú}¯’Ö܋ɊWSšâ)·§Ïg½)vwKÛÎßuþö#Îëëí9§»Ö½¾ÕJ£'Žßõíû¿ówé@ú<¹§¦¦º÷ìù‰øžµµÈ5tr fgÔšÿ§ä@á!O](û´®¡Ös(ü àvmØ6pÁΓçoÞ¸í‚uCc[zëõ-}ƒƒ['&&ROOOªuu§z½&Œ•´¼ÜJó séÐÓO¥‡xàÛŸûÒ×~W8îþì‡>Ôõ᫯^–_e­¹5üô@h×ÜOÇê‡>ô¡Ê¡C‡Ì»={®kJKŸS_ýê³&Ÿyúäî'Õ·¿þ’3>²sr½zö¾­#ƒ#µÑáÁ4¾aCêëïK•j5uuw§Þ¾¾Ör«ÕZ–k¥åÔ%C€S0-7šÕ¹™ÙêÍ·Þ¶ø©¯úŸ¤ýéo®ºêªª.ÊNŒ`í¶ÆgáÀšx¦œÅ¾zÉ%Ó•÷¿ÿýM)=î©®64”F7¤îáñjª^¶Ü¬^|äÄÒ«fÒ«ÒHßèä¦áôî7]˜.ºà¬ÔÛ[—Âw5»»»–5įTi…ŠbººdªxùÓ³’ª]ÕÔl.§Ær“pKKó'çêwß~GúËoüõ¯?~ÏS-ƒÔuõÕWËÖN|¶{6þžÖ{9¿fV·ŽUQók ãž=SÆWøÁiâœÉK.ªw÷¿ªR©]Þ\^:ïÐ3óÓ³Ë}KKËëŽ1Xl¥]mJ—íÞ‘¶mÙÖ¯ëoŽ 5‡G†*]ÝÕêr’.KÁ­ä<õ‡²÷Ôë©«Ú•4 H*÷þòË%Cј91ÓýýÛnIÿñšÿûÃï^¼zmM`uC®…ž~Þ @µ(»žËÏÖ»¿á “}‡NŒìêJõW ¿«^ë½´»»¶µÕªn\nu¥……F:z|>Ý÷ÄlJ'—ÓÐæZzÍ™ͳÏÞÜ:ëŒí•­ãë+ýýõŠzz”¹ÍoÆë|eÅÎÊm%§ùëÖSÕ8?Fú%,8~¢ö•k¿zìÏ>õ™Ý?œ>”ºÒÕét Põ5÷3â@[ Få½”ÅXט¿?òÈ#Õ[o½µ!û±y³ Áº£G§_·°´|áR³zy³YyÍb£±£«ÚÓ3ºnÌsò“³‹éàÉÅ4=ŸÃ#õÖ™•í£•ɉ±Ê¦‰‘Êú #•á‘á¤U|Á3˜ˆÞ;i¬ܯ(vŒÿSÅpôð$i!8ž(¼:å §F- JŽ‘AZ|â±ÇêŸûügþôšoÞü_äõ€µ!´9µv{>©z>§'Œ{øñññÖsÌ‘ûT­³w\zÎ¥=‹=¯=~tiËl£õêéVï=]½©·»––•4XëJƒýµÖÀHÿòÐp_kÃpeãàpUCúÊèú¡´nh  hn¯Õûº”×J £g^_­t¥V5 fúRn”«L}£)Z-ÖåÏS€èÎKÆ p`¹€Zœ]¨Üzë÷Ó¿ùýÿíŠúâ%—\R»í¶Û–¢ôµû~2B²~2Ìé–ª»KºžcÁ…?÷œWŸóÖ]·¾}phð¼‰ñÍ;tÕ~p÷½iï§3¶j‚¿~¤µat¸ÙßÛÓê©õTûú{ªµz·”»V¡Wïí©§žZ-Õº»R• …GiÝ_«‡G±­ôRté7JN8wâ‚ ¶kI/÷ðtéd熋^Y`ŒJïï” “mÅ6Ž=ÑýÕ¯}ù¡Ï|æ/_-˜9]]º^È©W4ŨLš2ñÓÓÓ•¡¡¡–Î"PN!\Þ5w:q $ñt¢ø¹iõöÜ)=}¿À/<ó‚ÝoÞ¾yòÍ£cç¬Þ=11^]?ºN[nýÚs×\¥º¼ÿ©CZ‘¯§ c£•¾¾zµÆê|Ê­í¹¶B£°(´ØÆì!÷ƽy^Åw>`[‚CgQdë‰ö+Š-œY©øñÈy,ŸËè„!†+x5+h<þØcÝŸþì§ÿä¦=ßÿÁФvÓŠ/)]}µQ“µ8*àŠ¦G©lo~‚Q“"?ûÙÏ. W'lÉÓùd³6õèäÈiâoKÉiBïs‘ÙÙãMlÙ½ñgì8÷Ýãcë߸exìÌMãipd4õô§în°iÔÔƒ³ ¯ž9.©µ”>uKééy­Ü”&EbÎî^CÀÅŸ{v’;‡üèA86«¼œ=ýS™j±†•—\à?Uá ^ží4ÊÐ%££©Àbå–[nIÿËïÿ»_È7®üWö|õÿúêBg¾Sý?åšÆt½® ]£};ëãsûÉ­.Üš>œ÷"Š,%ö®(÷Å—]öß_°ûÌßݱmëÆÑ± i@ór†êݵZS ¿,e—ëÒ»fäêÙ­ÌZ|‹);su©žš^‡â3œW¦¬è]ÎãDŇŠËetŠT½¤D¸jE•Àjdå¦ìN‡"“O@Ñ¡ìD;gNÊZóªSê®v/82]û»/ÿ×êÏþ|ªɸüët=­ë¸®]`˜×U-·š•ÊöÍÛ>6={ò™o}ó†ÿFI~×AÓ°¨Ãó¸3 Ñ:SˆµiÄóàÙ rª,¾¸_t\eûÆ·¾é/>üÞ_ú­“[Ô‹vKgt‚VÃy);½·/”žœ?”Ê~„9ü6êÊÝã[©`ÍŠFê|® EÖévÝŠpõ•a*bl墯 Å÷¬À!桘Ȼ:%‚ÀZåw|Qj% ¡–R)Æ©ÊÞÆ\Fe£l:»·ÅHy‚¡¿¶gY Ò"/JI¬äRø)ù’”ŸÞ~Yï”2´E!ôÕšƒ‹µ Õ•¸²–áQŽh0Â_ªaº¦zâWbÁ =¦ÊIâ‘à ½äNUñËsÓ3Õù¹YÑ¡Q†èÑ{Z{é†IåÂX0z°¡¡>ŒZ¦Kû~ô£´ï±Gï¼éÁ;þýw?öY!f­¢‚Ÿô 5`kî?§ûUŸ_XÔkr©[ ~=P+š+/Xx‹°òlJj™ÇÛ!Üò³'Ô¥Žä]’ 0ÞÆ=c)ΔGÊ“8p‘Ç/ø,IÙ­ä³i^Ïù)»zøæ’d>ÓÇhu ߫ݽ ¾•© e…Ábü¦D%ÈŠPYÐQªê£¿@ž~èæ0÷6N¼Êé2 +cÈjßÐ@«Þ×Óo½¹bjÔ2B1eP„ :ÛJõžeZÃÃÃilÃúî³wŸùš³wŸûÉ{w?ð?ÜüàÞ?Ü÷ŸÒºÀBžæQÜÚ´.¼À®C ^`Ì/>º2˜øµþÊ]¿þlܸy¢Ùh-k™¥ jÑCAŠ:) >âêÙ¬ž¡.Z— ‡ß‘˃+O ’G¼E©P.âbX=qY{(ÌåÅÞèÙ¤èóVôyÍÛ—4tž]²-ü6.×t±›žTþr¡SÉÕÏë/œë™iC½M3áN:#6çŒ^-Xp¨VŠ A8\ ü%ÞLP€tªO¸¬ðÊò’zv;¥Åè‹ Fv¥|d„ÿñÒór³ÕÔ[T‹sóéØôtדOîO÷>pïƒ_¿í»ÿóÜãGþ_rwŒø ¶µç ÀÓy I²›=øÔÙ§N£4ß”|#|–Ì ÐÉy4ª'!Ç ÀZQ$=K´bñ±èŠO§ c…—‚zÈ+e ¥T.çšKin~^×\š×µ0¿ ¡¼^`®î’+^ ä¡ºéêÝuãÃp´‡íL  Ç4A ¸õÄY‰V¼Ðh§xVxûU#£È0ÎBý"§é'D+&&Ö¶rrX±^<<,+ñôòà åQ¢#H¶PDhêtÄ’Zà‡2T©2¥D Dùõ:‚±8E9³•ÞÈT†a2Nòã lG0â¥ØÊÀ ¾±UXi õS%â;s T:FĆAþJª¥j ]uë†\p~×ÐØèïv÷ ^¾çÚ=ïÓ;O­sý»½ @…}£ÙãÓéÉÇw¼~ç^²!„ ú¸ØÄŠžÈù=?B‰¢KJuYÑ= E­0•ÔTïÆ=ú ¯Ã0 ‹sžË£ðEO>ÐÛ§Ozéå )z-÷ð"AzÅ !ÚLZÜtÏ nm âP ÔÂiÀËQ›pJA‘t d0+_Ö 0`(pítáceÀ sJô²^B¬Q(ž5¯¡ øŽWJ©—Â9xaÚELì-¡p`ð+O9ãÓªÊ×£—º{úz[;·O.ötw_Ú[©Þøµo|ë]2ûÖŒ€Ùö‚Ü^ @ýMe¡%¥}êð3IÚ¦×p{µÿÍ·p(ÿ!Æ%6§IËœå÷Ö=sÖ"æï(ÃOAKÙeŠ Ó)ê•ѧèÆè£‚>²žÑéJ^Ó.FnD2RZ‹‹•š– 7mÚ¸xùe—ž¥ÑÖ5×|kÏå2G׌@''ÿñþÓ٠縦Æò‡ÆåF£¥÷ãÓ°Àlß:)[ sý<%ÉqÃ«ê ¿YdëŒÛÔƒ<{Õ(ü¼¥ææQxõðŠãð s~>Ø9Ø?¤6ÆKÙcí7¶áB)¬ÀÂÕÖ+n¦A‘¦‰d)‹“„‡9U$~*jß)Ê„J:Ï\>I¥‡%n•#\èÑŠÛQ9k9t¶q@ ʯG;S†3‘á‡ð‰‘@)½’ &œŽÙFÁ¥¶Ã âmRiõ(TM ­%HõÍ›·,^zéå»çË×~û†Þ&#pbjjjíËÈ™õÿØÇélÚun´šuæâ-IÖÉ“³é±'O#úHßúÑQÏÁ}0HIä‚ÚKÈô‡R³87£÷ÍjH?§9î1®N iÁÎ[s3iF½ü‚zyF Þ{—¢÷öö{Hòû°ÀBŠ`ê*Q1Ž&„‡+»ÀòtVk92¼¢À†Wtò3§‡’‘Æ!RKR‰Ëaå´óC ¦@ªÜR Ó&õØ¥6”9+÷îa=T¡Ä Ñù¢¢âEÅ¿OÀS/¥å$0h‰Z¯ÐÞ&È ”‹AU'®¼”m:ü4µ*½%?°â%i*‹âYèÖšÆP°˜Ø?0Ð=¹}{ãM —ÿrsqé÷ï¼óžÿ®Jº‚” `íþ<9pZ€¢—Ö\÷ò2+ðZø“äèü]Z’²?yà1 “8!ašÓŸde^oÈy•¾®!}Õ—&÷ŒEYNåa0ø5žº„Ï! oç”5|6 DYÐ#Íù`Š·¢q±h†KÔSèbw"”½½ß®x ¬ìÎ+Ú4”ÇEœü™ :üxQD]¢ò™MŸG‘BНâaì¸xãtaør¹+)˜6Bœ¨‰ÿqHˆ8oº¬œ‘8ÇCáÜ¢£Kk-wø°$£¯×»Î:c§ÖçþÛÆÂÂ1)ÿïO­­À¸ŸÚ­^–ý©³¿¤*SS×÷ìÛ·¯±iÓø«&·l{‹^n-,,èõû&?°¡)À°…Ža,Ç„‡ú‡ÓÐàHÒk²Zµ×·ê:„£—U˜Ó3,¶2eÅxîš¡ðü<§ÑŸpS,ÿÎú—•ªÄ;†£×³Â)1¢¸GÈÈ6JÊeH ¡“sö,\rè&"E3º§´!’O ÒÛ^¸`Ê |qªPóïv9 Xä!_yïž”xO!„#Œ‰(˼âéz– êIIü‡S(=ASÔüØè@@ž‚øHã‹L>Þ ˜hJíÖêïïÕ ¡ûûN¸çþ;ïý!;X› ÀÏçéN'€üTeé»þàþ ¢wΗQ~êùôS‡ªÛwîø­ÑÑ}»·»5¾q¼²uË–´q|"ŽŽé£ë¤øÃ©_Ã|  êö%Fô~R0w:„ñCÒr|ôþ%.b¹Ç±âŒ# o(FVâ‚Àxr>àŒYaŠ Hˆ¼îRô˜žè8°¾Ú-å×°ÞJh\Ê*MâByy–üà`ÈJG™A‹tG £+¹Þ†ByÇ< ³_OÖO¬ ò3=Ri6Q¢³EY¥þŠj×ä\_÷ƒE„1"‰šcL«žòjÊgM%16\ Öê½Íþá¡j­ZÿåûîÝÍû;ÿüóëú ëkîyp Zýy¾d úÖýÇG/©nÙòc¿Ê£¢tþ%o8÷Ýgì<÷c¯:ç‚svMîhéC••¾A)ºá”-º¢!”Y–‹ôŠî¿ô,Âj]aRGañ·Ã•èp,°ÖSq.+'x sÇà @Ï,¿=+càrÙÊsõ\®3†Ò¬ "CÀƒ'óû0ƒÚ†S¬<Á èŨX±e!bš”óƒtxØÒB‹ è+;VÈ(ZÐò¸BQ’K$JÚK”àBR‘:‹¡ƒä‚ä  xÅ*_@ElQ~ú±ˆ×=2‘1B/ éýŒ:÷ä(‡ÿFI€5 V$|¸À­ÏòHAb˜î8CÒÕc€:3ÞŒ |îM•íSÁú4ž o)8äeqgw„'ðŒH ±©©U©»ŠRÜ:ÊÎQ®£1fZ[àGe±q‘>Øå‡±tÖD…¹`|–xeZF ^+^Z:øôÚ 7ß¼ÿš¯]{¹ ŸX3ææ?xËìþá^lÍ秺>ñ‰O´>üáŸ:|Û¶ñŒôæ·\ü+ïÞ¶eò­['·lŸÜ6™FGÖéE¾rSoútšÖŠBð$jSϽ³k€ˆª”НÕH‹¬ä´ŒFä)÷œRŠ‚L0m…èÈë^Sa {tã“JÉ¡ÕêµQ:+„oPXæèEïnxòÊ™^¦39à" M$*ºèI9é ý•Óå3ßÇÄj¸(dUå=W—0½õ°pÊÚ F๜©3qQxCˆmE”¹ð¦Ô›)ò•ÅÆˆÚðs6ru\X߈7*õÒÕÒ“ûŸ¨}禛ïýæ·®£ÀŽI¦Ö æ=dzˆÉs$¿¨ÑVú³Ï>»òÉO~’¥æNwîù—ŸõŽWï¾ôÊ›·¾qÛ¶í£[7Oj?˜ºêz7¾Þ³Dg(BéU‹¯ó{p[^‚ìɱ‚hÇ; 1Å0HA„ªC^³ ò‚c%S 0 Äà´…;—<Â]z¶’Þù¤<þPP\~Ä× @=2ùL)@¤xçQ(V¶/)0VñÙÑ«ÆôÚ2(°…³qá >9×SO—L!Jq^ˆS®›Ê,Ì)ž|¾ËcÜ ­&œÔ¸Ø £gÃTH„S¶ó¸,h^¡ÕtOu¦l¾§À±l½NÌ›—Kû~ôDíú›¾»ç¦o|›Àp’Ÿp`í¶šðùgíø9k®ØZ)ýÕo~ý¥ï;çìó~a|rëëÏÜyfÏf-âõë§³õšh«ÖÝÝD_¤ƒZå—ºŠr ²!A‰¿S°ÔNÔ¡¢t+åf_†/Ðu´Ð’ˆWaïÕŸj”æÞKÊàgQ2è?:øèmM#é\TÀxééPr.²èÏ=»òSœãt‡˜(ƒÞ^ùÔ ¢”h;JÌê¾ÏÛƒKaãµqàl¾ŽÕhŠ„óœZ…™T‘Ao:¯á4ðÐhßO¹)OQ|Œ;8™ ÚVVÐ@2?Ãp¸úŠƒ#пì©@©—žX. ƒ\ ‰øˆ1Ý1Xð”‚ãÚ'gf–ž|ô±Úu7\ÿéïýà¿AaXX̱öDkÿì¸qª5¾ü­¿ø†÷œ»ó‚·OŽo¾\{»µ±ññÔ­—yzëõ†W/&Ôz%”¾È• —`-Û*„!$¯iŽ„ê†ü•Šm÷t9íYab¶r °BdË O½ÃUpsáò$wÊ×^aÏAïUEBÁq¹ûË©>vÊ„M)( _()Êç¼fÊG”ÁSFQ¿0 >À£µá DiÔ ….`LE¾åúGÙ^p P¦°˜^ê“#œ‹R(º4”Ë–f,J/Ó‚ÈŸ±dü+8r~Å7ò(ÀŸOk,µf§O.ßÿàƒ]{nºéî¾ýΕ;W³皟öü9ýèŒ~ÃÞC±Á©·¿åwÏ>û¬_Ý6±í²Ýg™Ö­ßúùzm½«©lj¨ŠzùeõN‚ƒ`YXÕð–ÚHÆÕ@¸ð‘–…M»bJ8žÀRùÂñ7üܥĥ`¼µAÅ#È¢ÅÉÙÛÂiŒJ”a^`ýtdôò2RÑçRÏè |I Vd•ËqdNÓ1O_Òf+½ AôÄ]îÁËÜž^\£Óa‚õÇHd8èùÙJ„ ØT†ôðŒ*°ÀÇ[P&øÃÍw|vÐXê ] ž’Yyä DC§3r~F \|ÐBL›Êh;Á¬¦@)9Ît(/_\šgM@Æ@ÓßÜ{ß}•o~ëÛÿü¡Gú÷Skëmvvzh©Ÿ…£5‘‚_ùÕ_ºöSïxýî]gø§¹j==|>BÈ,çQœ^#&¤‚ïÖo.]úÚKFg—¾øÍ¯]ó:}LäÈÔÚš2?íynü~|õªó¯ªhÈêßïùà•Ÿ~ß/¾ç’¡Á!–›] aùå˜7é@O=7*Í‹0E#»“‹–ô°>h Q³XœsVys¤Õ ¥Qψ!ŠÅ ¡×’£q €N“Fñ,½¤Ë*t’[ä'Æ‚^”•‘²2eˆ0°zh` ‡ÄË‘ßso”Xþˆ”2 dàæò)¼Ð:²Ù •òôäÏädœà€fð9ˆ‚»Ðå⹡Ÿ.¿ÉCZ1„:ð_G8¼à[1…¥ Ô2€õˆì'½ð˜¥">—N˜ºã\ÿÌJ|öD„¤ëi^êÉö`c±áÃB¬ èsnKúPLí»7}ç{×í¹qJÐü8*#à°˜òü<ºÌÖÿ¤ªW´¸Òýþ÷ÿØYý³/¾ââw_~Ö¿¼eÇŽ·œyö9ÕÍ7IOZÕcÇy±†Fæ+¾ëôåž²ŠzPQeP0”"Ò nhà$4m¡ÆO\ÈAäè15——6±à†âGÁëL,ø£ ‡…ÛÎn TN“8+ …Žž;/ºGµ£·.#×G°Lð³õ…"Ô1”>æ2œŒ ~›9|ÌýECæJ¥”šmÞdr#RwñÀU†…~g|€‚$óE4 4‘^p ,¦lþS˜H;Åj=:ã4*ZÝäŒCõô«ÃÀ‚LôŸ`pðºmrçÔgÕ»ubcê× ¾Zﲩpˆ';z,œ>Á7ü¬œcë×§>ø!-Ú5„º¬ –D#pŽ—`D\QK J†áAÏoÉŠ¢†@… Y9¥XôFV Ý/ˆh Ÿé¾È „ÖÔX‹ò=¤—¢ef޽r¦J„]†¡¤GD ùUñ\ø6àdòƒü¦.*츕ÍMYêG¨ ¯@Ô/rD9‘Ãúår#¿Ó"ó úì#-ŠïPS/1ÇmçünÁ üxžl`ÛÆ@ÀLj‰-I0mÞ)l°lœ¨oÔ“X O ó¯/i4áßT”XÒ¡¦K>ðPí[ßýîþðŽ;þõTL(¨£t£ù¹¸Ç~ʪf¦•a¾ºµô¾ßüÐG>²mÇöwuÆîñ­[6K¡õÁžzSŸÄÖò~•A¶ÖØÔšäñrÇŽÑþtCŠÒðÏPiWÀ½c6ÆÑ·„¢GÓ”öɼпH#…‹^Ò½J•Û¢­ô$‚Â<Îå"P!lôÖqÌ–!$ʈ "ÐdCù­lÊÙHñ!€üÀP7 ¹z&ÏóUFÉÃnü°ñ@ÉïÑ“YÎO\áˆ=´†³ð—„©§{uâóðÜÐ#ºàoG8¶à]A˜É0XÀ©òG»(þS8rçtãëÌF<½3å‡A‹z¢¸gºÜQçxãP†5c‡ç\QZ”½RJø¢n‚Hñ•é §|蕃BúÕÖñ#G+÷Üs_úûë¯ù/Ÿzô‰O"ϧ¢|E‡£Ýž»>ûÙϦòÂÎæ]¿ùÞ·ä_^¸û¼‹ÏÒžÁuÃ|>ª©C)´²7©½À„ôñ/Å`šáöñéétâÄ )k 3‡‡FtìW¿*…66Dƒ(û²p€‹†vGƒ‚ X*0DKi2”CÿŒCéCwh!ŸpPNþÃâ} &ĬÌÙž’Âa°Ê^¿n¥+^i Ü"¨YÓ~1Èe){1Æ„°ª<Ó¿í‚Ö•  o‹Çt©RVÈŒ«¤µŸæ+åPÔŠQÉì0˜ñÄQM`ÁLrtÜ Œ¸ó,él‰â¢­A‚ºÓN ¤­Jþà¥q8GܰAñqæQRÄ•-M§(Šo‹W¸§2ãœí·?¸ºòÞ@óðágº¾wû­é;{núÅýOï¿æçõŒ@´€÷“oS«WMßù±ýæ¿»ìâË.;ûŒ3=|¯õõhí4ò(ªß¬j_¤™bÕ9è.ùËÓíF@®ø3Y¼Ä3RóŸØtRÉð7ÍʬŸ.xeGÙ’³B<“¿³í.ÐÈ•_m¡øjoOï’~CB?ÍX{÷#?ò:p’ŽN_š*VZy^Ùî40$+ÿ9ÿô·ãÚ¿çW®<ï¼óÒÈèÈ’zr}+µÍb¬ =|À£Íðˆ£uJcÒ0(=éRCg·™++FÀgÚu°ш‹fVû•ßæF±NËå*Þå.gʺËÐ<à#%(3ÿºŠâ;#£ v„ð+³…NaF1¼yæ÷> è6ÔÁääªÔ?hRdÛ xåV`‹ŸgÔˉwâE%Ey¡.S1Æå'<( qÆ^B—xp‘7n§Âšõ‘'2dþîÕ.¾“-|EYNË™J}Wžyte òFû„’ã×¥¼aܪ«Š7Iª µÚ # ¡jWŒÀÈàШ¤øuû~ôØ”ò³ ˆ^¬fÖ*l¯œÀO4=ÿåÿü¿sî|ßä–-[k½uÔÞC}·_–²¶€åƇÙö È [<'Û`>8¿í!²†j8>ô<.šÒ¥”ÜÑ2‘lrÓsøGFÇe¶›N¹-h~qoÎK¡¨aáÈðÄ0’)ó|ÿˆÁ uy½Žª‡çU¢ÁDè—ÀëDeð“DòPSz©Ÿì *N¾@êoP Òõ¤˜(ÐOü%Œ;¯2•õjÔw”„׀Зë¦8Ê*åQ~à¶Oå*‘r üwýˆ$ßíÍ~0ÝÁ·6ÂCÛÀ_™1z\s ÐqÞÏðÖ¿ðg‘v“!ïèë[Ò™”3518ó‰Ç÷ÿ-åüÞïý…¼âÝs€©•žçÇÿÙ?»á½¿påºõãëõ¶^]Llj9Á£„Ì/K»ù¯‘ÏhRR£QÔH'©@«¡}_­´Éþ8ë5ýÔ»(#0Òì„uår Ê©iuGh$0Ð…ðð—Ü“<Ãú8{wH+ ÏÓ9('û-jàBe2 Ê `Aä‘e{”ù#ج0Q7Ã™Ïæu;Fy¡Àc ç'…âf}#)Ã+°‰v$Ò6=*žÔ+2v·ýN€ÑÍ “ß<ÍéÆL;LLŽ _X«(K0ð:`ýð¬ô‰ÝiÛÚ ob­‘œÓs·}޳±S2îÕ¾žÞåZ­ï53ó³ ¿û‰ß½ùÿy˜ <—¨–¡Ðo|ôÃ_¿ò=ï9kb㸕ß=…ks è»/¦«Ý"ÖÍ DS›ñ‰,訡Գ²À]¼^K¯]Óçº9öã̺ôÀ9ärCXˆ[y(ÒmxD«(ð¢“ú f P,ÂGš1#´ê5á VYáE¼Ê,—PåÊ„BSš·ÏJ;AVØ.Oâå _—û^‚¦<3¨Á)>b`¢ÞQ–¢òŸÑâ ÆGzv¶Î # §t‚‘gOÆ¡üí¼˜ˆ…ŸFä{‡Ÿ å’7P éœÆ«° tø `à)ÙM¿áÙRÃQŽ38PrJ:€¾àS ‘ÑŽsñÑÀ?5ZMßTèëí«èC²ï|Á»~Ê(ÀX„%_q!¼dAN”Hã“Ï´Xa]ªN:‚C¦€eáŽÞÇ‹‡äŒÿ¨*bd0ž†$°…Ùhƒ,ÂNøÈ'?ÿÈ9i*ÏJ9VÊR¸üéPv._H Q”¢º_—Qò(~e"Üá¢|"JFhVE»œŽ ”h¤çb¨` ;‹Ë&òÆH®¸Ë’_À…Ÿ˜êbÃä‘´MñPeœ£–`àš)«ÀhRŸ w~áö——³<Û¸‹€žžZ³¿¨ÚÝJøá½{¯‘ò?Æ4ø•üâPѸeG…ÿøÚkYñûÇ~ý?ÿ.<ÿ5úânæü ü&˜(?=‡…[Œ.iD@G’@¯Zò¢l4 ÙÊKÀ˜ p\?ô©¹™z_Þ`À[nÑ7E~î±<ʸ ‘ýÆ_”:%‘joÓæm9ð@TÉnÒÁRVíE’, H%*1Ü Éò« òêVü!´'ÏÀã,.Gq»<‘*M¢”UŽôàYá_N.y…ß´µ‰S:'æÈ†¸LCàŠø•{´GdpÌá\W) \ ͥɾ¨AIpŧ'Dˆ ¨¢üAY2àqjuñ”¼«p¨!i_¦Æ—¡Œ xý—éC;;íª\ù²ô9.à«UýàHcxd°Vè{߃<ø—Rþ¯d#pª¨ªÂ¬‚V>úëùü;ßöŽÍ#££ -÷Å‚ŸyË-¬.÷ð)Ê­“uÑÀŠ¡¿*çõ˜O|g¡ AÁbñ ‹‚‰UuRzëúŠm; 1áJÃçÐ*œ@ëžK” n ©‘)†1¾cˆE BéùĶ‹áÂj(`—…2ƒ@ƒÿœ‘q®8:gz„ʦÈyÍãèvY "°®gN B¨ õ#Q õ+4®”EÝ 0+vÉPžAŒ`²"©@C;lF|‹ùe)g"á‘CÎïtàsœ©ŸºJŠ](E¼@á,(>E;xå#…^pÈÏŽŒGi9™y@¾@¢¸âJ:O.ÝÏxZq…©Áë½õ%ý˜ÌHO­vÅC<òé'¼ÐªòŠr« ÀÔÔT ½Ûz?ö±þÆïìØ¹£©ƒ9Ý(™eE‰f„i……©ŠsHÈ ˆvÁ6§•g4"ùähýfŸÿ8þéߣSF†â bk0z>c“t 0ÏCF9ÏáW5ñQÏÎ!¨°Ó@"\¤éY1v„•ª|Žq¹+<"“âË_ιɔi ʈæðPà‹5 ù¡Kÿ…Gá¨â#{À;ˆ Ø Âô~0A(†4ûˆÞeFš4"R K¾’·`Ž:g”ÎK v?t®”eåç¹Ê­ÂŸ1a€‹3muV$#Awà.eY^̤¨!ƒóhùƒ®xŠ@—àQ#E­Jõôô,õöõïhVÒ™O<öøß:sa&ÌYNû[§¨äUÏÊGßÿ‘?}Óß°Y/ñ,k!Žá¿”*˜DÛs3ÅÁ ˜i^[\VààõJ¶ˆ/ T°@Ǿ:s5¶ÙdžÇVMM£†}Q¶4#%oøCˆ¡+F FpñàÏJ ÑΜؘ;n(7bóaq°Èƒ?#Épù‹×T˜ž!5Ardº²À£XÆi¤‚Qmº] íB $ áÚx 7D†7á `$ð®S&ˆ,9Ö01Z+€ ý›†Y2ñ ¿}BÖ†WDÐoe ¨\§ˆ¼pYã.WuñŽl¼cI±+<âÉv¬·s¢ë AZlä ¶€»£2J–ùV«¸¡0úŒº~f®w¹¿Þûš¥¥ù基¬Ù»woð ¹· €zÿ²íñî_ûà/ýë»v¶ºk±ã÷cAØ£Ñ`6Œn,ĶŸzÁ-MüjgP¼ÿ$¥5ª‹³ÛuQ Û‚Šc[.ÜãXÁXÊ]m78I"/H BätåžÀã ‘pq/àNÏ !c1˜ÃäUmŒƒ^Ý9rœJÌiÔ­h–y`0Eº gÊyf¼%ÜÐ’—Tó0 t2Œœ<£}¬J¶%¥&Ã\< 2Ç9@œBí¤âÅ`W¸£¡|¹Œ’IOF:¦Z ­bÜæ}Æ[òä² M¤út§ðø,8ƒ²àKÎN¶6Ÿ2.¾”f®(LGA–‘†,öôõh“ªò¶å“Ï<ø­oßü|v(”怞/k¡v2~^ù®w½wÇ®3vó} nÕ—…#3² J£æK`¢L5¦ÀóB—)mq ÷ A.¢-Ü®‚!Øy’áëjà “#ýЭJMc(ŸË…Å Æ(€q¦X…"Ö8•HžöŸ€mÇ(-»`n„)WѾo\ JÉt•BgÎWPz¾lþBœ†Z®ì:êB^`#Éx¡!è(àJP­ ÿà”³8AQN6ûå‰:°+ ó&'€F˜r^£.ðàn\º»lpa„˜¼Ä[•jO_ïRÿàˆ~®bà½>xÿ_iQð¸:Ì2b6ŽÓõæoª2–Åw®?¯.‹ª±·šƒ^‰É8ÕËJ"?A·/BÑfnn@Ýx$è"G8§»=4ãÃbƒe¯è Ã4·0—æµÀL‘oôõôøWKÏ.àp.*0†é¢À TáB°-ˆ–’¨H†ˆEΠ!°DA?4á€tÍóÝ‘ ë åâ']à¦|h͸È Â’Šb–añº@J,õÀgûu3£$î.ËQFÎa8×ÍJšÑ‚1œqXT`øåùu í×Dn%•ª›„ù­òÆž¼øÁì]žÔ“Ê`¡W¯I³Ö£y|ŒWðxt$„f«ó»ÀÇ]¸Z^½Ž¥ïK×ü A¥ÉYGrœƒ¼…7Q†3›OBàz«Žª3£±®ný&ƒòU* ëÚÄø†¥Ë/»hãÂÒ‰Ï_û=WH_Ø*§e×ì´u6mê‡ÓÅc㣽ðIÖ¯¢÷)I‚´=ÆLŒóõ9—áhc‘GÈê8¥¹VÒW@7)~p«§§át:3  úˆp¡Qäüü¬Ö8ž+Œ¢‰X ¥+¢Ÿ‹%9•ŠL‚A¹€¤b‘Ï@&£€í"(Csø‘,rè–qb1 Ar>„ÓªDžD€+âLwñ+ÊœÊø‚;WPRÐY¹ÀŠ5 eìÐáœ_Ñ&$Æj~dx¾9H>]ð–+üð ´/mƒ?ø ÎçúìÂÓ¦9ˆ2 “Iø…9@åoèëÊü€É¼¾ëχ;,@Æ&˜à™ó ஑o|d…Èxu[ [Þ¨;F¾ˆK)Œn>_ÃçÔ+ô¡Ci==276.½øò×ë´ðŸÝø›þ‰èYm+•5®Óëf ¯¦š'o¼àµçIéÄ|æFײæCŒ¾á7Ì‘ ",|4c¤à'‹#†È;~­‰’Ë<¥ãåׂæ{ûÒìÌI7⢄c¡>ŸúúúhG@Ûe9ŸÛ|á¢mJH8;Ò£·UZP ›… ¿adºœ,†)hÉVœá 0‘øÃyD`zƒƒsI‡„â_!‘r«ò2iÁ6X„•ml‚9]°`.~y©ŽÑGÏ B†·,véEN,+7ŠÍE†Œ7òv,Ψ€³2M¢Ê <9Ú?dÚi%ÒC`Qï€ã=Ì»{êú9¸Þþ´<Д˜M³ºØ ŠŸB3Îq†Ã%ªê¦H ×?/mQ†Ë‡v.âD¹¡n +[,©Ü$RÿìFU”Q{P6F|mº·¯¯{Ûä–æ%_ô[OŸ8q§`ÿ誫®êÖÅhà´t€Š~,¡uµ~·kddl¢§»®û«(èOâ«Ä˜V'…ÔßrÕÍ<ÁÀʶÄ8 ræ>‡ð ‹˜ÀOHo ò=ÁEz}ÄQÀâÜ|ê©õ(M ?F`4[Ùƒ†§‡‹ÌZÑ.•FÎB`HµS3™!Z<è¨@D+ŸWõÛÔ+À–"Œ8ŠÈe”˜B'a¨€M…o¡BŽÒB †ËøF,çPÎYu¯êÛ(µ·¸xf%÷(8÷êM¾ƒž•‡H%»d*ÕvQW )Éu,u-UîÌAýJ½Ig⇃ô/¼Vbmœ´4¤/Dõöêk¾šúéWÍKêíyÁÂÒ&|0FJýttÅU²ëÀyj4²1 ü„&ÝöCIæ©!÷Æ%»¹¬\¹~z TÎØyfzݱéÿãÉÇî‘òEA}j<>e,§ÏvRû ¸•Öûßÿ¿zÿ{ÞóŸ­ß0ÚÐ.@·Cxû­¼ ŸØ.U,‚lÁ lNBH-š´¸Ù W> ÄøÍùlK…A‘@IDATðùÂð ´ú;>}/??ÿÍÏvÓ‹ã_Qßà#´«NÚ¥ºFsƒƒi˜ýFQƒ`п¨‘Ó¿ø9ñ".”.GÁöf¥Vùá;€|IÈ2¤tl‡&C0Yæ]hâ%mio†k4õäµ$:øÂ°èhzæp×÷¿wËÌçþöó—+×=§«ð@ s}õ–ÿ N¯çVª¹1ÕV ¥$Qf8 73·âüGLÜa¦Ñf°(¡dq¢à#þäV=\–¹ ÀTæ@߀ æ†À2<¬õöX@ _ C>“&@ã·|Æçbu™.K…æt¼Å¹ Ž‚l Ÿåá¾,Ж<ĺH•UŽDX…»W4 ¾ƒa ¼À[Ry¶´*Œ•ZÕjþ 3Îèåmˆ3ª‰òˆ¼àA)¨gðN©ò3檰RÞ¶£—¹Ðóå+»:²ÍœþìößÝŸsxIßôtJ‰Q3A2¤*Í*¿ý)Ìð4ùWsîþž¾4±~"m›Üš6MŒ{ÇgqaÞuíÖ¨´¿oPòŸk÷ì–3Ç·RÅvÛ”©øá‰ª'†QnT«´!œv¢ŠG’0ËSüØÏî Ó ô@ÓÓžº&FÇ–.»øâÙ¹“õ•¯~ýõÌMM%ý V:­¦6Áñ°ÒÒ;8jYkálÍY¡Å²‹e¨šy( ‰òp©$8W”I½ƒ8O¾’—ãØ=lïŒt0G‹!|ô ƒêñ«÷ÐÏ xÁˆaá ¦Þ²Œ‘èŠZ¿å‚ráˆy‡#…:²F@°\(\NÉé+ô;ìbD·µÈ¢%¿$È8¢¦æè 4ãŒâ)§#¢”ס‘]Â?’¡§æÍ —-ÜÀ`4;+Aí¼JÏu4g1ê\ú3•”%Üžøiѧ)@¹gççÓŒ†àÓ'§Ó¬~ÅiZ~vf¼HÇ'º8¿ /ÁÕDK—Œ‡µôQX½¿Ñç5†ò³k4 ¼áYF$tÈ2ÂoFë쯊!8º«³\åÊÂ\T98Ûá"'Ñ9^¸B4 P([IVÁB¤«K=D_¿¶ÕH)ƒg…#-b-ë¹àÀj b?Xü®†bƒ’LÏjhÓFTç¶ÐOèRbh¯ü&@qFUð! áH޲UGå ¼-¤q䤮žó ²ŽÕzÒp!Èò€¨0NþX(£í¢åX.ti¹îñE#†´Œ®ffgÒ )úQýhËÌÉ…µ"¯4ð#ü¶ÑÑØ420–ºGô‚–zå.”‚OAJù‘ ýT‚Ï(²tÏõÄoB{ŒQ1úǠẺûôE辤-hµë\:pè`úúžo¦swŸ“.yÍ¥Z ÔöžŒ?½zO¯6çt<„!>Õµ2»Ž¥]pFmº‘°Àe©sùª!tâW<~d^åtâi~ƒ±Uפ•!‚ $–õ‰-[›_úšžœ;üooýþ]ÿ“Ž W´žÖAAÐñr½Û¨ÒâI¥µ°8#ƒ?“´ðVï‘5g.ÆÇ0d5ÍL€™¯´’,&˜_ª®8ÚÃÀG›ä4‡‹²‘^,\y*$XÊf‹g@Ÿ _à5PögçfÜë0 ÀE¹¾;¼Š”h~6Wh¤¼ ¾ngu™ é¿vµ”&ªW᱄  b:Êè ó–Uz-ä­(}à‹vX…ºÍ[S)™ŠJª—¥¡Õd›mÖ=úÉtLk*'§O¦êyg¥t²HÑ5Úâ“lëÇ}æÂÛa2<Œ8´1láçKýŒèô¨.DižcéXŠ¡X”EB“´HÇÌ{ÝÜM&Û.(N2ŧáwm;C¿5–î¹ÿ>íͧ7½þõ2ô=VúØ1° „A  2(m©v¬%„ÁxˆBC”k@td ÃíãrHFX?¿šG.Z žþê;v´æO\þ?>uôÄ=Rþ¿æC"œ²—½ã ä Pkrë¦7oÚ¼õ ƒýË=5}ûK?`¡Ê2ÜÔcP.ÛI=a%Œ†o¤Ã,=Ú.C±ú7L;…œ¸N‰qD,eeDzÒ ñž€‡€àc¢|"š¯e£¸J–Œ\vЇÎâ'YäG°ÄGÐô·ËÎq«®½X4„J½¨3z`­Ì<)''µŸŠ)ƒ'uѧZ ½ð ¿Ísx'Q5¢@†×Nñ¢iÑ#z$$¥PsuzõÃúôúãûŸL<òHÚûàýéÁ‡Lû÷Ôo2œT>-¨j}eýèXß°1mOëôiv~£¡WÛ¯^„Mjx·5ÓÀ%1zQÊÇWœh+>´¬oB[¨%dÁRN:¢ä&Y€¦WtyaÒõ@ ù £øõuž4<8œ|ä!›ÜºUI¢™/±ßù)À’çüàw8xO˜r„âçxÁ@£/òa´JÖöVšX…N*¡Û´«U´s¶ÜßÛ_­,/_yÏÞ½_Ò‡Dœ.ßX58±8×}bf:mÐüºÑד–P0ŽWêêj±"f¨7AmÙWxl›kðÊ—îp® #•…†Â¹¹ì‹xG™­^kÀÀxÑ ©`„ÁÏkWeqÔ“ñn€Kÿóš“Ò;ðA÷ŽkT¥g rNÉŠ1…|Å.¤‡po ¬ þ•˜ˆí wÔ¿#:“aŒ(„? 5†5pGïÊè”—Ø2‡½E¡ÕVó'ÒñãÇÓác‡Ò3ÇŽ¦cÇOhåzÉC×>)úHÿpÚ4:nƒ©O_yNî/å¸¸ØøÕxK‹s°eS*Úµ<äë%9^+Т’ê T‚´1^~}YÑŸeBœU”(0©>8Ê´sxý[ÎØrJgiËí¾ûL›Æ7¥svï¶ÑGYwh©g_Ô¢#\1:nÂç6³@m´º³5H|¤åvÎ4Ùm¬'ð& :ôç©SSZé .F£‚ìk\|ñEýÓ3s÷•¯|ù- MéC²žW¿¬O b‚Gò4ZµYõ ³zù¦O[3u UMWkYsõ-íÌ(Ágf)@£¬0<§‚¹ÍQ†¸Ìfõp4T(s97i7Î  <¹ñzôKÂL¦µ5ÈÛLs¢w`hH˜3 Ênœ…¸ÀèÚwÊÈp¹á S¡±[%œÂuÌHOÁM ¬¬d²r ”AOA ´<(OWç¶iW^žü›#™ ™‰‰¹5,Ô±^sRóõ§ž9œž~æP:~ô„¶Ì4WÖdœ]›ÖoÒ¡)µ£†õz£- ·H€³¨*cÔê!Üî±]ž±Ð*njÈÓfž{y+6”ÉH1z gÕ¹Ôq–ˆq¸è à—þ©uV¸( $ó$ÍufdAâù±˜-'Ò­·ß–ÖoXŸÆÇÆdüùpl¼!J;/é@£²éOùÜþ åèÉ¢ × £hFLᄤ¹@G;æ¶3Â) ·cFÉ'H}£FEZ3ë©toŸX|Ã¥¯Ý577óç×]·çƒYù±èY˜å{™9·ðÔÔT…)ÀÆññ_½\¿ë·¬ëä‡Ì4ÿ¬5C>1+W–Ÿ-—ÚÉ%¨šn =£w;-ÚX[|çˆÞÏÙ3£À¿G]ò0O„VŽù‚0Û”ðÕÕEH•s)yK¡Š£w%hœÑÀ9"4—mã£ümÚ9€,Ô"Š´]P¼YI$É=½/ kÔš€uEô´—lržÓg¥@©x9eZóöýû÷khüHúáÞ{ÓÒ?s䈷ªø¥åÍ›6¦ çGõ‹Ë¼UYã­Ji.ØPùÓéÒç×4¢ã‰’7­´!½»x(rÜžîíõRŒ"–¼€Ê¨Ìµc&¬Ñ¡:…ÙãØ8 n΋)öfôx|:9^+޵›è\w ƒÏáÐàü X'ðÒÁC‡¼SÀTÀÓRÃ…<`l¬aWËPXHà%ËeÅÔYƵe8ã£Ì(˜´H'Æñ «µü8KÛ)]m#\]z_¥Q«õ¾jfi±ùÔ7\¥Еn½l Àª)€¾ü¥…ÀoûŒÍ¬KÅ´¬_êiv7T?ŽEfáPcÓÔÜBZ 2BÓn¸ü3 ãkÜfpØÌ/ØÆJ(Ê#NÖÔà h¡²qL?Ú©?æ‚óZ,[5F#è•Þ&bÚ‹ ¶°ê =s €»JuÖˆ /Š©¹Y7 H<ÿæAÀ"p,¤!'Gá\À × xB++hYR/2:r8í?øT:øôSü¬UбÙÍÕ·LlNuÎDȨ„2±ª®ZŠÇœ—x4®±$>i?[}wQ !‚\9‰®{l±D QÁ*@ÛÐÊ´·A®"5ð…Œx[Ã$>yˆZCW.—ò®0ˆäU%LŸøL¤(ʯÉÚ¼R¶† ½Õí;¶¥KN\øo>qü.€/¼œ ­2ݵžÆÂò’¶ƒŽkõuL+î#.õu1 †©aù0óƘ0HÜQã­¨…ÙŽô( †¥Œ™ÏœÙOGDŒÁŽÑ]Ë"Ñ|ÞÔzésRŠº†‚±->è¢á ^Ê¡|⃎‚—²ƒâ€w¾ÀЮ“ƒT2Hk úvìáF¹YÑü´zû'ÔÃN‹,Øõ¥ÍRøA½)Ù«©ù>yæ³ÒMoØ£EQ[j(/·ÔÕ›KwU>j«§„%GËAáy>ñòb™ÒPìn €„ÛB®t€«(ªÒ=¤×"c7Šoz¥9yUJ–ŽMËp(,ã\‘¢(m7¤Ö@Ÿq@g«¥É…ä œ^1âø‘9ŸsëÖ¤M›¶¤üðNØ’FGF<"B c: ã¶®à;ŒFNhY '>ñÇN#HêŠ!²PšTZü¼¡ÌmFVçç©DP0KïÒ§„E6]duÝØpãÕç_Ð=7=ó§}õC—i=`ßËÕ0ª\wÝuüJÚ¸eÓ¯ ^$û¿¬_K©öIà8ÌJL4œÃiŸ­Võa °6:Öñ°È±‚¡ÜD8y Pn‘µ„ X=iÌh&-êÐ£Š–9mmY˜Ô˜ ‘y©„øâ£ /bLMAiœ%žÈœ«< '(Ò ä¸ñÓà¢Í|ˆ04Ðû¶{æR_×" ­;G´ÿècûÒ÷ü0ÝußÓ“ŸLú{šÐØÖM[5ÿÝÀ¶Sê®S)ˆ ‚8]׫Q=_SFà1ôí옠 „ÙAA•ÉÌ+¸ø8Þ¢”T—’[Ù­ð9HéêêÑ4I€Ðl·}ðG ¨h:Ò-cÕ5##Œ2aŒæR©¢­äÖ ^ðÑ>þòÈ€F "M—ß³~xÓ§‘̰ÖoPð1íFpÖ`fvVUå„§Á$-kíç Ö:Øþݱu›Dž›Z„AÍÛQð6Ú„ú–?O5OûÀš°ÊæG;XËÎøÛFÁEµË$ät E–ÎF¡ª¦¤KƒCCý½}WÜÿàƒ¦öIÑ·¶ Èÿ’;”·eó–_[74òj1_߬T9}×§áW—}ÐX>}&+]Ö<ŒS>˜ÈÎ ±oÅó]kqÉíÅͲë[†?Iú×¥?¢‘q;¶Ü†‰Å0Ÿùܲv ­®iK¶ùî¤ÉÈ#¶MS”èBó-ž|åʈ¦7ƒFnåi?aå ÅïZvO•ÕÓKQÈEoášÖϤ?þÄcRú{Òí?¼;8ø´{pzúí›·¥ ë7èT_L2Ê`‹–Sw|¶JA÷Ú¬ƒ „þ•%µßRdÁ,¦úÒºô%õÈp³ªÞ…¯IÁ%Éï”—=|Oö„³ªÞ™9|EFÄs^FYO?“ª'¥èðàØ‰Ô%Ã)©,Ñûª^zQ«!cÓêïMM.ÑÐìQIêiõ¥M1èõNÎÐðˆVù‡õÒÞëèëU]tþ@=3 uŒd8œ†jEŒ. £›}4 iër\# F¥‚AÀ{ÝãSÈ—Ûªy:ÅC±ƒ‘aõ,#È™ HAæ§`‰Òqt4@0PKeÌ}ý“SmüÑûÒUW]UÑz¹^6Î ÖšœÜvåÈÐðkÅN„ZÕ5Lï ‰£Á6⽿GšÀ˜fªZÁ¸R?Òà‘ €ŸÄ®Üˆ“ËpöXDK¯µñagñ‡s/+¡à% ~LÇÁç;‚R—ð÷Œ2¢LKNíôwf¿U®AÎK†HÃ@rpÆéH'Y)éᡟ¡.'-Ÿ~úé´÷Þ{Óî¸=éG)II[7nNÛ¶lÕ~ü˜”^†WJÜ×Ïü%§4FeœŽƒ‡ø¡ œ +^ïªX°9¹†Aä‹J¯‘`€Ä#í8µÇôÀów˜ Ý“ëèíÑãT´ËP¾ª U—F ªôéQM/ôѼÔÄè ðÚ/km¦¡¡ucÝ`Z‚ÿZ€ÔÏÆëÅ­~)º”]JÏ7zûùä›^ü¡ãPõssñ”\•…Á`¼3O¦LýX‘hß¾´më T®ê#ÝÏpôìÙüà º˜vEG[ /žòdðÒí| ,ðÑþøðÇE(¿ $z ò<"Œv 4ªµúº{.;>süÀÕWîÖüã¼9ÂjL/ímÕ€*Ó_†^ óKéè‰é4².¶YtÁÚòŸgH(­®ja)¸LE kñÊo-Óf®Xí•aÈk/7ÐdT%Îèr\~X±˜ÏõéE‘Å“'Ô ²èÌkñ©&á·á•2Ðk‡+ÂQÂÏö,%D,8… ¨TrÁ ‚„ [X)‡K0î °A€ÍHip(çч5¯?¦/õª›H#R N^"`È¡K—”óDþY_Ò±\~3y;¿•°ÄP_®ô–Ôô^x² _YbË«mz:oI9Bù•YôT5œ–fz®Þ’ÂÙìªÝ»æÔ˰V¤Ðiý˜ JKoÅ- hXß§0ò H"˜zzAN&®{¤ß#N²8Çô1zUjãšAvÛG½ØÎ<>}4‘Ù¾m§ yãèâ+}Éo¨ç&ít=q$Ý~ÇéÍW\aÞË6^µ˜b»‚¢1àm‘ÎÑ!£&h Í€\1´°è-ÂCfÈ/OCcP¢NÈ2ÅA®nÑLO¥oxpyû»Ò뎾îï¹çá|ò“Ÿ¼õå´à@–lݺõ’]¤•UµmSæL_åQcðBEÂþ§?˜ˆÐÓ`õ,¸˜`±,ø!vDðŸŸf”™XâGž’?Aÿ…¿?ÇG8CÁtMOø™qz ˜!†áž¹—ោrãeÜ+E¸Ä(>Ã瘠…¸,ä:YÁÄêÂ`rN+¾êzôØ1­`?¾{ç­éáÇ~”jýéŒí;Óöí“~Öüv7zuÖ½Wü.Ãyv8øxŽsû’2 æôZQ=:†Ç§$UÿXôc-@£iženÊü¸¿Úd(ëOÖ~ÖFªrBG«U·î“Z½—ò6…—ž]’ZêÉ›ò7ôŽÈ’:ƒqê廤@|¾]™!mChqŽ0#³!ó…Ã`ÍžœMO=u(=üÈ#é·ßž¾yýuéK_þ»ô©ÿð§éœsÏI;&·{jÃþþ‚ëg1â£gÚ’Q¼ÿá´~0¬5’q$µ½ø‚ ƒHA#&ž>E”§a1ºÚ%aj„ Æâv<“Ó;Ûš¢n*X^vô¤²"VÓªjo½¾¤Õ€zß`ým÷Ý÷ëóéCòí5^2W4$`íÂù‡„ŽÏ3Më4ÙÈÈ:[ÉF^ïÔv ·ÄPOYXò”“XdY]É‘©q }#û\®ý…Õmð RJ¢£‘~ý¼³”A+»Šmj~;7/aVOiÁ+ÈWa´”}mº…€v,.²ªlGÒe 4(f‰G±8â1 ˜O>”‘?©•üªŒçÄúõiý¶±Ô§5 `)þé[ô»tþÒo¾q1DæËG'gfüª-/CÕ5ÔæMÍEî£î¬Á`˜©ñ6Oþˆ3M®@ðŽ*Ø(¾°Š¿<4è­´Š¶Ù_obdÎk˜ß”‚ƒ‡Å;o׉NõÖÂk>¯Wæì:ø@y8—CÝdp˜Ž°qB‹‡‡´«ñä“§=öDzH£ ûï»=ÍMëËOÚزeGÚ±mSúüÿ6mÛ6™ÎܱÓÓŒÃt¦7‚\å°v0©éÒ­wܦsëu`hà˜Ï‹HÀ—Ö2¿/¡EIˆŠ†mJ7¢/Ç•©$ß-`G<³!ø‹:Çn‚ªž9)„dµäPexi=XF=Á[ƒ Ñ$W[?¶~I/6ížžýÓk®ýæGÓÕZ|EÌK⊠ÒÏ®áÒ£CÛ’vNž8¡“v'Óü€Þ¼“PÔZ¤ébþ¨^‹+¡3ÃÔÛ à¡Ææbáða- ä@GÕC ÉÐN2‡ 2¼à,¢FBŒpV|v]¿ä’æ¤0`CyŸ¼OqÅ‘Ë ã¼Û97ªè£‡±áxâ¢DÇÒàôŽ2jYqÒ¬V°Qøy8zæHÒÊõ†µê©˜*¥Ðû'È”·àüËÈyõž’ÞÓSªW¥'×k¹7Œ{ð¼¥7«Þ›‘øØÿÆøPSk"!Ù‰‚Aèi'¶'?Ô7kï!½º«ÅÞ–ŒsWz}T3Œ™ ŒŒBº&ãƒÒÇ7óˆ‡Â…;‰òƒö9}¯á¸^6:tèmcHû{$=ò¨ÞE¸ï¶4C§žþ,õô¼QÈü¾©‘Czü½éÛß¾Në ¿ê£À(ú1 0&ñ‰.¨ºq<ø™£ÇdîLo{Ó6Qd`QGM¤’Q4ú <È™#95P'"¹åú¹Ìø‚ÃñÀ #iýB­¦ê'‡…‚½)) ¿iÓææ…]ô‘ƒGŽÞv×~ð¿üãïÖ”kþ’¹bL€š¼—}b˜BèR¨½&:<2d¥b›­[óÉfwl» È+Èð1˜‚‚G},fmE"TØÅ3_ ;¿áA¡p¾Pë%9Ý0‘‘G°ÜìZ° ˆ%G`8#àmA¥y8HÝ\tgÙBh²¸©áí§\z;-òÀ|ÑÛ³’½¯*?¬…©½÷Þ§k3^½?ï¬s¼mçøhEWÀ&AϨ¿à¨éô–¦KR¼Å†FN,ÿ š=ý):Ûq^•g¥82EûÊ›8YšÕh %=tèH:pà +üÃêá÷>zgš?$®Já·nܘvn93Õ¶ÅZ¥¡0>¼£r)ÿ–-ÛÒ—¾ô™´k×îôÆËߨÑÞÅà‰§¼‰'›$R¤lÊÃèã̻ҽâùý›Nœwž 'v‡d‚ÎÀòIÅ‘/ _å0Þ… ߢdGin' õ†a+™ ç5žÌ“e݉4X„©K£Ñ.}HæõöVvîÜ‘.»èÕ p‹”ÏK½«J}Ò¶íÛ~mhhàÑÊÛž4‰÷•ëÚÚá³M¬°Àªt 9„! Ò `ʤÿ`XA«DÅšæ¬øJP`s˜ŒÙoĬÄñª@¤§œéV¬8_¥¡LV¿zÎpÀS.8KƒÊïÿˆ'…Æ&8 Sñë)¡`¡1†š‚’ä<|8]wã éÑGMãZ0;cçNÏKÙ²r^ågÈ".øYtb;^ÊÛ™*?sZÒ ¸Saýgú‚:îAîmã1ÔÑ5&IiŒèiy·Å-Cj‰o/²µ6¬I^¸b‚ÞAvð@ug…}úÃ:šûð£ûÒíwÞ‘nüî é«×|9ýí>¾õï¦í»W4UÓÆu[Òæ-µÐ¹Á#ë‡7éUs=éùÃíA{iZÓ…gÒnÐQàœ£9¯öKÞTÓDŒzúÀÒ¶éš<P\1¾ðnU;ŠB/L*xèvQ8ä&Ê (û|Cxsñæµ#a³ùËh#h,˜›ŒòµqRo襬ê†þ‘·ßuß=üðèÌÔÔÔKö« ÀÖ­[~sdÝÐn ‹Z„™i(õã¥w˜os!>`¡Ö­+Øn¨ñ£Oá4ƒ¯rí°âÕš9—qÔŽ!@¸®®¢X,Pê=†³Zí&'Bƒ€+E¼—K¤,£¥.àé©õ§'åÒ;{˜'?‚¹ÿàþôÕë®Õaš®tþÙgkèº^F2ßõV>aVaàK/ iÅF¹Cá9ȃ›.A*"Lqàz²a2NØxUB8 oœ-ð3kä§gïW[²5Ç«¿ºÍÀ+rjµž¥á1mËž÷Ð#ýÍ>ý ¯Pdj ²ŸÍs•˜Ü¶ã#š«ž#*1—’˜JÄ\”-&öa ˜Ê^;Š_®`•9!†(ÅÕUðºÊT»Í,—kNá¢Ü.lrY¹Òxi|,«Ç‚å'™´è ê8è¤påt8BŠåTbàôœIA}øFõ8¢Wn¯½îº4"ãøªÝ»™ç ›*NêÊ?Äàä'šè±¬âzâãÍ:÷P@@”…¤¸£ð8b"6cR|îÕ¢"m…bG„mº `FÚ…gbxxX½ä• Ãès ¢ÑdŠ0>¼9-…?x…$ÝqÇéúoïI_ûÚ—Ó_|îÓé†oݘÐ<£Ã[ÖoÑá1^>*‡• ÅF©©!Ф++ÊD]ùÈLÙðg¨¶þbCOå]70šîÚ{Kھ무y³ÞwÌÁÿ8 Tv]PV¼¢ïôë[ûÔQõ¤Mz{У)34„ØI4ª²íæ©;›ˆ ÚýÊǶ)¸‘¿p¢0ó™VÀÅ3Ç+@ ŒC‚°p— 0ÕVW½¯Öì뮟·¸8¿ôÄþýß¾JŸßó¼4änQM©L›§éøaNXADP[$–ŽvOëguþzaX[Aï–5Å ,ò²ås¾Â”¤ö0ß C°s¬|yid[yyX ¬«·à<´Ðs°ÊÎG.,—À*Q+Ýe(ÊŽpñëijr9 ËÑ\U÷fºïÞûµ÷ÞHœ»K+éZ=V|é¡£Þ‘¿à#ÝNoüúà2=iÜ]»œ©d…—Ù/ÅbÇÃtåŠ12ëÓé<”Þsxâd;n….£5æðìóú÷±ãGÓÓ,Ú=¹?íÛÿhºÿÍáï¿#-¨v7o÷¾¾=N„Â=æðKZiç`S@Ó5P= 9¢‡7sA*‚OÍ­ð¿XÌÈJD»àk¾ñõ4¹u[Ú>¹Í‡ˆØ™B¹m`á7•o@Œvª÷¿å®»ÒøÄ„¾°ÁF0¦2â ]…v;˜ ñ¿e%v³ØEˆ³Ð_Z1亴tG^Ýåø€§ÓR=•—rn…¨Ð 7߬ŒùŽ­a»üˆ§T¯ï §K1–¯ *x±!¤Æcyh'ïtí&[x·Mg0ÑÝtÓMŸ—´ðÜ\»~³yïÔÉæ¯£9~ü«ÍW~ë+ͯþÆ¿k¾öÕ?kÎ]:Ñ0Üìܲ‹A¹ÍNLn†”‘iÛ©€Ð¡'Ø»–žJM妢G™Œ[ølïäŸÊOåÏw[GBF @ ­]ßœ<ñWͶ;rèHY’§ÍNxb-‡0=g=…ã÷_»– ã Ò¡²¬@Ñ%¥_%Rp «¿økeXx„ýò×2 ïê¿EÞ/uédy§Ì‰PyõÉxÀšŒ&7ôoyåíwßýwŒ<`OÁUA.èÿ&WuŒÛ¤¦§ü)#çKÑqÉsº]AÙRL°øc âoØÀ”ÔvÛX€bÁª.Eú—J*QB©Ò^ùn³éˆ{‘’—xJÁ8âÁKÂZxÀÊ{…KÝ¡W ñkV62ÂZûµëØD”ÑuKfN£Z!ú‹]:Vnó,[†Ö¯KS½(WÀ‹Ÿ°KÓqo½tºH*¤¿m¸¼u¹UÕq hu’(qˆ& ÅPm8ZXÕ^™—ài…¶¿îà—võN£…±/\DSºÑÒ.0•+®ã“TŒ›·šËW/f¶âìÉSÍ;ïÔY÷C#M³}óîæùƒOƨÊl«Â» ?>PŽ\?+¸ï¦áÅ[ÈÃÃøâ«ÈðïNR¼[I‚b܉ËG*?ß©øÁíÍl`æY™ºkÏ‘æ+ÿï¿ož8òTó±—>Aä¦'Óh-5 ]é: 4÷lÞ<ù^sâôéæÃÏ=—!+_Š|ç÷ê¢ÅüDp‹_2Pîvõ²+3¨¨7Ɇ͇yhݨéõ‘ü˜Óºl(³îò¨0Éãêá-›çŸáùg>ïö¿ùÝßÿßúµ_ûµÿ¦ÇEtGƒ9sâÊž½;'Ù[g“…e!†x<9tŽý>;ÙÊx ÃF„WC ™Ò°ÙJõMjؘ¹ÉG‘«üF(‚…lxš€áŒÓº%?ÆëÑQ&ÒÍË'Æ'°¶»Ûó/6ïŸ;Ù¼wî¦a£*ö ašrOó¡¬ðv]ÀÌ4ɳKtÓgW‹2-3Oÿ¬8©ðU…·(Ô·< [ò–ÜU£ L oèŸf³â› ÙgA}Õ(]ô4Ð?ÔüÖïÿv³w×ìÿ÷Ä> ¶hBÙTEHBÒØÈlÆ‘½Xcñ&Úƒ’Û¶3nã:‰*[sžH9z¥'&$O™ƒ‹– •-AV¼ÉÊ—$Ðg›¾o¹ìu|Lþ ”Êõ4j#Ìú„ž5+;× lß¾óÑG>üÒkc÷Çþ°ÿ¥ãÜ¥n¶ ¿WtP9ºì,Ðßú‡Cë×”U͘? GsI%óz· cPÍÖGÂÆ¾{¶L­ª-¡B,°Ï{žfÅäºJï»7—”—ë’ ¿&êWë]0øè…« †O˜éÙ1W™ÑydÃ8½c¥²"uW†ÙÛ?ÃÕå³\ž/ Ð}òµsŸ¥’9s¶É škÜ«ÂB¨8…˜s$p³…qÀN•^æ²ÕÑö0=<<•^[°sÌ(ÐÉ ä" i¬ønÞ¼Ùœ9}¦ùæëo4Ç´ûíßýÏͯÿ?ÿ¶ùêW¿Æ”ÝûÍÚ¾Áfïèîfï¾]€í0sÓ!µ–Jæ/œÄ^|Õ¸ß !‰Ý¥÷§¦.b,ásg¹p+ì%Š\ù®×?-$\"áÝ€¥®¿Äë`¯«¸øÆ/õžþDò–qÖ>ä¨q,Ø,³YÆÖÌÛ¯ö¨)ûòNìoýIº:“6ï"ÙbO@ƒ½Œ=°‡}÷¯1O·H†–¡ƒ@íO`EÚÆ¹wƒnÐ ãˆÛÊËOû« ÆbZËöÞ,ž¹|ÕÅ3—±¥?Ýœ§…Ÿ¸·ˆeÝzZøíÍámO5«v;£`³¡°"¢ª¶b[Ø2_å‚D ðÇd9•¼•ac¤â!í#@‚cUpEB„ ’½6¬» )Aä¥ä`ªÝV>ÓuÚr|âNsïöC6C»šæ£/¼Ü<Àœÿ޽Ѭ6mNWÈVÞÊÒÃ…¼Ú†JÃÐ/LbJU>>õ×–ÍÍTî±!éŸ}ýõæG±(\ï"'f02›=|Ú­rfÄ ”ñ \póÇtÔN">IÛÍpEz,ï¡mð6Á½Þ ¤|lk-Ö#Y4„m{;®Þµcçâ‡_xág.M^?N¸_a½ÀÀ÷r½@Oj൴ˆ%-}ÒA—¡BH2ž‰^2Ô–3󯳴<µJÐÍ)çÙ30›F(]!l–"S;&Ó¡ î-ñtÓ©#ŽîÖê6XÂo\(•øW„pW×hÔgBÅbô( z£ë(<—ìÏÍÌNe0(©õ⨽:0~æ=ÐÞE:c˜Âjm¨ýùÅÿïšÛwîe®Ü ¢æTÂÉQb«2ìîcçOŸ=t¨Éj§îˆ¶[zßbÃϫרìÎ7§9#ïmvjP7neñÌæ½Íž=O5‡Ö¦–á; ?•ïgÕ{+} Lúò|FH†;ñÍ[ðÐ!o-nñ(õ ÍŒ˜@„±lÒ"*©6în>Rt˜2ƒ4y§¹;V¾ü|ìé5‡?÷ ìk¶3Xçj>µ+Us+X4 ÒTÃH…$íð‹iŠîceVÝÍpÈŠ¼Ù€ØKWà½w›·Þ=Ñ|ßË;×8H,» h®¤[Š–(êM]^|ë.˜Z‹a/n6(^ŵ-}ˆŸî/:„P.˜¤kxxÄjgÜÄ[ê_ì[¿iýâG7¯ÞýØ/žÿÆ»Aå?y SáãÇ—zDÜïæÕçÎ3+õõ]r°Ì)5†0cÝ€^LIɱƒV®œeðiõz~Þ}±1WªZhQ±jˆHb–Ü/"¥b„(!ª " Bí"9¤ÌexCZýüñô1@¾¼ø–Iô´­Ê nÄ…öN›9—=ÅÂ&[%Í…íG: ôx¥.ŒJÂgpn¿eøÕ,¶[a+­û³OmN93WšjÒ"ª­³[taJë6_2Ûøä½˜­Þ£…¿|‘¸©ôïœ~£™gÖrtë†fdã(¦ÅÏ„Açü¿×<›r8ÂØ¼…Ê Á«ðÅ×}*O Š'_xtLjBo…*ÄÕ¦Ä{^šëbi€X‹ѸÊMæÕY†·Â[ñÕ§ÐÇ®ÝMxø¼yéÃÏ6?øG›ý,ÞÙŽ¥ž§­gÏI5*q_ÕáŒ7´ü£APàCÃÞeƒ”ÊdYã.JA’gÐ++¨ýû!l6Žìßß¼}â Šv3(¸'k.b#@ñvï…Ù䙸À2×â“Ëz»âª±ƒ¢s%âu]8ƒUêá-à(«.¾xâ˜5d£lVË6!]›‹¾Õ«F6Ì?ÿüó¿ðÚkÿúw¾ò•WÛÊße¼ƒö]yö@ é¦möÜülßà#ûªŒÂ@G«Å¿$ÝNº¼‰$¶n„]ÍýˆUeÚPriTA%F-¼èX HU³«€ÛOÓ‘@]¨Ä“Џ &¯ùâgåerD]Ql8¡Ü‹É™?§…ñ$!Ýè_Œ2-Ø1šÉ‹CEm+~ UfËU­3%¡Çc?óÔÓY4†ùì>Zœ•—Lª&e_þý÷ßkÞÂRíì¹³¬‡?ݼ{ö;åÒºïdSÌÍÓŸN%²FZI©ÍCf:þÏrÓ4$Zši>|˜yé<׳Ôyàà/êUQëÃ÷ÐSDÍVº&Už©”iÅŒþ&î]­—sèäâ«É“ÍÄØ~u=ûÂáæS/_vøÙÁn¾£ì…à9Π„‡@…,fÀšIÒé‹ÊR5>#›m¾H?(É| «Ã¹2c8Þ¸ÝÓB¾õŒ„­››¯}ã/X«ñùÌdŒ#t6\©÷٨ˀ•‘+׈—8HgPÔ&]ÑišI/XU(½J C˜O½D.±¬@¼,b)ˆ¼‚žlÐJuÚ6ºuáåç?ô©é{c_þããòe®~n‰ÿ]½ºÉæ©§žê¿À¢„íÛ·ìdŠïÑrõ¡îô1Oi¶¡’}ÁœgF?sÔY9†P’×h®ÌÃ6’‘gþ|æÝÌœ<Í…ßw9 Ü¥q:aaP¾¿tˆ#?­§QòѦ˜¸ÔÒZ×  WÃl.¶%pPÎB4N Ìø¹ÛÂâ= DL‘ú¨—"8…UÝvëµ[qîüùf„¾«3ÒHhÁ_p°åÿ·ÿ×/Áˆß€GX"Ëj¹½;YjÍ"TK å=L5^&×Îð~ÄÄqž´°ÝSÕÜÖ;\w+­ØÂp%ÄÒoÿ…–— $N©„ÁT_ë§ådEsG(V³ñ¾*‡t\¾x=šÌ$ýìƒö6¯¼ò‰æ3ŸýLó_úñæØüPóâ‡?Ò<Õ¨ÅSôª;YIUüª*1FJ k]³ìÜ8©œÎÞÌ2íz·¹rýFs›1wÞ€ù¯yê„]ÞýÉe†‹s…çôíéóçèŠmg réÏ egÖSV¼Û‡~=RŠÐV ðáíîdœ‚ÀÖ¯‚Vp2Š—4m]òx:²˜É+qà§„¹ 0‚ZظnCÿ¦¦ïÓï¼ûNm%fÏ!wáÿ~Ï^ ³ä°Å‡¨ë ,R˜c¡ËÒúb©"Ázy!]Õ §§¶0Â:èÎ Ë-ÃèûÚ"ZØ8R8T ù ãp¹LÎ{¹_}Y*|òðJ«W¿ÊO½¾-µÈ”ÀÔÇÊëïü«B;ˆã‘¹yW¹Ôz{»ÚÏWÉ °FU}áxÇWóaræm¥LŒßmöìÞ×¼ðÜ Íí/Ø–ñ€®õ…„x}òéæ¹gŸgÇ Ó0ïÆÐÉ\Ö ê‘ÛšS¤ßÍ»4ï­ƒW-Pb…~æÐ–=x‘†Æ«Gw;é\§8 ?ËœÌÂÄJne/Ævt†Jv­¹§Âï>°µ9ö}ŸfuÞ!º9LÍmÙž•…ΈtkA"¼ÀWÁ%G‹gŠ™[XR ÝL_dKØñ"}xØêÙ“^Žyxæã=¹Í}‡ý Ç'gšé‡Œ5A+1_ê»Ð|òùÃÍ“‡÷!$ËØKЯt]£J™WEð~íë_§[°¥¦ÌÃÓ$(­¤‡cól¤¤Ý]Ò­ýUÓs©ºFäÿí S1¡ÑÚË0:$N>€ÂIͦÍCÜJlÞtYq·ytóüÇ^øð‘©ñ©_øÍßûÍŸŸïêÔ`O0<\ºGÁLÑl†8K sóH"ÔS·€2‰UcL30I+¸Ž‘ñA÷‘cÀ‚Ó]0oŒ‚Š¹ÃŒm†;btÄ,"¥Oh¤b÷aãö C ò›Azn)´z‘­L–X¦]·v65sÕ æ¶«WÑÝ‘{ò/° iTJådº-<ϳŸÆÞ]ë¥VtódžߞMœm;×7/=÷JsðÐ!¬÷5;ûìÓÿäâõë¿Gšÿ÷wsj°× ­ämæþý>ö.ûYF³Y""Iû5Z]ÿ‚UýäÛBpið:æX0”€fÄ…Å`Jtb¶·¬w߸B“"LÜ;GÂK€î³÷:“D5fÝåÖ…#‘ÞkпÜ좸õÕC ;RéèG^»ƒ$]ãçß8Ý] óå!måd‚q6¤ØÄ®¸Ž:Ÿ8ù~V®¹Á–Ù|©R;êß0q>˜|ØüÅÚlÚÀi· ÚÊ[ •w™À/Ã>I¯0 Òoèd-ä2¯Øàd%J¼ñ³<«É $ m&&o5W.p”8ÖŒÍªÉæÅg?Ú|úÓÇšûâ6_üÜ—šO¼òÉh+{Ø¥W“d÷;X®ø•/²ŸÖË–/é›hTYŠ—ß<̇¸y¦ÁzTw¯i,K¯ÝkN]¸Ö¼sÆ5 W›+7Ù"œ£Î­øàìž„¹¬êǼ›½(×0Ð<È=ÄPË,0mc‡hÍ3ÿߦÍGpŽwٮ̽w°rÓÁ[ùôÄéSÍVvoré^ÚPá™iHÇDº½}xåÙÂöÛx);ò]]ÂèßE7¯¸Y„³mh¼sºkðD|f[®v9<¥îѣϾùæÿ+Á’¯‚k@IDATÛÇŽû®ì"ÔÓZL|ÌÖ¬„éìO‡„sÐEtí«I„ÊPí3Á^›î3­³Ž®ÀšnvrÅ:ð…'¼ÍLxÃȾEŠ“™^A¾ùO Þqjêû±_"‹YGÒò#_¿M5ÿ¤?€Ps^þS™ˆo„{î­c•#¤/4‘ÇÞ“B—Šyz3Þè3Î)½{÷ìmîÛß\¹vã èÁ IÒ6 °T×ìg„üOÿò¿f¯‚eútpÛdH«h‚{‹GòÀ»£^QÛÖ˜¯‹ªÎVtWÜLӥѷÆo5S·fÙÔ¼ðâǚß=Òìß½¿Ù¾sgZx-èÒï·Ì€'¸š€Õ¢,3[;IÓa+NâžÐƒ+$ãÇ0¡š0õ&Ö8Ø@¼Ç´éÉ‹×iíb˜e×’é8*óÀ`ÇP–WÀØ:˜¶G˜[Â9­Aâôê³¢k™ÚÓâ3éò£Ù÷C4·s¦Ç.éÞÝ»ÒP ¨€ý³¿üz3ºyk·Õܾ|JÚ u¦-¯<É{'lãÈ·yóféëô«eÙ]x'_R¡ÇS­[K•ÀíñyòÈLôµ!ö'ÝP•6Œh*üÜðk¯½ö _ùÊW¾ØN š|‡b—ìßé¹Rè">Ú¾k×?dñÉ^²‡pc¨…œh«nZ]‡’±Ä“A…„RÕ-Ã<àÂyU Yb„aò,A’AàŠ.þu.Wså+Ÿ¼öüÛð=TE¡«qè=;¿à¢?ðÄÍYÓÈi})|µ€BE枉 V˜âÕ¾›bTÿM¼wï«Ñ6ÑÂolNž:9|öWH¸•øûîáýì·}ü«‚©ëÖXÚâÛÞW«Ï‡лMGD #4޽w§kÐÎs¤»'Þ,5œFÓ\»xœ»ÍÄÝ Zøçšïÿh>ÿ…/6_ú±×šO½úýÍ Ïˆ½ ÷§OÌ‚”*_a§"¡6Ÿâ,üW>8é_WE>C# ìy°•´×o¾ý~óÕ7Ï“gy{5ŸVNô¤"sÈ2ný¸iõmbt– _У²cØEkk1aW° íÄ T'擘eß§ ¡•t°,ìºÔÌL•™yq±W1?¦Û±ß^ÐO¥ —$—?ÄY"KÛ*w<“QŸùOÅV`8Æ‘³HS(¦¡(÷ j…Ï/ èoBŸ/që9™+‚š1¸¾jÍêþÃSÌ|Ü»tùò_Øøûž2ôí4€¥¾GK7H™œ³\ÌAü¦aT—Ì¥/´-T¥%C¤i´€6yŸ›âf=÷÷b­Æ+K•BJ¬ÓœJV‰!-ìséÆÜr¤~Ä×8óè. ȹô÷Æ%B£ÀqëÂñ‘D:±Êàn_–³ÛhI4®Á8ÈÓtÈ\£°£ä2!£û!Mò,Çú,:¬q»4Æ<ÉWCƒNžÖ8¨6Ù”µ¥zi¡z¤÷G?þqZ¡¯Ñ×½WÚ‚()°‡)ïÆ¬´*ýøñZ}hÔch:½ÀØøXs¿5¯Í—^z¡ù‘zš%´ûšÝ«½y ]šþx‰ —¸Ô8Ci|IMZÅŸŸ6Ë$‘+å7dù§\ñ­OGŸã%ÒäÐ~N’‚`T—©Zq akæ{ô Åìã9g¼Š[Ij!džW‚øg¼öîRni’*;íkZ) ß»xµò{åâ¬8ˆXë_¡ê³ðì"Æ@›Ž¥7çz0\U÷ÐS 0åúVÀ¾…NÁèÐݾâ§Yé=*óZIm¡²?1[yÐðJžHV²ßêúæþð«Í–­LKÁð¹HÂTü•¡|JÃÌ£i¨¢ kŠón\ºÑÜà YSâ'™sõÕW›Ï}ö‡›ð^k>}ìY°ôáæà¡CÍf qÖb¶­z)ð0«ßL>-#óÌ]4–þ”Dò ÒüË ð¿.à Œ»Üð“‰Sn–^‰˜xNeÞb‚»É!4ÅAT~:fÎ!ì(ìÝÀü*$ÂFhè^ƒöîõÞ(®c‡ Ïýs‹tU|ÑqŸ× `=—½Ü­ÉÓŠDx2uɰ‚ÇQÅ_:Ó pCœ•”Ђ´U¤ÀµwÎJž7»æ+yó ݺ«´u8ÜqîÊÛï^ ƒGâé–-¬¢½®^Á§!Ä[|ufÃÙùuëׯZµæ¥ï¾û¯Ú%é·ø»^+@¹Ñ–£ßÊÿIXÎS‚m’#mÝXÒÂÝ4¨Å(bÚb›m¿a<Þ ûúŠ„ã’ 1S¾Ë$R‰Ë¯ÌaóÌW¶×7J¨x%DÅ0Ï›g‘'¯õS Úð† åãgÁ˜¦W*yxÈ!©íœ»óÏvcŠü V?½fpxÞ[!©åÙ"ƒk÷QO·‡÷Oœ>Ûlv×]4„`ÀÁÅW†±e›œkÞ8ñn³uxsÑOñsëu×Äko ‹§ݸr“±†‰f’Ã;=óÕïÿTó…/|¾ù©ŸüÉæ‡~èG0¹ýHsäèÑf+a¸7¢Z›©ÉD©¬­`µÚeÀïà#v¦Ê_èÃ'¥WË£õ5žp:a›ŸÄ3LàWkVÆô"ùõ1ÏœbÁ“+IÝÀÔt†9sp÷N AwÓ;vÆn´fÑ̰ŒÛЍ*ïöånJ³‰ÁT•îVDùRï)ï2£©õUl®Þ¸Ù\æyëÎ,eÏФÛJ?v‹.ÒÔdºáOü;Þ”‡C;˜;y”6)ï SnB„2­Ÿ»0u<–gÂwt0dKMê•Ý·>^s—ŽnäŸ)×Uœ{¹048¸oaÕÒÚ‹ç.ü¡ ù¬·†û»^ß® @-Xºfÿ§¯Ÿþ?(ú(EgéW­Er#Ž"E0)Y¹õÔ$æÁªjk9KžuÙBe€¶:H”d¹Æ¸íWýîÒƒB÷¿®ÞKû ÉÆŸ¼Hrë «§õR8•3a_âꓸC´s´ŽS â“£ÎD¸¦v”ˆmZËP’n‹ïúÓ·gÙê$ë d£‡7§Oi.³uø† C9e'ÀHÓ|ËÐ#ìw÷©Oý`ó_Žÿ9ˆ ¯À„1|›¢O{•³ûºëÐÁ}Í÷}áåæðáÃØìáìíÙ8Äùí:5‡\;­ñs–­¼ÒY¿Ž;Õ‚uŒXQNWãò, ò[q+iª£•¤køöCŸå«¾´Áxæ™ç›ý3m ê.MjON§¹y‹|6/)â=Ñm×Ôʘ« Jzø¹&Åšæ¹gX 6Ît´ãîYá®°›C »î^L—85ªo¢YíVsxÏh³ƒ%·»?|øPóÎû'Xlu¦yîé§Ã¯–t4 ˜9x¾òU•6•Í6ãùVÃpjSû„ei© m8ËÝï†ç§£UçÚ\a²˜ÁP´TàälÊu-s¡;ÀýÅgžÿ_/\ºöLáÿáÏýÜGY5øºÆ§ë1 “ÍUšnÝþÓ€_B؈u´À¼zÓ7`)¤%§•1OÙ5…®ÇæÛeÂnJ©ÐPÄm¬ÌT¤$„‘(ùó)5?pÅ¿óÓßwþü¯Ëă@û]a W·Î².a*¥|/ƒ€ü-8ñ³5ÖDØ0v_œ2«Nœ‰zð*¦¨Vt0xEÕB¿ËF!¨°2ìÛ0×Fßó H¾M¸næùhi¶ùÚŸ}½Ÿ›hî޸Ǵâx3²sCó©O~’~ü7¯ýäO4ŸýÜç›—_þxóÄSOqBî®Ì}‹§5S]ì*Ag Ë$¤›ÍåzǸƒQh-S,ÕË-І†ÑWÿJ#AøÖ¿Âj/Ís[LÀRýt˜¸š-ìiÏ ¤Ò:zo¥Ñ¼|AZj}[ùíºpy\Ç¢¹)ë-¬¯Ñº_¼L m¬¹Î`çÝûìÕ8çnÅàÒGù±O`•Ùý30 ³œ|=‰ýJ³4Ç´íZè¯XÓ¼¶¶­jü›ÊO˜ËÐr ‹D—q#ñ^²¿ý­AXpù›w@$lü´Ÿõ‚——ä®ËUš ˆ#‚KhŠÍ8]¶Bï_û¨ïûÞxçÍÿóõׯ«JI$ƒþ­¯¢jüàÁ2Þ¼yd‹6þ¤Yå]ÜL¸ ¸ƒfédê\uÈ»/& E¥ 0¨y0ꚇbj®*À3™'’…m\Š¥ê]G»g¦‚ “Àz´nE|¿+ßèוé*®ø-§ïŠOjël‹ìè±>V¨AToû‹Áãƒiª!…Ù¦š4ÊD­‡ÁðÕ~Fu3á-Ã8W≓­Û#Ù·n\jž}ò¹æ Ÿû\ó“?ñÍ?ûcÍ'>þJóä“O§Â»M˜­ ÉÈ 2CR6ýà Õº»eò‘øX˜ :[)Ç,»ÚŸ¿ðéŠËTê2•¦y‘Šá— Îo›/c­q“~ü;`çžþj5ÎËßcS™ô°d¼‰ü3Z¿ÙCJÐKÊT#p»ÃEïo µþ þêü…Ë×›ë·î1ð‰±Ð ;>n¼Ö—ŠN÷³A¹Eª¡Jk 2A-Ôuøóì‹ iµö ëèFh›qç;lžêá"Ùw‘h´%7*<8-7¯*´_þ¤>ÓF%B©ÒF*­ˆ'¾]|!µpËÍJA¸…ÑqµÌÖâì_X78°mÍઑÓgÎýΗ¿üå¾ãÇ·ƒÑßøómÀð–í»Q½þÉj â`MÀY‰´²têLUóÑdj§¯Ç4 "Cì2 ’éÒ(|„F*?€Í ·Xç]¢T»G¾‹•Ÿ^¸Äá'Y¶2xùѽ “ïxè&ì.Í6šéÄ|©jy§ýxä$têJnoc'…Є7¼ìÄ~’á§‹2ÌÝ{·³Ph#S'Ïœ ¼NâQêTоV&µ€~ä忣ý*òsUá™*Œu"i9­g¸Â¿Æ.‚G²$<ü Àퟗª¿t·ìÜCæŸEµv£‡ÌÁed™îC¦üÌ¡0¼ùIRü„fñ+ÿ"—dßt7 Å·~…“ãD¬dD˜N`oeŸB º¢—ö9•È‘}Z_ÇGìW\¢Í{wÇs¸¨;0]äÑK7ncL…Ÿf`ãÃÜ…ÊÅIò˜é[†•õ "Ö©øÁI”“A±F`ÇÆDz¼ì¶*NPN›0js»w‡0y¤œ}·kÖ]צؾçjù‚ˆ 2Š?øx·—ßSÇ£<«…7x…Ío½‘r±|¡‘÷>Vcð¹úå™ñÛ¯ÿû_ÿ“שÁo+ÖlÙµaÝà?µ• Ñ.-8Œä çêìÐ_e\Ä jF1¤ðµb^Ù•v2!{ F**,J`È4ß@ÈU™¶˜¼|ö(÷0”×qÏMâÁr9œQº©]{0Z²鷕QÂft8$™û˜Œy(Íu¨B©©ÏJ)‰šP˜¤Ò,í"¦a~×K¨¸=ùÅ‹WY7Áœ4ýÚ.}1«wZ"TO§²¬TUá…óEÀò"î=fj«9aeñ·BÛºÉÐÆq#ŽééI¦&ÙJŒ9ï“g®4osŸÄ6à½óךKWn5ÃLÀs\[‘ƒJѪÍZÐE¾—/Ó¶zµ•^°Òº‡DZxÌ¢'23´øÒt˜5æ{-¼§ÙEtÿìˆC ±-G.²‘¼\ÅÊmèwne å-³óúNí±œ“^—ú.Ù¢pÙõ’4!–/¡—ƒÓV`èPä_³ÈÌFRÒÆ*äþ )g"Üä–}ùСû Ó96*ÙÁ¬]6ã^¼R¿ÅOí·%ŒÏ$ݹ°½’ùëÊFÔ OŸË Æš‰ª3~á]p7œ~]øÄR2˜†–ú?°€ÆäXÝ+o¼õæ/c ”•0ˈðñ®ÇÀ… þ{K«×¬Ù¼qã?Å*®:ÁÑÕ«°•ì¶ŠN)Yà’ÂKQH‚0aàA$ji?À8€+JH™TIÚIlãðò Iÿrµ6@Ó¥§yóWw¢‹PÑ+„nmmiRi’Š$jÓ+h½ÁÓm¹4êH?¸VæÀ7¾‘ZÕ¥$eAÓ˜_[¯M0½-ÌÙs›Yº6Óêe†Äè¡…pU1Û~c´£Ò ¿$ÚX®Ýt%!¨D´‚ܪ²ÎŸkKïj½‹—©ègÎ6ܜ¿Ææ¡w8²›…4ÌqG¦t©˜èsO±iÛ0›’2Fí­’J¶ºjæ4ßæŸ´h<ÝJËß –»C”«õ$‘»ò:õižþÎ^\¥Ÿ§3/±ëÑÍœ†ìþFÆEäçjõ«äïÝ»GøëÍáCûŸjN]º‰`dXpª|U ‘ŒZïKÏÍ1¿ÍˆðR}" Ç®ŸµÒÐ=ÝmH­h†AGDtì‹vJñfÝ·™ª<ÈÔ`4W`p-S…s ë&2J'QáÂÃ+ˆí~AÀ¸U=1 ¡ÓB+¿à\ý;ØöÊí·OžcÏ€áõQ{EͰ†í3AÄV\ ”O…„L¥5\Tz¦Çn3½uáòµæäÙKÍ;§.6§hݯ3îðÀýÿh)ÌÔ$Y!ѯY-ƒ_X?0ãðˆ¹u44ðdn¹Y¾%„Ú|@“dÊܾ¸·w÷iáÝ éSyàf—Ðñ‰ Th›S|—¨äïbÛÿÖÉsÍ»Ø÷_¾9Þܘ¥¿¾@k>ƒ:·¹xå`€ÁÒ:Y)B—|;}gå4Sg/Ä,6¦éªúäA†T +Á-ci_ôé*“„•®dܵ¸{ó"4¯Caœ1YÍ8MÑճطºm#›60¸¾yïìùL1îòœAÀ©q¤|M‹´åo/…dŠ‹´Rœ—˜¸ÿ„7ÇZÔ¼tKXóà·ùñö½½u¯¯öYÀãdq—·M†zE–КÅOLÏŒ}ã~á—þÖ]€¤oR‹Ûwìúæ w &ª2ƒQµÖÖÝ–1;­Bd#y›E¥†¶¦Ú8—­m³³éJPÉB ‘ç®Â#¢ßÉU÷Ú’¤Â‚×0­½õ¢t¡[g12ýe’.ôãÏ®ºp=¹Yˆš@,‰—±€@¯¸Öõ ·¶ðL*Ï”õWv€ôa úõk—±˜f=ú4°ïJ8î`šÂ¹Ã)OaYà„ÒÆba~¶9sîBs‚ ÿö™ËÍû™ï¾Kßø¡óÄl'ƒ:«ðq‘–}\iÜEÛjæßW±§Ÿ® –—´MÍý‰Û´ˆ¨¹}¸¨ž "RªÈ,§BO1+Á¦x=Ñ©]wWr Mü¦iá¯\¹ŽºØ¼wúRóþ…[ ©f|úPÛ Z ¯¨ydSêZ…‡¨‹tMv³·€»L+дþS‹qçéëW®¦Ïm£1—¹u§•õË:šóÿ¬ŒiióM.©6qç 4XjFw ÓÕÓw±ÄD½‡Ò§/Ïd@/w Fþ`µx†ÃHذ…B£Â§KÃnG„R[~U$f’†w×UµÎØ£Ãt«‹dw—+%mÚÛ°ÂÍwe=Ô‚;¹£»¾À¸]?‹w?ùæ[oþ ]iìþÆcÆ>(‚?‹²ü=€Ã¤mG_"O Á¾?Or²»NP6„@EƒzfbÎÒ#ÜŽòÊ4Ž`Ûz…) 'z³+“fÖËoaÖÓ_ßu¯›Çò…cÉ_pæ‡z÷£*f9T4ÓNîI`ÿ̃‚jŽyj¸2ÒÞ#¿3/P¯$’B‡nP¥Vp¨MÜÇÐÄC+…ÿÞɳ™jrºÉé¥ÏJ?Hñ)oræ<4‰Õbî/ß:Õ|ãÌX3³“QÁ7pÇáWÆ]U”ÃÄÚØã•–¿€ó<=`û®S쇀P¦ÿÿÔ“ÏS–LEÚÊ£Öß§BkÌ4Á:|+·—K[YDc%˜œžÅÀ†|ç>´ògS¸šf(~‰‘xi¥!•enžÂ¨äAjUËÅÐ< õc?†=ôõ=òLuÙ[ÇnÞ¡¾G%sÏ>y‘†gõê²yX õ*ÃpIK¿”+8»"ubü&-üýftç¡Ø ô#5ý^Ôr•1*¼cÓt_Ø+å±áæ¢%§roß¡+p`?~vq“¨»‚Ã>ÊŒ;ŽåÁ¯^É1þк9+Ð…¯8 ´ücðh”kø•OâêÜ¥`i}ä þ—‹A¦9ç±–ÜŠ@ßzêÔ©ßüòs_îÿïýõ] ÓQÆ,mß>ú£¨ŽÏƒh€(XaÉÄpe–“k6…ÈTÕYuË@]a¨%y`† /a ¥·#‚‚g¡` !Û¼˜Ý5©â(ZV`_õ[ñĽÒ,¯ž?A|üŽH:µîõÈ—¯‰–'!ŒcË­îgÞl™±f€é©6Ëq:Æ“tA.O\âæj1íýUųUõØm–àŽgÚË]sÄ?ÌL¬-B_†dÿë/úÙ÷ØoàLsöÖƒLµ²8„x ¦JÏÝÿ3Zî5´î¶ð´;TjVÛa2­½-¿-ô[«žkÖLB´ðç›×OœkÞ¿|‹•…Ï@ØP!×ÐÂgW¥¨Ñ¤:‡!΃»d DÅ‘_æ<->©¤£‚Å®•»ûl\?m¶ ÄJû`ék3ŽmÀ<ǹ À3é‹Ó Xaûxò˜ÿ]+[´ÆÁ”ÚJýPA‡†³}×a¦yUù-G`{ŠmÉ8ÚQØ ‰Ø4c"ƒƒ”;xmfZÒu§Ï\hÖÁ·»wzäxuÉ ¿–MŒéZÖ•·ì¸PpmÈ›K¿­+¾y6ô p@ùÓ^ưùâ韗4íxÛ|ùN0C£}}aÚô_ü/¿øþÏqÂÐëÍ CÍ—¿\s‰¬•þqúð/ØqŠ’+*¥g:Õ××´“‚Ú=ö$\‡`#’­ŠÆš¥*´ ž à©'¿Â7“Éœ´0Õº ž|çîÞ}V¼ŠØÅ—пõǹ%{ U" å«ÃY—ŒWP93-•ö2KŽÔ¿‹[‚éKcVz¾ãÃäT|»÷8‚›—°n[Þ§ÓçÞˆzYx¶ø­ÀÉ4¤•ª£éêõ+Íå+W±Åàlìɳ6užmXÚ£u¡ò?¢5›n²0kaŽÊƒ-×–‘ ¸ìÅÛËݶ3ƒjŽO¸_ë;j7bŽë\¼ƒ”ãxœýe7ÈxÿÔYúòש´ìtåÌS×Up…ŸYS†Kóš>¶7^¤Ë±ˆÐ±¥]GÿT^Ã'!Z¦ wnÛu;$T§ÂM¢…h¦­CÞ´¢;Ê¥BïÚ[”–7Žxƒ'ïÞἆ‘є̓‰»ÍÌ Ö¦ÇÑ*hýÄ^àr`цʙ×ôñဠÝ'µµƒ÷8HuŸ]6÷¾i™ÿŒÀd;nü>vu<¬·Z¥ÆD–§ƒâ^ºWÝθuʽx´óªÀ ËKñHð¯P´pëÃjqahÍ`ÿâÜÂ+o¼Í¬Àõë3]Wà[ »âÑÑ-ÇŸ€YÀÇŸ…Õ¶T&jæ=ÑEÓWûŽ1z°2'þæ@üÌ,DtÙF³ÊlBX™[b*጗¿ôC‹U"m€‘–ÿ+”i[ZüB  „ÉG1c늳@â± ¦ä´éz­|œsú,~NuDvÁ“þ=Õ+i Ã’1?réî8ˆÛ§™W…À8Æ0W®_o¶PÙb0¥ð#tï6 ¾»Ï3§NRÁDågЇ 6Û<Īm–Õ˜Vø!õ6sRо½»šÃ°›Ïþf”íÈé¯/°üxfVs[foì.½ŽK8òíÔ®‚)ÌMºàŠË#–KÛÿ¿@«ÿh v!m?-¦|½À'±^âd)äûœÃ@eôàXûÿNÝ•¶SÓü­AøL°—¢“s;Ø1ÉnS`j^îl¼*½oqû¯UTÞLò­ ›ÎÅñ§Û7/PÑæa!7~™Ý´kÌ®ˆdg£µl ‚›ù—ÅÃAÒ)ð²ë¾NWºëµ37ÇÆšC÷¦{CP3MòL+ta uù~ìò$-cKæ/ !«äò±8†éèX~¸¶Ä æü«%záG¥ê›g׫­Cë6m>yêÄoѨÇYoi¬v…Ñæm[ŸÂBíódIÒ$\(TÙ@­ÔÌUa ŸØ9Ãr‹–•Çqì–ÙíO©ÒYJ¨TXÃóŸx¾ ÐG²æ WÜ“ñããOEˆ*`å¿å׊ÓÁ+÷6‰ò"Q…˜W½iÁhŽe0;®+¼W@m_Ktù1Â1#º݆ ëÈ;›¼m¦e17A—gòÛƒTÙ¹ÝÊŒ•šPšå|@7€·lA•ß×9òDsàÀ!Â`&¼~½À>ö|Û(±ìRä"šXÜÁØZ ÚUŠU‘DÒ²Ñ>_ƾ͈üù Ø·ó>QJ®ðô=ÌØb Ô.˜²¦Ÿ½zp}º V8+›eîX…B¢ó`ÔZÝIºÛX>ÝMª!.‘G·[{ShÀMa fâ&´…„plù%‡Ár&•kxm‹)?+ýZl ÕT¼ëîøÄÓíRÂ]„ÝiÆÅx:yáR3ÂAŽ“$†—ýâi>ý¦¸9«²s×®f÷î½Í®]{šÝ¨ö[·nc°» úäS3솃­»sÕVpG´7cehÅ×ÒÍ®„ôV~%¯@¶,;´MÉAÚ¨ÄT̳Œ9ܸł$À Á'Œ‘\'/qÀ/Ý„µìN}«Ñ˜¨L}¦+ièª<¢«²´ÀB E6ߤ›àXÅ  ´¥¾nHÍ`ˆW_6í¸à ÛÔ›W´lMÒ§Ó”«ÑÒÖBÓՌ٠y"fDÙJ*z•_ó#OóÄQæûh1ÍàïˆÝþœŽA(­^³ªyëĉŒ(°å…h®fÄ]--ð€“ò“ÎfÙ$Ú§šÆ;5YkNÔˆô¬+ï]¹‹bb&6êÙ}¶Þ}i]ÑhÀšµ«0^ÝÏÙ¯¼ñæ[ÿ†®Àì—Éúñ.J%í?põÀ¦-{©¬¬è²É3’[l#jCH·ÒZ±ÜÃSkÓ·‘ Á®l< FµÒsú2Cha˜$ásËŒþuß¼ûï˜õZ¿º§¢¯p„&ý|®P¯‰Ú¹†h ϤÝÂáÝJcÇþ§•Æ×Þe]¡Ò÷.¾Å ÇIÖ8è.­œ‹]6a°s‘eª÷°šÔ¸Jø’òÆêÊ4Ð`&8.}Hw1zÈ­áÍ}WÀ1R¯m»‚ÉŠ#ž µ^-ÌVg‹DO§Ú\fÛ”â\hG¾kóqíÊÕæë¯ÿy³‘³ ´³7s%ÔÞIJeö€ æ–6ÑÍ8-ø¢žMe©ô ϾØ!0P ÷1ŽÉ ˘ºF~î³Êq+Fd¨âô®q÷Œ°/PƒpÀÑFÅq7V5Œ¢²p‘N¥Ò‡~|Æ\%a…xµ—ßÑFñ4;îJ4¯¥µß>º™Õ…Ó™p×èìR|ýÚU´­ýàæ b /p! Æ´¤‘埞¤ã—µÆßz·[lyè¤ )Û°é]áQð Ï_º@$^‚ûCz œ®›jXnЧ~íÀºmë×®í{ÿô©?üŸ¿Ð·€§ÚB†·nÜ@_ìg}¦\"‰…IjüB,+BilÈ µ~™ÓR‘V“pÁ,È#Ý ïXÆékB` oeê´ "ä==™¨Ü–†Pi®æ>·±Cù«bê¶|é—¿}K¸Žº~ó^póX–ŒçB¡hT¦ê·£ Ç«K³`”[ý¶ù „ýÛTBmòw`dâνª—jËsÅÒ¦àÏÜéî ¸ *Ç]ö˜ÆŽÀ©Eûëš«nazΫ ζP9lÁMÑVÒ“ÇQ¡o²¬øÒå«ÍùKWšó,¤¹vã{ì³ø…½\¨äÁ©æÍ2q–Ç«fm¢¸ŒÛ)8à¬|ªÀ6›âgΫŒ(c lÕmáî¾%úöTø&“¨\L Qɤ1¥]âêRsyȪu©ŠîÛ?„Æ"í¥§#÷."Ò/ãH¶ìÚÍèFø¥Wø¬àKƒ˜þšžXòßÒ€KÌm1Âý!]„!¨N—j>ÌB›°” •äY72u“µ‚=»vü&~Õ+}á2MLý©/~ÍxÇç ó@Y“÷Ï£ð ‘:Ì3à{®{¾$Þºó0ÞZ-ß8ó©k÷Þû­_þ?~õê±cÇÛLô[À… u`ý@ÿÐÚõ?  Úö?Ò3.$¨L¨*»™ýÖ˜ž™"C ¢ˆþ✶›àBu,@‰]-ë*Z•¨d4°L¼âIªŠ¯®ñ[μ.:§üO·\m¬àÐAh}ø/º8JÖ¸%”«(í³´UH[_GrÍ·B€&.a:8m´JhÅoM×Á(äÓ…/næÎA[·Ž6woßAmÈ;{Ûñt/©ûÜTÊ©)LmÙ_@…¥Öv._µ•w¤^ƒËŲWP8²ï¾xc·Æ8wðjNÃ9{vo`Þ:ÉÔÝ#Âb;ЬâLD*ÝÝLÝa€R¡2ÃXëÍ£­È̱Z´ëvâä™VCqÅ ’Ù´HX>²eç¨í~Ôz- ±¿£\øƒ±-ÿˆ”Ç´ÞŒ¸Û3t­¾‹zĉ£(¢¶ß¼[ùÝ9º5cG’ÑÀYps•%ÅPxäÛAU~§—S±HI¦¶R‚ç–îihpUð8½;DZs3ìÈz‰EPûèò3ÒjáÐ.—»5)ˆb\EZï¼{’±Î~HWÀ€¤Tt¹" )_êPAð¯ žŠ¯`SøeÚY\‚§0Ø›VheßëÙàñ½'É JΘ„á–×n9ñÞ‰ÿpþüù¥ŸÿùŸï’ùÖ.0,«¥-ë†×nXÿÏ0~ª¤A'˜ó%b0ÁÊËùUû¢nò\À ‘„)UÂÂàJ;ˆ;¨èh#ÅýÑJÔª.^¾”eîŒUzµÌ¢€Yþ–»Où³ ÖòÂ*´­:ªN|—y©ÇÉ„K|~¬OÝUô«ú%`ë—¨ôøWz³0bqîQ߃û³ÏÞ¾;ý;ÿâ_ü/iߢˆ÷ÒäÌÌ£m£Ûÿǵ[ia²ÀĵòKkf‚:ðkåajÊ}ۜⳒ˜™Ýd¦-ÕLíÒբʹP(ÒYmBØPˆV *æ· %fÞfÒ×P¦uÓ¤•×.p÷´§‚ޝ¹£}í`b¹YœqušØ€×r_pEä Î/9Y ‡w ȼ9%ꌀš»Ob#péÒ5ŒnF¨dhHÅ~»T^2€È”ýx–ʺbî<þì¹K,´¹‰A žÑúGT0àVÑZi4c¥gÌ©Z[àôh|jÖrsyìÈÓeœ çN;à Нc7.Ù=sî|ZÒuÌF¸n?F;0»Õ:6¶¬T(gM„t_+t6æè*{ÿj©ìŒR¥Å` $h™Š¤¶"c90BgZ‘S”FEæÄ¨ê!•×§v©¤Œ¶ ŽÒ+—<ÐSûg#æ©ôéÓÏ¡™ÎÓÊ;5¨*v$sÄs|ÇéN§å´uð§›¹xÒN² U´Sèekïžç/\Æm™v^·á¯Ú5¸'}P ¾Þ[?yÕ®¥üï,šÓν±ax6ÆNÂÉÕr¸`ãÖº“¯èar:ÑHpÌ£y4¨Uæ¬?qêýßhµ€„ÿv ü,ŒŽîüǬÜ H Õ,p6]îä‰ï¨ÅddtË6ÌL§`Z2SAã›·OHÄÀDZв/ã «¾­¬ð{w`1“n¾…æ¥{½>-^úøÚ» $Q¬B-¦óÊ[7/E½ü6óá@žûÑÇd•®€Y·*{b!uW¤‹¡éð7¬ÚƒË¦'s]€vg°ïW»á˜qÃSx>­®ã¿Â*¹ëlŠqê•æêØDs–>´ª³~"Tm¯Je»Ftâeohë",Ue³Àómù¡úÒòÞb\`793t?4Þò¸sóc7`ŽVñBg&àöIƒœ¶L¥·…ŸçÆê”¯Wð°8h5Æ6V|+½åO…sjoa~† GúIŸ” t–F Yù`“c·ß°Á0¾‚À“œü”_ëä´Æ˜÷·ò»üw µ>lgÒæ—0 ×8Ì!$ÄÅÁÆ!ìTF±AØ»w7«Ùˆtÿ¾ØkhÒlñ[ñmølÝ-oµ¯+×dZphh8å;˺Ç•é'pÏŒ›â ójƒ¢ rJ]†æ2jþÚ§ÈäÛºTa¤™xUå7’ù4"´„Ç(§¾‡fûÆïOîùæ7¿ù«t&;ã o'*`lÛ6úìóÿМú$¬jÁ“~¤™5/n\¡Ý8‹ˆ €Š‹õL"Q$|! Z|¸\ØBsŠL'A­\Ù……Ò2C*—Jc¢ÁÊgõù2ø6o“h“2J—np®bt„`¸}[~˜Oc¦{–oµÆ¬TM¤ÀdJ[È„m >DU éÖ] ‚F‹™ñîb‚«¿ZÀ}Œy.\º’¾¥c%m°`1Æ8ÁÕ«W¡ÝBsáê6Ä`®ž ÚOp Ìô!5Là›J,èO¸}åLvÀ]í &° ” †b¦ #× ñ(ƒ ©{ŠÎäÄ4†B,Ò! ,…Ô vã™gº1‘1ƒÓ XÞ#•ÙõúܶòêX®¶ºóX.-΂ûzꉭ/³%S°Lݼ?3$[QÅŠŽ”vˆÍ¡ŽÊKO»DY–1+4R8T¥@#¢œÐJkÒZàå®U£ôá÷ìÞ•e¿µû0Sª˜=k¹ò<Ó½å2½|õ‹ GPˆzòDž¥¿e—r¯¯^üˆºžþ–—íöÌ0#c†ÔŒ-?Á–Aü( ,ˆe˜Ô.áø0Á‰¯¾qCõ[älµGôfæ®ç¼ï÷˜yzƒÝ£W{¦À·îœUDÛ·o{ÍáU²Œ2Çþ8´ð…ˆðq¡pÑãÈ„}IOÝ倨OÛé§Ýg:x HGFè4€ì­FÅq©°1˜áÕ|§õdÂ&ùâ½uXáÖ¹ƒsî"$Œø{…êÛ½—ûòoáZ€»ÂÁÙ÷´õëV :í¥XIO8·+´TÌ•`–‘¡-¤{,:q³Œì)®²DöÁôL´‚.î¤séâÅ˸Pç6ëï×cزdŸÚ{ûGð+ü‚‡‹lX,Î'ö¶!»³&»ϲ®@õÙyu5Óãu”1Ž Û]¾0œ"ô„#[wеªŸ?{.ÂÀ…^®ð|,Òê3áÓ³¬W¨CøVHíDì2ªÐbCG…`­Î4À{Ლw»ŒÎPì`MBÍ ¸”ÁB¾¦ ‹­¸'ò8šîÀž÷<šŠyŸçvÐ}lå‡éJìB°Þ‡ÑÔþÍ!¬$Ýz| ùspõ><;Æ2j[}Ç=ŠÇÅEʈoÜ¢)¥wq üý{÷P °f@Jhóm^×¢É{€øÓÞõ-¯)P ãìu(i…€Áñ l+¼¸,žú&•ï%”ÔîXƒ°úYƒ²pòôû¿ö¥/}©9~ü¸¶ßzu›ƒÒý$Q?È|°cŒ“$ÅDˆ…R¾ËÍWÕþéé ¦Hö†èš`ÚÇéâ…é|ÕÔ¡Ûþ¤…£zê "óÕeF[†Â­ƒ¥_½wéã×þ•4€¡ H÷li¤[â¦B¦ƒ•·|¯tnþ}€ƒ•]œb"Œ„U|„ë_’Ëo½®ÑQ ˆ‘ ÂÓƒ,ÀïŸczõ›Àº ®Ì›¡{›qD:HkÈ*¹´óX@ÖýŽ>¸qçú˜i=sø£,û½sx+fÁÛŽ‰±Ë¤­Ó{Ô4h^ŒmaœBöíÞ†½»<3éX…ã:îê;Ž]½‹›ÜÀ±ƒ¶J~ìÿ*À¥BúÿVtqE#X…–¨°bY^´•U¤«0¬Úd*U«¸Ýõ ÒıkÁFæåÝxÄÃNÐD2ÐhåOKo_žÕªt[lÑ÷ ¦ ?ï @»éÓki膂íNO¯epu#³*nN꺃ìw!-*)ÛŽÒ­‚^ g °ZÐÆÎiWÇÈäÝäÓœ…Ì!—ü¦Cn¿˜OJ/‡ñ¦{²ƒ¨N 7u€²|ƒKÞë_™©Oî…'žÂ/Öä,±SrÿØøõï¾ýö/SùQ7(|ð:x°6ݺuóÇQý>KJŽš@SÕ g‰$DÌÛ„›¦Ò;‚¬]À]ŽÊJŸ&ÈùS—*g´"9 ’–H`Åw쀤"`ÃʘÉ8áóWɯÁ!èêª\*ÅúWÂ뛺–g÷ÓƒÝ,X©˹Ò0¯Y>Ë´šÈº}ZFç¥|¸¦ƒê³c„ÎM&&AKða3­§êé=7o5·Ð ÜFË~»ªî1v½½âqZ.Ü©%­«eRúôÉm‹'BMj–5ïsóS_¾šrü–KjaŒÕ´ú2Æ ¦Â0Ç «å6l¬ 9Šiœ¥ÈqÜëYKì“LIº"Њ­Ææ Å¥K—“ñ—9¥…O§öV–W˜3›²µÅgÌb!àÞšöŠ—•?4 ©e7i† £÷)Ï ¯ = £Æ¨ºíìˆöî låÝ@…¦âŽbjíY€ûöîŽé.›ÜÆšOMÊ-ˤ×mè©`sÚõöŽÄ;ן½=4¤p’OÚ;ÅE…©XhÚV CŸÃ‡†_Å)tH]OJ‚'ˆj™çÖ­{ׯ¥O ·œÕ± íH›tµ…)öªRd‚P~•­†—ÿ,KñQûq ÈòÁp¬ïν;ÃW&/ÿƃ{®;v Îøk®¥¥©’d$cYÀUyYÒHŸÌ’LýPPðÆƒ¬Z»ŒÉä¤ì,SØéHZÅ&Љ'Œí&îFã"[Å<µêÐ"€OÈXõmÔ|ÌU˜$9 4}õ\àGÖJÐÐůjiFª´WÔMß'¼"a=Ú1LÇ”­è¤hAøVXGoݬÂg­7äÊË4—Ó-¿¥*.¢´Fkà»E?ÿÀþ=ÍóO?ÑüþWÿ4­ýnÈp5%ÃeÅœ£ë[vm¤5ÇŒ–å®k7°y%E àµp%Ë*TrÕló±fG‚i /$¯ÒІÍl£ *óöúõØôÞ@¥:}yŒt#•f’ù{Y®+5ÕTŽ>Ä »g#P2Ÿ5£ÐÅ>0È2aW–” Óæ è׬«Á5ËÉé:+¹aé»Û’š‡ðXÓ‡&2Žv9 ÿqŽ ­£´vFdBÀÝ©4IwÊÑn†‚*³PÀ¾rõZ MXÝÊîîƒ;èv"ä´“PØ),\Ь@ôd!IïðE•˜åÜ <5Ï »&##GâZ&º÷¡¨> ž;›—”ƒñ–yAxÂN‰øÂ·kFÐ>°âtµMÎâ@ Šm8ù1ÁòS•]íÐ*ð™áXjµR“ÓÕ©WGñi`—†‡Ö÷íÙxèÛ«~Ã$W¤îçã« µ!-cK ëš·n²øÂIAiåôÖ]N¢uáʼ…b…¢P ¹aµ¾ìŸiŽêŽ39—Ujš´ G G0;†4ºdAn â•w៼ח¦©S9ƒ‡ô[œBM¾Ë)îù©láüA "Áe ^›²ÆaÔnj@ðZæÛJ8+ß+”Bm+¦Ô®ØGõð¾Ý˜á^Gj³Â†Ü Âm`IO½gZk 4;ËÒVÕd:•4¥ž°¬ÈƒŒÐñkæg&¢¦›’ôéº ¶n®$\Ôr ™…0„‰]¬ TÖ t9 víúµÞÀ§-ÓSOmF8 ÓNle¤Ï°°%­9MK%­Û?¿³Ö€ð,WefT˜“÷^ZxëA¶¸ãpºGàÅÌvµ=˜4– ¬ø"+ ¢˜Û®‚ÓwšškWá8ƒš‚ǵ{hãY¬ŸØž®›+2·íåTd§ûXU6›D?S*ÀÞ0´_hñäûc—:ÌÏÍŸsjó.V•§*¢úV‚*;åþ€ÈÞA w»§ëhM.\8›A#7 yÈtOˆbq;bNÃðÔzÈɯÞÔ|lIsÍD;ábZ¦á¬‚Wñ»Ä\>ñWr%x~ͨíe¸åÛïˆ)¬exÇH̼ç›|G õÁ8h/ úíôdW/=_¿ ÅÂPL­8ް³·‚Z€­ÐóÏ?­›ææ-úü\Û9Ç~×¶]ùµ‹5íL‘ƒä±dF—B¸Œœÿ_·e7ýü+l~q ´¨lmë,³Ì±_ÀýÛ—YóÏ&¨ÚïX9£hÊ<¤m?øÚ<Òv©¹…u¡ðÐX>÷ô3i€sÔ^|ú`à´9!1åCZ®)ÐÐ&§ÿ"$].¼Èže}Çl‘{²d-g 5ÞÁ?p4ßFBûû>#±JÄ1*­yv$dC„Q¼ýWÄ¡6?q”öîañ ©8õ3#øÎ¶T\9ÜnLÁ±q©Š+õ«¬Ì·ïéJ\g)÷ÆÔ†jú†¶•zPV"x‘ k9‘@UÎÁ—¿<9\‡ñ…¹|UB”púqËüâY• Æn× -üÒ¼J¤GÙPj²&3Œ·­é%v.EÆ·\œ3&æKC[F†˜À89JÒÏH›HI0Šä‘«)hñ²:Î ‘§×¸έ›73Ø'%Ñ!VÜ%¹kNÝ¥ Rhév´™2sb¼ûlº§ÙЧœS±>NõSÞ†Ú<üñ*ùjÓ0/Ëþm¨¤‡sÏSUÓkõÒéMI•uïæ€½$óV_&`ü¤¥»&ÝÅøÅ–„ýhé`pr>®j.4Ðo–õêÓt›ŽnfW`µý{ÒbݤCص¬Èë™AÍ€õ›‹\æé’ÍÜ¿×J ayWyFu¹Î%ÈâåR[†×¶!S«j5¦ä`5ð¢åܵö©h–~—IÑ{IŸ6 .^¿ïs¤Û+™´{› OȻỸ>ëO¬¿BoœÖüøfºþèÎ3†gihüŽsÊJUXÃñ.ŸJ‡áSá-ÎÒR-ú]TÇŽXO²89>Ñãòå7Î_ºø;?ýÓ?m‡ìÛ^ÂZº?>>‰Šóßa¬³¬±D‰4놗J‹Mˆîº‰‰Ó‚ÓlEõäÑ'éëS˜Xde^šx’£C‡ÉæôJO%uU T;àȘÝôH·Ô]²j§G1ò[äDßëƒÏnz)¤Â=K,»K‚w°*J>©-ºËˆN:ef,5>m 6 VÂìàI pG¸í»ãîW¶À/^Î&™ 9c஼S ´Nb3༾ªnŒxÐD2G:¦íŸÿNÕ­¥¢»`&«Î`ROÅ]¿™µòÃLõQN©DÐÛêj¤Ðž§îëPµï0ç>¼ ATë,“¾³š&_`@PÁájDgtŒc¥ÖnR55ú£ãDVxûû)ÓV8ØêΡÚ[ÙÐï'j;X‰w˜UwÏ<ótóÔ3Ï0ž„± L­€1m‹®Sók³Ê}¹œª½ZPË+Ÿþòae7l Eê•{ë:˜ÿ¤™ˆX»2ÎsþÒ%ºC7›W?ù‰æÈÑ#hCŒWPÇÛ¬R^QÖ¼âœôe»©NÖŸúªš!+TÜ”£ðü@Iç æw.ŸúÕ—aížÛ°Ö’ãZhåŒupqâþxÿì?Ö_@IDATÕë×ß¼xñâo;vì; ¡IQ¬·|œîƒŒ¶jŠE¸¶¿‘9F$·j¥•OC`ët‹ ÷2ý2Ê7¯§ß&bâKð\%uqãß /œWuDÝy^™¥*JéŽ ª²^Ýw/÷)ºtÄI0Üĺ»:¿Â#Èt^½çÊð:Vœ”AÂøÍí?ŽÑxfZ ëÆ¶uÒ¿»J8ùÕÆo=d™Qœ­ä¬Þ“ñ¶Ò¿\xô°yÿüy×`„›/¹zšÁSWÚ=ÄÐÖvÓl™ÎKűžœPV.˜qJÐÛq³‚Ž–¢2mùSUÏ“ªK»£úUyt)îþ½ME[Ó4Ø8fì¶¹a˜)BËFzèkPTÊ:-Œé`áš`θÄœG*ãOÓ4›="^ ºt àÊõÿùòÅ Çéê§ ò[®cÇŽ­ºÀA¡YõÖùÑ«+ÑÌ8òvJmðTûsŒU‹‘j°-‰ªÜ³GŸÉô‹çºkõ'¦Æµ<»þˆÚ’ÖÂâ ®™$w Sô nÞÅ¡C= ñx5l]ݳ ÷·|JñÀx<þ2\á„ ISÜÝS®öG,Sߎa“b fY­À·õÓ¥Œƒ8V †s3·ëº~ãF6ÎÜÊ:õ´Þ šiÄÌаÕuaŽS=«X¯ÄŒJ+°d¡€'+ßPwêS4†´¨x¦r´4+- zۄ¼‹˜íj¥6¼!ˆ¼‚ÇM`¼´pGÄ]bì¡£EçØºÇ\ío&^áÝ%Ã6¬å(ð]ÍÓ‡5O>õDsôÈQúè»ÙÃoSòd[ËÒÚ†\ÕTÌ›oõ‹™xφÈ0uÉ_í+/mÕJ¼.D}t­µøK-óI(~Ó¹ys¬9ƒ¾ÍÓB_}ååæèGÛ”kWž¨¸¡.‘M¼Rõ­páÿ`Ü:Fè㟰qËG¦ŸÁ_=¦Ãµ XÀÒ¶YžBáG9˜ÖßÊOÃ5l ¬£ì±t÷ö½þ«ç/ÿ§«×¯ü¹ö>ß© ÐPùM~‰>Þµ-[·þ÷ìfB¶¡îÉ0f¾¦˜Ü­V´dFŸÕ’Ð¥5»®½4ÛUmA¥»‚)«ûÃK¬k•L§Wªžº“g·[ù•®v¬ðPBCL­#°OÜZ w~ ¬ [á»g÷Ua>ðØ+âô¾»ôL¹E±ß­…¦§ „vmþÂ"W´#rû. n>ÅÙÒqš %¬Q´Öæ°)ç¹ÌS»GÝ$7™šd9+-ªsûv´ `e­¥ðŠN&#íVhMàY•ÛJnú ãVØòI•§åÀ¨†õüœ)À4Ø=ÔíÜ‚Ì2ÙD—ÄÖ^•ß¾õ6L™‡è"ÜcNÝ£ºö¶:Žc,Ñ ­[%´O9À ¡扣qΠœ^ã"3î´°Z›•0ÍèM´¡ÉE›Í@×ÌqK7“pÄ_Sß 0ifèèÝVH£æ*Všª¼:jŸ²ÁsmÏOŸºÀ)A·›}àù‰}¤yñÅØPu4áåÅ• _ñ\aŠH%¸­së¦øt™°ºè™·xdÅìÍVëÖ C™ŠÌA¾”}´r+?BÔ]ˆ]ÝÈRê%–‰÷ß”«ÒÿýÖ['<Ç<~™‹âXžÇŽ[}üøñØ“ÿ&c®ÿœ vj˜>;»3 3b8Ä –e"B€ôAÖ 7o½÷^óCÇ>£ 5+‡H›YyµT(y°mœué2„]ˆ¬«`ðE„dšJìˆg “Á%a„xE–® qª€=rùݦW¯ù*73%Âu…öÝGÏÍ„¹ð4b%¾}9!#Ú×»Æß™‡´˜QOñ¯¼¶0Ìs€ ¯`9¸—î?xÖ àÖØþ<ØÔ£ƒ]­€QÄÒ«J,ÖÂà‚£ð“NùÌøGœ¹ÂŽVó@×çŸSHíf}ËÎt_æVЇø5~Òˆ“åéÕí=ã¸üC¤ÂK ƒ…ÁqèøWNéBÄ?ÛÞÌAÑJÿѤ_x˜>œW(º;Q·×€[©q¬úÒÂÃù¾ûSãSoŸ|û-¢æú è0ïüó\š[ø s ÿœ}Ñ;…{Ø;žBÙ¾eGæªÏ]fäœW¶%R¿¯ @X:‰íø½ç?Ò=ôdó—o|­Ù0À9t"Œ5?u8 ¥”sËŽÔÎAŒ¨ x“) 7ÓIÄ’TšÐ/€ZhÀ^Œ›Î Ô>“ ñ–ÍR>ùÉ»AÓE壭4+<–c›ï2‚q Óc¯]=?_ÚLÂ/#”Ô…R˜®IÇ\pë‡0}ÅÜõ6»õì?°f|–Á§?nnÑ"aá¦àÕjm† 0g™B]3À B+ñÃil6ƒ®¬@ÿM"LË °3ÈŠ< yЈ݇ÐÖ@´ßg½&¤!ȘªŠã˜Q@®CÌf”LuÁ¬«PZì'™â„XÂYYñ Ì»J t• #z&…+¡}o£Þ)`ZWŸBé®È…î›J[É1(E‹­eßÄÜDºæ¡cÎÄ7Ó-Ì”u%ÚsÓJð`Kj*ž‹q&0¶q@ðÙg6¯ÿÕÛ º3¦RÝ€±;lÿÅàŽ­ºˆž¹·–[Õx6ýloÈ?Žªg}<Œb+¯€ž2’m뱌³¢Ž0ï‚'¦µà¨f#5êæämUϵÅwÀ¥Ñ‹0],ä*ÕÐŒò¿‡‘ù!•-4³åZhnÜ‹fàÌ­¹Sž.:ÖäŽÉ%¶:ÚWù‡¿ðQ!µ‹˜­Û¡mø€ôLgÃ)q™¯fçBïÙ³++݃!'3™衤(X¶ü½B!` ·+·¤Q%Øaä3Þ¼Ô;ñãYp_8–{`Åå7ea.ém¿:|2ÃbÙQ¶VüÞ0°âëž‘ºvÎåô'Fÿ1Ìë¿}ë¶»,6«!“ˆUèoº–ÜàöIL<Ç!/‚%ãKý[F¶qøÂ¦:D´Ý´Ñ©‘R¶IPKB©öü©æé'Ÿ¦ïº£9{á-û¶›I‰FØž„‡2… µ–®€O -ìwVW@Õbå6®ïõ43|ùÑÞmöò]¾$ZŽÉ•'E“§M£qÁ=OÁtW¾ë¦&²Â¯}·[¢e˜}/Ídevó`²†.x…à ÐA¥~*¯Æµò޳Æ>±«ÏÜ ÌD¶b•çyéín¹Y ¢QL,ñ ¡ιÏén+0H?œÔµ´œÃØôïÅFþÀÞ=Íáûš];wdCs'b¸}ïn„r·/¡v³2¡?ß2§v¶ ¾=Íoѧ”£š\h þêÞV³äºï»ýº_ïËô6=œJ\f†=Ks8 %Êf¢†Á6’8€ËäH@(Ž Ø‘€N' ‰[Ä l$QàÄ‘#“E †¦Î3$›3=ÓëôÞ¯·×ýúu¿5¿ßÿT}ß×ÍmvNê½ûݺU§N:uΩåVÕår²ê$Ë}/±þAºÎPÁz¶p¬!Ê:}{›Â’½•X9s‚Qá÷U¥á¾°§q’³ް>á“{»®>ñøþáO=1<üðì±ØÍ‰ž¼³V4<ʪ´–²_‚‘ÿz=• ©K©ÐUÝ_Oþޝ.)uï<«þjdbƒÌ-Á>§¤Ü¥)ÊÎ=-|”­ÐÞ¹–¢ø Ûæqyˆ¬g^ç- =ÈÕÓçÏ­9wîìùSׯþEVæÑýò7b\/¯±ú™5À>¾ÆÑRK„‡5Î1žrM¿ËÃTàd^½Ês¦~øøOä;y79‚YO!G.k›±…õ„Z…*c<š|QÔPÔ¸Ìvä¦-žá5?‹E@Xñ‰ö'y¨à-] “ühÜôéºålBª<iÉ$· ÓàѲüà¿í9t9÷ (øw:qUªQÞäì_wbwqÐËq™Éeòo79®‡_=†ò³±ƒÚ‰7q/³AëïÄ'e¼Ïd9 ÏÑXбCä&žÔÛ¬‹ÿ0«í~’.ð¶ûº!I¡»Fïì†çè‘Î]xΦ»íö§ »6aëBbSlTœÌù°x«^ÉùZ²Z¯Š—ɲu~ZVi÷uáEŽ­G²;öœ:÷Èó8PôZ¹qÈá<‰†í*»)ó¹µÓg‡£,ÕõÛ.ŸÞÿèCÃSO>ÁÂG†}ßÅðL×[Té®FJÅOT:”ú” uD\+¸$ÂÔ_”6ò$‘…§ËN(lÛ ‹ü‘·ùwY4­×¨…ŸÞ+À;F=Wü¶üÎñ”‘·åwG¡sçΟ[¾tif ~>úøñß.êê÷ €³l|À­®¿²þìú]›þ{–wÑ¥]æü¿©íÛ]fêë—%^ý\ÏDÏ<ãM­žŠš‚s÷ˆåW޼2|Œ…A÷stØ16 y°cãûXA(¬¬Ò:+LæDXæh ¬´jE\PJ%cíf7Þ—€õ I(q©È/³»3]û#P8HȽ ê28úÓ÷IXý-•Òq˜[›E¬â¢¥ZqMÅ'EnL™~'òüŠî? BkçqÔWèÒÚmv‰°;Ç<&|Šíä_+7àdÛ/-]þ¾½l}Ý—c°~‚×u÷²ßÀ1¶8®³Ü×±¥8·qøÆVæÅïµï§W`KkO.¯m5½òžË–^~Iµó¾²³üÎ „]‰¨2W½U- žñ¸7Ô,Ÿ&g ¯ƒÃÞÃÜ‘§ílIžð€a²`/ÃIÅóç/г<1œ8ÉÜÈy Fác¬1xæ©3éü1ÊûCšm‘—®ô†Ê_¢;=Ö…ŽgƒÚ• BãëxR6âR_ãúSC}ˆ4—À^€3å=Μ»ß{†KôJJ:¨ø A„2Ä¥Õëá«Êq“Ã9våÝükGŽ‘n ÊíWlë›]L®¹bÐïÿÙjû)ðûQúûhý\Oo¸‚c×^ãùúéóÙ—‰/x*.ϼÅ'ƶ£ðS¾X¥³§á¾Â“)TžÒ{Ð g|BR€PJ¬)týޝ•«Â'ioé‰(Ìé ¤l%Ë•¢bmX çäÝ\ü®Ò+/Sý‡í díz•áaÞè³åw•=6ï7ÑÃY†ˆ3¼2ž¹|)C#&ç§nܸö?ÎÌ\~žì²ÊWÊ~ä$ @º‹/¦|ÌNÿÞÂüíÏb¹µ+Lx1‘¯ £NàÀhWñÝÄ8þu³ÉZNƒþì'·Çð]Ö!|ꓟöï|øâþl—’ÂR ±˜v¿`†–Ú‰YÆp®…÷ÍÁÚu|–|VÀë¬u½«†49HÞ˜‘-–™ Ú¨jÒY”æïÞFÂøÄ׳ácœ…‹ÂY±ÁÑ’›úܲêš×¼/nàûóÎ{`ï{þw%I¥0Añ«œ»ö çXMéPëAŽ·úèG~’“„OfX°ƒ™zñº«ÒM:»WíÎCÿ·˜ :Ò¸[qöš¥à8+ºö«»OsŽ–sJ.÷lñWPøìyhaÅ“)'•V {ßeÄRð9ç`½lbþf éB¤)ÎÔå\¥¨=q™‰Ç~ec pö*×Ï^ºÉì=Ÿ3ã}ý5 ’7ìãäâ§iå9¸6C{A\GBC« „ueÝ™o ¯Xó.#¦¯’šUðF4cZ'<»_ÌbàžÀ^ëÛô•W¿›~ÄS  •§ÏbŒÂëÏÅ3ue”âÓÊ;·ãå{}†y5—S­¿ošlt}ëäw9æíúóúتrX HÖ¬u˜tsáöwZÖ£Ûí L¤ä,Ó<ËlôSë7®ßÏk¡ezSžø£å¹ÎÚtwu9#¬ò;^™¦‹¯õµR‹‡´èt;/Ï^žùij¤ÁZA¨{ 쮪Àq2B“«Ë½ÕÒ;$Ð0h(ê=´"è+ÇzMh¥Ž…ÔÊ•µ<<÷ 4êwE'Ä™·:†7]“ÂP¿aËË8ï ò5§ç½ÛzûŠÌ“¤µ°6Áìy$3Ê.µƒ0{Nòɳ{˜ôSU¯}=ß ¼g÷Œ-ŠÔ`ƒŸÚÊÏñz ‚ù@fþçiÝ÷¢è~Yè~&ÿ̱5õ•qõÛ°\a¬ü5fâçÙ({n svw¶:«tnÙ"Ù³po×^T ¶cù³,Ì9qâÌpwö Ÿ&§Ü»èxìááÇô{$gòog‚2a¦²M¼ÒdcTŒôÙœ»³®–ÒTºµçò·¤/I3QäÙ€K6*€Ä_h“¶lÝü—²;s21ÖOKïÄž o—߯.yWÙiíÑ·$§ÅGéí]ºðÌcÜ]>îÁ¦~ÎÜo@ ?WX”6ÅÒ¥ãç/þ'Kóó×Ñe‰ uo¸`‚gžyfš£„WVþÁÒÊô¿5Å·¥èf­Ò—å BÃì·Ö»îª‚¾£¥­q+Á8ŠŠW¢Éý=úáá…o~—Ut÷0‘ç:u”©ëTûZÏ.õ9q^ÀÕ|8a·_åÛ²EÜãÖ ¦¦Dp0¼´v£DÀÄ(7ìÒÚy­Xwã]gzr­•{ÿ]¤Óθ³hÐh:ǹ*¼K}Õ9Ã×€\!èÆ!'{<ºÿ£iå=×ÏS{œã“•àHÇB>†¨Bîoò¨À¢Ñy’[¦<öByGP\Aš¶J_†EÞêîÀ=]¢ùQÁ¥§è54]{ $¦ÊPr"-£×{Qúšáw‚]#àjÇð´)¾¯ù˜/I«Ïº'R5 œ¬åI@YÝ —Š-®,Ÿœ¿téŒùãz!ßøÀT(ÖY¾üòkŸ{üÀßbé3¶ßg®,™c^÷‚[ésd3ÏlòÆTZ„ æÁ­Û½ìGÿòÿó¥áþÒ¿Ãf¡s>Û뙡ͤéJy‹A”„¯´Î[æ¶ ÓÌ@Ûãࣥô*|•ÅŒ7ë¢Lz¡ÕQLKiåIx¤£U¸Kˆ[Ŧ"ú>Î& 7âVUeá4¼&'Ç&$>×ûñÊ[ºêYáu‘”oA|W¯’ZA%B"ÃI§¹5j[x‹Ó±þ.ȸÄ$àVÊ|ŒW[§˜¬;rì|nËp3}•»&ïçè«…Ez T•ãø^&qZ‚.äUähUÊ•²¥Í‹|Ê>›IÇ„¨G™*(h%Aô˜7]zðº£s74b|ØÄ Ã#uÁØ`¾bï®a'­½ïè=[Á½æ™Ë,q²Jš;Ë*T>Yöâ^ÅI_=wRna}°¤ñWz£ '¨Å¤áÞg9ƒk> Úõ˜ˆ` ÞG?º0më!¥L¶ú\*zn!ö¢£øÜûl¿¯•ý…g2¸š¶>2KëO G¢ÓK€ÃÔ1å"¯et‚ÀÓ--®¼.ÕâFᛘ°¸ÕƒºAh‘c¾~ŸEâäe´­“V¶òS µLeÀ3ó|¯{û6[U9ásŠBç³M0Àã¯^~õ•á(ï#{ô1º{'’Nåô]¿F ÄÅ?k™ùÊí mËa'Ô2ÚÝ«W9.…îÝU+дüƒ‡æç§1òn¬.Tb zl¡Æß gHOS~~“‘‚SyõÄO9ÚÌ\€{¬DW–k%±6:îˆUÐËÙj»\6{ÔiÑïc‚ïg>õìðÅ/}u8ôÚñá‰G>4låU—æX!N« Zir†íÄÐׂK¤VmßÞû†?úÒ†Ïüò¯²Çúááµ×ŽD¸]ýUŽ ¤Ò•&`øÉ168áã>WÜEù9I8TÞl*fËŽðˆê±§U}Ã{ˆUÙk¼‡‹·W¬ññØe(L¸älpÂrQ.yÕ ÚesuJMnœO Sò'‚ÿä+È]Îõ3œ8£`gàA6°|ṯ ‡^>2<ü‘æÌ{Ó“3?à7/ت‰’Š/Ùúc»a½àOžøUÒ™¾Ê T"ÁQi„1N§²;içǤ×iáo°¤Û.©860ïãYüag£=ϰ…ÂÓ[ìà Ñ5”E§ *¢Ï U½VÞ•@š$Ä0ËÒýãÒ¤k©Æ Hé[¬%m2Ø”¹€û/%2ƒ":Ñ-,ŠOXñ§)|žUtÃkyrºü´Òyc¢Páá£J-?õ«ä¾ýñr¬“9»ÿYº1–¿"4/•>‹Á,~ Á”¯¢—o¯“ú¾¸—äÍÌ$ Ö#œaUå¿à 2_ß¶õü³ôš+³WVùÂÍ÷s›1âKî{æ–¨..ðZ&‹0`­´ÇçLJS¯Ÿø`áðÈþýÃÑcGb­ÜRaÕ³¤;ãx‘ÓX]O°žåÁYàF!—c=ÓòƒÛÚ¯V­̪U†ä“‘zG--a=Îh6m€¡a$àI+€È[šB8‚+#Ù6‚Ú*Çnæ(ƒ;á4ŠÝÈ Î–YÃS·âAÇg:—²:aæW{÷aþÌ¿ö³ÃןÿÆpè•#ù†¯mõ3Y J±ÚâŒ\÷’ÊFm¬¸ÔÒ®ÎS ÊVKeg™qŒ™[ÁQvêÝõõÆm ·ãG9îßw/sžÉ¿E9[2ɨ<ŒæfBʦB¤äÞ[éT „w´æ¡5 Fü £ŸRª©ÀJ¼éëžpbz|‹,Y+О¨¤dØráY&4¼zG®=Xçu¡˜ñ›Ä‘p€ÓÒë§Ì¶öiõá™|ò6ßXôuŠ¿HcjoQƒê±zvùóIº´î5\ȼ1XaÝÁ(8—Ɖܫ Ö8äZ]¼uZZû`ýº°½¼oê7,ؼ‡ïHîûÉýk–×ýÚ}»îûyfœ)Ó2¸P"°Gà7ݲº™QlgÃ…o¿ c·x™‰"÷›þÊg~uxõÈáá[ß>”®`'Ì‚eE Ëô½»9Îáö´œÍLfùjMÁòrŒœ×’ ÌÃʵQ †:V Þ,\°º­ +x S©ZNÿ¡ƒC%xxÐó± 5û¿ŠÒ^Oåï`œFK´ÂëøI…SôT‡äɲqù± ç›VFtÿØ[µësá/ÅÆï¿å®ÂcPy¶íÒ(úl÷ÝŒr.z €¯øjÌŸŸ–ß®¾Šî+p~qI¯ÊŸ³ÀYë+ªÁsˆÚòÖ ÜlýyãæÔ•KO<ÿÂóORšk\¶pͼ¿õ!ŦnÎ gNÌœ8óðÃûwR¾ŸÏë\L8¾38p¢nšÞ9s,ûݼÄYtt÷–9v•µž28Íáñ“džï|ç;…}`8üÚk±„ý5ŽŒÎi6v]ÉÔO³7®Ò¢°]˜q´ÛT5*.úXæà5œ8ksŤDUit<¦ðÀ±«Š%‡úoiÅWiÝ“HH÷Q$p´VÜ„†P1Báñk” øªFÅrÇ‚2Ê(©Tlë —¸òú[]ÙJæèZ»±ÊåÂò÷cûîg{ëk¯Ï ¶3.em€ïØ=¥É…5ÎþÇPƒSaTø|Wìä’½“LX"€¾Ã—„ LÒ¹)Ç¥ÇÛpQ‘Ÿêâ ”ßù _Æð6ºM£ô×OÊ;íż^¾(ME7˜VäÖšO.R«¨x›‚òäOãyÂ;ÿë¡&¥¼âã ÎBŸðn€„Iðˆ–º=KS§Ë»-rÂìÕXþv·kî»z¿ü£Â_óÕ;~ñXʄǦe¬ÒÛú«ø¾„™Ð‚LòöHiÆt„ƒŸ §$ ,Íós9«ÿk„\û,+¹FÊOØ›{ `‚ ·Â+¼õ(îÂ¥5_ß¼°pO~o£ÂÙ)CÔ°X|ÿnŽ™_^Sô.©Ýúeމ^×f?ÈrÍ/<÷ùL>ùø¼mxAÛá³€îVKkŽN¨Îz^a ìFÍPð§§YDoÂÉC»—S­"»´®/`Rn…üÞͬ²-%ÆË½±`èO(8ã‚£ù+„´TIâÇá](Hn à\Õx…qÃF­lùåVù%vŒ³È÷¹Ãv….Kdén+0¾qý&ö¶?6<üÈG²1fæÂ•´&S¬Ì¼1˶Økç}5Árc¸5¤'×Ë{îÿÞ¸láyŠî©?îÉPѳ"“z‰1‚wã²Êi‚>ðåëÀEbýYeðq¬8c~fœŒ¨rŽùP¥N^áS0ï)T‘Ð%†Bl…ú¤+y˜°pŽÄÖðÚ³ˆª´ÌP¼Ô_‹G]ãr8¢ÒnK¬RŠ"ïðñ¯UùYÈ@Ë]-¾kf4¾®âó•^µøöèì=[ tZ6$ZÜD½°(ù¥ø+>é¦R0ìø}À†çž{Nõ¹ÃôÒÿVœéÃÎÇ|âŸÞ³}ûŸ£°KTçTº2 äçÓS×Yžè7ô쾻ïŸñfwÈéôé“ÃÏýÜŸ>õÓrøçŸû¿)=ZVE1V^W¶Môüé.§¨ñå¦,hÉ7úèä!ÒkîÞAhAKH$ßKž(´½8u—z-j@€H…çÑŠÐuÅ7œ(‰ c È&ùÞm)íæùu»æîŠwwj@OmLÑ7 g†®@Œ0”×.¡]HßÛ@Ø›’Ÿ."Ã.»‰¶H¶.ÌÒ0;„Jï@cÊ¥1-ZÀIÊ\wˆ-aäSјI:½¸À7‚'KR‘¡:Þ»d ¡7鯙õôÉ&È»˜xë9¿ XEWˆÛd|B;L”ªÀ˜Øÿ<$CüÄy‰'q(Y<<ÃßR~{=\Nèf +¦“sžÄäsÎê£|¯ïJM ·g:TWŸ >{^(z䆼‚\ü'qû?óóâ9o žÝ¼y{ùæ­Ûk/ÌÌœýão¿øqfÿf û{ €ö¶œ‹ƒØ,´ÂšíY&å~aC"ŠnîdéDœ ã™|Ûq‚­“cr çe!\§~è•Cl×|&cû£GŽŽÖH`1B,Š0e‡¾ÞíÂX”qáŒ"Z`XáÆl0ŠT:l.¹³8% ð8 3øŽô 1”ðžÈ°jm5ˆ*j­´n@Jú •_ê­h]… 1é-‚C&VÙÑZ³u;|6>ïÿYDc+ïÐÉ 2»Ü/ÀŠÀí~;­¼G}Û•wÿF§'lIã¼S¡ þôüÍ¿u)\ê¼D¨îÂ&•Ƹ_ íÜ+ü”¸ 1a×$Ä$ A+úƳq>¦hÜêH’G€“gõ:f#Ë_JOÉ K…ϳw0—Ê_cóLò9«²{å›…Îìû†Ì×y*= êøÞIT︅~ޝ;Öw2ÐÙ}ñó—õˆV”?™RñK\hÀ¸hø9àe…‰Ú©³×û̱#¿ç^>ø3¶¨¢Ä½m€ò‡K—.]:Á¬ôÏóáF¿•DÓÃò”_AròN¡Ðª¹qAô]¯••.;„صôhi õÔSOå(l'@„³`¦Ç;®k¯°ëëÉ9¾Ô(”.¯|Fh#¨dBXê>wI›û°@ø±›ô›wýžŠ>ô…H!S1„O¢ ŸaCQz5.ÝwCÓé’5¿@á$™rÇà``˜3à› Kë®Ì^;û•/þ¥}º ×§0­dU>ß¶ÉA±¾xq×®= ¬Ëþstï´oš¨ÕÖUô°ê‹ÏüÓ¥b´nÖ½æßzé…á±?•CC޾új^ɘÔeÅ:¦kŠRkýÄ`÷5kÊcì p!ȬOª†QA @»wšŒI´\ÁÄãA8ïã+¡”­ÃæÞö•L¡‹oüC€a–Û3¬4÷M8—1Âg^Q©=¬Œë/-\7C@Ç[Øým©šWÓ/u 7.ñ¢§7O±Åsïi@;rg(@“áv8òHËwJ‘E‘[-ÏÂÅo2&ü!§›q†Ð+\¢ù«¸¥!Y²æ§«71áËU~„ÓÈ(z¼MéG3ùgÛÊ×øÛI;ëTåpVŸ·(Nì9ÆwŸ¾­¾­¿=@{ æÝ[~‹ÞeÛðtï- μBÓ‡Ð.ÝÐ#½õѳ VWnÏO]œ9ógNùöÒ¿ð…/8þû÷Ž”_>¯Î,l8¾{ÇÆ_æõÏ6ô­EÄF•geÔÑQÎtúܯµ¢Z‰Ü3ó¼Ý¡gŸþ)v]Êl¹­{Æ<‚ÙNã$Çzº­›V8þO †pIrƧæXï ©<ÈžÄÅ£ä‘RÜo“Ðë›rò9ÉðÎð;ø!]”ÇÉ{/£½üàuÑÚhˆÄf9Æ­ò fù=Nè’Ž{°–ð.ò© £„¯ îM‰°¦ -râV½…TÔ=õ ðôð^&â{P<òÝ€öQ\£µ¨/:’¬¥íy&߉¼'ç#FiÍÚ²È oúx®¿æ÷Ùè\*?ÊÕ•¾ß1ÜiíQÞãW«Ÿ ½´üž~\¯óT~—Äg½ojnÒÕÏ ŠlÞÒ­§ìúÍXºœ› ú¥‰<§¿®@n J脜¥µ§O¾~ø«_{þ¯¼ÔÏóçÝ®útw‡¾ùçeÇÃì©Ë ËËÿØõÇÍ(Ap•ÁÙ‰¿M¼ô«¯ó|¤R*)8ZíØeß«ûúÿûÇœŠYì§ÂÄÞ¥W:-¼Bdõa®V9ñÁƒ¬6tVÝ×Vo1ærÆÕµÕÅ,­d/eÒ¯„õ{‹*KJ\CBæÇKªJºÄ$IíÕ”Aò‘’4É¡ +±Ñ#¯õ(m¾¶svݵòæœð†™]Óä®GÅO@Õ¯åèL†·X2 Õœ‰Ôyç˜;’‹Óú)g¹êgÏË{ÁÀ?E[YMb Äð¤)XàxS•M£Dª¢¢η8†‰Ñ¢Æ‡<™†~¡ðÅ|ýf§çX¤'³ÐÏ=-&8Í#Š0RFn «‰;fU¹}[â‘[}L_»]³ÓŽÖ›.·Ý{•CžÝy¾»g½„CØYvç]e·«¾®×0Ìî¾²)Г*«eЯ!àž«•Õr[R‹—õ,œ=9aßહh\={þÜpìÔÑÿ €ùèådEšl½#=ñù™!z+*y‘å¿ÂdÒZ ÃÐGeE‰•_œ]%'AÜçÆ]*X!CÈ7°fþü…sóÏ>C—‰óáüd6Cø_Ò¤ç@¯‚Ê1hý¦Ú)èy'mžÝxD€[˙ܚ2µÑf{â3móX 8i>ŸB{ 1F7JSù¡Ð×Ê¡åNÝ0ã8Ãõ Ñž+ïÂ]åѺbÌDNcÓžÇÂÓ1WÉÕêjœBXÅPX[«I'U– 9
ԕŸþüu¾6T–CzÏm]AÅuë¼ÁŒøiúf“G²®D>ûèÝD½™|Ž_c`‹ÕŒ‚ãyŸ5ÎÄ÷q½¢>¸ik_-~–í6#àòÜzWc|—À«ô1ôzƒ S_á‡æM'­ÒW½y˜DªìcÚÊßøß •:ã³rîì¹µ§NŸdMÌš¿yíòµSŒûÕñ˜‹dr×Ï;fT~pOqòê™}û>ð ‡CXÏÆ´µ÷ð{E¶å.%·pÅh¡Î¢ü’` éVù¥Ý¿øY:¶€–­Z~;w~efæÂ¯Î^™ýÛL4z¶º®•ÿŽßïcçïˆS ¾Û·nþŽVÅã«Õ}Iõ@†ïç]"ê!™ó.oÌì'L¡ãöÑ%ö¬pøƒ/~!ï¨üQ:KZ±É·<ê—cV=‡o’ßݬyϔøä@*ʯÞ8YÓgQKdœFC¾ÈÈ;ù…ws]I’S¬9“ïp=I¥u£¨òT>•¯Ù*”^/?¤õvÖ4iu[ž¡ÕçˆjH•wò&< é>멘ž'#7I/íè®Â‚¢¥&MáObè)¢r-Žø¦l•Aa2ߪ*ïtÝóïþô’„-×iï´ÚÃHذš0kJmÃe®É9ý¹”ä"×JîZ|Zy§¹YÍžjïâ÷{vä¡è~gÁÍ9¶ò®Àd“M†¢nq¾ÁÌ>“päå¼[¯µ¢©ÊEÙPæð#%N™ Úê¦$e&Z&ClJ­Ò·p“2ó¾?Ÿc»yýºbnø8ÁëÆêþƒíy "½€ÔÚÌÌÌ‘={öþ Î |ˆJfam¶Ê/õ0¢ýó(#%!똴Ó)Š•Fâü™×9n7{Þ ÇŽ)‡™˜>k ;dŠc4?{½oÙ{6¾ëœXÌÄ7pÖy”ðE¥CC=Wþ¡£qºÃ‘Àÿ\Æß錦ïoyGxîLXá .ƒœôɧ +zäG2È/åO,5AÑ9d°4i5Š!¶§ Èý) ¤jÀL*}Œ3¨CE¤SŠZ¼ùè$ªù‹¾"¥È¦àó\ÁÖø U.XP|b Ò‚Ë/ÑÊ@~‰‹L5Eéþt¹…H|oå[‹Š_¯ïߣ9võ3³o8F"Ýû~ÇPô PÎ5e#“ynË­9ê+Ù,K#TºCbžCoŠR­¸Åô­–E«ËrPŸ£rTc—y&µrЬÓçëÄË×8þëÚì*àZ7dÍ/.þGW/_~¥Ë“ùøydž?½_ ®ìÞ»g+³óÿ‚ ÿ³Å®*–r(CºEZhO rÌïLI†‚ —.Vyõ•—‡§Ÿy–e©[9òX°´Bv…°L È& ‹Ã_ º? ë ¢Tw*ÿ¤Â;4ÑM†Il?^¼P€Fbâš’%©Çé)€†$Üòˆ»_Qv`˜¡HXð Ïe\*‘¢£¨´ÁØÃ *èùI÷:Yå'Ê0¥h®€æÉ×VT áe¸¾ñ“!Åë#‰Çß‘¶ˆ1É(3éO*´Â5Âæ|þFézyÆø¥e";ü¥è^qÆw¥!¤ùQfõˆÈêÚû\i½ÛÅWñ³©¦ÝõÛ€¨À*Wzç³°†^êm»úô,U|WíÕ¶Üvñ9Ÿ_Å•)^Òâ-嫼˰zgY«\•,­}+§á:'¼Ë£õá«E{¼¦âiJö¶Ù¶²°´0…Ax¯pý ÑCnE†žïçÞqÐ3¿9ubçÎÍ‘M'÷@³&1Zfl™µV†›Nl¥=óÏZá·àÂù…`¿ìYñO>ùd¶»„’uÆ)‹‚#ÀÛ…ÎtËëá#~f\å÷<¾jõKÙ¢\à¿—®ûóL‚„ LB@Z$Ý$.=WhÐož Ó ©>4ET¸Ó&ÁÓh+Æ¿ÁÓê5~Ðo@ÆÂU$É{$ Ò€S¾J+¦ìV‹, .û"6%°"ŠWcØ<'²¨3Æ«Ô_@késk8…’x¬ë‚o¢¦£ðÐÌO`¼#Cj»Ï}¯&Û F…º#X[ú¼³WÑÛ•ñ~¾ºý¾Ÿwxꤞ3u•ž×-f÷]°¦ú*¯†—½Bù¨|‘+…Kš‹Ãý^å”Ni1Kœ‹'®¢¹b5prβ8r^ß\–s&Wo¡üöØöëœqüàÁƒ££¿[îß÷ön€áÓŸþô—n¾gfzú—Óo¦)P{#XŠVÔ`øó L…>§)¼`˜D˜Ê«ó ‘gŸþ$ÇC{ÜñõLšE–d%ð*ºwA«¨Âo`‰ð4‹ô{æ\æ îÒR8•=›¼Kp­ à-ByêÎph l-Øvç½Á6|ÁÛq‹#~¢øbÚí ÓŒa˜ž¯‘ݰ‰«Â•´<%]¥5½À“hž'ñ Q45¾L–»ÓjÂh3‰PèIH |K‰¢ì¤W º³,6^Ö£>ŸK)lÐP ã$¥(¶€QxàJñ‘*Z-̘~b¢¯wïÝG¯¿Ÿ²ëP´&øjÅž»ñ4.Ú±ËßOç5¯I^ù#õ­Œv¤Lü@—ϽwkÃÖ Qy­çòƒ¿Jã%µgÀV§7Rñrˆ! ¼`aÝ2ÆjŠ»|çèÑ£¿ ò•ÞÇÿCÝ»bP~3]sõú¥sûöÞû(炬ä'3,„„­½Ý±9î™y.ªÖ­ñƒ¯0ðÐCðyê ‡_ùnºøU .ˆèr—‘V…ëÞ3m´¬dc@sWãr•Žô­ù3M„–Ô}Fºž‹‡QÒT¥‰,·üU|ž ï‚bÃzxWtFù…¯´=Îgid,,ª~+M…Ý$I2 M†ë¸#c’|MŸ¿ðXÀ 6¬þñIU­“yÖCUÖ€´Ÿ.ÐP «"뤡„݇ò‹m²ÅKkoxTZǤkJ_ÊîÈUŠ?Ý{ñ¹©Ætùê±Ý|Çößgö³6ß.¾cû(üB–çÞBéý΢c[ûZ°fÉMÖ„KSÊda,Gc²t𔸠k:\‹—>]޾CààÑ0ˆÊ[ë¹ä_¼ep´¤Ñ#sïšG‡!Lü­²“pŠƒZþáå+W>ÿƒ6þ$Ó»~Þ`ûdà¶­7Ö­ßø‹S.y«¥mò΢ü¨%q!•¡28‰;[å›Â=•·gΞ~ê§*+®Î_¸˜n~`À!Óõ÷d­´¤sBÅF*¾xdý™ Àß°¹r”À"’çò@°þj%Ÿ„u#>iŸ’™+Jb¼æØÂÝç%ê” ã4P•®#@Q ‰A"zœwÁš îæ/áà¡Å÷2E¢ÄÑÉ xMW¹â#¬†aæ7Jßh!îùµ»°Rk|” ‚î³JP­´Ñò„ ]ë&L8“Vz¢"hµüi%‰÷nÇxP×úq·Åtìž}ðÄfòid|'_z®Ü«±½­¼kôUz»ûnÏ­¬Ú¾†Ê°3,-GôHn``|•(H”+edÔÚƒ ßÊhOUD݈H·y\~eÏ{yz”£Õ4©µÇœÄ*Ÿ=Ÿ²§²´tû?¼råÚñþ-OýH÷®º )êÅË—ì¹÷ÞŸcÏûO 'ËUÍX •È‹B9³il3‡|ø]ÃÒJS L¡†#¯f}ÀƒÃ#,zõÕWháý¼xµ”†çÞQpÏDór1ÕÐç²C‘¬3æ.–޾ ¾w]=ë£H†%Ø»•Ò\` keJܸE¯êã7Êä¼p8Ó÷|"ñäÅ ââQrIÖ6¾$o³ËÅÙ†††s„·€RN 01­Ò—4R¡PaS¤7¯Ðé¾| kµP®„6ÕkbIÊOîòH×oÜ…/E©–O¸à¬†l*ÍXT<Ï(ÒªØéæS§(u Tšh@IDAT-Ôán7¾uå5éÒÛÚ£ì™è£uÌD^fðUxœm¸L¢ù*¯.ëкڒö…F®U!]Åèn†'2˜âUy-GùR®Æ„*y R£5ñËò²Œ&”æl$‚‘§F9'¡ÜZ«V>iತxaa•OÀ¯™›Ÿ?u{~æ³³³·çØÚÿ¢nüû®³ègìÞ½ãÖô†õÿ¶QîlùÇJU ‘ .žpCŒ§äTkMklãV޾:ÌPà“ŸüéCuâÔ‰¦!*Nñ”"(,ž›†ÈP€ó¹OyL¯ù–A)ƒIUοZQ´–£ðéà ã­×Sû5pä-O›»y‰¿2Ê= _TL[ð2Š…ÄJ… |C-‡ðöv|N•>h<ò×àˆ¤HU&‘þW>á•y%¤ ¢Š©ó)îJ\¤–„_A•Çémäq†„Š %™Tæß=B,.©|˜Dñ#\]úQjž'•_êDáQB…§!É–<ÎPùiáûåöëE Á"=[Z'ÓÊUya—¨2rÏ3üH™É“¢‡w>—«rð˜ ?“¨ñAt¦ÉŸþjék²š"má}vÂElÎ9¸Ÿe‘ñ¾o±¬Sy%Œ¸ŠG 6q@ÿüí[kIó¿Ÿ8~îþŠ™D·;©•⻈Å](3¶Åo½ÉK{;9ñ‡°úTåa‚Ï9óÎwüLÜÈÓ4pÌêûÉÍðØ5 f"âÅ oV1k¯ÏÏ-ó ýoÞ¸:{b8Èøÿø›3î=}ÏÜ™+³ÿÝúÍ>úþ-dj©à—‡{¸R¸ÝO~ÝfÑ_=]Ïi¹¨GIÛ6¥ÙÀd©,{ví¾øÜ‡_ü‹¿8<üч†ã§NæT`®“Q“ ¬Íñ©ªM63àyà"o€2'C'¬H®&ßüÃ΢œe$Äše³Í`n€­•\¦&åÒ 0Jñ++‘]ä*C”²ØcÏxWå¢O¤S¨L#ý¶†Z᥸U.ã :Iꇰî?z åÁ7ÿƒü…¦×°AEð¹Ý^UK£a¬45b¨b0 8†@#'„˜:/ƒ#Žòûì!Þ«µ´W °×$Ÿ¼²»,Œ—'ü„©w pôÄð¸¢Qo”­MÄ+ý­”E;Oþ~/¤5PY/Ö_êö ‚ÃHË EÃ+~®VN ”n¿5•½ãK2‘$øX؃1O.òSnÄ£/n"8öo…Oð­]]\¹pîø©o†Ö犜N÷¹¿'àw÷wsb÷ÃìÝùNm~Áâ@ jE”ÉrÁ'L3Öºo^ÞFœU%Ó9 ˆ50qÈ7{mx…×O80œ<}"éKy䙯®T@“ÊæîÄ(<¯Ž½®søÒsÊ©¸–Pzüò½ ‰8!\¥ÐýNP ³Éc±ÈVRj‡rLG&ºKˆ~+oßÜL©‡nâûøSûZÙrÀ4¥dædº®‚ø@ÒŸõw7ö‡¹Ioܤ€ßí¿óYXÓV=m‡‘¿úÇÏ §eDŒTï<ã)e L–§wƒ-w”Ŷõ^£g¹£øÜËoš‰Wztò¯ø%l- È12lä “d~š>i¬×ËÝ0óÕ4ëHz•Qin‰rO¼tˆ(7ËKkßÊ/Ö¼½°çâDd†¶66~ÆŽårWÆ|½™â˜ €ò` Ò?¨7åOyŒ§±´Ènfxµ²ô‚ýâO-0oüç=1“äÜžû­›ÖÿùM›7¯‡·+´¼ð„Ê“|Š›n3`žo¡YÐi¶öêdnºì°Aæ;v¼wß}Ãüáç‡_ý•ox‚-Ã/¾ôb CêÄŸÀÂèÖŠ;‘rÃ2Íšé„3Á…zO«îÕI†Ð£ÚK–ŠAÆoÞé4 ì“Ÿ-[HŸpËË×äi„Gx¯îÊoX)ŽáIµCEà LŒ?åõ< wéUˆt£ß–Í(?žÇ¸ZÏâ$Q,óeÑ%Mòûƒ“°7 GÝþ¦ ï~Ê¥G™œß0.ŠŽBdñMŸ°ô4~ÁNS(¨|!$å„Ù©ôš .ù&—xƒí9èñ/i¤ƒS°J]ãy+Gê*4 N*u?ù‹‰M \ ÓŸùò̹–Ü–8Gá[­°ÔÌLküòWÞõ Æð‘¨Ú“°Ù±aªSˆJ.M+Ïå¶(e6mü#¼á9Ã³Öø˜«ô-A¯ÆJüyOOV™cbÍþ-³©Üâ´¨ìÚ¾ÙË Ýø«>ðàÊÈZ·Ö#àóŒÿá‹GÆêF|a 0ôŠiù—éa°øçö?:uêôÿ),vˆôM¸÷ÔðJ0¥¾<3sêþ}ûþ$½€¢ý˜}FúĤû¬‰ÇÙ°ÅÀD ÊFÊLÑœ~‡2îÝúgŸy†ïà]ιë¾.Ô%^Çä. ‘±YAGåtS¸¬°‚W€$³çÓŒ•Ÿà@ÕOP¸‹ªDcªÄ‘@‘I%ëoUTqvȩ̈Ád‚Le«4yâ-å.Ø.@† Pð&܆wáÝ…#\á¬eµÀDÙkœmkåluµô*~…GQ'”5ãOgæ’gvÞwñÎÆ×{ù%ï¾ârv¿pO¢âI7P*˜œ ²ü¥H%ðwÔy,?e–å•"ðz­¿B˜CD!Œ¨nt1?àðnœwâ+hIAÈ *Bi~Àû¾Ã?»³]“ÍC7Øžë«H]íwƒ@ ºªg¦œWÏ_¼Ö™$‘“¦¼e.“@‚ øÈâŸÛkùÔÞ2_Úúuö œ"Va·0oÚ½×s9+À±Ê›ËÿÍÆÍ+?Ç{ùµ3,He¡pÃÏe¹ÁÁÉ“õ|IH6YF«ÙÖ:•H±T?$úü7þ8g<ùôÓÃçÿùï3,`Ÿ€)Â=­/¬p.N;cwÓO]ÏÁ¿ì`peÕwòM@y[À§NE¼••TJÖ DJc€Øµ¸OØ÷­ 3´ýè®J=ñd6ÀÒâðã«ðD´rÇO Ì«’Ó$¤¥Ð‰Q›Aî (æYÞÆxP6]Öà#è‚ûÎÙ!AÞ+¹Êˆ/=³ðßÌÓçt­)¶‚Þ¤ÍQƒ,“0iФÍOlµªTš$:ûNTÒ¤LÁ)T‚‚3Ù§1¬ìétS/ÎÌdŽ@8Ûw[ÿÉwòy£“™±Z¯—Âi2óµ`„K¡†5Ää/a/L°¤j;F§Áv«VºÒ¦åi•ß[­|ü¤ó^þº×sÅ÷¸Ü–tÙs¯ÖÛð´âàË»vâTÖºªë Xt)ÓWøhé«U§5çŠ,«u2‹5êú]«^÷‚sNõìÃ?éà[~k’»’+‡·. ²øÃ{ùH‡LiNZbs/Ó`!äcÐY8#á­“žW’™JnòŠOÉ£);~)–fËÀ§µÒ`¨ ®ÎTî\£ :õ­lfÁWæ”ìe´ÒJCx`V•—|‘Ã?SbŒñøqP'ÛêiC:q½‡ÆÁ 0S,ýýÃ+gÎþà y?o´ ï»ÞFn•4˃Ÿ{î¹%ºMÿýÒòæŸI-¦2]ÎˤÌT©ýRm&‡N÷¨È¶Ú«®ä^&éœ9u®àÜ©3Ãw¿óÝáñÇ ÇH¼‡G ¶9c?€ I¤Ïx{V’ÂoÜŠ§ÂÒ XOE-ñ…õéÖ Ð˜¢7àdÆ© â!ö(Ä'Í>ë"€æ›ìÌP¤C£Ý{µâ%,ã ÜÆ"ª5WX‚´ŒÍñZs>Šâ½Äå'.xÀÑè¨/Ö [‚Afî¥+rðŸ?üGX.bÂÓè*o<”WšKIë5]á“G^íFÞòNJÏeZóshólܸˆ +¡EÕ¥”­LR¡œèÌ»è°Â%Èîê [Ùö±נЪk$ç9ˆcžÏx)‹f™Bä™´ ó\LÚõ?è*þ]£pó–àHi,¬e"}íläõ±òOóv™ ¿”UÀ0Þ«éuìb\Y]Xý/¤ý ójêR/Ç›½ƒùÇâ¬5ëiÃOêO|cÛ¶mÒ  °2ê‘Ø:ÚâÜà8ð]÷ìÊÞ»`y ­xE)\ßPŸûÌgþêpþü™á…^¶mß&Ú­b/Bzö<–<ø‚³Ú]‚âs¢Ð9ƒ |‚<“‡(Öìû¡Í!˜·BkåyS¸ü‹4ÈRë6áÐJE«„@e +QÀ籈( wö"L)«¸'ñQ4„ƒtòÉŒz\GhðØ:DJqÀp³]†ë$!³ï¢É3¢™4æè¥¨ªD‰ŽóüÜ|ºë~ËWPº&âÅø&îbSzXÆ…Eô–ÇÖÂUöšäA)TñǺèü,8àÍ„[)¥ü™å¶×'>Ÿé%Òòº/CpÏÿóÞ૸ÌòƒÖzâ0­ø’gðT>æ5êᙹƾ§QOÕeõµamÿ]Kþâ³Q³Š ·=<ތݾµÂy€SWg¯¿Îùÿç诫AVº$5oÚ½ÑÀ›Fü#¬¸U˜¹Êtë¿Ü¾uëßgUÞšEÎf“=¾®óÓ‚ÎÎûg×”íÄav-焟ÔRŸÍ×"[I®ów‘Å×¾öÕá_ùWv8rä(Vû6Ê^KŠ«~¨ˆXV)TZê®QÖoÞBÜbÆw3²k]¸Áš ÁU„é ÐýSøÒðÎ_Z¤Bôâuž „®)-yª’QaŠ(5ù{¶„G¥5L^…nÏÜu+­•P±UŽz³ ÏÂJ„8»H¢ä_é+/b¡R ¿Ìmø <Ûå -æÉŸÿ ³aå„•ŽÎãjÙFüBšSò56³­À‘:öAŒæ]~ËLH²cÑ'É)ù“{ÁŒÊd¾ü—|¹ÛÒ‹CÃî—©íÕ±ºn¸1Ë·ûØ[boÐRN±´ñ¶êËý+UW¡Ž|ÄYx“G+^†:ð†^ßJ:üU—ÖQá–?AÆî‘ð;<2A´ ݬ­¬ðælõŦüf¬EÍ›ÿµ¸o>éÛKÑß[ž;wöÕ>pÿ_bÙïN-koeªL·ÒÝØ!=å· iµþTL…ƒý]¾Â·•£ÄúîðÈ£û‡üàðêáÃ2ÂV`jX\[àb#Ÿs!$µ=–ÃÎ(³y7RñœKËI‹êZãñuž&¬³­¨0ãp­¶ãâzÝe¼†,3íñ7¸$<³å¾;¯w拾N£Ë™ï:NÏ|<›nšLgíí®ªL9(‚{h–ötéUeEž)W>—IOpµ¤–]Ñ/a‚‹2ÊœŽ‡»Ø SŽ+ÊSù$•y’^¿÷`PZU³êÆÃè$°zæ9Ò#Ó“NÙ½Á[Ïxq1^{ ü03'3…wµ©GÍ+ Žíý¾ä5TwÊ{š‘QYŽÜÅ*±Þä7ð‰£¦H˜€ _Ò—Á0]ý)ïu¢ •CPëÎZ¨‰À2X4fkx­ºfþöíÿZ_:Ø^«ƒô-»›€â¾UøÖÞì]Ù¸qóŸUd¼Ñ°Þ•ÊC«ËðØÀ`¤.ËOáVîߨs—à3¼¸Á®*{J¼rLºì³·ûž –4Ù`:Œ‚¸sT™ø'ÿx¶fû$Ý7ßÛU[nh]ÁK9ë}¹‹aò~œE¸®´JQ»Üê5ÙB›`³²kª2÷²w#â³W‚=Vp$B…ú7é|R0{h”7Å«À¢0þõÔâ$°Ü»¡ˆÁ…iÇ•Û*É_0G¼x¸‚O:ÉK¥1°å¼É9~&=Š@½ØÖUМt*só”ô=”JžXòJÍ›¥Mœ;¹–®¾á×øhçeΗ¸ÁŒ¾ø­ûÌès7ç†z/SZ;Ò½¿õatÆ{3]ùà• "MoOÞ)yϱòµæ–€±¬à³¾­;¶³õwií‹nÏÏÿû|‰è û_ùþàß§Ž·½ËgOŸ}ù÷?ø—Ù­·‹B»¥Ó¯³{çDÜ2»>ý]sDÉ_*ÊFB‘T"ÄTŒ•|òõ~°txø¡G†cGŽåÄa{ ŽûÓ}oÊžÖŸÄeí1ü‰)»Ž|".F&~ Žt•SÀ¤Ï¥™AÒ3°µ¶gÅŸl±mÅUl.ïYPcZËWBeáY¼Ö|òR”[!kÂ!T°"§ü]@'·ühËUeêeðÞËDda¾ßïòZ%¶ûš0 0 2}¨ð¹Ñh‚æ:M>=™ç¦Àúù³˜qêMž(aý‘–ÀjݼkÁ"ñ× ³áòÞžš¥p¡˜½Âµ´¬¼BËg¼88“Wx׳VA :¥¶aK_Œ€Xñ[¯æ”:ªÐ@€aøSg¡ºQ+…¥PUn{6*vñMãŒõ“†*ß´„Ç1ôäCe„sVèLÑCù—¯Ÿ<ù?Uâ·ÿÛíí#z‹VÒ!í,ïã‡rR\GpÌk¬ ºí†Ê>ì•‘i%àž!Ötù¬¶Xæ}÷Þ7|ñ‹_Leîßÿ1&u—k]bסկCCliÖ­Òs\ç«G>UÿÄ×ô¦AòÖܵ ɽpæÌ©—îÿÀ}yÃôú/Ã;béÙN—x+";ÂxZò&)%¼©ÑÍó}­âsàÉÙÓg<Œ1ÓŠTº«­øÌ€C­H7‡Vw‰° jåV™–gÚŸg]Uܸ^ ‚p¤)b4‚ÚXþ«%ù‚ä™{ÒðÐÓJ“yÉ;1JYeo(ñÒ^…·~GùøhžÍrvø”‰d¦Lú&½ U 6± x)8Ö¢>&;´H£½….ü¥HÒZ´‰@ÅêŠú‰3þÐa>!„`5¢õ|ô[o×Åe¿ŒCïž:åèyZû­Ã–Í["vï/ѽçyŒ¯ç¢€}ˆgVR’2âëå®ü+Î|æmUFÉ -–?`ÀH¸F®=ú&¥‚) ‚üŠëÌ䡺ø+l|ãMx|³ä‘ÈÓ  p†Óc\e¸¸†3N^ºpé7˜¸…Þ„œQ¾oÑSZô¿CÉòF\³¬mþ¯¢tV¾\hJ®Â»ROgü8FÉè¨ün„Ö:™¶sçÎá«ÿò«ÃÌ¥™áãOÈ«,CÆ[ i¤ReÀ/b*JÛ¬ ;{¯PÔX‹!þ4šÊÛéSpëÁ‘®z"(é0[‡¨‡Ï —áM–TqòVñjá¥t’[8-†­J=š¶ÑCx4‰¨"<–GÑN( ÃsxAC—ÙУ¼—R‚Æa†xN?…`ǬU¦ë=Itƒñ]ùKQÄG¯ÉÅ8‰TDþ2ÁÊ\ŠÇÈûšvÇö{†=ìÿؾ} ÁºÌà¿ÎÐÏoH^¢ÎgQ©ò*£_ôb@ACåwëÀ„&H‘9c9-sx\ñ*ÁÒbÔ›¥2ÌõlbyfÍŸ´…Ó<"·B`ØlÙݘX{8ÈŸx½b$øY¶ç°¼|„sÿ®!i½m÷cïX‚þFàìë¯Þ¿gÏ_áï툣/Wz$RT€îóüåøj+Å‹ô½ G;N¥újÎÖ§*ÚÏ>uzxöÙ§Ñ¡5™ÜÔ6 ÕD`Íö*"L륑Ñ€]ÅÍD MnæXÕ“„z*“TÆ*,É?øÊ_ÕY~ÓW^BWŒe¹Ãõ„WK…ǰ ÀlŒå$|`J` ¶„[Z£¾Þ¹‚1a†—³NP3Ne ÛÈŠR]aš'€KÓ‹kÁ+iÄa´ÓG6ÃU@ó¾´=ŠïÐ)4Q¾®Û²m[Zz†¹sîÊÕ+ÃÌÌE>MKÏ8Z=ËÑk¾B¶w˜,í9’µu¬#ßøÌ“¢”òJ±t§OZr P+ŸÉÄ!TK£\ÊŠ ˆ¸‚¾ÊïD‘!Ë#É]ç¯ÊíÆ©[,4ZÇ‘p⪠FÒÙg8Âá |úëöåý»W¯\ýÊÁw`ö?Dðó¾0ò#_3ùÆ7æöî½—ý?ÿTx‘ÞžÌå#°Áî;R–ÛêRõÊ’{„¶€ÊTªLt(0ËFí2>õì3õ+õª‡O—§"ŠZä¡à˜˜Ô"ÑÅ”¿”ÉhŸ%ȼ:\ # 1Î?îVt 01â”eC0,‰–QK\†¥Ê(ž`L¾£4"Bé0 _ƒ@Ÿt˜$ôpORÓut*AÏ%´„±† R!”i 7[[9ŸñÛã9âO«E+-d´>^8Ó ’äc”¯KÑŒtB\}i·~ëÖ휽™ Z“m¶WèÖ_¸xc~%«óÌ'kF€··#AU_öš &<1¸ò-òË/ûB?}V?t›’HëH\éi¨LŒKÝq7m®Ä™ÏÒ/¿ò€(?áá³ ð[þì–dRØai &=ùguÿù†ö"Þºuîæõ•aíÍwªû/…?®…@æý}Ýó¯¼þ;Ÿ:°ñ¯oÙ¼i/¯Ý#@'®¦BÉ%ï xZ •–gVgÉ~+Âdvïa(ðí¿Ívá½ ž^üú7²Ðc#›ŒÒ5-E}` è€á±B‚C<Ý% pa¯ ŠäCsEuk¼ôå¯"…¡ïuã„1AªÆ„ £Ð¥1 úq¤I¾¶fúé'•ÒW¸¥7£½´4Í™i‹(l|$4 \ˆ”ÐøÆ%Ȱˆ° T¹AÛñXxy@)P…šÓ¢‰‹Â7àÔ|NY YVhòº–ÈÄ(;!æ®Â^ãºKέ¶9ÇŸ|œ¼¾(/¤rÜyžê_':–Í: oÒ£lÊHšju;ýÒRåŸ@P8Ì£¥·.(@9b@¥O“®Õ§b¤š¬(“Ýy¾!V‹ ºÛäcp‹‹¡Ót…×ræÂsçλØ2WjGôïï—‹wÕº€Ãß¾±wïý»7nÚðép ÖXA¾*±›Ô—dÚr;ž—¹ym3êîY‘rƒ F¿ë ¶n߯ëÀ£Ìï}ô±¬ð»=t}¢/C*·†ATñü:Ô(­MÐ(M=A‰à‚!àQÚë©£„A¸¢-B&JÚ [öRÆâg),I[†$ ¼ÊW9%uè0)dÅ@( üÇK‰eRáhu@>Á”üJ`«ÿæ2 脦ðN{S±!X>.,,­rM±û?=}êèçÚ§öÞòοq×Ï»9P¥¾+Ãõ¸wïsIwêÔËÿíÆ OþKx÷¸®‹­¨M^õð…Öº[)Ö‚ºk°Ua«f‹á«+×c¾®l2~ë¶íà Ï?Ÿ xò©§†í;w 'OOaóV¾Jƒ0) ÖÂ.n8+¸ÂÚЉð1tôÖÈðXù¤-)(pg!+—P\þûÈE,Ù&€ppÖ¥àJ@æ“X½Í'\„ÂG°h‚¥7bTóCZ,…I°ú^ëØëêJ?׿µaöÍ‹”,!Ð~vۥخÉp–ÞWs’çKÅÎ+:鬼l}{ë. %ß”1©ü)†x :…NéÀ%Ï“^¼fÊUC‚º«l΃ø*®ré4ÈcŒI:oõ§üÉhqŠ–çªW#B)puOl,¦1†‰þŹ„|!«ÿŒŠòkP¨«ZʉKKk™$œ[ZXðدÍsµnÈÛwïfà-Qwèй€oûð}÷>@¯qúOÁl@N“à§¾«E¢z[+QÍ’ÏVx9®õ^Af‰é=øêO Í[7ç]ñ…³ç‡û|`øÀƒ2át‹EubpÍÊ*X%¤TˆÍƒßj}ª<†»\§R$frS¥kr)%Lª W)±Ãsò¬ø< œåMÞ-UGÒ7~tòÄx0ôDPàR ®D¹§5¯Œ+Ì•xð§Êã;uOhÚÆ»÷Ý{ö ;÷°âŽ.ýFZ{w&º¨å2³ôçÏ_Ο;?Ìøå&–Ýfwô¤…·ð÷–7umVpÆ÷*&þn¥ß+Gž)„*%jÜ(¨|~T^Ò¤> ñX‘«Ë^<‘ìE“×·z(þ`XGŒ_¡ ¬è° /ïŠU'ñ›ŽCCãe"çBf¯_«-ÈÌOyªžk˜ âä_þ˜;~óøüoÍ sžø[¤™õ;äÞÍÀ[&ñ¹½{åèðòÙ“ïÉýë›7oÞ»°fÑÕL–°Ëdx:ˆ>†y*®‚U•¥A¨ Ÿ-k½ÛµÀð)ò[­ü¥?úÒ°ÿ‰Ç†~øCÙ¦àºÜ HV¦“3ÞG›”¬ë>ÕQôtápaù‘ Ü‹®µpåÈ6Ç ïN£’– ãó#$rÙNN:™YzðÁ¿¿º²áoEîX®—Ö?fZI–«Jÿ„¢ëª*˜é*¿8kŠº]ã©@8+ BüUºgY0´ÿÑG‡Ÿü†€‰©K3—ò §Æ¥ÉÊ,AR¹™µTªøøK Ò\om4>Æ«Ýb[WKá–V ºRD†~¤ÇS!rݼÒu¥¬¦íB¥ •‡~…UÒõ‚~iXǘɯ#¹5Ö·!Ó<'¤¦Qþ(:é–ØÓàWjç8˜e~ŽC2ø¸J>ºÉJK'²ÊàüxY-°eÑ`𗥄_ê)¿ÌÒàY/ÊÇ(\‰!ˆÖ^\«ºlõ;'¬‰­÷R|ÐòlÏ"gF&2[`À¥Ä¿d ,>ÂPÆÐÛâÓ(˜U fƒ2Ô†¦‰3‹ŒÓ+:iaðDwhÐU<€ðT¦Ø3ußHä‰HTŸü–À¿>þèñS¿•„£ÚÓ;t{ ×{ߺpá·L¯ûkë§Ù)¸t›WôKL ³jJNÂ,– D²€Æ  ÅW)ŠÛ( -ÖÊŠ-øµ[=­`Ë`L1aµ…lqøÆ7^vïÞ5|ø#ahð`ºjs×®±‹lnà ¦,A]Ë&’Sh0K?õ îÖ Š_¨(wâ»`$…ÏüÙmöíCZ˜F“ˆ*Žrˆ]¼„X6a£Ì’ï;o ãî7ó5\V!ú$¦¸rš»)í~ûU$Gy¸‰Ëg£0¤qû±G^ͲYÆSpØršñz^Ûi8Ȥܡˆû:ñÀãRbY]å }6A+¿¥)òGŠ@dKFUz€,¯F ð·PP•ò>Ó†GM©.eÓ!5Q¼pNåƒVàåQxj´0¹Ê¨¨~)‡ · Ò¡Œñd¯Æ|Ò²*ŽÔ©’Ý«¦„«tÉ¡Ó)6êÉ·T£*z*­i é6“ÿøøíÑ+×Îü’YãÞ•Ö_Äï[`/ÀÕ|NìÜž]oÃô–ß Ëav¬)‚èñ\-RaYc÷?ù¨JBXþ¹HK¥zWÅü×Nè¬X_9mf!ŠÊþ;9ìdæú÷ßAØÉú]1ÐÝål¸6c›^[áR¸ä6›;…IÌ­%Ô(9iHh‚º4 ÅO€ñ F)B SÁ²·+e"ßê®3 çqg¾&¥Ëí™:÷ \*H™5ônE¶õ™½z…5|²Š²Ø÷ª< E§kª€æuOZ å *ôA·¶À2%zÊ$Ñx, þxý¢”&^žp„w#%«LÞ'`rMApqOHX‹rOºô  @±‚_?¸²è Z²tä¥Îþz­ËÉs¬Eƒ‹¶Ô²ÔEZd'eJBáž ‡éýËë¿Fet™åöä nÿ´<ð9ÊïI««æoÞš]º¹øó.Ìo'g½é/þ´"ýÈÛˆ_?òÇË÷àƒîzðÁ^Däë¾ËÌ2³yŠÍøRVS%t¥¬€t‰Uz*$Ši…ð«À~‚[]Ò"æx/ÊÖ1‚¤äÙ#Á±ÖL€mdÁÊŽ];˜ðÚ3lÛ±E£ÂT$ÆqNzõ¯ÔZ¹%ˆ€ÄÄI ‚ã¬r”E¡+Á1ºŒ€cæ ²FcÆewÜ8—ÅúzÌ.·¯Bû‡HG£V‘)p Vš¯íä´ênŒÊWzì :SNòAø¤µ_ ·J¦’KGœå’fá*„2U+أ䶸T…¹Ô¬ EMix2Ù&óL—[ÜB_á_!¥òš„¿1X<Šdz` GëU ïŸ]úñ£0x#Kw—üI<¾÷<«Õ»+%6$<7iJ-( Úâ! MþjpŽ·+ aº$uÒd†žÛ⊣$|f‘†œU2œ]H%˜r¥‹_ðù^ˆ‹“?ÀMO.ÆäÞéRˆ…5ÛºTLa}*<>8à#ö- ˆ‰!>ÿþ48îâÖõ¼4lÒl¶¼éÍ%©rA¡x¹R±´´É£ºçÒ?2–¦åWy™¾ÓITsÉѤ£þ¸¶ ލLØñÅçn/2TI‹yàŒ+g˜C’z²luÕÖ^N¿^Ú°aÓ4场1wã+×oÍýòw_úî«B·y¯÷DùͯQÿûÙ5nÃSO?ý¹í;îùÓŒ•—¨Dôœ–ŸVÒËJ#>é ðlWÒ1³K}tñ ‰Ì‚7ÅZKë¯â ŸïŸÉ/ð¥‡!B+îøŒx†i“ŒKøHȺðvaPQ„¶USd_Ò+¼‘¶à« åWˆ¦3cÏQÔ ød¦­¶Lg¹ ~i49¸›¸R…0¬ú B·n¸ \¥t%¨ [Â@Ý„·h.®Ó+oðG €•–ರ•8ñrÎÆ¯Ò§,Äg¢¬0JRÑB(l¢,Q*² ß„“Üü­ZÁ2‹WÆDzŒ·¼£Tx5ôeÈlÑ…`ð‰C¬å$=yHç8xS4AÝ9´4ß”)À•¿s-&`ìñ±¡muvöÆ'’‘·…ó7þ6“ÍÇ\[«ï2߉‹žwó·š‚w3‡ww¾)(*º÷ÿÀ#–„µòßÁ–º»ª0+¡øèìŠÕ­PÚðeŸ!*ž“B¹^Ba*ÃVœÅ¯ 7Å3mƒ" öjÒPïJ(91B„’9 š„|ªAFॗ1êb"€½º¨DÀ™½˜œYÇ]¼qí>~¬¼¤[¥²œ ¸Ð„™(Ä@'^PMØ0^l´H‹W¢*°éŠ/ÞUš>yeúÐ!oQþ<'iñ¢¼ 2E9KYu!§+7I|…8xµ†«ÎD 9| ¿L­ú­êÔ!¸E¯ògXeN…$$çFH¢éºa0ŸÂCZò6ÿÐ<_И0ž}AN0iº³^íÖwå·Tõ:º›ìÈmó‡ÌC®®a9ô"o™þ;?Ù•ÿ ãýÖå#Ë÷±æ¼Ë½]ô|=(Ìa>û‡ëXÅ‘B+T#‹šFàÆ©U9¡C%@0:¼‚á B©- õ‡°àr7 …°¶¢ ‚ÌsÆ 3ø¦ñÏ;Wz™W¨E†$Àk( é¤Z%@¡/,%Ж1F¯•×ç\<—«2 Œß{»'ψBtôsiœVÒ…·' ͽw,/}”Y¼E^Jn*H-£ky2›OPŒ¸LïëU¡kâ(ŸeRáMVñˆ—«ÐUzµˆ!±ÑÞ˘Š&º bÈÉÐòe™¯éÉ·h—GJ„ÏÂrñ¤ñôD+â°gœ´°øë/}û¥“¯V½dw)†·ïèp¾a'ÿ¿pÇÛâ›ù¤0{ȉ.ÔVjqB-`µõSIà=ÊX¾Dïek)ûɦª#ÁT,Ÿëê ì»ã+›ƒH¹§AfQ4r©¬Zæf‹K¯"¦µŒ·þUxËŸdùQI¤]%ÕWãÿ&ˆ†$Ã~O…iKÆ´Ä—Ÿ‚£æ¡`GÙR&ÑôX(²¼•õÞçüæs £Ž;vžcÃNÁà}´ÒÖDì{T«U\„L¢Æëu‘šª×€Éšgξ‚••É{üµhÆõ‘*6ïçT@¢l¦§ò“—@#§° G¢Ö „,”ß°(xh!A‹'K4JDTÊ ˜yIcÿKúÐi¸ …ÆEkðI—y'”òûá¶Áwz‰³<^éõo+…2Äñ(­4×îbÕ 7éö„îà)^…6èÓšÈÐ7òMB¡uäÝÊc}ÈcËú"w᪇&xÅõò¥ŒŸüUbŸÅKNÕ@ˆ€Øž;áIÁÀ‰À§7ˆ/´¶2zŠ´õYÉ4â7½8õYºÈ zh`6..,:qâÄYá^{í5Öÿø]™è?o„‚ì/ìü㌣'Ħ*¢„#ì§ÒWXÚ»Êɲj‡ÝÁTg›ÀY‰Æ*¼"¶ÎP«tìÛì³ÁVdþ*§øÿ¿öÎ-Ö¯«¾óçbÇN!‰‹K)Ì´iT ¢.r”hŠª´D”ÂCûP *õ­mTªÎTí j§H£Vš3‚)¥Ê…܆”„&qŽ›’œØÄv||îw÷óùþÖúŸsZÇ$$ÄÇæ¬sö¯½Öï¶Öþý~ë²×^Û³JЯi)BÔiט<]ìb@ªÔJ½¢ð7äp·Kï·fÓ=#®ü²ë]Mé*ihÑí#­à-´]ŸÐå—ˆFcY¶è@ôžéépvsÎì߯ýWø„%õæüEdg¨BU•³53âW$q ¤³ê 49¹ÎàÍû¡<ÂòG!(]ܹâ&”Óˆ+ȽPºƒ²JrA$ùÚÜKŸt×…¸i§U$mA¼çÊ'?ŸÑWºqó¨Gç#¬™èp„Ôo±ÉÜ0™Ài†ž¼”ºy½wexuxexiÛé‘ñéI^œšœûsÉ´®#jʹ çÍÀ*êÃfSìÞ½ël¤p9- óXé«r½‘ÞRRˆFñ¸.îÉ£BÆÑöLhÜÔ´~¯‹«`RË£¹D N¥uу¼üïÆhzô*æY-•Heä„™Adá> ºÃ­°ÝéT Q¤£”•ñ(] 5)%‡É*x‚BZ7Ê׎#óR‡— 𢮥P= °c0Ó!`™Zùâ`¸¤EèlŠ}Iú=ê¹Ôê¾¥¼˜y‘Áùy‹NY›ü¡†ï ´rz™%i–År{D>r¶ ‡Ÿ ù×ÐI–peìÒâª~sÒ±(SRy7md>Ûp¢£lköèÑgNþúCßÿY%`û»¸"âç<¬iò9åy o;vlzyeá¿xg™Ôò~åy=0"ï'I>YnIïBr³bˆÜŠ2|ÇÝÀñç-¬3¿ÜpÇuZQªº%´U¦JU©ŠvVJÏëvAŒc<éMP¤{+äÄs%#FÑ@½•vm™Â;-œt¹Wiü³Ø²‰¡r¶¬qüêÈlÏûáÆÒÛ"¦ç‚1)wJF\9ªŒDH±ÉÃʵòdd(†K¼¿'v²†Œ}RÒNSC¥0øˆÁL÷e¤žå}©P¼«÷t­>Í&NK… ¾IDATS¾ªë”$= ôÊ ü01|ƒßi+¯zD×(·¡áE#¬À’ ¢Gã©Æˆ;tz™5Þ>9=½|ôø±ÞyÏ]oÔ½ñép‘TRüu…D¢wƒ<-Â2(“r7> ç$!põ rÚé…“ÄÆ‹¸ò‡ã:fa”Å Ý^.9V/Ë]¡ð.æ(VŲtÚ$ñu’iùš%w€Ð¨ô ;÷„rZþ øzù¶Q_²š89ùù§ž9ò»8tÎÿ²-ð‘çó ¥ÁÿÒºôØŒ¡Iˆ‘ÀòÛ q“P;ÎÞÞ¸ºK$7LQi¼sŒÕ¸É)¼yUø(•ùP€n)B¯‚‰B@"ü¢ÅyM‚Hn)§çÂ,:*l äaœ£Lš4sIãœy E&7óÎË­ò…)¶â¦—S):ƒò4)4< C&bý°zÕ‡Ö@®t„ɳ{àkmÁš¼öŠÊ«ü©Bï‚rIA¹ù+ü’ÆäTyÌË£¥5Ön’HY@dBåmÇz‡Q=F¯Ã4úŒR¾Ô?4ÃÙ3uæUîCêXþÖ¯e^“C>V…ï#ÔG?€ðš£ G‘Á'E‡‰Ei#ÛÙ²nxô؉gþÎáÿr×]_¸Qãïú^®¥½H÷‚Bôê90ÌK½=Gþ¹Lî²\sÍ5_¿è¢ñ7Ó²¦ 1;c_5æw6ß5ú|qˆÕ·iYiñM÷Q «m̳ÐÇ„v¡1€J›HܧU#Oå„I`uDR1²Æ=‹¬A ͉òÙàº@øÂÄ¥uôT«·±Ç^ºêΨ'¿XÅ ¼=ŠF×Ë \ñõœV üph|„6k¿‚GñMÒ¹p><<ÄÑ9Æq‰Ûdêå¶œU:ë Мdà”‡Ô ­9øÊ/©ŒŸàÂër°²hu'ÅueX«ËŒ²ð¯ÓIÄK£^‘Ù¹ö¬\ƒ2˜ï_ãÇ*!¸uBøš? TV ow"ðÔÄÔ‘S§þàË÷~ñ/%OÞðµ×^;z.Ÿñ#GÙC÷µ!œí1`«º ð›å"O¬Üåùù?\ÛþYÊðB ËCÔnœ]íÜC$Ža‘ö?7•š`x­X+4z߬ºÊ$˜JÓœA¿ñVŠªÃá\éª|Qòlš=a»Q¥þQŸ8 c~ð+¡îNDtN¢hå5Z*¨2Ôôù׸ª<’0'ÿ(1×6¤LÒ È@ŽvÕä-›¸‘³hXÐÙa‰¡k”ä’’²TΠæeä0B Ž3Aõ²ÅOpAÍ äŽð*Ë×øS >u+=ËIØ’§q)¥>à[úÊYu^eðº×Oî øaè™`à^ý&ƒMj}S{ÛŸŸ>59ýg_¼ç®?%ÿ„0.ëE6?³>ʱ.¤Øë®Ñ^ÿƒ„ó(¢ì¹+ï¸æš;wîÞuw–í‚ØÂ€Eèsy€ÖßAî†ã[ãYÒ‹±¹‘†@øìT+ š&{õžšÀ]çý(ep¾ Jj¢Â¨¬ÄK‘P?®SóÍ3­‡rM©MotÌ—ŽGíÜ£wSƒôTqá£Ö¦”Åé°¿ =”|Ðjb `€e+Qª&èùá!P/KHå'ØÉÄ¡ °á«ÜÊ'œ€å°ù—Nœ89K+ô¼ƒUÇ¡“®NÈ“à1œu…Њœ^­—©îˆ„¬:c—@‘°ïªÓJn{& yd¶‚^¡_#¼Ï?¹099ûɺÿ‰?=:qð qÛz~'Ön–›8œ­°‰ÅŽhy?À±ÕìüòMÛÇV®c£¶®aÚ mÓO§•±iÉRQï æÂM­ÛÏ76½tÌñ¶ö\ŽÃgÇ:®ÃªÝÏ(- ¦7 Wq¤×¯¥W-NÓá(‘J«baªQœtÈëA²ÓH¹–w@„ª¢¶2Šúæ$jð¤Ó’KÊÓ[Æ(§`xàÛµi1L®¥¯\[ç qê.el|;MiH3’JÃKþz«Zy%ƒ²hŒÁÐ:+Qåça^“©(zÇ‚CíAÄÂ4ZÖEð½êY¸;Ϲ†d•|\ ÚëŒä&i¹€ðqší¼¹ ;–æ¦f>uôðá?y Mðíc-ÿldËîU›n’Ïbœ-x¿Îë࣎Õw¾ýÍ—~Å[¢`, ­mk{á±/ÞvZz: µ+/ôÐÈ;X-fÉ0†øô ÈW{4ŽêZª$n[›ßdP‘"’o‹U Z!ò¨y„¤£yâ:Ǥ~ðå…¢Ûë0lãmÀ‚G%\/J ^Œé%g ‘fc©Ñ d Y@Wú)b~‚ ¸²’dƧ æeü= -®òòÛpL‘^Øém[H™€égù yý³ì¦‰f¤åÕ ˆ2€“ e¸ `™©#Òò!Ñ2t¹¨û”Â:•à“ª\æËƒ¿øó#CÉ&~hPÀ áiž.äã%¼´ÿ©ïùÞxàÌì· >v¯ûŒ­þyÎç@*œyMhuêÙ©ñžþÇvl£•YuJ@[ä¼lbÜÛéÝ^w” «¤uÐÞ @A œ†œVÚ•aèC_@¤Þ•¢u#ˆ…Š|UP) iY/[ ©"άW·Ó Ë ;œˆ‹a"«ðþ*·Ê«Að_!É­L¦ó—V#«žFÄÖ®—Sý¤ˆE>ΡÓïÂZUådèÅòrâGy[BÏ÷L’u‡¬%JHAì17¨v»ÜÆ‘•§f¸È5ãÝjž¥]wÇ_7[ÉüGÒ’R7¨@Â/½7*€û½Â–lÛ‘`„MR—¦ggÿ÷wžxæ|ýåÐðY‹2Œáo–1¾bý@¡Õò„»i¼!zá}ïx×'v^rÑoa´Y…冖*†Ïþw²Ù§ëj?@ö -snîöçÿÕ X[-h^òc"™Ö@‡¥‰òV5ôŠŒ)q‘VD-&Ž Å•Gz½¢”œ¤qi¾O TH÷.p"R J’Khxu*šáÓej|¤¡Lò‰Ìñòר /ž¸Ðâ'æÖ 0ÇW¹A±9ÖÊ\´ìö÷?ÙX~‘½c“ r•Ós•¤uþé!¬Ç‘jÃSæBW‘³p¢Ö’e3‹Oǩ뒷£5ùüú”2§ë59É6““ÿ÷è“O|ü¾Gy0°›kfP¤9ï{ë ÿÝ#O}ô'wüäûwŒ]É}÷¹KÛ1X»ÓjI?Œ4…Ra IÆýœ£lèHú(gÆÆ´6 †ãtšéÄÉ‹ ÐÎä–ifز›ü–¶Æ2àu#ªþ0¾<ˆ˜RAøÚq¤¦ûžÈѾñ!¸’)Ñö(*£+ËÊ¡½”Ñ™Táš1†ª¼Ã·šá¼r Ñ”ذ°ÇÓä[“¥ó–“¹"ùÓd€GR“!Dõ¼:Ï 4$O5“f!Ö¥tÓkCÓ»­âÉ´;eb#£¬Üã„’Øš˜8uüÔÔôß<ùøá¿8xð¡CZ|ÊhWÿ¼oõ-S5ÐìWçéÙO‹;ûÝûš×²oçÎë|ÿ’ï£Á8€|YØuÿÛï‡fœçýñþÑ5@9bÜ( š£òDu’f¼IÃTÙTÄü%lu©aÔ^@ʨZžª«¾J|Í)”¼¡Ožs1.}—?N¦D”BpãD¤ÓŽ=šÌ“~x(kðeÛ AJÄ»ƒS¤ŽÓitùêZ£j%†Vä##<Ò-Ofø˜'¬A¶Ò®î}õ "ŠéØrI@z“‰«žƒTºÜˆ½#q "TÁÉŸgòÒ!?vSO@5˜âÆ^(<â¡G8Joa„gøO>{âÄ{ðÞ¯üæý=ø·ÇïsKVâè-·Ü²Â{(݃Y‚ &´[s!”Ç›µuïÞ7]ô3W]ö sÿaö–Á,bß|†výÇâ| è" ?nI—?S(ç0@£vܨ!%EÖ,©²Vk¥Ü^”ÒY‹1†¦€¦ÛˆFQQ¾>]_Ûê¶Š’ðH#Êc®Ï“¹;nMNiLÂ(DñRí{šüB),„+c*C*¼d ŒLä˜.î½\ÙIÚÔE§ño„ÃÔ4Â3CˆÆßò¥l&ãqœ¨\2çÀ9!§”$)æ¯õXšdd;'µ:…_Þ5ËòBLY–x¢â½­"A ÃÜÈ eàEåmcK÷Y¾Ï7yÿÌìÔÿ¼å–ÛÿÔieéc|æ—lñ#™éb8—C€Ò¶—¬V÷÷ÍCg_ÿú}Åü/TÞ¬÷|£®)J¢wæ*«¯Á:®Îþ€À™—Ð`£p¡x …n§Š© XøÒ›RH8&ß«Rijw¢ÒZyuWÃn­7yeXd/šë Ÿ´<>#ÇVտѧ%­ã•ü^VùÅ•b¤“Aص+éÔ3ì‚)™ ׺H±> P$)jâFÎæ ­zØÈÙáFæ0 ò{O-ÏÞ§rá<ȩNJŵª€G€(²×5ÀyÄÖR]BÅ h-²’42­´ŒµUb¯)±ˆ¦«Œ¦» 'Ê |×0TU퇫ÁTÓî_‰q8æºút||'P¥àQr€cˆâÚêš’ 9®Ó´oé‘Ûù\ΜM®3åi1•3e®OÃkGŽMÏ|l|lìƒ;Çw^ÂtzççÅUä F±Å„2ô(]gXµ áÓÊ$±5ß8‹ay­ºvB\¯µzAø!rEç(#Î…× =åO‘U|3‹}¦¦&çgggÿÿ©©“ÿçÖ[o¿”“AäçÃþðö½{÷®Ð8\Ð]ú^Þç{öÖœ/AYKž‡Ä}(pݵ×ÞtÙe¯ú=Z’åñcÛvðy°,¦p¢<ölÑú‡Al]²â¯}!×VÅ 9©¼€æj`$ÔŸò§bÆ€ä@¡…Õœ½ô:'ÉW+ªñèÏÞ«8$Žï؉¤W ß2bqåÔþÃ;¤¦ÅW!m1Ó# ¼¬4+e+þ´ŸIëåŸ\c ÂJG ¬SËXôK‚dŠÄ‚U¦RâFÃSZ~ËFÝÔl>ü]Ù’yéêSþ8áE¢Ò´J饱JoÔ— yo4Û˜žä+Çó LÍÌüíáÃ}öþû~´óßjí{M<÷yý|n¨ó3G«RãwþÒ 7üã+vïþiT'°ƒî À^žûf¼OÜI¾|ˆƒZ©‰Àt1ã bh^7Vµ²^Ö¤Zh†â•†¢Á$ÄÐ`ÿš¦õ2³Hülʉ‘¨üȃuA[ˆƹ€«U/Ù*[ɵòÅ€"Õ»@ãÖ˜"§„ qPð”F‰žXøj”Ý $Ö× ]Y,K2¡Ñœ2XæbY0µE—ÊtÏ SpJ"¬õ,5Î<¯w-„·¦:¬ÓSSC|KïÑ鹩Ï?~üsÌù|M‘{Øw†I½ž·uÞXuç7¦]0W*‚‚ï¸nß»_så«o­Å?£«8€€ObüöœøCéêÕ_ Ú+À‡PCyM8gÌP›±¥Ds©/­¡ª²YÕ% ê²ZNÁ NþÇh€ò,=©Ûqà Ið$#Ϲ5¨õ<À¾-|mº!+ JKPFÅ_âMžnäÒLOåoPM‰ü•ã•„ÖèÔ%†Ûp8I¶Ê\4̱„}@¯ëÀqYŽ +_¶Œº€š4Þ\ÓÈ*-<•šwîƒ7==ísûžŸ»}bâäço¿ýö/“?/=ƒ]ü“'O®òO<Ùn…çQÞ« :ô÷èü×=W^ñ;´:K¶ëƒêÝ'Qò hi4À8òM矣;󬲸€ä§òZ-–1—îõxW~áb(–Õ4üB6¯MoåÑí—Kž¬[äªB,¤Œ3̉¯3ôJªÖµÌ Ñ'Ã’ åtÍV'#i’À÷Dæâk ½tÕ’S€ô"¬¢”5pÊMIr²7`‹ïä£çöØs…Gu§q®\²µ õ­¬1úùÅG˜Ì»çÙGo¾ãŽ»¿•¹Î{]_N¤ê0[ç³×@S‡³ç¹}(0ôžÿó¯Þûc×/..,¢«<¬¯Ùí·å× htî#oÜ ¡ÔÓ€ª…Spü¬Vë!Ú‡Ñêâ·–T…”0Êß[:s P/Ü8–j­åígÃÍõ“æé*7ú—³^ÅuX¦Å Àê<ë)DçTüb˜ +uxöki¬M¸õ25^‹SÿŠ50jñ¹HvuˆÊ„6&™ùòuƫūÀÐÒ»¿–ÍEžÕOMNŸfLÿàüüì'Ÿ¼åŽ;nuð(ŽI<{uC[Fï}y‘¡îô‹$²ÙÑ÷µ¡r¾â½ïÿÀݯþ±=?¿„@uÇ|SpK‚mu2îÇ ã4|ÒúcA’Q`Óìh8PŸ¬s² ê¤bT¨§—}ËŠ1ƒ:•YF¨Qìa8Ö]ò£&ÍÎñ‹Ó¨:µ‚‹ •ÖÀ IôZ'¦QzŽU*Úæ²œMz’°Lðð¯Ê§Q—Ô9‡öš¬tË®òö 9àè¼”Ž¸W_9£…/Çó>²[šaPO×þÉéÉÛž>:qç׿|oß fë1ú,~dÿ–Ñ[/i¨;ô’’ÜœÄÖ9‹?økºsÏ•W¾e‰o5!-“îìó”…A5ɤâÚ"êbð±nI¥ÆQh,ê´^íTýÖ¶*Ý,”Û®²p¶Ì â%^³óOÙÞùÚrꈖØßÀ#ÌÂ/¸vë}4Di*›çŠC'àr7êä•aJ7½]‚¼r ŒÀJ$ôDhAºú¢,l–xB‹D†¤ç»ò%iCà7ø:îÐÜÜÌ“só _™™™¹íàÁo~éàÁƒO¡úí-=÷mà ½õ0[ñ_ÞñsJã^& Þô¦ogå—FñÞÿ¡ÿ÷ê½{þ¡ø[>Íd +ëI€-pï¨ÀNF{AÌYk#3ËŸ­vm1(²4϶¨1~ ,J:AXRÊð %tHð?ütºK]ù&ß_øB„kM5´‡  ÊÚ£"Bhä•!íd5[ÿÐ\¤K·â7ÅÏ,€ü%×&±{\‚Ï I‚WpcÔ‹0 ¹ÏÏL/,,<<»°x×ä³Ówÿým÷ ²&9¡=Ýûz68ÈÙŠü°j ©Ä‹ü÷¥+ÿèÛ÷…|‰hQòd@rï{߯}üÊ+/ÿíññ1¿@“ÞóÃ}=€‚©Ä™›§Uޱ4+Š ¿f@¤h,é4ãæ:ãwá cK\F\J®­IÈ X£âÿâÒ"i£õ0 &Æ/®1p/$ nµÀ\ÆJB2yä7V"F.Óæ8áÈ(=qGÛèEXi¶žeÈÓ .!ºJ›Þ잉;œ§r]aðSË‹óóß\\^¼w†Å9|è¾C};íGŸqÓM7¶p¨Œ "®ÝŠÿj jôC¢½iÉ®w¿üËïùО={>qùå—½’J…æ•Q^Í2`Lß^%±W6?5¶VmæÇ^0¸žª¡i4†êþk/5Q§ŠÇ®48PkrLÛm†D70á;òÌ?8 hÀWhYÐ&Ûd$ß̾C™C´xÀ”üJR’2ÞÖ^+’ÌŠVÖÔËçЄWjé¤w :¤r`ð@ÈÉZŠ …HuÏ ¼†Tÿ<¿°xßÜÂì?9räAZrålØ(ÓÇu‡íe[÷¡­®½µ{ŽC×Ùs,ƹ`ïûytõ oø…×¼ý]Wÿ÷W]zé{w°q(½ìÖí7œDÍ›QjY½¥^³ Hã6×êL¤ëZ«ÛºUX@míuö2z ÿ‘ÉÅ……ù¼«àMluã8¤ˆ“Î#ñr4Á·‡{-j¡Ó(™Ê‰ï¡¬rí2„³òœÔ „M|†F™´#ËÞÂììÜÐÒââÑ¥ÅåG–î_˜ûÚ·ûÁo|õ«Cr0y§të‘thd«•·66_XÓ¼Í'ÛË!Ñ0-Ò¶O~2ó >pÃ¥¯¼äc—½òÒ7úˆpy)¦´Ã~c1&6¢™ØjÈv¹9›¥ÁU·™4aÒõ¯îv»$Q»(¸ŽãyU@ˆå­s|ËW˜] ØåÚYZ àÅlC¨†‘‘Ì2v" F§¡±#õ*®‹«8:ËåŽåøŸzò!Ý奕¡ù¹ù¡……ʼnՕåÇ—çž››ûƳSSÝsóÍßd÷Œc­Ÿþô§Gï¼óÎå\ý™«OïÚŸ"¯‡ÙŠožˆºnqÎ$.(AqÝÿ]eÝqã7~ðŠË¯øÈÅ—¼â­»wíÒLk=þiÎ;וþ0u‡[ˆоlÍt'i‚98§·¥§kMºôz>¤„N¢ÞP¤g¿:ÌpdØ À1æ'|>/\g«í¸ŽË•$ì &Q  Á+‘œ¸×Å6™ô´+AÆS ³33NØÀáü FÿèüÌüÁ•¹…‡>ùÐ}÷}áièlhÝ%Ü þСC§_Ää]«)n…—³šÚ¼œ,7-¯aº«£õü 1ñú_¼þŠ={~c×î]ïºøâ]¯Ý½kw Íye9+Ú\á ;fæuuŠ2ÄQ 8“‘±µù©y~SÇ&ýaò'úŽ©éÉÕãã#¾\K}ëV­ïiØ_Ǥcè’¬šu¾!aTwæRç¶–>C†eÞš[`V~a~n–ÅFßYY:ý8›e<Êý7Y_àK·ßýı™cGÏt—zwCjÂhã‹3Ao¥5PZu>HúòÉ8°`´ ÛKox÷»ß´çÇ_{-Ût_7Î~ƒc;Æ^µƒOŽ»‚0^ t²Îîu³DÍtœÖžÉBìU“͹:’ø'ãâ4À¥9× ÌÌΰ x|‘·GY„OqÈ ±ómžTà9|µÙ§—E» ê‹6ö˜Ç`±(½ã8§–––ž\\^~|qfùÑSÓÿ21qüÛòS  –Ö69iìO?ýt–Cn­±__3V|Ë<÷ýÙ·oÿÈ=÷ü>» פX½üòŸØ{Í»ÞöÓ—_¼ûg馿-‡~еWb¢—bà¯ä!ø6»ù.0Àh'i©8æùÈ)΋x‰SØû ÞPžÃˆO,--OàNòÚïäÂÂìâ’íúø|ý~† ­piÕé5TÏÂWhWè²3LÐØgÀ;AËþ çÃËË‹ßYYYzâÔÜì“ÓS³ßýÖW;üäño}ÙõFg ½e7³MÖéÞþŒD¶ÏËØrßÿ¶94°žl‚‡ˆ†g@ß½{÷ÅW]uUo9W{ì±àœH¯w΀º1içÞ½?ñ¡wßð±í¸ŠœŒNò0ð^Yxjqqî{33ó¬œ8zïÝw{Šã9G“gî´êÃlŒqZC¿új&éöïW¦ç-×F)·®Î÷Ør/ü3i8‚ñôº{Áϳ›1c„Òâ»V¤ÑHÿÍäyK‰Aë¨â¬DÚjÑŸwÕýHnP¼ÉX+´uñƒ¶„·XÕvÖúl­mçxV^²¢oQ­ÓøÕÏ|fäêu΢OÆÙ’K´Ñ?+ÝÎ|ë¼UÖÀ¿DÉ?ÿôdà3ÃéÐ@¤àÓ¥Úðùry@8>Ÿ±î.Õæ‡iuÃËùoi¼µµª»—i~Q««s6Ô@_(tò'hÌ? ž®jmˆLf¹* JLMk,‹¡‡Ãø.ÿpîÜ 0. ic8Ü1?1¡ÎÇã–ó¿$Rxâ›Vèãoiá¡íÛ†âñavllɾ÷JçwÏÂ^G!€T4J*]7;B\n2ëùæ„D€ @Éàzhvåîº €( ŠS`RÄ‚t/d´ãjPH˜k2H%è` ×R —M¦ U‚2¨ÈÕ ,ƒ®—Âî-ƒV$A)…×sBÈíRØ P6 (NE€™AN¥@!O_q"„Éý]¥r{”‹!§ê€„”Â2HØ÷0C~5æf 8v1$¥°Bk÷c¸®ÏRIà0 (úrÜž p3ŠyšŽùÙ\1Oß–ï K),Ë Üt/RØoGHnˆØ 8öEÉ™5ˆ û­ÅÚ>'³ÐŒªÞ^­¯-—ëLêÛ;ÐÝ ¿B¡M×Ó+õwZüÅ ‡`à…+W¾¯nn>\QSc¸о’ùýwŸ?jóž={kjÊB«0ã}ps©ÆÖ3gÞ}ôÀo´ª*Ë3±9 kÀþWàÇ•ÆL޾üxw÷¨âóÙ? >`ï쇯WëôÜÈHÖ˜˜ØÛÔÓWTÕ¾x ƒÔ §Ö:vÛÀÀmÚŸìëKEù¶BgÇà½B5;ö³P”7ŸˆDæìœ¢ ¼ú~‘e|ë‘#ƒþÆÆƒíí¢\ÿ2W” AÝi¸5›Íð÷ÇÐÐÙXoïÛà4è_À6Ó$„2>8Ø‹4i%³/A•(»BIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/edit-find.png0000644000175000017500000020614612412506713021036 0ustar sergiosergio‰PNG  IHDRôxÔú pHYs  šœ IDATxÚì½yŒ$Y~ß÷yqåYwUwU_3Ó==Ó³Ã%g$=< J”%º K´`ù€ÿaÙ²Mð X$È–dX2lÀ6)€%îò‚d‹EjeÃ’uËåì;Ó½s÷1}Ô™™q¾ç?"#+22"32ëèêî÷mdgTÄ‹/ŽŒß÷ýNÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐИ B_Ç@+³^  –yF»@°¼Ÿj«ô¥ÔÐÐИšh'Ú@h+À°<ø>¬Kƒmjðm¤öWƒý«™g´?ø< &ð¸Ÿ{ƒuŸ.ðpM4444Æ  €Æ<ÏÌyàð<° |± ¿Îá ¾þ˜Ÿ/ELn“„{Ào ÖÝn©o©††Æ³M4&¡M<›ÿbAÿeàp‘xöþ$??÷o¿ |}ð} M 444žh ‘Æ&ðâÙü¾‹xF¿ò œ{¢1È’‚›ÄÚ § š<ÛØ¾ðýEàu`õL<˜bú£©Ô‰›öpøUbóÁÄÄ « 'š<[HTú?üaàû8A_Fˆe¥Bˆ™ˆÀIƒ¾üsbBðw€H?ZO4xú±IlÃÿ#œ€J¿H`g×—ì³€YÖÏ»ÏÜ'6ü"ðÄ&M444žhðt"úÇ:ËŸ$Ô‹–§õq(#äóÚ”]W€.±và—Ðd@CCã €&OŽ]èç õY…þiü4Êìi‚~Q(I2ðà€õã©¡¡qÖ  À“-à?þUލÚÏ ô2Â>OÀŸ¤Ð?ªãß,¡ )(ÑßàŸ? ü‡ 4444+4x2‘žíq†½Ùo~Á VÁ_FàgÛÌ;SŸ§Í<(šù}—Ëï_~ŽØ‰PCCCã±A€' /ÿðCÌ©âϪò‹~ÑwvyÒºI(coŸÇ™ï¤1äƒt‰ý~ øutX¡††Æc€&gUà?|/q^ýÙnrް/ó}áŸ'‹–³ûý=éx“Ö—Ý>+òÆžwnSÈÀo? |•¸ž†††Æ©@€³‹-âÄ-ôϪ°Ÿù0§Ïäm“´$yŸh" ¡¡q¢Ðàñc.Á_fÖ>ícÆPà')u“Ù}†„a8üE*ì'Qè—¹®y×6¯MÙué”ÅED àZ&Dà>Ò? ã‚&«Àÿ9GüÙY}Z §góɲišcB?-ðÃ0 ü"¡ô´ ýy®yÞöiçiŠ|&rð!ð׉ó l럆†ÆQ¡ ÀãÁ%NÞóÅÒ7jŠú>êiážžå§"ôƒ ‚áL?Bpì9óŸžÌŒQe5i&9ø:ðWˆ3 ºú§¤¡¡1/48]¼üYàv©4e–Ÿ§ÊO¾eY#B? áŸØôgµã?ë$ }oÒ÷(½®hyR¶ÅäÚ¦‰@öþ¤ð÷ÿž8€†††ÆÌÐàtð2ð_蔺1%í÷é™"ôÁŸÌô}ßÇ÷}‚ (´éŸbIݧó‡T’ Lò1ÈF[” ;ÀÿNløPß Y  ÀÉ¢üIb;ÿ•R7¤¤ÓžišÃïDèÛv¬TR…¾ïû¥Uüe»&Óïaú^f×}g5Y´oF̯¢k hhh”„&'‡×‰íü¥’øÌ2ÓOfûŽã`Û6¦iUü¾ïãy¾ï9óW2Mføåønd·¥×9¦5D@—"þ ÄÙ5444&B€ãÇà'€hO½%Zè'‚ßqLÓÎö¡Áˆm–*všœà­¤V`R"&`„8 >þð¿»úÊkhhÁÔ—àXñ'Ÿ~?P™Ô°HØ'B>ý±,‹J¥B½^§ÑhP©TBày½^~¿çyCá?%ÁŒÆcÄ´û2©þA1ÌÙ§NœWâp ¸£¯º††F´àx°F\¥ïß¡„wÿ´Ù~Ú¾oÛ6•J…jµŠaH)q]×uGìû“ûfIâsšQBÄŽŠÂt¦SúÉÁŸž_y`Z¨gQ ?9Ž‚€?ü"ÐÓ?S 448:þ%࿾4õbOPõ'qúi5"øMÓ$Š¢¡à÷Qà!ý‘ßEEý3ã3Q¶¢cÖl”l—R>åøƒ<þ"qîí ¨¡ñŒC€Ùñ'ˆUþ›/lAnþ´s_Zð7 ªÕ*B\×¥×ë8öUá›D&}'%rD‚›•ìæ¦]C¦]öñyÆB=>Ç€B ¥¿H%ÇÈyäÔè‡C¬SÃñ¥÷Q‡Ä`ð­”üw-âõb0(¢€ÀëyÝXK>~syÙ2Íi RZ¤zN×vHá«ÀŸ音†Æ³ MÊcXå?ÕÑoš‡¿aX–5œñ7 ÃÀó<úý>ý~L•[ö³š$J*„³ºH¥¹ŒaWQÂݪ`˜C,ŒD %ç‰H y12‡;~ÒN±€OìÿÂ! %éñFñ²ŒH| uÎö ×?C‚ ‡ŒB 0C ´¡Gè÷ˆÜBoû±š Šj@À(¹L?[im@Ü߀ßþ[âÜÏ 4(‡ëÀÿ |ïÔ š±õggü¦iR©ThµZ´Z-Ç! Ãa8_:eïqÿ| c¡)Àª,b7–°kíXà c8K7FzÆy(\Ò3y5œ‰«Ãõó€0„iƒa|ÌXø 0íQL™‰gà@I¡¤D†(… b•¾ ½x”C AÜ)-~3ÐÀ`(‰’*ôz»„î6J†ç‡Z¢TV®áy^žoÀ6ðo¿¬âÏ4˜Žþ"™Ý˜†@ÆP•ŸuâCñÌÝ0N„‰°FìÒ ¤Õð‰ŽûËsúSÓ×ÄÁ en 4Gñ±dWFÈÀE}"¿ ýá¶Ñó’1aP À@a 2D}Âþa)ƒÓý±N Ó A¥FeL€Ÿ<ãºÌ°†Æ3M&ãß'vö›¨^䘕~Ó4©×ë´Z-Úí6¶mÝnw,žRøy4jàøf×W°ë‹XÕXèÇ¡x±:ߎ9¨‰ÀW(¤J Àtbao˜³‚°ìx½0@É”ŠH9îÊk  Á!D×08”eˆSˆ!„7ézGR5ÊQ #’jABUJÕŠ–;RjI),U% ›+Œ˜˜ bm€ŒPQ@¸H¿Oô‘~o Hk ä@; ‡¦K(„ ¼}üƒ‡DþÁéþh'hÒä3yþ߀Ä$ÍŒIà+Äæ­ý³×Ðx6  @>ÄéTÿ ìýyñÙy³þV«Åââ"F€n·;6ë/#øËˆmãR†€ÀÌö«­„i#˜†À2ÓÞã©|Òör |»ŽpjñãbÚ€1T“ØÕzÝï çÆ¦!vS|b¢kâÀ6mÓž!„/%R)%„J)5Óó(bj1t>}ÂH¶” "¹à‡òœTªHµDj3RjE*Z110Q ±¶ ò{±ÙÀïºûÈÐ\‡ JL'ÄdÀ`¨"¿¿KpðàÔ´Ó´Ùg1ë ˜­1Àßþt¾ gšŒã9à¯?:ñÂØ_ÁoYÕj•ÅÅEqÏó&ÎúóüLZ!#«º„ÝXƪ¶1í*†abš¦a`š†0Pp(ô¥B*‰ReÚ ,0m„]ÓaÂ9vg vL!¶M!î×ãMCˆ^Í1?2„ð-Óè2œH+A, 8§:Ǫ˜(!•²ÃH¶üP®DRµ"©Ú^$·üH=J6•a !L0 T"#x½GD~‡¦kPC€-B„ÞÞ)jò´y>(És™´KH@â":_€†Æ3MFñ:qˆß'^´)¶~ÇqhµZ,--Ñn·BÐëõèõz¸®›ëä7L$2B)‰YYÀªv¨4—1í*¦!†‚ß0bç¾DàGC¡ʰÁ®¾ÏüS&„ C°S1wÓøÐ4ÄN½b½gâ@"!D¤”2ô ÷ÇÁDÎýS‡ý B)›®÷C¹éEòB©Í±a¶„iÅŽ…‘Oäv zÛ±¦ 9Œ0ÃD¶&!Òïãuá÷N>Ò®Œs`R2:í (¥Äó<\×’Ñÿ6:B@C㩆&‡ø½ÀßÎO¼`)Á?iÖ¿¼¼L½^' CF<ü³}’ðŸ¤QGÒÙM*­5*% ÃÂ2 ,3B ¥"”*%øU,ô­صx–HyÄÇòÑjÇø7ËØ…=LÓSå÷ã̾#2÷u`ÇB)eû¡\èzáË~$/xÏ…ˆM ;nÅ3ý »Mäîú ( *Šm,!QaŸþÞ‚þé¼O𤦵‰s`ò|j ¡ñì@€? ü$%’ûdãúÓ/Ôz½ÎÊÊ +++T*z½ÞˆÊ?=ëŸ&ü'šdl·5œµÎyìj Ó´°,shÛW "©#E$å@ðƒ2,pš§9pöËú5ÛüFžÀO_U^ð?)|³ 'æ!#ÙèûÑV× ?ïI.‡Ê¸  ËQ€ \BwŸàà!Qà Í–PØB¡Â>îþ‚þö‰fœdHžYÛ¶GçÀ¤ªdEIwšhh<ÅÐ öôÿ¯Å‹Tà\eÛöð»Óé°¶¶ÆÒÒB888‰¿žGø.Ǫ~ÃNËrplk0£‹¤"ˆ$a$‰"E¤$JØ`UQV eØCÁŸØó „¾L ýq‰ž+ÃNÙÈj¿ !„@´Vß¶z~t­Ê/˜1l¤ ûû½ƒ¸` E‹"@kNÒ40)B K,˶MH€ëºiç@M44žR<ëà? öö¯^ ‚ðªäS«ÕXZZb}}v»= ïëv»ÃÙT‘à/M¤DÊÃná4V©6—°mÛ¶°­Xð‡‘Ä "‚PI;ö e7N…1°ùÇé~ ÁŽcŠwë¶ùZI¡$©ö³+"ðOƒ,ˆ#î$*„(!„ #Ù>ˆ‚Ï‘‡5ÞQÖ]À”c›Ûͪõ¦c¨w‰Â@*±nV;¶ÝXB˜V¬ @!R! ›F³ƒS­xýaÕÃc½&©g3½œ&éÂUšhh<½x–@i៶÷;Ž3ŒïߨØàòåˬ®®"¥±÷•Û-‡8™Œ][¦¹t‘Îâ:Íf“jµ‚‚¾ë³ßóè»~a£* H»I”þ83_"øÿn³j½+ÉTrš}VÓ}é,Sã/-OƒND!¦œ”ÈYŽen7«ö›C½+¢0ˆ„¹nÕ:¶]_@}‚HB ŽS¥Vo!€Àïÿ‰” ÙÖIÎM44ž<+`fáoÛöpæ_«ÕØÚÚâÊ•+,--áû>Ýn—~¿Ÿ¶ŽôUJI&µö•-ÚxÖoZž°ßuéº>ž*i5P•6RXHç®1wªÖW‡‚_x •Ìö‹à¹©ï2³q1ç±&ôyœ|@LèMN€‡D@¾+ð" sݬ/¦]E…R†(¾aX4-LË! úƒ'ƒtÈ`ÚDÖ$Ys4·€·õ«TCãÉó@fþ†aŒØû›››CáŸÎçó~IRÈšv“Öòe–Öi6T*a±ßísÐuéûA¨fYé™RÆû‚íVÅü;ËÊ/6Fÿfüc›OÄ™OLϬ³xq"M'ö0¡!rÎE“áXæ£FÕ|ÃF~(£°S_±Ëvù¨("RH¨Vë4mÂÀ?ÖH,IÍ#­yÙ.tÚàð%à«À¾~jh•‘ì§µbÖ"¿?4 8v…z£‰çv HgÒ‰‚n“€¿ œìÀ444ŽO#x ø[ÀÅ¢Ófþ‰ðo·ÛÃŒhžç¥+¥ôUtŒ!”aRïœcqõ" ‹‹ÔjU‚0äÑö.Û»ûô\?i5‰ìfìð§$Bpа¯-7+ÿG£jÝÄ@ÝÅBvNÁ¯æïiÆÖóÛ÷ÕÈ–Î7 fxΔ¿€Œù M¢êX÷ê¶ñ¶áA„yÙl,Ûô‘2†aÑi/â8ú½½ÿAe£²éƒ“ÄWÀËÀ[À7Ÿ½W©†Æ“‡§¬? ¼ZÔ ]5qøËªý¯_¿>´ù ÿIêþÑÐ*‰0ZKXZݤÝncÛ6½^Ÿû¶ÙÙëâú!6Òi¡h qs©áüL§áücÓý³þã™ñφ#EåPâ=Í=Ô)ú Œ!Ïs`5 Ã0„ߨX·,äE-*­«¾Dä÷Q@ JÔkuLËÂ=&˜ È&ÇJ"šü:2@Cã‰ÀÓDjÀ_~´¨A¶¢_:ÉO³ÙäÒ¥Kܸqƒååe\×ô‘R–íË Ón°°v…å• š ØÙÙãÞýGìôñIdÖ‰¬2Raµßª˜¿²Ü¬ürÕ1ï†Rˆ EwN[ð¹q ‡,OG$ ¢ÌÀÅôìÂ"¯71N`TmënÍ6¾¥¢Ð”†½a6WlÃr⪃JEP«Ö¨7„¾Kt &²9Òæ€„ ud€†Æ‚§‰üðmœ$ükµ.\àÕW_euuu(ü'Ùü³}g¡”Ä©-²´ñKK«Ôj5<ßçþƒG|öp‡ƒ¾‹/ÒnUBÛ[mS¼·Tw~®S¯ü–0ðQI¾ÀœCŸÁ?£|G<ìxa/Þp_‘ékfB ¦ÿÉ‹ýˆqÞ¥À0 á5«ö[¦Œ¶#©.Qmד@…„JP¯Öh·;¸½ýc#é™ÿá3]L„„a˜¤ÂN"~í¨¡qfñ´€þÚ¤óÉÆù'¿R©péÒ%>÷¹ÏqîܹáŸVûÏ’Ü•Æ +ëWX\\¦â8t{}îܻσí=ú®OˆEd·°G¿ á¿¹Ü¬þíªcÝV(…PG›õ«YÆ|¤>ŽFf=(gœŸTš`ÆÌSÔ ùSÿÜÃæI{1¾j¤£êXŸÖ-ã›2Š–¨´×­Æ2¡w@úx¡Â6-Z­6^ÿàXH@Ñ3Ÿ Lk ®$EÄ‘À/?¯R 'OxøŸ)î—ùW*.^¼È«¯¾ÊÖÖAÐëõ&†úM…RÔÚçXÛ¸ÂÂâ"¦i²³·Ç§wî±½»ë‡DF•Èjâ+#6 <ü•h".Ö£âÁyG(3Šc¸®³õQ*sÏpö}¤<¢ÔÚi‘‡bžƒ‰’ãS¶dE比M@$>†mݪmÜ" Mi8ë¢Ú¶e.^$±­ è ÈþŽF^ƒÐÀtŽ¥Ô°6p•8U°öÐÐ8ƒxÒ Àð7ëE ²qÌŽã ?[[[¼úê«\¼x¥Ýn—^¯WèퟄD%ßi(% Þ9ÇÚÆeÚJ)½óû=¼H¡ì>N\ù Ômã7—›Õ¯:¶ñP)LŽ&ügÜêˆûç]ðI}©œfGMÄ7}mqÃ)}Á 1ÿEíŠ @¯Hs#‘¯,ˆGVs¬Û&ò‘”rEU:m “ ·‹%æ€V1à¿ >ýûÈúdIÀÀà:I†Æ™Ã“Lþ$ðç‹Î!ëô—þKKK¼òÊ+¼üòËT*•¡ðÃr3¦±0?aÒ^¾ÄÚúÍžçqûö]nß½ÏAÏ%i5ñ•E(j¿U±~a©Yù5ÓžKÑÓ IDAT”¨ýÓ‡:FÁ?‡ÖǦU/vú›Z‡§ô  ³øŽÒ˜ $ DÆ ¢S¤¨‹Qµ­; Ûx3Š¢Uå´Ö¥0û{x¡Ä²l:í6nÿ€(œ¿fEöyÏF¤IvB,ËÀ÷ýä7u¸ ü³g÷U«¡qöð¤€×ÿ…8y.²3“J¥2Œõ¿~ý:Ÿÿüçét:Cµÿ\…}3ÿÎêeÖÎ]¤QoÐëõøä“ÛÜùìÝžK MB3¶÷GRa uw©áüt»îüÖ —ø}^RøgªéEøuÆ?Õ5?ÝT6M æØRº½(r^’Çòýç§ýÉW Û¶I[’c‹ä¦i¸5Û¸¥¢hU9Íu£ÒD†>ý~Ë0iµ[xý.QttPT@( @J™öø=À¿Þ_´gO"˜ÉîŸÛ¶©×ë\»vïú®ïbuuu˜ß?¯¤oÒO’™g%þµZƒƒ>üècîÜ{@¯ïbšM<)Jââí•Võ§j냑â= ‰“ö¼Ò¹éÜ‚Ã12Môke¿ÉûÏU’ï8À<¦„  m­Èo&fè?Ï«¿hQdÚ€œ¨Ã4 ¯æ·T$×pZkf}‘ÀÝÇuû8–C§3ˆ8¢&`Òo#h¢(Â÷}¤”µÁo÷ïÇWÖPCCcn<‰ ´Ý?ñøw‡Z­ÆÅ‹yíµ×¸páaý”‰õÁpæ…õ‹Ôê5öööøàƒ¸sïݾGˆCdÖq£˜,Ô-ã.·ª?ïXæÃð„÷ÿY(:òœ×ìdÿðâ—ïpV0!z_e$÷|Þ}EÌ¢t|_agbz’€Ûf¡ÓÁs»„ÇH²ÈjÒQ¾ï¼ÜþéÓûJÕÐxrð¤€?üEb›ùÒi~»¢úßÜÜäµ×^ãÚµkôz=úýþLYþ ±{tV.³~þµzÝÝ]ÞÿàCnßgþ¡QÃâä>5ËøÚr«úK¦!zC{?«ðsîw”cæb† 1l Êöž«)¸å…ô¤1¹ªÓl …a¹‹y¾iƒ€È!€0 4*Öû¦ŠvCìkÔ-ßݧßïQ±bøÇòcÌ3 ¤ý‡À(Šð¢äq'MðÅTK‚(ò-8ÜUŒzd @b@€Quì»6r7ľ*j‹–×Û¦çzÔ+­fƒí‡ŸÜK%• m Ãß÷QJ½Dœè§÷Õª¡qöñ¤€þ&„ü¥gÿ•JÇq¨V«\¹r…/}éK\¾|™0 988:ýͪúotÎsnë*ÍV‹ýý}Þ»y‹>¹Ûü…ƒ/jx¡B „ÿB£òçFõCñ?ápó^(1˾bþcM$¢€€äî_¼¦Ü~óî"˜ð7;ï8Ç“ì–Ü=FŸî‚^ó@ڋШ9ö]KÈÝ@šW}©,¿»‹ç‡Ô›ZµÊÁþαü8ÓÑÉwVŽ ‚@¯¿œ|=c \< àð3ÀrQƒl²Ÿ„lllð¥/}‰—_~`ªÓ_!P2¢ÚZåÜ…i·;ôºܼy“÷?ø˜ƒnŸ›@Äj¥ätáOôW UNËÑ//3ÏLȵá9ÁÞ±Õš°«!`ùûÔc1×ñÄ0ÆòÇ9î˜î5í0x|Å¡¦I£æØwmƒÝШ½ä# ··K)Ú4uvwÍQs:7@Ú!Ðq”RAÔÙX Nßý+ÏÜ[WCãŒàI ø}EÓªÿ´Ý¿ÓéðùÏž/|á Ôj5úýþXŸI}ÓþÊ»¶À¹­YX\Âí÷¹yó&ïÝú€ýnghóWrá?ùäc¾ùæ[Ü»ÿ(®äg5èŠHJŽõ ‹ÍÊ?š[øR|1T !.ò»ž=–ôï±ñ‹‰C³jT™¦bÒu=2>yÇ›Vg8×qO{IŠ —)PföŸ=¦8\"•Ç@˜¦á×+Ö‡(±ØÍU··O¿×£^u¨×jGòÈþž’Á¤µs 0 ƒ ð<ß÷‡À_D;jhœ*Î*¸ü$±“ÐÒ ÒªÿV«ÅóÏ?Ï÷~ï÷²¹¹‰ëºôz½$ùÄYÿá6…’ŠÆÂyÎ_¼JµZãÞ½»¼ñÆ7ùøö]¼ BYuú‘ET,ãk‹Íʯ A4ƒðŸÙaOPn÷Œ\˜·´¯š­yΚr€y+÷¨™‡42´ŒKÀб"k>ëK•:ÞˆüÏçBLòº(ò£†ÿÌn¹ Õ‡"&AݱîIa߬f¥»w†¬-/b°¿¿{,?ଠ­¥³m{˜!0åèÿàÙzýjh<^œU0Ññ//áã8¬­­ñ}ß÷}ܸq¥½^oLõSÔÿJÆN_¢Ý^àᣇ¼ñÆ|ûƒèõ= §A?4pÈŠeüÃåfõ— Cx9ÚÓ"a1¿·~‰ÝÓ‚UÌ{Œ½ '€B?…#„ó©ÚR<4q˜]ø0ÏΜþ†W¶þÂãùAçG2‡¡?€Hû ®a[V¿b‰^¤Ìçz¡´ºû0‘,tÚønÏ›¯jozæŸ5 ¤³V«Õ-€çy/¿ŠÎ¨¡qj8‹àû™Ãñ¯Õjñ¹Ï}Žïùžï¡ÙlÒëõc®ÀÏ' a:¬m^gyuƒn÷€·Þ|“w¾u“ýn¬ýÈ¢HLÁÛËÍêÏ›¦Ñͱæ íyfãjž¶³ þ³û ‰õòÕù‚ é+‹IЉt^&qè²§Ô=J®ÑÉáìÒe("…³ÿŒR#K‡šq¢ Ï*¶¹™Ík^¤Œý‡´UõO’ lD@â „éJ)q]—n·‹”²Ô_~ÆÞÁ g‘üUàóE³ŽÉËä¹çžãõ×_çùçŸÇ÷ãr¨a¦,Íû[)X\žó—‘2â½÷Þåo¾Å£]$üPw—›•Ÿr,ó!J•QO‹ð%Û¥ÛÎ^# œû[F2Í|~‘¨¢¶*÷©(,!DÎ¥]ÓýÒbÂ,¤Ï<¢ R{ €8ìͨ9ö¶X÷¤¹º°ƒß벴ЦÓiñèáýù.zC`Ú\W©T†5:3€ëº/ÿ:,PCãTpÖÀþ3&ûÉsü[[[ãË_þ2¯½öŽãÐëõµâD^§dD½³Áù‹/âT*|üч|ýw¾Á{÷ ¥@Yu|IÉý…ºóÓõ¸¤¯˜®ŸW'5ó/í(fÞWLëdöÄâ#œƈ™(‘–@LW( Œ$s€¼qæQ˜ ×p°)µ§8 <ìÉ0 U¯ÚŸ Ã^ ÌæòîÎgˆ(by±M¿€{„üÉHÒŸ¬ÉÎq\×åàà€(Šlb-ÀWžæ—®†ÆYq†ÆRþ-ÀÊÛ˜¼DÒ¶˲h6›\¹r…ïøŽï Ýn§KbÆˆÉ ÝÇè:pª-Îm]£ÙlóèáÞzë-nß¹‡Dv®/ #4+Ö¯4«ö;%„¿*-üÕð£8&á_ÐH•sðS3mœ…ᜂà/Bjæ>TÑž¢o¥2?N½BÙÊ@ãÛÆÝ3Ï•B)…a¨Ýµvõ¯/tÜÚÒtºýˆsŽvÁU\ SJ‰”’ †É¸<Ï#LÓ¤Ýn³´´ÄÂÂB²ë¿ üÐÓ÷ªÕÐ8{8K€?üDÑÆ¼b?Žã°¾¾Î÷ÿ÷sãFœ. ×ëå&ü™¨þ+ç^du}‹^ï€7Þø]Þ|ëöº= »J74éù!ËøÅfõ×r†7k‘ŸlËY*þÍå¡?Ï´v¸§˜ž{`VÁ.æÊäëQäºxhè/îddÒ\âþŽ´Ë8Úå·‰€˜v9Rsý¢Y~6?ðD3ÁÈÌ_¤LBÄCBŽcw+¶åGFõêÞÁ.noŸÕÅ6¶e²·;_½€´ý?N×]©TF|É´@CãpVÀ*ð?çó6¦UˆI¾Çqh6›¼òÊ+¼þúë,,, m‰iÇ¿i$@ɈæÂ9Î_¼†! Þ»ù.¿ýÛ_çþÃm”°©°ï…XBüó¥Võ«Bˆ€ÑÙðŸZT¯hÿr{MZ›Qב€‚ô”䟕Εاt[5G·ÙH‡‰C“<5R tJŽkôr€Ã†¹)òú%yN…ùÂŒ*dr瀘٠!ÌzÅÙ7„±ÒWÎòö£Ï°TÄòR‡ƒýÝÜHš©÷8§NÄZ¹´ïN­VÃ0Œ¡/@¯×¸‚öÐÐ8qœÀ_˜8ÐŒóŸišlllðÚk¯±±±‘.5:¢úϪüGÕÿàÔÚ¬o]£^oðÙý{¼õÖ[|vÿ!R „Yeß QRÝíÔ¿c á–þ¥ 8áŸ×N¥Œ ³¤`Lêõ t^jÚU‰~&3ƒÂV¥ÎXLaG9"¿xœ†*ŠƒrÖf…¹TÆJI…a •ì®vjÿhkeù ¶¼Å½= 2ؼpy¾›:°~¥MQáy®ë³sJ)i6›,..Òn·¿€ðï>Í/^ ³€³@V¯hcZ'ê˲¨Õj¼üòË\¿~˲‚€(Š …}.0mVÏ]eiin÷€wÞy›>ü×0¾Ä£ Yµ~¥â˜wÕ¨ÇÿQÔþGÊ0!Gî¨^!G:È»d!ŸLQåOú”½fj®k\<È2„CÍÑ·˜ñÚLj+ÄxÆ¢i}fÚå…‘{00Ÿ¨HFa¡iˆK­²¹qÈiqo»K{a™sç6çþqg}Â0¤ßïÃtƒ fð\\\¤Óé$»þ>&DihhgLœý9ÿ]¹r…W_}•ÕÕÕáìÈýg“Ù³³ÁÚ¹K€âýoßâw¾ÅÞ~Û©âE=?¢j›_kÕœßQ**6·ðŸgÖ?Kß×ËçÉ0í0ÇæÈ8©Ï2ãÍ=×ÉiT‰ã‹iÇÏÏÇ8Á•B”,X?wú¢ÔÃ( ‚ 5û­Õå÷WϽÀv_²·ï±q~>‡À<-@†Ãâ\‰C`E4›MVVVh·ÛIÑ &ðãOÏ«VCãìáq€±ó_.ò‰˜¦ÉÂÂ/¿ü2W¯^Å0 <ÏCJ9Qø’°œ:ë›W©×<¸ÿo½õ&÷>{»ÉÜõÞBÝù5udø)šTaoã[ÆåÎŒg:œIr’†‚9 ¦]ÏINeî[äÍ9nñ`Lö‹œpÂÂQæµÌúä3û HaàË(ê®tjÿüÂúºg¶Ö¸óèÓªrùÊóó?ø Ã˲XXX`ee%­ø7€ïxš_À›üqà÷Ojõþ·m›ÍÍM^yå–——‰¢hÄë’Ý?½}qõ2KËk¸nŸwßûßþà#÷¹Ï ãþ³³ÿ" Àp›i³¼q…z£Éñãßý0 ‹HYì÷lÓøÇõŠõmu˜4÷±ÿŒ$,'¤ÄÌǧ ³ïIþIç0—ÓãÔŒKe³êNÇ¡°Îg%îO~eßÌߥG9e¶?F˜µ'bŠÝB¤’2|7 Cwu¡ùÆ•­K~PYàánÎÂrbŸŸíæfÿ0Jz½Þ0$0qìt:,//§Ó'ð¹§þm¬¡qÊx\àO+EÓÂ?™ý7 nܸÁ‹/¾ˆ‚ Æfÿ“4B(𠬬m>7o¾Ç·¿ýžP©ÖÙëDRÞéÔß$5éŸ^ì'»Y‹ðOw8²w½ÆvŸ[!?fw>"(ŒecûUA³§œ?ï¦ït4ètâ’Î1LÁl_L¾VÉbÊŨca&° S?0ÏitäžaxžïÛ–q÷ÂÆò·Ï¯oqg§O(×_š_ 5$•;_€V«5Ì 0p<´ˆ …ihh#¸üGEóœÿ„¬®®rãÆ VWW‡¶ÿtû"3À0ìϪ±²ñ<ժɽ»wxóÍoòp{‡z½Ž¾Pw¬¿çXÆ#U(ÿ'A=f¿D›ijsÈþ“rì›F–fÍ Ž0ŽÉ‘ÿ¹msv™žP(kž+/uü+YâyaciÿD~òáLaQ¤0€RJù¾çz¾ï-uo=ùJßw:<Øé²°¸‚eYóÝŒ!µZÅÅE–——iµZÉ®ÚPCã˜ñ8ÀPböŸ€Ä°¹¹É•+W¨T*„a8’õ/¤×4:k,­¬âöC¾õÎÛ¼ÿþ‡ñ‹HXìt} øVÍþº< ŽSågÿ3& ˜žWjyÒSÌnxÎ}YkE‰~g–åGþL/e”›71[BALÑ/Y$r¢úä;Zôøå$Ê/Ë$ÆÚ1Q“ö @Fçyž@=º°±úñåÍKÜÙŽµóäÈ ‚`Ä ]%paa!à"ðÃÏÀ;YCãÔð8ÀÄпä;íü·¸¸Èõë×¹p!ÎH–dý+øYm€eWYÞ¸‚ãÀíÛŸðæ[ßd{wÇ©à‡‚ž4«öß7 á ´ÿ³Øý;Á*Ü+'º\:ëebżǟå<ÔÑ/ÉñA”9O1ÒDû:øï‰i×`ìäÏþ3à°tÊÝ£ôyfËŠÑÙ}¦2PÖà ¤l²¬Jù¾ïz¾ïuÚw^¸ü¼ë;¶w{,/¯íJ…&…€²Î€ív›V«•døƒÏôÛZCã˜qÚ`‹)Îé¢?¦iR«ÕX__çÆt:aÎÿ¬°/$(í5––qûðÞ»ßâ£?Å4 l§Æö‡aˆß­WŽ9ïªì qøQ¢\>ãT±«á¿Ùpœ‚¿dÓ£t7Ó%Ë·Éw1!ïBú.,f¢ûŠX™È›Ž‹ÜÙxþYœôhÕßÁ1"곇ÎR¬Àh"¢±çIakPr{ëÜÚ'Ï_âö£ ËasköÁÙ@¥ÔÐ àº.¾ï•J…v»=ŒàG€Wõk[CãxpÚ`fõ£Ñàå—_æ¹çž¾,Òm§ôY\½ˆS»woóηÞfwoÃtÀ0Bítjί2=ûOësEæÃp[¹xýáÿÓïùá}"{Ì̤³À×ïÈ#̺+=²o¦ƒ£¼Ä5ýôÝ2¢Wä&üa‚“Ǹ2'oÌpôÒcRGì¢LàìC>‰DDåòýäLÿEîbîMSùvˆÜ‘¤µÙÂ9³ûôßyÒÿpö?¥–P†çz.¨íË[çïnœ¿ÈÝGûÔjMç¸2΀®ëÒív‡f€F£ÁÒÒ I™`€?ÂéçÒÐx*qšà0¡ê06û¯T*lllpùòe,Ë" Ñп©Ã`ae‹JîÝ}ÈÛo¿Åöδè{^m/4*‡a£n\ª¤‡vQ›ãþó`Þº%¦ëÙŠ¾ÇDŸ½ð¨(£|O5.ðúŸp²"AÌ?Ø1/Ò†"Õñ¹§–“ 1t¨lêk¥”ô|¿ïyž·´Ðþèúó/ȇû^ ¸téÊì78'3`B\×¥×ëáû>Õjuè˜2|xå)~'khœN“üè¤yêÿz½ÎK/½Ä¹sçJ«ÿ?àTÛ,.u|¸uë=ÞÿàC,ËÄqª<Øëc›Æ¯Û–±ußGþe[OT­˜Ê ’y¥ñœR¶´¯ä¤ÂE‚uZ(ÜIù4ˆ¯gŽê=[ÏO©ÉŸ‘ÞÆ2÷‰¬º_LûbüD{W ˆüGrd`Ažç¹†!^¾tñauyƒ‡;,.­R9œÏvñ3f€¼h€$5pŠ4ïׯn £ã´ÀD翼ԿBˆaÞÿN§3 ý+cûÓþ מ£Þ„G<Þ}÷¶·w©U«ø¡¢ëÛÍšý[ɧÌûªpü3µN¶ªRIùÅѽéæ>¯9ûÊîó;ë0±¬.ÓoP ‡˜cÒ.ÆBíSC,ŸbxLeïP8å:fŸOW©¥ÔàÇH©”2r=¯ïû^meéÓWž¿ÊÇz¡<²/@º@P:@)5¬ØétÒf€?Š6hh§E~’Ή÷½^çÊ•+\ºt !a㈧Íþ,§ÆâòJÁG¾Ï·¿ý>aD‚‡{}lSüºm;9–ò"#õôU¥Úì)ö§è”)AŽše$Sú:Ò¸f†(¾³õ¥¦žg6Æ?¿•û/çйÞý¹ê~QÞ_¥ p‰å ñ}ßs]Ï­VìÏ^xÈj³wàr~skö‡oŠ )T­V‡á€Íf3Ùý°ñô½Ž54N§E~lZƒ´ú_A»ÝæêÕ«œ;wn,ó_ò=Éù¯Þ^¥Ù†ý½8ôïsžB„ IDAT³ûYYê 1éyÁN³æü‹œÙI់™ïæO€s“Ä ûÉñ ó)—uRÇW¢XL¸Ê£ý«¼'—W:5Ó¸„Y'¾´çÞørz³h¥FÓ‹Që~&ÉQÍXE¡ëºý0º[ç7î]¹x‰ÏíS­5¨V+óÝÑ ˆ¢h¤B çy˜¦I§ÓaaaV«•\ísè¤@GÆi€™Ôÿ XZZâ…^ V« ÕÿéöÙ}Óë‚Åå-,núïݼ‰çy8N•‡{}ÂH½e›ÆÞá[¨øýTò'U›¥Ÿ¤í”D6si?g”¹MÓYþNYð_Ê‚4¶G[NN~•cÌÉ Xt;Ê¥Xy¡"³\øPM¹0ÙÚˆ& µ<Á ±-(¥<ßs]Ïó:­Ægמ»ÞÛ BÅåËÏ3/Òf€Dð'ù”R4›M–——i·ÛéT ¯=­/e ÓÂi€b‚úÈMý{ùòe677 ÿò×)*Õ6E wàü÷éíÛ ]7¤ç;ºó«¤*ïtV~Ó|(%¸Ä|ƒ()Å÷?=¤…ÿ|åóú,ÙÓh~ ‘ÉÑ0òQ‡N~Ù*Q&ù¬& ›;0·.”*¼bj„ßô'@þNƒ ô]×í A÷¹K¨·Ù=èÓY8Z8`Ú àyÞ°8P†T*•¡3`*+àwµ'ï•«¡qvpà‹“6f½ÿ àÙlrñâE‡ÂJ©‘DjE$Õç¨9°ýPñí[7ÙÛïâ8öº>Rªw+Žy/–…±ò3—¦=Áí9­ô¸Ž#Й‚8±.grb¦›ÿËør¤TÿcËYF’çü¨Š®‹˜4þ4)ÈÌþS#ˆǗRJ×õz¾ï÷××Ö>{ù…k<Ø> ÞhQ«Í&Ó%‚ÓZ€Ä ßïãû>Žã k,--%»:PCãH8 °Y´!«þOìÿëëë\½z•f³IECïÿô>ùË`Z:K ðɧóÁ‡R«Øt:mözŽe|C€}¿¾—¦¼¶rÿ˜ÓF?ò6ŸòÉæŸ=Iœ9Á„ó8JúâQ%Ñx-ÝTÿ‰¡Ž¤¦ó"«úOGäÕ3ñÔTóF1 ,þ"§F`ÁµSžç¹ý~ßmÔ«»/]½Ü{Ðëû,-¯Ìw“rœS@ÃIAâ hFòîú=OýZCãqÒ` øÞI ² ÙlrîÜ9¶¶¶0 chLÚ¦÷Kï?x“Pm.Ól@σ÷oÝä³ûh·›ô½ˆ®÷^ͱÞQ #æj˜s(§ÊP†´gòb”ZäÕãÁÃóL=!*õ¨€’RºžÛw=Ï][YÞýÜ¥-î`ZGK”Õø¾çyDQD­V£ÝnÓn·©V«É®×€¥gòÍ­¡q 8iPºôo¢þo6›\¾|™v»=œí—|'˦U¥½`ü}ò ÇÂõ%ßÛÙ±Mã¦Rʤ܋4ýŠbRûcH˜ûOLn“Ó¼”*áã8Ö ˆ“Cþf8í™Î–?rzùD%'Æ_¨þÇIGÂú27%Õã´xÂÔl>K8 33þL³,³EØó|Ïu]·V«î_}þùðö¶OµÖ`kÆ JÔB)5,”68ŽC§Ó¡ÙlÒh4’!®WÐÐИ 'IÎ1¥ôo6{Ÿa,//sîÜ9LÓæþO·Og^%TêKÔ+Ð âä?íШ×ÙëztÝàÝZÅÚ!֧羋 ^Q·«ùVM+ü2 fõò?©Yõ‰©D©óVÇÙ÷á&Qæ´3ûWäÉíd„4ÄC’ŒÉÃ#¤"3ûc^}9yDa°¡¹°#% ƒ0 ú®ÛÕ»|ébY¡ïú4›íù¢L>€0 ‡Ïó0 ƒV«ÅÒÒõz=ÙÍD—ÖИ'Iš@}Rƒlü¿mÛ¬¯¯³²²‚a¹ÞÿÙýÓßÎ:°ý>úðC<ßÇ©TØÞëa›Æ7Mè2Kù¹ÙÓñúhç÷%f;ÖøñÊïsTœ\EãQ³î3é霡½Ê½áSrR~´5âT8æï'FU#êý”¢Œd<ý{]N»$Ž­'s•”‘Ûï÷<×sÏ­¯÷/½p…ݽ.ÍÖ| ¹*Y?€DP­Vi6›,,,¤wûÎ'ù¬¡ñ8q’à»™@²åOß –––†áe! ›fÛBwîÜæÓÛ·ql © özÞNÕ1o*U6µ~‚2šWFÛ䊊¹òÖO:Öœ&‚#ëÄO]à‹Ÿ˜½R…> £nü)i›Vº«ŒKz¦?¥ˆT®ÏÚûS6ý ê²ÉY€EvЙA ®ç»½~¿ßj6^|þyyo»G«Ý¡^›?‰ðO£(¢R©P¯×©V«8Ž“¼^f; ††pr Í”TÙð?Ë²ØØØàüùóCõÿ$}T›+TÝøðÃðõG«8o”à”B¯s ·™eø™úGÐWÌ:ö<§Â‰ã;t°Ï ÿ±]TÞ,$K`®ÊDœçØû³ªÿ±J]`‘yüÆ\TúYè’"E®ëõ‚0p7ÏŸ÷Y^Äu}ÚíÎü7. àº.aµ¶mS¯×i6›i?í¨¡1'NŠ´˜bÿ_4‡fÛ¶YYYÚ÷ÒÕÿT YÜì¬"€ö¹sçÍz0y¸ßß©9æ-¥0ÊÌÙ§¬iSlÙ/?ëŸñ˜eû™×9î šé—º”³•pž­Ñ¸ù}µLÉûÑ:y©b¡?ž5àð€iG¾lœâô”¾yKbÂì¿è)WH×ó\ÏõÜååe÷úÕ«ô<êõæ|w-†!®ëÁ0!PBR ´# †Æœ8)ðƒLPËeÿ„T*–––h·c'¢(ŠFR…Nxm`ZU-{wïðàÁCÚìî÷qýè]gTý?õ=t´6“g;äyÍ8®t¾˜'LkŸ÷Œ_W'bIëm«&ÍòUÑ-?Tèê¥ÃøE®*_Ô#R©™»(wG…þ˜_`æº(|ß÷ú®ëÖk5ïÊÅ-õh¯‡m;iäÃ!õz}˜ õnÐŽ€sà¤Àæ´ih666hµZÃô¿y/†ì²R Ó®Qµ /ÿöÞìY–ä¼û}Y[og½÷Î`›XDÒ¤À¨)Ù ŠÉp„iý~õ£ùàG8?ÚaY‡–d;Â!™¶e*B²- €Ü̹˹÷ì§÷¥ÖôCwÖÉÊÊZ»ûœsïÔè¹}º²²²²«óûò[~ðâÅsŒ'S„8½Á±®Íÿ(öý¯)1+ f¦ºòjí ÛÔ*ÿÐíh.UÜ4”Ï,œÊóOºàIÚñSVü~ú3éJJz•xX(Ql˜4A€R €Âràû¿X,æ†Aî>ÿ?»pfÀ¶­z_‚b­Bèõzèõz²‹° lР¶¥dR |d àû÷ïömø¾Ÿòÿë„¿xï´v` — €ëyX¸n0èØæÊü_A<—Šý«~b~˾šp¾”À¼YW±X³ŸüˆÌs’Wˆ9K‘Óäù'C÷WoÔŠ€õ?‰S×Ô)µÙ*Åô¼@ª€2&$Š¢ÐuÝE„îgÞ|3Dà Œ€ƒÃzuÄoZÎ7¶mÇd@¦iŠSš@À j` À›~5¯LÌ‹Ë}¾öÚk ¢”ÿ?Kø tvïÇþÿ““´[6lÛcô¡i ó?ßòî¿x™yí 6*ÛöÎѦƞÝ/q höêE\ Åšt}$R%¾ì €FåÐ>'«]þã-¬*ªüÏú@Â"¡}`9ç|áz ÏsÝû÷ï­·_CDØß«^X­(/@†°mNŽãÀqœ†°Aƒ5°  2a¸wï^‚ÿ?Š"-M¨ú71í.¸8?ÃåU¯?8DFðüðGŒbóîÚ£}›Ûnu/åç¥ØÜ¿Šª8ß|KmËôu[A%^wÊ[\x©IËH‰÷”÷LñÔ¿q€ô®_ &̶¨ÿ‰ñQV2J*À…ƒsÏóÜ…ëº;½^ø•·>‡…ë¡·[H÷ÛkP8ç0M¶mÃq¹&€¦4pƒ•± àk¨˜@Dxã7üÿj^°º8¬þc&lp\\œa6›`8¹ÁõÙæyößµMÿ‹mÉîV†âŠe ×Lu«…Û üÝè}Qýeøú¹&¯_>Y6õ'þF²üžfp‡ÑtN»ƒº÷"P¸ Àã8èv»²ºwnumÐàŽc ÀƒÜeF‰€ûûû°,K˜§X­}Øfsàüì ®ëaá‚pÐvŒ§ËS¸v·† pÉóõN§Vþ×Þñ]ï®§l‰9A_úÔàÓùýÓŠ­? Ξ(]}­ðdr~âW¦ýé¥þNŽRH%æ†aàºî‚óßúÜgñ¢ïÁÂú_¦âþJ@E "´Z-´Z-µ4ðWîðóÙ ÁÄ6€Âˆ\5 Óéàðð¦iÆ´ŸyBÿzˆ`9mÆ#àüü;½6zݼ üÐ4Ø@YµJùàk4¨q|“Ex^ûuƒðnJû«Z˜±Àª“ªÄ gæå'Lü ³½xšWŸp){O.T¶‚e¹/®C ’‰”³û¿."˜ó5EQyžïF<òßxý5Ž1àùLÓ¨þJÂ_Îð<¾ïÃ0 ´Ûmt:t:9XøÁ]c4¸³Ø†ð¹¬‰B#Rßn·‹ÝÝ]‘VPƒƒâ€VgÀ ?ÀåÕ%cMèOF”'Äòu‚ëƒ[ÙV—»|Ñ¥ Éêêìe&Êù~ä¹t4ýëŠþh÷ÐZ¯‹¢ðÄ9y·–HÞKfô]‡fP*»J«ÚyãœGžïyïûûû@¸,ìõàµ7ꉊ ܦi¢Ýnë\õ/Ö Á§›Vv¼“×@6ý3Æ`š&z½öööâÀð×[–M\õ/1ŽÐrø~€Žc>.±ÌÔ>˜h—Ÿ_Xt‘±¹‚]áã ítË7p[•2rø¸ÞYÄ%3Rà—x<{sJîÕI ;¤”¤WþN*0¤¹BöcÆ9¸çùžïûÞîî.ÇO½×ó3„ ']QøE\pX–®Ø%÷HýÀƒ >…؆PŒ#›ÿ[­Úí6z½8ç‰ €¢­ÃA®ëbow£é|AÀÓýo^¾tæTfBÅm¼2 «¹ØØÜo"ßþUÃ&h˜yæ—'f”)”õü%ò>TÊýÔ/'qqÒ›ø¥·”¡ áOº”_m6ü ð]Ïó:Nôå7î!#t»;k}yQÅV9+Ȳ,8ŽÛN0¶´^Ág¸Aƒ­aÓ ÀÛ‹©ŸWÆT &àzÀ`0€çù˜/…¸q @¼®¬”€V«…N§Ã0J+Q!â–½ 7˜N&ÆØÝé.ƒ=¤e JkÏšÇËöÁ3¨Z•6¨wŠnðúTm”Z=Tå¼´" ¥v$uCMê%5yÒµPv÷éKRèÚPƸµ7Ïy¡ ÚÙÙÅ`èÃóƒj_ª¢£ “¿º.ˆ@ÀV«%[€FhРÌ ÷÷™¢*€àöfŒ%Róñ3-p³Ù ³Ù †a`<óq>â@]Ôuª»ê·ÊA¨j^0H¥¶©¼æxׯ] 䨮K”;‡Êö“êNù€ z$RwÿI{eT†n«^æžù2ô‚Jw• <¸œAàó( wz]`âWb·Òý¾Å¿b÷/b È­¦i‚ˆDûÞ|F4¸³Ø´à­² …@T÷bŒÅѾê+Ë`"ÌæS,\¶eaîz ƒÑ)ç¥ú;{^þx±ûЇQÇä§x6œöWa||qê H©|=úݼ¬h>K¶×]^-Xâ5ì—EÁ%TŒ,2„ADQöz; 9Eo½/x¥¨DÅKBØ AlÒ`ø|ÖA•H@TøE 0ÃB³éaÀql¸^àŒ¹e×–uÛP~ƒb/X¢«µNÛ ÷Á53t#Ðîì©B[ýñDÓÌó4¡s¤ŽJÓÞ÷‹÷œrÅ-QrLÉ¡%o î*5þ û„sP4¥Â­Åƒ0 Ã(Œ:6Œ°- žï×ÿRá¯*¦iÊl€Û*oÞ Á+‰M*]”¬É­þ˜E ®@v' †I‚¥ ÀDXx ¹âè+Ü¢¬|~•Ì~s÷T]J‘ënU\”€Â‡1óc*ÓNwÍô»å¿\Ú¨g ÷d«òãÖëÙ[ÿ„Õ*Š¢0Š¢°å´ÃBF›ù‘q» Eà°X;ÄzÒ¸4¨ŽM*„¥ ¿‘b Z<€8Ê·h1f˜` +` €ƒˆ! £¦A3ÑüÏ}&]­±nŸ›=wÓzÓÆ•žßñ†Ã¨rIèìq]Ër±Ãêvù²W|üêûì:@úx@-U0Xx´‚e[¨jnQÅ‚^üöÅš!þ–€&°Aƒ ؤPè‹U¹Ä„1›úTÊßì‹-×µ ‹"ÎááÔ1çœç¹p7Á·.¨ØüÏobœü¦¦rûÞŠ"@k¶É %úË0áSͱ(@öÎ?Å”¼º²ÅO\³LL¡®vbµ…sqn`2ðhýð±ë—…=˜¦»¤uåUd³lÐ`kØ´  ‡øÁŠáÇËÊÐö±j†XU cÃaM`¦\u†RîøÚþ^Šj†°ÝE¯ux#×›•L:/ Z_ ¨nDÏ»©ŸÉ»ûÔx„ éHÞ¥ §‡Ÿ˜µå'íD8çÜ0 Àfˆ8_ûR7 ²ûP¶4hР:6©ì „ 2 :O!ü£fCÎ9Œ•·! Ïó`ˆÃ`lPN·QŠÙuÏÌ'Üšðß–àϯ\Sît^%¿­d§Õú }`›Rüòœ@¤Û±‹ þ*Ë]MÕÓfîéF@•G˜ºiJ ¨ “ñ• À0l ×AÍj?Ij °l-”­ 4¨Mþ‚ „ ›ò¢(‚mÛñ{¡”é#âK¢µ ˆà{ÛBq„Q´¬´Šô^–Ç×¼ÈöP¤Ï×íqCƒL™uiKýk?¨p²þo±¹O|eWŸeý±uæA§Y æéª-€ FcˆÖtÈ›,,ú¾­25hР26P¾±Âó-Lÿe€å2j¬Þj!ÃLÖW™öլ޵÷@| z/—B¾Ù«_ˆ‡²®WÕ4_ÍʨKm¿%!?)%@{ÑTÓ27Aj¡L‚¡ŠkB2…=e6’KĹŽËBà‹À?ñw‚@z 4(·¡IÜÝ©êå]Ѳ€:‚ €ïû0 n"Œø ší£þÏt×…‡ùš;Þ5 WoÉ{Úìõ6ˆL¹½=ÀÍŸ[Øu©Œ½L[@V?¥%‹RA<@Q!Òe D´ôq£zZ€jþŸ™¦S†‡a[%´°ý¸™ ^ܪMü˜TRÀK p)ðe@aE¦Á&«E`Óµ6Õ&‘;Í3Ï_«\q¶[é‡6riÊm¢³âãz·AEÍ€Ê ¢D—Ia­È|¥æ–®ò@¡A¿N8æRþ3Š¢èÁö 0V¾“¬€?!øee€ˆ›‡NÑÿ JãV9ŸWXdêßâVmCQ=lù«"¾Î¯pÔâ]Æ£è#®;™tXkœ•îi“×Ûæƒâ ¹ªU=­JF_•ž²ŒïZ aíô‰’EÊðÄQFÀ<„ïGð¼j,€ºŠ¡2€eYqöXG¤5ÃEƒ JãV-rÞ•,€¥"Œ®ü‰ü¨k3½¼›^§ßèq Ûø8§Ã ÿÇU¾V&6k3/TâK®[i¨|´› z×ÙìôRÅû“  jbÌ`žïA„u™yeÚ_Ó4aY,˺žL÷#ñ4hР}ªnǧÔII@"ÚòǽA*ãuæëz¸Œ1Ã0˜Ì|.xÔZkm˲`Ûv¼ûÃóù¾ïË À 4(Wä2ŸAÀó<ÌçóTõ¿ü>¢8ˆ ¥AS­ÌpÖiS"Ú(ÿ0e…nƒµðfÿ–ŸTâÓ¯ÛN——“þ§‰Ï˰E¨'ä©îg»Ê@Öí]#`¬4×óxÃzË‹,üÄ;˲`š&Â0„ëºX,‰5ÀÅ݆4¸;¸µÙô/ÊËV€¼sŽÀw—i@XE gdWåézÂ?Ù!_£ÿR×ßXHsYÁ¿}ãvwÿ›T*ÇdœP.²súÓ5’js–ºÿ ÷†œ¡ÉÔÂDÌ0LÓ4ùl€õ«®ºŒ}þBø›¦ ×uãMƒ²V4„ TÀ­ÇÈ@⽊´BÀ>‚U™QÁ–ã¨S 0»M2Î@Ñ¿†ð畚•¶KžÕ‚ça3Ëiý¥³nAÞ9ë³úkÎ_>®”`Ì”ÿÒv[3˜›tè,´òl±Âd:" j^C²ˆ ˲à8NÌàû>\×Uýÿ4hP›TJÕñ•}üÂàºnœÒ#f[8 ð@´\$ˆX•è­õP²’_^6m‹çºí[9{@ E€6[˜èÆi€×4Tå«S|ˆ6hXp\ÎŒ(y×?6Z©¦iXŒÆx4la «Z(c –eÅ¥Ã}߇ï§, GhРAilR80Ų(~õÐô0 áy^Â-P” À9§¾À¶íUQUYP Ho*ß¿à„üˆ:ïÿšCëÅ ð‚3h³óUq¬TgP%V(¤4Uøo·Ë~›òX1b–iYŒ‘qÕïÃÙ³³š÷– ¿qánà 0›ÍРAƒzؤ@ÈÉû‘9»e+€çyX,‰€,@V xà#üØ7LÓ†i0sëd`|íóy©62šÄ\ðÚ÷“s\w¥-Ï8m§ke×[Ê®a N)tƒ4¡ƒ´½iÏçKH01fÛ– €]^]a§eÂyõ“Õîß¶mض Çqà8c±ðŸN§ê¦â 4( ¶Á¾fæ¥W—•°Ѽª âäWâXàÃ÷– ŒÈ 6 FaÈ{بzk•„ã?yýqòµÚV½8_wÈkC¹vš^¡ú’ÛF÷™.‚?Å7¡Ë¹XʪXbñ•ðâH|œuµŒÊ)ä IDATOÓy¥Zç§” BŒ1Ãq‡sÎÎÏNa›¬¶ @f4M¶m£Ûí¢ÕjsÏó0›Í0ãL®Ð AƒÒؤ``Q¦¡lð}Óé4öçeÊç.Âuçà|¶ã #X6”í‚Øжê¥|ƒcÈ›íu{(sÆ [¤7L¬5íWÖ§¾tK]W ºþ¬hR«²±ùŠ"@åç`­@É †a8Žã¸®Ë??c1/Ÿ–/×Qóÿ;Z­ÇA†X,˜ÍfX,‚XÉѤ6hP ›´ŒËüå@±`>ŸÇŸË;}Õ æºKËc; ƒˆB&)Àú©yu…xîy©¼¾ÖãvþÉñÜ-¶^1’²Î÷¯Í ѧùSµ1Bqkqž÷¤$šf7ƒX Y&`=ĵþ(®öC¦i˜ívË™/ôøb€0ð†õ‚ò…@Dh·Û±ðwQa6›a:ÆéÃ+ÌÐX4¨„MZ"¸dá/¿æó9‚ c,Q&8¯ÎC¸ó Â0‚mÛË”!ƒÁ6 ¯µð³ïòB†ž2%|×îÛ ô[£õ-'_ëÊõ®Ù_n”|F›tâerúI¤ÕYZò…b5H'p¾¢.V£JD4H#-3ëINW""²,Ën·Z­ápÿãc¸¯ÍkM¾ìBß²,´Z-X–ß÷1ŸÏ1N±X,d­h‚† °AƒJؤÀQÒ§*B›·,+3PÍ àœÃs–eƒhï8ƒ––gÓiÞV=7ÅP¡ËŠô€,G³•QCîåJ—@æè7tK USB´_Ÿ›J)T] )'/Ÿ?X£`¯dR "³-Ëvǹøä1< jNÅ€ŽãÄ€­V ¦ib±X`>Ÿc<«4ÀcTˆAjРÁ所Ί¨V‘ʳX,à8øXžÁs§ü¦e®² ôÚvo:¯\lCr¹rÅjaÖBnĽ&ºOøõL†yשbc »£Pµ°û ©és¨x0º¾$«e¥rp× HïüKè^ë)gÅgÓR±HÜ1æ8N˲lûäø9àDˆj°ª€bçoÛ6Úí6cqÖÐÕUÊÚFhР؆ûû°Ô*#íþ}ßÇx<Æt:éØuqî|ÏsaY6lÛçy`Œírå—ÁMÐñ+±·´Æ¹9´¡ýËéyB~W¯FAµuÓ' \4ùÓ”U7— þ¤W4Y"£€É‘+¥/y©ù(ìF½«øi&"23ÚíVàöÇŸ¢»oÃ]TÏÏW…  Óé Óé€1›ÿ]wE~½I8Cƒ *aÓ À¨L#™ð'Š"ÌçsŒF£˜+@üº€À(Šà{\×…aèv»`ŒàØæ~ĹSr¼µ„EEó½~¾|ñÌ^ :Ô ~ž®0XFðW™ ù6î®ÂÀ·t ɳ])4RWP'mO ¢L#ƒøÇÕ¿uãà%È3E=OGªÚ˲€at:¶ïÆ'ÃäÜÅz¢ú_§ÓÁîî.:Â0Äl6Ãh4Âh4‚ë&,} @ƒ±i 7@¥¹ÿ³Ù ãñ8öý‹@Àü,€¾7Ãb¾Üit:]A€^§eŒY‰f½{Ê+×»NÐ;"”æ Õäé8ƒâ>o*²Ÿ—|mèR•@—:Ï“_‚~ÇM™ïÔhÕ~_Û‚'d¿$«ÅѤ-€#›m "(6Z@–eÚ;;½Þx26¾óÞO`™õ–9ýÏ0 ´Ûmôz½8 0ŒÇc ‡CL&• øÝ—dÍmÐàÎ`Ó ÀiÙ†²Àu]ŒÇã„ï?+õOþ, \ÌfcpÎÑî´áz>£?¨ØÔ^†­gÜ÷M¤ò«v¶@z‚Ÿ6”ÖGÙç×ì[PJ_·âdHxZ >ãe©Œ%ÿÏ{ AÊ~Ïe'ç;Z¨1pyd´¬ý»˜mÛN§Ý霜œNû˜MÇõž)Éà8z½Z­Vü¯ïûF jÐÔhР26ø!€K÷ò©YQa<Ãu]m=]ð(Ä|:B„hµZ Z¶AŒ1‹®·@™«5¤ªgeOJÖHò‰…¨Üåµ ^â$^~.6 ž~î½¥&ë…Ä©ç¦Â¥«p¹P88ˆ“ŽûGeÒ×þ}mºA9ÖtÃ4÷çÄ•ÒYRaƒdƒM²œþGD¬ÕrÚív»szüÀˆªSË€Œ±x×ßn·Ñn·a\×Åh4Âp8„ç%®xú*-Ì Ü6m8ð<¯Ž @(raÔn_÷wa>À÷}´œ ÓD»e“cŸA­xerŒ3ŠØ€óÒ–ý Ãlyt¶'^C’§v á¯ØÂob·¾Îu¶2¾e3ýªuélJòõ @º¦RëÂ{çé?ÔŸåòH.]•ú<1ƒÝN·Ë9o¿÷ð'pî·à{åƒñeß¿¼ûwív;€ÅbÉd‚‹‹ ™P¬; AƒŠØ´ÀQ‚XüÂ00™LâA üË \ÌFX,°m¶½,ÒnYo¡´g]ºþå µòKÍŽâÞʨ!%c ®—¥xÄ´„à'*åÞ¸ v@^³ÙFG(Igе>å _]•§ÿæ×?]ߤ ‘ìHY¢ì‘æLŒ.jAŠ.H&ùjDÄLôvvz½ÙlfýàáO`‡ïVË÷Ìc,Nûëv»ØÙÙA·Ûc…F£.//U ÀËJ¤ 4¨€M+€•i¨fL& ƒD&€ÎT 8!}¯O$ÒÿZ­V¬ìîî¢ÕjÁó<\]]áää®ëªl¡Ï_®e·Aƒ»m(¥ÒqT7€ø{ž¯uY€äûÓñ~,w Q„–cõ£û«RlÈ_ë3ìÖ/eŸŽEv™~î0u:†Ò™Ž©^íªP“º»@¾5 Â˜(¿¶0/×cÊ £8x:Ÿ Á/ÿ4xòze=çÑÓà ÄyÑïý¯cÉ`Ìèu»=ô~øþ‡`‡]„~=ÿ¿0ÿ‹ê²À0 L&œžžâêê*–ðí—}!nÐà6° à#,32¡ %`0ÄŒ€R½b>Àu]8Ž"Ƕ˜a°ÏEoZjñ „¾™ü;E„…—Ðú%…¿ôv#Âÿ‘ÏÇ°Ñ ¿°èg…u(Iý:áû*n”+ 6“Åÿh¯[¤ ðü[Ig–Tt–æÓ4­ý½Ý½ÉdÚúÞÞG ¿¯ªضûþ÷ööbóÿp8Äh4B¿ß‡ïû²0ð—sùmÐàv± à À'Ed¿°†/aT…¿N ˆBŽÅl„ÙtÓ´à8-X&ƒc™o'¤ËÄCº"aIHŸ×çàYì™Â¿ w½ðùÙÿòê*” ºäצ “ÖF¿ü€Rµe©ËÓqŸº@PÎn‚¼Ç©ÔFþ'Ž‘\˜ˆÈ°m«µ»»»rrl=y÷#^=7¼Øý úßn·‹N§g„aˆñxŒ««+œ© €c4þÿ êýö¶ÐgàeË»|] `¡Eð#LÆp`•2ÄÑr¬Ï°JÖ«Y?¿(Æ>ÃÓPUød]»¬ðÏ´,ð´Ð©´ó¿ _ó¤ ÏŠ¬äõü„ŒÌ®‹ @  ŠüýRú»®ä4º6 ð¤’@ˆó[Eð1"Öét:N«µ÷èÑG@0B0Tž{¹úŸišèt:èõzèõzØÛÛC»ÝÆb±@¿ßÇÕÕ&“‰øç(°86hÐ@¶¥~Kª™Óéý~žçÁ0 Ð U “Ñ‚ @§ÓEEè´ìÇN*§z àåãÑøÖ®ö†k…¿þûH ÿ„’pÍþUg¨¨B¯ % ÓDÏgBð_—¤ãr)yÊhÏ×™=ý_â’r‰†aííîì†a¸óƒþ´Ã…å«pªÄ?Âÿ/ÿvww±··Æ¦Ó).//qvv†ñx¬¦J^ Aƒµ°- V  ïûè÷û˜Ï癀º¬€(Š0›°X¸hµÚðƒe  i°DõwÖeÚUIÛ»~KU»Ñ.Ø<›Ú%µùTGÖÑ»åX¿@º¤Ÿ6S}ž0æËÕ!mÇ%u@¾ef`rùÓØ €ÕçåY‡½¦‹ê¦GVa–˶ìýýýƒ‹‹óÖ¿ùöÁÂê@®þ×jµââ?ûûûØÝÝçÓé899Id­ðÏ_•ŸAƒ›Æ¶€R€jª_†qž¯Ø¨åuÂ?Š"¸³e¡a°lmÇbmÇúÆŠ ‹tƒÛÛbßQ¦‘êX,8??Çx<†a`ŒåfÈ´ÀóIÓé–iÁ2-tÛÎ.#ú £eJˆ0‘ºWw‚´å 3Úõ¡eïç'¨Ç˜°mÏ}e¢˜e™ç>˜š6ׄ8"µOJñK» ©ŠyþZð“,fI“2¨µ).‚ëÀÁ¼à@žY"Ï“%ôgFŒÝN§Ûn·Þ{ÿ}†‹«µÍÿ–e¡ÝnÇÁ úý>NOOq||Œù|®*ÿ˧jµnÐ`ÃØ¦ðÏP2@VéÇ`0ˆÓƒdú’Ó½ÅãÑç°lD@§eÿ”XU GœIŸ}F%¹©ºøv×*Â?Ù_)™Ut°ÈøœiyH o3k`5ò(´5q2ùeRíyâ½d¬O܇´í'µj0]; t6´Y_¦B*X0Y Rz"xf<ARNˆ-£ÿÍýý½ýù|qðßפ]^Ùü¯îþ[­VÂ÷xxÛ¶1™Lp~~޳³3 5ýïÀ¿n–ð êc› ÀJé⃂ €a ¢ÜL€ø¸˜Œ.áz>Z­6@¯c-â|Ÿˆ*”Èø¤"òâúôü5¶×j™ßâyÎ麄ð/ŽR( ]Üø†Î¥zçQ¹/*açI!žWÆ™d“@Ö¥ÕÑq•òWµ(^þ$PÂ|!‚(I‰þ7lÇnííîÞ{òôÙÞ{?þˆ± œû/¸ÿpïÞ=ìíísŽÑh„óós<þ<Ž ’ð4)€ ¬…m*¥âÄ¿²ày.//1ŸÏc Ø°Ãt:…iYÚ-ûÐ4Œ/»N¶J­¨0bkdAfäYBšTþÂ\¶ ˜ç쮋‹ÉkMÂ<÷eî|=ðú-sMûÙ©|—ÙYšTAÎ~wE@…‘J¤dM@ÊŒÖH4ÌúÈžb¸üŒˆ1ÆÌ^o‡»ÿîÞ·àO¹Ãê¿i÷/ŠÿìïïÇ»ÿÝÝ]¸®‹óósãèè(Ž’Ðÿ ÖÛrÿ…q²ð¿&öYúþʤªqÞ|ˆÑp™ `Û-˜C˱~vYÁ4CR¦?]'—¼ü 9œ®:‘ªÝd&nBs#5…¿Z.þ”¶îó¿q”ð É%syvY¥ÜïRü %@ºiÆG•o@æ_ õ›ÿ‰È0MÓ><Ø? FúÞC°p^!ÿ?‹ügoo‡‡‡ØÛÛÃþþ>,ËÂx<Æéé)ž?[4ùÿ ¬‰m+ÿÀU™†²€çœc>Ÿ£ßïƒs˲ ÐF¢ÐŨ‚ùbÇiˆÐiY_åö‰ÑЯۇ*üë¦äçe³  87!¦Šãy¢j<^ÉÛË61”´|!Iöþªß¨š­Ÿ0¶‹@Ažet)ÂByª,O3JîøSΨUüAll`Œ1£Ónw:î½>øqkôñ#D‹zxBø†n·ÿÉä?ý~/^¼ÀÑÑ‹…Zþ·ñÿ7h°l[xàßä5Picf¿Ù ççç˜Íf0M3‘  EóÑ Æ£@fè´¬CÆè‹Œˆë’¬j`»ÿÂs Šå•pÍê~iI(%ü5›¶25ë~üF.ʵ9s:ÿHœp½ß]M\Ýn'Þ'+V(ÈŸ|®è/Ù~õz+æ?Ƙµ¿¿»7Íîû»ß·aÍÈ/=0á±`ŒÅþü'€ÃÃCôz=¸®‹‹‹ áÙ³g˜ÏSÿ  Aƒµ±m€øãÂFV@áè÷û "˜¦ %‚9B†áð žÀ²lØ–‰nÛùÙDf[ÚÞT­U[/½°°àOÅ™gö’ÙŸ—dÒîþ7b(?¯ëZ¤¶<ÅýO×urP2*#eHŽ%Ó€ªzXÊ|!7áÙ‘¨«´„ÕîßqœÖîÎν?yúàß0£FðŸZøG(ûûûq €aǸ¸¸ÀóçÏ1Ôèø__©U¸Aƒ[»kü)€REÂU?¿àæi&*æZÂÓÁ1¦Ó ÓçݶýE"vÀˆ)¼€5¨J6Z—ŦüÒÙxjûòξÆÜlM¨o ¼Ò¹:ÏjIë¬hi+@Jäs 7D.MSF¾#WúËöû¯®AR þ[þá÷ðþûÜ>ÂùYåÉVƒÿ„ùÿðð<Àîî.¢(Âåå%Žq|| ×uÕP™Æüß Á†p À÷Q’Pµˆl€ét ˲Á€¹õ8‡;=Çp hZ6,“팾ÎÅÎÍ[)tWNäÔª1´®ð×”€)ÜýóÍMJ&¨âç5®«j=9yž¢Î]~ȹRü¯Hài'€Và©<}ÊRúÞ4—Pótº' FBFD†eYÎîîîá“gÏÞøö»ßgÌU ƒÐåþ êß{÷îáÞ½{8<Çåå%‹ElÈüןñ˜O0 q€1mÇø<#öeFŒ“N4nÆPÛWQ"J¬ñ\_Å=[rQyw…*üËÚ€¥TßZסJwϯµ­ÄÆ]æ^ʶhÙ/ÊDåɪ™V€üê ‘žý<¦:Z&ü Ò"Ã2M{owwÿÅ‹ãýoÿ茼xÅà?Ýî_øü÷ööpïÞ=ôz=,‹8õïñãÇù¿Aƒ-㦀B7€€lþïãêê Ãá0Þ=z+@âÅ9Bo‚Qÿ ó…Ó´`šÛü&6‘¼× o/kV­I*Ã<«H|îp¨äÎ?c4¹Â›4ýçg2àåúæ+’ Vžør›HWšYò%pU¡I  Œ9.aà×Ëâ Hïö¥s5„?ò0$1ƒˆ™½^·ÇAo|ïGßäƒ3 Æî@,üEêŸÈù»Ã00ðâÅ <{ö çççÃPí¦1ÿ7h°AÜ”ø'Etqab4áòò2æPc²^<Š0¾Àx<Á` Ý–õÎémÆH/ÖHu+·¥â6\©Ò-ªð/9œ\Ó?Uºuõ&E”|^e…4Y/špÎ+§Ô·«³”î†'‘ÏñL©÷”žžP,xÚ$ÀËmñó§SÙÿÇÁ1DĈ‘aY¦½»»{øâøø3ßyÿ‡6yýZ»9ïß¶môz½˜õïðð;;;ð}ggg±0›Ítxå+—W¦OÿMë{*soñבðÑ# ¼!ž3€tY^õNJe$e¾\)Š'Ð%å#"£ÕjµMÓzðð£úèøÈ¤éi¥/PÝý›¦Óþ ÁÿàÁÜ¿D„~¿ããca8êxÿü¿ÍRÝ Áæq ÀŸciÒ+„,Ì… ˆ<ÏËÍH¿€p1Àðò¦ aÄaÔµLã—WiOŒJdÏ×)=—ç8.¬’›î‹çþXÑÐ }æ7/C”“{s‰7| Š„ÒX³/*ú Š@?¾lÝ«¬+ Zê H3« IDATOíö“9„ɀ⿥óŸ‘a¦ÕëõvOοðý¿ÃgàÁ¤úìJE Ã@»ÝÆÞÞ^lö¿ÿ>:f³NOOqtt„'Ož`:êvÿÿ)€ê…4hPˆÛP8€ÿ¶°¿æ/‘Á 0`š&lÛNddYøj#6<Áp0€pD>ÆãÇñüùó¬Ýÿÿøê-» Ü °[ºîÿ%;`.²\³Ù,Žp¦i¦²ôï9"oŒñÕ&³Â0um“ýmô#–rH¨$µ^•vF?‚Òv…ÌKïþ댫ԥk`Cn¤KßdÝDÒ:Õ>–稊•ø{B^­¿ÜJÒ)Ö¡${PÊÿ¯ûâémYŽí8û?û™Ÿ<ê,Mÿ5B[•à?9ïÿðð¯¿þ:z½^LüóìÙ3Pë*ú€Å¡oeQÈ\ǰ±)~¥-œ’˲§Ÿ*˜àks}¥:‚¼Ì£¤X´d‘qØ¿Hûk·[m?䯿ÿÑÇ?sqö”øøYµgB2ý«yÿ²ïÿÁƒØÙÙA¸ººŠ©g³™Î÷ÿ¿øÎ˼¸6hp×q› ÀS”¬   à8N"#@=OþœƒÁ?ÁðêÓ¹× `xÛ4Ø7—Ô@¬T@`áØ L¸yT<^ åuªîþ7¾µS¹þ«Éw$Îç¼öó2x^è†Êü,ýG“€L+Àuý+"‚A ò,DzœýGOŽ~þÃÇRÿI%ƿ뮓å~lj‹þáÿÚk¯Á¶mL§S\^^âèèÇÇÇ:óÿÀ?z×Û îØ-_ÿ?G b ZÎÏóÐï÷1ŸÏá8Nµ€@Ì/>Äp4ÄÜ[*ÃoF_4Ã2+`åMU¾ýÚý—ú˜ÊÞ@©±Ñ¶nf»S¥íP§ÈùõÚ.4³[d­þÉàÀ¢ÂOùŸ¥«ýi#FEEC"ƒÌj·ÛݳËþ—ßôÑOG—k›þ… ÒþZ­vvv°··çÿïîî" C ãéÓ§˜Íf:óÿ?Æ’ú·Aƒ[Äm+üÓ¢F:7@ˆ¢³Ù ƒÁ’¨¤ÕjÅi:óâ=¡?Äøâ)ƳÅÒÀÐc„¿qôÃ’&¸.øÍM#/„Ê-‡q°Ðm]º`ÐFæ­Vm€¢(ü¬` ®„ñ]Žò.ªìà úäZ+@Ñœ¨å&ˆÈ`ÄŒv«Õš/ü·~üÑÇ_œ?c|vŒ*ñ²òî_pþw»]ìîîbww÷ïßǽ{÷Ðjµày.//ñìÙ3¼xñ“ɤ©ú× Á-á¶ ‚@W*Øu] L§S8Ž“räÅ€3xÃ1\bºàz>Ú6û†ÁØ;Œ †@º®á&6wÿÛË/W¼G7ÑùÇiÃ3 »Úi‘ÎÑzÈËž·æ—Çu%޹bòϽ¦$4Ï«?¼2ý“AD†e[6ˆÝûÉãgÿÎã£Oº­eú/Û¶ÑétÐëõ°»»›ÿ÷öö`f³...ptt”Uôçøß^òuµAƒ—wAxŒV•@‘Øï÷:NXqú˜žüƒÁfnÏ÷„¿Fø"3W€DÝÔœáÖ:´¡t'nWfó[9u;×3ûdôñu.«µ$e¿üOž“¶hR h%ý Ã0lÛ¶{G'_ÿàÉÇoñËÇànµl;Ùì/›ÿ[­:N¼û¬½^œsL&œáüü<+øï^%¶Aƒ»‹» À?PH8.+21 ív;Á¨sÈ‘7ÄäòF³ænÛ ®ÁèïpŽ}FŒ‘pl",ð†±â{K“É 1ÓüOà[Þýodn«e ÔPÊ6ö¤!ðá9²?ûB\ "¸W~F ƒ1f:ŽÓºLæá'vqñ|^Ýô¯‹ú·m;áûÿö÷÷có¿ þN§p]Wíº¡ýmÐàqW€?G ^ ;-Ðó< Ìf³„+ K Hfðû1<ýã¹ñtâÁ×£o®L›‚ (ÝU[–ª®[¾#ˆps²zfñ›CA²Tæ6ôÑÿi2¡Œ¤R?D Ã2-;ŒpïÑÓçß|þâI/ºªžò§þˆ—ˆüïv»± ààà Þý‡a“ÿ ‡CïCûÛ Á ã.)à–i˜ &“ ¦Ói\‚TÎ Èup òǘ¼ø>Fã1Æs®ëvLƠƭ⊈^t#Ö½½{匲 wK7À79 %Žò* ÙÆN@=YeP¾€eºÃ4M‹ÆÎãç§õÑÓG_Ï>w/*ÍŒjú—…¿ã8h·Ûèt:ØÙÙÁÁÁvwwÑívaš&\×Åùù9Žc/Œ†ö·AƒÅ]Rà¿Àr' ]@ Ì8áº.Úív¦+@§ €L„‹ Œ/Ÿb<÷0÷#€GŸÂð9§ýUÉT–]Á}ã¸%!Ç©p«Ç \_–±±b‘€×ºI]: FuÔ)$k¨ Ë ?Ë4­ÎÑéÕ/}ôô“¯ùOÀÝóZß*ü·ã8èt:èv»ØßßÇÞÞvwwÑétÀÃb±ÀÅÅ.//1†¡Üí€?z¹—Ò ^>Ü5àÿU™†YÜab:Æ‹L·Û ‚ЬQdÂ?Ó0™{Næð}ï®Y“J€ºA.û ßÿV”…dð߆/¹¹g àúé¥*7èƒñ ÚeÓ óÔ}$£ynŒ¦\‹@”øeŒLÓ´œ‹þøËž=ûåÙùÆÇ«?Êî_(òî_þ¿×ëÁq€ïûð<£ÑÓéTu`ü €'¯öRÛ ÁÝÃ]Sà¿ðƒ2 e €ªL&L&0Æâ¬qNþ àdÁ½|ˆñx€™Ç“þ~Ù` «Ì€M°ßÔe¸-ë§Û¸¡Jå—x•Û¯dОžÃퟰddø¥ãþdš‚AD¦eYÎÕxþ—>ö÷÷Ñëõ`Ûvü»äœÃu]„a¨* ñOƒ·€»¨\bIT+@(¾ïc<Ç%ƒ[­Vì (¥„sÌž£ÑFóƒñ´ëºîzAôó« @c•_•S 9w§ƒä³iqèvnc#¶¾ÍäXxqé=ªÖ/¯v À’ìÇ´ìñÌ{ûѳç¿~yüq/º|TyBu;5õOü¾vvvƒ#h»]×…çyªð?ð¯_¡5µAƒ—wQ–•ÿ¤Lì´@0™L†!:ÇI¹ä—ÜÈF´8ÃøÙw1]a4°pÝNàû¿¢A”¦Œ¥ •ÝëaÃæÿ¢D¸ŠÁu¯¹éI)q˜×WFŽ`¡ EãàUÆÎ5ÊÈ–f"2LÓ´¦‹àsüæÙ‹G»áÙûàá´Ò„ÊT¿:á/,"ÿ_Ä v» "Š‹¾ïÇ–  Z4bƒ 6‚»ªÌügFeë,â%²cèv»°,+W H¼ÈF´8Åøø}Lf^ß÷¾ .‚Ùª¤zÞ¾_¥‚¿ûДüåë÷q»àk5+[ú {P´ýÏ OHÿå&Zøƒˆø7gnøÖ£g¿uzöì³áÙCð`ZkÞ²Lÿ²ù¿ÕjÅ·N'α7¾ïÇ¿Cß÷UàŸ½*‹iƒ/îª,Ó‚þA™†yA`<c6›Á²¬8-©Š% ?Áäâ1¦®‰Àu½w8þ0ö—Ñd¢Ôñ ¨·u³Ó½ÜUÒ]ZÞ0xÕ;Üâí¥·õ\}—>ƒg›t¡ƒ<õ8°dù#"Ã0 Ãó÷>9>ÿí““'ŸõO‚ãÊ·¢RýÊ»Ã0â¿ ÿä[BÇDÁ®Ñh„Éd+é®Ð Aƒ[yÇÇ÷Gþ:€Ÿ+jGñ¯@Dq¡ÀC«ÕŠM‘"@œŸù/™p_üé²zëk_ç3ìuÂw˜iñÌÿž1Ö¢ˆq ’·7±^_¿»H†'h[k'ü–ïB— W*ãº1]Ÿ­wÙöƒ=)÷pâ ¦¥ôçj¹ Žex¿Ò'À@0 Ã0¦nø¶?ý}Ö;ù1øü´ú" |ù3‘ö'vÿ‚üG”ân·ÛhµZq\€a±n0`<Ã÷}90DcþoÐàÖp—-pà?°({BV<€ëº‰x€v» ÆXâœÌ`/þ ãÓG˜¸!S®»xgáùÿaÄiY=’–Õ PÖPE¼Þ9·²^nü†g‚W³÷Wkž@Càdzs²I-…ÿ2×ߘ¹áÛO.ç/=úì“~´¶ð×™ÿeÿ¿ØõË€â3ÇqE¦Ó)ƒƒAÌÒ)a†ÆРÁ­á®+ðOüÏefe„aˆ(ŠâÝç< ™âüì `6/¾ñÙ#L½ã¹‡ÅbñÎtáýý0Âþªd@B HÑܾs|M6~Û£Îßq¾æÄ”Š9,Á"D±ÏiögÆÔ ßþääòwÏΞ~.8yx›þBP­ªðn6ß÷1pyy‰««+ŒÇcxž'_r²z5hÐàp×]Àrüü5Ÿ-l¬øð… dòl6ÅËB9s“Õ¯ßÀ,,ž{é~~ðÅ¥2Áù;œݶõcÕ ¸Šüu¢Ù7J^'«†0¿ù‘Å ­tÊÓ7¿ú»¤ƒ ï0_~éršëq’Zé."';Æ3¦‹ðí'çýß=?{ö9ïø!øü¤ú7¯üòçªð7M3• hÛ6ºÝ.Çç‹Å£Ñ(NÇ×çXa„¥ Aƒ·€—ÁüGXf" (L§SÌçó8(PdˆsÕÓ–îÑ·1:{„™a²ðẋw¦sÿïGiK@ZŒÞIþ *ùYõ^®¿ÜÉ<ˆj™þ%ê dšúsí^8½ñΟ1fŽçÁŸ\ü½ó“Çoy/ÞßšðWÃ0r0 Å¿=˲âÚ‚À¶mqé€è_c4¸³0^¢±¾à«~¶ì j“Œ0 aFìA²2×@ Áè¡ÑµE„èM{Í4Œ‘ è¸WúÀf”€ÍŠS™Ñ€2*Öñâ.nTg ´ŽuŸ“:e^ŸÔÆ×ÿ¶3Zý_úHJó#ƒ–¹þ&1fö'þןœžÿÁåé'¯û/Þ÷úÕ'kuÛr´¿ø\Žú‚ßqœD`¯×ÃÎÎvvvÐëõÐëõî5#”îápˆñxŒÅb¯ø3?ù´.À Ü&^&þ€ßðF•“DÊŸü7p­ˆ|e53@öûeG†GˆÌ6¨}€0Š`Rô&3Œ× Æ>`Œ\,wl±+`=lqûLÊ%¨~w5,Ò8å¤rf*²Ö©kCÒ1õ¸N ÐÒÜÀ Æ "f__v~õ;Ë'{ÁÉ{àAuWº,ì… þÖ™ý…à¯v»+¢ °hYÄ,€óùý~ý~³Ù œsà`IüÕ AƒÆË¦Ì°Ì ø ­*'ª¡È–AZ¢*@–"°Ü7ÃçÍX{~Èa z3ˆ¢×lËúÀ`4GJlÄ °9m€ þ—{)hŒPsnIÏà¸y+€t<å’wü«×2ÒÅ5Á8Xçd°ø›ÏÏÎ~ktòQ×?ù!Vw£«Â_¼—-ºÈ!ü…É¿Ûí¢×ëÅùÿ¢h'˜=ÏÃ|>+ NoaItŠ Ü(^6~ à3~¹n²2 Ìþ‚Ü@l ²-×Sl ðý°»ðaÁ÷ý7Ã0ú<Șٖq)Þ"!2|7BIáÿR¢¢°Æ”s0=?Zá~ý§¢#¤­ÉÝþjÐâ§ùŒˆü‡Ï¯&÷äâô¯MN>°Ãó÷Ô~þUá/þUwÿY €pâ¡@'À9‡ïûp]ççç8;;Ãp8<€þ*¤û6hÐ`}¼Œ °ô~yõ* e¯°$”Ù gX®â„hzo:ëÞ7Zÿ€Ÿc̸´,ãèZÐmòÚ§½<»ÿä×Rý„ZVÊ:'7 ñP^+KbŸX`ŒS7úüÑåè÷Ï.N¾1{ñ‹êM‰²Ã—?SÙÿäÝ¿ê €LüÓétb… ÕjÁ4ÍD&Îb±ÀÙÙNOO1 ä”À¯®îÿ_¼²+mƒw/«0ðÀ+@ Ìþ:% _ø¯>[vxøÓXçÜpYQ~…sšš¦qa0ò°\àyŽ6P$¸nP¿Œ’?5“T¶1e·Íè©´@1õKo¯[^“û#Æ@ÌÌüŸ{q5þ½‹óg_t_ü|ú¼ÞT(^|&ÓEýËô¿² ¿„ ÇÊmÁÅáyNOOc €ëº²’ýxøéZ‚4¸=¼¬ ¼ð1€¿ ]õd]L@–çH}FîMà_}‚9à­}øad{¾ÿ ÎÙ›¶e~`0Z`å ÒÙí·a›/QÎö®cs @FoZ¿¦=å)Âïú9ˆyöΆóo_^þöàüñ¡ÿâ‡àÞe½iÈHóÓS‘î§*2 êv»h·Ûñ1Æ¢(Bp]WWWè÷û˜Ïçqpàê÷Óð-,3% AƒÀˬËÔ@øõMt¦Sc™€^! "€GF/mÝAˆÂ7ý |ƒæ•e²+$ö‡ú­åÁk5É ÒLR¹¦”×6× ©Ä…rÂu>àÊä¿T"€Ù¦õ†‰ðwß{úìWç§™Áé»@äÖ~®« ]ˆ`?¹(ˆ`™qãû~,ø=ÏÃb±Àt:•k´W¿åF hÐàð²+À2(ðgP!@u¨1Œ±xŒ2òúyáè¼ñXï>BfÂ7yĈõmÓ8eD¡¨úB…JÀ X^¯ýÒ·oÈM#Lv+Þ\ú-#ýYÄauÛ­Ÿ7üÅ¿ÿüÅã/Ÿ<ü.øäqýÛ^SøËJ€ê‚øGf1²ðmÅo…s»DPàd2çyòo©Q4¸!¼ ÀÀÿ à|±ìIyJ€\*X(báÒ‘©ÓAøSøÓ!¸aœ.‚(²]Ïû¹Ó›¶e|l0¶ˆÅ""WT·Ð ©Z«WP Øœ@j¢ÿ^´œ×\C’ð_’û0"DôÚéÈýõÈþÝÿäááÓ÷þ ˆúõo¹¢ðÏóÿ‹Ý¿l Pct™†a$®#~AÀ÷}L§S¸®«Sþ–Õßà¢AƒÇ« Ëô¡ ¿…eZQ)Qî1Á,”Ã0RÙ*´ŠPOÁ`u’i„~ð¹…~˜1ulóŪ5S Êùæè£Zœ— %•BáÜ+Íä/:q¢bö_™ûÆ Œ–»Š8Ù`æÏ³Ðû={òΓŸüÀœ¼ À¯«%„?€”à×)2å¯,äeÒ±ó—ë…AîGXÒ8ç‚óù®ëÆ%º¥ßOK¾/a©à7J@ƒÆ«¢K“á#,͇­Muª*¦iÆ–€2Ù1VÁÞÁøüqpzˆ !ç{¾|Íq`›æ3ƒ±ùªµTI ÓPF ¨°ûUíÿ©Ù*¶±”±¤ZhýüÀ²ÚT¾ˆçœÀÌ×ÏGî·úÃÁï\œ<>¼úøûÀüEý[̨è—íŸWñ/«øZ P ”ë¨ €Š€ˆ¯u:|ßWG_ðo­~ÛÇŸ²õ¹Aƒ­âUR€¥¹ð€_CÅÌ€¬H±pŠ]¿Xà„bPÆ% u¶´,øË,Èhv˜Á^ø5›;¦yF !xÊ w–z³¼ZA±oú@ Lâ„Ôyš¢Ýn·¿é{îLú'ï<ýøGæèù÷h^ÿöa. ~ùxÙÀ¿,᯺ԿeK€Z^¿1 oxqüöÃï‡ï|=Y¶)ÁŸçÐê‚þÄ¿â•Z@l9“Ýh¢½LÁ­‰·±ü€/ø6€á§e¡nÐ`xU€9€ÿ À¿åŽ¡2ÔÀ)r†€X¸ª(évÑäþè Üt@VAÄÛsÏûú‹~`sÛ2.QÀ@"gp“JÀ§%•€åÁ‚2ÁÒߊŸŸ-¿%"?¢ýþ,ü+ç£Éï_\žüBÿä‘=xú= ¸Zï6Júú‹"þ‹\ªï?Ï% þ©J€,ôå‰(e9-Êoæ/aéx†Æ%РAm¼ª °% ”IDñ"(ïlòÎËD8C0x 6µvfà £sÏÿ×>ÇÚ¦q%ÖøåÊ*¢ËK­Ý]”µ8¬T©?Òø^H´lê7¤>,ëögᯜ '¿ÓõÿÆàôãÝù³wŽŸÕ*â“TŽ¿_Çí_å•ePÓuJ€ê6ùÔñËŠˆøW¸ä´AA%¬`ËXŸ†/ Aƒšx•`CJ€lP¸0QÊÕ«°êÀ½ü«Oø>`µÁ™e¸AøÙ™ü¢DˆØÌ6>8–ÂFðÈ£¢ÙZúôVôƒuÜ ë ¸\F€&›/ÜÇ’/"ZzÚ#—ãt0ù½‹Aÿ׆OÌŸ~áàQm6?õy¬»ó×íþuÕÿt»ÿ¬—è§ÒË–a9S_²"`š&Z­V ²”ßPCÔ ÁxÕ`K–]Ö€X¼„/³¨†@ÁÍ/á_>BdµÁ™i-üà 37øE/àlîX’"€”" CŽÀ£’íÖŸ¾ öEkKeû޵¤Xðs~ÍàGÄÈèàjýÕóáô·.‡Ã_^}fqüc /~ „óõoT³k.Ëê§ ~]êŸ.P'èÕ8€"Á¯#’•ÝØÅuÄXåàAÅÊÖ( ÔħA¶èÐ y9K@XòH‡ŠMOáŽr€LçZðbE`a™Æˆ1H*YÜ‚e³ %`Á…´‘s²]N"°ïúE`Ä-zc0¿y1žýöÕhð7ÇWÏ__œ=2ƒÓwÁ½Ñfn0#¿l`_–àÏ2ûëÒød¯f è˜å‹‰Ô{“ã„’ a Ð(M5Á *àÓ¢PÄ¢TÔ@"½)Ë%P ‘‡hr ð!'a""ÃZ᦮ÿ—ç^ø¥ˆ™†10 r+™®ŒÙjQ¢»"ü‹Î‹Íü\áëÀˆ@œ˜íúøì`æó|<ÿƒ«Ñௌ/î/Ž"8ÿø¢¿™›Ó˜ëóLûu”ÝŽ=Ë" *òù:—‚:.õ·¢ãÜ~•€K´¤A%à[ÞÀ2C IlРŸ&Ø %@·˜©ïE´\åÿgïÍ£ä8Î;Áß‘YGwƒ ›P<‘’E‹2¥5-E]¦ZÂÈ2%J–(ÈËc‘{fÞ®=¾L IDATwwö°ß<¯(çÍz$ÃãC–½ºmk| >f¼šÛ²dË2OðI¼@\ÝuffÄþ™‘Q™UÕÝÕ@ýýÞKdfdeVVu¢¾_|Çï[3,yŠbër˜©‹:ƒô•Ýavý0”r)’Ô!" ¸²4ó3ì TÂJ0 "0ëëÌÚø[ƒ?Z¿ãê'M²}¢ïzn9}×ó'N¼õØñ#7vŽ=}Nÿ©¿Gvô¡™ÍøÝóS—Á_ǯšñ«¨3þ¡ p IDUˆ¢®D1Óò3ÿä?_G(<A™`ÀÍ0=AöƒIƒ1›3ŒóøÞ¿7úLˆµü,†GA–¦€ˆ#Uzko˜ì^î'¯¤úb RBˆ~$©B’–FÈMePgå  1ËJ^³Ú÷.þF#‚=aRŸ™í÷Sl?ÞKn>r²÷–Nž|ýÉ£‡¶÷ž{´1|æAdDzîÌÐ*c¾WÿJ”ÿ¦­¨2þUÀÿ,¡k?\Üÿ ßøû±~wÜüù·É½9vØ & ÆXlF̈¬Ô»ÎÕœ;ª÷’£#é.Ai -d«ŸfW,÷“Wwé à [5„Ž¥X’D (wo¡û¯‹ÊÖØÚYÍâë°^×·ä'ÒLßTdò7)m?1 ï9²ÔÛó'Ž¿íøÉã7.ö¢þóEÉÓß„êÔììËJâûuFÛ½Ö]Ï­§iù[uÝ:ãzªîÃ…ÌÂN€UÆßɇJ€¡`óDøc5e‚LŒ ˆ6ñg? à.»}ûJOö]‘UÉL®Ü©ê‡¼ÕjAJYÕmMPË1X>ˆyþ5hœ»Qk²¬ui?I/=&è-í8~p®ýc+Ž™kˆ'¥@Z;ãhZ‘ÖÐÐ0Þíj`¤6nÃ)êòýùÛ„âyDÃ}M~†‹:C}m'I_Ö&;‡ƒÎÂpù$'žZzzxl]îyÜŒ}\ *¹ÎßöóVVríI®{»nVODH’¤t/n–Ç1²,+ɇžwï®ÄÖòNœ8^¯zØöØõ^ÇùçžÁ(c3À€½ðAq‘Áÿ1t?zn擃pq‰MI’`8Î44Ù ¡÷ÂC øÈ­;o½ñܹqš¦×w†òzAbØŒ¢Cs ùw­8zt®!¿Kœtǵ×&P;bÛXmIBù+9 Ç:c|Ö¯½qÊU{¥†ˆû‰¾¸3^Ûéodzç0éÏ—"=ù ²ã‡ Ó“ëwãk0úáL¿ê™œ&iµ*ogøýçÞÍìÝy¾‹?Žc¤iZº¦¾÷I€;¾uëÖ¼ìÖ'8½^/TådÀ`Ô`³8àcþ;€_pîJ/JšÓÏè\™“óÌšèä$Ò#÷#=r?úí‹ ço½²1ßHí+ºCy…±‡ZqüD#’O´cù¨õôi­É‚ÜŠºI´£ŽLãXÉœFÔˆ¼nÆ7Ÿ ’šD£Ÿ¨‹º ®í§éåi’,ö½Ëƒî|Ú;‰lù²‡¡“õ•™ ë8#_•Xç+ëUqÿ¹tïç—¥†÷RwoãÈE8î²öCâë ²³w³ü°Ç†?»‰´Oüð‚ÿýi­Ñï÷™0S€ @/ÀÌzÀâJO®ò„³¸ðõþq×@Å Ì’€î=‹´÷,Ò#$ Ï݉hË‹Ï/"ÛûI¼„xµ 6„|ºLJš‘x²ɧš=K:N„¾æ’ÂñL¯µÃe’lU^ƒêû­z]ÙÈûÛ‚.”}Hj¢hâ‚Léù^’]9Èpyšô{ƒþåi–Î'½%¨´lùd'ŸÅz£J¹¯ÊøOJìsÏPUœ<|nüä»*c_G Âçµ*†ï»û«Œèþ÷¿o´Ã{ò¿ÿ½]BmÝw*„ÀñãÇÑív™0À ŒÏÁôÿŸ°Š¼`Ô0jÓl6s"àbžë­;€ìØ H‚Z@Îg<ó‹4j\ÖKâËHÈW "H!–#!_hDâ`CʧšlDò9Aº/z’Ѓi…§,% ]%¥[õ¥å[§O@¶×^.ÎOбÉTaK–a.Qúüaª.dÙåi’œÛϲ+U–ÆÉ ×È’Tâ þÓëϯ¼û5þÔ}¿“Þ8׿/NUgÔÝñªc«5þΘgYVRôß«*¯Áu8·ÿ4ßs·Û sl˜0˜Œâ›0ùàí«¹@U¿€qqÕðÛeV;Á“u%€ û;ïÀ (Ñ>²¹Ùh/ˆ¨¹Ð•ñeD&=@ ÙB$‘”'"ÂÓBˆ~CŠg¤ ¥Hˆ‘Ça C)¨o-½× §˜Ï{Þj¤4b)´ì~3Sº)lI•>Gi½)µe˜ém™J’L_¨TÚ̲l.KúȲjÐAÚ9 d ²åç¡/œò‡i%†\F}hŒÝL:œY×ÅÿýíР:W¼[ûݽ¶ŽpLcüÝóíŒèýr÷T÷™Ýÿ _XÈÅþ'õDèt:LŒ0¨Æ1ð—~Ày«¹H•7`"à'>¹W—0ëê/A æó‹ ¸ ’ ÈÖ¼ŒÛ‰sIÆ—‘ 0k H„‰ ê‘J!–Ǿ½Rq¦1OdJÏš”Êb¥tCk+•B« Z)dI:B :PIz؅ꟄÅé*P¨ÊP+âjè×~ß}ÆÓëjâ«jò}AªçÕ½Öw¿×y |"à“ðµNäÇÿþûÔ}vÿ»óÛ‡!µð3ûŸ»†(?àIþ¹clV0¨ÇQŸpÀ/xñj.–L…9UµÒ¡ûÖýø…`݉@éƒ(èþsHûÏ•ÇɤPëŒ Z[@Q5@$5$"ŒÎ4HÄÀ¤Ìô,Ö P :Kh¨t¡³ª{ :Ù:]Ú0Ì4]ùÆ í„ÍqÜó äÔ€ºŒ~Ûîüç2tý !¦iÉCQeðÃ¥ª~?$!Y©"?!Yò€üDU§Š\W€wÁ¨Þà‹üsÇØŒ`0ŸðWîðŽÕ^¤ê×ÿ óª* |#á«¥­kx`â³³½þsÐTgÒ 4J|CèìŒz@&µä×('4~îŸìU-U†ß¶Âûó×þó¨µÎ«/ÅëîÇm×eøsû‡b?uáŠ4Mk €/ž‘%?Põ™Ý²¼¼’€øŒ7àËüSÇØlجJ€+Å C˜vh­×MÓB¸ÊmzfAOX6>ª û8#ï:é5 ÄqŒF£‘oû$(”í|e¼$Iòe’ZÞ¸r@Qó&µ ®{ž}ââßû¤F]˜bššß¬@Iq°¢·flJ0˜]_…i9z€m³¸è4nüI.ݰóc}PW›?ICßõ¶÷¾#þßÌH'5ómßp††¿Îý>3U®øiÃHu=Âg2DhüýðUXèqŸÃÿ,ãH€ûŽ«Â)5í„™06˜¬ø ¸ @<‹‹®6ž?MkXÆê1N§J—?4úU†ß'k~{Û$I0 0óµ›ñûÆqÖÏÛ¤goœ\pÝëërB#_WÉPWÊ8n¬êxËaÀ$€Á°`°:tü.ÌÅ«° á:ŒSZ Q÷c8®‡žÒÒΚgmRŒR“ ÷Yªfþu•“Ô '=çá½W%húž€0á2øî™06˜Ì €oÃx$€—h®ÇM#àR…ª2©*#·Ò$¯ŽIÆ~-†¿j¦ï­uål¿ßïç³ýS&î´‚gk\I]øÝ†±õqI}uÆ¿êoæîg1¨#'U˰:À÷Ê$IžƦ€ÙÂU |ÀEv®Ç›ŒKàª+í‡Izôáqÿœ@ÆÕÜW%®ÕüIYý~ö¾[B‰Z7öcû¾ñ_ÏfO³ø«¾×ª×TÍþ«Œ]ýÿ4¢Eîº+Í ˜–„ÂHŽy`À8«ÁB@ëƒý¾#9ú¿c•*‚!ªŒ}US¡q?Ü“à_#œ}…õãuëª{÷9êîaÒ±ºíqÇ«ÖU¤fÚ®|þ,Ò?¿v?Læ›æóŸ.ø3ùºï¦J¢Ø¯·ŸÆX‡£°Ÿ@¸eÓ C…÷ë ½Ÿ€9®À‰'0 üϲ`Ÿ½<‹1Î*°`ýøÌFà:˜ź`¥Fx%?ÎÓ*Üó L36ÍRWêXe Æ%ô…ïÖíû³ûp–ヒqI}n¶ªúÖ ãBAu ‚Æu¬ë88n{ÒýU=›ãž??1Ðÿ<΃áÁy{g˜¬?NÀ„¾ `ÀÕXgÏËz“i4ïÇ›dÄÇõIÇ&Åö'þÐØ×5åñ{œ›ß‰÷l„„¾Ybœk¾NŒhÒ2­áŸöÙ Ÿ·p|™¬*tÞm¯p1€¿ÐçŸ6Æ™&§ÏÀ$ ~ë˜b¥nú•Äô§q©Îz©"+1úUÆÞ-ažƒƒïÚ÷Uúüå”ï„©4ù&LÂé_øSG\  1Ë7sÿïè?7UÆ¿îø4*…ã¶ýý:1Ž8Lª€ I€ÿ7¯ 7¸&ÌÇ$€qFƒsN=¾ àÿðC>à»ÖãMüï°-qU£!ÿµ«qņXÏóÆ%¦ùcÓ“𼪌õP³¾ª Ó:ýCþ&Œô—^@u³„Wx/€wØ1«çÇOjGÂïË‘©ª¿›Ÿxç¾o_¯¿j;Üs&‘Î$IF㤜ÿz½^/$9{öýÂÿŒÛnù®½¿êöãü“Æ8SÁàô à3þæ‡ûN˜ñ™cœ PÝ,oµ„`­“ΟTš6I¼&üüu=î' ÖŒû^g€¿„é>ùuÿÀóSœóM»|¦cåÿà¼Y=;.ä~wuÀ‘€ðïâwŸ„†¿*°ê˜»§:2W÷L»{B”: †$Á½OþןýñæÛÞºƒ“8øß¿¼wÇÍLg&˜œ^ðï|†¼Àëù†“0]ö|ÕvUbWˆ•›äÚ÷ú*·t¸øqejëhôÝLÿ÷`nÛ?§êø´ŠoãÚËNºçªñi“Ö¦y¯â¿ø%˜Ðó3¼îçíz&$À}ÎèÖå“„‹ß'ÁÇj ¿;VøÞ‰Iåž« †Ë'¾˜vŽýüöë_ý þ¯Â؈`pvb€7Àüà¿&˜žñÀüΣâý~mVó…uªˆÀjHÀ$içi‰@UN@HÂpÉÛ·à‡o¹[Îß‚ü'R£L2å‘€† Ä-KZf< âùÔ ³wûKoþÿ÷al408ûqŒGàM®pL/Ætgù=p¦bÀoÂ$”ΡºÞ¸†K+%+õOòÔ€(Š I`qK{^s v^~!  $@ P Ð È4² HIB‹&´5þˆ-  dɃ“GŽªa÷®í»nâvÂŒ &›ïï½ Àao‚Îàÿ€ã¾3o–? —Ãä)lŸÙƒ5¦M´šDVJ¦%Óx´8¡ú½×âºË/4†_ÚEè‚(d ™2H(Ѱ$  DMè¸L¶ Ò!'Í’þ]Û¯}“Ɔþû‡„`'Lþ€ØŸÿ ]ÁÙmð«ðOü:fP˜?LH€O|àÆWKVR"XE $Î?gïþ¾ÝØuùEæ„I D‘!‚ — àH@†,ÓÈ´„1tÔ†Ž=ÍAe)KÇŽªaÿ®m×¼ŒIcC€ #|.€iwzL§Bç%hØ‚3“œ„qÛ¦£Þ~cÿ·¨ï°·þÖ3+ Ì/: Xi‰àZgÿã<BFhÄ1>ô¦qÃUÛ@‚@$ Aú^)Ûn_ÚŠ€H$À=¦ÚÿL*’*M  ÈK lA7æ  ƒ^÷¨öîºäŠ«™0N 8À8•ÐvYZÁ9lüןµßó'1#‘ ü¸ãC²,0pîüp½’0À0M!Hà}o} ^óŠ]R"SÆøC“y:ÉÛ¶^(@2Ë[ ^hÀñÚ,ŸR hDIŠT  S6¨uÒ B+ yšsó‹¾Ãß9€m—¿„I㔃 ƒÁLçÀ9˜Ê€™ ” [øNÓÒ7ðîšáºŠT‘ƒa’B½ý|ïw_)T©»¥5ä MfÓ¦@i“ íë‰l•@ù³q’ Ud‰ñh+œ“€öÜâ´ïé'Å%—ídÀ8¥`À`0¾Ó+àí³º`Ußg¬ªZFûëiݺŠ “$ºýuøÞWÞ`1y·”Ä3þÈ’†! Öæ‚%0@{„À}hDÉȆÈÒ¬ð¨ Be@k+­öâPˆO=|ÿ·¯8~ä¹_½é–àþŒSÎ`0>ìpû,/ZÕ7 .)°.1pµ}2¥A‚ðãïz3nyåËEÆ3—¬PáÑDE€]›Ä@2 67€™<) påpI¥@šÉz8DšeÈ ¡¥Q DÔ69­s¡â9$Ã!†Ýå/dIÿC/¾æî$ÈXw°€Á`ø8 à.»=3à{B·ý8„0ÀÕå “D„Ÿx÷Ûð½7½2’Öíº4á@4YŠ,õÂ*3¥†m…(ž-œóÎaWê§þöÞK¯¾žIc]Á€Á`„8 Óbš°á€:ã†üä@ç-˜6 ”23"|äÎwà{_õ Ȩówù}Æ»¯s A9 ísËmsòP€@¢p%h ’Í*ô­hPßK Ì t´ÐX@s~Ëžxâ¿ß{Ùu/gÀX70`0U8àç¼3,ô=n¿Š„Æß'au@Õ:I3þù¾ ·|Ï‘%y_í ÀLèÊDÀ÷ø¤@ø$€à‘h@®cô@i‚4ë± W R@g69p~ˆðäCßÞûâkØÀX0`0uø:€ÔΔ8L£zÂp@¸ >z׸åæWZã¯rW¼oì‰tyð’íŽïþ·¿dP $d‰€({r"D}I‚Ì– á+*ÔÚŠf{~‘À¡'Û»ý²+™0f& c>cê>…u$@¹:`ðÃ~H¡Û Ýjâ§îz/nyõMÞÌ_Z#¯Ë$ ÷è<#Ú÷ „9%B€Â#@Ž (x_”ÉÊD ¢.0jêè Ô:V{Ïp0ÀÁï<ºwÇå;™0f & c>o×3 ª"!ÜŒ¿.$à‡ŽŸ\Â5;/ÇGîz^zÝÕ–$TÍüëÝÿ€.%šÉ½§zìv‘HÅB ¼eÏ@†= s$@å9¤3 µˆF³¹gH„CO=¹wû¥/fÀ˜˜0Œi0s¡ `< ˜äˆ¢(ß?rì8®»êJüÔÝ…—^w©6€›ùºùkÝÿ({ì›zž³6y~¢ pÛÎ àâÿ¤Í¶•d , H Ò"1*ƒTÐ>ÍFkÏ0IpèàS{·ï¸”Ic&`À`0¦ÅÌ…‚B!Ÿ*¡ ßà{ŽXÂîk®ÂÝù0v_w-”Mö£Â¤çÿŽºÿuÙøÃÓrgRqL¹ÒÀšp€È½ðÂÂgü…B„ˆt,…ʬ'@™P€T0wñÜž!‡Ú»mûv&Œ5ƒ ƒÁ˜˜ò@uÒðóB"†àÑGÃÛßúƒøÀïÁî]×Ú™¿1þUñýÈ7ýUyER ³ç0ºT6þ~e€ÔA/ç- ˜~Ã5D @ƒ.Ò4…²e‚pž­ hÌï¦ÀáÃOhÛ¶KX1±&0`0+Áº Õ5 ÷<ˆ÷¼û]øð]?Šm—\RÌå‰ì–¶ÆœªC4éšñj¯@©:Àó•·…ó(òä­±× B’èw¦ t60@ a©2`þEh4ö ¡Å¡ƒOýüö—~ƒIÆjÁRÀ c5X„© xÇ,/Z%ì·–RŽ?Ž÷¿÷¼ÿÎ÷`û¶mÐZCå²¾@ùÇÍñ‡â˜®}½/쎉@6XæÒÁF.XÚqÓ:ØÉûMƒ”)÷S)%@:4Ë tO"t%C(­¡)‚F>X·¡æ/BÖÜ‚A¢^P*Û»}Ç¥_âÇ‘±ªÿoü0ŒUâr_°}–­#RJ(¥Ñëuñ¯~úc¸ýmoŹ[ϱ3t;ó&ʳþÂЛ빱`]5Nžñ¯#òzx_Aåþ–-Òºý…» 6³û,$] »Õ_Fšô¡”#±!­EdóBµÎÅ ÓGU¦îÚ¾cwd¬`0«Åw| ÀÄ:©úK§ÐJý² IDATÓüÌÇîÆío¶lYÈå~ØX=.ÿ|?¸>M° ~ŠªŒd¨ü‚å¤@¿LPÀk9H@©:@ûùåEØäÀt؃R )›  U R Íöy‹Cˆ}‡ÂöíÛ™0V& c-ø,Œi›¹PëI’~ñã¿€×¼úÕh·[È”uûç' fŒ(ˆûS¹Ô(ƒÅkF¯ã^ïÜÊž«rfá'šžù~X €R‰ (“Aé° •¥&l l~@sîüÅhßáDZmÛ6&Œ©Á€Á`¬N(h]H@–e¸îÚkðã?öa¼æÕ7#Šâ|æ¯ý¬qVÚzÙ‰J%|£þT2êþuêȃ3üåA‚Ê_è%ýérR ù"A%± gð% d…'@OÀÀ’=RKT ¨ Íù L+ƒ1 |fn»3&×]{ þõ¿üìÚµ BÈ‘Ž~Å‹‹ MžhYýºÌÿIû(•¢è´ &¿‹`I#À òHt™ 8A›!t ÒȆ€Ö •‚T ¨Í… ‡3 `L & cVø"€ï𓳺à¾é¸ãÝ?Œ+®¼²ÐÎWy@imbï6c¯¬òGcgø¥ý@F¸äðKZ`I^N€Ù–%l™ [P$ úá»O$“@Ú_F–šZ+ÐÀ–ê …‹‡ÔØ÷ôÓ‡qÉ%LãÁ€Á`ÌÿÀÌ@#àï¿ozÃpñ%ç"@fÆmKìrÍ~?0_@“6ØžCAÀä?À'T\nbïîÅ‹ùkØóJéyе(HÕ%J D$€þ²dèZiÐð$ä’2စ‹¢½ïéÇq {cÀ€Á`Ì/`BAüÑ÷á¶7¿ çœs’$”à$=‘_ÇK¹…ž¿ ”“ùhÔø €FÏ<ÏÁæ 2 àÈ€ðBEu€ûlÖàK9š Op² Z’“Ë”JÐܲmq ç˜0Æ‚ ƒÁ˜5Ö¤øÓwÿs¼ê¦›Ðl6‘$)dd]þDev6ï ñE¹ºÄ‚è‚øf ÅÞTîÏ{ŸV® ÐÚô 'L~·@3&ܶ_ =]® Ž ˜uLèD–ô€,ƒV (Y†è}æ–m‹ƒháS‡º"ÓøÕKwlgé`F L Æzà(Lß”̓^¼ýÜñÃ{°k×.išÂ„ûÉhèg™¹œ%E6ÕtF´ÍHCëÑc¹FÀHL¿Jª‰AVÖ“÷bðI€öøDÂ,‘ñÀyz„lزZ' d ¢“J¡±pÉYëÜn~êà¡]ºƒ›1 0`0ë…c~Àk1¡2à†ë®Æë¾ÿl¿ø" AƒÐhIrQÊKœË_HKÜLß^X[/€Ûñ¦ýe1 šÿC”–K ]‚r·”ç 7¨"ùðI€ý7|àyH v,Ö)(é@h¨P í Þ9ôSíeÀp`À`0Ö_ðaŸD ¸áÚ«ðÝ/)æZèt–ó²8²KNˆ€Œd^8…¢ÜÁÇÛñ*á»û+iŸF<až€»l®K཰‰¾'À‘—'àˆ[\ÛA¿á$aH@NDNˆ²A*K uJ;½¢£`cþE{†8xèÐÞÜN˜& cýñ9Ó6"ÔŒ#\pÞVè,É'­[Þ5² odÛæ’_7Ÿò<BçBûð“rϺÎçí…±§)Œ I(%¢†   ¼­ 67¥¢°‘‚#‘´Þ€¨L@ÒT¨t­(ëBô (H@Ì$€€ ƒÁ85¨T $)î{è4 [Þ'@BšÅy8OJ‘€ „®¼­ˆIôX@më`Æah ï1XI Цö_h+ +èc’K!‚¢ð¥ ·HYx,ˆ\žÀ@@%}h•²Dÿ( 3Î@óî C‡îݾ}“€M & ãTÁ‘€ßÐvƒÏ=û:I)ARZ"à-$F€‰øÆ±ÐßBŒ¼¹±ÿer ”2ïg°Ë, düuìWå-ð «Òæ(åq]J°*‡yBA˜AD^µ€óŸ‚JûÐ*©Äà˜aAF+`Ïš8tèÐÞíì Ø´`À`0N%¾Sønð©gŽ Õ|R׿°!äyþRÏq>‚* µ®3+d t.‚PÝ(Æ,!ðÆrO@nüui_*ïb4®c{„R•%‚‘õ ¤}•ôL‰ J   íj&›L Æ©„ð-ž8„f³)#¹€ô¼& `ªiÀ“û-ÂBàfüuc® qi Ÿ ˜>Nd°¼¦RöAá)0e~™¡ÖF®Øý<`ǤS’®Bh" ´ŠAiÉ@ÚPÃ.t–€tfI@fû\¼gCîݾƒÃ› L Æ©F­PÐÃ=‰f³ !j–€™ËŒ£#ƒèA+e3‹qCÌX% ÈÀ¸5Æyv\î” ¼=I–`óhÂW°ñÿ¦ÌEƒ¤MLIB ;ÐÙ¤2ˆáIR€NÑ\¸dÏPÎáÐÁ§>´}Ç¥,´‰À€Á`œ8 ü¦xø1!!m’¹Ä@O ׄ`smB` $P" €P0âB¢H®ÓÞXCjÖ½ö}K6@¹±¤€ˆŒíŸÆþ0„¦e>q,€Q!‚ ÀÐtL— ;¶:`˶=C•‰ƒO>ñó;^|Ù7øñÜ`À`0NŽÂhìð27Ø ñàGÇ1„”ä*ʨšýû‘€|®/\Ù ( ]¼](+$Š’{¿@ ´OHçy~o"˜ h@©BÀ93(o* !(Tš„y^À‚õ‘D*$²A:냲ȺÝgmNÀ%ïР×|â;{w\vù—øñ<ûÁ€Á`œNðØ`«\êöñ<)Me€EY`±=L€Ùw s/ `ì»2­‚ýE »²Çì¾O$´MãË…€jÈ€ ¯€.*òDAmH¥•é˜{Lëc!Ó†$€¶ ̉°ÉF5P@£R  ú½gmNÀ%çâ­¿rð‰ÇõŽË®à&Bg9˜0ŒÓ/ÀX¶’FÀÉN÷=ø0d™ª sÈë €ÚŒùbTCÀí—ÕÈ]Š I¸A¾¸Š¼Üµ_C u!Tåð A~]³í<ä+)ç SÂH´‚¯•4M¸dÞx„ˆÈE:éÙPCÈþÓDhA-â­û~çQì¸|'“€³L ÆF@¥PÐÑK¸ï‡Le@  à'0Þ8æG €òH„MTPªè68r~ ü±Q/€JBàok¥ÜÜ?/'4dÀŒ 9ò˜ h‹‚‰´#¡H‰² Èþ €ÊÐZHs÷zü¶_ñ&g)˜0Œ‚ÏÃLÅ÷Á#Ï=Žoßw?¤”2Ê5ÜRR ôàÏüóµv³ka³þ=W€K$‚dCðÈyõýa{?›4‚&]á%õ jÚ–*CNòP€ù‡H„\ÅW+Ì™ ˆI éJ(†¤}@¥ÃcPKš Ùâ qÞ¾Ã=ˆmW^Ë$à,ƒ±‘ðEßà'ýÁç^8†zQÃ/…)¤Q}  η ð[äÍvD^MàW¸P€ë4hö‰Dnü `£êW”üéÑBÚë¨QIܶ»ŠR€3þ.(+ @†ø¬ MÓLè#· ‰„¬'€ H ’“ÀR†æ|¶8h.î;üÈýØvÕ.&g˜0Œ†`€§?ƒF£a­+»ÈU½v·œ¼v|íwÝóÃDPD&`Ç•09ÅÌžcñ~PN€zB`¾P¡RÊ»qïs æó® 1cHY $”BjòDº ,BS«Åaã¼}Oø6.yÉõLÎ"0`0 / F(艧¢Ñh˜Ê€@$TTT§Ö•¼þÀÂk9ì»û²ÚEÿmßCI}ä©ý’ø^xA> @Y8H@q÷Æ1!ibÞC=$ ¶[­'€„)tž2y"ëˇИK‡Å}‡þ¶]ý2&g ˜0ŒˆJµÀ4SøÎO枀іÁÖ#`4'ÀMÃ=õ=-¡­ð¨'@‘%6  HÛæAI@hô=©àü(•é¼q ä{ ì˜#E±CQõ …Xae@ùæ-æ;Œm/Ìõ ¤5:‡ÑÐÙâPŸ¿ïðßÀ¶ëndp€ ƒÁب8 àƒ0–êín°7â±Ç¿ƒ8Žóê— \y `ÝêB0ÐZTr¥vVyl-  rÀy4„*¼Êó¸äC­É6Ò °kä †ücþ¬ßéP¥œp‘àFËR®ñknç‚A±•΄†¢ Ùè<ƒ¦Ê{ñyŸ~ìþúË­þäŽË®àþg0˜0ŒŒc~ÀkáU,uºxèÀ#ˆœZ  áTáyæ$íþ)|îù\k@PÙày4Y+Næ¸Ù7žÒTJ:(|/%@%!€«ð^£La@ñAÌk-ÙY; hsçB$ÀµvùÙª÷,šY2Ï_üžAïxó‰Gì½lçK˜œ¡`À`06:¾#üIø$`¹ƒûly õ¼ªr*>Pް»²@< m8€*‰ŒŸ"(F¢†Pî ¼dÏík¢¯@® ¢røAxÀ\ͪúÆßû$&'`­$@­ó2$ÀIƒ$4YIæ´ ^pª{Hgx⑇ö^vÕ5LÎ@0`0g>cýJBAK.î»ÿDV-P¸p€ Â¥ä]ƒ‘IÛz×Ë Qªp€ÂËІ@˜ ½%ÅL¿fß'ÖsPʰ.Ÿ˜0‚=_ш B¬•Ð\œl°M TB@[O€Lû ä8²¥ ù‹÷@exòÀý{_ü’]LÎ00`0g œZà'œçŸ8‰¼ï~+ä«JÞ…™+̉@á 1š  •öÆ„5Ô:ßváí“p? ¨ Ú{M„J± `4”YñVàœ¢w„Ñ Ð¶ôR ¤KÀr†æÜE{ >ø÷{w\ûr&g˜0Œ3 Ÿ0à×ýÁŽÃ?Þw_Þ<ÈòÊi„ø¹9°U¦ÖÞI» Ï«`gý d»õÙxgü!@ÕXHˆJù.¯@eö¾smƒÂðÏ„È`‹0½l(@  ’IH»@ç0šsjÏ@g8øÀ7öî¸îF&g$ ã Ã#v¸Öìt»èõºØ²°`´<€.'f»®q9€_äç‹ùûº(1 ^ç¼ äéüA—5ŠJk=:V".%Ïÿh>@þú5 ùoÍ•s˜ïe} éB ¹[kÚy÷Oþ³ý÷þß¿ÒçÇtãƒ= ãLC¦Xí@ Ee@p³~»­ÉV»ë'º$@;S·•.DPòh2É~~é`èpç Èó JÞ#K Û<ˆP&€%³ð  ,,BÚP@*¬'`h=$€aÔ}v¶g¨Rwß¡¿ýlÿî7°'`= ãlÁýp+þ+ŸaOÀ{ ÆÙ§øÚnðø‰ø‡oý„^ïñ /€ß Ÿá[€Q ¬è h_gâÿ:ÓBÙÙ9„. Ù|9@=ü¶Â.ª¯G¶¡È–*êÜ@Aq¤BB›éÍ`H1há\4„ÀÐz4 n IèGC«Å¡Þ²ïð_ÿ>¶½ê­ì Ø`ƒÁ8Ûð€Ý®÷ûƒ–—–0??o„‚D…Z ‹——ÂäaÜÝ÷Ô{Jâ@ºì© ðöëò‚Ñíòyî½|µC—@0¢Gy2ãš!€¸ )DQÿ`ÉdlB.IB%m¥éÖí½ãÀÇ÷}–=§L ÆÙˆ¿@…F@·×Ãòò2¶n=qì“‘‡Š€;«\ê péÛñJ Ç€@+`Ôè—¯;êMµåŠÈß‹  Y$9`ƒ ŽˆØè$H=l+xß;o˺í‹ïÿÖ7¿1àÇõô€ ƒÁ8Q+Ôív¡”ÆÜÜœí"(<Ã_¥¨óóˆØgçAE€cò¡lð´$•ÞqÛÈcÿ!)å À#æb&QRJO  " íA¨þ\5ÞpóõW_õ¯jïþòÓ,|À€Á`œ­p$à%HÀ±cÇ „ÀÜܤ”žHPî€U |Ù=cÖt˜¬‡j€ÑÚüR€éIÀ(!¨>nŒz™8èœÔ(æ$`!CJi;&Š"Ô cˆ´©úh6ä®,S;ïÞû¾ýŸØ÷ÛLN18 Á`œÍ8 àÃvx™à±GE»Ý¶U¶QÕ$¢¢$0%{¶<‚ µKÞA0/TP$ 461H}(,Ô¥q¯AIhH—Ê ¡X†Ö¶•°V¢Â3 µé. í2 Ó·Ù÷NÉ$B˜E ,? –ÐÙžDgxê¯~ï¥ßóVî$x Áƒq¶£ à€7À+TJaii q£ÙlA éI£$T* ewµ.åÔvÔAï€ÒŒ|²û5¯©>”s¼û®!6á Ï— ®1$ "y¤H˜ëŠ$cJ€¤µ[+½óîݱÿÞ_ý,{N˜0ŒÍ€û<Š@# I,//çj‚D5 @HFëý 0¡€®Ò Àªrhä¼ò9U¤À­µÖdÅk9œÇ>ÖJ$D!g.×@Æ Ù© H–! v+­vÞýÁwï¿÷?}žIÀ)ƒ±YP+´¼¼Œv»f«•K T°«(çÊŸT7ª&£Æ|r@ÕX~Žã °ï¯ó{†wÞ˜ÀlòH@ıÛ)¼"EMó]&ËÈvk­vÞýÁwí¿÷×¾È$`Á€Á`l&8pg‘0 °´´„¹9«Hžl0\e@Ñ3 ,¨ýÁOô›- ¨ µ%ã½y>Àhbc~ßù^kr AÄ ››à{"ˆ¨e„Œ†Ë:Ý­•ÚyÏöì¿÷׿Ì$`Á€Á`l6T õûèt:˜Ÿ›G£Ñ彨Àäò ¯*@ei`5 PöÝjô<P—0 Í i#¬}± ²¾AQí`ÏÉÖš@Qô0&O,HHPÔ2ÂIén­Õ•?þîÛþü—~ë?÷ø‘]0`0›•BA½^Ýn N-ÐÓ~8€tž@~m}ϯê…P\h\ßôÅ9¥×;#Ž o@NT‰ŒP‰ˆØkžY^€ˆâ¼º¡Ð °$@H éB¨dw˜Üzç½ñùO}îY5pÀ€Á`lFÔ u:tº]lÙ²F£$äH€€[— |1ƒF GDzеïuÛOKª=(ÏäQ Ú#>Aþ}€(e ®BF†€lßò<F0¨©KæZ­×ßó£ï|øÞ_ÿ]&3ƒ±YQ+Ôéte™éÇ…B  B+€¼9`ŒB [ë1ò¼ºä-X9 Wh_?OÀi/' ÷hGtŠ{-lÿÚBB%F­½ rž€HzzÐV™ºõž÷ß~àÞßø}&3ƒ±™Ñðç0û–––@Dh·Ûˆ¢Øæ Ïp¦¥–½%€5¢¤«›û늄Á’€ñcÅ} Êcà‡.ü¼Ï ‚p„/°z@V^Ka" Š[ ÙÒ>„´U–ÝzÏûÞvàÞßü “€ ƒÁØì¨ ÒZcyyRJ´[-D‘Ì«D©{àh>€{Ï- (WPP—ïMѽN„ÕÚþö8@AS û‹{ÒžN€7ž‡ÜéP8`U !A9 0ž"'” !U¿­Tvë=w¾åÀ½¿ùLf& ƒQ#”eºÝ.¢(F³Ù„”ÒVP©{ q`‡É|UÍ‚<MÞ ÛmÓx/@é|=zÝ*b@c*êª̦òH@qLø¯™aH€„I™[F¾X‚¢& @–BªA[gé­wßyÛ{?ý‡LÖ& ƒaP/ÔéµÀV BÈ’À“ &”êñ0PÕü§¦‰P(ôS‘ÈG•m†§)/¼Þ˜VоgC;àŸ[!»°j@BHse"Û#A$@)=lë,¹õcw¾ùáú˜¬L £@¥PP¡Ø2BAy!ÓéÎU€ $åP@ h×=šðŒ’_€hÚ º~! @EH£lâý µ…ˆBF KZ ¨e©A[eÃ×ßùö¸øM·þÀßüÎWþ”ƒV& ƒQF¥PPI-°Ñ0$Àuû³³W ¨œ‡ÉQ¿En„©&¦O•#ö¯¯Ã~ºÈÙ«ì`·óÐBq,U誇u8Ež¬ÖÄ ‹Ok=ˆÆ@¨¤Ý’êæ Ïi^ùÑ÷ݾÿ?ý&+ƒÁE¥PP0@g¹ƒ¹ù94ã†×7€l’^Q@¤G’í(0®9I() Ö…FË c„Þ€q=ªDƒP‘@ݯXœïÁ£‚¸¬6/€ˆ ¥,îÒz h J 1Ü­³dçGßóæýŸø­?b°0`0ŒQÔ õz=tº],Ì/Xµ@QTÀë|‹‚F³&'@ë9j2]’ ÝF•d°®%õÛU!âüæ@P À‘#Ø(€†×cx…°$@›/RÃ’Ù0BY¡‡»µJwÞ}Ç÷â3Ì$`J0`0ŒjÔ u»]«¸`„‚„'Œ‚h ²æG¼Å:wÑF¼øãîõ…GêKË÷Q„¼{ö_«UQàõ_{o Vkrd@á 1(nƒD¨Rwë,ÝùÑyýþO|æ«L¦ù^ù+`0ŒZÔ jsˆ¢ÈäÏärÁe€².@9©¥x¥~È ª{ ®$ùkôOÀ¼{וMŒtÏà{|ÁIyí„el=‘­Hvë,Ýù/þ‰ | IDATÞsëW?þ[_ðã;á;寀Á`0Æ¢R(––—A ̵ۈ¢ÈkD¶c G‚Ê€rÓ dðÉ P™ˆ<Á×=¨Z£H:ôßOçm„˹99)Ý»õäyѪþRJ{é‚JAƹt0i ¡“ÝY2|ÉÛÞü†GíK_}šß1ß' ƒ1•BAZk,w:eµ@'œw,+–QTªòôØ›"Ïžï\­GÆËJ‚Õ¢A£*„º:/ ä ¨èŽX:^[ac~Vž(¤4ïkeƒ ˆ@qËä:ÝÕŒð޾çùwŸùÃøñ­ƒÁ˜•BAF-°gÕ¹Z ðÕas¨:V>ê ðƒ×"8¿dð­+ *¿ðì/ªåƒ«·Q»ïË›ÝÑ0ÆÈ=‚ •' !‹Û ×I0²‚AMšz0‡dùÖ»äÖ÷~æ«,T& ƒ1=ª…‚’ÄS 4BAdsœ6€3ò‚´Õ ÕÌ gÏe€²=%åyh”HxÃcUÒÀþö¨g€Fƒ‡Ú–A†aÿ„†ñ¬–Í—´ß¢G(j$ ‘µUÒ¿õî;˜T ƒÁ`¬ •BA¹Z`«m<Bäa¢B°ž€<ÛtÆ\Šé{3ú:ÇÊyå1Ÿpö#Óz\‰`ù•÷ž‹Ùó@X¹9"ۜɅ`I€r spϯc€ ƒÁ`¬•BAƒáKK˘›k£Ùˆ=€‚·wž%í¯ir´Ü¿y'Qi¬Æ;àH†FEÖ¿¿?*LTªþgªa”; ®49Ð'Þ“ðH@ ÕVIïÖ{8PƒÁX9j…‚úƒ:Ž• Žóp@Nàr¬›œü9_Ày&‘*ÿ3B*‰üäÀÐSPÎQ(¶ÇhT…Ê!cäóùàµ%Â’€¸ P Aº­’þë~bÏ÷þÏ->¢¿/Ùì1ƒÁXj…‚zý>:½.æççшF ç Üˆ ¯ƒ / äP˜LKJÛ”Ÿ^z]•Þü‹ -qxN¡!ïû:žðQ¥XPñÙÆCˆ°² —o¡sÕ@s½¢ÉaN û·àÛ¯ùWï½uÿ'~{s 1`0ŒÕ£V(¨Ûí¡ÛíbËÂ<q<¢PR ¤ÑwnüK¹46A^@aø)÷T“€ „à_O{× ßkd´w@I®X©È?¸#+K$„%%Ñ ƒâ&H6 ¢6 vé,ÙùÑþþýŸøÍÛI ƒÁ`¬ µBAnY¦0?×FìÔ]ßöï å(z Àp¯¬°Ž øÀìë‚x!Ï«@‰ƒUÛãö‹×—sªù°ÞÒ€p$@`efJ€¤!y>¢Í Û¼×Hh°[«lçÝ?üýû?ñÛ›“0`0Œµ£R(N,-Ckù¹6")Í,µÎ€Ñ0@1k'/7Àqí>T¤ôÙÓÉó&øÆŸŠc~hFݪŽå2C?ï@—B¶Ò«(P‘€ÕäÔZüÃ~G$#îV›˜0`0ŒÙ R(0žI´[MDRÚœ€¢2ÀÌ\(ÈÏ r]ükצ÷±{ÏšûÔøSî]NÑ"¨$Ú{9 r„¢7^ ùž`Å$@hH­¼Åö¥,’A:³$àµû?ñÛû7 `À`0³C¥PP®Çh5›Rx €TžÄfô¹±/u ôfòeÊàyJI~8À‘Œ¬s‚0RZè]²b»¼ïo‘ËW€o€ŸLˆ B`Zù`' dH@®Tè>—†Ä-€„V»µRWþ³·ßôç¿ôÙÿÒÛ,+ƒÁ˜-ª…‚’K.ZšÍ† R.€Q %…W ˜ýW†¼q¿ÚÄØûá€b=òwB @XŒ×çxG´éŸà‰A!÷Bo¬¤0­r ûd.W¬ó&!­j` ¡ÕîAŠ[ßýŽ·=ÿ«ŸýʦР`À`0³G¥PÐ0Ipris횤 a ¯É oŸ*…~È“Á­òï<ä“”I@•Wž¢tÉü¦ª…F÷tî•w(™s]‘ èú¬˜¸>! °ŸESµŠÐ”¸d˯ÿØ»ÿÉÃ÷~æOÎzÀ€Á`0fZ¡ a’`i¹ƒùv{T(È3þE‚ ?+§ÊX¾9&L¶;yñ|)‘…âz¡' ÈAõ”<^˜ ôø¨#ùÚ 8|?&üFBÓ˜0‘“— ½¼"ŠbÓMbDDm• n½ûG^wàÞßú㳚0`0ŒõAÀW\àZÿ@0D§ÛÅÜÜ\.$*J‰üò=îw?qÏ U„üf9äy¼|GÈ÷&xîò”„ü*„B¥°n  d :$0:ÓUáý‘HzÂæ(t0„i’ “ c’m•L¡OÿáYK˜0 Æú¡“¸Ae@·?@§ÛÅ–ù94qNÈU}@eß{h ÉzÊ®ÿŠ$AªŒ$ŽÉ(*¼s<’‘Ñ* PÅëÈ‘‡IÉd®,`H€V€R%é%"2ž€¨È„m• oýØ{ßøðÇó?Ÿ•$€ ƒÁ`¬/xåÝÞIšba®È z\ÿ *×üHb ¨L DÉ`ç Âè‹Z€ï (U"”¶ƒ’μ£Æ½*º_%Oä“kà'’*<ZyHÀ},#d¤ƒ›B¶U:xýk_qõÅ¿ó‡_ûBwÖ :›> ƒÁ`lP|ÆÒ} À¹þƒÏA³›„@‚mTe·}ê(kˆU1®ŠqhCªµú ”&˜Óò<yš\¿ywØiù™c…¡×ºPÔ¥ŠR%ž5únL)5ro¥Ùi©TP——Èo`ü¼Vš×D& é”    A$ â&°°‰VÔX<çü#wØ`/€ãgËCÉ€Á`0N >c¥> `Ñ j­ñÄ¡çÐŒcÓÐÆzl3Êf=ÈKÜŒEu]UAH{$À.öêPvrìfüÚÎæÑ/ ¾¹V1FÅÊ„ ovíìxÁ ò1h(­eÏ´·<ÑEíˆAäv gÚ$€ˆÍ÷%)¥H•ITdI€Œ¹sAQŒèÜÀ ãg `À`0§_p%€ë&iŠÇ>8’^f=ù ^…Bo•½Dº‚T/ nöO9 PD9 ðŒ¿ç Àˆá×佦Pþ']œ /pÇ•Ò2 ˯Yé¼ÚkXƒî/qÍŸ€`LŸ6çh 9L4Cª@ Š"2Ím…Ür;y MùOžé#ƒÁ8µØàfo÷»ý!yâ")ŒR ´Í0½hØSÄå©”lçêäu±mIiQNÔå„@ª'<^wœ x9 ® _™x$ÀyÂ,Â…çBŽ c”Û|ŸT'“€†´‚Ô)(UH”2žHIȨaV:ù]öïw€/žÉ"ƒÁ8µ8 àƒ0êvÿÀro€‡?ˆ8’t¾Ôëb¾”á\»*Jóˆå·á“€ PÑ´7Ÿ½;@5a€Àøûéx£†¿L\¢¡/ûï 4¥5 ²âŠdÃU¹€%Øœ€Rg¢q$Àæ4 a:AìH€Ž „†N ÷wß O~1L>‡ðå3õAdÀ`0§GÜcï~È?°ÔíãþGŸ4ž€<`4!Â2?Ò^e²ù­' –ÀyŒ¡TÚä"@[· Â$Akà=bPä Œ‚b¿œá@6o@Ù„F¢"$PöPmKdDðÊ' ¬- `óš¦*À‘€T)žîüÙŸý©9ƒÈÓÀ"Œ7GøÝ3ñ!ä2@ƒÁ8=èøsop±`0L±Üéa¾ÝB³ƒå½ÈÓ¶Ü„7û·ò·eQ ¯¤Ï*ÖöpžƒR™ 0çù"B#r¾ðJŨΕ•á•úÊ„¬w 0úÂïT4(°”Dh””ªÊƒôÊH+¥ µÂï+ø¿~ñßc~~Jù…m¯·¿3®L ƒÁ`œ>t!%€Þ A§ÛÃü\ÍP-Pød 0ÐÞX‰xÆU’€r‚¡»^±&|p5 ð‰C!6$FĆÊD%¡# äÉ#f.O0ß‘·_“2|bà‘(œxá~íw¾ˆN‚)W¬!7Ã$wîÇD˜0 ÆéÅýE•PPˆ^¯‡-óm4bYî˜7 r^1"þC›Éç$À4Ò!á<¢‚ˆÊýr¿z€Z0ê]¨ó ”üìVÉPò ƒ%àÖUáo; ¾öµ¿ÅûûÐŒãÜð+¥eYHÓr'Î À€Á`0N? ~ÌŒ2Çro¥æÚ-›è»ÿ ù]a ~ÉOTò ”H@I-° # ‚%#.*B Ó/4€Â3 F<åp€/7lö O€;Ž 2›á½f„„¡ ûø›o=bÊmìß_²Ì$)D`7€+`Â'6úCÇ€Á`06îð ‚ò@XîöA´[ DRæ²À£¡‚ÒsÕ†ž|#;aF_à…fABo€B¨$~³¡¢ü‘BÃ>B, ©Cï› ’ óEáé'žÆ³'¦Oƒ(È‚ó8O€óðRïð€6òÇ€Á`06° A÷@¥5–»}DB ÕŒN€ðCÖ ç(Hy³ú’Â;&ÆyDÂô ¨è@85  *ày& ††Úl-†(h<Œ´Q®A¨$½xøà14âq#Š"HiÌ¥ï¨É €­0Þœ6l#!& ƒ±qÀįp ͺ½>q„VÞ; ¬pD@@éT?)pÔ `Y[P"¾®#4eN@e^€—à…|/D˜øG¥vÄ5Æß¡Ô@¨Š qððQdÊ$[FQ„F£‘“ò¼ . Kí…s´aò:Æ%L cc¡‡0L3,w{h5bÛ;@X· 2Hè#¹¹K_„‰¢\0&)¡—TV "\s, [ðª( a¸ãþxÉ ¼µÆàÄ1œìg†`ÙïWJYIœÑϲ,÷ØÐe‚L cã¡૾¦¼,Ç Épr©‹¹V­FdCu$@Úøµð ä¨ñ§Ú$ÀjÍ€ò¬ÝË ˜P%àôR¬$ ¦„°ˆ üÏe8ë&zc@u8 YÂ3Çú%ãïâÿu$@©B Â°aË™0 ÆÆDF#à-šþAšY¡ šq!dH¬05úÂ’€’qöjúKåƒ5••zU•‹Ñõ(!¨ ÉÝA¢ ÊI„AC)l@~g%íïáàá%/™RŒlK)Ç1F>æà7 ¦LpCU0`0Œ‹¨ÑèS#Ôn¢É€ðãû‘'O hÔ ’‚1U~\\b`˜ÍO5ÛctêHAW’ŒÞwówD@ñÔãGÑOUé{ô½a8 ¶!¿BÀ÷Ô€ U!À€Á`066œFÀ¨PÐ År·‹-óN#€ «JI€¤qïSe9 ÝãCé` Bã©¢¼o G \xCSÙ°–Ž„3„Ò ßyøY<¿Ô¯þî<ãï…$ Ô ðs"°a*˜0 ÆÆ‡#·!htߤÈÒ í¢¼ùmÃ!ÆdÓïEøÅ€îãE…Ó\C"`Ó EŸ€Ï½yþ`$„âú ×# ÞhX¨Ž­kM4™ˆlð2“s¢ÀJ›Œƒ`tð˘Xå;> NfLÁ˜áD¼øòiyìqší±™Ü÷wSú³àgüšû:y-‚¡6A×9Ðí<tü$ð4ÉvÀÜBˆë‡&pŒ@& ?Òh¶)—Lâ„€Ž¢Ø± öVÛfÒ¨f˜ èéðƒ÷X0LŠgïß/ø#ûo:¹ü}Žþ÷1š­vüó9ÿ¹×þm÷yÓ2¡l@¹\¦Z­¦" Žã ð ˆHŠ<šçE@!®/Z$·áwôÔê-ª%ª•2&ã¬òmð7£z€à¾½× `ÛíŠÜ}g>•?Yh25Yà ‚(ùNœz™‡¾òÍf{¢èŠMüsB[îm··ß>6M ¸#…K¥Rêà>ß oÐ-ÀgƼ~(Bqýq x•œöÀííG+TËeL<ªþw»¢(µ ޼•ýdM€´§‰GP$L ‰Lë`Ž(Ȃț˜•K¯óЗþ‹Ííñ”v?ŸY‹‹ž;ë$Aw;À&èõû}W,¾Û¹  „×'¹íÞ€Z½ÁÒb•JÙfÆ{ÿuqì Ô ø1[_¨a4‚o"àïù2Y·•Л˜•ÕK<ðÈ—Yyý‡”K¥ÌQ´’wñ÷õC×yÏÛI› Ÿ ¨T*c2ÙWôz=ƒ¾sŽjµ’˜w"üsf) œ&"Š2V¸]¶00Š"ƒëë묭­±¹¹Ép8Œ€¯0'?€’þ»Bˆ‚uàÏH\å~Á=Ðí8é •r‰8.aì˜àxävÄ0ÚHVüè÷GA~ ðƒqÐ6vhÅÆÕ(ý?C•¿1F†ŽP°§&ÂãÂÅîûÜý|ÿÌŽ,.¦Æ9ƘÝ݇Ù;Ò?Çkœö¸­ú·×Õj5Mù—J¥4ø7 –––ÒmÑ¿óÖyý ”Bˆ‡pøu¼Î€n@½Ñ ZŽY¨V&†%"`l!l\Ë`»[Ÿ7Þ׫ÜÏfÆŒÏÝwWÏÆÇOœà3÷ÞǹsçX¨V3çíæö,÷‹ºŠÎw{úÝsCÁn;àp8ÄC½^gee…K—.±¾¾nÇ_dN…€Ê!ÄÅÃ$‘÷ÓÀÍîZ«Ç+¯­Ž*ÑãÄ#À_ýGqº@QŠ""»úïœÀnÆY[´7â}—A4Ĥ±6J<üa”ÿŽçžÿ¶··©T*™àê¯òí±Ýf¦µý¹×övhÅïÞ÷ÅqœVþGQd<ƒÁ€V«•Ö˜¬›áûæõCBˆ£À¸Ol7»,Ÿ½@\*9`|¹‚ ¶p}»§o·™Õ¿1Ã| 0„azp˜üo´Š~þùãüÛ=÷°µ½MÕ þEAÝõçß©m @¸. ”æïglÁŸkIñß`0 Óé¤Ûår™n·Ëp8\˜×@@!nL~ø„`£ÞfùÌyJ±ø Ñh\p’H2® ê;…ý´ˆLúÌpÔ*`ˆ3n—d%ÿüñ¸ûî»ÙÞÞfqqq"øïtÅ?‹hƒÉÕÞŠßÏø¡T*ù~ÿ©hµZÔëuºÝnš)ñ3Àk{ýH!ÄËßo~Û?°¶Õà¥Ó¯f&×E®=°‘ñ&ý¹Å€ýÑ«¹uÉ}c’µ¾¿nchwÚ|ãßàþû?ÏÖÖKKKišÜ þ~0Ÿ§ ðïçú…Ž…°•J…N§“Ùû·â£ÝnS«ÕØÞÞ¦Ùl¦[#nÞÁ€Š…âÆ¥p„p£Õ¥×ë²tdR©<šè:Žý"Û6ž[Ÿï éê?Šð"ÀÄ1n—¯}íqn¿ýè÷û™>÷bKŸŸSDXt¼èvèX^Ê¿èyî*ß½øÁ¿Ûí²¾¾Îêê*çÏŸçòåËlnn²¾¾N«Õ‚D}xa¯_¾2Bqc³ü Iìý˜põuª•¤=Ы8N3Dl=€»òïg}\3Ÿ´µ/Š À˜(‘1\½z•cÇŽñ©O}Š¥¥%¢(¢×ë¥Ïq)ÊìäxÑíÐ1›‰m¸øsìøß^¯G§Ó¡Õj¥{ÿÆ›››\½z5ÝüɆKóøâ%„B\þø5¼¢Àþ`È…KoP­TÆ«U¯;À5 [÷'2ÃÆSóÜÕñÆÆ>ø Ÿüä'yÛÛÞFÇiðÏã D@(KüC‚8ŽSÿÁ`@¯—X1ÛÏ Š"677Y[[c{{; ý~ßïÇ—®-!„1œ({ ¸IDATP0B¸7R«7(—cªUbãNŒ²[®`WþQäüÉÔR©Äêê*=ôwÝu·Þz+qô\BÛE©ÿ½läÝž¶àZþÆq<1þ×Ö+´Z­4ý¿¶¶ÆÆÆW®\akk‹Z­F½^·/Ù>³×/\!„–‡Hêòþ¸Å=Ðhw9}î"•r’ ˜h ŒÜ,€køÓ÷<&Í~†Ã!ËËËÜ{ï½<úè£Ü|óÍ úÖe°7àϺêßéê0jÑ flà/•JéxßR©D¯×KÓÿív›v»ÍåË—©Õjéö@·Û¥ßï§‚Ñkþp¨ïåË–Bár”$¸|Æ?PkuX>óêhn}bävŒÛÇŽù#€“ÀØét8yò$wÜqgϞ妛nJWÄ®9Oá³mr»y­;ñíýÛ×°Á¿×륗n·›fºÝ.N‡Z­ÆÆÆ­V+½Øs{½žÿ÷÷úEK!„ðy˜¤ p¢(p«Þbùô¹Ä³~”0qœ„3A0‰ùþ俤ÒccƒÇœ;ï¼€J¥’®ŽCä Ö±¸" äØwj ʸ…î1cLôm=ƒümFÀNý«×ë4›MšÍ&ív›n·K·Ûõý†H!„Øê$Cë[uNŸ{-ñ(9 S·¢( 6Qa€ÕÕU{ì1î»ï> `w:”Ȉ?Àïu[`–Œ€M×ÛûnÐã8 þ6õo÷þkµFƒF£‘6 à‰‹#À"I箑BbøSožû/]¾ÊâÂÊÈ ž4 ò·ˆ0q’ò?qâ<ðÏ=÷094ǯúŸVÌçãNÔ›‡þiuveoƒ¾ü£(¢Óé¤{ýF#uÿ³·[­N'Í 8Á+ÔÜ B!òXþø IáY†s_§\±Nvž[ ShŒ!.ÅÔku¾ûÌ3ÜqÇ™×q Ül€µ€~p ¥Ùýûö±8Žç"vš1°“/\ »ª·Å­V‹f³™ÉØÕ¯×Kmƒç‰€Bˆ"^þ ¸Ï#`œ=¿J—ÒáAc‡ÀQK`\b0ráâEž}ö{<òÈ#Á7 ‰€iÌÒæ7-øï¥h0tžS©ŸŠ?øÛ`n}lÀ {Ýn·S¡à}&“³”w€BˆiÑXk´øÞñéöúóy3' Ìä 8í¼YEÀN¶B€îêß³ßà ›°.€ö|/°:ÏW@!ÄN°Óß |È?8ÏàÚ €Ù}òæìT䉢 oÛýàï®èí°ŸN§“öþÛ‹Û(ŠüÎ<>c !„;å*p'ð‹$B`_ðE€»çïþä *b·"À¯ö/Ú÷·ƒ»Úwí€íc¶ÐÖ¸ûÿÖÐàü<>_MB±NgãΛ¼jÿi]ybÀöêû¢a'×éÄ€-±odWù6 w:LûŸ øîm{N»Ýö3—€D5B!®!¹ƒƒæIÈ#ÀuÆ›µ6ÀÞŽ¢hbxÐN®í¿)¯àÏf*ìÊß¿X1`…ìmð·—@úÿæ iÁß úy·mêßo/$Iý?=¯ÏR[B!æÁIú‡™Ã¤ºiä­ø‹Rþî9þy»)øs_ß ünµ¿[üg{þC«~WŒ,G»æõ* „b^Ø™vÁûoÓ=fép3¡¿ÿ~nñŸ üý~B„¾ŸÈéû·|užŸŸ2B!æÉ2ðóÀû÷û¦µÎRø7í¹y+×þ×Nüs­{ÝÀî®üýÇÝ‹ëøXý? Ü´çõù) „bžÚÏõ Üaú¸à<üŠþ¼ý~{Ü|›ºwWÿî6€Íø÷íy9ûþ–6çùùI!„˜7…vÁó$$,¡`ïöÏóWùEÿnÚß}÷*tÛ}kà‚àÿ2ðÔ¼?;m!„ØZ$Uë¿ T÷ûÍfIé=Ï?×MýûçºßèE†?îªßÏÿ&ðçÀóóþÌ$„Bìf »ï ÈÛß÷÷ÿ![í_´çïùù+~{ßÍ0äps¬üw‘B±Ÿœ~|ì ÞÌ ö6¨æµö¹Ï)jt͇üÁ>~¥žð³¶àoJðøI6eîH!„ØoÌ.&3¶NÀ?–çÊøiÿYƒ¿»òwkfþoœÛ¯ÏIE€B!ö›³ ¶øE® ½v/ý~?(¬€õ°ܯöw·|/ÿ93€¿c޶¿!$„B×Ä.¦w但 ØnñŸkúªúÝvgØË”àÿ/À§÷û Ñ€BˆƒbX!i ¼&EÓŒ‚\¬ðÓù¡6?wåï¦ûÝÀ_`òãrŒÄG¡¾ßŸ€Bˆƒä¥ÑõGâÍBm|öv^‹ »úw]úüÕ½?ðÇnàŸ1øÿ/ðÇ$ûÿûŽ€Bˆƒfxר(Ð>¡q¾y©~7àûÁ?ä 8…¯\:¨/!B!„8xn!™n÷¡ƒx3ßäÇC©T"Žã`¿^Àv]}—@ûØWýTúÿû\ô7ñ™è7(„âñÀH,ƒ÷p€‹Û:š ðEÇ 8 ü!ð­ƒþð%„B\Knã€ÆA»_Wø;t?øýógüp ƒ?¨@!ĵåÀÆ[ò¦ýùiýÐã¡s\f üpƒ¿Bñ£À“Œ>°KEcLð:×^vñÞg€_Ö×.„BÀÏ’x ¯Õ¥(Èï!Ø+ø !„Sø]à*×PìóEÁ_!„Èá6®O° üо^!„"ŸßÖ¸~‚ÿç€wèkB!¦ó7þÀßn*ú:…BˆÙ¸…dzàgð?ü–¾F!„bwü4ð—À³žàÿ0ðKúê„Bˆ½³D²¢þPãG3ð>”õu !„óçÀ?ß^z(ðïÍBqX‰€·ï" ÀÞ Ü::¶_1net9|ø*Ð=ŒžBq=`ÁÛà}$Ù‚·oÞM2thÜä=χ}Àl5lI¼ûWIFö>ɸMñPXB!ÄÀOHDÝ®ŽŽ p…$>®ÛÀ:‡<Ø !„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„B!„"‡ÿ(ú!VzIEND®B`‚sleepyhead-0.9.8/sleepyhead/icons/arrow-left.png0000644000175000017500000001752112412506713021252 0ustar sergiosergio‰PNG  IHDR<<:üÙrÓiCCPICC Profilex­XgTͶ­î‰ 3䇌äœsŽ’£ aˆ’“‰‚( "Q%ª "**     ‚Š€ ¢Hø¿µî½?ÞýóÖ«µº{wÕ™š®Þg¦ö>°Jx…‡Ãt„„FGÚë‘]\ɸI@ Ѐ p¢%*\×ÚÚü×¶6 ýÁÉý¹þkØÿ>@ïãE²F†½}¢(!nB°%<2ÁŸ,Ž``¦Hä̵ýÿÁ2ûØûlð7ÆÞV‰qOôòŠô€àƒô“Rü‘y`B}C +A°%À g™@b$BBÂÌŠF°¨÷ÌãÿØËËû_szyùÿ ÿ³ä“ÈF…{Åÿ½ùÿ<…Ç ïëoÛëDßP;äÊ€\@„`äˆd`Ü퇬ý°ðøÈ@ÿ€h².Â’¯Ù4”"%A–“‘•ûœïǰbû—Kˆeðß}”%TùÀõý»/YX½¼½ÿó:Ò‘yôŸùö_#À E²‰ð $Pê@3`ì 8 ( „ O AÈ9à(A9¨5à&¸î‡à)è}`¼“`Ì‚E° ÖÀA8ˆ1Bì/$‰Cr ¤B-äyBþP(%BéP”]„®BµÐmè>ôz½‚Þ@3Ðô Ú„Q0f‚¹aaXVuasØv‡ýá8΀ÏÂ%p|nŸÂ}ðkx^„WQEbAñ¡$Q*(}”Ê凊D%£²QŨ Ô-Tª5‚šF-¡þ ±hF4-‰VG› Ðt:}}]ƒnAw¡GÐ3èeô.†„áˆcÔ0¦gŒ?&“‰)ÆTaš1Ï0¯1³˜5,Ë‚Á*cM°.Ø#ØcØÓØKØìì+ì'ì*‡cljã4qV8/\4.ww÷7Œ›Åmà©ñ¼x9¼ÞŠ?Ž/Æ×áÛñÃø9ü••••U4)4¥4-4Ã4ßi©h…huiÓ&ÐÓÞ¥¤]¢£¢¦Ó§ó¢K¦+¥»O7N·JÏH/KoEBš¾Žþ9ý<ŽA˜ÁÁ‡!ƒ¡’¡“á#ŠQ€QŸ‘˜Îxñã,–I„É”éSÓM¦¦efffGæ8æRæGÌÓ,(aS–`–\–;,c,›¬Ü¬º¬¾¬Y¬·X‡Y×Ù8ÙtØ|Ù²ÙØ^³m²“Ù ÙƒØóØï±¿ã@sˆqØpÄr\æxƱÄÉÄ©ÎIáÌæ¼Ãù– æã²å:ÆUÉÕϵÊÍÃmÌÎ}»“{‰‡…G‡çO!O;Ï/#¯o o!ïcÞ¯df².9˜\Bî"/óqñ™ðÅð]åàÛâáwà?ÎßÀÿN€  "à'P(Ð!°,È+h)˜(X/øVˆJHE(@è¼Pк°ˆ°“ðIá{Âó"l"¦" "õ"S¢$QmÑÑ ÑÑØ*‚\:0$‹)Šˆ•Š ŠÃâJââ—Ä_I`$T%B%*$Æ%‰’º’G%ë%g¤X¤,¤ŽKÝ“ú.-(í*'Ý#½+£(,sMfR–AÖLö¸l›ì/919Š\©Ü¨E¾Uþ§‚¸‚¯Âe… EFEKÅ“ŠŠ;JÊJ‘J·””•=•Ë”ÇU˜T¬UN«ôªbTõTSTªþQSR‹V»£öC]R=H½N}^CDÃWãšÆ'M~M/Í«šÓZd-O­+ZÓÚ|Ú^ÚÚut|tªtætèѽ¡û]OF/R¯Yo]_M?Iÿ‰ÊÀØ Û`ÀÁÐÁð¢á{#~#£z£ecEãcÆOL0&æ&y&ã¦Ü¦ÓZÓe3e³$³.s¢¹ùEób‘m–°¥™eåÔA¡ƒ¡ïY+S««wÖ"ÖÖl°6Ö6¥6_lemm{ìí<ìêìÖìõìsí'Db:iÝk× œò¦¥“œû\8\]Z]q®Ž®U®«‡ šuStËtsqs~˜ãpðáG´^w=1žNžužÛ^V^^«Þ¦ÞeÞË}ÊyÊ¢ŽO¡Ï‚¯¦o¾ïœŸ¦_¾ß¼¿¦ÿB€v@qÀR ~àÅÀŸGLŽ”Y² ªÚ v nÁ‡x†Üe í ã ‹ {.ž>¡Q±iYE¹GµF3!›kŒh̉˜™£ZGKnÄ:ÆÞ£ ë‹ÏŠŸK0J¸~ }Œr¬#‘/1-q&I7éj2”ìÜ‘"’‘2›jœZ“FH J{y\æxþñßéNémÜ©ŸNŸ¨Ï¤ÉŒÌ?©~²üúTà©,ù¬ Y»Ù>Ù/rdrŠs¶OSN¿8#{¦äÌÞY¿³¹J¹—ÏaÏ…žËÓΫɧÏOÈÿT`YÐRH.Ì.ü]äQô¼X¡¸ü<á|Ìùé‹’Ö ‚Î]ؾpñu©^iCWYVÙú%ŸK×u.ß*ç.Ï)ß¼xeâªñÕ– áŠâJlåÑÊ/ׯõ\W¹^[ÅQ•SµSZ=]c[ÓU«\[[ÇU—[×ÇÔ/Üp»1tÓàfë-É[WXrAcLã×Ûž·Çî˜ß鸫r÷V“PSY3csv Ôß²|/àÞt«Kë«ûf÷;ÚÔÛšH=¨~È÷°ôó£ÜvB{FûÞã„Ç«OŸ,=õú©Ã£c²Ó¹s´Ë¦kà™ù³Þn£îÎݞǽš½Ÿ«=¿ÿBåŽ>¥¾–~Åþæ—Š/›”Z•[‡T‡Ú^i¼jÖ~:b0Ò=j:Ú÷úàëWccãnãÓ>óo‚ßü|{ôíÖdêf*ûÝ»â÷\ï+>øÐ0­4ýhÆ`¦ÿ£ÝÇÉO”O‹Ÿ£>oÏf|!})žã«—›¸`´0ôõÐ×ÙÅðÅ­¥Ìoôßʾ‹~oú¡ó£ÙyyögäϽ_§WØWª+üîXµ^}¿²¶µž½Á¾QóGåOÏ¦ÓæÜVì6n»dçÀNÛ®ùîÔ^ÈÞ^¸W¤×_-€BΰŸ¿ª ¹À8„h1š4ÙßPˆ¤ÿ*v "@+²§;A 0 |ʼnz€ŽÀ¨aiqÔx.*sB6õéÍgºteÆ%æÖ8vCNW'O™“¯A@Z°Z˜(â!Zzà•8ZB^ò°Ô9é.™M9)yo…ÅgJk*ªnjYê-óZ,Úº:ÁºEzíú †ŒFZÆ“3¦Ífæs³–s¬æ¬¿Ú,Û®Úm:Gœ3“ ›+ß!a7qw©ÃR’ž’^bÞB^v_z?‚?ð_ X\<2ô!ømÈxèë°Ñðሱȩ¨™è…˜ÕX8Ž6žœ Ì4Ñ;)!¹ ¥1µ3íÅñÁôÑŒ·'f2çNþ8µžµ›ƒ9M{†õ,9WüœRž^¾Es¡OQTqêù³%eê/Þ/}Y6}éO9óù«ö1•e׺¯ÿªæ¯±©=^×T¿p“÷–}CVã“ÛëwśܛSZŠî5´ößÿÔ¶óõ‘L»Ùc¿'éOË;îwŽu­t3ôH÷Z=}‘ÝWÝÿìå—AüÐ+aÇ‘Ñã¯óÇÊÇoL4¿yð¶c²gª÷]ßû—†¦GfÞ|œù´ðùãlÛ—¬9‡yžù/ õ_ƒÅ–Ê¿Ù~Goüáüco¹ü§öÏ©_±+ô+5¿µ­®n¯å®ó­7nho üqÿ³´¿…Û:¿-²Ýºc¾3½³‡ßKßÛCøG#zVØ"*°b‚< {0œ‡bBÕ¡mm4Å ã×rÔ§ˆ»4‰t4ôƒ˜É,ØJ9 8¸Óx9‰oÉ?¡ áó"¢ušÄ:ÄG%楀4£Œ¨¬žœƒ|„ÂÅJ¥GÊoUVԈꂪšVZþÚ):º×õÚô_Lµ_5É6 7s27°²d=ˆ:øÃjҺצٶҮÐ>Ã!ÆÑ×ÉÑÙÄEÝUꟳ;µûÞáYgž×½2¼½)Z>œ>¾ã~Íþ…G]h “‚ÿ„| ëïŒhl‹ºÝsûè•Øœ¸¸øÀ—c‰šIòÉ¢)\©Li„ãðñ­ô•Œ¥3'N¾:Õ“Õž}7§ætÅ™ú³s_œ›Ê[.@rÉ[œ*ɹpûâÛ2ì%¥ËAåׯ|¬¨ ¼Öt}§Ú°&¢öT]eý“7Wè%n›ß ¾{®©¥yê¦Uö¾g۹ݷÛe¬¸òt¼c·‹ç™v·gOFoíó?û¹_ „^†F”GÃ^׌}žxãû¶zrrêç»ÍÐ4v†ð‘æé3q–ðýegnu~qáý×áÅÎ¥–oUßK~d-Çý4ÿÿjY úÍ÷{bõÌšÞÚ’~¸þ ofoénmlßÞ Ü%ïŽï…ýåF+’& œ/ ,t*GÔy¼€ŠG³¡_b ±Q¸|"Ua’(NÊ£Y§  ŸdÔgªd^eUg c/â¨æ¬àÊåŽâ±ãU"3’ð òß8'-d'¬ Â,²":~ U¬HhœÕTלÓ*ÐÖÖžÕ9­+¯ûF/E_P¿× ÔɰÍÈË˜ÊøŽ‰»)É´Û,ÓÜ‚d1`yæ …ÞªÓ:ÙFÉæ§m½¯=¢JœXœ&œ/¹øºJºþ9Ôå–ínà¾}¸Å#ÂSÂó«W­wE”²àSïâ'í÷Ë¿9 !P-pûH{Pr°vðNÈÃЄ0•°õðÖˆc‘:Q¸¨Áè’Ÿ£ò±èر¸úø´çcr‰¤Ä…¤žäë)™©”4ƒãBéØô¥ŒñO3N^9•Ÿ••‘“v:íLÚٌܓçróòò/\)¬,ª*®;·dôÂïRæ2¥K®—Sʯ]鹺RÉuÍèzlUMõx-©Î°>ùFÛÍ? êI·ßÅ7Ù7W¶¬µZßox@ÿ0áÑÂc·'£¶#Ϻßõz=_ê‹~ NѾ*}ß–¾›Ñü¥Õ½mæQÆõNúnÔsÖ~ÃÁ“ßÇÌÞŒ¼óœ¡þül>sÉeY`åûú­ ¿ÿ,H…Áø#쟷À3ðü€Ð$pï’¡¨j‡F¡¯0³Á²ˆÏ÷…ÓàKð#ø¼‹xyTêjFk¢ãoþ#‰Â4!Þ[›†íÁÑã\q×p¿ðºøsø*Eªlª‚:¡˜ð‹Úšº‘ÈDŒ#¾'#œËÓÜ£U§í¢³¢{CïO¿ÁÅÈÃØÄdÉ4ÏœÎÂÇò”Õ‡Š­Ý‰æhàtç"r=å>ÅcÃËÃûƒÜÅWÆTÀVPNˆ^hYxD¤E´ø@‚˜›¸¦Ä®ä{©é«Ó)r‰òÇbã”b•UUÓÕrÔó4.kÖhµjwëLé®é“ Ä MB‹LÚL‡ÌÞ›¯Xb²[IYëÛ8ÛFÚ°/q¸éøÈiÀù½Ë7×M7Œ;ía6²§°—¸·EÉGÝ×ô/Ë+G$ƒÂ‚C–ÃÃ"FîEëÆ¤í£Ž·LÈ=6˜Ä˜l’›:rœ5Ý5£ìÄÇ“ê§*²Ñ9§ÇÏjçÖä1ä§,Ùw”È\(¼¸[|i¤\ãʵ beÔµ7UZÕWk©ê2oˆÞüØPq;ð®bÓ^ËDks[Áäö'ž‡º<º)½‘/’ú‹j†º‡ç_7OäO†½·˜Qþ,0GøŠZÚþñûׯêïÝm†¿üÖH%)4‚—`‚!.H ÙAü¡¨ºõC_`æ…µÊN*| ©ä¬¢øQ¨³¨~4-Ú]Šþ‚‘äa†°‚Øì0N —…ûŠ?ˆ¿CÅNu‚ê'B¥6¡n'ªïdIÍ44Û´utžôlô“ ŒáL&ÌB,xä·<Ã6Âþ‚£‹ó W+wÏIÞh²?Ÿ¿—€¿`ŒPºp‰ÈmÑÞ³â@‚SRAÊJ:@&K¶Gž¨`£xAiZEL5V­[ƒU3Xë™nºÞ¼£a±®Éc3}ónKÓƒ/¬-lì¬ìûÍœº]ô]Ÿºi¸ß÷PölñV <ôÕôë ° |dÜjÖ¡Ù-SK—ÿë˜wâ»dÛ”¾4ËãCŽ'Þþ¸Š¬»©rëBßÛÎwš›¨š=Zš[ñ÷Ú*|{¤Úžú¸ó)¡Ã²3¿ëu7KGïÕçŸúDû#_6 왽*þ4*õ:zìþôFïí‰Éîwð{å~Óù3÷_²;ËþEzNoÞ|Áæ«ÍâÁ%³oªß…~¬.ülü•±â„(ˆ¯«kQë ëß6ªþ8mb7›¶\¶v·+w wæ÷öùò“—Ûß=DÔCÊï÷öV„‘úe>;y{{[{{;•ˆÙ˜àIð?õÞý`,R/;´žØw¥î_ÿ³ý•)cžT 9IDAThí›Ûo×Ç¿g®;{õz}ë¸Ô–T‚¦ˆhhDª"U}éCUiÿ€¾QòЗ¾TŠõ"å¥R“·H5©Òæž5%©DQB¸dc.ÆÆ^{×»3»sí÷Œm°"º€YÁÈñ±ÎÎììì9çs~ßßïwÎØQáËT”/¬d]^ë_·ðº…ר hÝäùÕ©£Ë‚Šé‡ëÇöó»Ùv·Úêš ¡¦ªßl»óUÊèêDv V¶Ó5àgÞÁª‡Ó¹žGËØÒÍ1vµ­®xShó xÜCá`¶wgn_yWÙÍÆº[v§Ð>Átû4jͳ¨Õ«7énqÖ¸TfT ÖtÞfÐa¡r`”›ëåÐp ضÆut-'ƒù`³íPk]ŒÇn!<ó—ð"Ô˜²æ|5ú¼ã7à¹MN ­º4¬ÇJ¹Ç¿ÉŒhUöKZ§e ¨ºE«JçQJeá¥JTTóhÃ.ÓÃ>¥‚.q‚&¹L¸åŠKÚþuò:pŒÀÔ[ã¬"9ØZ®§åÃn\Eeöeœó?Å|ó4ªÍIT[š¼Õc^&s4œ«PºëR e´¢ŠããRä’‡EQó„ÝÉÀEuÇž”âhSô¨Œe"“αȦ¸RjÐ}ª„—–!¼Cé üÜsWñ‹§Ç9ý»9íŒÒ”´A›ºLm•òœ§ußÇüœƒ9{çø°ãJ ¨·À !\›½Ëܼ¬Vy\Ý’neåÛ…ÝÄEÒXáQ Mc5ô6ó>+Wz)BfX™-s\êæ¶,}ïÿ:Sb‘xöÙs‘¢e/à=<†¿0#¹1°•uµeùûìòÆQ9 Ø–•#ݦÆqÔiåþ >éÔÕmã/n=ƒóÿgy†6Jk“Rƒ ú`Æ!x×hŒÿà\x¯DŸE´yòʲ§tYtì/þA‡}N›B•Ž¥Ã•Ë—éƒWh Yc©ulíÁ~xGÀñÛøŒ!w®û17&ó\‹o¹†$±FÉ©Ô E‰.w ½ôR€´þZmú³WãF‚>Ž0s±Ï(lÔbðfºD¹œ\æ;–Ñïÿ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef DAILY_H #define DAILY_H #include #include #include #include #include #include #include #include #include #include #include #include #include "Graphs/gSummaryChart.h" #include #include "mainwindow.h" #include "Graphs/gGraphView.h" #include "Graphs/gLineChart.h" #include "sessionbar.h" namespace Ui { class Daily; } class MyWebPage:public QWebPage { Q_OBJECT public: MyWebPage(QObject *parent = 0); protected: QObject *createPlugin(const QString & classid, const QUrl & url, const QStringList & paramNames, const QStringList & paramValues); }; class MyWebView:public QWebView { Q_OBJECT private: MyWebPage m_page; public: MyWebView(QWidget *parent = 0); }; class MainWindow; /*! \class Daily \brief SleepyHead's Daily view which displays the calendar and all the graphs relative to a selected Day */ class Daily : public QWidget { Q_OBJECT public: /*! \fn Daily() \brief Constructs a Daily object \param parent * (QObject parent) \param shared * Creates all the graph objects and adds them to the main gGraphView area for this tab. shared is not used for daily object, as it contains the default Context.. */ explicit Daily(QWidget *parent, gGraphView *shared); ~Daily(); /*! \fn ReloadGraphs() \brief Reload all graph information from disk and updates the view. */ void ReloadGraphs(); /*! \fn ResetGraphLayout() \brief Resets all graphs in the main gGraphView back to constant heights. */ void ResetGraphLayout(); /*! \fn graphView() \returns the main graphView area for the Daily View */ gGraphView *graphView() { return GraphView; } /*! \fn RedrawGraphs() \brief Calls updateGL on the main graphView area, redrawing the OpenGL area */ void RedrawGraphs(); /*! \fn LoadDate() \brief Selects a new day object, unloading the previous one, and loads the graph data for the supplied date. \param QDate date */ void LoadDate(QDate date); /*! \fn getDate() \brief Returns the most recently loaded Date \return QDate */ QDate getDate() { return previous_date; } /*! \fn UnitsChanged() \brief Called by Profile editor when measurement units are changed */ void UnitsChanged(); /*! \fn GetJournalSession(QDate date) \brief Looks up if there is a journal object for a supplied date \param QDate date \returns Session * containing valid Journal Session object or nullptr if none found. */ Session * GetJournalSession(QDate date); QString GetDetailsText(); /*! \fn eventBreakdownPie() \brief Returns a pointer to the Event Breakdown Piechart for the Report Printing module \returns gGraph * object containing this chart */ gGraph * eventBreakdownPie() { return graphlist["EventBreakdown"]; } QWidget * sessionBar() { return sessbar; } void clearLastDay(); /*! \fn Unload(QDate date) \brief Saves any journal changes for the provided date. \param QDate date */ void Unload(QDate date=QDate()); void setSidebarVisible(bool visible); void setCalendarVisible(bool visible); void addBookmark(qint64 st, qint64 et, QString text); void hideSpaceHogs(); void showSpaceHogs(); QLabel * getDateDisplay(); //void populateSessionWidget(); public slots: void on_LineCursorUpdate(double time); void on_RangeUpdate(double minx, double maxx); private slots: void on_ReloadDay(); /*! \fn on_calendar_currentPageChanged(int year, int month); \brief Scans through all days for this month, updating the day colors for the calendar object \param int year \param int month */ void on_calendar_currentPageChanged(int year, int month); /*! \fn on_calendar_selectionChanged(); \brief Called when the calendar object is clicked. Selects and loads a new date, unloading the previous one. */ void on_calendar_selectionChanged(); /* Journal Notes edit buttons I don't want to document */ void on_JournalNotesItalic_clicked(); void on_JournalNotesBold_clicked(); void on_JournalNotesFontsize_activated(int index); void on_JournalNotesColour_clicked(); void on_JournalNotesUnderline_clicked(); void on_treeWidget_itemSelectionChanged(); /*! \fn on_nextDayButton_clicked(); \brief Step backwards one day (if possible) */ void on_prevDayButton_clicked(); /*! \fn on_nextDayButton_clicked(); \brief Step forward one day (if possible) */ void on_nextDayButton_clicked(); /*! \fn on_calButton_toggled(); \brief Hides the calendar and put it out of the way, giving more room for the Details area. */ void on_calButton_toggled(bool checked); /*! \fn on_todayButton_clicked(); \brief Select the most recent day. */ void on_todayButton_clicked(); /*! \fn Link_clicked(const QUrl &url); \brief Called when a link is clicked on in the HTML Details tab \param const QUrl & url */ void Link_clicked(const QUrl &url); void on_evViewSlider_valueChanged(int value); /*! \fn on_treeWidget_itemClicked(QTreeWidgetItem *item, int column); \brief Called when an event is selected in the Event tab.. Zooms into the graph area. \param QTreeWidgetItem *item \param int column */ void on_treeWidget_itemClicked(QTreeWidgetItem *item, int column); /*! \fn graphtogglebutton_toggled(bool) \brief Called to hide/show a graph when on of the toggle bottoms underneath the graph area is clicked \param bool button status */ void graphtogglebutton_toggled(bool); /*! \fn on_addBookmarkButton_clicked() \brief Current selected graph Area is added to Bookmark's list for this day's journal object. */ void on_addBookmarkButton_clicked(); /*! \fn on_removeBookmarkButton_clicked() \brief Currently selected bookmark is removed from this day's Bookmark list. */ void on_removeBookmarkButton_clicked(); /*! \fn on_bookmarkTable_itemClicked(QTableWidgetItem *item); \brief Called when a bookmark has been selected.. Zooms in on the area \param QTableWidgetItem *item */ void on_bookmarkTable_itemClicked(QTableWidgetItem *item); /*! \fn on_bookmarkTable_itemChanged(QTableWidgetItem *item); \brief Called when bookmarks have been altered.. Saves the bookmark list to Journal object. */ void on_bookmarkTable_itemChanged(QTableWidgetItem *item); /*! \fn on_ouncesSpinBox_valueChanged(int arg1); \brief Called when the zombie slider has been moved.. Updates the BMI dislpay and journal objects. Also Refreshes the Overview charts */ void on_ZombieMeter_valueChanged(int value); void on_graphCombo_activated(int index); void on_toggleGraphs_clicked(bool checked); /*! \fn on_weightSpinBox_editingFinished(); \brief Called when weight has changed.. Updates the BMI dislpay and journal objects. Also Refreshes the Overview charts */ void on_weightSpinBox_editingFinished(); /*! \fn on_ouncesSpinBox_editingFinished(); \brief Called when weights ounces component has changed.. Updates the BMI dislpay and journal objects. Also Refreshes the Overview charts */ void on_ouncesSpinBox_editingFinished(); void on_ouncesSpinBox_valueChanged(int arg1); void on_weightSpinBox_valueChanged(double arg1); void doToggleSession(Session *); void on_eventsCombo_activated(int index); void on_toggleEvents_clicked(bool checked); void updateGraphCombo(); //void on_sessionWidget_itemSelectionChanged(); protected: virtual void closeEvent(QCloseEvent *); virtual void showEvent(QShowEvent *); private: /*! \fn CreateJournalSession() \brief Create a new journal session for this date, if one doesn't exist. \param QDate date Creates a new journal Machine record if necessary. */ Session * CreateJournalSession(QDate date); /*! \fn update_Bookmarks() \brief Saves the current bookmark list to the Journal object */ void update_Bookmarks(); /*! \fn Load(QDate date) \brief Selects a new day object, loads it's content and generates the HTML for the Details tab \param QDate date */ void Load(QDate date); /*! \fn UpdateCalendarDay(QDate date) \brief Updates the calendar visual information, changing a dates color depending on what data is available. \param QDate date */ void UpdateCalendarDay(QDate date); /*! \fn UpdateEventsTree(QDate date) \brief Populates the Events tree from the supplied Day object. \param QTreeWidget * tree \param Day * */ void UpdateEventsTree(QTreeWidget * tree,Day *day); void updateCube(); QString getSessionInformation(Day *); QString getMachineSettings(Day *); QString getStatisticsInfo(Day *); QString getCPAPInformation(Day *); QString getOximeterInformation(Day *); QString getEventBreakdown(Day *); QString getSleepTime(Day *); QHash graphlist; // QList OXIData; // QList CPAPData; // QList STAGEData; // QList POSData; QHash GraphToggles; QVector GraphAction; QGLContext *offscreen_context; QList splitter_sizes; // Layer * AddCPAP(Layer *d) { CPAPData.push_back(d); return d; } // Layer * AddSTAGE(Layer *d) { STAGEData.push_back(d); return d; } // Layer * AddPOS(Layer *d) { POSData.push_back(d); return d; } // Layer * AddOXI(Layer *d) { OXIData.push_back(d); return d; } // void UpdateCPAPGraphs(Day *day); // void UpdateOXIGraphs(Day *day); // void UpdateSTAGEGraphs(Day *day); // void UpdatePOSGraphs(Day *day); Ui::Daily *ui; QDate previous_date; QMenu *show_graph_menu; gGraphView *GraphView,*snapGV; MyScrollBar *scrollbar; QHBoxLayout *layout; QLabel *emptyToggleArea; QIcon * icon_on; QIcon * icon_off; SessionBar * sessbar; MyLabel * dateDisplay; MyWebView * webView; Day * lastcpapday; gLineChart *leakchart; bool ZombieMeterMoved; bool BookmarksChanged; }; #endif // DAILY_H sleepyhead-0.9.8/sleepyhead/daily.cpp0000644000175000017500000026422412412506713017161 0ustar sergiosergio/* Daily Panel * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include #include "daily.h" #include "ui_daily.h" #include "common_gui.h" #include "SleepLib/profiles.h" #include "SleepLib/session.h" #include "Graphs/graphdata_custom.h" #include "Graphs/gLineOverlay.h" #include "Graphs/gFlagsLine.h" #include "Graphs/gFooBar.h" #include "Graphs/gXAxis.h" #include "Graphs/gYAxis.h" #include "Graphs/gSegmentChart.h" #include "Graphs/gStatsLine.h" #include "Graphs/gdailysummary.h" #include "Graphs/MinutesAtPressure.h" //extern QProgressBar *qprogress; extern MainWindow * mainwin; // This was Sean Stangl's idea.. but I couldn't apply that patch. inline QString channelInfo(ChannelID code) { return schema::channel[code].fullname()+"\n"+schema::channel[code].description()+"\n("+schema::channel[code].units()+")"; } void Daily::setCalendarVisible(bool visible) { on_calButton_toggled(visible); } void Daily::setSidebarVisible(bool visible) { QList a; int panel_width = visible ? 370 : 0; a.push_back(panel_width); a.push_back(this->width() - panel_width); ui->splitter_2->setStretchFactor(1,1); ui->splitter_2->setSizes(a); ui->splitter_2->setStretchFactor(1,1); } Daily::Daily(QWidget *parent,gGraphView * shared) :QWidget(parent), ui(new Ui::Daily) { ui->setupUi(this); // Remove Incomplete Extras Tab //ui->tabWidget->removeTab(3); ZombieMeterMoved=false; BookmarksChanged=false; lastcpapday=nullptr; setSidebarVisible(true); layout=new QHBoxLayout(); layout->setSpacing(0); layout->setMargin(0); layout->setContentsMargins(0,0,0,0); dateDisplay=new MyLabel(this); dateDisplay->setAlignment(Qt::AlignCenter); QFont font = dateDisplay->font(); font.setPointSizeF(font.pointSizeF()*1.3F); dateDisplay->setFont(font); QPalette palette = dateDisplay->palette(); palette.setColor(QPalette::Base, Qt::blue); dateDisplay->setPalette(palette); //dateDisplay->setTextFormat(Qt::RichText); ui->sessionBarLayout->addWidget(dateDisplay,1); // const bool sessbar_under_graphs=false; // if (sessbar_under_graphs) { // ui->sessionBarLayout->addWidget(sessbar,1); // } else { // ui->splitter->insertWidget(2,sessbar); // sessbar->setMaximumHeight(sessbar->height()); // sessbar->setMinimumHeight(sessbar->height()); // } ui->calNavWidget->setMaximumHeight(ui->calNavWidget->height()); ui->calNavWidget->setMinimumHeight(ui->calNavWidget->height()); sessbar=nullptr; webView=new MyWebView(this); QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true); ui->tabWidget->insertTab(0,webView,QIcon(),"Details"); ui->graphFrame->setLayout(layout); //ui->graphMainArea->setLayout(layout); ui->graphMainArea->setAutoFillBackground(false); GraphView=new gGraphView(ui->graphFrame,shared); GraphView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); snapGV=new gGraphView(GraphView); snapGV->setMinimumSize(172,172); snapGV->hideSplitter(); snapGV->hide(); scrollbar=new MyScrollBar(ui->graphFrame); scrollbar->setOrientation(Qt::Vertical); scrollbar->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Expanding); scrollbar->setMaximumWidth(20); ui->bookmarkTable->setColumnCount(2); ui->bookmarkTable->setColumnWidth(0,70); //ui->bookmarkTable->setEditTriggers(QAbstractItemView::SelectedClicked); //ui->bookmarkTable->setColumnHidden(2,true); //ui->bookmarkTable->setColumnHidden(3,true); GraphView->setScrollBar(scrollbar); layout->addWidget(GraphView,1); layout->addWidget(scrollbar,0); int default_height = p_profile->appearance->graphHeight(); gGraph *GAHI = nullptr, // *TAP = nullptr, *SF = nullptr, *AHI = nullptr; const QString STR_GRAPH_DailySummary = "DailySummary"; const QString STR_GRAPH_TAP = "TimeAtPressure"; // gGraph * SG; // graphlist[STR_GRAPH_DailySummary] = SG = new gGraph(STR_GRAPH_DailySummary, GraphView, QObject::tr("Summary"), QObject::tr("Summary of this daily information"), default_height); // SG->AddLayer(new gLabelArea(nullptr),LayerLeft,gYAxis::Margin); // SG->AddLayer(new gDailySummary()); graphlist[STR_GRAPH_SleepFlags] = SF = new gGraph(STR_GRAPH_SleepFlags, GraphView, STR_TR_EventFlags, STR_TR_EventFlags, default_height); SF->setPinned(true); ChannelID cpapcodes[] = { CPAP_FlowRate, CPAP_MaskPressure, CPAP_Pressure, CPAP_Leak, CPAP_Snore, CPAP_FLG, CPAP_RespRate, CPAP_TidalVolume, CPAP_MinuteVent,CPAP_PTB, CPAP_RespEvent, CPAP_Ti, CPAP_Te, CPAP_IE, ZEO_SleepStage, POS_Inclination, POS_Orientation, CPAP_Test1 }; int cpapsize = sizeof(cpapcodes) / sizeof(ChannelID); ChannelID oxicodes[] = { OXI_Pulse, OXI_SPO2, OXI_Perf, OXI_Plethy }; int oxisize = sizeof(oxicodes) / sizeof(ChannelID); for (int i=0; i < cpapsize; ++i) { ChannelID code = cpapcodes[i]; graphlist[schema::channel[code].code()] = new gGraph(schema::channel[code].code(), GraphView, schema::channel[code].label(), channelInfo(code), default_height); } //int oxigrp=p_profile->ExistsAndTrue("SyncOximetry") ? 0 : 1; // Contemplating killing this setting... for (int i=0; i < oxisize; ++i) { ChannelID code = oxicodes[i]; graphlist[schema::channel[code].code()] = new gGraph(schema::channel[code].code(), GraphView, schema::channel[code].label(), channelInfo(code), default_height); } if (p_profile->general->calculateRDI()) { AHI=new gGraph("AHI", GraphView,STR_TR_RDI, channelInfo(CPAP_RDI), default_height); } else { AHI=new gGraph("AHI", GraphView,STR_TR_AHI, channelInfo(CPAP_AHI), default_height); } graphlist["AHI"] = AHI; graphlist[STR_GRAPH_EventBreakdown] = GAHI = new gGraph(STR_GRAPH_EventBreakdown, snapGV,tr("Breakdown"),tr("events"),172); gSegmentChart * evseg=new gSegmentChart(GST_Pie); evseg->AddSlice(CPAP_Hypopnea,QColor(0x40,0x40,0xff,0xff),STR_TR_H); evseg->AddSlice(CPAP_Apnea,QColor(0x20,0x80,0x20,0xff),STR_TR_UA); evseg->AddSlice(CPAP_Obstructive,QColor(0x40,0xaf,0xbf,0xff),STR_TR_OA); evseg->AddSlice(CPAP_ClearAirway,QColor(0xb2,0x54,0xcd,0xff),STR_TR_CA); evseg->AddSlice(CPAP_RERA,QColor(0xff,0xff,0x80,0xff),STR_TR_RE); evseg->AddSlice(CPAP_NRI,QColor(0x00,0x80,0x40,0xff),STR_TR_NR); evseg->AddSlice(CPAP_FlowLimit,QColor(0x40,0x40,0x40,0xff),STR_TR_FL); evseg->AddSlice(CPAP_SensAwake,QColor(0x40,0xC0,0x40,0xff),STR_TR_SA); if (p_profile->cpap->userEventPieChart()) { evseg->AddSlice(CPAP_UserFlag1,QColor(0xe0,0xe0,0xe0,0xff),tr("UF1")); evseg->AddSlice(CPAP_UserFlag2,QColor(0xc0,0xc0,0xe0,0xff),tr("UF2")); } GAHI->AddLayer(evseg); GAHI->setMargins(0,0,0,0); gFlagsGroup *fg=new gFlagsGroup(); SF->AddLayer(fg); SF->setBlockZoom(true); SF->AddLayer(new gShadowArea()); SF->AddLayer(new gLabelArea(fg),LayerLeft,gYAxis::Margin); //SF->AddLayer(new gFooBar(),LayerBottom,0,1); SF->AddLayer(new gXAxis(COLOR_Text,false),LayerBottom,0,gXAxis::Margin); // The following list contains graphs that don't have standard xgrid/yaxis labels QStringList skipgraph; skipgraph.push_back(STR_GRAPH_EventBreakdown); skipgraph.push_back(STR_GRAPH_SleepFlags); skipgraph.push_back(STR_GRAPH_DailySummary); skipgraph.push_back(STR_GRAPH_TAP); QHash::iterator it; for (it = graphlist.begin(); it != graphlist.end(); ++it) { if (skipgraph.contains(it.key())) continue; it.value()->AddLayer(new gXGrid()); } gLineChart *l; l=new gLineChart(CPAP_FlowRate,false,false); gGraph *FRW = graphlist[schema::channel[CPAP_FlowRate].code()]; // Then the graph itself FRW->AddLayer(l); // FRW->AddLayer(AddOXI(new gLineOverlayBar(OXI_SPO2Drop, COLOR_SPO2Drop, STR_TR_O2))); bool square=p_profile->appearance->squareWavePlots(); gLineChart *pc=new gLineChart(CPAP_Pressure, square); graphlist[schema::channel[CPAP_Pressure].code()]->AddLayer(pc); // graphlist[schema::channel[CPAP_Pressure].code()]->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_Ramp, COLOR_Ramp, schema::channel[CPAP_Ramp].label(), FT_Span))); pc->addPlot(CPAP_EPAP, square); pc->addPlot(CPAP_IPAPLo, square); pc->addPlot(CPAP_IPAP, square); pc->addPlot(CPAP_IPAPHi, square); gGraph * TAP2; graphlist[STR_GRAPH_TAP] = TAP2 = new gGraph(STR_GRAPH_TAP, GraphView, QObject::tr("By Pressure"), QObject::tr("Statistics at Pressure"), default_height); MinutesAtPressure * map; TAP2->AddLayer(map = new MinutesAtPressure()); TAP2->AddLayer(new gLabelArea(map),LayerLeft,gYAxis::Margin); TAP2->setBlockSelect(true); if (p_profile->general->calculateRDI()) { AHI->AddLayer(new gLineChart(CPAP_RDI, square)); // AHI->AddLayer(AddCPAP(new AHIChart(QColor("#37a24b")))); } else { AHI->AddLayer(new gLineChart(CPAP_AHI, square)); } // this is class wide because the leak redline can be reset in preferences.. // Better way would be having a search for linechart layers in graphlist[...] gLineChart *leakchart=new gLineChart(CPAP_Leak, square); // graphlist[schema::channel[CPAP_Leak].code()]->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_LargeLeak, COLOR_LargeLeak, STR_TR_LL, FT_Span))); leakchart->addPlot(CPAP_LeakTotal, square); leakchart->addPlot(CPAP_MaxLeak, square); // schema::channel[CPAP_Leak].setUpperThresholdColor(Qt::red); // schema::channel[CPAP_Leak].setLowerThresholdColor(Qt::green); graphlist[schema::channel[CPAP_Leak].code()]->AddLayer(leakchart); //LEAK->AddLayer(AddCPAP(new gLineChart(CPAP_Leak, COLOR_Leak,square))); //LEAK->AddLayer(AddCPAP(new gLineChart(CPAP_MaxLeak, COLOR_MaxLeak,square))); graphlist[schema::channel[CPAP_Snore].code()]->AddLayer(new gLineChart(CPAP_Snore, true)); graphlist[schema::channel[CPAP_PTB].code()]->AddLayer(new gLineChart(CPAP_PTB, square)); graphlist[schema::channel[CPAP_Test1].code()]->AddLayer(new gLineChart(CPAP_Test1, false)); gLineChart *lc = nullptr; graphlist[schema::channel[CPAP_MaskPressure].code()]->AddLayer(new gLineChart(CPAP_MaskPressure, false)); graphlist[schema::channel[CPAP_RespRate].code()]->AddLayer(lc=new gLineChart(CPAP_RespRate, false)); graphlist[schema::channel[POS_Inclination].code()]->AddLayer(new gLineChart(POS_Inclination)); graphlist[schema::channel[POS_Orientation].code()]->AddLayer(new gLineChart(POS_Orientation)); graphlist[schema::channel[CPAP_MinuteVent].code()]->AddLayer(lc=new gLineChart(CPAP_MinuteVent, false)); lc->addPlot(CPAP_TgMV, square); graphlist[schema::channel[CPAP_TidalVolume].code()]->AddLayer(lc=new gLineChart(CPAP_TidalVolume, false)); //lc->addPlot(CPAP_Test2,COLOR_DarkYellow,square); //graphlist[schema::channel[CPAP_TidalVolume].code()]->AddLayer(AddCPAP(new gLineChart("TidalVolume2", square))); graphlist[schema::channel[CPAP_FLG].code()]->AddLayer(new gLineChart(CPAP_FLG, true)); //graphlist[schema::channel[CPAP_RespiratoryEvent].code()]->AddLayer(AddCPAP(new gLineChart(CPAP_RespiratoryEvent, true))); graphlist[schema::channel[CPAP_IE].code()]->AddLayer(lc=new gLineChart(CPAP_IE, false)); graphlist[schema::channel[CPAP_Te].code()]->AddLayer(lc=new gLineChart(CPAP_Te, false)); graphlist[schema::channel[CPAP_Ti].code()]->AddLayer(lc=new gLineChart(CPAP_Ti, false)); //lc->addPlot(CPAP_Test2,COLOR:DarkYellow,square); graphlist[schema::channel[ZEO_SleepStage].code()]->AddLayer(new gLineChart(ZEO_SleepStage, true)); // gLineOverlaySummary *los1=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4); // gLineOverlaySummary *los2=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4); // graphlist[schema::channel[OXI_Pulse].code()]->AddLayer(AddOXI(los1->add(new gLineOverlayBar(OXI_PulseChange, COLOR_PulseChange, STR_TR_PC,FT_Span)))); // graphlist[schema::channel[OXI_Pulse].code()]->AddLayer(AddOXI(los1)); // graphlist[schema::channel[OXI_SPO2].code()]->AddLayer(AddOXI(los2->add(new gLineOverlayBar(OXI_SPO2Drop, COLOR_SPO2Drop, STR_TR_O2,FT_Span)))); // graphlist[schema::channel[OXI_SPO2].code()]->AddLayer(AddOXI(los2)); graphlist[schema::channel[OXI_Pulse].code()]->AddLayer(new gLineChart(OXI_Pulse, square)); graphlist[schema::channel[OXI_SPO2].code()]->AddLayer(new gLineChart(OXI_SPO2, true)); graphlist[schema::channel[OXI_Perf].code()]->AddLayer(new gLineChart(OXI_Perf, false)); graphlist[schema::channel[OXI_Plethy].code()]->AddLayer(new gLineChart(OXI_Plethy, false)); // Fix me // gLineOverlaySummary *los3=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4); // graphlist["INTPULSE"]->AddLayer(AddCPAP(los3->add(new gLineOverlayBar(OXI_PulseChange, COLOR_PulseChange, STR_TR_PC,FT_Span)))); // graphlist["INTPULSE"]->AddLayer(AddCPAP(los3)); // graphlist["INTPULSE"]->AddLayer(AddCPAP(new gLineChart(OXI_Pulse, square))); // gLineOverlaySummary *los4=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4); // graphlist["INTSPO2"]->AddLayer(AddCPAP(los4->add(new gLineOverlayBar(OXI_SPO2Drop, COLOR_SPO2Drop, STR_TR_O2,FT_Span)))); // graphlist["INTSPO2"]->AddLayer(AddCPAP(los4)); // graphlist["INTSPO2"]->AddLayer(AddCPAP(new gLineChart(OXI_SPO2, true))); graphlist[schema::channel[CPAP_PTB].code()]->setForceMaxY(100); graphlist[schema::channel[OXI_SPO2].code()]->setForceMaxY(100); for (it = graphlist.begin(); it != graphlist.end(); ++it) { if (skipgraph.contains(it.key())) continue; it.value()->AddLayer(new gYAxis(),LayerLeft,gYAxis::Margin); it.value()->AddLayer(new gXAxis(),LayerBottom,0,gXAxis::Margin); } if (p_profile->cpap->showLeakRedline()) { schema::channel[CPAP_Leak].setUpperThreshold(p_profile->cpap->leakRedline()); } else { schema::channel[CPAP_Leak].setUpperThreshold(0); // switch it off } layout->layout(); QTextCharFormat format = ui->calendar->weekdayTextFormat(Qt::Saturday); format.setForeground(QBrush(COLOR_Black, Qt::SolidPattern)); ui->calendar->setWeekdayTextFormat(Qt::Saturday, format); ui->calendar->setWeekdayTextFormat(Qt::Sunday, format); Qt::DayOfWeek dow=firstDayOfWeekFromLocale(); ui->calendar->setFirstDayOfWeek(dow); ui->tabWidget->setCurrentWidget(webView); webView->settings()->setFontSize(QWebSettings::DefaultFontSize,QApplication::font().pointSize()); webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); connect(webView,SIGNAL(linkClicked(QUrl)),this,SLOT(Link_clicked(QUrl))); int ews=p_profile->general->eventWindowSize(); ui->evViewSlider->setValue(ews); ui->evViewLCD->display(ews); icon_on=new QIcon(":/icons/session-on.png"); icon_off=new QIcon(":/icons/session-off.png"); ui->splitter->setVisible(false); if (p_profile->general->unitSystem()==US_Archiac) { ui->weightSpinBox->setSuffix(STR_UNIT_POUND); ui->weightSpinBox->setDecimals(0); ui->ouncesSpinBox->setVisible(true); ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE); } else { ui->ouncesSpinBox->setVisible(false); ui->weightSpinBox->setDecimals(3); ui->weightSpinBox->setSuffix(STR_UNIT_KG); } GraphView->setEmptyText(STR_Empty_NoData); previous_date=QDate(); ui->calButton->setChecked(p_profile->appearance->calendarVisible() ? Qt::Checked : Qt::Unchecked); on_calButton_toggled(p_profile->appearance->calendarVisible()); GraphView->resetLayout(); GraphView->LoadSettings("Daily"); connect(GraphView, SIGNAL(updateCurrentTime(double)), this, SLOT(on_LineCursorUpdate(double))); connect(GraphView, SIGNAL(updateRange(double,double)), this, SLOT(on_RangeUpdate(double,double))); connect(GraphView, SIGNAL(GraphsChanged()), this, SLOT(updateGraphCombo())); GraphView->setEmptyImage(QPixmap(":/docs/sheep.png")); } //void Daily::populateSessionWidget() //{ // ui->sessionWidget->clearContents(); // ui->sessionWidget->setColumnCount(2); // QMap::iterator it; // QMap::iterator it_end = p_profile->daylist.end(); // int row = 0; // for (it = p_profile->daylist.begin(); it != it_end; ++it) { // const QDate & date = it.key(); // Day * day = it.value(); // QList sessions = day->getSessions(MT_CPAP); // int size = sessions.size(); // if (size > 0) { // QTableWidgetItem * item = new QTableWidgetItem(date.toString(Qt::SystemLocaleShortDate)); // item->setData(Qt::UserRole, date); // ui->sessionWidget->setItem(row, 0, item); // SessionBar * sb = new SessionBar(); // for (int i=0; i < size; i++) { // Session * sess = sessions[i]; // QColor col = Qt::blue; // sb->add(sess, col); // } // ui->sessionWidget->setCellWidget(row, 1, sb); // row++; // } // } // ui->sessionWidget->setRowCount(row-1); // ui->sessionWidget->setCurrentCell(row-1, 0); // ui->sessionWidget->scrollToBottom(); //} Daily::~Daily() { // disconnect(sessbar, SIGNAL(toggledSession(Session*)), this, SLOT(doToggleSession(Session*))); // Save any last minute changes.. delete ui; delete icon_on; delete icon_off; } void Daily::showEvent(QShowEvent *) { RedrawGraphs(); } void Daily::closeEvent(QCloseEvent *event) { disconnect(webView,SIGNAL(linkClicked(QUrl)),this,SLOT(Link_clicked(QUrl))); if (previous_date.isValid()) Unload(previous_date); GraphView->SaveSettings("Daily"); QWidget::closeEvent(event); event->accept(); } void Daily::doToggleSession(Session * sess) { sess->setEnabled(!sess->enabled()); LoadDate(previous_date); mainwin->getOverview()->graphView()->dataChanged(); } void Daily::Link_clicked(const QUrl &url) { QString code=url.toString().section("=",0,0).toLower(); QString data=url.toString().section("=",1); int sid=data.toInt(); Day *day=nullptr; if (code=="togglecpapsession") { // Enable/Disable CPAP session day=p_profile->GetDay(previous_date,MT_CPAP); if (!day) return; Session *sess=day->find(sid); if (!sess) return; int i=webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-webView->page()->mainFrame()->scrollBarValue(Qt::Vertical); sess->setEnabled(!sess->enabled()); // Reload day LoadDate(previous_date); webView->page()->mainFrame()->setScrollBarValue(Qt::Vertical, webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-i); } else if (code=="toggleoxisession") { // Enable/Disable Oximetry session day=p_profile->GetDay(previous_date,MT_OXIMETER); Session *sess=day->find(sid); if (!sess) return; int i=webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-webView->page()->mainFrame()->scrollBarValue(Qt::Vertical); sess->setEnabled(!sess->enabled()); // Reload day LoadDate(previous_date); webView->page()->mainFrame()->setScrollBarValue(Qt::Vertical, webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-i); } else if (code=="cpap") { day=p_profile->GetDay(previous_date,MT_CPAP); if (day) { Session *sess=day->machine(MT_CPAP)->sessionlist[sid]; if (sess && sess->enabled()) { GraphView->SetXBounds(sess->first(),sess->last()); } } } else if (code=="oxi") { day=p_profile->GetDay(previous_date,MT_OXIMETER); if (day) { Session *sess=day->machine(MT_OXIMETER)->sessionlist[sid]; if (sess && sess->enabled()) { GraphView->SetXBounds(sess->first(),sess->last()); } } } else if (code=="event") { QList list=ui->treeWidget->findItems(schema::channel[sid].fullname(),Qt::MatchContains); if (list.size()>0) { ui->treeWidget->collapseAll(); ui->treeWidget->expandItem(list.at(0)); QTreeWidgetItem *wi=list.at(0)->child(0); ui->treeWidget->setCurrentItem(wi); ui->tabWidget->setCurrentIndex(1); } else { mainwin->Notify(tr("No %1 events are recorded this day").arg(schema::channel[sid].fullname()),"",1500); } } else if (code=="graph") { qDebug() << "Select graph " << data; } else { qDebug() << "Clicked on" << code << data; } } void Daily::ReloadGraphs() { GraphView->setDay(nullptr); ui->splitter->setVisible(true); QDate d; if (previous_date.isValid()) { d=previous_date; //Unload(d); } QDate lastcpap = p_profile->LastDay(MT_CPAP); QDate lastoxi = p_profile->LastDay(MT_OXIMETER); d = qMax(lastcpap, lastoxi); if (!d.isValid()) { d=ui->calendar->selectedDate(); } on_calendar_currentPageChanged(d.year(),d.month()); // this fires a signal which unloads the old and loads the new ui->calendar->blockSignals(true); ui->calendar->setSelectedDate(d); ui->calendar->blockSignals(false); Load(d); ui->calButton->setText(ui->calendar->selectedDate().toString(Qt::TextDate)); graphView()->redraw(); } void Daily::hideSpaceHogs() { if (p_profile->appearance->calendarVisible()) { ui->calendarFrame->setVisible(false); } } void Daily::showSpaceHogs() { if (p_profile->appearance->calendarVisible()) { ui->calendarFrame->setVisible(true); } } void Daily::on_calendar_currentPageChanged(int year, int month) { QDate d(year,month,1); int dom=d.daysInMonth(); for (int i=1;i<=dom;i++) { d=QDate(year,month,i); this->UpdateCalendarDay(d); } } void Daily::UpdateEventsTree(QTreeWidget *tree,Day *day) { tree->clear(); if (!day) return; tree->setColumnCount(1); // 1 visible common.. (1 hidden) QTreeWidgetItem *root=nullptr; QHash mcroot; QHash mccnt; int total_events=0; qint64 drift=0, clockdrift=p_profile->cpap->clockDrift()*1000L; quint32 chantype = schema::FLAG | schema::SPAN | schema::MINOR_FLAG; if (p_profile->general->showUnknownFlags()) chantype |= schema::UNKNOWN; QList chans = day->getSortedMachineChannels(chantype); for (QList::iterator s=day->begin();s!=day->end();++s) { Session * sess = *s; if (!sess->enabled()) continue; QHash >::iterator m; for (int c=0; c < chans.size(); ++c) { ChannelID code = chans.at(c); m = sess->eventlist.find(code); if (m == sess->eventlist.end()) continue; drift=(sess->type() == MT_CPAP) ? clockdrift : 0; QTreeWidgetItem *mcr; if (mcroot.find(code)==mcroot.end()) { int cnt=day->count(code); if (!cnt) continue; // If no events than don't bother showing.. total_events+=cnt; QString st=schema::channel[code].fullname(); if (st.isEmpty()) { st=QString("Fixme %1").arg(code); } st+=" "; if (cnt==1) st+=tr("%1 event").arg(cnt); else st+=tr("%1 events").arg(cnt); QStringList l(st); l.append(""); mcroot[code]=mcr=new QTreeWidgetItem(root,l); mccnt[code]=0; } else { mcr=mcroot[code]; } for (int z=0;zraw(o)); a.append(s); QTreeWidgetItem *item=new QTreeWidgetItem(a); item->setData(0,Qt::UserRole,t); //a.append(d.toString("yyyy-MM-dd HH:mm:ss")); mcr->addChild(item); } } } } int cnt=0; for (QHash::iterator m=mcroot.begin();m!=mcroot.end();m++) { tree->insertTopLevelItem(cnt++,m.value()); } if (day->hasMachine(MT_CPAP) || day->hasMachine(MT_OXIMETER) || day->hasMachine(MT_POSITION)) { QTreeWidgetItem * start = new QTreeWidgetItem(QStringList(tr("Session Start Times"))); QTreeWidgetItem * end = new QTreeWidgetItem(QStringList(tr("Session End Times"))); tree->insertTopLevelItem(cnt++ , start); tree->insertTopLevelItem(cnt++ , end); for (QList::iterator s=day->begin(); s!=day->end(); ++s) { QDateTime st = QDateTime::fromMSecsSinceEpoch((*s)->first()); QDateTime et = QDateTime::fromMSecsSinceEpoch((*s)->last()); QTreeWidgetItem * item = new QTreeWidgetItem(QStringList(st.toString("HH:mm:ss"))); item->setData(0,Qt::UserRole, (*s)->first()); start->addChild(item); item = new QTreeWidgetItem(QStringList(et.toString("HH:mm:ss"))); item->setData(0,Qt::UserRole, (*s)->last()); end->addChild(item); } } //tree->insertTopLevelItem(cnt++,new QTreeWidgetItem(QStringList("[Total Events ("+QString::number(total_events)+")]"))); tree->sortByColumn(0,Qt::AscendingOrder); //tree->expandAll(); } void Daily::UpdateCalendarDay(QDate date) { QTextCharFormat nodata; QTextCharFormat cpaponly; QTextCharFormat cpapjour; QTextCharFormat oxiday; QTextCharFormat oxicpap; QTextCharFormat jourday; QTextCharFormat stageday; cpaponly.setForeground(QBrush(COLOR_Blue, Qt::SolidPattern)); cpaponly.setFontWeight(QFont::Normal); cpapjour.setForeground(QBrush(COLOR_Blue, Qt::SolidPattern)); cpapjour.setFontWeight(QFont::Bold); oxiday.setForeground(QBrush(COLOR_Red, Qt::SolidPattern)); oxiday.setFontWeight(QFont::Normal); oxicpap.setForeground(QBrush(COLOR_Red, Qt::SolidPattern)); oxicpap.setFontWeight(QFont::Bold); stageday.setForeground(QBrush(COLOR_Magenta, Qt::SolidPattern)); stageday.setFontWeight(QFont::Bold); jourday.setForeground(QBrush(COLOR_DarkYellow, Qt::SolidPattern)); jourday.setFontWeight(QFont::Bold); nodata.setForeground(QBrush(COLOR_Black, Qt::SolidPattern)); nodata.setFontWeight(QFont::Normal); bool hascpap = p_profile->FindDay(date, MT_CPAP)!=nullptr; bool hasoxi = p_profile->FindDay(date, MT_OXIMETER)!=nullptr; bool hasjournal = p_profile->FindDay(date, MT_JOURNAL)!=nullptr; bool hasstage = p_profile->FindDay(date, MT_SLEEPSTAGE)!=nullptr; bool haspos = p_profile->FindDay(date, MT_POSITION)!=nullptr; if (hascpap) { if (hasoxi) { ui->calendar->setDateTextFormat(date, oxicpap); } else if (hasjournal) { ui->calendar->setDateTextFormat(date, cpapjour); } else if (hasstage || haspos) { ui->calendar->setDateTextFormat(date, stageday); } else { ui->calendar->setDateTextFormat(date, cpaponly); } } else if (hasoxi) { ui->calendar->setDateTextFormat(date, oxiday); } else if (hasjournal) { ui->calendar->setDateTextFormat(date, jourday); } else if (hasstage) { ui->calendar->setDateTextFormat(date, oxiday); } else if (haspos) { ui->calendar->setDateTextFormat(date, oxiday); } else { ui->calendar->setDateTextFormat(date, nodata); } ui->calendar->setHorizontalHeaderFormat(QCalendarWidget::ShortDayNames); } void Daily::LoadDate(QDate date) { if (!date.isValid()) { qDebug() << "LoadDate called with invalid date"; return; } ui->calendar->blockSignals(true); if (date.month()!=previous_date.month()) { on_calendar_currentPageChanged(date.year(),date.month()); } ui->calendar->setSelectedDate(date); ui->calendar->blockSignals(false); on_calendar_selectionChanged(); } void Daily::on_calendar_selectionChanged() { QTimer::singleShot(0, this, SLOT(on_ReloadDay())); } void Daily::on_ReloadDay() { graphView()->releaseKeyboard(); QTime time; time_t unload_time, load_time, other_time; time.start(); this->setCursor(Qt::BusyCursor); if (previous_date.isValid()) { // GraphView->fadeOut(); Unload(previous_date); } unload_time=time.restart(); //bool fadedir=previous_date < ui->calendar->selectedDate(); ZombieMeterMoved=false; Load(ui->calendar->selectedDate()); load_time=time.restart(); //GraphView->fadeIn(fadedir); GraphView->redraw(); ui->calButton->setText(ui->calendar->selectedDate().toString(Qt::TextDate)); ui->calendar->setFocus(Qt::ActiveWindowFocusReason); if (p_profile->general->unitSystem()==US_Archiac) { ui->weightSpinBox->setSuffix(STR_UNIT_POUND); ui->weightSpinBox->setDecimals(0); ui->ouncesSpinBox->setVisible(true); ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE); } else { ui->ouncesSpinBox->setVisible(false); ui->weightSpinBox->setDecimals(3); ui->weightSpinBox->setSuffix(STR_UNIT_KG); } this->setCursor(Qt::ArrowCursor); other_time=time.restart(); qDebug() << "Page change time (in ms): Unload ="<getDaily()->sessionBar(); } qDebug() << "Request for unknown MyWebPage plugin"; return new QWidget(); } MyWebView::MyWebView(QWidget *parent): QWebView(parent), m_page(this) { // Set the page of our own PageView class, MyPageView, // because only objects of this class will handle // object-tags correctly. setPage(&m_page); } QString Daily::getSessionInformation(Day * day) { QString html; if (!day) return html; html=""; html+=QString(""); html+=""; QFontMetrics FM(*defaultfont); QRect r=FM.boundingRect('@'); Machine * cpap = day->machine(MT_CPAP); if (cpap) { html+=QString("").arg(r.height()*3,0,10); html+=""; } QDateTime fd,ld; bool corrupted_waveform=false; QString tooltip; QString type; QHash::iterator mach_end = day->machines.end(); QHash::iterator mi; for (mi = day->machines.begin(); mi != mach_end; ++mi) { if (mi.key() == MT_JOURNAL) continue; html += "\n"; html+=QString("" "" "" "" "" ""); QList sesslist = day->getSessions(mi.key(), true); for (QList::iterator s=sesslist.begin(); s != sesslist.end(); ++s) { if (((*s)->type() == MT_CPAP) && ((*s)->settings.find(CPAP_BrokenWaveform) != (*s)->settings.end())) corrupted_waveform=true; fd=QDateTime::fromTime_t((*s)->first()/1000L); ld=QDateTime::fromTime_t((*s)->last()/1000L); int len=(*s)->length()/1000L; int h=len/3600; int m=(len/60) % 60; int s1=len % 60; Session *sess=*s; bool b=sess->enabled(); html+=QString("" "" "" "" "" "" "" ) .arg((*s)->session()) .arg(QObject::tr("%1 Session #%2").arg((*s)->machine()->loaderName()).arg((*s)->session(),8,10,QChar('0'))) .arg(QString("%1h %2m %3s").arg(h,2,10,QChar('0')).arg(m,2,10,QChar('0')).arg(s1,2,10,QChar('0'))) .arg((b ? "on" : "off")) .arg(fd.date().toString(Qt::SystemLocaleShortDate)) .arg(fd.toString("HH:mm:ss")) .arg(ld.toString("HH:mm:ss")); #ifdef SESSION_DEBUG for (int i=0; i< sess->session_files.size(); ++i) { html+=QString("").arg(sess->session_files[i].section("/",-1)); } #endif } } if (corrupted_waveform) { html+=QString("").arg(tr("One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.")); } html+="
    "+tr("Session Information")+"
     
    " "" // "" "
     
    "; switch (mi.key()) { case MT_CPAP: type="cpap"; html+=tr("CPAP Sessions"); break; case MT_OXIMETER: type="oxi"; html+=tr("Oximetery Sessions"); break; case MT_SLEEPSTAGE: type="stage"; html+=tr("Sleep Stage Sessions"); break; case MT_POSITION: type="stage"; html+=tr("Position Sensor Sessions"); break; default: type="unknown"; html+=tr("Unknown Session"); break; } html+="
    "+STR_TR_On+""+STR_TR_Date+""+STR_TR_Start+""+STR_TR_End+""+tr("Duration")+"
    %2
    " "%5%6%7%3
    %1
    %1
    "; return html; } QString Daily::getMachineSettings(Day * day) { QString html; Machine * cpap = day->machine(MT_CPAP); if (cpap && day->hasEnabledSessions(MT_CPAP)) { html=""; html+=QString("").arg(tr("Machine Settings")); html+=""; if ((day->settingExists(CPAP_BrokenSummary))) { html+="
    %1
     
    "+tr("Machine Settings Unavailable")+"

    \n"; return html; } QMap other; Session * sess = day->firstSession(MT_CPAP); QHash::iterator it; QHash::iterator it_end; if (sess) { it_end = sess->settings.end(); it = sess->settings.begin(); } QMap first; CPAPLoader * loader = qobject_cast(cpap->loader()); ChannelID cpapmode = loader->CPAPModeChannel(); schema::Channel & chan = schema::channel[cpapmode]; first[cpapmode] = QString("
    %1%2%3") .arg(chan.label()) .arg(chan.description()) .arg(day->getCPAPMode()); if (sess) for (; it != it_end; ++it) { ChannelID code = it.key(); if ((code <= 1) || (code == RMS9_MaskOnTime) || (code == CPAP_Mode) || (code == cpapmode) || (code == CPAP_SummaryOnly)) continue; schema::Channel & chan = schema::channel[code]; QString data; if (chan.datatype() == schema::LOOKUP) { data = chan.option(it.value().toInt()); } else if (chan.datatype() == schema::BOOL) { data = (it.value().toBool() ? STR_TR_Yes : STR_TR_No); } else if (chan.datatype() == schema::DOUBLE) { data = QString().number(it.value().toDouble(),'f',1) + " "+chan.units(); } else { data = it.value().toString() + " "+ chan.units(); } QString tmp = QString("%1%2%3") .arg(schema::channel[code].label()) .arg(schema::channel[code].description()) .arg(data); if ((code == CPAP_IPAP) || (code == CPAP_EPAP) || (code == CPAP_IPAPHi) || (code == CPAP_EPAPHi) || (code == CPAP_IPAPLo) || (code == CPAP_EPAPLo) || (code == CPAP_PressureMin) || (code == CPAP_PressureMax) || (code == CPAP_Pressure) || (code == CPAP_PSMin) || (code == CPAP_PSMax) || (code == CPAP_PS)) { first[code] = tmp; } else { other[schema::channel[code].label()] = tmp; } } ChannelID order[] = { cpapmode, CPAP_Pressure, CPAP_PressureMin, CPAP_PressureMax, CPAP_EPAP, CPAP_EPAPLo, CPAP_EPAPHi, CPAP_IPAP, CPAP_IPAPLo, CPAP_IPAPHi, CPAP_PS, CPAP_PSMin, CPAP_PSMax }; int os = sizeof(order) / sizeof(ChannelID); for (int i=0 ;i < os; ++i) { if (first.contains(order[i])) html += first[order[i]]; } for (QMap::iterator it = other.begin(); it != other.end(); ++it) { html += it.value(); } /* ChannelID pr_level_chan = NoChannel; ChannelID pr_mode_chan = NoChannel; ChannelID hum_stat_chan = NoChannel; ChannelID hum_level_chan = NoChannel; CPAPLoader * loader = dynamic_cast(cpap->machine->loader()); if (loader) { pr_level_chan = loader->PresReliefLevel(); pr_mode_chan = loader->PresReliefMode(); hum_stat_chan = loader->HumidifierConnected(); hum_level_chan = loader->HumidifierLevel(); } if ((pr_level_chan != NoChannel) && (cpap->settingExists(pr_level_chan))) { QString flexstr = cpap->getPressureRelief(); html+=QString("%1%2%3") .arg(schema::channel[pr_mode_chan].label()) .arg(schema::channel[pr_mode_chan].description()) .arg(flexstr); } if (cpap->settingExists(hum_level_chan)) { int humid=round(cpap->settings_wavg(hum_level_chan)); html+=QString(""+schema::channel[hum_level_chan].label()+"%1%2") .arg(schema::channel[hum_level_chan].description()) .arg(humid == 0 ? STR_GEN_Off : "x"+QString::number(humid)); } */ html+=""; html+="
    \n"; } return html; } QString Daily::getOximeterInformation(Day * day) { QString html; Machine * oxi = day->machine(MT_OXIMETER); if (oxi && day->hasEnabledSessions(MT_OXIMETER)) { html=""; html+=QString("\n").arg(tr("Oximeter Information")); html+=""; html+="\n"; html+=""; html+=QString("").arg(tr("SpO2 Desaturations")).arg(day->count(OXI_SPO2Drop)).arg((100.0/day->hours(MT_OXIMETER)) * (day->sum(OXI_SPO2Drop)/3600.0),0,'f',2); html+=QString("").arg(tr("Pulse Change events")).arg(day->count(OXI_PulseChange)).arg((100.0/day->hours(MT_OXIMETER)) * (day->sum(OXI_PulseChange)/3600.0),0,'f',2); html+=QString("").arg(tr("SpO2 Baseline Used")).arg(day->settings_wavg(OXI_SPO2Drop),0,'f',2); // CHECKME: Should this value be wavg OXI_SPO2 isntead? html+="
    %1
     
    "+oxi->brand()+" "+oxi->model()+"
     
    %1: %2 (%3%)
    %1: %2 (%3%)
    %1: %2%
    \n"; html+="
    \n"; } return html; } QString Daily::getCPAPInformation(Day * day) { QString html; if (!day) return html; Machine * cpap = day->machine(MT_CPAP); if (!cpap) return html; MachineInfo info = cpap->getInfo(); html="\n"; html+="\n"; //CPAPMode mode=(CPAPMode)(int)cpap->settings_max(CPAP_Mode); html+="\n"; if ((day->settingExists(CPAP_BrokenSummary))) { html+="\n"; html+=QString("").arg(""+STR_MessageBox_PleaseNote+": "+ tr("This day has missing pressure, mode and settings data.")); } html+="
    "+info.brand + " "+ info.series+"
    "+info.model+""; QString tooltip=("Model "+info.modelnumber+" - "+info.serial); tooltip=tooltip.replace(" "," "); html+=tooltip; html+="
    "; html+=tr("PAP Mode: %1
    ").arg(day->getCPAPMode()); html+= day->getPressureSettings(); html+="
     
    %1
    \n"; html+="
    \n"; return html; } QString Daily::getStatisticsInfo(Day * day) { if (!day) return QString(); Machine *cpap = day->machine(MT_CPAP), *oxi = day->machine(MT_OXIMETER), *pos = day->machine(MT_POSITION); int mididx=p_profile->general->prefCalcMiddle(); SummaryType ST_mid; if (mididx==0) ST_mid=ST_PERC; if (mididx==1) ST_mid=ST_WAVG; if (mididx==2) ST_mid=ST_AVG; float percentile=p_profile->general->prefCalcPercentile()/100.0; SummaryType ST_max=p_profile->general->prefCalcMax() ? ST_PERC : ST_MAX; const EventDataType maxperc=0.995F; QString midname; if (ST_mid==ST_WAVG) midname=STR_TR_WAvg; else if (ST_mid==ST_AVG) midname=STR_TR_Avg; else if (ST_mid==ST_PERC) midname=STR_TR_Med; QString html; html+="\n"; html+=QString("\n").arg(tr("Statistics")); html+=QString("") .arg(STR_TR_Channel) .arg(STR_TR_Min) .arg(midname) .arg(tr("%1%2").arg(percentile*100,0,'f',0).arg(STR_UNIT_Percentage)) .arg(STR_TR_Max); ChannelID chans[]={ CPAP_Pressure,CPAP_EPAP,CPAP_IPAP,CPAP_PS,CPAP_PTB, CPAP_MinuteVent, CPAP_RespRate, CPAP_RespEvent,CPAP_FLG, CPAP_Leak, CPAP_LeakTotal, CPAP_Snore,CPAP_IE,CPAP_Ti,CPAP_Te, CPAP_TgMV, CPAP_TidalVolume, OXI_Pulse, OXI_SPO2, POS_Inclination, POS_Orientation }; int numchans=sizeof(chans)/sizeof(ChannelID); int ccnt=0; EventDataType tmp,med,perc,mx,mn; for (int i=0;ichannelHasData(code)) continue; QString tooltip=schema::channel[code].description(); if (!schema::channel[code].units().isEmpty()) tooltip+=" ("+schema::channel[code].units()+")"; if (ST_max == ST_MAX) { mx=day->Max(code); } else { mx=day->percentile(code,maxperc); } mn=day->Min(code); perc=day->percentile(code,percentile); if (ST_mid == ST_PERC) { med=day->percentile(code,0.5); tmp=day->wavg(code); if (tmp>0 || mx==0) { tooltip+=QString("
    "+STR_TR_WAvg+": %1").arg(tmp,0,'f',2); } } else if (ST_mid == ST_WAVG) { med=day->wavg(code); tmp=day->percentile(code,0.5); if (tmp>0 || mx==0) { tooltip+=QString("
    "+STR_TR_Median+": %1").arg(tmp,0,'f',2); } } else if (ST_mid == ST_AVG) { med=day->avg(code); tmp=day->percentile(code,0.5); if (tmp>0 || mx==0) { tooltip+=QString("
    "+STR_TR_Median+": %1").arg(tmp,0,'f',2); } } html+=QString("
    ") .arg(schema::channel[code].label()) .arg(mn,0,'f',2) .arg(med,0,'f',2) .arg(perc,0,'f',2) .arg(mx,0,'f',2) .arg(tooltip); ccnt++; } if (GraphView->isEmpty() && ((ccnt>0) || (cpap && day->summaryOnly()))) { html+="\n"; html+=QString("").arg(""+STR_MessageBox_PleaseNote+" "+ tr("This day just contains summary data, only limited information is available .")); } else if (cpap) { html+=""; if ((cpap->loaderName() == STR_MACH_ResMed) || ((cpap->loaderName() == STR_MACH_PRS1) && (p_profile->cpap->resyncFromUserFlagging()))) { int ttia = day->sum(CPAP_Obstructive) + day->sum(CPAP_ClearAirway) + day->sum(CPAP_Apnea) + day->sum(CPAP_Hypopnea); int h = ttia / 3600; int m = ttia / 60 % 60; int s = ttia % 60; if (ttia > 0) { html+="").arg(QString().sprintf("%02i:%02i:%02i",h,m,s)); } } float hours = day->hours(MT_CPAP); if (p_profile->cpap->showLeakRedline()) { float rlt = day->timeAboveThreshold(CPAP_Leak, p_profile->cpap->leakRedline()) / 60.0; float pc = 100.0 / hours * rlt; html+="").arg(pc, 0, 'f', 3); } int l = day->sum(CPAP_Ramp); if (l > 0) { html+="").arg(l / 3600, 2, 10, QChar('0')).arg((l / 60) % 60, 2, 10, QChar('0')).arg(l % 60, 2, 10, QChar('0')); float v = (hours - (float(l) / 3600.0)); int q = v * 3600.0; html+="").arg(q / 3600, 2, 10, QChar('0')).arg((q / 60) % 60, 2, 10, QChar('0')).arg(q % 60, 2, 10, QChar('0')); // EventDataType hc = day->count(CPAP_Hypopnea) - day->countInsideSpan(CPAP_Ramp, CPAP_Hypopnea); // EventDataType oc = day->count(CPAP_Obstructive) - day->countInsideSpan(CPAP_Ramp, CPAP_Obstructive); //EventDataType tc = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive); // EventDataType ahi = (hc+oc) / v; // Not sure if i was trying to be funny, and left on my replication of Devilbiss's bug here... :P // html+="").arg(ahi, 0, 'f', 2); } } html+="
    %1
    %1%2%3%4%5
    %1%6%2%3%4%5
     
    %1
     
    "+tr("Total time in apnea")+ QString("%1
    "+tr("Time over leak redline")+ QString("%1%
    "+tr("Total ramp time")+ QString("%1:%2:%3
    "+tr("Time outside of ramp")+ QString("%1:%2:%3
    "+tr("AHI excluding ramp")+ // QString("%1
    \n"; html+="
    \n"; return html; } QString Daily::getEventBreakdown(Day * cpap) { Q_UNUSED(cpap) QString html; html+="\n"; html+="
    "; return html; } QString Daily::getSleepTime(Day * day) { //cpap, Day * oxi QString html; if (!day || (day->hours() < 0.0000001)) return html; html+="\n"; html+=""; int tt=qint64(day->total_time())/1000L; QDateTime date=QDateTime::fromTime_t(day->first()/1000L); QDateTime date2=QDateTime::fromTime_t(day->last()/1000L); int h=tt/3600; int m=(tt/60)%60; int s=tt % 60; html+=QString("\n") .arg(date.date().toString(Qt::SystemLocaleShortDate)) .arg(date.toString("HH:mm:ss")) .arg(date2.toString("HH:mm:ss")) .arg(QString().sprintf("%02i:%02i:%02i",h,m,s)); html+="
    "+STR_TR_Date+""+tr("Sleep")+""+tr("Wake")+""+STR_UNIT_Hours+"
    %1%2%3%4
    \n"; // html+="
    "; return html; } void Daily::Load(QDate date) { dateDisplay->setText(""+date.toString(Qt::SystemLocaleLongDate)+""); previous_date=date; Day * day = p_profile->GetDay(date); Machine *cpap = nullptr, *oxi = nullptr, *stage = nullptr, *posit = nullptr; if (day) { cpap = day->machine(MT_CPAP); oxi = day->machine(MT_OXIMETER); stage = day->machine(MT_SLEEPSTAGE); posit = day->machine(MT_POSITION); } if (!p_profile->session->cacheSessions()) { // Getting trashed on purge last day... // lastcpapday can get purged and be invalid if (lastcpapday && (lastcpapday!=day)) { for (QMap::iterator di = p_profile->daylist.begin(); di!= p_profile->daylist.end(); ++di) { Day * d = di.value(); if (d->eventsLoaded()) { if (d->useCounter() == 0) { d->CloseEvents(); } } } } } // Don't really see a point in unlinked oximetery sessions anymore... All I can say is BLEH... // if ((cpap && oxi) && day->hasEnabledSessions(MT_OXIMETER)) { // int gr; // if (qAbs(day->first(MT_CPAP) - day->first(MT_OXIMETER)) > 30000) { // mainwin->Notify(tr("Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked."),"",3000); // gr=1; // } else // gr=0; // (*GraphView)[schema::channel[OXI_Pulse].code()]->setGroup(gr); // (*GraphView)[schema::channel[OXI_SPO2].code()]->setGroup(gr); // (*GraphView)[schema::channel[OXI_Plethy].code()]->setGroup(gr); // } lastcpapday=day; QString html="" "" "" "" ""; QString tmp; if (day) { day->OpenEvents(); } GraphView->setDay(day); // UpdateOXIGraphs(oxi); // UpdateCPAPGraphs(cpap); // UpdateSTAGEGraphs(stage); // UpdatePOSGraphs(posit); UpdateEventsTree(ui->treeWidget, day); // FIXME: // Generating entire statistics because bookmarks may have changed.. (This updates the side panel too) mainwin->GenerateStatistics(); snapGV->setDay(day); // GraphView->ResetBounds(false); // wtf is hiding the scrollbars for??? // if (!cpap && !oxi) { // scrollbar->hide(); // } else { // scrollbar->show(); // } QString modestr; CPAPMode mode=MODE_UNKNOWN; QString a; bool isBrick=false; updateGraphCombo(); ui->eventsCombo->clear(); quint32 chans = schema::SPAN | schema::FLAG | schema::MINOR_FLAG; if (p_profile->general->showUnknownFlags()) chans |= schema::UNKNOWN; QList available; if (day) available.append(day->getSortedMachineChannels(chans)); for (int i=0; i < available.size(); ++i) { ChannelID code = available.at(i); schema::Channel & chan = schema::channel[code]; ui->eventsCombo->addItem(chan.enabled() ? *icon_on : * icon_off, chan.label(), code); ui->eventsCombo->setItemData(i, chan.fullname(), Qt::ToolTipRole); } if (!cpap) { GraphView->setEmptyImage(QPixmap(":/docs/sheep.png")); } if (cpap) { //QHash > list; float hours=day->hours(MT_CPAP); if (GraphView->isEmpty() && (hours>0)) { if (!p_profile->hasChannel(CPAP_Obstructive) && !p_profile->hasChannel(CPAP_Hypopnea)) { GraphView->setEmptyText(STR_Empty_Brick); GraphView->setEmptyImage(QPixmap(":/icons/sadface.png")); isBrick=true; } else { GraphView->setEmptyImage(QPixmap(":/docs/sheep.png")); } } mode=(CPAPMode)(int)day->settings_max(CPAP_Mode); modestr=schema::channel[CPAP_Mode].m_options[mode]; EventDataType ahi=(day->count(CPAP_Obstructive)+day->count(CPAP_Hypopnea)+day->count(CPAP_ClearAirway)+day->count(CPAP_Apnea)); if (p_profile->general->calculateRDI()) ahi+=day->count(CPAP_RERA); ahi/=hours; if (hours>0) { html+="\n"; html+=""; if (!isBrick) { ChannelID ahichan=CPAP_AHI; QString ahiname=STR_TR_AHI; if (p_profile->general->calculateRDI()) { ahichan=CPAP_RDI; ahiname=STR_TR_RDI; } html+=QString("\n") .arg("#F88017").arg(COLOR_Text.name()).arg(ahiname).arg(schema::channel[ahichan].fullname()).arg(ahi,0,'f',2); } else { html+=QString("\n") .arg("#F88017").arg(tr("BRICK! :(")); } html+="\n"; html+="
    %3%4   %5%2
    \n"; html+=getCPAPInformation(day); html+=getSleepTime(day); html+="\n"; quint32 zchans = schema::SPAN | schema::FLAG; bool show_minors = true; if (p_profile->general->showUnknownFlags()) zchans |= schema::UNKNOWN; if (show_minors) zchans |= schema::MINOR_FLAG; QList available = day->getSortedMachineChannels(zchans); EventDataType val; QHash values; for (int i=0; i < available.size(); ++i) { ChannelID code = available.at(i); schema::Channel & chan = schema::channel[code]; if (!chan.enabled()) continue; QString data; if (chan.type() == schema::SPAN) { val = (100.0 / hours)*(day->sum(code)/3600.0); data = QString("%1%").arg(val,0,'f',2); } else { val = day->count(code) / hours; data = QString("%1").arg(val,0,'f',2); } values[code] = val; QColor altcolor = (brightness(chan.defaultColor()) < 0.3) ? Qt::white : Qt::black; // pick a contrasting color html+=QString("\n") .arg(chan.defaultColor().name()).arg(altcolor.name()).arg(chan.fullname()).arg(data).arg(code); } // for (int i=0;ichannelHasData(chans[i].id)) // continue; // if ((cpap->machine->loaderName() == STR_MACH_PRS1) && (chans[i].id == CPAP_VSnore)) // continue; // html+=QString("\n") // .arg(schema::channel[chans[i].id].defaultColor().name()).arg(chans[i].color2.name()).arg(schema::channel[chans[i].id].fullname()).arg(chans[i].value,0,'f',2).arg(chans[i].id); // // keep in case tooltips are needed // //html+=QString("\n") // // .arg(chans[i].color.name()).arg(chans[i].color2.name()).arg(chans[i].name).arg(schema::channel[chans[i].id].description()).arg(chans[i].value,0,'f',2).arg(chans[i].id); // } html+="
    %3%4
    %3%4
    %3%4%5
    "; html+="\n"; // Show Event Breakdown pie chart if ((hours > 0) && p_profile->appearance->graphSnapshots()) { // AHI Pie Chart if ((values[CPAP_Obstructive] + values[CPAP_Hypopnea] + values[CPAP_ClearAirway] + values[CPAP_Apnea] + values[CPAP_RERA] + values[CPAP_FlowLimit] + values[CPAP_SensAwake])>0) { html+=""; html+=QString("").arg(tr("Event Breakdown")); eventBreakdownPie()->setShowTitle(false); int w=155; int h=155; QPixmap pixmap=eventBreakdownPie()->renderPixmap(w,h,false); if (!pixmap.isNull()) { QByteArray byteArray; QBuffer buffer(&byteArray); // use buffer to store pixmap into byteArray buffer.open(QIODevice::WriteOnly); pixmap.save(&buffer, "PNG"); html += "\n").arg(w).arg(h); } else { html += "\n"; } } else if (day->channelHasData(CPAP_Obstructive) || day->channelHasData(CPAP_Hypopnea) || day->channelHasData(CPAP_ClearAirway) || day->channelHasData(CPAP_RERA) || day->channelHasData(CPAP_Apnea) || day->channelHasData(CPAP_FlowLimit) || day->channelHasData(CPAP_SensAwake) ) { html += "\n"; } } html+="
     
    %1
    Unable to display Pie Chart on this system
    \n"; html+="
    \n"; } else { html+="\n"; if (!isBrick) { html+="\n"; if (day->size()>0) { html+=""; html+=""; html+="\n"; GraphView->setEmptyText(STR_Empty_NoSessions); } else { html+=""; html+="\n"; } } else { // machine is a brick html+=""; html+="\n"; html+="\n"; } html+="\n"; html+="
     
    "+tr("Sessions all off!")+"
    "+tr("Sessions exist for this day but are switched off.")+"

    "+tr("Impossibly short session")+"

    "+tr("Zero hours??")+"

    "+tr("BRICK :(")+"

    "+tr("Sorry, your machine only provides compliance data.")+"
    "+tr("Complain to your Equipment Provider!")+"
     
    \n"; } } // if (!CPAP) else html+=getSleepTime(day); if ((cpap && !isBrick && (day->hours()>0)) || oxi || posit) { html+=getStatisticsInfo(day); } else { if (cpap && day->hours(MT_CPAP)<0.0000001) { } else if (!isBrick) { html+=""; html+=""; html+=""; html+=""; html+=""; html+=""; html+=""; html+="
    "+tr("\"Nothing's here!\"")+"
    "+tr("Bob is bored with this days lack of data.")+"
    \n"; } } if (day) { html+=getOximeterInformation(day); html+=getMachineSettings(day); html+=getSessionInformation(day); } html+=""; QColor cols[]={ COLOR_Gold, QColor("light blue"), }; const int maxcolors=sizeof(cols)/sizeof(QColor); QList::iterator i; // WebView trashes it without asking.. :( if (cpap) { sessbar=new SessionBar(this); sessbar->setMouseTracking(true); connect(sessbar, SIGNAL(sessionClicked(Session*)), this, SLOT(doToggleSession(Session*))); int c=0; for (i=day->begin();i!=day->end();++i) { Session * s=*i; if ((*s).type() == MT_CPAP) sessbar->add(s, cols[c % maxcolors]); c++; } } else sessbar=nullptr; //sessbar->update(); webView->setHtml(html); ui->JournalNotes->clear(); ui->bookmarkTable->clearContents(); ui->bookmarkTable->setRowCount(0); QStringList sl; //sl.append(tr("Starts")); //sl.append(tr("Notes")); ui->bookmarkTable->setHorizontalHeaderLabels(sl); ui->ZombieMeter->blockSignals(true); ui->weightSpinBox->blockSignals(true); ui->ouncesSpinBox->blockSignals(true); ui->weightSpinBox->setValue(0); ui->ouncesSpinBox->setValue(0); ui->ZombieMeter->setValue(5); ui->ouncesSpinBox->blockSignals(false); ui->weightSpinBox->blockSignals(false); ui->ZombieMeter->blockSignals(false); ui->BMI->display(0); ui->BMI->setVisible(false); ui->BMIlabel->setVisible(false); BookmarksChanged=false; Session *journal=GetJournalSession(date); if (journal) { bool ok; if (journal->settings.contains(Journal_Notes)) ui->JournalNotes->setHtml(journal->settings[Journal_Notes].toString()); if (journal->settings.contains(Journal_Weight)) { double kg=journal->settings[Journal_Weight].toDouble(&ok); if (p_profile->general->unitSystem()==US_Metric) { ui->weightSpinBox->setDecimals(3); ui->weightSpinBox->blockSignals(true); ui->weightSpinBox->setValue(kg); ui->weightSpinBox->blockSignals(false); ui->ouncesSpinBox->setVisible(false); ui->weightSpinBox->setSuffix(STR_UNIT_KG); } else { float ounces=(kg*1000.0)/ounce_convert; int pounds=ounces/16.0; double oz; double frac=modf(ounces,&oz); ounces=(int(ounces) % 16)+frac; ui->weightSpinBox->blockSignals(true); ui->ouncesSpinBox->blockSignals(true); ui->weightSpinBox->setValue(pounds); ui->ouncesSpinBox->setValue(ounces); ui->ouncesSpinBox->blockSignals(false); ui->weightSpinBox->blockSignals(false); ui->weightSpinBox->setSuffix(STR_UNIT_POUND); ui->weightSpinBox->setDecimals(0); ui->ouncesSpinBox->setVisible(true); ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE); } double height=p_profile->user->height()/100.0; if (height>0 && kg>0) { double bmi=kg/(height*height); ui->BMI->setVisible(true); ui->BMIlabel->setVisible(true); ui->BMI->display(bmi); } } if (journal->settings.contains(Journal_ZombieMeter)) { ui->ZombieMeter->blockSignals(true); ui->ZombieMeter->setValue(journal->settings[Journal_ZombieMeter].toDouble(&ok)); ui->ZombieMeter->blockSignals(false); } if (journal->settings.contains(Bookmark_Start)) { QVariantList start=journal->settings[Bookmark_Start].toList(); QVariantList end=journal->settings[Bookmark_End].toList(); QStringList notes=journal->settings[Bookmark_Notes].toStringList(); ui->bookmarkTable->blockSignals(true); qint64 clockdrift=p_profile->cpap->clockDrift()*1000L,drift; Day * dday=p_profile->GetDay(previous_date,MT_CPAP); drift=(dday!=nullptr) ? clockdrift : 0; bool ok; for (int i=0;ibookmarkTable->rowCount(); ui->bookmarkTable->insertRow(i); QTableWidgetItem *tw=new QTableWidgetItem(notes.at(i)); QTableWidgetItem *dw=new QTableWidgetItem(d.time().toString("HH:mm:ss")); dw->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->bookmarkTable->setItem(i,0,dw); ui->bookmarkTable->setItem(i,1,tw); tw->setData(Qt::UserRole,st); tw->setData(Qt::UserRole+1,et); } // for (int i ui->bookmarkTable->blockSignals(false); } // if (journal->settings.contains(Bookmark_Start)) } // if (journal) } void Daily::UnitsChanged() { double kg; if (p_profile->general->unitSystem()==US_Archiac) { kg=ui->weightSpinBox->value(); float ounces=(kg*1000.0)/ounce_convert; int pounds=ounces/16; float oz=fmodf(ounces,16); ui->weightSpinBox->setValue(pounds); ui->ouncesSpinBox->setValue(oz); ui->weightSpinBox->setDecimals(0); ui->weightSpinBox->setSuffix(STR_UNIT_POUND); ui->ouncesSpinBox->setVisible(true); ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE); } else { kg=(ui->weightSpinBox->value()*(ounce_convert*16.0))+(ui->ouncesSpinBox->value()*ounce_convert); kg/=1000.0; ui->weightSpinBox->setDecimals(3); ui->weightSpinBox->setValue(kg); ui->ouncesSpinBox->setVisible(false); ui->weightSpinBox->setSuffix(STR_UNIT_KG); } } void Daily::clearLastDay() { lastcpapday=nullptr; } void Daily::Unload(QDate date) { if (!date.isValid()) { date = getDate(); if (!date.isValid()) { graphView()->setDay(nullptr); return; } } webView->setHtml(""); Session *journal=GetJournalSession(date); bool nonotes=ui->JournalNotes->toPlainText().isEmpty(); if (journal) { QString jhtml=ui->JournalNotes->toHtml(); if ((!journal->settings.contains(Journal_Notes) && !nonotes) || (journal->settings[Journal_Notes]!=jhtml)) { journal->settings[Journal_Notes]=jhtml; journal->SetChanged(true); } } else { if (!nonotes) { journal=CreateJournalSession(date); if (!nonotes) { journal->settings[Journal_Notes]=ui->JournalNotes->toHtml(); journal->SetChanged(true); } } } if (journal) { if (nonotes) { QHash::iterator it=journal->settings.find(Journal_Notes); if (it!=journal->settings.end()) { journal->settings.erase(it); } } if (journal->IsChanged()) { journal->settings[LastUpdated]=QDateTime::currentDateTime(); // blah.. was updating overview graphs here.. Was too slow. } Machine *jm=p_profile->GetMachine(MT_JOURNAL); if (jm) jm->SaveSummary(); //(journal); } UpdateCalendarDay(date); } void Daily::on_JournalNotesItalic_clicked() { QTextCursor cursor = ui->JournalNotes->textCursor(); if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); QTextCharFormat format=cursor.charFormat(); format.setFontItalic(!format.fontItalic()); cursor.mergeCharFormat(format); //ui->JournalNotes->mergeCurrentCharFormat(format); } void Daily::on_JournalNotesBold_clicked() { QTextCursor cursor = ui->JournalNotes->textCursor(); if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); QTextCharFormat format=cursor.charFormat(); int fw=format.fontWeight(); if (fw!=QFont::Bold) format.setFontWeight(QFont::Bold); else format.setFontWeight(QFont::Normal); cursor.mergeCharFormat(format); //ui->JournalNotes->mergeCurrentCharFormat(format); } void Daily::on_JournalNotesFontsize_activated(int index) { QTextCursor cursor = ui->JournalNotes->textCursor(); if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); QTextCharFormat format=cursor.charFormat(); QFont font=format.font(); int fontsize=10; if (index==1) fontsize=15; else if (index==2) fontsize=25; font.setPointSize(fontsize); format.setFont(font); cursor.mergeCharFormat(format); } void Daily::on_JournalNotesColour_clicked() { QColor col=QColorDialog::getColor(COLOR_Black,this,tr("Pick a Colour")); //,QColorDialog::NoButtons); if (!col.isValid()) return; QTextCursor cursor = ui->JournalNotes->textCursor(); if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); QBrush b(col); QPalette newPalette = palette(); newPalette.setColor(QPalette::ButtonText, col); ui->JournalNotesColour->setPalette(newPalette); QTextCharFormat format=cursor.charFormat(); format.setForeground(b); cursor.setCharFormat(format); } Session * Daily::CreateJournalSession(QDate date) { Machine *m = p_profile->GetMachine(MT_JOURNAL); if (!m) { m=new Machine(0); MachineInfo info; info.loadername = "Journal"; info.serial = m->hexid(); info.brand = "Journal"; info.type = MT_JOURNAL; m->setInfo(info); m->setType(MT_JOURNAL); p_profile->AddMachine(m); } Session *sess=new Session(m,0); qint64 st,et; Day *cday=p_profile->GetDay(date); if (cday) { st=cday->first(); et=cday->last(); } else { QDateTime dt(date,QTime(20,0)); st=qint64(dt.toTime_t())*1000L; et=st+3600000L; } sess->SetSessionID(st / 1000L); sess->set_first(st); sess->set_last(et); m->AddSession(sess); return sess; } Session * Daily::GetJournalSession(QDate date) // Get the first journal session { Day *day=p_profile->GetDay(date, MT_JOURNAL); if (day) { Session * session = day->firstSession(MT_JOURNAL); if (!session) { session = CreateJournalSession(date); } return session; } return nullptr; } void Daily::RedrawGraphs() { // setting this here, because it needs to be done when preferences change if (p_profile->cpap->showLeakRedline()) { schema::channel[CPAP_Leak].setUpperThreshold(p_profile->cpap->leakRedline()); } else { schema::channel[CPAP_Leak].setUpperThreshold(0); // switch it off } GraphView->redraw(); } void Daily::on_LineCursorUpdate(double time) { if (time > 1) { QDateTime dt = QDateTime::fromMSecsSinceEpoch(time); QString txt = dt.toString("MMM dd HH:mm:ss.zzz"); dateDisplay->setText(txt); } else dateDisplay->setText(QString(GraphView->emptyText())); } void Daily::on_RangeUpdate(double minx, double maxx) { if (minx > 1) { dateDisplay->setText(GraphView->getRangeString()); } else { dateDisplay->setText(QString(GraphView->emptyText())); } /* // Delay render some stats... Day * day = GraphView->day(); if (day) { QTime time; time.start(); QList list = day->getSortedMachineChannels(schema::WAVEFORM); for (int i=0; i< list.size();i++) { schema::Channel & chan = schema::channel[list.at(i)]; ChannelID code = chan.id(); if (!day->channelExists(code)) continue; float avg = day->rangeAvg(code, minx, maxx); float wavg = day->rangeWavg(code, minx, maxx); float median = day->rangePercentile(code, 0.5, minx, maxx); float p90 = day->rangePercentile(code, 0.9, minx, maxx); // qDebug() << chan.label() // << "AVG=" << avg // << "WAVG=" << wavg; // << "MED" << median // << "90%" << p90; } qDebug() << time.elapsed() << "ms"; }*/ } void Daily::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column) { Q_UNUSED(column); QDateTime d; if (!item->data(0,Qt::UserRole).isNull()) { qint64 winsize=qint64(p_profile->general->eventWindowSize())*60000L; qint64 t=item->data(0,Qt::UserRole).toLongLong(); double st=t-(winsize/2); double et=t+(winsize/2); gGraph *g=GraphView->findGraph(STR_GRAPH_SleepFlags); if (!g) return; if (strmin_x) { st=g->rmin_x; et=st+winsize; } if (et>g->rmax_x) { et=g->rmax_x; st=et-winsize; } GraphView->SetXBounds(st,et); } } void Daily::on_treeWidget_itemSelectionChanged() { if (ui->treeWidget->selectedItems().size()==0) return; QTreeWidgetItem *item=ui->treeWidget->selectedItems().at(0); if (!item) return; on_treeWidget_itemClicked(item, 0); } void Daily::on_JournalNotesUnderline_clicked() { QTextCursor cursor = ui->JournalNotes->textCursor(); if (!cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); QTextCharFormat format=cursor.charFormat(); format.setFontUnderline(!format.fontUnderline()); cursor.mergeCharFormat(format); //ui->JournalNotes->mergeCurrentCharFormat(format); } void Daily::on_prevDayButton_clicked() { if (!p_profile->ExistsAndTrue("SkipEmptyDays")) { LoadDate(previous_date.addDays(-1)); } else { QDate d=previous_date; for (int i=0;i<90;i++) { d=d.addDays(-1); if (p_profile->GetDay(d)) { LoadDate(d); break; } } } } void Daily::on_nextDayButton_clicked() { if (!p_profile->ExistsAndTrue("SkipEmptyDays")) { LoadDate(previous_date.addDays(1)); } else { QDate d=previous_date; for (int i=0;i<90;i++) { d=d.addDays(1); if (p_profile->GetDay(d)) { LoadDate(d); break; } } } } void Daily::on_calButton_toggled(bool checked) { bool b=checked; ui->calendarFrame->setVisible(b); p_profile->appearance->setCalendarVisible(b); if (!b) { ui->calButton->setArrowType(Qt::DownArrow); } else { ui->calButton->setArrowType(Qt::UpArrow); } } void Daily::on_todayButton_clicked() { // QDate d=QDate::currentDate(); // if (d > p_profile->LastDay()) { QDate lastcpap = p_profile->LastDay(MT_CPAP); QDate lastoxi = p_profile->LastDay(MT_OXIMETER); QDate d = qMax(lastcpap, lastoxi); // } LoadDate(d); } void Daily::on_evViewSlider_valueChanged(int value) { ui->evViewLCD->display(value); p_profile->general->setEventWindowSize(value); int winsize=value*60; gGraph *g=GraphView->findGraph(STR_GRAPH_SleepFlags); if (!g) return; qint64 st=g->min_x; qint64 et=g->max_x; qint64 len=et-st; qint64 d=st+len/2.0; st=d-(winsize/2)*1000; et=d+(winsize/2)*1000; if (strmin_x) { st=g->rmin_x; et=st+winsize*1000; } if (et>g->rmax_x) { et=g->rmax_x; st=et-winsize*1000; } GraphView->SetXBounds(st,et); } void Daily::on_bookmarkTable_itemClicked(QTableWidgetItem *item) { int row=item->row(); qint64 st,et; // qint64 clockdrift=p_profile->cpap->clockDrift()*1000L,drift; // Day * dday=p_profile->GetDay(previous_date,MT_CPAP); // drift=(dday!=nullptr) ? clockdrift : 0; QTableWidgetItem *it=ui->bookmarkTable->item(row,1); bool ok; st=it->data(Qt::UserRole).toLongLong(&ok); et=it->data(Qt::UserRole+1).toLongLong(&ok); qint64 st2=0,et2=0,st3,et3; Day * day=p_profile->GetGoodDay(previous_date,MT_CPAP); if (day) { st2=day->first(); et2=day->last(); } Day * oxi=p_profile->GetGoodDay(previous_date,MT_OXIMETER); if (oxi) { st3=oxi->first(); et3=oxi->last(); } if (oxi && day) { st2=qMin(st2,st3); et2=qMax(et2,et3); } else if (oxi) { st2=st3; et2=et3; } else if (!day) return; if ((etet2)) { mainwin->Notify(tr("This bookmarked is in a currently disabled area..")); return; } if (stet2) et=et2; GraphView->SetXBounds(st,et); GraphView->redraw(); } void Daily::addBookmark(qint64 st, qint64 et, QString text) { ui->bookmarkTable->blockSignals(true); QDateTime d=QDateTime::fromTime_t(st/1000L); int row=ui->bookmarkTable->rowCount(); ui->bookmarkTable->insertRow(row); QTableWidgetItem *tw=new QTableWidgetItem(text); QTableWidgetItem *dw=new QTableWidgetItem(d.time().toString("HH:mm:ss")); dw->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); ui->bookmarkTable->setItem(row,0,dw); ui->bookmarkTable->setItem(row,1,tw); qint64 clockdrift=p_profile->cpap->clockDrift()*1000L,drift; Day * day=p_profile->GetDay(previous_date,MT_CPAP); drift=(day!=nullptr) ? clockdrift : 0; // Counter CPAP clock drift for storage, in case user changes it later on // This won't fix the text string names.. tw->setData(Qt::UserRole,st-drift); tw->setData(Qt::UserRole+1,et-drift); ui->bookmarkTable->blockSignals(false); update_Bookmarks(); mainwin->updateFavourites(); } void Daily::on_addBookmarkButton_clicked() { qint64 st,et; GraphView->GetXBounds(st,et); QDateTime d=QDateTime::fromTime_t(st/1000L); addBookmark(st,et, tr("Bookmark at %1").arg(d.time().toString("HH:mm:ss"))); } void Daily::update_Bookmarks() { QVariantList start; QVariantList end; QStringList notes; QTableWidgetItem *item; for (int row=0;rowbookmarkTable->rowCount();row++) { item=ui->bookmarkTable->item(row,1); start.push_back(item->data(Qt::UserRole)); end.push_back(item->data(Qt::UserRole+1)); notes.push_back(item->text()); } Session *journal=GetJournalSession(previous_date); if (!journal) { journal=CreateJournalSession(previous_date); } journal->settings[Bookmark_Start]=start; journal->settings[Bookmark_End]=end; journal->settings[Bookmark_Notes]=notes; journal->settings[LastUpdated]=QDateTime::currentDateTime(); journal->SetChanged(true); BookmarksChanged=true; mainwin->updateFavourites(); } void Daily::on_removeBookmarkButton_clicked() { int row=ui->bookmarkTable->currentRow(); if (row>=0) { ui->bookmarkTable->blockSignals(true); ui->bookmarkTable->removeRow(row); ui->bookmarkTable->blockSignals(false); update_Bookmarks(); } mainwin->updateFavourites(); } void Daily::on_ZombieMeter_valueChanged(int action) { Q_UNUSED(action); ZombieMeterMoved=true; Session *journal=GetJournalSession(previous_date); if (!journal) { journal=CreateJournalSession(previous_date); } journal->settings[Journal_ZombieMeter]=ui->ZombieMeter->value(); journal->SetChanged(true); // shouldn't be needed anymore with new overview model.. //if (mainwin->getOverview()) mainwin->getOverview()->ResetGraph("Zombie"); } void Daily::on_bookmarkTable_itemChanged(QTableWidgetItem *item) { Q_UNUSED(item); update_Bookmarks(); } void Daily::on_weightSpinBox_valueChanged(double arg1) { // Update the BMI display double kg; if (p_profile->general->unitSystem()==US_Archiac) { kg=((arg1*pound_convert) + (ui->ouncesSpinBox->value()*ounce_convert)) / 1000.0; } else kg=arg1; double height=p_profile->user->height()/100.0; if ((height>0) && (kg>0)) { double bmi=kg/(height * height); ui->BMI->display(bmi); ui->BMI->setVisible(true); } } void Daily::on_weightSpinBox_editingFinished() { double arg1=ui->weightSpinBox->value(); double height=p_profile->user->height()/100.0; Session *journal=GetJournalSession(previous_date); if (!journal) { journal=CreateJournalSession(previous_date); } double kg; if (p_profile->general->unitSystem()==US_Archiac) { kg=((arg1*pound_convert) + (ui->ouncesSpinBox->value()*ounce_convert)) / 1000.0; } else { kg=arg1; } journal->settings[Journal_Weight]=kg; gGraphView *gv=mainwin->getOverview()->graphView(); gGraph *g; if (gv) { g=gv->findGraph(STR_GRAPH_Weight); if (g) g->setDay(nullptr); } if ((height>0) && (kg>0)) { double bmi=kg/(height * height); ui->BMI->display(bmi); ui->BMI->setVisible(true); journal->settings[Journal_BMI]=bmi; if (gv) { g=gv->findGraph(STR_GRAPH_BMI); if (g) g->setDay(nullptr); } } journal->SetChanged(true); } void Daily::on_ouncesSpinBox_valueChanged(int arg1) { // just update for BMI display double height=p_profile->user->height()/100.0; double kg=((ui->weightSpinBox->value()*pound_convert) + (arg1*ounce_convert)) / 1000.0; if ((height>0) && (kg>0)) { double bmi=kg/(height * height); ui->BMI->display(bmi); ui->BMI->setVisible(true); } } void Daily::on_ouncesSpinBox_editingFinished() { double arg1=ui->ouncesSpinBox->value(); Session *journal=GetJournalSession(previous_date); if (!journal) { journal=CreateJournalSession(previous_date); } double height=p_profile->user->height()/100.0; double kg=((ui->weightSpinBox->value()*pound_convert) + (arg1*ounce_convert)) / 1000.0; journal->settings[Journal_Weight]=kg; gGraph *g; if (mainwin->getOverview()) { g=mainwin->getOverview()->graphView()->findGraph(STR_GRAPH_Weight); if (g) g->setDay(nullptr); } if ((height>0) && (kg>0)) { double bmi=kg/(height * height); ui->BMI->display(bmi); ui->BMI->setVisible(true); journal->settings[Journal_BMI]=bmi; if (mainwin->getOverview()) { g=mainwin->getOverview()->graphView()->findGraph(STR_GRAPH_BMI); if (g) g->setDay(nullptr); } } journal->SetChanged(true); // shouldn't be needed anymore with new overview model //if (mainwin->getOverview()) mainwin->getOverview()->ResetGraph(STR_GRAPH_Weight); } QString Daily::GetDetailsText() { webView->triggerPageAction(QWebPage::SelectAll); QString text=webView->page()->selectedText(); webView->triggerPageAction(QWebPage::MoveToEndOfDocument); webView->triggerPageAction(QWebPage::SelectEndOfDocument); return text; } void Daily::on_graphCombo_activated(int index) { if (index<0) return; gGraph *g; QString s; s=ui->graphCombo->currentText(); bool b=!ui->graphCombo->itemData(index,Qt::UserRole).toBool(); ui->graphCombo->setItemData(index,b,Qt::UserRole); if (b) { ui->graphCombo->setItemIcon(index,*icon_on); } else { ui->graphCombo->setItemIcon(index,*icon_off); } g=GraphView->findGraphTitle(s); g->setVisible(b); updateCube(); GraphView->updateScale(); GraphView->redraw(); } void Daily::updateCube() { //brick.. if ((GraphView->visibleGraphs()==0)) { ui->toggleGraphs->setArrowType(Qt::UpArrow); ui->toggleGraphs->setToolTip(tr("Show all graphs")); ui->toggleGraphs->blockSignals(true); ui->toggleGraphs->setChecked(true); ui->toggleGraphs->blockSignals(false); if (ui->graphCombo->count() > 0) { GraphView->setEmptyText(STR_Empty_NoGraphs); } else { if (!p_profile->GetGoodDay(getDate(), MT_CPAP) && !p_profile->GetGoodDay(getDate(), MT_OXIMETER) && !p_profile->GetGoodDay(getDate(), MT_SLEEPSTAGE) && !p_profile->GetGoodDay(getDate(), MT_POSITION)) { GraphView->setEmptyText(STR_Empty_NoData); } else { if (GraphView->emptyText() != STR_Empty_Brick) GraphView->setEmptyText(STR_Empty_SummaryOnly); } } } else { ui->toggleGraphs->setArrowType(Qt::DownArrow); ui->toggleGraphs->setToolTip(tr("Hide all graphs")); ui->toggleGraphs->blockSignals(true); ui->toggleGraphs->setChecked(false); ui->toggleGraphs->blockSignals(false); } } void Daily::on_toggleGraphs_clicked(bool checked) { QString s; QIcon *icon=checked ? icon_off : icon_on; for (int i=0;igraphCombo->count();i++) { s=ui->graphCombo->itemText(i); ui->graphCombo->setItemIcon(i,*icon); ui->graphCombo->setItemData(i,!checked,Qt::UserRole); } for (int i=0;isize();i++) { (*GraphView)[i]->setVisible(!checked); } updateCube(); GraphView->updateScale(); GraphView->redraw(); } void Daily::updateGraphCombo() { ui->graphCombo->clear(); gGraph *g; for (int i=0;isize();i++) { g=(*GraphView)[i]; if (g->isEmpty()) continue; if (g->visible()) { ui->graphCombo->addItem(*icon_on,g->title(),true); } else { ui->graphCombo->addItem(*icon_off,g->title(),false); } } ui->graphCombo->setCurrentIndex(0); updateCube(); } void Daily::on_eventsCombo_activated(int index) { if (index<0) return; ChannelID code = ui->eventsCombo->itemData(index, Qt::UserRole).toUInt(); schema::Channel * chan = &schema::channel[code]; bool b = !chan->enabled(); chan->setEnabled(b); ui->eventsCombo->setItemIcon(index,b ? *icon_on : *icon_off); GraphView->redraw(); } void Daily::on_toggleEvents_clicked(bool checked) { QString s; QIcon *icon=checked ? icon_on : icon_off; ui->toggleEvents->setArrowType(checked ? Qt::DownArrow : Qt::UpArrow); ui->toggleEvents->setToolTip(checked ? tr("Hide all events") : tr("Show all events")); // ui->toggleEvents->blockSignals(true); // ui->toggleEvents->setChecked(false); // ui->toggleEvents->blockSignals(false); for (int i=0;ieventsCombo->count();i++) { // s=ui->eventsCombo->itemText(i); ui->eventsCombo->setItemIcon(i,*icon); ChannelID code = ui->eventsCombo->itemData(i).toUInt(); schema::channel[code].setEnabled(checked); } updateCube(); GraphView->redraw(); } //void Daily::on_sessionWidget_itemSelectionChanged() //{ // int row = ui->sessionWidget->currentRow(); // QTableWidgetItem *item = ui->sessionWidget->item(row, 0); // if (item) { // QDate date = item->data(Qt::UserRole).toDate(); // LoadDate(date); // qDebug() << "Clicked.. changing date to" << date; // // ui->sessionWidget->setCurrentItem(item); // } //} sleepyhead-0.9.8/sleepyhead/main.cpp0000644000175000017500000003574712412506713017011 0ustar sergiosergio/* SleepyHead Main * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "logger.h" #include "SleepLib/schema.h" #include "mainwindow.h" #include "SleepLib/profiles.h" #include "profileselect.h" #include "newprofile.h" #include "translation.h" #include "common_gui.h" #include "SleepLib/machine_loader.h" // Gah! I must add the real darn plugin system one day. #include "SleepLib/loader_plugins/prs1_loader.h" #include "SleepLib/loader_plugins/cms50_loader.h" #include "SleepLib/loader_plugins/cms50f37_loader.h" #include "SleepLib/loader_plugins/md300w1_loader.h" #include "SleepLib/loader_plugins/zeo_loader.h" #include "SleepLib/loader_plugins/somnopose_loader.h" #include "SleepLib/loader_plugins/resmed_loader.h" #include "SleepLib/loader_plugins/intellipap_loader.h" #include "SleepLib/loader_plugins/icon_loader.h" #include "SleepLib/loader_plugins/weinmann_loader.h" #ifdef Q_WS_X11 #include #endif MainWindow *mainwin = nullptr; void initialize() { schema::init(); } void release_notes() { QDialog relnotes; relnotes.setWindowTitle(STR_TR_SleepyHead + " " + QObject::tr("Release Notes") +" "+FullVersionString); QVBoxLayout layout(&relnotes); QWebView web(&relnotes); // Language??? web.load(QUrl("qrc:/docs/release_notes.html")); //web.page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOn); relnotes.setLayout(&layout); layout.insertWidget(0, &web, 1); QPushButton okbtn(QObject::tr("&Ok, get on with it.."), &relnotes); relnotes.connect(&okbtn, SIGNAL(clicked()), SLOT(accept())); layout.insertWidget(1, &okbtn, 1); QApplication::processEvents(); // MW: Needed on Mac, as the html has to finish loading relnotes.exec(); } void sDelay(int s) { // QThread::msleep() is exposed in Qt5 #ifdef Q_OS_WIN32 Sleep(s * 1000); #else sleep(s); #endif } int compareVersion(QString version); int main(int argc, char *argv[]) { #ifdef Q_WS_X11 XInitThreads(); #endif #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QGL::setPreferredPaintEngine(QPaintEngine::OpenGL); #endif bool force_login_screen = false; bool force_data_dir = false; QApplication a(argc, argv); QStringList args = QCoreApplication::arguments(); QSettings settings(getDeveloperName(), getAppName()); for (int i = 1; i < args.size(); i++) { if (args[i] == "-l") { force_login_screen = true; } else if (args[i] == "-d") { force_data_dir = true; } else if (args[i] == "-language") { settings.setValue("Settings/Language",""); } else if (args[i] == "-p") { sDelay(1); } } initializeLogger(); //////////////////////////////////////////////////////////////////////////////////////////// // Language Selection //////////////////////////////////////////////////////////////////////////////////////////// initTranslations(settings); initializeStrings(); // Important, call this AFTER translator is installed. a.setApplicationName(STR_TR_SleepyHead); float glversion = getOpenGLVersion(); bool opengl2supported = glversion >= 2.0; bool bad_graphics = !opengl2supported; bool intel_graphics = getOpenGLVersionString().contains("INTEL", Qt::CaseInsensitive); #if defined(Q_OS_WIN) bool angle_supported = getGraphicsEngine().contains(CSTR_GFX_ANGLE, Qt::CaseInsensitive) && (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA); if (bad_graphics) { bad_graphics = !angle_supported; } #endif QString lookfor = QObject::tr("Look for this build in SleepyHead's files hosted on Sourceforge.").arg("http://sf.net/projects/sleepyhead/files"); #ifdef BROKEN_OPENGL_BUILD Q_UNUSED(bad_graphics) Q_UNUSED(intel_graphics) QString betterbuild = "Settings/BetterBuild"; QString fasterbuildavailable = QObject::tr("A faster build of SleepyHead may be available"); QString notbotheragain = QObject::tr("You will not be bothered with this message again."); QString betterresults = QObject::tr("This version will run fine, but a \"%1\" tagged build of SleepyHead will likely run much smoother on your computer."); if (opengl2supported) { if (!settings.value(betterbuild, false).toBool()) { QMessageBox::information(nullptr, fasterbuildavailable, QObject::tr("This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.") + "

    "+ betterresults.arg("-OpenGL")+"

    "+ lookfor + "

    "+ notbotheragain, QMessageBox::Ok, QMessageBox::Ok); settings.setValue(betterbuild, true); } } else { #if defined(Q_OS_WIN) if (angle_supported) { if (!settings.value(betterbuild, false).toBool()) { QMessageBox::information(nullptr, fasterbuildavailable, QObject::tr("This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.") + "

    "+ betterresults.arg("-ANGLE")+"

    "+ QObject::tr("If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.")+"

    "+ lookfor + "

    "+ notbotheragain, QMessageBox::Ok, QMessageBox::Ok); settings.setValue(betterbuild, true); } } #endif } #else if (bad_graphics) { QMessageBox::warning(nullptr, QObject::tr("Incompatible Graphics Hardware"), QObject::tr("This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.") + "

    "+ QObject::tr("You may need to update your computers graphics drivers from the GPU makers website. %1"). arg(intel_graphics ? QObject::tr("(Intel's support site)") : "")+"

    "+ QObject::tr("Because graphs will not render correctly, and it may cause crashes, this build will now exit.")+"

    "+ QObject::tr("Don't be disheartened, there is another build available tagged \"-BrokenGL\" that should work on your computer.")+ "

    "+ lookfor+ "

    " ,QMessageBox::Ok, QMessageBox::Ok); exit(1); } #endif //////////////////////////////////////////////////////////////////////////////////////////// // Datafolder location Selection //////////////////////////////////////////////////////////////////////////////////////////// bool change_data_dir = force_data_dir; bool havefolder = false; if (!settings.contains("Settings/AppRoot")) { change_data_dir = true; } else { QDir dir(GetAppRoot()); if (!dir.exists()) { change_data_dir = true; } else { havefolder = true; } } if (!havefolder && !force_data_dir) { if (QMessageBox::question(nullptr, STR_MessageBox_Question, QObject::tr("No SleepyHead data folder was found.")+"\n\n"+QObject::tr("Would you like SleepyHead to use the default location for storing its data?")+"\n\n"+ QDir::toNativeSeparators(GetAppRoot()), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { settings.setValue("Settings/AppRoot", GetAppRoot()); change_data_dir = false; } } retry_directory: if (change_data_dir) { QString datadir = QFileDialog::getExistingDirectory(nullptr, QObject::tr("Choose or create new folder for SleepyHead data"), GetAppRoot(), QFileDialog::ShowDirsOnly); if (datadir.isEmpty()) { if (!havefolder) { QMessageBox::information(nullptr, QObject::tr("Exiting"), QObject::tr("As you did not select a data folder, SleepyHead will exit.")+"\n\n"+QObject::tr("Next time you run, you will be asked again.")); return 0; } else { QMessageBox::information(nullptr, STR_MessageBox_Warning, QObject::tr("You did not select a directory.")+"\n\n"+QObject::tr("SleepyHead will now start with your old one.")+"\n\n"+ QDir::toNativeSeparators(GetAppRoot()), QMessageBox::Ok); } } else { QDir dir(datadir); QFile file(datadir + "/Preferences.xml"); if (!file.exists()) { if (dir.count() > 2) { // Not a new directory.. nag the user. if (QMessageBox::question(nullptr, STR_MessageBox_Warning, QObject::tr("The folder you chose is not empty, nor does it already contain valid SleepyHead data.") + "\n\n"+QObject::tr("Are you sure you want to use this folder?")+"\n\n" + datadir, QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { goto retry_directory; } } } settings.setValue("Settings/AppRoot", datadir); qDebug() << "Changing data folder to" << datadir; } } //////////////////////////////////////////////////////////////////////////////////////////// // Register Importer Modules for autoscanner //////////////////////////////////////////////////////////////////////////////////////////// initialize(); PRS1Loader::Register(); ResmedLoader::Register(); IntellipapLoader::Register(); FPIconLoader::Register(); WeinmannLoader::Register(); CMS50Loader::Register(); CMS50F37Loader::Register(); MD300W1Loader::Register(); //ZEOLoader::Register(); // Use outside of directory importer.. schema::setOrders(); p_pref = new Preferences("Preferences"); p_layout = new Preferences("Layout"); PREF.Open(); LAYOUT.Open(); // Scan for user profiles Profiles::Scan(); //qRegisterMetaType("Preference"); PREF["AppName"] = STR_TR_SleepyHead; // Skip login screen, unless asked not to on the command line bool skip_login = PREF.ExistsAndTrue(STR_GEN_SkipLogin); if (force_login_screen) { skip_login = false; } // Todo: Make a wrapper for Preference settings, like Profile settings have.. QDateTime lastchecked, today = QDateTime::currentDateTime(); PREF.init(STR_GEN_UpdatesAutoCheck, true); PREF.init(STR_GEN_UpdateCheckFrequency, 7); // days PREF.init(STR_PREF_AllowEarlyUpdates, false); //////////////////////////////////////////////////////////////////////////////////////////// // Check when last checked for updates.. //////////////////////////////////////////////////////////////////////////////////////////// bool check_updates = false; if (PREF[STR_GEN_UpdatesAutoCheck].toBool()) { int update_frequency = PREF[STR_GEN_UpdateCheckFrequency].toInt(); int days = 1000; lastchecked = PREF[STR_GEN_UpdatesLastChecked].toDateTime(); if (PREF.contains(STR_GEN_UpdatesLastChecked)) { days = lastchecked.secsTo(today); days /= 86400; }; if (days > update_frequency) { check_updates = true; } } if (!Profiles::profiles.size()) { // Show New User wizard.. NewProfile newprof(0); if (newprof.exec() == NewProfile::Rejected) { return 0; } release_notes(); } else { if (PREF.contains(STR_PREF_VersionString)) { int vc = compareVersion(PREF[STR_PREF_VersionString].toString()); if (vc < 0) { release_notes(); check_updates = false; } else if (vc > 0) { if (QMessageBox::warning(nullptr, STR_MessageBox_Error, QObject::tr("The version of SleepyHead you just ran is OLDER than the one used to create this data (%1).").arg(PREF[STR_PREF_VersionString].toString()) +"\n\n"+ QObject::tr("It is likely that doing this will cause data corruption, are you sure you want to do this?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) { return 0; } } } ProfileSelect profsel(0); if (skip_login) { profsel.QuickLogin(); if (profsel.result() == ProfileSelect::Rejected) { exit(1); } p_profile = Profiles::Get(PREF[STR_GEN_Profile].toString()); } else { p_profile = nullptr; } if (!p_profile) { if (profsel.exec() == ProfileSelect::Rejected) { exit(1); } } } PREF[STR_PREF_VersionString] = FullVersionString; p_profile = Profiles::Get(PREF[STR_GEN_Profile].toString()); qDebug() << "Opened Profile" << p_profile->user->userName(); // int id=QFontDatabase::addApplicationFont(":/fonts/FreeSans.ttf"); // QFontDatabase fdb; // QStringList ffam=fdb.families(); // for (QStringList::iterator i=ffam.begin();i!=ffam.end();i++) { // qDebug() << "Loaded Font: " << (*i); // } if (!PREF.contains("Fonts_Application_Name")) { PREF["Fonts_Application_Name"] = "Sans Serif"; PREF["Fonts_Application_Size"] = 10; PREF["Fonts_Application_Bold"] = false; PREF["Fonts_Application_Italic"] = false; } QApplication::setFont(QFont(PREF["Fonts_Application_Name"].toString(), PREF["Fonts_Application_Size"].toInt(), PREF["Fonts_Application_Bold"].toBool() ? QFont::Bold : QFont::Normal, PREF["Fonts_Application_Italic"].toBool())); qDebug() << "Selected Font" << QApplication::font().family(); // Must be initialized AFTER profile creation MainWindow w; mainwin = &w; // if (check_updates) { mainwin->CheckForUpdates(); } w.show(); return a.exec(); } sleepyhead-0.9.8/sleepyhead/build_number.h0000644000175000017500000000003412412506713020156 0ustar sergiosergioconst int build_number = 0; sleepyhead-0.9.8/sleepyhead/translation.cpp0000644000175000017500000001247012412506713020407 0ustar sergiosergio/* Multilingual Support files * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef nullptr #define nullptr NULL #endif #include "translation.h" void initTranslations(QSettings & settings) { // (Ordinary character sets will just use the name before the first '.' in the filename.) // (This u8 stuff deliberately kills Qt4.x build support - if you know another way feel free to // change it, but Qt4 support is still going to die sooner or later) // Add any languages with special character set needs to this list QHash langNames; langNames["zh"] = "漢語ç¹é«”å­—"; langNames["es"] = "Español"; langNames["bg"] = "българÑки"; langNames["fr"] = "Français"; langNames["en_UK"] = "English UK"; // CHECK: Will the above break with MS VisualC++ compiler? QHash langFiles; #ifdef Q_OS_MAC QString transdir = QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../Resources/Translations/"); #else const QString transdir = QCoreApplication::applicationDirPath() + "/Translations/"; #endif QDir dir(transdir); qDebug() << "Scanning \"" << transdir << "\" for translations"; dir.setFilter(QDir::Files); dir.setNameFilters(QStringList("*.qm")); QFileInfoList list = dir.entryInfoList(); QString language = settings.value("Settings/Language").toString(); QString langfile, langname; // Add default language (English) const QString en="en_US"; langFiles[en]="English.en_US.qm"; langNames[en]="English US"; // Scan through available translations, and add them to the list for (int i = 0; i < list.size(); ++i) { QFileInfo fi = list.at(i); QString name = fi.fileName().section('.', 0, 0); QString code = fi.fileName().section('.', 1, 1); qDebug() << "Detected" << name << "Translation"; if (langNames.contains(code)) { name = langNames[code]; } else { langNames[code]=name; } langFiles[code]=fi.fileName(); } if (language.isEmpty() || !langNames.contains(language)) { QDialog langsel(nullptr, Qt::CustomizeWindowHint | Qt::WindowTitleHint); QFont font; font.setPointSize(20); langsel.setFont(font); langsel.setWindowTitle("Language / Taal / Sprache / Langue / 语言 / ... "); QHBoxLayout lang_layout(&langsel); QLabel img; img.setPixmap(QPixmap(":/docs/sheep.png")); // hard coded non translatable QPushButton lang_okbtn("->", &langsel); QVBoxLayout layout1; QVBoxLayout layout2; layout2.setMargin(6); lang_layout.setContentsMargins(4,4,4,4); lang_layout.setMargin(6); layout2.setSpacing(6); QListWidget langlist; lang_layout.addLayout(&layout1); lang_layout.addLayout(&layout2); layout1.addWidget(&img); layout2.addWidget(&langlist, 1); langlist.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); int row = 0; for (QHash::iterator it = langNames.begin(); it != langNames.end(); ++it) { const QString & code = it.key(); const QString & name = it.value(); if (!langFiles.contains(code) || langFiles[code].isEmpty()) continue; QListWidgetItem *item = new QListWidgetItem(name); item->setData(Qt::UserRole, code); langlist.insertItem(row++, item); // Todo: Use base system language code if (code.compare(en) == 0) { langlist.setCurrentItem(item); } } langlist.sortItems(); layout2.addWidget(&lang_okbtn); langsel.connect(&langlist, SIGNAL(itemDoubleClicked(QListWidgetItem*)), &langsel, SLOT(close())); langsel.connect(&lang_okbtn, SIGNAL(clicked()), &langsel, SLOT(close())); langsel.exec(); langsel.disconnect(&lang_okbtn, SIGNAL(clicked()), &langsel, SLOT(close())); langsel.disconnect(&langlist, SIGNAL(itemDoubleClicked(QListWidgetItem*)), &langsel, SLOT(close())); langname = langlist.currentItem()->text(); language = langlist.currentItem()->data(Qt::UserRole).toString(); settings.setValue("Settings/Language", language); } langname=langNames[language]; langfile=langFiles[language]; if (language.compare(en) != 0) { qDebug() << "Loading " << langname << " Translation" << langfile << "from" << transdir; QTranslator * translator = new QTranslator(); if (!langfile.isEmpty() && !translator->load(langfile, transdir)) { qWarning() << "Could not load translation" << langfile << "reverting to english :("; } qApp->installTranslator(translator); } else { qDebug() << "Using in-built english Translation"; } } sleepyhead-0.9.8/sleepyhead/STYLE0000644000175000017500000000202512412506713016163 0ustar sergiosergio# Style definitions for Artistic Style. # Usage: astyle --options=STYLE --style=otbs # "One True Brace Style" --max-code-length=99 # Maximum length of a single line. --lineend=linux # Use \n, not \r\n. --attach-namespaces # Attach brackets to a namespace statement. --attach-inlines # Attach brackets to class and struct inline function definitions. --indent-modifiers # Indent C++ class and struct access modifiers one half-indent. --indent-col1-comments # Indent C++ comments beginning in column one, with the code. --break-blocks # Pad empty lines around if, for, and while blocks. --pad-oper # Insert space padding around operators. --pad-header # Insert space padding after if, while, and for paren headers. --unpad-paren # Remove extra space padding around parentheses on inside and outside. --align-pointer=name # char* foo ==> char *foo. Also applies to references. --remove-brackets # Remove brackets from one-line conditional statements. --keep-one-line-blocks # don't break apart multiple statements on one line. sleepyhead-0.9.8/sleepyhead/updateparser.h0000644000175000017500000000464512412506713020222 0ustar sergiosergio/* UpdateParser Header (Autoupdater component) * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef UPDATEPARSER_H #define UPDATEPARSER_H #include #include #include enum UpdateStatus { UPDATE_TESTING = 0, UPDATE_BETA, UPDATE_STABLE, UPDATE_CRITICAL }; /*! \struct Update \brief Holds platform specific information about an individual updates */ class Update { public: Update(); Update(const Update ©); Update(QString _type, QString _version, QString _platform, QDate _date); QString type; QString version; QString platform; UpdateStatus status; QDate date; QString filename; QString url; QString hash; qint64 size; QString notes; QString unzipped_path; }; /*! \struct Release \brief Holds information about an individual major release */ struct Release { Release() {} Release(const Release ©) { version = copy.version; codename = copy.version; notes = copy.notes; info_url = copy.info_url; status = copy.status; updates = copy.updates; } Release(QString ver, QString code, UpdateStatus stat) { version = ver; codename = code; status = stat; } QString version; QString codename; UpdateStatus status; QString info_url; QHash notes; // by platform QHash > updates; }; Q_DECLARE_METATYPE(Update *) /*! \class UpdateParser \brief SAX XML parser for update.xml */ class UpdateParser: public QXmlDefaultHandler { public: bool startDocument(); bool endElement(const QString &namespaceURI, const QString &localName, const QString &name); bool characters(const QString &ch); bool startElement(const QString &namespaceURI, const QString &localName, const QString &name, const QXmlAttributes &atts); bool endDocument(); QString latest() { return latest_version; } QHash releases; private: Update *update; Release *release; QString version, platform; QString release_date; QString latest_version; bool inRelease; bool inUpdate; bool inNotes; bool inUpdateNotes; }; #endif // UPDATEPARSER_H sleepyhead-0.9.8/sleepyhead/SleepLib/0000755000175000017500000000000012412506713017040 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/SleepLib/session.h0000644000175000017500000003554412412506713020707 0ustar sergiosergio/* SleepLib Session Header * * This stuff contains the session calculation smarts * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef SESSION_H #define SESSION_H #define SESSION_DEBUG #include #include #include #include "SleepLib/machine.h" #include "SleepLib/schema.h" #include "SleepLib/event.h" //class EventList; class Machine; enum SliceStatus { UnknownStatus=0, EquipmentOff, EquipmentLeaking, EquipmentOn }; class SessionSlice { public: SessionSlice() { start = end = 0; status = UnknownStatus; } SessionSlice(const SessionSlice & copy) { start = copy.start; end = copy.end; status = copy.status; } SessionSlice(qint64 start, qint64 end, SliceStatus status):start(start), end(end), status(status) {} qint64 start; qint64 end; SliceStatus status; }; /*! \class Session \brief Contains a single Sessions worth of machine event/waveform information. This class also contains all the primary database logic for SleepLib */ class Session { friend class Day; friend class Machine; public: /*! \fn Session(Machine *,SessionID); \brief Create a session object belonging to Machine, with supplied SessionID If sessionID is 0, the next in sequence will be picked */ Session(Machine *, SessionID); virtual ~Session(); inline bool checkInside(qint64 time) { return ((time >= s_first) && (time <= s_last)); } //! \brief Stores the session in the directory supplied by path bool Store(QString path); //! \brief Writes the Sessions Summary Indexes to filename, in SleepLibs custom data format. bool StoreSummary(); // //! \brief Save the Sessions Summary Indexes to the stream // void StoreSummaryData(QDataStream & out) const; //! \brief Writes the Sessions EventLists to filename, in SleepLibs custom data format. bool StoreEvents(); //bool Load(QString path); // //! \brief Loads the Sessions Summary Indexes from stream // void LoadSummaryData(QDataStream & in); //! \brief Loads the Sessions Summary Indexes from filename, from SleepLibs custom data format. bool LoadSummary(); //! \brief Loads the Sessions EventLists from filename, from SleepLibs custom data format. bool LoadEvents(QString filename); //! \brief Loads the events for this session when requested (only the summaries are loaded at startup) bool OpenEvents(); //! \brief Put the events away until needed again, freeing memory void TrashEvents(); //! \brief Returns true if session contains an empty duration inline bool isEmpty() { return (s_first == s_last); } //! \brief Search for Event code happening at supplied time (ms since epoch) EventDataType SearchValue(ChannelID code, qint64 time, bool square); //! \brief Return the sessionID inline const SessionID &session() { return s_session; } //! \brief Returns whether or not session is being used. inline bool enabled() const { return s_enabled; } //! \brief Sets whether or not session is being used. void setEnabled(bool b) { s_enabled = b; } inline qint64 realFirst() const { return s_first; } inline qint64 realLast() const { return s_last; } //! \brief Return the start of this sessions time range (in milliseconds since epoch) qint64 first(); //! \brief Return the end of this sessions time range (in milliseconds since epoch) qint64 last(); //! \brief Return the millisecond length of this session qint64 length() { return s_last - s_first; // qint64 t; // int size = m_slices.size(); // if (size == 0) { // t = (s_last - s_first); // } else { // t = 0; // for (int i=0; i > eventlist; //! \brief Sessions Settings List, contianing single settings for this session. QHash settings; // Session caches QHash m_cnt; QHash m_sum; QHash m_avg; QHash m_wavg; QHash m_min; // The actual minimum QHash m_max; // This could go in channels, but different machines interpret it differently // Under the new SleepyLib data Device model this can be done, but unfortunately not here.. QHash m_physmin; // The physical minimum for graph display purposes QHash m_physmax; // The physical maximum QHash m_cph; // Counts per hour (eg AHI) QHash m_sph; // % indice (eg % night in CSR) QHash m_firstchan; QHash m_lastchan; QHash > m_valuesummary; QHash > m_timesummary; QHash m_gain; QHash m_lowerThreshold; QHash m_timeBelowTheshold; QHash m_upperThreshold; QHash m_timeAboveTheshold; QList m_availableChannels; QList m_availableSettings; QVector m_slices; //! \brief Generates sum and time data for each distinct value in 'code' events.. void updateCountSummary(ChannelID code); //! \brief Destroy any trace of event 'code', freeing any memory if loaded. void destroyEvent(ChannelID code); // UpdateSummaries may recalculate all these, but it may be faster setting upfront void setCount(ChannelID id, EventDataType val) { m_cnt[id] = val; } void setSum(ChannelID id, EventDataType val) { m_sum[id] = val; } void setMin(ChannelID id, EventDataType val) { m_min[id] = val; } void setMax(ChannelID id, EventDataType val) { m_max[id] = val; } void setPhysMin(ChannelID id, EventDataType val) { m_physmin[id] = val; } void setPhysMax(ChannelID id, EventDataType val) { m_physmax[id] = val; } void updateMin(ChannelID id, EventDataType val) { QHash::iterator i = m_min.find(id); if (i == m_min.end()) { m_min[id] = val; } else if (i.value() > val) { i.value() = val; } } void updateMax(ChannelID id, EventDataType val) { QHash::iterator i = m_max.find(id); if (i == m_max.end()) { m_max[id] = val; } else if (i.value() < val) { i.value() = val; } } void setAvg(ChannelID id, EventDataType val) { m_avg[id] = val; } void setWavg(ChannelID id, EventDataType val) { m_wavg[id] = val; } // void setMedian(ChannelID id,EventDataType val) { m_med[id]=val; } // void set90p(ChannelID id,EventDataType val) { m_90p[id]=val; } // void set95p(ChannelID id,EventDataType val) { m_95p[id]=val; } void setCph(ChannelID id, EventDataType val) { m_cph[id] = val; } void setSph(ChannelID id, EventDataType val) { m_sph[id] = val; } void setFirst(ChannelID id, qint64 val) { m_firstchan[id] = val; } void setLast(ChannelID id, qint64 val) { m_lastchan[id] = val; } EventDataType count(ChannelID id); //! \brief Returns the Count of all events of type id between time range EventDataType rangeCount(ChannelID id, qint64 first, qint64 last); //! \brief Returns the Sum of all events of type id between time range double rangeSum(ChannelID id, qint64 first, qint64 last); //! \brief Returns the minimum of events of type id between time range EventDataType rangeMin(ChannelID id, qint64 first, qint64 last); //! \brief Returns the maximum of events of type id between time range EventDataType rangeMax(ChannelID id, qint64 first, qint64 last); //! \brief Returns the count of code events inside span flag event durations EventDataType countInsideSpan(ChannelID span, ChannelID code); //! \brief Returns (and caches) the Sum of all events of type id double sum(ChannelID id); //! \brief Returns (and caches) the Average of all events of type id EventDataType avg(ChannelID id); //! \brief Returns (and caches) the Time Weighted Average of all events of type id EventDataType wavg(ChannelID i); //! \brief Returns (and caches) the Minimum of all events of type id EventDataType Min(ChannelID id); //! \brief Returns (and caches) the Maximum of all events of type id EventDataType Max(ChannelID id); //! \brief Returns (and caches) the Minimum of all events of type id EventDataType physMin(ChannelID id); //! \brief Returns (and caches) the Maximum of all events of type id EventDataType physMax(ChannelID id); //! \brief Returns (and caches) the 90th Percentile of all events of type id EventDataType p90(ChannelID id); //! \brief Returns (and caches) the 95th Percentile of all events of type id EventDataType p95(ChannelID id); //! \brief Returns (and caches) the Median (50th Perc) of all events of type id EventDataType median(ChannelID id); //! \brief Returns (and caches) the Count-Per-Hour of all events of type id EventDataType cph(ChannelID id); //! \brief Returns (and caches) the Sum-Per-Hour of all events of type id EventDataType sph(ChannelID id); //! \brief Returns (without caching) the requested Percentile of all events of type id EventDataType percentile(ChannelID id, EventDataType percentile); //! \brief Returns the amount of time (in decimal minutes) the Channel spent above the threshold EventDataType timeAboveThreshold(ChannelID id, EventDataType threshold); //! \brief Returns the amount of time (in decimal minutes) the Channel spent below the threshold EventDataType timeBelowThreshold(ChannelID id, EventDataType threshold); //! \brief Returns true if the channel has events loaded, or a record of a count for when they are not bool channelExists(ChannelID name); //! \brief Returns true if the channel has event data available (must be loaded first) bool channelDataExists(ChannelID id); bool IsLoneSession() { return s_lonesession; } void SetLoneSession(bool b) { s_lonesession = b; } bool eventsLoaded() { return s_events_loaded; } //! \brief Update this sessions first time if it's less than the current record inline void updateFirst(qint64 v) { if (!s_first) { s_first = v; } else if (s_first > v) { s_first = v; } } //! \brief Update this sessions latest time if it's more than the current record inline void updateLast(qint64 v) { if (!s_last) { s_last = v; } else if (s_last < v) { s_last = v; } } //! \brief Returns (and caches) the first time for Channel code qint64 first(ChannelID code); //! \brief Returns (and caches) the last time for Channel code qint64 last(ChannelID code); //! \brief Regenerates the Session Index Caches, and calls the fun calculation functions void UpdateSummaries(); //! \brief Creates and returns a new EventList for the supplied Channel code EventList *AddEventList(ChannelID code, EventListType et, EventDataType gain = 1.0, EventDataType offset = 0.0, EventDataType min = 0.0, EventDataType max = 0.0, EventDataType rate = 0.0, bool second_field = false); //! \brief Returns this sessions MachineID Machine *machine() { return s_machine; } //! \brief Returns true if session only contains summary data inline bool summaryOnly() { return s_summaryOnly; } inline void setSummaryOnly(bool b) { s_summaryOnly = b; } void setOpened(bool b = true) { s_events_loaded = b; s_summary_loaded = b; } //! \brief Completely purges Session from memory and disk. bool Destroy(); void wipeSummary() { s_first = s_last = 0; s_enabled = true; m_cph.clear(); m_sum.clear(); m_cnt.clear(); } QString eventFile() const; MachineType type() { return s_machtype; } #if defined(SESSION_DEBUG) QStringList session_files; #endif protected: SessionID s_session; Machine *s_machine; qint64 s_first; qint64 s_last; bool s_changed; bool s_lonesession; bool s_evchecksum_checked; bool _first_session; bool s_summaryOnly; bool s_summary_loaded; bool s_events_loaded; bool s_enabled; // for debugging bool destroyed; MachineType s_machtype; }; QDataStream & operator<<(QDataStream & out, const Session & session); QDataStream & operator>>(QDataStream & in, Session & session); #endif // SESSION_H sleepyhead-0.9.8/sleepyhead/SleepLib/day.h0000644000175000017500000002667612412506713020007 0ustar sergiosergio/* SleepLib Day Class Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef DAY_H #define DAY_H #include "SleepLib/common.h" #include "SleepLib/machine_common.h" #include "SleepLib/machine.h" #include "SleepLib/event.h" #include "SleepLib/session.h" /*! \class OneTypePerDay \brief An Exception class to catch multiple machine records per day */ class OneTypePerDay { }; class Machine; class Session; /*! \class Day \brief Contains a list of all Sessions for single date, for a single machine */ class Day { public: Day(); ~Day(); //! \brief Add a new machine to this day record bool addMachine(Machine *m); //! \brief Returns a machine record if present of specified machine type Machine *machine(MachineType type); //! \brief Returns a list of sessions for the specified machine type QList getSessions(MachineType type, bool ignore_enabled = false); //! \brief Add Session to this Day object (called during Load) void addSession(Session *s); EventDataType rangeCount(ChannelID code, qint64 st, qint64 et); EventDataType rangeSum(ChannelID code, qint64 st, qint64 et); EventDataType rangeAvg(ChannelID code, qint64 st, qint64 et); EventDataType rangeWavg(ChannelID code, qint64 st, qint64 et); EventDataType rangePercentile(ChannelID code, float p, qint64 st, qint64 et); //! \brief Returns the count of all this days sessions' events for this day EventDataType count(ChannelID code); //! \brief Returns the Minimum of all this sessions' events for this day EventDataType Min(ChannelID code); //! \brief Returns the Maximum of all sessions' events for this day EventDataType Max(ChannelID code); //! \brief Returns the Minimum of all this sessions' events for this day EventDataType physMin(ChannelID code); //! \brief Returns the Maximum of all sessions' events for this day EventDataType physMax(ChannelID code); //! \brief Returns the Count-per-hour of all sessions' events for this day EventDataType cph(ChannelID code); //! \brief Returns the Sum-per-hour of all this sessions' events for this day EventDataType sph(ChannelID code); //! \brief Returns (and caches) the 90th Percentile of all this sessions' events for this day EventDataType p90(ChannelID code); //! \brief Returns the Average of all this sessions' events for this day EventDataType avg(ChannelID code); //! \brief Returns the Sum of all this sessions' events for this day EventDataType sum(ChannelID code); //! \brief Returns the Time-Weighted Average of all this sessions' events for this day EventDataType wavg(ChannelID code); //! \brief Returns a requested Percentile of all this sessions' events for this day EventDataType percentile(ChannelID code, EventDataType percentile); //! \brief Returns if the cache contains SummaryType information about the requested code bool hasData(ChannelID code, SummaryType type); inline bool hasMachine(MachineType mt) const { return machines.contains(mt); } bool searchMachine(MachineType mt); //! \brief Returns the Average of all Sessions setting 'code' for this day EventDataType settings_avg(ChannelID code); //! \brief Returns the Time-Weighted Average of all Sessions setting 'code' for this day EventDataType settings_wavg(ChannelID code); //! \brief Returns the Sum of all Sessions setting 'code' for this day EventDataType settings_sum(ChannelID code); //! \brief Returns the Minimum of all Sessions setting 'code' for this day EventDataType settings_min(ChannelID code); //! \brief Returns the Maximum of all Sessions setting 'code' for this day EventDataType settings_max(ChannelID code); //! \brief Returns the amount of time (in decimal minutes) the Channel spent above the threshold EventDataType timeAboveThreshold(ChannelID code, EventDataType threshold); //! \brief Returns the amount of time (in decimal minutes) the Channel spent below the threshold EventDataType timeBelowThreshold(ChannelID code, EventDataType threshold); //! \brief Returns the value for Channel code at a given time EventDataType lookupValue(ChannelID code, qint64 time, bool square); //! \brief Returns the count of code events inside span flag event durations EventDataType countInsideSpan(ChannelID span, ChannelID code); //! \brief Returns the first session time of this day qint64 first(); //! \brief Returns the last session time of this day qint64 last(); //! \brief Returns the first session time of this machine type for this day qint64 first(MachineType type); //! \brief Returns the last session time of this machine type for this day qint64 last(MachineType type); // //! \brief Sets the first session time of this day // void setFirst(qint64 val) { d_first=val; } // //! \brief Sets the last session time of this day // void setLast(qint64 val) { d_last=val; } //! \brief Returns the last session time of this day for the supplied Channel code qint64 first(ChannelID code); //! \brief Returns the last session time of this day for the supplied Channel code qint64 last(ChannelID code); //! \brief Returns the total time in milliseconds for this day qint64 total_time(); //! \brief Returns the total time in milliseconds for this day for given machine type qint64 total_time(MachineType type); //! \brief Returns true if this day has enabled sessions for supplied machine type bool hasEnabledSessions(MachineType); //! \brief Returns true if this day has enabled sessions bool hasEnabledSessions(); //! \brief Return the total time in decimal hours for this day EventDataType hours() { if (!d_invalidate) return d_hours; d_invalidate = false; return d_hours = double(total_time()) / 3600000.0; } EventDataType hours(MachineType type) { QHash::iterator it = d_machhours.find(type); if (it == d_machhours.end()) { return d_machhours[type] = double(total_time(type)) / 3600000.0; } return it.value(); } //! \brief Return the session indexed by i Session *operator [](int i) { return sessions[i]; } //! \brief Return the first session as a QVector::iterator QList::iterator begin() { return sessions.begin(); } //! \brief Return the end session record as a QVector::iterator QList::iterator end() { return sessions.end(); } //! \brief Check if day contains SummaryOnly records bool summaryOnly(); //! \brief Finds and returns the index of a session, otherwise -1 if it's not there int find(Session *sess) { return sessions.indexOf(sess); } Session *find(SessionID sessid); //! \brief Returns the number of Sessions in this day record int size() { return sessions.size(); } //! \brief Loads all Events files for this Days Sessions void OpenEvents(); void OpenSummary(); //! \brief Closes all Events files for this Days Sessions void CloseEvents(); //! \brief Returns true if this Day contains loaded Event Data for this channel. bool channelExists(ChannelID id); //! \brief Returns true if session events are loaded bool eventsLoaded(); //! \brief Returns true if this Day contains loaded Event Data or a cached count for this channel bool channelHasData(ChannelID id); //! \brief Returns true if this day contains the supplied settings Channel id bool settingExists(ChannelID id); //! \brief Removes a session from this day bool removeSession(Session *sess); //! \brief Returns a list of channels of supplied types, according to channel orders QList getSortedMachineChannels(quint32 chantype); //! \brief Returns a list of machine specific channels of supplied types, according to channel orders QList getSortedMachineChannels(MachineType type, quint32 chantype); // Some ugly CPAP specific stuff QString getCPAPMode(); QString getPressureRelief(); QString getPressureSettings(); // Some more very much CPAP only related stuff //! \brief Calculate AHI (Apnea Hypopnea Index) EventDataType calcAHI() { EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway); EventDataType minutes = hours(MT_CPAP) * 60.0; return (c * 60.0) / minutes; } //! \brief Calculate RDI (Respiratory Disturbance Index) EventDataType calcRDI() { EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway) + count(CPAP_RERA); EventDataType minutes = hours(MT_CPAP) * 60.0; return (c * 60.0) / minutes; } //! \brief Percent of night for specified channel EventDataType calcPON(ChannelID code) { EventDataType c = sum(code); EventDataType minutes = hours(MT_CPAP) * 60.0; return (100.0 / minutes) * (c / 60.0); } //! \brief Calculate index (count per hour) for specified channel EventDataType calcIdx(ChannelID code) { EventDataType c = count(code); EventDataType minutes = hours(MT_CPAP) * 60.0; return (c * 60.0) / minutes; } //! \brief SleepyyHead Events Index, AHI combined with SleepyHead detected events.. :) EventDataType calcSHEI() { EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway) + count(CPAP_UserFlag1) + count(CPAP_UserFlag2); EventDataType minutes = hours(MT_CPAP) * 60.0; return (c * 60.0) / minutes; } //! \brief Total duration of all Apnea/Hypopnea events in seconds, EventDataType calcTTIA() { EventDataType c = sum(CPAP_Hypopnea) + sum(CPAP_Obstructive) + sum(CPAP_Apnea) + sum(CPAP_ClearAirway); return c; } bool hasEvents(); // According to preferences.. EventDataType calcMiddle(ChannelID code); EventDataType calcMax(ChannelID code); EventDataType calcPercentile(ChannelID code); static QString calcMiddleLabel(ChannelID code); static QString calcMaxLabel(ChannelID code); static QString calcPercentileLabel(ChannelID code); EventDataType calc(ChannelID code, ChannelCalcType type); Session * firstSession(MachineType type); //! \brief A QList containing all Sessions objects for this day QList sessions; QHash machines; void incUseCounter() { d_useCounter++; } void decUseCounter() { d_useCounter--; if (d_useCounter<0) d_useCounter = 0; } int useCounter() { return d_useCounter; } void invalidate() { d_invalidate = true; d_machhours.clear(); } void updateCPAPCache(); inline QDate date() const { return d_date; } void setDate(QDate date) { d_date = date; } protected: QHash > perc_cache; //qint64 d_first,d_last; private: bool d_firstsession; int d_useCounter; bool d_summaries_open; bool d_events_open; float d_hours; QHash d_machhours; QHash d_count; QHash d_sum; bool d_invalidate; QDate d_date; }; #endif // DAY_H sleepyhead-0.9.8/sleepyhead/SleepLib/calcs.h0000644000175000017500000001207412412506713020302 0ustar sergiosergio/* Custom CPAP/Oximetry Calculations Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef CALCS_H #define CALCS_H #include "day.h" //! param samples Number of samples //! width number of surrounding samples to consider //! percentile fractional percentage, between 0 and 1 void percentileFilter(EventDataType *input, EventDataType *output, int samples, int width, EventDataType percentile); void xpassFilter(EventDataType *input, EventDataType *output, int samples, EventDataType weight); enum FilterType { FilterNone = 0, FilterPercentile, FilterXPass }; struct Filter { Filter(FilterType t, EventDataType p1, EventDataType p2, EventDataType p3) { type = t; param1 = p1; param2 = p2; param3 = p3; } Filter() { type = FilterNone; param1 = 0; param2 = 0; param3 = 0; } Filter(const Filter ©) { type = copy.type; param1 = copy.param1; param2 = copy.param2; param3 = copy.param3; } FilterType type; EventDataType param1; EventDataType param2; EventDataType param3; }; struct BreathPeak { BreathPeak() { min = 0; max = 0; start = 0; middle = 0; end = 0; } // peakmin=0; peakmax=0; } BreathPeak(EventDataType _min, EventDataType _max, qint32 _start, qint32 _middle, qint32 _end) {//, qint64 _peakmin, qint64 _peakmax) { min = _min; max = _max; start = _start; middle = _middle; end = _end; //peakmax=_peakmax; //peakmin=_peakmin; } BreathPeak(const BreathPeak ©) { min = copy.min; max = copy.max; start = copy.start; middle = copy.middle; end = copy.end; //peakmin=copy.peakmin; //peakmax=copy.peakmax; } int samplelength() { return end - start; } int upperLength() { return middle - start; } int lowerLength() { return end - middle; } EventDataType min; // peak value EventDataType max; // peak value qint32 start; // beginning zero cross qint32 middle; // ending zero cross qint32 end; // ending zero cross //qint64 peakmin; // min peak index //qint64 peakmax; // max peak index }; bool operator<(const BreathPeak &p1, const BreathPeak &p2); const int num_filter_buffers = 2; const int max_filter_buf_size = 2097152 * sizeof(EventDataType); //! \brief Class to process Flow Rate waveform data class FlowParser { public: FlowParser(); ~FlowParser(); //! \brief Clears the (input) filter chain void clearFilters(); //! \brief Applies the filter chain to input, with supplied number of samples EventDataType *applyFilters(EventDataType *input, int samples); //! \brief Add the filter void addFilter(FilterType ft, EventDataType p1 = 0, EventDataType p2 = 0, EventDataType p3 = 0) { m_filters.push_back(Filter(ft, p1, p2, p3)); } //! \brief Opens the flow rate EventList, applies the input filter chain, and calculates peaks void openFlow(Session *session, EventList *flow); //! \brief Calculates the upper and lower breath peaks void calcPeaks(EventDataType *input, int samples); // Minute vent needs Resp & TV calcs made here.. void calc(bool calcResp, bool calcTv, bool calcTi, bool calcTe, bool calcMv); void flagEvents(); void flagUserEvents(ChannelID code, EventDataType restriction, EventDataType duration); /*void calcTidalVolume(); void calcRespRate(); void calcMinuteVent(); */ QList m_filters; protected: QVector breaths; int m_samples; EventList *m_flow; Session *m_session; EventDataType m_gain; EventDataType m_rate; EventDataType m_minutes; //! \brief The filtered waveform EventDataType *m_filtered; //! \brief BreathPeak's start on positive cycle? bool m_startsUpper; private: EventDataType *m_buffers[num_filter_buffers]; }; bool SearchApnea(Session *session, qint64 time, double dur); //! \brief Calculate Respiratory Rate, Tidal Volume & Minute Ventilation for PRS1 data void calcRespRate(Session *session, FlowParser *flowparser = nullptr); //! \brief Calculates the sliding window AHI graph int calcAHIGraph(Session *session); //! \brief Calculates AHI for a session between start & end (a support function for the sliding window graph) EventDataType calcAHI(Session *session, qint64 start = -1, qint64 end = -1); //! \brief Scans for leaks over Redline and flags as large leaks, unless machine provided them already void flagLargeLeaks(Session *session); //! \brief Leaks calculations for PRS1 int calcLeaks(Session *session); //! \brief Calculate Pulse change flagging, according to preferences int calcPulseChange(Session *session); //! \brief Calculate SPO2 Drop flagging, according to preferences int calcSPO2Drop(Session *session); #endif // CALCS_H sleepyhead-0.9.8/sleepyhead/SleepLib/progressdialog.h0000644000175000017500000000165712412506713022246 0ustar sergiosergio/* SleepLib Progress Dialog Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef PROGRESSDIALOG_H #define PROGRESSDIALOG_H #include #include #include #include #include class ProgressDialog:public QDialog { public: explicit ProgressDialog(QWidget * parent); virtual ~ProgressDialog(); void setMessage(QString msg) { waitmsg->setText(msg); } void setPixmap(QPixmap &pixmap) { imglabel->setPixmap(pixmap); } QProgressBar * progress; public slots: void doUpdateProgress(int cnt, int total); protected: QLabel * waitmsg; QHBoxLayout *hlayout; QLabel * imglabel; QVBoxLayout * vlayout; }; #endif // PROGRESSDIALOG_H sleepyhead-0.9.8/sleepyhead/SleepLib/profiles.cpp0000644000175000017500000012661412412506713021401 0ustar sergiosergio/* SleepLib Profiles Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include "preferences.h" #include "profiles.h" #include "machine.h" #include "machine_common.h" #include "machine_loader.h" #include #include "mainwindow.h" extern MainWindow *mainwin; Preferences *p_pref; Preferences *p_layout; Profile *p_profile; Profile::Profile(QString path) : is_first_day(true), m_opened(false), m_machopened(false) { p_name = STR_GEN_Profile; if (path.isEmpty()) { p_path = GetAppRoot(); } else { p_path = path; } (*this)[STR_GEN_DataFolder] = p_path; path = path.replace("\\", "/"); if (!p_path.endsWith("/")) { p_path += "/"; } p_filename = p_path + p_name + STR_ext_XML; machlist.clear(); doctor = nullptr; user = nullptr; cpap = nullptr; oxi = nullptr; appearance = nullptr; session = nullptr; general = nullptr; } Profile::~Profile() { QString lockfile=p_path+"/lockfile"; QFile file(lockfile); file.remove(); if (m_opened) { delete user; delete doctor; delete cpap; delete oxi; delete appearance; delete session; delete general; for (QHash::iterator it = machlist.begin(); it != machlist.end(); it++) { delete it.value(); } m_opened=false; } for (QMap::iterator d = daylist.begin(); d != daylist.end(); d++) { delete d.value(); } } bool Profile::Save(QString filename) { if (m_opened) { return Preferences::Save(filename) && p_profile->StoreMachines(); } else return false; } bool Profile::removeLock() { QString filename=p_path+"/lockfile"; QFile file(filename); return file.remove(); } QString Profile::checkLock() { QString filename=p_path+"/lockfile"; QFile file(filename); if (!file.exists()) return QString(); file.open(QFile::ReadOnly); QString lockhost = file.readLine(1024).trimmed(); return lockhost; } bool Profile::Open(QString filename) { p_profile = this; if (filename.isEmpty()) { filename=p_filename; } if (m_opened) { qDebug() << "Profile" << filename << "all ready open"; return true; } bool b = Preferences::Open(filename); m_opened=true; doctor = new DoctorInfo(this); user = new UserInfo(this); cpap = new CPAPSettings(this); oxi = new OxiSettings(this); appearance = new AppearanceSettings(this); session = new SessionSettings(this); general = new UserSettings(this); return b; } const QString STR_PROP_Brand = "brand"; const QString STR_PROP_Model = "model"; const QString STR_PROP_Series = "series"; const QString STR_PROP_ModelNumber = "modelnumber"; const QString STR_PROP_SubModel = "submodel"; const QString STR_PROP_Serial = "serial"; const QString STR_PROP_DataVersion = "dataversion"; const QString STR_PROP_LastImported = "lastimported"; bool Profile::OpenMachines() { if (m_machopened) return true; if (!m_opened) { Open(); } QFile lockfile(p_path+"lockfile"); lockfile.open(QFile::WriteOnly); QByteArray ba; ba.append(QHostInfo::localHostName()); lockfile.write(ba); lockfile.close(); QString filename = p_path+"machines.xml"; QFile file(filename); if (!file.open(QFile::ReadOnly)) { qWarning() << "Could not open" << QDir::toNativeSeparators(filename); return false; } QDomDocument doc("machines.xml"); if (!doc.setContent(&file)) { qWarning() << "Invalid XML Content in" << QDir::toNativeSeparators(filename); return false; } file.close(); QDomElement root = doc.firstChild().toElement(); if (root.tagName().toLower() != "machines") { //qDebug() << "No Machines Tag in Profiles.xml"; return false; } QDomElement elem = root.firstChildElement(); while (!elem.isNull()) { QString pKey = elem.tagName(); if (pKey.toLower() != "machine") { qWarning() << "Profile::ExtraLoad() pKey!=\"machine\""; elem = elem.nextSiblingElement(); continue; } int m_id; bool ok; m_id = elem.attribute("id", "").toInt(&ok); int mt; mt = elem.attribute("type", "").toInt(&ok); MachineType m_type = (MachineType)mt; QString m_class = elem.attribute("class", ""); MachineInfo info; info.type = m_type; info.loadername = m_class; QHash prop; QDomElement e = elem.firstChildElement(); for (; !e.isNull(); e = e.nextSiblingElement()) { QString pKey = e.tagName(); QString key = pKey.toLower(); if (key == STR_PROP_Brand) { info.brand = e.text(); } else if (key == STR_PROP_Model) { info.model = e.text(); } else if (key == STR_PROP_ModelNumber) { info.modelnumber = e.text(); } else if (key == STR_PROP_Serial) { info.serial = e.text(); } else if (key == STR_PROP_Series) { info.series = e.text(); } else if (key == STR_PROP_DataVersion) { info.version = e.text().toInt(); } else if (key == STR_PROP_LastImported) { info.lastimported = QDateTime::fromString(e.text(), Qt::ISODate); } else if (key == "properties") { QDomElement pe = e.firstChildElement(); for (; !pe.isNull(); pe = pe.nextSiblingElement()) { prop[pe.tagName()] = pe.text(); } } else { // skip any old rubbish if ((key == "backuppath") || (key == "path") || (key == "submodel")) continue; prop[pKey] = e.text(); } } Machine *m = nullptr; m = MachineLoader::CreateMachine(info, m_id); //m->setId(m_id); if (m) m->properties = prop; elem = elem.nextSiblingElement(); } m_machopened = true; return true; } bool Profile::StoreMachines() { QDomDocument doc("Machines"); QDomElement elem = ExtraSave(doc); doc.appendChild(elem); QDomElement mach = doc.createElement("machines"); for (QHash::iterator i = machlist.begin(); i != machlist.end(); i++) { QDomElement me = doc.createElement("machine"); Machine *m = i.value(); me.setAttribute("id", (int)m->id()); me.setAttribute("type", (int)m->type()); me.setAttribute("class", m->loaderName()); QDomElement pe = doc.createElement("properties"); me.appendChild(pe); for (QHash::iterator j = i.value()->properties.begin(); j != i.value()->properties.end(); j++) { QDomElement pp = doc.createElement(j.key()); pp.appendChild(doc.createTextNode(j.value())); pe.appendChild(pp); } QDomElement mp = doc.createElement(STR_PROP_Brand); mp.appendChild(doc.createTextNode(m->brand())); me.appendChild(mp); mp = doc.createElement(STR_PROP_Model); mp.appendChild(doc.createTextNode(m->model())); me.appendChild(mp); mp = doc.createElement(STR_PROP_ModelNumber); mp.appendChild(doc.createTextNode(m->modelnumber())); me.appendChild(mp); mp = doc.createElement(STR_PROP_Serial); mp.appendChild(doc.createTextNode(m->serial())); me.appendChild(mp); mp = doc.createElement(STR_PROP_Series); mp.appendChild(doc.createTextNode(m->series())); me.appendChild(mp); mp = doc.createElement(STR_PROP_DataVersion); mp.appendChild(doc.createTextNode(QString::number(m->version()))); me.appendChild(mp); mp = doc.createElement(STR_PROP_LastImported); mp.appendChild(doc.createTextNode(m->lastImported().toString(Qt::ISODate))); me.appendChild(mp); mach.appendChild(me); } doc.appendChild(mach); QString filename = p_path+"machines.xml"; QFile file(filename); if (!file.open(QFile::WriteOnly)) { return false; } file.write(doc.toByteArray()); return true; } #if defined(Q_OS_WIN) class Environment { public: Environment(); QStringList path(); QString searchInDirectory(const QStringList & execs, QString directory); QString searchInPath(const QString &executable, const QStringList & additionalDirs = QStringList()); QProcessEnvironment env; }; Environment::Environment() { env = QProcessEnvironment::systemEnvironment(); } QStringList Environment::path() { return env.value(QLatin1String("PATH"), "").split(';'); } QString Environment::searchInDirectory(const QStringList & execs, QString directory) { const QChar slash = QLatin1Char('/'); if (directory.isEmpty()) return QString(); if (!directory.endsWith(slash)) directory += slash; foreach (const QString & exec, execs) { QFileInfo fi(directory + exec); if (fi.exists() && fi.isFile() && fi.isExecutable()) return fi.absoluteFilePath(); } return QString(); } QString Environment::searchInPath(const QString &executable, const QStringList & additionalDirs) { if (executable.isEmpty()) return QString(); QString exec = QDir::cleanPath(executable); QFileInfo fi(exec); QStringList execs(exec); if (fi.suffix().isEmpty()) { QStringList extensions = env.value(QLatin1String("PATHEXT")).split(QLatin1Char(';')); foreach (const QString &ext, extensions) { QString tmp = executable + ext.toLower(); if (fi.isAbsolute()) { if (QFile::exists(tmp)) return tmp; } else { execs << tmp; } } } if (fi.isAbsolute()) return exec; QSet alreadyChecked; foreach (const QString &dir, additionalDirs) { if (alreadyChecked.contains(dir)) continue; alreadyChecked.insert(dir); QString tmp = searchInDirectory(execs, dir); if (!tmp.isEmpty()) return tmp; } if (executable.indexOf(QLatin1Char('/')) != -1) return QString(); foreach (const QString &p, path()) { if (alreadyChecked.contains(p)) continue; alreadyChecked.insert(p); QString tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p)); if (!tmp.isEmpty()) return tmp; } return QString(); } #endif // Borrowed from QtCreator (http://stackoverflow.com/questions/3490336/how-to-reveal-in-finder-or-show-in-explorer-with-qt) void showInGraphicalShell(const QString &pathIn) { QWidget * parent = NULL; // Mac, Windows support folder or file. #if defined(Q_OS_WIN) Environment env; const QString explorer = env.searchInPath(QLatin1String("explorer.exe")); if (explorer.isEmpty()) { QMessageBox::warning(parent, QObject::tr("Launching Windows Explorer failed"), QObject::tr("Could not find explorer.exe in path to launch Windows Explorer.")); return; } QString param; //if (!QFileInfo(pathIn).isDir()) param = QLatin1String("/select,"); param += QDir::toNativeSeparators(pathIn); QProcess::startDetached(explorer, QStringList(param)); #elif defined(Q_OS_MAC) Q_UNUSED(parent) QStringList scriptArgs; scriptArgs << QLatin1String("-e") << QString::fromLatin1("tell application \"Finder\" to reveal POSIX file \"%1\"") .arg(pathIn); QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs); scriptArgs.clear(); scriptArgs << QLatin1String("-e") << QLatin1String("tell application \"Finder\" to activate"); QProcess::execute("/usr/bin/osascript", scriptArgs); #else // we cannot select a file here, because no file browser really supports it... /* const QFileInfo fileInfo(pathIn); const QString folder = fileInfo.absoluteFilePath(); const QString app = Utils::UnixUtils::fileBrowser(Core::ICore::instance()->settings()); QProcess browserProc; const QString browserArgs = Utils::UnixUtils::substituteFileBrowserParameters(app, folder); if (debug) qDebug() << browserArgs; bool success = browserProc.startDetached(browserArgs); const QString error = QString::fromLocal8Bit(browserProc.readAllStandardError()); success = success && error.isEmpty(); if (!success) { QMessageBox::warning(NULL,STR_MessageBox_Error, "Could not find the file browser for your system, you will have to find your profile directory yourself."+"\n\n"+error, QMessageBox::Ok); // showGraphicalShellError(parent, app, error); }*/ #endif } int dirCount(QString path) { QDir dir(path); QStringList list = dir.entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); return list.size(); } void Profile::DataFormatError(Machine *m) { QString msg; msg = ""+QObject::tr("SleepyHead (%1) needs to upgrade its database for %2 %3 %4"). arg(FullVersionString). arg(m->brand()).arg(m->model()).arg(m->serial()) + "

    "; bool backups = false; if (p_profile->session->backupCardData()) { QString bpath = m->getBackupPath(); int cnt = dirCount(bpath); if (cnt > 0) backups = true; } if (backups) { msg = msg + QObject::tr("SleepyHead maintains a backup of your devices data card that it uses for this purpose.")+ "

    "; msg = msg + QObject::tr("Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.") + "

    "; backups = true; } else { msg = msg + ""+STR_MessageBox_Warning+": "+QObject::tr("SleepyHead does not yet have any automatic card backups stored for this device.") + "

    "; msg = msg + QObject::tr("This means you will need to import this machine data again afterwards from your own backups or data card.") + "

    "; } msg += ""+QObject::tr("Important:")+" "+QObject::tr("Once you upgrade, you can not use this profile with the previous version anymore.")+"

    "+ QObject::tr("If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.")+ "

    "; msg = msg + ""+QObject::tr("Are you ready to upgrade, so you can run the new version of SleepyHead?")+""; QMessageBox * question = new QMessageBox(QMessageBox::Warning, QObject::tr("Machine Database Changes"), msg, QMessageBox::Yes | QMessageBox::No); question->setDefaultButton(QMessageBox::Yes); QFont font("Sans Serif", 11, QFont::Normal); question->setFont(font); if (question->exec() == QMessageBox::Yes) { if (!m->Purge(3478216)) { // Purge failed.. probably a permissions error.. let the user deal with it. QMessageBox::critical(nullptr, STR_MessageBox_Error, QObject::tr("Sorry, the purge operation failed, which means this version of SleepyHead can't start.")+"\n\n"+ QObject::tr("The machine data folder needs to be removed manually.")+"\n\n"+ QObject::tr("This folder currently resides at the following location:")+"\n\n"+ QDir::toNativeSeparators(Get(p_preferences[STR_GEN_DataFolder].toString())), QMessageBox::Ok); QApplication::exit(-1); } // Note: I deliberately haven't added a Profile help for this if (backups) { mainwin->importCPAP(ImportPath(m->getBackupPath(), lookupLoader(m)), QObject::tr("Rebuilding from %1 Backup").arg(m->brand())); } else { if (!p_profile->session->backupCardData()) { // Automatic backups not available for Intellipap users yet, so don't taunt them.. if (m->loaderName() != STR_MACH_Intellipap) { if (QMessageBox::question(nullptr, STR_MessageBox_Question, QObject::tr("Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes)) { p_profile->session->setBackupCardData(true); } } } QMessageBox::information(nullptr, STR_MessageBox_Information, QObject::tr("SleepyHead will now start the import wizard so you can reinstall your %1 data.").arg(m->brand()) ,QMessageBox::Ok, QMessageBox::Ok); mainwin->startImportDialog(); } p_profile->Save(); delete question; } else { delete question; QMessageBox::information(nullptr, STR_MessageBox_Information, QObject::tr("SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:")+"\n\n"+ QDir::toNativeSeparators(Get(p_preferences[STR_GEN_DataFolder].toString()))+"\n\n"+ QObject::tr("Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.") , QMessageBox::Ok, QMessageBox::Ok); showInGraphicalShell(Get(p_preferences[STR_GEN_DataFolder].toString())); QApplication::exit(-1); } return; } void Profile::LoadMachineData() { if (!m_machopened) OpenMachines(); QHash > > cache; for (QHash::iterator i = machlist.begin(); i != machlist.end(); i++) { Machine *m = i.value(); MachineLoader *loader = lookupLoader(m); if (loader) { if (m->version() < loader->Version()) { DataFormatError(m); } else { try { m->Load(); } catch (OldDBVersion e) { Q_UNUSED(e) DataFormatError(m); } } } else { m->Load(); } } } /** * @brief Upgrade Machine XML section from old "profile.xml" * @param root */ void Profile::ExtraLoad(QDomElement &root) { if (root.tagName().toLower() != "machines") { // Good! return; } // Save this sucker QDomDocument doc("Machines"); doc.appendChild(root); QFile file(p_path+"/machines.xml"); file.open(QFile::WriteOnly); file.write(doc.toByteArray()); file.close(); } void Profile::AddMachine(Machine *m) { if (!m) { qWarning() << "Empty Machine in Profile::AddMachine()"; return; } machlist[m->id()] = m; } void Profile::DelMachine(Machine *m) { if (!m) { qWarning() << "Empty Machine in Profile::AddMachine()"; return; } m->loader()->removeMachine(m); machlist.erase(machlist.find(m->id())); } Day *Profile::addDay(QDate date) { QMap::iterator dit = daylist.find(date); if (dit == daylist.end()) { dit = daylist.insert(date, new Day()); } Day * day = dit.value(); day->setDate(date); if (is_first_day) { m_first = m_last = date; is_first_day = false; } if (m_first > date) { m_first = date; } if (m_last < date) { m_last = date; } return day; } // Get Day record if data available for date and machine type, // and has enabled session data, else return nullptr Day *Profile::GetGoodDay(QDate date, MachineType type) { Day *day = GetDay(date, type); if (!day) return nullptr; // For a machine match, find at least one enabled Session. for (int i = 0; i < day->size(); ++i) { Session * sess = (*day)[i]; if (((type == MT_UNKNOWN) || (sess->type() == type)) && sess->enabled()) { day->OpenSummary(); return day; } } // No enabled Sessions were found. return nullptr; } Day *Profile::FindGoodDay(QDate date, MachineType type) { Day *day = FindDay(date, type); if (!day) return nullptr; // For a machine match, find at least one enabled Session. for (int i = 0; i < day->size(); ++i) { Session * sess = (*day)[i]; if (((type == MT_UNKNOWN) || (sess->type() == type)) && sess->enabled()) { return day; } } // No enabled Sessions were found. return nullptr; } Day *Profile::GetDay(QDate date, MachineType type) { QMap::iterator di = daylist.find(date); if (di == daylist.end()) return nullptr; Day * day = di.value(); if (type == MT_UNKNOWN) { day->OpenSummary(); return day; // just want the day record } if (day->machines.contains(type)) { day->OpenSummary(); return day; } return nullptr; } Day *Profile::FindDay(QDate date, MachineType type) { QMap::iterator di = daylist.find(date); if (di == daylist.end()) return nullptr; Day * day = di.value(); if (type == MT_UNKNOWN) { return day; // just want the day record } if (day->machines.contains(type)) { return day; } return nullptr; } int Profile::Import(QString path) { int c = 0; qDebug() << "Importing " << path; path = path.replace("\\", "/"); if (path.endsWith("/")) { path.chop(1); } QListloaders = GetLoaders(MT_CPAP); Q_FOREACH(MachineLoader * loader, loaders) { if (c += loader->Open(path)) { break; } } return c; } MachineLoader *GetLoader(QString name) { QListloaders = GetLoaders(); Q_FOREACH(MachineLoader * loader, loaders) { if (loader->loaderName() == name) { return loader; } } return nullptr; } // Returns a QVector containing all machine objects regisered of type t QList Profile::GetMachines(MachineType t) { QList vec; QHash::iterator i; QHash::iterator machlist_end=machlist.end(); for (i = machlist.begin(); i != machlist_end; i++) { if (!i.value()) { qWarning() << "Profile::GetMachines() i->second == nullptr"; continue; } MachineType mt = i.value()->type(); if ((t == MT_UNKNOWN) || (mt == t)) { vec.push_back(i.value()); } } return vec; } Machine *Profile::GetMachine(MachineType t) { QListvec = GetMachines(t); if (vec.size() == 0) { return nullptr; } return vec[0]; } //bool Profile::trashMachine(Machine * mach) //{ // QMap >::iterator it_end = daylist.end(); // QMap >::iterator it; // QList datelist; // QList days; // for (it = daylist.begin(); it != it_end; ++it) { // for (int i = 0; i< it.value().size(); ++i) { // Day * day = it.value().at(i); // if (day->machine() == mach) { // days.push_back(day); // datelist.push_back(it.key()); // } // } // } // for (int i=0; i < datelist.size(); ++i) { // Day * day = days.at(i); // it = daylist.find(datelist.at(i)); // if (it != daylist.end()) { // it.value().removeAll(day); // if (it.value().size() == 0) { // daylist.erase(it); // } // } // mach->unlinkDay(days.at(i)); // } //} bool Profile::unlinkDay(Day * day) { QMap::iterator it; QMap::iterator it_end = daylist.end(); // Find the key... for (it = daylist.begin(); it != it_end; ++it) { if (it.value() == day) { daylist.erase(it); return true; } } return false; } //Profile *profile=nullptr; QString SHA1(QString pass) { return pass; } namespace Profiles { QMap profiles; void Done() { PREF.Save(); LAYOUT.Save(); p_profile->Save(); delete p_profile; profiles.clear(); delete p_pref; delete p_layout; DestroyLoaders(); } Profile *Get(QString name) { if (profiles.find(name) != profiles.end()) { return profiles[name]; } return nullptr; } Profile *Create(QString name) { QString path = PREF.Get("{home}/Profiles/") + name; QDir dir(path); if (!dir.exists(path)) { dir.mkpath(path); } //path+="/"+name; p_profile = new Profile(path); p_profile->Open(); profiles[name] = p_profile; p_profile->user->setUserName(name); //p_profile->Set("Realname",realname); //if (!password.isEmpty()) p_profile.user->setPassword(password); p_profile->Set(STR_GEN_DataFolder, QString("{home}/Profiles/{") + QString(STR_UI_UserName) + QString("}")); Machine *m = new Machine(0); m->setType(MT_JOURNAL); MachineInfo info(MT_JOURNAL, 0, STR_MACH_Journal, "SleepyHead", STR_MACH_Journal, QString(), m->hexid(), QString(), QDateTime::currentDateTime(), 0); m->setInfo(info); p_profile->AddMachine(m); p_profile->Save(); return p_profile; } Profile *Get() { // username lookup //getUserName() return profiles[getUserName()];; } void saveProfileList() { QString filename = PREF.Get("{home}/profiles.xml"); QDomDocument doc("profiles"); QDomElement root = doc.createElement("profiles"); doc.appendChild(root); QMap::iterator it; for (it = profiles.begin(); it != profiles.end(); ++it) { QDomElement elem = doc.createElement("profile"); elem.setAttribute("name", it.key()); // Not technically nessesary.. elem.setAttribute("path", QString("{home}/Profiles/%1/Profile.xml").arg(it.key())); root.appendChild(elem); } QFile file(filename); file.open(QFile::WriteOnly); file.write(doc.toByteArray()); file.close(); } /** * @brief Scan Profile directory loading user profiles */ void Scan() { QString path = PREF.Get("{home}/Profiles"); QDir dir(path); if (!dir.exists(path)) { return; } if (!dir.isReadable()) { qWarning() << "Can't open " << path; return; } dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); //dir.setSorting(QDir::Name); QFileInfoList list = dir.entryInfoList(); // Iterate through subdirectories and load profiles.. for (int i = 0; i < list.size(); i++) { QFileInfo fi = list.at(i); QString npath = fi.canonicalFilePath(); Profile *prof = new Profile(npath); //prof->Open(); profiles[fi.fileName()] = prof; } // Update profiles.xml for mobile version saveProfileList(); } } // namespace Profiles // Returns a list of all days records matching machine type between start and end date QList Profile::getDays(MachineType mt, QDate start, QDate end) { QList list; if (!start.isValid()) { return list; } if (!end.isValid()) { return list; } QDate date = start; if (date.isNull()) { return list; } QMap::iterator it; do { it = daylist.find(date); if (it != daylist.end()) { Day *day = it.value(); if (mt != MT_UNKNOWN) { if (day->hasEnabledSessions(mt)) { list.push_back(day); } } else { if (day->hasEnabledSessions()) { list.push_back(day); } } } date = date.addDays(1); } while (date <= end); return list; } int Profile::countDays(MachineType mt, QDate start, QDate end) { if (!start.isValid()) { return 0; } if (!end.isValid()) { return 0; } QDate date = start; if (date.isNull()) { return 0; } int days = 0; do { Day *day = FindGoodDay(date, mt); if (day) { days++; } date = date.addDays(1); } while (date <= end); return days; } int Profile::countCompliantDays(MachineType mt, QDate start, QDate end) { EventDataType compliance = cpap->complianceHours(); if (!start.isValid()) { return 0; } if (!end.isValid()) { return 0; } QDate date = start; if (date.isNull()) { return 0; } int days = 0; do { Day *day = FindGoodDay(date, mt); if (day) { if (day->hours(mt) > compliance) { days++; } } date = date.addDays(1); } while (date <= end); return days; } EventDataType Profile::calcCount(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } double val = 0; do { Day *day = GetGoodDay(date, mt); if (day) { val += day->count(code); } date = date.addDays(1); } while (date <= end); return val; } double Profile::calcSum(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; double val = 0; do { Day *day = GetGoodDay(date, mt); if (day) { val += day->sum(code); } date = date.addDays(1); } while (date <= end); return val; } EventDataType Profile::calcHours(MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } double val = 0; do { Day *day = GetGoodDay(date, mt); if (day) { val += day->hours(); } date = date.addDays(1); } while (date <= end); return val; } EventDataType Profile::calcAboveThreshold(ChannelID code, EventDataType threshold, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } EventDataType val = 0; do { Day *day = GetGoodDay(date, mt); if (day) { val += day->timeAboveThreshold(code, threshold); } date = date.addDays(1); } while (date <= end); return val; } EventDataType Profile::calcBelowThreshold(ChannelID code, EventDataType threshold, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } EventDataType val = 0; do { Day *day = GetGoodDay(date, mt); if (day) { val += day->timeBelowThreshold(code, threshold); } date = date.addDays(1); } while (date <= end); return val; } EventDataType Profile::calcAvg(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } double val = 0; int cnt = 0; do { Day *day = GetGoodDay(date, mt); if (day) { if (!day->summaryOnly() || day->hasData(code, ST_AVG)) { val += day->sum(code); cnt++; } } date = date.addDays(1); } while (date <= end); if (!cnt) { return 0; } return val / float(cnt); } EventDataType Profile::calcWavg(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } double val = 0, tmp, tmph, hours = 0; do { Day *day = GetGoodDay(date, mt); if (day) { if (!day->summaryOnly() || day->hasData(code, ST_WAVG)) { tmph = day->hours(); tmp = day->wavg(code); val += tmp * tmph; hours += tmph; } } date = date.addDays(1); } while (date <= end); if (!hours) { return 0; } val = val / hours; return val; } EventDataType Profile::calcMin(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } bool first = true; double min = 0, tmp; do { Day *day = GetGoodDay(date, mt); if (day) { if (!day->summaryOnly() || day->hasData(code, ST_MIN)) { tmp = day->Min(code); if (first || (min > tmp)) { min = tmp; first = false; } } } date = date.addDays(1); } while (date <= end); if (first) { min = 0; } return min; } EventDataType Profile::calcMax(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; bool first = true; double max = 0, tmp; do { Day *day = GetGoodDay(date, mt); if (day) { if (!day->summaryOnly() || day->hasData(code, ST_MAX)) { tmp = day->Max(code); if (first || (max < tmp)) { max = tmp; first = false; } } } date = date.addDays(1); } while (date <= end); if (first) { max = 0; } return max; } EventDataType Profile::calcSettingsMin(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } bool first = true; double min = 0, tmp; do { Day *day = GetGoodDay(date, mt); if (day) { tmp = day->settings_min(code); if (first || (min > tmp)) { min = tmp; first = false; } } date = date.addDays(1); } while (date <= end); if (first) { min = 0; } return min; } EventDataType Profile::calcSettingsMax(ChannelID code, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } bool first = true; double max = 0, tmp; do { Day *day = GetGoodDay(date, mt); if (day) { tmp = day->settings_max(code); if (first || (max < tmp)) { max = tmp; first = false; } } date = date.addDays(1); } while (date <= end); if (first) { max = 0; } return max; } struct CountSummary { CountSummary(EventStoreType v) : val(v), count(0), time(0) {} EventStoreType val; EventStoreType count; quint32 time; }; EventDataType Profile::calcPercentile(ChannelID code, EventDataType percent, MachineType mt, QDate start, QDate end) { if (!start.isValid()) { start = LastGoodDay(mt); } if (!end.isValid()) { end = LastGoodDay(mt); } QDate date = start; if (date.isNull()) { return 0; } QMap wmap; QMap::iterator wmi; QHash >::iterator vsi; QHash >::iterator tsi; EventDataType gain; //bool setgain=false; EventDataType value; int weight; qint64 SN = 0; bool timeweight; bool summaryOnly = false; do { Day *day = GetGoodDay(date, mt); if (day) { if (day->summaryOnly()) { summaryOnly = true; break; } for (int i = 0; i < day->size(); i++) { for (QList::iterator s = day->begin(); s != day->end(); s++) { if (!(*s)->enabled()) { continue; } Session *sess = *s; gain = sess->m_gain[code]; if (!gain) { gain = 1; } vsi = sess->m_valuesummary.find(code); if (vsi == sess->m_valuesummary.end()) { continue; } tsi = sess->m_timesummary.find(code); timeweight = (tsi != sess->m_timesummary.end()); QHash &vsum = vsi.value(); QHash &tsum = tsi.value(); if (timeweight) { for (QHash::iterator k = tsum.begin(); k != tsum.end(); k++) { weight = k.value(); value = EventDataType(k.key()) * gain; SN += weight; wmi = wmap.find(value); if (wmi == wmap.end()) { wmap[value] = weight; } else { wmi.value() += weight; } } } else { for (QHash::iterator k = vsum.begin(); k != vsum.end(); k++) { weight = k.value(); value = EventDataType(k.key()) * gain; SN += weight; wmi = wmap.find(value); if (wmi == wmap.end()) { wmap[value] = weight; } else { wmi.value() += weight; } } } } } } date = date.addDays(1); } while (date <= end); if (summaryOnly) { // abort percentile calculation, there is not enough data return 0; } QVector valcnt; // Build sorted list of value/counts for (wmi = wmap.begin(); wmi != wmap.end(); wmi++) { ValueCount vc; vc.value = wmi.key(); vc.count = wmi.value(); vc.p = 0; valcnt.push_back(vc); } // sort by weight, then value qSort(valcnt); //double SN=100.0/double(N); // 100% / overall sum double p = 100.0 * percent; double nth = double(SN) * percent; // index of the position in the unweighted set would be double nthi = floor(nth); qint64 sum1 = 0, sum2 = 0; qint64 w1, w2 = 0; double v1 = 0, v2 = 0; int N = valcnt.size(); int k = 0; for (k = 0; k < N; k++) { v1 = valcnt[k].value; w1 = valcnt[k].count; sum1 += w1; if (sum1 > nthi) { return v1; } if (sum1 == nthi) { break; // boundary condition } } if (k >= N) { return v1; } v2 = valcnt[k + 1].value; w2 = valcnt[k + 1].count; sum2 = sum1 + w2; // value lies between v1 and v2 double px = 100.0 / double(SN); // Percentile represented by one full value // calculate percentile ranks double p1 = px * (double(sum1) - (double(w1) / 2.0)); double p2 = px * (double(sum2) - (double(w2) / 2.0)); // calculate linear interpolation double v = v1 + ((p - p1) / (p2 - p1)) * (v2 - v1); // p1.....p.............p2 // 37 55 70 return v; } // Lookup first day record of the specified machine type, or return the first day overall if MT_UNKNOWN QDate Profile::FirstDay(MachineType mt) { if ((mt == MT_UNKNOWN) || (!m_last.isValid()) || (!m_first.isValid())) { return m_first; } QDate d = m_first; do { if (FindDay(d, mt) != nullptr) { return d; } d = d.addDays(1); } while (d <= m_last); return m_last; } // Lookup last day record of the specified machine type, or return the first day overall if MT_UNKNOWN QDate Profile::LastDay(MachineType mt) { if ((mt == MT_UNKNOWN) || (!m_last.isValid()) || (!m_first.isValid())) { return m_last; } QDate d = m_last; do { if (FindDay(d, mt) != nullptr) { return d; } d = d.addDays(-1); } while (d >= m_first); return m_first; } QDate Profile::FirstGoodDay(MachineType mt) { if (mt == MT_UNKNOWN) { return FirstDay(); } QDate d = FirstDay(mt); QDate l = LastDay(mt); // No data will return invalid date records if (!d.isValid() || !l.isValid()) { return QDate(); } do { if (FindGoodDay(d, mt) != nullptr) { return d; } d = d.addDays(1); } while (d <= l); return l; //m_last; } QDate Profile::LastGoodDay(MachineType mt) { if (mt == MT_UNKNOWN) { return FirstDay(); } QDate d = LastDay(mt); QDate f = FirstDay(mt); if (!(d.isValid() && f.isValid())) { return QDate(); } do { if (FindGoodDay(d, mt) != nullptr) { return d; } d = d.addDays(-1); } while (d >= f); return f; } bool Profile::channelAvailable(ChannelID code) { QHash::iterator it; QHash::iterator machlist_end=machlist.end(); for (it = machlist.begin(); it != machlist_end; it++) { Machine * mach = it.value(); if (mach->hasChannel(code)) return true; } return false; } bool Profile::hasChannel(ChannelID code) { QDate d = LastDay(); QDate f = FirstDay(); if (!(d.isValid() && f.isValid())) { return false; } QMap::iterator dit; bool found = false; do { dit = daylist.find(d); if (dit != daylist.end()) { Day *day = dit.value(); if (day->channelHasData(code)) { found = true; break; } } d = d.addDays(-1); } while (d >= f); return found; } sleepyhead-0.9.8/sleepyhead/SleepLib/schema.h0000644000175000017500000002150212412506713020451 0ustar sergiosergio/* Schema Header (Parse Channel XML data) * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef SCHEMA_H #define SCHEMA_H #include #include #include #include #include "machine_common.h" namespace GraphFlags { const quint32 Shadow = 1; const quint32 Foobar = 2; const quint32 XTicker = 4; const quint32 YTicker = 8; const quint32 XGrid = 16; const quint32 YGrid = 32; } enum ChannelCalcType { Calc_Zero, Calc_Min, Calc_Middle, Calc_Perc, Calc_Max, Calc_UpperThresh, Calc_LowerThresh }; struct ChannelCalc { public: ChannelCalc() { code = 0; enabled = false; color = Qt::black; type = Calc_Zero; } ChannelCalc(const ChannelCalc & copy) { code = copy.code; color = copy.color; enabled = copy.enabled; type = copy.type; } ChannelCalc(ChannelID code, ChannelCalcType type, QColor color, bool enabled): code(code), type(type), color(color), enabled(enabled) {} QString label(); ChannelID code; ChannelCalcType type; QColor color; bool enabled; }; namespace schema { void resetChannels(); void setOrders(); enum Function { NONE = 0, AVG, WAVG, MIN, MAX, SUM, CNT, P90, CPH, SPH, HOURS, SET }; enum ChanType { DATA = 1, SETTING = 2, FLAG = 4, MINOR_FLAG = 8, SPAN = 16, WAVEFORM = 32, UNKNOWN = 64, ALL = 0xFFFF }; enum DataType { DEFAULT = 0, INTEGER, BOOL, DOUBLE, STRING, RICHTEXT, DATE, TIME, DATETIME, LOOKUP }; enum ScopeType { GLOBAL = 0, MACHINE, DAY, SESSION }; class Channel; extern Channel EmptyChannel; /*! \class Channel \brief Contains information about a SleepLib data Channel (aka signals) */ class Channel { public: Channel() { m_id = 0; m_upperThreshold = 0; m_lowerThreshold = 0; m_enabled = true; m_order = 255; m_machtype = MT_UNKNOWN; m_showInOverview = false; } Channel(ChannelID id, ChanType type, MachineType machtype, ScopeType scope, QString code, QString fullname, QString description, QString label, QString unit, DataType datatype = DEFAULT, QColor = Qt::black, int link = 0); void addColor(Function f, QColor color) { m_colors[f] = color; } void addOption(int i, QString option) { m_options[i] = option; } inline ChannelID id() const { return m_id; } inline ChanType type() const { return m_type; } inline DataType datatype() const { return m_datatype; } inline MachineType machtype() const { return m_machtype; } const QString &code() { return m_code; } const QString &fullname() { return m_fullname; } const QString &description() { return m_description; } const QString &label() { return m_label; } const QString &units() { return m_unit; } inline short order() const { return m_order; } bool showInOverview() { return m_showInOverview; } inline EventDataType upperThreshold() const { return m_upperThreshold; } inline EventDataType lowerThreshold() const { return m_lowerThreshold; } inline QColor upperThresholdColor() const { return m_upperThresholdColor; } inline QColor lowerThresholdColor() const { return m_lowerThresholdColor; } inline ChannelID linkid() const { return m_link; } void setFullname(QString fullname) { m_fullname = fullname; } void setLabel(QString label) { m_label = label; } void setType(ChanType type) { m_type = type; } void setUnit(QString unit) { m_unit = unit; } void setDescription(QString desc) { m_description = desc; } void setUpperThreshold(EventDataType value) { m_upperThreshold = value; } void setUpperThresholdColor(QColor color) { m_upperThresholdColor = color; } void setLowerThreshold(EventDataType value) { m_lowerThreshold = value; } void setLowerThresholdColor(QColor color) { m_lowerThresholdColor = color; } void setOrder(short order) { m_order = order; } void setShowInOverview(bool b) { m_showInOverview = b; } QString option(int i) { if (m_options.contains(i)) { return m_options[i]; } return QString(); } inline QColor defaultColor() const { return m_defaultcolor; } inline void setDefaultColor(QColor color) { m_defaultcolor = color; } QHash m_options; QHash m_colors; QList m_links; // better versions of this data type bool isNull(); inline bool enabled() const { return m_enabled; } void setEnabled(bool value) { m_enabled = value; } QHash calc; protected: int m_id; ChanType m_type; MachineType m_machtype; ScopeType m_scope; QString m_code; // Untranslatable QString m_fullname; // Translatable Name QString m_description; QString m_label; QString m_unit; DataType m_datatype; QColor m_defaultcolor; int m_link; EventDataType m_upperThreshold; EventDataType m_lowerThreshold; QColor m_upperThresholdColor; QColor m_lowerThresholdColor; bool m_enabled; short m_order; bool m_showInOverview; }; /*! \class ChannelList \brief A list containing a group of Channel objects, and XML storage and retrieval capability */ class ChannelList { public: ChannelList(); virtual ~ChannelList(); //! \brief Loads Channel list from XML file specified by filename bool Load(QString filename); //! \brief Stores Channel list to XML file specified by filename bool Save(QString filename = QString()); void add(QString group, Channel *chan); //! \brief Looks up Channel in this List with the index idx, returns EmptyChannel if not found Channel & operator[](ChannelID idx) { if (channels.contains(idx)) { return *channels[idx]; } else { return EmptyChannel; } } //! \brief Looks up Channel from this list by name, returns Empty Channel if not found. Channel &operator[](QString name) { if (names.contains(name)) { return *names[name]; } else { return EmptyChannel; } } //! \brief Channel List indexed by integer ID QHash channels; //! \brief Channel List index by name QHash names; //! \brief Channel List indexed by group QHash > groups; QString m_doctype; }; extern ChannelList channel; /*enum LayerType { UnspecifiedLayer, Waveform, Flag, Overlay, Group }; // ????? class Layer { public: Layer(ChannelID code, QColor colour, QString label=QString()); virtual ~Layer(); Layer *addLayer(Layer *layer);// { m_layers.push_back(layer); return layer; } void setMin(EventDataType min) { m_min=min; m_hasmin=true; } void setMax(EventDataType max) { m_max=max; m_hasmax=true; } EventDataType Min() { return m_min; } EventDataType Max() { return m_max; } bool visible() { return m_visible; } void setVisible(bool b) { m_visible=b; } protected: LayerType m_type; ChannelID m_code; QColor m_colour; QString m_label; EventDataType m_min; EventDataType m_max; bool m_hasmin; bool m_hasmax; bool m_visible; QVector m_layers; }; class WaveformLayer: public Layer { public: WaveformLayer(ChannelID code, QColor colour, float min=0, float max=0); virtual ~WaveformLayer(); }; enum FlagVisual { Bar, Span, Dot }; class OverlayLayer: public Layer { public: OverlayLayer(ChannelID code, QColor colour, FlagVisual visual=Bar); virtual ~OverlayLayer(); protected: FlagVisual m_visual; }; class GroupLayer: public Layer // Effectively an empty Layer container { public: GroupLayer(); virtual ~GroupLayer(); }; class FlagGroupLayer: public GroupLayer { public: FlagGroupLayer(); virtual ~FlagGroupLayer(); }; class FlagLayer: public Layer { public: FlagLayer(ChannelID code, QColor colour, FlagVisual visual=Bar); virtual ~FlagLayer(); protected: FlagVisual m_visual; }; class Graph { public: Graph(QString name,quint32 flags=GraphFlags::XTicker | GraphFlags::YTicker | GraphFlags::XGrid); Layer *addLayer(Layer *layer) { m_layers.push_back(layer); return layer; } int height() { if (m_visible) return m_height; else return 0;} void setHeight(int h) { m_height=h; } bool visible() { return m_visible; } void setVisible(bool b) { m_visible=b; } protected: QString m_name; int m_height; QVector m_layers; bool m_visible; }; class GraphGroup { public: GraphGroup(QString name); GraphGroup(); Graph *addGraph(Graph *graph) { m_graphs.push_back(graph); return graph; } protected: QVectorm_graphs; }; */ void init(); } // namespace #endif // SCHEMA_H sleepyhead-0.9.8/sleepyhead/SleepLib/machine_common.h0000644000175000017500000001631012412506713022166 0ustar sergiosergio/* SleepLib Common Machine Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef MACHINE_COMMON_H #define MACHINE_COMMON_H #include #include #include #include #include #include #include using namespace std; // Do not change these without considering the consequences.. For one the Loader needs changing & version increase typedef quint32 ChannelID; typedef long MachineID; typedef long SessionID; typedef float EventDataType; typedef qint16 EventStoreType; //! \brief Exception class for out of Bounds error.. Unused. class BoundsError {}; //! \brief Exception class for to trap old database versions. class OldDBVersion {}; const quint32 magic = 0xC73216AB; // Magic number for SleepyHead Data Files.. Don't touch! //const int max_number_event_fields=10; // This should probably move somewhere else //! \fn timezoneOffset(); //! \brief Calculate the timezone Offset in milliseconds between system timezone and UTC qint64 timezoneOffset(); /*! \enum SummaryType \brief Calculation/Display method to select from dealing with summary information */ enum SummaryType { ST_CNT, ST_SUM, ST_AVG, ST_WAVG, ST_PERC, ST_90P, ST_MIN, ST_MAX, ST_MID, ST_CPH, ST_SPH, ST_FIRST, ST_LAST, ST_HOURS, ST_SESSIONS, ST_SETMIN, ST_SETAVG, ST_SETMAX, ST_SETWAVG, ST_SETSUM, ST_SESSIONID, ST_DATE }; /*! \enum MachineType \brief Generalized type of a machine */ enum MachineType { MT_UNKNOWN = 0, MT_CPAP, MT_OXIMETER, MT_SLEEPSTAGE, MT_JOURNAL, MT_POSITION, MT_UNCATEGORIZED = 99}; //void InitMapsWithoutAwesomeInitializerLists(); // PAP Device Capabilities const quint32 CAP_Fixed = 0x0000001; // Constant PAP const quint32 CAP_Variable = 0x0000002; // Variable Base (EPAP) pressure const quint32 CAP_BiLevel = 0x0000004; // Fixed Pressure Support const quint32 CAP_Variable_PS = 0x0000008; // Pressure support can range const quint32 CAP_PressureRelief = 0x0000010; // Device has a pressure relief mode (EPR; Flex; SmartFlex) const quint32 CAP_Humidification = 0x0000020; // Device has a humidifier attached // PAP Mode Capabilities const quint32 PAP_CPAP = 0x0001; // Fixed Pressure PAP const quint32 PAP_APAP = 0x0002; // Auto Ranging PAP const quint32 PAP_BiLevelFixed = 0x0004; // Fixed BiLevel const quint32 PAP_BiLevelAutoFixed = 0x0008; // Auto BiLevel with Fixed EPAP const quint32 PAP_BiLevelAutoVariable = 0x0010; // Auto BiLevel with full ranging capabilities const quint32 PAP_ASV_Fixed = 0x0020; // ASV with fixed EPAP const quint32 PAP_ASV_Variable = 0x0040; // ASV with full ranging capabilities const quint32 PAP_SplitNight = 0x8000; // Split night capabilities /*! \enum CPAPMode \brief CPAP Machines mode of operation */ enum CPAPMode { //:short MODE_UNKNOWN = 0, MODE_CPAP, MODE_APAP, MODE_BILEVEL_FIXED, MODE_BILEVEL_AUTO_FIXED_PS, MODE_BILEVEL_AUTO_VARIABLE_PS, MODE_ASV, MODE_ASV_VARIABLE_EPAP }; /*! \enum PRTypes \brief Pressure Relief Types, used by CPAP machines */ enum PRTypes { //:short PR_UNKNOWN = 0, PR_NONE, PR_CFLEX, PR_CFLEXPLUS, PR_AFLEX, PR_BIFLEX, PR_EPR, PR_SMARTFLEX, PR_EASYBREATHE, PR_SENSAWAKE }; enum PRTimeModes { //:short PM_UNKNOWN = 0, PM_RampOnly, PM_FullTime }; struct MachineInfo { MachineInfo() { type = MT_UNKNOWN; version = 0; cap=0; } MachineInfo(const MachineInfo & copy) { type = copy.type; loadername = copy.loadername; brand = copy.brand; model = copy.model; modelnumber = copy.modelnumber; serial = copy.serial; series = copy.series; version = copy.version; lastimported = copy.lastimported; cap = copy.cap; } MachineInfo(MachineType type, quint32 cap, QString loadername, QString brand, QString model, QString modelnumber, QString serial, QString series, QDateTime lastimported, int version) : type(type), cap(cap), loadername(loadername), brand(brand), model(model), modelnumber(modelnumber), serial(serial), series(series), lastimported(lastimported), version(version) {} MachineType type; quint32 cap; QString loadername; QString brand; QString model; QString modelnumber; QString serial; QString series; QDateTime lastimported; int version; }; //extern map DefaultMCShortNames; //extern map DefaultMCLongNames; //extern map PressureReliefNames; //extern map CPAPModeNames; /*! \enum MCDataType \brief Data Types stored by Profile/Preferences objects, etc.. */ enum MCDataType { MC_bool = 0, MC_int, MC_long, MC_float, MC_double, MC_string, MC_datetime }; extern ChannelID NoChannel, SESSION_ENABLED, CPAP_SummaryOnly; extern ChannelID CPAP_IPAP, CPAP_IPAPLo, CPAP_IPAPHi, CPAP_EPAP, CPAP_EPAPLo, CPAP_EPAPHi, CPAP_Pressure, CPAP_PS, CPAP_PSMin, CPAP_PSMax, CPAP_Mode, CPAP_AHI, CPAP_PressureMin, CPAP_PressureMax, CPAP_Ramp, CPAP_RampTime, CPAP_RampPressure, CPAP_Obstructive, CPAP_Hypopnea, CPAP_ClearAirway, CPAP_Apnea, CPAP_CSR, CPAP_LeakFlag, CPAP_ExP, CPAP_NRI, CPAP_VSnore, CPAP_VSnore2, CPAP_RERA, CPAP_PressurePulse, CPAP_FlowLimit, CPAP_SensAwake, CPAP_FlowRate, CPAP_MaskPressure, CPAP_MaskPressureHi, CPAP_RespEvent, CPAP_Snore, CPAP_MinuteVent, CPAP_RespRate, CPAP_TidalVolume, CPAP_PTB, CPAP_Leak, CPAP_LeakMedian, CPAP_LeakTotal, CPAP_MaxLeak, CPAP_FLG, CPAP_IE, CPAP_Te, CPAP_Ti, CPAP_TgMV, CPAP_UserFlag1, CPAP_UserFlag2, CPAP_UserFlag3, CPAP_BrokenSummary, CPAP_BrokenWaveform, CPAP_RDI, CPAP_PresReliefMode, CPAP_PresReliefLevel, CPAP_Test1, CPAP_Test2; extern ChannelID RMS9_E01, RMS9_E02, RMS9_SetPressure, RMS9_MaskOnTime; extern ChannelID PRS1_00, PRS1_01, PRS1_08, PRS1_0A, PRS1_0B, PRS1_0C, PRS1_0E, PRS1_0F, CPAP_LargeLeak, PRS1_12, PRS1_FlexMode, PRS1_FlexLevel, PRS1_HumidStatus, PRS1_HumidLevel, CPAP_HumidSetting, PRS1_SysLock, PRS1_SysOneResistStat, PRS1_SysOneResistSet, PRS1_HoseDiam, PRS1_AutoOn, PRS1_AutoOff, PRS1_MaskAlert, PRS1_ShowAHI; extern ChannelID INTELLIPAP_Unknown1, INTELLIPAP_Unknown2; extern ChannelID OXI_Pulse, OXI_SPO2, OXI_Perf, OXI_PulseChange, OXI_SPO2Drop, OXI_Plethy; extern ChannelID Journal_Notes, Journal_Weight, Journal_BMI, Journal_ZombieMeter, Bookmark_Start, Bookmark_End, Bookmark_Notes, LastUpdated; extern ChannelID ZEO_SleepStage, ZEO_ZQ, ZEO_TotalZ, ZEO_TimeToZ, ZEO_TimeInWake, ZEO_TimeInREM, ZEO_TimeInLight, ZEO_TimeInDeep, ZEO_Awakenings, ZEO_AlarmReason, ZEO_SnoozeTime, ZEO_WakeTone, ZEO_WakeWindow, ZEO_AlarmType, ZEO_MorningFeel, ZEO_FirmwareVersion, ZEO_FirstAlarmRing, ZEO_LastAlarmRing, ZEO_FirstSnoozeTime, ZEO_LastSnoozeTime, ZEO_SetAlarmTime, ZEO_RiseTime; extern ChannelID POS_Orientation, POS_Inclination; const QString GRP_CPAP = "CPAP"; const QString GRP_POS = "POS"; const QString GRP_OXI = "OXI"; #endif // MACHINE_COMMON_H sleepyhead-0.9.8/sleepyhead/SleepLib/serialoximeter.cpp0000644000175000017500000001075112412506713022604 0ustar sergiosergio/* SleepLib Machine Loader Class Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include "serialoximeter.h" // Possibly need to replan this to include oximetry QList GetOxiLoaders() { QList oxiloaders; QList loaders = GetLoaders(MT_OXIMETER); Q_FOREACH(MachineLoader * loader, loaders) { SerialOximeter * oxi = qobject_cast(loader); oxiloaders.push_back(oxi); } return oxiloaders; } bool SerialOximeter::scanDevice(QString keyword, quint16 vendor_id, quint16 product_id) { static bool dumponce = true; QStringList ports; //qDebug() << "Scanning for USB Serial devices"; QList list=QSerialPortInfo::availablePorts(); // How does the mac detect this as a SPO2 device? for (int i=0;iportName(); QString desc = info->description(); if ((!keyword.isEmpty() && (desc.contains(keyword, Qt::CaseInsensitive) || name.contains(keyword, Qt::CaseInsensitive))) || ((info->hasVendorIdentifier() && (info->vendorIdentifier() == vendor_id)) && (info->hasProductIdentifier() && (info->productIdentifier() == product_id)))) { ports.push_back(name); QString dbg=QString("Found Serial Port: Name: %1 Desc: %2 Manufacturer: %3 Location: %4").arg(name).arg(desc).arg(info->manufacturer()).arg(info->systemLocation()); if (info->hasProductIdentifier()) //60000 dbg += QString(" PID: %1").arg(info->productIdentifier()); if (info->hasVendorIdentifier()) // 4292 dbg += QString(" VID: %1").arg(info->vendorIdentifier()); qDebug() << dbg.toLocal8Bit().data(); break; } else if (dumponce) { QString dbg=QString("Other Serial Port: Name: %1 Desc: %2 Manufacturer: %3 Location: %4").arg(name).arg(desc).arg(info->manufacturer()).arg(info->systemLocation()); if (info->hasProductIdentifier()) //60000 dbg += QString(" PID: %1").arg(info->productIdentifier()); if (info->hasVendorIdentifier()) // 4292 dbg += QString(" VID: %1").arg(info->vendorIdentifier()); qDebug() << dbg.toLocal8Bit().data(); } } dumponce = false; if (ports.isEmpty()) { return false; } if (ports.size()>1) { qDebug() << "More than one serial device matching these parameters was found, choosing the first by default"; } port=ports.at(0); return true; } void SerialOximeter::closeDevice() { killTimers(); disconnect(&serial,SIGNAL(readyRead()), this, SLOT(dataAvailable())); serial.close(); m_streaming = false; qDebug() << "Port" << port << "closed"; } bool SerialOximeter::openDevice() { if (port.isEmpty()) { if (!scanDevice("",m_vendorID, m_productID)) return false; } serial.setPortName(port); if (!serial.open(QSerialPort::ReadWrite)) return false; // forward this stuff // Set up serial port attributes serial.setBaudRate(QSerialPort::Baud19200); serial.setParity(QSerialPort::OddParity); serial.setStopBits(QSerialPort::OneStop); serial.setDataBits(QSerialPort::Data8); serial.setFlowControl(QSerialPort::NoFlowControl); m_streaming = true; m_abort = false; m_importing = false; // connect relevant signals connect(&serial,SIGNAL(readyRead()), this, SLOT(dataAvailable())); return true; } void SerialOximeter::dataAvailable() { QByteArray bytes; int available = serial.bytesAvailable(); bytes.resize(available); int bytesread = serial.read(bytes.data(), available); if (bytesread == 0) return; if (m_abort) { closeDevice(); return; } processBytes(bytes); } void SerialOximeter::stopRecording() { closeDevice(); m_status = NEUTRAL; emit importComplete(this); } void SerialOximeter::trashRecords() { QMap *>::iterator it; for (it = oxisessions.begin(); it != oxisessions.end(); ++it) { delete it.value(); } oxisessions.clear(); oxirec = nullptr; } sleepyhead-0.9.8/sleepyhead/SleepLib/session.cpp0000644000175000017500000015636612412506713021250 0ustar sergiosergio/* SleepLib Session Implementation * This stuff contains the base calculation smarts * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "session.h" #include #include #include #include #include #include #include #include "SleepLib/calcs.h" #include "SleepLib/profiles.h" using namespace std; // This is the uber important database version for SleepyHeads internal storage // Increment this after stuffing with Session's save & load code. const quint16 summary_version = 17; const quint16 events_version = 10; Session::Session(Machine *m, SessionID session) { s_lonesession = false; if (!session) { session = m->CreateSessionID(); } s_machine = m; s_machtype = m->type(); s_session = session; s_changed = false; s_events_loaded = false; s_summary_loaded = false; _first_session = true; s_enabled = -1; s_first = s_last = 0; s_evchecksum_checked = false; s_summaryOnly = false; destroyed = false; } Session::~Session() { TrashEvents(); destroyed = true; } void Session::TrashEvents() // Trash this sessions Events and release memory. { QVector::iterator j; QVector::iterator j_end; QHash >::iterator i; QHash >::iterator i_end=eventlist.end(); if (s_changed) { // Save first.. } for (i = eventlist.begin(); i != i_end; ++i) { j_end=i.value().end(); for (j = i.value().begin(); j != j_end; ++j) { EventList * ev = *j; ev->clear(); ev->m_data.squeeze(); ev->m_data2.squeeze(); ev->m_time.squeeze(); delete ev; } } s_events_loaded = false; eventlist.clear(); eventlist.squeeze(); } QString Session::eventFile() const { return s_machine->getEventsPath()+QString().sprintf("%08lx.001", s_session); } //const int max_pack_size=128; bool Session::OpenEvents() { if (s_events_loaded) { return true; } s_events_loaded = eventlist.size() > 0; if (s_events_loaded) { return true; } QString filename = eventFile(); bool b = LoadEvents(filename); if (!b) { // qWarning() << "Error Loading Events" << filename; return false; } qDebug() << "Loading" << s_machine->loaderName() << "Events" << filename; return s_events_loaded = true; } bool Session::Destroy() { QString path = s_machine->getDataPath(); QDir dir(path); QString base; base.sprintf("%08lx", s_session); base = path + "/" + base; dir.remove(base + ".000"); dir.remove(base + ".001"); return s_machine->unlinkSession(this); //!dir.exists(base + ".000") && !dir.exists(base + ".001"); } bool Session::Store(QString path) // Storing Session Data in our format // {DataDir}/{MachineID}/{SessionID}.{ext} { QDir dir(path); if (!dir.exists(path)) { dir.mkpath(path); } //qDebug() << "Storing Session: " << base; bool a; a = StoreSummary(); // if actually has events //qDebug() << " Summary done"; if (eventlist.size() > 0) { StoreEvents(); } else { // who cares.. //qDebug() << "Trying to save empty events file"; } //qDebug() << " Events done"; s_changed = false; s_events_loaded = true; //} else { // qDebug() << "Session::Store() No event data saved" << s_session; //} return a; } /*QDataStream & operator<<(QDataStream & out, const Session & session) { session.StoreSummaryData(out); return out; } void Session::StoreSummaryData(QDataStream & out) const { out << summary_version; out << (quint32)s_session; out << s_first; // Session Start Time out << s_last; // Duration of sesion in seconds. out << settings; out << m_cnt; out << m_sum; out << m_avg; out << m_wavg; out << m_min; out << m_max; out << m_physmin; out << m_physmax; out << m_cph; out << m_sph; out << m_firstchan; out << m_lastchan; out << m_valuesummary; out << m_timesummary; out << m_gain; out << m_availableChannels; out << m_timeAboveTheshold; out << m_upperThreshold; out << m_timeBelowTheshold; out << m_lowerThreshold; out << s_summaryOnly; } QDataStream & operator>>(QDataStream & in, Session & session) { session.LoadSummaryData(in); return in; } void Session::LoadSummaryData(QDataStream & in) { quint16 version; in >> version; quint32 t32; in >> t32; // Sessionid; s_session = t32; in >> s_first; // Start time in >> s_last; // Duration in >> settings; in >> m_cnt; in >> m_sum; in >> m_avg; in >> m_wavg; in >> m_min; in >> m_max; in >> m_physmin; in >> m_physmax; in >> m_cph; in >> m_sph; in >> m_firstchan; in >> m_lastchan; in >> m_valuesummary; in >> m_timesummary; in >> m_gain; in >> m_availableChannels; in >> m_timeAboveTheshold; in >> m_upperThreshold; in >> m_timeBelowTheshold; in >> m_lowerThreshold; in >> s_summaryOnly; s_enabled = 1; } */ QDataStream & operator>>(QDataStream & in, SessionSlice & slice) { in >> slice.start; quint32 length; in >> length; slice.end = slice.start + length; quint16 i; in >> i; slice.status = (SliceStatus)i; return in; } QDataStream & operator<<(QDataStream & out, const SessionSlice & slice) { out << slice.start; quint32 length = slice.end - slice.start; out << length; out << (quint16)slice.status; return out; } bool Session::StoreSummary() { QString filename = s_machine->getSummariesPath() + QString().sprintf("%08lx.000", s_session); QFile file(filename); if (!file.open(QIODevice::WriteOnly)) { QDir dir; dir.mkpath(s_machine->getSummariesPath()); if (!file.open(QIODevice::WriteOnly)) { qDebug() << "Summary open for writing failed"; return false; } } QDataStream out(&file); out.setVersion(QDataStream::Qt_4_6); out.setByteOrder(QDataStream::LittleEndian); out << (quint32)magic; out << (quint16)summary_version; out << (quint16)filetype_summary; out << (quint32)s_machine->id(); out << (quint32)s_session; out << s_first; // Session Start Time out << s_last; // Duration of sesion in seconds. //out << (quint16)settings.size(); out << settings; out << m_cnt; out << m_sum; out << m_avg; out << m_wavg; out << m_min; out << m_max; out << m_physmin; out << m_physmax; out << m_cph; out << m_sph; out << m_firstchan; out << m_lastchan; // <- 8 out << m_valuesummary; out << m_timesummary; // 8 -> // <- 9 out << m_gain; // 9 -> // <- 15 out << m_availableChannels; out << m_timeAboveTheshold; out << m_upperThreshold; out << m_timeBelowTheshold; out << m_lowerThreshold; out << s_summaryOnly; // 13 -> out << m_slices; file.close(); return true; } bool Session::LoadSummary() { static int sumcnt = 0; if (s_summary_loaded) return true; QString filename = s_machine->getSummariesPath() + QString().sprintf("%08lx.000", s_session); if (filename.isEmpty()) { qDebug() << "Empty summary filename"; return false; } QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Couldn't open summary file" << filename; return false; } // qDebug() << "Loading" << s_machine->loaderName() << "Summary" << filename << sumcnt++; QDataStream in(&file); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); quint32 t32; quint16 t16; //QHash mctype; //QVector mcorder; in >> t32; if (t32 != magic) { qDebug() << "Wrong magic number in " << filename; return false; } quint16 version; in >> version; // DB Version if (version < 6) { //throw OldDBVersion(); qWarning() << "Old dbversion " << version << "summary file.. Sorry, you need to purge and reimport"; return false; } in >> t16; // File Type if (t16 != filetype_summary) { qDebug() << "Wrong file type"; //wrong file type return false; } qint32 ts32; in >> ts32; // MachineID (dont need this result) bool upgrade = false; if (ts32 != s_machine->id()) { upgrade = true; qWarning() << "Machine ID does not match in" << filename << " I will try to load anyway in case you know what your doing."; } in >> t32; // Sessionid; s_session = t32; in >> s_first; // Start time in >> s_last; // Duration // (16bit==Limited to 18 hours) QHash cruft; if (version < 7) { // This code is deprecated.. just here incase anyone tries anything crazy... QHash v1; in >> v1; settings.clear(); ChannelID code; for (QHash::iterator i = v1.begin(); i != v1.end(); i++) { code = schema::channel[i.key()].id(); settings[code] = i.value(); } QHash zcnt; in >> zcnt; for (QHash::iterator i = zcnt.begin(); i != zcnt.end(); i++) { code = schema::channel[i.key()].id(); m_cnt[code] = i.value(); } QHash zsum; in >> zsum; for (QHash::iterator i = zsum.begin(); i != zsum.end(); i++) { code = schema::channel[i.key()].id(); m_sum[code] = i.value(); } QHash ztmp; in >> ztmp; // avg for (QHash::iterator i = ztmp.begin(); i != ztmp.end(); i++) { code = schema::channel[i.key()].id(); m_avg[code] = i.value(); } ztmp.clear(); in >> ztmp; // wavg for (QHash::iterator i = ztmp.begin(); i != ztmp.end(); i++) { code = schema::channel[i.key()].id(); m_wavg[code] = i.value(); } ztmp.clear(); in >> ztmp; // 90p ztmp.clear(); in >> ztmp; // min for (QHash::iterator i = ztmp.begin(); i != ztmp.end(); i++) { code = schema::channel[i.key()].id(); m_min[code] = i.value(); } ztmp.clear(); in >> ztmp; // max for (QHash::iterator i = ztmp.begin(); i != ztmp.end(); i++) { code = schema::channel[i.key()].id(); m_max[code] = i.value(); } ztmp.clear(); in >> ztmp; // cph for (QHash::iterator i = ztmp.begin(); i != ztmp.end(); i++) { code = schema::channel[i.key()].id(); m_cph[code] = i.value(); } ztmp.clear(); in >> ztmp; // sph for (QHash::iterator i = ztmp.begin(); i != ztmp.end(); i++) { code = schema::channel[i.key()].id(); m_sph[code] = i.value(); } QHash ztim; in >> ztim; //firstchan for (QHash::iterator i = ztim.begin(); i != ztim.end(); i++) { code = schema::channel[i.key()].id(); m_firstchan[code] = i.value(); } ztim.clear(); in >> ztim; // lastchan for (QHash::iterator i = ztim.begin(); i != ztim.end(); i++) { code = schema::channel[i.key()].id(); m_lastchan[code] = i.value(); } //SetChanged(true); } else { // version > 7 in >> settings; if (version < 13) { QHash cnt2; in >> cnt2; QHash::iterator it; for (it = cnt2.begin(); it != cnt2.end(); ++it) { m_cnt[it.key()] = it.value(); } } else { in >> m_cnt; } in >> m_sum; in >> m_avg; in >> m_wavg; if (version < 11) { cruft.clear(); in >> cruft; // 90% if (version >= 10) { cruft.clear(); in >> cruft;// med cruft.clear(); in >> cruft; //p95 } } in >> m_min; in >> m_max; // Added 24/10/2013 by MW to support physical graph min/max values if (version >= 12) { in >> m_physmin; in >> m_physmax; } in >> m_cph; in >> m_sph; in >> m_firstchan; in >> m_lastchan; if (version >= 8) { in >> m_valuesummary; in >> m_timesummary; if (version >= 9) { in >> m_gain; } } // screwed up with version 14 if (version >= 15) { in >> m_availableChannels; in >> m_timeAboveTheshold; in >> m_upperThreshold; in >> m_timeBelowTheshold; in >> m_lowerThreshold; } // else this is ugly.. forced machine database upgrade will solve it though. if (version == 13) { QHash::iterator it = settings.find(CPAP_SummaryOnly); if (it != settings.end()) { s_summaryOnly = (*it).toBool(); } else s_summaryOnly = false; } else if (version > 13) { in >> s_summaryOnly; } if (version == 16) { QList slices; in >> slices; m_slices.clear(); for (int i=0;i= 17) { in >> m_slices; } } // not really a good idea to do this... should flag and do a reindex if (upgrade || (version < summary_version)) { qDebug() << "Upgrading Summary file to version" << summary_version; if (!s_summaryOnly) { OpenEvents(); UpdateSummaries(); TrashEvents(); } else { // summary only upgrades go here. } StoreSummary(); } s_summary_loaded = true; return true; } const quint16 compress_method = 1; bool Session::StoreEvents() { QString path = s_machine->getEventsPath(); QDir dir; dir.mkpath(path); QString filename = path+QString().sprintf("%08lx.001", s_session); QFile file(filename); file.open(QIODevice::WriteOnly); QByteArray headerbytes; QDataStream header(&headerbytes, QIODevice::WriteOnly); header.setVersion(QDataStream::Qt_4_6); header.setByteOrder(QDataStream::LittleEndian); header << (quint32)magic; // New Magic Number header << (quint16)events_version; // File Version header << (quint16)filetype_data; // File type 1 == Event header << (quint32)s_machine->id();// Machine Type header << (quint32)s_session; // This session's ID header << s_first; header << s_last; quint16 compress = 0; if (p_profile->session->compressSessionData()) { compress = compress_method; } header << (quint16)compress; header << (quint16)s_machine->type();// Machine Type QByteArray databytes; QDataStream out(&databytes, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_4_6); out.setByteOrder(QDataStream::LittleEndian); out << (qint16)eventlist.size(); // Number of event categories QHash >::iterator i; QHash >::iterator i_end=eventlist.end(); qint16 ev_size; for (i = eventlist.begin(); i != i_end; i++) { ev_size=i.value().size(); out << i.key(); // ChannelID out << (qint16)ev_size; for (int j = 0; j < ev_size; j++) { EventList &e = *i.value()[j]; out << e.first(); out << e.last(); out << (qint32)e.count(); out << (qint8)e.type(); out << e.rate(); out << e.gain(); out << e.offset(); out << e.Min(); out << e.Max(); out << e.dimension(); out << e.hasSecondField(); if (e.hasSecondField()) { out << e.min2(); out << e.max2(); } } } for (i = eventlist.begin(); i != i_end; i++) { ev_size=i.value().size(); for (int j = 0; j < ev_size; j++) { EventList &e = *i.value()[j]; // ****** This is assuming little endian ****** // Store the raw event list data in EventStoreType (16bit short) EventStoreType *ptr = e.m_data.data(); out.writeRawData((char *)ptr, e.count() << 1); //*** Don't delete these comments *** // for (quint32 c=0;c 0) { data = qCompress(databytes); } else { data = databytes; } file.write(headerbytes); file.write(data); file.close(); return true; } bool Session::LoadEvents(QString filename) { quint32 magicnum, machid, sessid; quint16 version, type, crc16, machtype, compmethod; quint8 t8; qint32 datasize; if (filename.isEmpty()) { qDebug() << "Session::LoadEvents() Filename is empty"; return false; } QFile file(filename); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "No Event/Waveform data available for" << s_session; return false; } QByteArray headerbytes = file.read(42); QDataStream header(headerbytes); header.setVersion(QDataStream::Qt_4_6); header.setByteOrder(QDataStream::LittleEndian); header >> magicnum; // Magic Number (quint32) header >> version; // Version (quint16) header >> type; // File type (quint16) header >> machid; // Machine ID (quint32) header >> sessid; //(quint32) header >> s_first; //(qint64) header >> s_last; //(qint64) if (type != filetype_data) { qDebug() << "Wrong File Type in " << filename; return false; } if (magicnum != magic) { qWarning() << "Wrong Magic number in " << filename; return false; } if (version < 6) { // prior to version 6 is too old to deal with qDebug() << "Old File Version, can't open file"; return false; } if (version < 10) { file.seek(32); } else { header >> compmethod; // Compression Method (quint16) header >> machtype; // Machine Type (quint16) header >> datasize; // Size of Uncompressed Data (quint32) header >> crc16; // CRC16 of Uncompressed Data (quint16) } QByteArray databytes, temp = file.readAll(); file.close(); if (version >= 10) { if (compmethod > 0) { databytes = qUncompress(temp); if (!s_evchecksum_checked) { if (databytes.size() != datasize) { qDebug() << "File" << filename << "has returned wrong datasize"; return false; } quint16 crc = qChecksum(databytes.data(), databytes.size()); if (crc != crc16) { qDebug() << "CRC Doesn't match in" << filename; return false; } s_evchecksum_checked = true; } } else { databytes = temp; } } else { databytes = temp; } QDataStream in(databytes); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); qint16 mcsize; in >> mcsize; // number of Machine Code lists ChannelID code; qint64 ts1, ts2; qint32 evcount; EventListType elt; EventDataType rate, gain, offset, mn, mx; qint16 size2; QVector mcorder; QVector sizevec; QString dim; for (int i = 0; i < mcsize; i++) { if (version < 8) { QString txt; in >> txt; code = schema::channel[txt].id(); } else { in >> code; } mcorder.push_back(code); in >> size2; sizevec.push_back(size2); for (int j = 0; j < size2; j++) { in >> ts1; in >> ts2; in >> evcount; in >> t8; elt = (EventListType)t8; in >> rate; in >> gain; in >> offset; in >> mn; in >> mx; in >> dim; bool second_field = false; if (version >= 7) { // version 7 added this field in >> second_field; } EventList *elist = AddEventList(code, elt, gain, offset, mn, mx, rate, second_field); elist->setDimension(dim); //eventlist[code].push_back(elist); elist->m_count = evcount; elist->m_first = ts1; elist->m_last = ts2; if (second_field) { EventDataType min, max; in >> min; in >> max; elist->setMin2(min); elist->setMax2(max); } } } //EventStoreType t; //quint32 x; for (int i = 0; i < mcsize; i++) { code = mcorder[i]; size2 = sizevec[i]; for (int j = 0; j < size2; j++) { EventList &evec = *eventlist[code][j]; evec.m_data.resize(evec.m_count); EventStoreType *ptr = evec.m_data.data(); // ****** This is assuming little endian ****** in.readRawData((char *)ptr, evec.m_count << 1); //*** Don't delete these comments *** // for (quint32 c=0;c> t; // *ptr++=t; // } if (evec.hasSecondField()) { evec.m_data2.resize(evec.m_count); ptr = evec.m_data2.data(); in.readRawData((char *)ptr, evec.m_count << 1); //*** Don't delete these comments *** // for (quint32 c=0;c> t; // *ptr++=t; // } } if (evec.type() != EVL_Waveform) { evec.m_time.resize(evec.m_count); quint32 *tptr = evec.m_time.data(); in.readRawData((char *)tptr, evec.m_count << 2); //*** Don't delete these comments *** // for (quint32 c=0;c> x; // *tptr++=x; // } } } } if (version < events_version) { qDebug() << "Upgrading Events file" << filename << "to version" << events_version; UpdateSummaries(); StoreEvents(); } return true; } void Session::destroyEvent(ChannelID code) { QHash >::iterator it = eventlist.find(code); if (it != eventlist.end()) { for (int i = 0; i < it.value().size(); i++) { delete it.value()[i]; } eventlist.erase(it); } m_gain.erase(m_gain.find(code)); m_firstchan.erase(m_firstchan.find(code)); m_lastchan.erase(m_lastchan.find(code)); m_sph.erase(m_sph.find(code)); m_cph.erase(m_cph.find(code)); m_min.erase(m_min.find(code)); m_max.erase(m_max.find(code)); m_avg.erase(m_avg.find(code)); m_wavg.erase(m_wavg.find(code)); m_sum.erase(m_sum.find(code)); m_cnt.erase(m_cnt.find(code)); m_valuesummary.erase(m_valuesummary.find(code)); m_timesummary.erase(m_timesummary.find(code)); // does not trash settings.. } void Session::updateCountSummary(ChannelID code) { QHash >::iterator ev = eventlist.find(code); if (ev == eventlist.end()) { return; } QHash >::iterator vs = m_valuesummary.find(code); if (vs != m_valuesummary.end()) { // already calculated? return; } QHash valsum; QHash timesum; QHash::iterator it; QHash::iterator valsum_end; EventDataType raw, lastraw = 0; qint64 start, time, lasttime = 0; qint32 len, cnt; quint32 *tptr; EventStoreType *dptr, * eptr; int ev_size=ev.value().size(); for (int i = 0; i < ev_size; i++) { EventList &e = *(ev.value()[i]); start = e.first(); cnt = e.count(); dptr = e.rawData(); eptr = dptr + cnt; EventDataType rate = 0; m_gain[code] = e.gain(); if (e.type() == EVL_Event) { lastraw = *dptr++; tptr = e.rawTime(); lasttime = start + *tptr++; // Event version for (; dptr < eptr; dptr++) { time = start + *tptr++; raw = *dptr; valsum[raw]++; // elapsed time in seconds since last event occurred len = (time - lasttime) / 1000L; timesum[lastraw] += len; lastraw = raw; lasttime = time; } } else { // Waveform version, first just count for (; dptr < eptr; dptr++) { raw = *dptr; valsum[raw]++; } // Then process the list of values, time is simply (rate * count) rate = e.rate(); EventDataType t; QHash::iterator it = valsum.begin(); QHash::iterator valsum_end = valsum.end(); for (; it != valsum_end; ++it) { t = EventDataType(it.value()) * rate; timesum[it.key()] += t; } } } if (valsum.size() == 0) { return; } m_valuesummary[code] = valsum; m_timesummary[code] = timesum; } void Session::UpdateSummaries() { ChannelID id; calcAHIGraph(this); // Calculates RespRate and related waveforms (Tv, MV, Te, Ti) if missing calcRespRate(this); calcLeaks(this); flagLargeLeaks(this); calcSPO2Drop(this); calcPulseChange(this); QHash >::iterator c = eventlist.begin(); QHash >::iterator ev_end = eventlist.end(); m_availableChannels.clear(); for (; c != ev_end; c++) { id = c.key(); m_availableChannels.push_back(id); schema::ChanType ctype = schema::channel[id].type(); if (ctype != schema::SETTING) { //sum(id); // avg calculates this and cnt. if (c.value().size() > 0) { EventList *el = c.value()[0]; EventDataType gain = el->gain(); m_gain[id] = gain; } if (!((id == CPAP_FlowRate) || (id == CPAP_MaskPressureHi) || (id == CPAP_RespEvent) || (id == CPAP_MaskPressure))) { updateCountSummary(id); } Min(id); Max(id); count(id); last(id); first(id); if (((id == CPAP_FlowRate) || (id == CPAP_MaskPressureHi) || (id == CPAP_RespEvent) || (id == CPAP_MaskPressure))) { continue; } cph(id); sph(id); avg(id); wavg(id); } } timeAboveThreshold(CPAP_Leak, p_profile->cpap->leakRedline()); s_machine->updateChannels(this); } EventDataType Session::SearchValue(ChannelID code, qint64 time, bool square) { qint64 t1, t2, start; QHash >::iterator it; it = eventlist.find(code); quint32 *tptr; int cnt; EventDataType a,b,c,d,e; if (it != eventlist.end()) { int el_size=it.value().size(); for (int i = 0; i < el_size; i++) { EventList *el = it.value()[i]; if ((time >= el->first()) && (time < el->last())) { cnt = el->count(); if (el->type() == EVL_Waveform) { qint64 tt = time - el->first(); double i = tt / el->rate(); int i1 = int(floor(i)); int i2 = int(ceil(i)); a = el->data(i1); if (i2 >= cnt) { return a; } qint64 t1 = i1 * el->rate(); qint64 t2 = i2 * el->rate(); c = EventDataType(t2 - t1); if (c == 0) return 0; d = EventDataType(t2 - tt); e = d/c; b = el->data(i2); return b + ((a-b) * e); } else { start = el->first(); tptr = el->rawTime(); // TODO: square plots need fixing if (square) { for (int j = 0; j < cnt-1; ++j) { tptr++; t2 = start + *tptr; if (t2 > time) { return el->data(j); } } } else { for (int j = 0; j < cnt-1; ++j) { tptr++; t2 = start + *tptr; if (t2 > time) { tptr--; t1 = start + *tptr; c = EventDataType(t2 - t1); d = EventDataType(t2 - time); e = d/c; a = el->data(j); b = el->data(j+1); if (a == b) { return a; } else { return b + ((a-b) * e); } } } } } } } } return 0; } QString Session::dimension(ChannelID id) { // Cheat for now return schema::channel[id].units(); } EventDataType Session::Min(ChannelID id) { QHash::iterator i = m_min.find(id); if (i != m_min.end()) { return i.value(); } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { m_min[id] = 0; return 0; } QVector &evec = j.value(); bool first = true; EventDataType min = 0, t1; int evec_size = evec.size(); for (int i = 0; i < evec_size; ++i) { if (evec[i]->count() != 0) { t1 = evec[i]->Min(); if ((t1 == 0) && (t1 == evec[i]->Max())) { continue; } if (first) { min = t1; first = false; } else { if (min > t1) { min = t1; } } } } m_min[id] = min; return min; } EventDataType Session::Max(ChannelID id) { QHash::iterator i = m_max.find(id); if (i != m_max.end()) { return i.value(); } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { m_max[id] = 0; return 0; } QVector &evec = j.value(); bool first = true; EventDataType max = 0, t1; int evec_size=evec.size(); for (int i = 0; i < evec_size; ++i) { if (evec.at(i)->count() != 0) { t1 = evec.at(i)->Max(); if (t1 == 0 && t1 == evec.at(i)->Min()) { continue; } if (first) { max = t1; first = false; } else { if (max < t1) { max = t1; } } } } m_max[id] = max; return max; } //// EventDataType Session::physMin(ChannelID id) { QHash::iterator i = m_physmin.find(id); if (i != m_physmin.end()) { return i.value(); } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { m_physmin[id] = 0; return 0; } EventDataType min = floor(Min(id)); m_physmin[id] = min; return min; } EventDataType Session::physMax(ChannelID id) { QHash::iterator i = m_physmax.find(id); if (i != m_physmax.end()) { return i.value(); } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { m_physmax[id] = 0; return 0; } EventDataType max = ceil(Max(id) + 0.5); m_physmax[id] = max; return max; } qint64 Session::first(ChannelID id) { qint64 drift = qint64(p_profile->cpap->clockDrift()) * 1000L; qint64 tmp; QHash::iterator i = m_firstchan.find(id); if (i != m_firstchan.end()) { tmp = i.value(); if (s_machine->type() == MT_CPAP) { tmp += drift; } return tmp; } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { return 0; } QVector &evec = j.value(); bool first = true; qint64 min = 0, t1; int evec_size=evec.size(); for (int i = 0; i < evec_size; ++i) { t1 = evec[i]->first(); if (first) { min = t1; first = false; } else { if (min > t1) { min = t1; } } } m_firstchan[id] = min; if (s_machine->type() == MT_CPAP) { min += drift; } return min; } qint64 Session::last(ChannelID id) { qint64 drift = qint64(p_profile->cpap->clockDrift()) * 1000L; qint64 tmp; QHash::iterator i = m_lastchan.find(id); if (i != m_lastchan.end()) { tmp = i.value(); if (s_machine->type() == MT_CPAP) { tmp += drift; } return tmp; } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { return 0; } QVector &evec = j.value(); bool first = true; qint64 max = 0, t1; int evec_size=evec.size(); for (int i = 0; i < evec_size; ++i) { t1 = evec[i]->last(); if (first) { max = t1; first = false; } else { if (max < t1) { max = t1; } } } m_lastchan[id] = max; if (s_machine->type() == MT_CPAP) { max += drift; } return max; } bool Session::channelDataExists(ChannelID id) { if (s_events_loaded) { QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { // eventlist not loaded. return false; } return true; } else { qDebug() << "Calling channelDataExists without open eventdata!"; } return false; } bool Session::channelExists(ChannelID id) { if (!enabled()) { return false; } if (s_events_loaded) { QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { // eventlist not loaded. return false; } } else { QHash::iterator q = m_cnt.find(id); if (q == m_cnt.end()) { return false; } if (q.value() == 0) { return false; } } return true; } EventDataType Session::countInsideSpan(ChannelID span, ChannelID code) { // TODO: Cache me! QHash >::iterator j = eventlist.find(span); if (j == eventlist.end()) { return 0; } QVector &evec = j.value(); qint64 t1,t2; int evec_size=evec.size(); QList start; QList end; // Simplify the span flags to start and end times list for (int el = 0; el < evec_size; ++el) { EventList &ev = *evec[el]; for (quint32 i=0; i < ev.count(); ++i) { end.push_back(t2=ev.time(i)); start.push_back(t2 - (qint64(ev.data(i)) * 1000L)); } } j = eventlist.find(code); if (j == eventlist.end()) { return 0; } QVector &evec2 = j.value(); evec_size=evec2.size(); int count = 0; int spans = start.size(); for (int el = 0; el < evec_size; ++el) { EventList &ev = *evec2[el]; for (quint32 i=0; i < ev.count(); ++i) { t1 = ev.time(i); for (int z=0; z < spans; ++z) { if ((t1 >= start.at(z)) && (t1 <= end.at(z))) { count++; break; } } } } return count; } EventDataType Session::rangeCount(ChannelID id, qint64 first, qint64 last) { QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { return 0; } QVector &evec = j.value(); int total = 0, cnt; qint64 t, start; int evec_size=evec.size(); for (int i = 0; i < evec_size; ++i) { EventList &ev = *evec[i]; if ((ev.last() < first) || (ev.first() > last)) { continue; } if (ev.type() == EVL_Waveform) { qint64 et = last; if (et > ev.last()) { et = ev.last(); } qint64 st = first; if (st < ev.first()) { st = ev.first(); } t = (et - st) / ev.rate(); total += t; } else { cnt = ev.count(); start = ev.first(); quint32 *tptr = ev.rawTime(); quint32 *eptr = tptr + cnt; for (; tptr < eptr; tptr++) { t = start + *tptr; if (t >= first) { if (t <= last) { total++; } else { break; } } } } } return (EventDataType)total; } double Session::rangeSum(ChannelID id, qint64 first, qint64 last) { QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { return 0; } QVector &evec = j.value(); double sum = 0, gain; qint64 t, start; EventStoreType *dptr, * eptr; quint32 *tptr; int cnt, idx = 0; qint64 rate; int evec_size=evec.size(); for (int i = 0; i < evec_size; i++) { EventList &ev = *evec[i]; if ((ev.last() < first) || (ev.first() > last)) { continue; } start = ev.first(); dptr = ev.rawData(); cnt = ev.count(); eptr = dptr + cnt; gain = ev.gain(); rate = ev.rate(); if (ev.type() == EVL_Waveform) { if (first > ev.first()) { // Skip the samples before first idx = (first - ev.first()) / rate; } dptr += idx; //???? foggy. t = start; for (; dptr < eptr; dptr++) { //int j=idx;j= first) { if (t <= last) { sum += EventDataType(*dptr) * gain; } else { break; } } } } } return sum; } EventDataType Session::rangeMin(ChannelID id, qint64 first, qint64 last) { QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { return 0; } QVector &evec = j.value(); EventDataType gain, v, min = std::numeric_limits::max(); qint64 t, start, rate; EventStoreType *dptr, * eptr; quint32 *tptr; int cnt, idx; int evec_size=evec.size(); for (int i = 0; i < evec_size; ++i) { EventList &ev = *evec[i]; if ((ev.last() < first) || (ev.first() > last)) { continue; } dptr = ev.rawData(); start = ev.first(); cnt = ev.count(); eptr = dptr + cnt; gain = ev.gain(); if (ev.type() == EVL_Waveform) { rate = ev.rate(); t = start; idx = 0; if (first > ev.first()) { // Skip the samples before first idx = (first - ev.first()) / rate; } dptr += idx; for (; dptr < eptr; dptr++) { //int j=idx;j= first) { if (t <= last) { v = EventDataType(*dptr) * gain; if (v < min) { min = v; } } else { break; } } } } } return min; } EventDataType Session::rangeMax(ChannelID id, qint64 first, qint64 last) { QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { return 0; } QVector &evec = j.value(); EventDataType gain, v, max = std::numeric_limits::min(); qint64 t, start, rate; EventStoreType *dptr, * eptr; quint32 *tptr; int cnt, idx; int evec_size=evec.size(); for (int i = 0; i < evec_size; i++) { EventList &ev = *evec[i]; if ((ev.last() < first) || (ev.first() > last)) { continue; } start = ev.first(); dptr = ev.rawData(); cnt = ev.count(); eptr = dptr + cnt; gain = ev.gain(); if (ev.type() == EVL_Waveform) { rate = ev.rate(); t = start; idx = 0; if (first > ev.first()) { // Skip the samples before first idx = (first - ev.first()) / rate; } dptr += idx; for (; dptr < eptr; dptr++) { //int j=idx;j max) { max = v; } } else { break; } t += rate; } } else { tptr = ev.rawTime(); for (; dptr < eptr; dptr++) { t = start + *tptr++; if (t >= first) { if (t <= last) { v = EventDataType(*dptr) * gain; if (v > max) { max = v; } } else { break; } } } } } return max; } EventDataType Session::count(ChannelID id) { QHash::iterator i = m_cnt.find(id); if (i != m_cnt.end()) { return i.value(); } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { // m_cnt[id] = 0; return 0; } QVector &evec = j.value(); int sum = 0; int evec_size=evec.size(); if (evec_size == 0) return 0; for (int i = 0; i < evec_size; ++i) { sum += evec.at(i)->count(); } m_cnt[id] = sum; return sum; } double Session::sum(ChannelID id) { QHash::iterator i = m_sum.find(id); if (i != m_sum.end()) { return i.value(); } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { m_sum[id] = 0; return 0; } QVector &evec = j.value(); double gain, sum = 0; EventStoreType *dptr, * eptr; int cnt; int evec_size=evec.size(); for (int i = 0; i < evec_size; ++i) { EventList &ev = *(evec[i]); gain = ev.gain(); cnt = ev.count(); dptr = ev.rawData(); eptr = dptr + cnt; for (; dptr < eptr; dptr++) { sum += double(*dptr) * gain; } } m_sum[id] = sum; return sum; } EventDataType Session::avg(ChannelID id) { QHash::iterator i = m_avg.find(id); if (i != m_avg.end()) { return i.value(); } QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { m_avg[id] = 0; return 0; } QVector &evec = j.value(); double val = 0, gain; int cnt = 0; EventStoreType *dptr, * eptr; int evec_size=evec.size(); for (int i = 0; i < evec_size; ++i) { EventList &ev = *(evec[i]); dptr = ev.rawData(); gain = ev.gain(); cnt = ev.count(); eptr = dptr + cnt; for (; dptr < eptr; dptr++) { val += double(*dptr) * gain; } } if (cnt > 0) { // Shouldn't really happen.. Should aways contain data val /= double(cnt); } m_avg[id] = val; return val; } EventDataType Session::cph(ChannelID id) // count per hour { QHash::iterator i = m_cph.find(id); if (i != m_cph.end()) { return i.value(); } EventDataType val = count(id); val /= hours(); m_cph[id] = val; return val; } EventDataType Session::sph(ChannelID id) // sum per hour, assuming id is a time field in seconds { QHash::iterator i = m_sph.find(id); if (i != m_sph.end()) { return i.value(); } EventDataType val = sum(id) / 3600.0; val = 100.0 / hours() * val; m_sph[id] = val; return val; } EventDataType Session::timeAboveThreshold(ChannelID id, EventDataType threshold) { QHash::iterator th = m_upperThreshold.find(id); if (th != m_upperThreshold.end()) { if (fabs(th.value()-threshold) < 0.00000001) { // close enough th = m_timeAboveTheshold.find(id); if (th != m_timeAboveTheshold.end()) { return th.value(); } } } bool loaded = s_events_loaded; OpenEvents(); QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { if (!loaded) { TrashEvents(); } return 0.0f; } QVector &evec = j.value(); int evec_size=evec.size(); qint64 ti, started=0, total=0; EventDataType data; int elsize; for (int i = 0; i < evec_size; ++i) { EventList &ev = *(evec[i]); elsize = ev.count(); for (int j=0; j < elsize; ++j) { ti=ev.time(j); data=ev.data(j); if (started == 0) { if (data >= threshold) { started=ti; } } else { if (data < threshold) { total += ti-started; started = 0; } } } } if (started) { total += ti-started; } EventDataType time = double(total) / 60000.0; m_timeAboveTheshold[id] = time; m_upperThreshold[id] = threshold; if (!loaded) this->TrashEvents(); // otherwise leave it open return time; } EventDataType Session::timeBelowThreshold(ChannelID id, EventDataType threshold) { QHash::iterator th = m_lowerThreshold.find(id); if (th != m_lowerThreshold.end()) { if (fabs(th.value()-threshold) < 0.00000001) { // close enough th = m_timeBelowTheshold.find(id); if (th != m_timeBelowTheshold.end()) { return th.value(); } } } bool loaded = s_events_loaded; QHash >::iterator j = eventlist.find(id); if (j == eventlist.end()) { return 0.0f; } QVector &evec = j.value(); int evec_size=evec.size(); qint64 ti, started=0, total=0; EventDataType data; int elsize; for (int i = 0; i < evec_size; ++i) { EventList &ev = *(evec[i]); elsize = ev.count(); for (int j=0; j < elsize; ++j) { ti=ev.time(j); data=ev.data(j); if (started == 0) { if (data <= threshold) { started=ti; } } else { if (data > threshold) { total += ti-started; started = 0; } } } } if (started) { total += ti-started; } EventDataType time = double(total) / 60000.0; m_timeBelowTheshold[id] = time; m_lowerThreshold[id] = threshold; if (!loaded) this->TrashEvents(); // otherwise leave it open return time; } bool sortfunction(EventStoreType i, EventStoreType j) { return (i < j); } EventDataType Session::percentile(ChannelID id, EventDataType percent) { QHash >::iterator jj = eventlist.find(id); if (jj == eventlist.end()) { return 0; } QVector &evec = jj.value(); if (percent > 1.0) { qWarning() << "Session::percentile() called with > 1.0"; return 0; } int evec_size = evec.size(); if (evec_size == 0) { return 0; } QVector array; EventDataType gain = evec[0]->gain(); EventStoreType *dptr, * sptr, *eptr; int tt = 0, cnt = 0; for (int i = 0; i < evec_size; ++i) { EventList &ev = *evec[i]; cnt = ev.count(); tt += cnt; } array.resize(tt); for (int i = 0; i < evec_size; ++i) { EventList &ev = *evec[i]; sptr = ev.rawData(); dptr = array.data(); eptr = sptr + cnt; for (; sptr < eptr; sptr++) { *dptr++ = * sptr; } } int n = array.size() * percent; if (n > array.size() - 1) { n--; } nth_element(array.begin(), array.begin() + n, array.end()); // slack, no averaging.. fixme if this function is ever used.. return array[n] * gain; } EventDataType Session::wavg(ChannelID id) { QHash vtime; QHash::iterator i = m_wavg.find(id); if (i != m_wavg.end()) { return i.value(); } updateCountSummary(id); QHash >::iterator j2 = m_timesummary.find(id); if (j2 == m_timesummary.end()) { return 0; } QHash ×um = j2.value(); if (!m_gain.contains(id)) { return 0; } double s0 = 0, s1 = 0, s2; EventDataType val, gain = m_gain[id]; QHash::iterator vi = timesum.begin(); QHash::iterator ts_end = timesum.end(); for (; vi != ts_end; vi++) { val = vi.key() * gain; s2 = vi.value(); s0 += s2; s1 += val * s2; } if (s0 > 0) { val = s1 / s0; } else { val = 0; } m_wavg[id] = val; return val; } EventList *Session::AddEventList(ChannelID code, EventListType et, EventDataType gain, EventDataType offset, EventDataType min, EventDataType max, EventDataType rate, bool second_field) { schema::Channel *channel = &schema::channel[code]; if (!channel) { qWarning() << "Channel" << code << "does not exist!"; //return nullptr; } EventList *el = new EventList(et, gain, offset, min, max, rate, second_field); eventlist[code].push_back(el); //s_machine->registerChannel(chan); return el; } void Session::offsetSession(qint64 offset) { //qDebug() << "Session starts" << QDateTime::fromTime_t(s_first/1000).toString("yyyy-MM-dd HH:mm:ss"); s_first += offset; s_last += offset; QHash::iterator it; QHash::iterator end; it = m_firstchan.begin(); end = m_firstchan.end(); for (; it != end; it++) { if (it.value() > 0) { it.value() += offset; } } it = m_lastchan.begin(); end = m_lastchan.end(); for (; it != end; it++) { if (it.value() > 0) { it.value() += offset; } } QHash >::iterator i; QHash >::iterator el_end=eventlist.end(); int el_s; for (i = eventlist.begin(); i != el_end; i++) { el_s=i.value().size(); for (int j = 0; j < el_s; j++) { EventList *e = i.value()[j]; e->setFirst(e->first() + offset); e->setLast(e->last() + offset); } } qDebug() << "Session now starts" << QDateTime::fromTime_t(s_first / 1000).toString("yyyy-MM-dd HH:mm:ss"); } qint64 Session::first() { qint64 start = s_first; if (s_machine->type() == MT_CPAP) { start += qint64(p_profile->cpap->clockDrift()) * 1000L; } return start; } qint64 Session::last() { qint64 last = s_last; if (s_machine->type() == MT_CPAP) { last += qint64(p_profile->cpap->clockDrift()) * 1000L; } return last; } sleepyhead-0.9.8/sleepyhead/SleepLib/event.cpp0000644000175000017500000001745212412506713020676 0ustar sergiosergio/* SleepLib Event Class Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include "event.h" EventList::EventList(EventListType et, EventDataType gain, EventDataType offset, EventDataType min, EventDataType max, double rate, bool second_field) : m_type(et), m_gain(gain), m_offset(offset), m_min(min), m_max(max), m_rate(rate), m_second_field(second_field) { m_first = m_last = 0; m_count = 0; if (min == max) { // Update Min & Max unless forceably set here.. m_update_minmax = true; m_min2 = m_min = 999999999.0F; m_max2 = m_max = -999999999.0F; } else { m_update_minmax = false; } m_data.reserve(2048); // Reserve a few to increase performace?? } void EventList::clear() { m_min2 = m_min = 999999999.0F; m_max2 = m_max = -999999999.0F; m_update_minmax = true; m_first = m_last = 0; m_count = 0; m_data.clear(); m_data2.clear(); m_time.clear(); } qint64 EventList::time(quint32 i) const { if (m_type == EVL_Event) { return m_first + qint64(m_time[i]); } return m_first + qint64((EventDataType(i) * m_rate)); } EventDataType EventList::data(quint32 i) { return EventDataType(m_data[i]) * m_gain; } EventDataType EventList::data2(quint32 i) { return EventDataType(m_data2[i]); } void EventList::AddEvent(qint64 time, EventStoreType data) { // Apply gain & offset EventDataType val = EventDataType(data) * m_gain; // ignoring m_offset if (m_update_minmax) { if (m_count == 0) { m_max = m_min = val; } else { m_min = (val < m_min) ? val : m_min; m_max = (val > m_max) ? val : m_max; } } if (!m_first) { m_first = time; m_last = time; } if (m_first > time) { // Crud.. Update all the previous records // This really shouldn't happen. qDebug() << "Unordered time detected in AddEvent()."; qint32 delta = (m_first - time); for (quint32 i = 0; i < m_count; ++i) { m_time[i] -= delta; } m_first = time; } if (m_last < time) { m_last = time; } quint32 delta = (time - m_first); m_data.push_back(data); m_time.push_back(delta); m_count++; } void EventList::AddEvent(qint64 time, EventStoreType data, EventStoreType data2) { AddEvent(time, data); if (!m_second_field) return; m_min2 = (data2 < m_min2) ? data2 : m_min2; m_max2 = (data2 > m_max2) ? data2 : m_max2; m_data2.push_back(data2); } // Adds a consecutive waveform chunk void EventList::AddWaveform(qint64 start, qint16 *data, int recs, qint64 duration) { if (m_type != EVL_Waveform) { qWarning() << "Attempted to add waveform data to non-waveform object"; return; } if (!m_rate) { qWarning() << "Attempted to add waveform without setting sample rate"; return; } qint64 last = start + duration; if (!m_first) { m_first = start; m_last = last; } if (m_last > start) { //qWarning() << "Attempted to add waveform with previous timestamp"; // return; // technically start should equal m_last+1 sample.. check this too. } if (m_last < last) { m_last = last; } // TODO: Check waveform chunk really is contiguous //double rate=duration/recs; //realloc buffers. int r = m_count; m_count += recs; m_data.resize(m_count); // EventStoreType *edata = m_data.data(); EventStoreType raw; // qint16 *ep = data + recs; qint16 *sp = data; // EventStoreType *dp = &edata[r]; if (m_update_minmax) { EventDataType min = m_min, max = m_max, val, gain = m_gain; for (int i=0; i < recs; ++i ) { m_data[r++] = raw = *sp++; val = EventDataType(raw) * gain + m_offset; if (min > val) { min = val; } if (max < val) { max = val; } } // for (sp = data; sp < ep; ++sp) { // *dp++ = raw = *sp; // val = EventDataType(raw) * gain + m_offset; // if (min > val) { min = val; } // if (max < val) { max = val; } // } m_min = min; m_max = max; } else { //register EventDataType val,gain=m_gain; for (int i=0; i < recs; ++i) { m_data[i] = *sp++; } // for (sp = data; sp < ep; ++sp) { // *dp++ = *sp; // //val=EventDataType(raw)*gain; // } } } void EventList::AddWaveform(qint64 start, unsigned char *data, int recs, qint64 duration) { if (m_type != EVL_Waveform) { qWarning() << "Attempted to add waveform data to non-waveform object"; return; } if (!m_rate) { qWarning() << "Attempted to add waveform without setting sample rate"; return; } // duration=recs*rate; qint64 last = start + duration; if (!m_first) { m_first = start; m_last = last; } if (m_last > start) { //qWarning() << "Attempted to add waveform with previous timestamp"; // return; // technically start should equal m_last+1 sample.. check this too. } if (m_last < last) { m_last = last; } // TODO: Check waveform chunk really is contiguos //realloc buffers. int r = m_count; m_count += recs; m_data.resize(m_count); EventStoreType *edata = m_data.data(); EventStoreType raw; EventDataType val; unsigned char *sp; unsigned char *ep = data + recs; EventStoreType *dp = &edata[r]; if (m_update_minmax) { // ignoring m_offset for (sp = data; sp < ep; ++sp) { raw = *sp; val = EventDataType(raw) * m_gain; if (m_min > val) { m_min = val; } if (m_max < val) { m_max = val; } *dp++ = raw; } } else { for (sp = data; sp < ep; ++sp) { raw = *sp; //val = EventDataType(raw) * m_gain; *dp++ = raw; } } } void EventList::AddWaveform(qint64 start, char *data, int recs, qint64 duration) { if (m_type != EVL_Waveform) { qWarning() << "Attempted to add waveform data to non-waveform object"; return; } if (!m_rate) { qWarning() << "Attempted to add waveform without setting sample rate"; return; } // duration=recs*rate; qint64 last = start + duration; if (!m_first) { m_first = start; m_last = last; } else { if (m_last > start) { //qWarning() << "Attempted to add waveform with previous timestamp"; //return; // technically start should equal m_last+1 sample.. check this too. } if (m_last < last) { m_last = last; } } // TODO: Check waveform chunk really is contiguos //realloc buffers. int r = m_count; m_count += recs; m_data.resize(m_count); EventStoreType *edata = m_data.data(); EventStoreType raw; EventDataType val; // FIXME: sstangl: accesses random memory char *sp; char *ep = data + recs; EventStoreType *dp = &edata[r]; if (m_update_minmax) { for (sp = data; sp < ep; ++sp) { raw = *sp; val = EventDataType(raw) * m_gain + m_offset; if (m_min > val) { m_min = val; } if (m_max < val) { m_max = val; } *dp++ = raw; } } else { for (sp = data; sp < ep; ++sp) { raw = *sp; // val = EventDataType(raw) * m_gain + m_offset; *dp++ = raw; } } } sleepyhead-0.9.8/sleepyhead/SleepLib/journal.h0000644000175000017500000000302112412506713020657 0ustar sergiosergio/* SleepLib Journal Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef JOURNAL_H #define JOURNAL_H #include "SleepLib/profiles.h" void BackupJournal(QString filename); class Bookmark { public: Bookmark() { start = end = 0; } Bookmark(const Bookmark & copy) { start = copy.start; end = copy.end; notes = copy.notes; } Bookmark(qint64 start, qint64 end, QString notes): start(start), end(end), notes(notes) {} qint64 start; qint64 end; QString notes; }; class JournalEntry { public: JournalEntry(QDate date); ~JournalEntry(); bool Save(); QString notes(); void setNotes(QString notes); EventDataType weight(); void setWeight(EventDataType weight); int zombie(); void setZombie(int zombie); QList & getBookmarks(); void addBookmark(qint64 start, qint64 end, QString note); void delBookmark(qint64 start, qint64 end); protected: QDate m_date; QList bookmarks; Day * day; Session * session; bool newsession; }; void BackupJournal(QString filename); class DayController { DayController(); ~DayController(); void setDate(QDate date); QDate m_date; JournalEntry * journal; Day * cpap; Day * oximeter; }; #endif // JOURNAL_H sleepyhead-0.9.8/sleepyhead/SleepLib/serialoximeter.h0000644000175000017500000000761112412506713022252 0ustar sergiosergio/* SleepLib MachineLoader Base Class Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef SERIALOXIMETER_H #define SERIALOXIMETER_H #include #include #include "SleepLib/machine_loader.h" const int START_TIMEOUT = 30000; struct OxiRecord { quint8 pulse; quint8 spo2; quint16 perf; OxiRecord():pulse(0), spo2(0),perf(0) {} OxiRecord(quint8 p, quint8 s): pulse(p), spo2(s) {} OxiRecord(quint8 p, quint8 s, quint16 pi): pulse(p), spo2(s), perf(pi) {} // with perfusion index OxiRecord(const OxiRecord & copy) { pulse = copy.pulse; spo2 = copy.spo2; perf = copy.perf; } }; class SerialOximeter : public MachineLoader { Q_OBJECT public: SerialOximeter() : MachineLoader() { m_importing = m_streaming = false; m_productID = m_vendorID = 0; have_perfindex = false; } virtual ~SerialOximeter() {} virtual bool Detect(const QString &path)=0; virtual int Open(QString path)=0; static void Register() {} virtual int Version()=0; virtual const QString &loaderName()=0; virtual QDateTime getDateTime(int session) { Q_UNUSED(session); return QDateTime(); } virtual int getDuration(int session) { Q_UNUSED(session); return 0; } virtual int getSessionCount() { return 0; } virtual QString getUser() { return QString(); } virtual QString getModel() { return QString(); } virtual QString getVendor() { return QString(); } virtual QString getDeviceString() { return QString(); } virtual void getSessionData(int session) { Q_UNUSED(session); } virtual void syncClock() {} virtual QString getDeviceID() { return QString(); } virtual void setDeviceID(QString) {} virtual void eraseSession(int /*user*/, int /*session*/) {} virtual bool commandDriven() { return false; } virtual MachineInfo newInfo() { return MachineInfo(MT_OXIMETER, 0, "", QString(), QString(), QString(), QString(), "Generic", QDateTime::currentDateTime(), 0); } // Serial Stuff virtual bool scanDevice(QString keyword="",quint16 vendor_id=0, quint16 product_id=0); virtual bool openDevice(); virtual void closeDevice(); inline bool isStreaming() { return m_streaming; } inline bool isImporting() { return m_importing; } bool havePerfIndex() { return have_perfindex; } virtual void process() {} //virtual Machine *CreateMachine()=0; // available sessions QMap *> oxisessions; // current session QVector * oxirec; QDateTime startTime() { return m_startTime; } void setStartTime(QDateTime datetime) { m_startTime = datetime; } virtual bool isStartTimeValid() { return true; } virtual void setDuration(int) { } virtual qint64 importResolution() { return 1000; } virtual qint64 liveResolution() { return 20; } void trashRecords(); virtual void resetDevice() {} signals: void noDeviceFound(); void deviceDetected(); void updatePlethy(QByteArray plethy); void importComplete(SerialOximeter *); protected slots: virtual void dataAvailable(); virtual void resetImportTimeout() {} virtual void startImportTimeout() {} virtual void stopRecording(); virtual void shutdownPorts() {} // virtual void abortTask(); protected: virtual void processBytes(QByteArray buffer) { Q_UNUSED(buffer) } virtual void killTimers() {} virtual void requestData() {} QString port; QSerialPort serial; QTimer startTimer; QTimer resetTimer; QDateTime m_startTime; quint16 m_productID; quint16 m_vendorID; bool m_streaming; bool m_importing; bool have_perfindex; }; #endif // SERIALOXIMETER_H sleepyhead-0.9.8/sleepyhead/SleepLib/schema.cpp0000644000175000017500000013460712412506713021017 0ustar sergiosergio/* Channel / Schema Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include "common.h" #include "schema.h" #include "common_gui.h" #include "SleepLib/profiles.h" QColor adjustcolor(QColor color, float ar=1.0, float ag=1.0, float ab=1.0) { int r = color.red(); int g = color.green(); int b = color.blue(); r += rand() & 64; g += rand() & 64; b += rand() & 64; r = qMin(int(r * ar), 255); g = qMin(int(g * ag), 255); b = qMin(int(b * ab), 255); return QColor(r,g,b, color.alpha()); } QColor darken(QColor color, float p); namespace schema { void resetChannels(); ChannelList channel; Channel EmptyChannel; Channel *SessionEnabledChannel; QHash ChanTypes; QHash DataTypes; QHash Scopes; bool schema_initialized = false; void setOrders() { schema::channel[CPAP_CSR].setOrder(1); schema::channel[CPAP_Ramp].setOrder(2); schema::channel[CPAP_LargeLeak].setOrder(2); schema::channel[CPAP_ClearAirway].setOrder(3); schema::channel[CPAP_Obstructive].setOrder(4); schema::channel[CPAP_Apnea].setOrder(4); schema::channel[CPAP_NRI].setOrder(3); schema::channel[CPAP_Hypopnea].setOrder(5); schema::channel[CPAP_FlowLimit].setOrder(6); schema::channel[CPAP_RERA].setOrder(6); schema::channel[CPAP_VSnore].setOrder(7); schema::channel[CPAP_VSnore2].setOrder(8); schema::channel[CPAP_ExP].setOrder(6); schema::channel[CPAP_UserFlag1].setOrder(256); schema::channel[CPAP_UserFlag2].setOrder(257); } void init() { if (schema_initialized) { return; } schema_initialized = true; EmptyChannel = Channel(0, DATA, MT_UNKNOWN, DAY, "Empty", "Empty", "Empty Channel", "", ""); SessionEnabledChannel = new Channel(1, DATA, MT_UNKNOWN, DAY, "Enabled", "Enabled", "Session Enabled", "", ""); channel.channels[1] = SessionEnabledChannel; channel.names["Enabled"] = SessionEnabledChannel; SESSION_ENABLED = 1; ChanTypes["data"] = DATA; //Types["waveform"]=WAVEFORM; ChanTypes["setting"] = SETTING; Scopes["session"] = SESSION; Scopes["day"] = DAY; Scopes["machine"] = MACHINE; Scopes["global"] = GLOBAL; DataTypes[""] = DEFAULT; DataTypes["bool"] = BOOL; DataTypes["double"] = DOUBLE; DataTypes["integer"] = INTEGER; DataTypes["string"] = STRING; DataTypes["richtext"] = RICHTEXT; DataTypes["date"] = DATE; DataTypes["datetime"] = DATETIME; DataTypes["time"] = TIME; if (!schema::channel.Load(":/docs/channels.xml")) { QMessageBox::critical(0, STR_MessageBox_Error, QObject::tr("Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!"), QMessageBox::Ok); QApplication::exit(-1); } // Lookup Code strings are used internally and not meant to be tranlsated // Group ChannelID Code Type Scope Lookup Code Translable Name Description Shortened Name Units String FieldType Default Color // Pressure Related Settings schema::channel.add(GRP_CPAP, new Channel(CPAP_Pressure = 0x110C, WAVEFORM, MT_CPAP, SESSION, "Pressure", STR_TR_Pressure, QObject::tr("Therapy Pressure"), STR_TR_Pressure, STR_UNIT_CMH2O, DEFAULT, QColor("dark green"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_IPAP = 0x110D, WAVEFORM, MT_CPAP, SESSION, "IPAP", STR_TR_IPAP, QObject::tr("Inspiratory Pressure"), STR_TR_IPAP, STR_UNIT_CMH2O, DEFAULT, QColor("red"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_IPAPLo = 0x1110, WAVEFORM, MT_CPAP, SESSION, "IPAPLo", STR_TR_IPAPLo, QObject::tr("Lower Inspiratory Pressure"), STR_TR_IPAPLo, STR_UNIT_CMH2O, DEFAULT, QColor("orange"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_IPAPHi = 0x1111, WAVEFORM, MT_CPAP, SESSION, "IPAPHi", STR_TR_IPAPHi, QObject::tr("Higher Inspiratory Pressure"), STR_TR_IPAPHi, STR_UNIT_CMH2O, DEFAULT, QColor("orange"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_EPAP = 0x110E, WAVEFORM, MT_CPAP, SESSION, "EPAP", STR_TR_EPAP, QObject::tr("Expiratory Pressure"), STR_TR_EPAP, STR_UNIT_CMH2O, DEFAULT, QColor("green"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_EPAPLo = 0x111C, WAVEFORM, MT_CPAP, SESSION, "EPAPLo", STR_TR_EPAPLo, QObject::tr("Lower Expiratory Pressure"), STR_TR_EPAPLo, STR_UNIT_CMH2O, DEFAULT, QColor("light blue"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_EPAPHi = 0x111D, WAVEFORM, MT_CPAP, SESSION, "EPAPHi", STR_TR_EPAPHi, QObject::tr("Higher Expiratory Pressure"), STR_TR_EPAPHi, STR_UNIT_CMH2O, DEFAULT, QColor("aqua"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_PS = 0x110F, WAVEFORM, MT_CPAP, SESSION, "PS", STR_TR_PS, QObject::tr("Pressure Support"), STR_TR_PS, STR_UNIT_CMH2O, DEFAULT, QColor("grey"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_PSMin = 0x111A, SETTING, MT_CPAP, SESSION, "PSMin", QObject::tr("PS Min") , QObject::tr("Pressure Support Minimum"), QObject::tr("PS Min"), STR_UNIT_CMH2O, DEFAULT, QColor("dark cyan"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_PSMax = 0x111B, SETTING, MT_CPAP, SESSION, "PSMax", QObject::tr("PS Max"), QObject::tr("Pressure Support Maximum"), QObject::tr("PS Max"), STR_UNIT_CMH2O, DEFAULT, QColor("dark magenta"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_PressureMin = 0x1020, SETTING, MT_CPAP, SESSION, "PressureMin", QObject::tr("Min Pressure") , QObject::tr("Minimum Therapy Pressure"), QObject::tr("Pressure Min"), STR_UNIT_CMH2O, DEFAULT, QColor("orange"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_PressureMax = 0x1021, SETTING, MT_CPAP, SESSION, "PressureMax", QObject::tr("Max Pressure"), QObject::tr("Maximum Therapy Pressure"), QObject::tr("Pressure Max"), STR_UNIT_CMH2O, DEFAULT, QColor("light blue"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_RampTime = 0x1022, SETTING, MT_CPAP, SESSION, "RampTime", QObject::tr("Ramp Time") , QObject::tr("Ramp Delay Period"), QObject::tr("Ramp Time"), STR_UNIT_Minutes, DEFAULT, QColor("black"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_RampPressure = 0x1023, SETTING, MT_CPAP, SESSION, "RampPressure", QObject::tr("Ramp Pressure"), QObject::tr("Starting Ramp Pressure"), QObject::tr("Ramp Pressure"), STR_UNIT_CMH2O, DEFAULT, QColor("black"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Ramp = 0x1027, SPAN, MT_CPAP, SESSION, "Ramp", QObject::tr("Ramp Event") , QObject::tr("Ramp Event"), QObject::tr("Ramp"), STR_UNIT_EventsPerHour, DEFAULT, QColor("light blue"))); // Flags schema::channel.add(GRP_CPAP, new Channel(CPAP_CSR = 0x1000, SPAN, MT_CPAP, SESSION, "CSR", QObject::tr("Cheyne Stokes Respiration"), QObject::tr("An abnormal period of Periodic Breathing/Cheyne Stokes Respiration"), QObject::tr("CSR"), STR_UNIT_Percentage, DEFAULT, COLOR_CSR)); schema::channel.add(GRP_CPAP, new Channel(CPAP_ClearAirway = 0x1001, FLAG, MT_CPAP, SESSION, "ClearAirway", QObject::tr("Clear Airway"), QObject::tr("An apnea where the airway is open"), QObject::tr("CA"), STR_UNIT_EventsPerHour, DEFAULT, QColor("purple"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Obstructive = 0x1002, FLAG, MT_CPAP, SESSION, "Obstructive", QObject::tr("Obstructive"), QObject::tr("An apnea caused by airway obstruction"), QObject::tr("OA"), STR_UNIT_EventsPerHour, DEFAULT, QColor("#40c0ff"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Hypopnea = 0x1003, FLAG, MT_CPAP, SESSION, "Hypopnea", QObject::tr("Hypopnea"), QObject::tr("A partially obstructed airway"), QObject::tr("H"), STR_UNIT_EventsPerHour, DEFAULT, QColor("blue"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Apnea = 0x1004, FLAG, MT_CPAP, SESSION, "Apnea", QObject::tr("Unclassified Apnea"), QObject::tr("An apnea that could not fit into a category"), QObject::tr("UA"), STR_UNIT_EventsPerHour, DEFAULT, QColor("dark green"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_FlowLimit = 0x1005, FLAG, MT_CPAP, SESSION, "FlowLimit", QObject::tr("Flow Limitation"), QObject::tr("An restriction in breathing from normal, causing a flattening of the flow waveform."), QObject::tr("FL"), STR_UNIT_EventsPerHour, DEFAULT, QColor("#404040"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_RERA = 0x1006, FLAG, MT_CPAP, SESSION, "RERA", QObject::tr("RERA"), QObject::tr("Respiratory Effort Related Arousal: An restriction in breathing that causes an either an awakening or sleep disturbance."), QObject::tr("RE"), STR_UNIT_EventsPerHour, DEFAULT, COLOR_Gold)); schema::channel.add(GRP_CPAP, new Channel(CPAP_VSnore = 0x1007, FLAG, MT_CPAP, SESSION, "VSnore", QObject::tr("Vibratory Snore"), QObject::tr("A vibratory snore"), QObject::tr("VS"), STR_UNIT_EventsPerHour, DEFAULT, QColor("red"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_VSnore2 = 0x1008, FLAG, MT_CPAP, SESSION, "VSnore2", QObject::tr("Vibratory Snore (VS2) "), QObject::tr("A vibratory snore as detcted by a System One machine"), QObject::tr("VS2"), STR_UNIT_EventsPerHour, DEFAULT, QColor("red"))); // This Large Leak record is just a flag marker, used by Intellipap for one schema::channel.add(GRP_CPAP, new Channel(CPAP_LeakFlag = 0x100a, FLAG, MT_CPAP, SESSION, "LeakFlag", QObject::tr("Leak Flag"), QObject::tr("A large mask leak affecting machine performance."), QObject::tr("LF"), STR_UNIT_EventsPerHour, DEFAULT, QColor("light gray"))); // The following is a Large Leak record that references a waveform span schema::channel.add(GRP_CPAP, new Channel(CPAP_LargeLeak = 0x1158, SPAN, MT_CPAP, SESSION, "LeakSpan", QObject::tr("Large Leak"), QObject::tr("A large mask leak affecting machine performance."), QObject::tr("LL"), STR_UNIT_EventsPerHour, DEFAULT, QColor("light gray"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_NRI = 0x100b, FLAG, MT_CPAP, SESSION, "NRI", QObject::tr("Non Responding Event"), QObject::tr("A type of respiratory event that won't respond to a pressure increase."), QObject::tr("NR"), STR_UNIT_EventsPerHour, DEFAULT, QColor("orange"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_ExP = 0x100c, FLAG, MT_CPAP, SESSION, "ExP", QObject::tr("Expiratory Puff"), QObject::tr("Intellipap event where you breathe out your mouth."), QObject::tr("EP"), STR_UNIT_EventsPerHour, DEFAULT, QColor("dark magenta"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_SensAwake = 0x100d, FLAG, MT_CPAP, SESSION, "SensAwake", QObject::tr("SensAwake"), QObject::tr("SensAwake feature will reduce pressure when waking is detected."), QObject::tr("SA"), STR_UNIT_EventsPerHour, DEFAULT, COLOR_Gold)); schema::channel.add(GRP_CPAP, new Channel(CPAP_UserFlag1 = 0x101e, FLAG, MT_CPAP, SESSION, "UserFlag1", QObject::tr("User Flag #1"), QObject::tr("A user definable event detected by SleepyHead's flow waveform processor."), QObject::tr("UF1"), STR_UNIT_EventsPerHour, DEFAULT, QColor(0xc0,0xc0,0xe0))); schema::channel.add(GRP_CPAP, new Channel(CPAP_UserFlag2 = 0x101f, FLAG, MT_CPAP, SESSION, "UserFlag2", QObject::tr("User Flag #2"), QObject::tr("A user definable event detected by SleepyHead's flow waveform processor."), QObject::tr("UF2"), STR_UNIT_EventsPerHour, DEFAULT, QColor(0xa0,0xa0,0xc0))); schema::channel.add(GRP_CPAP, new Channel(CPAP_UserFlag3 = 0x1024, FLAG, MT_CPAP, SESSION, "UserFlag3", QObject::tr("User Flag #3"), QObject::tr("A user definable event detected by SleepyHead's flow waveform processor."), QObject::tr("UF3"), STR_UNIT_EventsPerHour, DEFAULT, QColor("dark grey"))); // Oximetry schema::channel.add(GRP_OXI, new Channel(OXI_Pulse = 0x1800, WAVEFORM, MT_OXIMETER, SESSION, "Pulse", QObject::tr("Pulse Rate"), QObject::tr("Heart rate in beats per minute"), QObject::tr("Pulse Rate"), STR_UNIT_BPM, DEFAULT, QColor("red"))); schema::channel[OXI_Pulse].setLowerThreshold(40); schema::channel[OXI_Pulse].setUpperThreshold(130); schema::channel.add(GRP_OXI, new Channel(OXI_SPO2 = 0x1801, WAVEFORM, MT_OXIMETER, SESSION, "SPO2", QObject::tr("SpO2 %"), QObject::tr("Blood-oxygen saturation percentage"), QObject::tr("SpO2"), STR_UNIT_Percentage, DEFAULT, QColor("blue"))); schema::channel[OXI_SPO2].setLowerThreshold(88); schema::channel.add(GRP_OXI, new Channel(OXI_Plethy = 0x1802, WAVEFORM, MT_OXIMETER, SESSION, "Plethy", QObject::tr("Plethysomogram"), QObject::tr("An optical Photo-plethysomogram showing heart rhythm"), QObject::tr("Plethy"), STR_UNIT_Hz, DEFAULT, QColor("#404040"))); schema::channel.add(GRP_OXI, new Channel(OXI_Perf = 0x1805, WAVEFORM, MT_OXIMETER, SESSION, "Perf. Index", QObject::tr("Perfusion Index"), QObject::tr("A relative assessment of the pulse strength at the monitoring site"), QObject::tr("Perf. Index %"), STR_UNIT_Percentage, DEFAULT, QColor("magenta"))); schema::channel.add(GRP_OXI, new Channel(OXI_PulseChange = 0x1803, FLAG, MT_OXIMETER, SESSION, "PulseChange", QObject::tr("Pulse Change"), QObject::tr("A sudden (user definable) change in heart rate"), QObject::tr("PC"), STR_UNIT_EventsPerHour, DEFAULT, QColor("light grey"))); schema::channel.add(GRP_OXI, new Channel(OXI_SPO2Drop = 0x1804, FLAG, MT_OXIMETER, SESSION, "SPO2Drop", QObject::tr("SpO2 Drop"), QObject::tr("A sudden (user definable) drop in blood oxygen saturation"), QObject::tr("SD"), STR_UNIT_EventsPerHour, DEFAULT, QColor("light blue"))); // // // // // // // // // // // // // // // // // // // // schema::channel.add(GRP_CPAP, new Channel(CPAP_FlowRate = 0x1100, WAVEFORM, MT_CPAP, SESSION, "FlowRate", QObject::tr("Flow Rate"), QObject::tr("Breathing flow rate waveform"), QObject::tr("Flow Rate"), STR_UNIT_LPM, DEFAULT, QColor("black"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_MaskPressure = 0x1101, WAVEFORM, MT_CPAP, SESSION, "MaskPressure", QObject::tr("Mask Pressure"), QObject::tr("Mask Pressure"), QObject::tr("Mask Pressure"), STR_UNIT_CMH2O, DEFAULT, QColor("blue"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_MaskPressureHi = 0x1102, WAVEFORM, MT_CPAP, SESSION, "MaskPressureHi", QObject::tr("Mask Pressure"), QObject::tr("Mask Pressure (High resolution)"), QObject::tr("Mask Pressure"), STR_UNIT_CMH2O, DEFAULT, QColor("blue"), 0x1101)); // linked to CPAP_MaskPressure schema::channel.add(GRP_CPAP, new Channel(CPAP_TidalVolume = 0x1103, WAVEFORM, MT_CPAP, SESSION, "TidalVolume", QObject::tr("Tidal Volume"), QObject::tr("Amount of air displaced per breath"), QObject::tr("Tidal Volume"), STR_UNIT_ml, DEFAULT, QColor("magenta"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Snore = 0x1104, WAVEFORM, MT_CPAP, SESSION, "Snore", QObject::tr("Snore"), QObject::tr("Graph displaying snore volume"), QObject::tr("Snore"), STR_UNIT_Unknown, DEFAULT, QColor("grey"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_MinuteVent = 0x1105, WAVEFORM, MT_CPAP, SESSION, "MinuteVent", QObject::tr("Minute Ventilation"), QObject::tr("Amount of air displaced per minute"), QObject::tr("Minute Vent."), STR_UNIT_LPM, DEFAULT, QColor("dark cyan"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_RespRate = 0x1106, WAVEFORM, MT_CPAP, SESSION, "RespRate", QObject::tr("Respiratory Rate"), QObject::tr("Rate of breaths per minute"), QObject::tr("Resp. Rate"), STR_UNIT_BreathsPerMinute, DEFAULT, QColor("dark magenta"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_PTB = 0x1107, WAVEFORM, MT_CPAP, SESSION, "PTB", QObject::tr("Patient Triggered Breaths"), QObject::tr("Percentage of breaths triggered by patient"), QObject::tr("Pat. Trig. Breaths"), STR_UNIT_Percentage, DEFAULT, QColor("dark grey"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Leak = 0x1108, WAVEFORM, MT_CPAP, SESSION, "Leak", QObject::tr("Leak Rate"), QObject::tr("Rate of detected mask leakage"), QObject::tr("Leak Rate"), STR_UNIT_LPM, DEFAULT, QColor("dark green"))); schema::channel[CPAP_Leak].setLowerThreshold(24.0); schema::channel.add(GRP_CPAP, new Channel(CPAP_IE = 0x1109, WAVEFORM, MT_CPAP, SESSION, "IE", QObject::tr("I:E Ratio"), QObject::tr("Ratio between Inspiratory and Expiratory time"), QObject::tr("I:E Ratio"), STR_UNIT_Ratio, DEFAULT, QColor("dark red"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Te = 0x110A, WAVEFORM, MT_CPAP, SESSION, "Te", QObject::tr("Expiratory Time"), QObject::tr("Time taken to breathe out"), QObject::tr("Exp. Time"), STR_UNIT_Seconds, DEFAULT, QColor("dark green"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_Ti = 0x110B, WAVEFORM, MT_CPAP, SESSION, "Ti", QObject::tr("Inspiratory Time"), QObject::tr("Time taken to breathe in"), QObject::tr("Insp. Time"), STR_UNIT_Seconds, DEFAULT, QColor("dark blue"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_RespEvent = 0x1112, DATA, MT_CPAP, SESSION, "RespEvent", QObject::tr("Respiratory Event"), QObject::tr("A ResMed data source showing Respiratory Events"), QObject::tr("Resp. Event"), STR_UNIT_EventsPerHour, DEFAULT, QColor("black"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_FLG = 0x1113, WAVEFORM, MT_CPAP, SESSION, "FLG", QObject::tr("Flow Limitation"), QObject::tr("Graph showing severity of flow limitations"), QObject::tr("Flow Limit."), STR_UNIT_Severity, DEFAULT, QColor("dark gray"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_TgMV = 0x1114, WAVEFORM, MT_CPAP, SESSION, "TgMV", QObject::tr("Target Minute Ventilation"), QObject::tr("Target Minute Ventilation?"), QObject::tr("Target Vent."), STR_UNIT_LPM, DEFAULT, QColor("dark cyan"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_MaxLeak = 0x1115, WAVEFORM, MT_CPAP, SESSION, "MaxLeak", QObject::tr("Maximum Leak"), QObject::tr("The maximum rate of mask leakage"), QObject::tr("Max Leaks"), STR_UNIT_LPM, DEFAULT, QColor("dark red"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_AHI = 0x1116, WAVEFORM, MT_CPAP, SESSION, "AHI", QObject::tr("Apnea Hypopnea Index"), QObject::tr("Graph showing running AHI for the past hour"), QObject::tr("AHI"), STR_UNIT_EventsPerHour, DEFAULT, QColor("dark red"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_LeakTotal = 0x1117, WAVEFORM, MT_CPAP, SESSION, "LeakTotal", QObject::tr("Total Leak Rate"), QObject::tr("Detected mask leakage including natural Mask leakages"), QObject::tr("Total Leaks"), STR_UNIT_LPM, DEFAULT, QColor("dark green"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_LeakMedian = 0x1118, WAVEFORM, MT_CPAP, SESSION, "LeakMedian", QObject::tr("Median Leak Rate"), QObject::tr("Median rate of detected mask leakage"), QObject::tr("Median Leaks"), STR_UNIT_LPM, DEFAULT, QColor("dark green"))); schema::channel.add(GRP_CPAP, new Channel(CPAP_RDI = 0x1119, WAVEFORM, MT_CPAP, SESSION, "RDI", QObject::tr("Respiratory Disturbance Index"), QObject::tr("Graph showing running RDI for the past hour"), QObject::tr("RDI"), STR_UNIT_EventsPerHour, DEFAULT, QColor("dark red"))); // Positional sensors schema::channel.add(GRP_POS, new Channel(POS_Orientation = 0x2990, WAVEFORM, MT_POSITION, SESSION, "Orientation", QObject::tr("Orientation"), QObject::tr("Sleep position in degrees"), QObject::tr("Orientation"), STR_UNIT_Degrees, DEFAULT, QColor("dark blue"))); schema::channel.add(GRP_POS, new Channel(POS_Inclination = 0x2991, WAVEFORM, MT_POSITION, SESSION, "Inclination", QObject::tr("Inclination"), QObject::tr("Upright angle in degrees"), QObject::tr("Inclination"), STR_UNIT_Degrees, DEFAULT, QColor("dark magenta"))); schema::channel.add(GRP_CPAP, new Channel(RMS9_MaskOnTime = 0x1025, DATA, MT_CPAP, SESSION, "MaskOnTime", QObject::tr("Mask On Time"), QObject::tr("Time started according to str.edf"), QObject::tr("Mask On Time"), STR_UNIT_Unknown, DEFAULT, Qt::black)); schema::channel.add(GRP_CPAP, new Channel(CPAP_SummaryOnly = 0x1026, DATA, MT_CPAP, SESSION, "SummaryOnly", QObject::tr("Summary Only"), QObject::tr("CPAP Session contains summary data only"), QObject::tr("Summary Only"), STR_UNIT_Unknown, DEFAULT, Qt::black)); Channel *ch; schema::channel.add(GRP_CPAP, ch = new Channel(CPAP_Mode = 0x1200, SETTING, MT_CPAP, SESSION, "PAPMode", QObject::tr("PAP Mode"), QObject::tr("PAP Device Mode"), QObject::tr("PAP Mode"), QString(), LOOKUP, Qt::black)); ch->addOption(0, STR_TR_Unknown); ch->addOption(1, STR_TR_CPAP); ch->addOption(2, QObject::tr("APAP (Variable)")); ch->addOption(3, QObject::tr("Fixed Bi-Level")); ch->addOption(4, QObject::tr("Auto Bi-Level (Fixed PS)")); ch->addOption(5, QObject::tr("Auto Bi-Level (Variable PS)")); ch->addOption(6, QObject::tr("ASV (Fixed EPAP)")); ch->addOption(7, QObject::tr("ASV (Variable EPAP)")); // // NoChannel = 0; // CPAP_IPAP=schema::channel["IPAP"].id(); // CPAP_IPAPLo=schema::channel["IPAPLo"].id(); // CPAP_IPAPHi=schema::channel["IPAPHi"].id(); // CPAP_EPAP=schema::channel["EPAP"].id(); // CPAP_Pressure=schema::channel["Pressure"].id(); // CPAP_PS=schema::channel["PS"].id(); // CPAP_PSMin=schema::channel["PSMin"].id(); // CPAP_PSMax=schema::channel["PSMax"].id(); // CPAP_Mode = schema::channel["PAPMode"].id(); CPAP_BrokenSummary = schema::channel["BrokenSummary"].id(); CPAP_BrokenWaveform = schema::channel["BrokenWaveform"].id(); // CPAP_PressureMin=schema::channel["PressureMin"].id(); // CPAP_PressureMax=schema::channel["PressureMax"].id(); // CPAP_RampTime=schema::channel["RampTime"].id(); // CPAP_RampPressure=schema::channel["RampPressure"].id(); // CPAP_Obstructive=schema::channel["Obstructive"].id(); // CPAP_Hypopnea=schema::channel["Hypopnea"].id(); // CPAP_ClearAirway=schema::channel["ClearAirway"].id(); // CPAP_Apnea=schema::channel["Apnea"].id(); // CPAP_CSR=schema::channel["CSR"].id(); // CPAP_LeakFlag=schema::channel["LeakFlag"].id(); // CPAP_ExP=schema::channel["ExP"].id(); // CPAP_NRI=schema::channel["NRI"].id(); // CPAP_VSnore=schema::channel["VSnore"].id(); // CPAP_VSnore2=schema::channel["VSnore2"].id(); // CPAP_RERA=schema::channel["RERA"].id(); // CPAP_PressurePulse=schema::channel["PressurePulse"].id(); // CPAP_FlowLimit=schema::channel["FlowLimit"].id(); // CPAP_FlowRate=schema::channel["FlowRate"].id(); // CPAP_MaskPressure=schema::channel["MaskPressure"].id(); // CPAP_MaskPressureHi=schema::channel["MaskPressureHi"].id(); // CPAP_RespEvent=schema::channel["RespEvent"].id(); // CPAP_Snore=schema::channel["Snore"].id(); // CPAP_MinuteVent=schema::channel["MinuteVent"].id(); // CPAP_RespRate=schema::channel["RespRate"].id(); // CPAP_TidalVolume=schema::channel["TidalVolume"].id(); // CPAP_PTB=schema::channel["PTB"].id(); // CPAP_Leak=schema::channel["Leak"].id(); // CPAP_LeakMedian=schema::channel["LeakMedian"].id(); // CPAP_LeakTotal=schema::channel["LeakTotal"].id(); // CPAP_MaxLeak=schema::channel["MaxLeak"].id(); // CPAP_FLG=schema::channel["FLG"].id(); // CPAP_IE=schema::channel["IE"].id(); // CPAP_Te=schema::channel["Te"].id(); // CPAP_Ti=schema::channel["Ti"].id(); // CPAP_TgMV=schema::channel["TgMV"].id(); CPAP_Test1 = schema::channel["TestChan1"].id(); CPAP_Test2 = schema::channel["TestChan2"].id(); // CPAP_UserFlag1=schema::channel["UserFlag1"].id(); // CPAP_UserFlag2=schema::channel["UserFlag2"].id(); // CPAP_UserFlag3=schema::channel["UserFlag3"].id(); RMS9_E01 = schema::channel["RMS9_E01"].id(); RMS9_E02 = schema::channel["RMS9_E02"].id(); RMS9_SetPressure = schema::channel["SetPressure"].id(); // TODO: this isn't needed anymore CPAP_HumidSetting = schema::channel["HumidSet"].id(); INTELLIPAP_Unknown1 = schema::channel["IntUnk1"].id(); INTELLIPAP_Unknown2 = schema::channel["IntUnk2"].id(); // OXI_Pulse=schema::channel["Pulse"].id(); // OXI_SPO2=schema::channel["SPO2"].id(); // OXI_PulseChange=schema::channel["PulseChange"].id(); // OXI_SPO2Drop=schema::channel["SPO2Drop"].id(); // OXI_Plethy=schema::channel["Plethy"].id(); // CPAP_AHI=schema::channel["AHI"].id(); // CPAP_RDI=schema::channel["RDI"].id(); Journal_Notes = schema::channel["Journal"].id(); Journal_Weight = schema::channel["Weight"].id(); Journal_BMI = schema::channel["BMI"].id(); Journal_ZombieMeter = schema::channel["ZombieMeter"].id(); LastUpdated = schema::channel["LastUpdated"].id(); Bookmark_Start = schema::channel["BookmarkStart"].id(); Bookmark_End = schema::channel["BookmarkEnd"].id(); Bookmark_Notes = schema::channel["BookmarkNotes"].id(); ZEO_SleepStage = schema::channel["SleepStage"].id(); ZEO_ZQ = schema::channel["ZeoZQ"].id(); ZEO_Awakenings = schema::channel["Awakenings"].id(); ZEO_MorningFeel = schema::channel["MorningFeel"].id(); ZEO_TimeInWake = schema::channel["TimeInWake"].id(); ZEO_TimeInREM = schema::channel["TimeInREM"].id(); ZEO_TimeInLight = schema::channel["TimeInLight"].id(); ZEO_TimeInDeep = schema::channel["TimeInDeep"].id(); ZEO_TimeToZ = schema::channel["TimeToZ"].id(); schema::channel[CPAP_Leak].setShowInOverview(true); schema::channel[CPAP_RespRate].setShowInOverview(true); schema::channel[CPAP_MinuteVent].setShowInOverview(true); schema::channel[CPAP_TidalVolume].setShowInOverview(true); schema::channel[CPAP_CSR].setShowInOverview(true); schema::channel[CPAP_LargeLeak].setShowInOverview(true); } void resetChannels() { schema::channel.channels.clear(); schema::channel.names.clear(); schema::channel.groups.clear(); schema_initialized = false; init(); QList list = GetLoaders(); for (int i=0; i< list.size(); ++i) { MachineLoader * loader = list.at(i); loader->initChannels(); } setOrders(); } Channel::Channel(ChannelID id, ChanType type, MachineType machtype, ScopeType scope, QString code, QString fullname, QString description, QString label, QString unit, DataType datatype, QColor color, int link): m_id(id), m_type(type), m_machtype(machtype), m_scope(scope), m_code(code), m_fullname(fullname), m_description(description), m_label(label), m_unit(unit), m_datatype(datatype), m_defaultcolor(color), m_link(link), m_upperThreshold(0), m_lowerThreshold(0), m_upperThresholdColor(Qt::red), m_lowerThresholdColor(Qt::green), m_enabled(true), m_order(255) { if (type == WAVEFORM) { calc[Calc_Min] = ChannelCalc(id, Calc_Min, adjustcolor(color, 0.25f, 1.0f, 1.3f), false); calc[Calc_Middle] = ChannelCalc(id, Calc_Middle, adjustcolor(color, 1.3f, 1.0f, 1.0f), false); calc[Calc_Perc] = ChannelCalc(id, Calc_Perc, adjustcolor(color, 1.1f, 1.2f, 1.0f), false); calc[Calc_Max] = ChannelCalc(id, Calc_Max, adjustcolor(color, 0.5f, 1.2f, 1.0f), false); calc[Calc_Zero] = ChannelCalc(id, Calc_Zero, Qt::red, false); calc[Calc_LowerThresh] = ChannelCalc(id, Calc_LowerThresh, Qt::blue, false); calc[Calc_UpperThresh] = ChannelCalc(id, Calc_UpperThresh, Qt::red, false); } m_showInOverview = false; } bool Channel::isNull() { return (this == &EmptyChannel); } ChannelList::ChannelList() : m_doctype("channels") { } ChannelList::~ChannelList() { for (QHash::iterator i = channels.begin(); i != channels.end(); i++) { delete i.value(); } } bool ChannelList::Load(QString filename) { QDomDocument doc(m_doctype); QFile file(filename); qDebug() << "Opening " << filename; if (!file.open(QIODevice::ReadOnly)) { qWarning() << "Could not open" << filename; return false; } QString errorMsg; int errorLine; if (!doc.setContent(&file, false, &errorMsg, &errorLine)) { qWarning() << "Invalid XML Content in" << filename; qWarning() << "Error line" << errorLine << ":" << errorMsg; return false; } file.close(); QDomElement root = doc.documentElement(); if (root.tagName().toLower() != "channels") { return false; } QString language = root.attribute("language", "en"); QString version = root.attribute("version", ""); if (version.isEmpty()) { qWarning() << "No Version Field in" << m_doctype << "Schema, assuming 1.0" << filename; version = "1.0"; } qDebug() << "Processing xml file:" << m_doctype << language << version; QDomNodeList grp = root.elementsByTagName("group"); QDomNode node, n, ch; QDomElement e; bool ok; int id, linkid; QString chantype, scopestr, typestr, name, group, idtxt, details, label, unit, datatypestr, defcolor, link; ChanType type; DataType datatype; Channel *chan; QColor color; //bool multi; ScopeType scope; int line; for (int i = 0; i < grp.size(); i++) { node = grp.at(i); group = node.toElement().attribute("name"); //qDebug() << "Group Name" << group; // Why do I have to skip the first node here? (shows up empty) n = node.firstChildElement(); while (!n.isNull()) { line = n.lineNumber(); e = n.toElement(); if (e.nodeName().toLower() != "channel") { qWarning() << "Ignoring unrecognized schema type " << e.nodeName() << "in" << filename << "line" << line; continue; } ch = n.firstChild(); n = n.nextSibling(); idtxt = e.attribute("id"); id = idtxt.toInt(&ok, 16); if (!ok) { qWarning() << "Dodgy ID number " << e.nodeName() << "in" << filename << "line" << line; continue; } chantype = e.attribute("class", "data").toLower(); if (!ChanTypes.contains(chantype)) { qWarning() << "Dodgy class " << chantype << "in" << filename << "line" << line; continue; } type = ChanTypes[chantype]; scopestr = e.attribute("scope", "session"); if (scopestr.at(0) == QChar('!')) { scopestr = scopestr.mid(1); //multi=true; } //multi=false; if (!Scopes.contains(scopestr)) { qWarning() << "Dodgy Scope " << scopestr << "in" << filename << "line" << line; continue; } scope = Scopes[scopestr]; name = e.attribute("name", ""); details = e.attribute("details", ""); label = e.attribute("label", ""); if (name.isEmpty() || details.isEmpty() || label.isEmpty()) { qWarning() << "Missing name,details or label attribute in" << filename << "line" << line; continue; } unit = e.attribute("unit"); defcolor = e.attribute("color", "black"); color = QColor(defcolor); if (!color.isValid()) { qWarning() << "Invalid Color " << defcolor << "in" << filename << "line" << line; color = Qt::black; } datatypestr = e.attribute("type", "").toLower(); link = e.attribute("link", ""); if (!link.isEmpty()) { linkid = link.toInt(&ok, 16); if (!ok) { qWarning() << "Dodgy Link ID number " << e.nodeName() << "in" << filename << " line" << line; } } else { linkid = 0; } if (DataTypes.contains(datatypestr)) { datatype = DataTypes[typestr]; } else { qWarning() << "Ignoring unrecognized schema datatype in" << filename << "line" << line; continue; } if (channels.contains(id)) { qWarning() << "Schema already contains id" << id << "in" << filename << "line" << line; continue; } if (names.contains(name)) { qWarning() << "Schema already contains name" << name << "in" << filename << "line" << line; continue; } chan = new Channel(id, type, MT_UNKNOWN, scope, name, name, details, label, unit, datatype, color, linkid); channels[id] = chan; names[name] = chan; //qDebug() << "Channel" << id << name << label; groups[group][name] = chan; if (linkid > 0) { if (channels.contains(linkid)) { Channel *it = channels[linkid]; it->m_links.push_back(chan); //int i=0; } else { qWarning() << "Linked channel must be defined first in" << filename << "line" << line; } } // process children while (!ch.isNull()) { e = ch.toElement(); QString sub = ch.nodeName().toLower(); QString id2str, name2str; int id2; if (sub == "option") { id2str = e.attribute("id"); id2 = id2str.toInt(&ok, 10); name2str = e.attribute("value"); //qDebug() << sub << id2 << name2str; chan->addOption(id2, name2str); } else if (sub == "color") { } ch = ch.nextSibling(); } } } return true; } void ChannelList::add(QString group, Channel *chan) { Q_ASSERT(chan != nullptr); if (channels.contains(chan->id())) { qWarning() << "Channels already contains id" << chan->id() << chan->code(); Q_ASSERT(false); return; } if (names.contains(chan->code())) { qWarning() << "Channels already contains name" << chan->id() << chan->code(); Q_ASSERT(false); return; } channels[chan->id()] = chan; names[chan->code()] = chan; groups[group][chan->code()] = chan; if (channels.contains(chan->linkid())) { Channel *it = channels[chan->linkid()]; it->m_links.push_back(chan); //int i=0; } else { if (chan->linkid()>0) { qWarning() << "Linked channel must be defined first for" << chan->code(); } } } bool ChannelList::Save(QString filename) { qDebug() << "Saving Channels.xml"; if (filename.isEmpty()) { filename = p_profile->Get("{DataFolder}/") + "channels.xml"; } QDomDocument doc("channels"); QDomElement droot = doc.createElement(STR_AppName); doc.appendChild(droot); QDomElement root = doc.createElement("channels"); droot.appendChild(root); QHash >::iterator git; QHash >::iterator groups_end = groups.end(); for (git = groups.begin(); git != groups_end; ++git) { QHash & chanlist = git.value(); QHash::iterator it; QHash::iterator chend = chanlist.end(); QDomElement grp = doc.createElement("group"); grp.setAttribute("name", git.key()); root.appendChild(grp); for (it =chanlist.begin(); it!= chend; ++it) { Channel * chan = it.value(); QDomElement cn = doc.createElement("channel"); cn.setAttribute("id", chan->id()); cn.setAttribute("code", it.key()); cn.setAttribute("label", chan->label()); cn.setAttribute("name", chan->fullname()); cn.setAttribute("description", chan->description()); cn.setAttribute("color", chan->defaultColor().name()); cn.setAttribute("upper", chan->upperThreshold()); cn.setAttribute("lower", chan->lowerThreshold()); cn.setAttribute("order", chan->order()); cn.setAttribute("type", chan->type()); cn.setAttribute("datatype", chan->datatype()); cn.setAttribute("overview", chan->showInOverview()); QHash::iterator op; for (op = chan->m_options.begin(); op!=chan->m_options.end(); ++op) { QDomElement c2 = doc.createElement("option"); c2.setAttribute("key", op.key()); c2.setAttribute("value", op.value()); cn.appendChild(c2); } //cn.appendChild(doc.createTextNode(i.value().toDateTime().toString("yyyy-MM-dd HH:mm:ss"))); grp.appendChild(cn); } } QFile file(filename); if (!file.open(QIODevice::WriteOnly)) { return false; } QTextStream ts(&file); ts << doc.toString(); file.close(); return true; } } QString ChannelCalc::label() { QString lab = schema::channel[code].label(); QString m_label; switch(type) { case Calc_Min: m_label = QString("%1 %2").arg(STR_TR_Min).arg(lab); break; case Calc_Middle: m_label = Day::calcMiddleLabel(code); break; case Calc_Perc: m_label = Day::calcPercentileLabel(code); break; case Calc_Max: m_label = Day::calcMaxLabel(code); break; case Calc_Zero: m_label = QObject::tr("Zero"); break; case Calc_UpperThresh: m_label = QString("%1 %2").arg(lab).arg(QObject::tr("Upper Threshold")); break; case Calc_LowerThresh: m_label = QString("%1 %2").arg(lab).arg(QObject::tr("Lower Threshold")); break; } return m_label; } //typedef schema::Channel * ChannelID; sleepyhead-0.9.8/sleepyhead/SleepLib/machine_loader.cpp0000644000175000017500000002313012412506713022475 0ustar sergiosergio/* SleepLib Machine Loader Class Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include extern QProgressBar *qprogress; #include "machine_loader.h" bool genpixmapinit = false; QPixmap * MachineLoader::genericCPAPPixmap; // This crap moves to Profile QList m_loaders; QList GetLoaders(MachineType mt) { QList list; for (int i=0; i < m_loaders.size(); ++i) { if (mt == MT_UNKNOWN) { list.push_back(m_loaders.at(i)); } else { MachineType mtype = m_loaders.at(i)->type(); if (mtype == mt) { list.push_back(m_loaders.at(i)); } } } return list; } MachineLoader * lookupLoader(Machine * m) { for (int i=0; i < m_loaders.size(); ++i) { MachineLoader * loader = m_loaders.at(i); if (loader->loaderName() == m->loaderName()) return loader; } return nullptr; } MachineLoader * lookupLoader(QString loaderName) { for (int i=0; i < m_loaders.size(); ++i) { MachineLoader * loader = m_loaders.at(i); if (loader->loaderName() == loaderName) return loader; } return nullptr; } QHash > MachineList; void MachineLoader::removeMachine(Machine * m) { m_machlist.removeAll(m); QHash >::iterator mlit = MachineList.find(m->loaderName()); if (mlit != MachineList.end()) { QHash::iterator mit = mlit.value().find(m->serial()); if (mit != mlit.value().end()) { mlit.value().erase(mit); } } } Machine * MachineLoader::lookupMachine(QString serial) { QHash >::iterator mlit = MachineList.find(loaderName()); if (mlit != MachineList.end()) { QHash::iterator mit = mlit.value().find(serial); if (mit != mlit.value().end()) { return mit.value(); } } return nullptr; } Machine * MachineLoader::CreateMachine(MachineInfo info, MachineID id) { Q_ASSERT(p_profile != nullptr); Machine *m = nullptr; QHash >::iterator mlit = MachineList.find(info.loadername); if (mlit != MachineList.end()) { QHash::iterator mit = mlit.value().find(info.serial); if (mit != mlit.value().end()) { mit.value()->setInfo(info); // update info return mit.value(); } } // Before we create, find any lost folder to get the old ID if ((id == 0) && ((info.type == MT_OXIMETER) || (info.type == MT_JOURNAL) || (info.type == MT_POSITION)|| (info.type == MT_SLEEPSTAGE))) { QString dataPath = p_profile->Get("{" + STR_GEN_DataFolder + "}/"); QDir dir(dataPath); QStringList namefilter(QString(info.loadername+"_*")); QStringList files = dir.entryList(namefilter, QDir::Dirs); if (files.size() > 0) { QString idstr = files[0].section("_",-1); bool ok; id = idstr.toInt(&ok, 16); } } switch (info.type) { case MT_CPAP: m = new CPAP(id); break; case MT_SLEEPSTAGE: m = new SleepStage(id); break; case MT_OXIMETER: m = new Oximeter(id); break; case MT_POSITION: m = new PositionSensor(id); break; case MT_JOURNAL: m = new Machine(id); m->setType(MT_JOURNAL); break; default: m = new Machine(id); break; } m->setInfo(info); qDebug() << "Create" << info.loadername << "Machine" << (info.serial.isEmpty() ? m->hexid() : info.serial); MachineList[info.loadername][info.serial] = m; p_profile->AddMachine(m); return m; } void RegisterLoader(MachineLoader *loader) { loader->initChannels(); m_loaders.push_back(loader); } void DestroyLoaders() { for (QList::iterator i = m_loaders.begin(); i != m_loaders.end(); i++) { delete(*i); } m_loaders.clear(); } MachineLoader::MachineLoader() :QObject(nullptr) { if (!genpixmapinit) { genericCPAPPixmap = new QPixmap(genericPixmapPath); genpixmapinit = true; } m_abort = false; m_type = MT_UNKNOWN; m_status = NEUTRAL; } MachineLoader::~MachineLoader() { for (QList::iterator m = m_machlist.begin(); m != m_machlist.end(); m++) { delete *m; } } void MachineLoader::finishAddingSessions() { QMap::iterator it; QMap::iterator it_end = new_sessions.end(); // Using a map specifically so they are inserted in order. for (it = new_sessions.begin(); it != it_end; ++it) { Session * sess = it.value(); Machine * mach = sess->machine(); mach->AddSession(sess); } new_sessions.clear(); QHash >::iterator mlit = MachineList.find(loaderName()); if (mlit != MachineList.end()) { for(QHash::iterator mit = mlit.value().begin(); mit!=mlit.value().end(); ++mit) { mit.value()->SaveSummary(); } } } bool compressFile(QString inpath, QString outpath) { if (outpath.isEmpty()) { outpath = inpath + ".gz"; } else if (!outpath.endsWith(".gz")) { outpath += ".gz"; } QFile f(inpath); if (!f.exists(inpath)) { qDebug() << "compressFile()" << inpath << "does not exist"; return false; } qint64 size = f.size(); if (!f.open(QFile::ReadOnly)) { qDebug() << "compressFile() Couldn't open" << inpath; return false; } char *buf = new char [size]; if (!f.read(buf, size)) { delete buf; qDebug() << "compressFile() Couldn't read all of" << inpath; return false; } f.close(); gzFile gz = gzopen(outpath.toLatin1(), "wb"); //gzbuffer(gz,65536*2); if (!gz) { qDebug() << "compressFile() Couldn't open" << outpath << "for writing"; delete buf; return false; } gzwrite(gz, buf, size); gzclose(gz); delete buf; return true; } void MachineLoader::queTask(ImportTask * task) { m_tasklist.push_back(task); } void MachineLoader::runTasks(bool threaded) { m_totaltasks=m_tasklist.size(); m_currenttask=0; if (!threaded) { while (!m_tasklist.isEmpty()) { ImportTask * task = m_tasklist.takeFirst(); task->run(); float f = float(m_currenttask) / float(m_totaltasks) * 100.0; qprogress->setValue(f); m_currenttask++; QApplication::processEvents(); } } else { QThreadPool * threadpool = QThreadPool::globalInstance(); while (!m_tasklist.isEmpty()) { if (threadpool->tryStart(m_tasklist.at(0))) { m_tasklist.pop_front(); float f = float(m_currenttask) / float(m_totaltasks) * 100.0; qprogress->setValue(f); m_currenttask++; } QApplication::processEvents(); } QThreadPool::globalInstance()->waitForDone(-1); } } QList CPAPLoader::eventFlags(Day * day) { Machine * mach = day->machine(MT_CPAP); QList list; if (mach->loader() != this) { qDebug() << "Trying to ask" << loaderName() << "for" << mach->loaderName() << "data"; return list; } list.push_back(CPAP_ClearAirway); list.push_back(CPAP_Obstructive); list.push_back(CPAP_Hypopnea); list.push_back(CPAP_Apnea); return list; } /*const QString machine_profile_name="MachineList.xml"; void MachineLoader::LoadMachineList() { } void MachineLoader::StoreMachineList() { } void MachineLoader::LoadSummary(Machine *m, QString &filename) { QFile f(filename); if (!f.exists()) return; f.open(QIODevice::ReadOnly); if (!f.isReadable()) return; } void MachineLoader::LoadSummaries(Machine *m) { QString path=(*profile)["ProfileDirectory"]+"/"+m_classname+"/"+mach->hexid(); QDir dir(path); if (!dir.exists() || !dir.isReadable()) return false; dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); QString fullpath,ext_s,sesstr; int ext; SessionID sessid; bool ok; QMap sessions; QFileInfoList list=dir.entryInfoList(); for (int i=0;i * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef COMMON_H #define COMMON_H #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(4,8,0) #define DEBUG_EFFICIENCY 1 #endif QByteArray gCompress(const QByteArray& data); QByteArray gUncompress(const QByteArray &data); const quint16 filetype_summary = 0; const quint16 filetype_data = 1; const quint16 filetype_sessenabled = 5; enum UnitSystem { US_Undefined, US_Metric, US_Archiac }; typedef float EventDataType; struct ValueCount { ValueCount() { value = 0; count = 0; p = 0; } ValueCount( EventDataType val, qint64 cnt, double pp) :value(val), count(cnt), p(pp) {} ValueCount(const ValueCount ©) { value = copy.value; count = copy.count; p = copy.p; } EventDataType value; qint64 count; double p; }; void copyPath(QString src, QString dst); // Primarily sort by value bool operator <(const ValueCount &a, const ValueCount &b); const float ounce_convert = 28.3495231F; // grams const float pound_convert = ounce_convert * 16; QString weightString(float kg, UnitSystem us = US_Undefined); //! \brief Mercilessly trash a directory bool removeDir(const QString &path); ///Represents the exception for taking the median of an empty list class median_of_empty_list_exception:public std::exception{ virtual const char* what() const throw() { return "Attempt to take the median of an empty list of numbers. " "The median of an empty list is undefined."; } }; ///Return the median of a sequence of numbers defined by the random ///access iterators begin and end. The sequence must not be empty ///(median is undefined for an empty set). /// ///The numbers must be convertible to double. template double median(RandAccessIter begin, RandAccessIter end) throw (median_of_empty_list_exception) { if (begin == end) { throw median_of_empty_list_exception(); } std::size_t size = end - begin; std::size_t middleIdx = size/2; RandAccessIter target = begin + middleIdx; std::nth_element(begin, target, end); if (size % 2 != 0) { //Odd number of elements return *target; } else { //Even number of elements double a = *target; RandAccessIter targetNeighbor= target-1; std::nth_element(begin, targetNeighbor, end); return (a+*targetNeighbor)/2.0; } } #ifndef nullptr #define nullptr NULL #endif #ifdef TEST_BUILD const QString STR_TestBuild = "-Testing"; #else const QString STR_TestBuild = ""; #endif const QString getAppName(); const QString getDeveloperName(); const QString getDefaultAppRoot(); void initializeStrings(); enum OverlayDisplayType { ODT_Bars, ODT_TopAndBottom }; /////////////////////////////////////////////////////////////////////////////////////////////// // Preference Name Strings /////////////////////////////////////////////////////////////////////////////////////////////// const QString STR_GEN_Profile = "Profile"; const QString STR_GEN_SkipLogin = "SkipLoginScreen"; const QString STR_GEN_UpdatesLastChecked = "UpdatesLastChecked"; const QString STR_GEN_UpdatesAutoCheck = "Updates_AutoCheck"; const QString STR_GEN_UpdateCheckFrequency = "Updates_CheckFrequency"; const QString STR_GEN_DataFolder = "DataFolder"; const QString STR_GEN_On = QObject::tr("On"); const QString STR_GEN_Off = QObject::tr("Off"); const QString STR_PREF_AllowEarlyUpdates = "AllowEarlyUpdates"; const QString STR_PREF_ReimportBackup = "ReimportBackup"; const QString STR_PREF_LastCPAPPath = "LastCPAPPath"; const QString STR_MACH_ResMed = "ResMed"; const QString STR_MACH_PRS1 = "PRS1"; const QString STR_MACH_Journal = "Journal"; const QString STR_MACH_Intellipap = "Intellipap"; const QString STR_MACH_Weinmann= "Weinmann"; const QString STR_MACH_FPIcon = "FPIcon"; const QString STR_MACH_MSeries = "MSeries"; const QString STR_MACH_CMS50 = "CMS50"; const QString STR_MACH_ZEO = "Zeo"; const QString STR_PREF_VersionString = "VersionString"; const QString STR_PREF_Language = "Language"; const QString STR_AppName = "SleepyHead"; const QString STR_DeveloperName = "Jedimark"; const QString STR_AppRoot = "SleepyHeadData"; /////////////////////////////////////////////////////////////////////////////////////////////// // Commonly used translatable text strings /////////////////////////////////////////////////////////////////////////////////////////////// extern QString STR_UNIT_CM; extern QString STR_UNIT_INCH; extern QString STR_UNIT_FOOT; extern QString STR_UNIT_POUND; extern QString STR_UNIT_OUNCE; extern QString STR_UNIT_KG; extern QString STR_UNIT_CMH2O; extern QString STR_UNIT_Hours; extern QString STR_UNIT_Minutes; extern QString STR_UNIT_Seconds; extern QString STR_UNIT_BPM; // Beats per Minute extern QString STR_UNIT_LPM; // Litres per Minute extern QString STR_UNIT_ml; // millilitres extern QString STR_UNIT_Litres; extern QString STR_UNIT_Hz; extern QString STR_UNIT_EventsPerHour; extern QString STR_UNIT_Percentage; extern QString STR_UNIT_BreathsPerMinute; extern QString STR_UNIT_Unknown; extern QString STR_UNIT_Ratio; extern QString STR_UNIT_Severity; extern QString STR_UNIT_Degrees; extern QString STR_MessageBox_Question; extern QString STR_MessageBox_Information; extern QString STR_MessageBox_Error; extern QString STR_MessageBox_Warning; extern QString STR_MessageBox_Busy; extern QString STR_MessageBox_PleaseNote; extern QString STR_MessageBox_Yes; extern QString STR_MessageBox_No; extern QString STR_MessageBox_Cancel; extern QString STR_MessageBox_Destroy; extern QString STR_MessageBox_Save; extern QString STR_Empty_NoData; extern QString STR_Empty_NoSessions; extern QString STR_Empty_Brick; extern QString STR_Empty_NoGraphs; extern QString STR_Empty_SummaryOnly; extern QString STR_TR_BMI; // Short form of Body Mass Index extern QString STR_TR_Weight; extern QString STR_TR_Zombie; extern QString STR_TR_PulseRate; // Pulse / Heart rate extern QString STR_TR_SpO2; extern QString STR_TR_Plethy; // Plethysomogram extern QString STR_TR_Pressure; extern QString STR_TR_Daily; extern QString STR_TR_Overview; extern QString STR_TR_Oximetry; extern QString STR_TR_Oximeter; extern QString STR_TR_EventFlags; extern QString STR_TR_Inclination; extern QString STR_TR_Orientation; // Machine type names. extern QString STR_TR_CPAP; // Constant Positive Airway Pressure extern QString STR_TR_BIPAP; // Bi-Level Positive Airway Pressure extern QString STR_TR_BiLevel; // Another name for BiPAP extern QString STR_TR_EPAP; // Expiratory Positive Airway Pressure extern QString STR_TR_EPAPLo; // Expiratory Positive Airway Pressure, Low extern QString STR_TR_EPAPHi; // Expiratory Positive Airway Pressure, High extern QString STR_TR_IPAP; // Inspiratory Positive Airway Pressure extern QString STR_TR_IPAPLo; // Inspiratory Positive Airway Pressure, Low extern QString STR_TR_IPAPHi; // Inspiratory Positive Airway Pressure, High extern QString STR_TR_APAP; // Automatic Positive Airway Pressure extern QString STR_TR_ASV; // Assisted Servo Ventilator extern QString STR_TR_STASV; extern QString STR_TR_Humidifier; extern QString STR_TR_H; // Short form of Hypopnea extern QString STR_TR_OA; // Short form of Obstructive Apnea extern QString STR_TR_UA; // Short form of Unspecified Apnea extern QString STR_TR_CA; // Short form of Clear Airway Apnea extern QString STR_TR_FL; // Short form of Flow Limitation extern QString STR_TR_SA; // Short form of SensAwake extern QString STR_TR_LE; // Short form of Leak Event extern QString STR_TR_EP; // Short form of Expiratory Puff extern QString STR_TR_VS; // Short form of Vibratory Snore extern QString STR_TR_VS2; // Short form of Secondary Vibratory Snore (Some Philips Respironics Machines have two sources) extern QString STR_TR_RERA; // Acronym for Respiratory Effort Related Arousal extern QString STR_TR_PP; // Short form for Pressure Pulse extern QString STR_TR_P; // Short form for Pressure Event extern QString STR_TR_RE; // Short form of Respiratory Effort Related Arousal extern QString STR_TR_NR; // Short form of Non Responding event? (forgot sorry) extern QString STR_TR_NRI; // Sorry I Forgot.. it's a flag on Intellipap machines extern QString STR_TR_O2; // SpO2 Desaturation extern QString STR_TR_PC; // Short form for Pulse Change extern QString STR_TR_UF1; // Short form for User Flag 1 extern QString STR_TR_UF2; // Short form for User Flag 2 extern QString STR_TR_UF3; // Short form for User Flag 3 extern QString STR_TR_PS; // Short form of Pressure Support extern QString STR_TR_AHI; // Short form of Apnea Hypopnea Index extern QString STR_TR_RDI; // Short form of Respiratory Distress Index extern QString STR_TR_AI; // Short form of Apnea Index extern QString STR_TR_HI; // Short form of Hypopnea Index extern QString STR_TR_UAI; // Short form of Uncatagorized Apnea Index extern QString STR_TR_CAI; // Short form of Clear Airway Index extern QString STR_TR_FLI; // Short form of Flow Limitation Index extern QString STR_TR_REI; // Short form of RERA Index extern QString STR_TR_EPI; // Short form of Expiratory Puff Index extern QString STR_TR_CSR; // Short form of Cheyne Stokes Respiration extern QString STR_TR_PB; // Short form of Periodic Breathing // Graph Titles extern QString STR_TR_IE; // Inspiratory Expiratory Ratio extern QString STR_TR_InspTime; // Inspiratory Time extern QString STR_TR_ExpTime; // Expiratory Time extern QString STR_TR_RespEvent; // Respiratory Event extern QString STR_TR_FlowLimitation; extern QString STR_TR_FlowLimit; extern QString STR_TR_PatTrigBreath; // Patient Triggered Breath extern QString STR_TR_TgtMinVent; // Target Minute Ventilation extern QString STR_TR_TargetVent; // Target Ventilation extern QString STR_TR_MinuteVent; // Minute Ventilation extern QString STR_TR_TidalVolume; extern QString STR_TR_RespRate; // Respiratory Rate extern QString STR_TR_Snore; extern QString STR_TR_Leak; extern QString STR_TR_LargeLeak; extern QString STR_TR_LL; extern QString STR_TR_Leaks; extern QString STR_TR_TotalLeaks; extern QString STR_TR_UnintentionalLeaks; extern QString STR_TR_MaskPressure; extern QString STR_TR_FlowRate; extern QString STR_TR_SleepStage; extern QString STR_TR_Usage; extern QString STR_TR_Sessions; extern QString STR_TR_PrRelief; // Pressure Relief extern QString STR_TR_SensAwake; extern QString STR_TR_Bookmarks; extern QString STR_TR_SleepyHead; extern QString STR_TR_Mode; extern QString STR_TR_Model; extern QString STR_TR_Brand; extern QString STR_TR_Series; extern QString STR_TR_Serial; extern QString STR_TR_Machine; extern QString STR_TR_Channel; extern QString STR_TR_Settings; extern QString STR_TR_Name; extern QString STR_TR_DOB; // Date of Birth extern QString STR_TR_Phone; extern QString STR_TR_Address; extern QString STR_TR_Email; extern QString STR_TR_PatientID; extern QString STR_TR_Date; extern QString STR_TR_BedTime; extern QString STR_TR_WakeUp; extern QString STR_TR_MaskTime; extern QString STR_TR_Unknown; extern QString STR_TR_None; extern QString STR_TR_Ready; extern QString STR_TR_First; extern QString STR_TR_Last; extern QString STR_TR_Start; extern QString STR_TR_End; extern QString STR_TR_On; extern QString STR_TR_Off; extern QString STR_TR_Yes; extern QString STR_TR_No; extern QString STR_TR_Min; // Minimum extern QString STR_TR_Max; // Maximum extern QString STR_TR_Med; // Median extern QString STR_TR_Average; extern QString STR_TR_Median; extern QString STR_TR_Avg; // Short form of Average extern QString STR_TR_WAvg; // Short form of Weighted Average #endif // COMMON_H sleepyhead-0.9.8/sleepyhead/SleepLib/calcs.cpp0000644000175000017500000016312712412506713020643 0ustar sergiosergio/* Custom CPAP/Oximetry Calculations Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include "calcs.h" #include "profiles.h" bool SearchEvent(Session * session, ChannelID code, qint64 time, int dur, bool update=true) { qint64 t, start; QHash >::iterator it; it = session->eventlist.find(code); quint32 *tptr; EventStoreType *dptr; int cnt; //qint64 rate; // bool fixdurations = (session->machine()->loaderName() != STR_MACH_ResMed); if (!p_profile->cpap->resyncFromUserFlagging()) { update=false; } QHash >::iterator evend = session->eventlist.end(); if (it != evend) { int el_size=it.value().size(); for (int i = 0; i < el_size; i++) { EventList *el = it.value()[i]; // rate=el->rate(); cnt = el->count(); // why would this be necessary??? if (el->type() == EVL_Waveform) { qDebug() << "Called SearchEvent on a waveform object!"; return false; } else { start = el->first(); tptr = el->rawTime(); dptr = el->rawData(); for (int j = 0; j < cnt; j++) { t = start + *tptr; // Move the position and set the duration qint64 end1 = time + 5000L; qint64 start1 = end1 - quint64(dur+10)*1000L; qint64 end2 = t + 5000L; qint64 start2 = end2 - quint64(*dptr+10)*1000L; bool overlap = (start1 <= end2) && (start2 <= end1); if (overlap) { if (update) { qint32 delta = time-start; if (delta >= 0) { *tptr = delta; *dptr = (EventStoreType)dur; } } return true; } tptr++; dptr++; } } } } return false; } bool SearchApnea(Session *session, qint64 time, double dur) { if (SearchEvent(session, CPAP_Obstructive, time, dur)) return true; if (SearchEvent(session, CPAP_Apnea, time, dur)) return true; if (SearchEvent(session, CPAP_ClearAirway, time, dur)) return true; if (SearchEvent(session, CPAP_Hypopnea, time, dur)) return true; if (SearchEvent(session, CPAP_UserFlag1, time, dur, false)) return true; if (SearchEvent(session, CPAP_UserFlag2, time, dur, false)) return true; return false; } // Sort BreathPeak by peak index bool operator<(const BreathPeak &p1, const BreathPeak &p2) { return p1.start < p2.start; } //! \brief Filters input to output with a percentile filter with supplied width. //! \param samples Number of samples //! \param width number of surrounding samples to consider //! \param percentile fractional percentage, between 0 and 1 void percentileFilter(EventDataType *input, EventDataType *output, int samples, int width, EventDataType percentile) { if (samples <= 0) { return; } if (percentile > 1) { percentile = 1; } QVector buf(width); int s, e; int z1 = width / 2; int z2 = z1 + (width % 2); int nm1 = samples - 1; //int j; // Scan through all of input for (int k = 0; k < samples; k++) { s = k - z1; e = k + z2; // Cap bounds if (s < 0) { s = 0; } if (e > nm1) { e = nm1; } // int j = 0; for (int i = s; i < e; i++) { buf[j++] = input[i]; } j--; EventDataType val = j * percentile; EventDataType fl = floor(val); // If even percentile, or already max value.. if ((val == fl) || (j >= width - 1)) { nth_element(buf.begin(), buf.begin() + j, buf.begin() + width - 1); val = buf[j]; } else { // Percentile lies between two points, interpolate. double v1, v2; nth_element(buf.begin(), buf.begin() + j, buf.begin() + width - 1); v1 = buf[j]; nth_element(buf.begin(), buf.begin() + j + 1, buf.begin() + width - 1); v2 = buf[j + 1]; val = v1 + (v2 - v1) * (val - fl); } output[k] = val; } } void xpassFilter(EventDataType *input, EventDataType *output, int samples, EventDataType weight) { // prime the first value output[0] = input[0]; for (int i = 1; i < samples; i++) { output[i] = weight * input[i] + (1.0 - weight) * output[i - 1]; } //output[samples-1]=input[samples-1]; } FlowParser::FlowParser() { m_session = nullptr; m_flow = nullptr; m_filtered = nullptr; m_gain = 1; m_samples = 0; m_startsUpper = true; // Allocate filter chain buffers.. m_filtered = (EventDataType *) malloc(max_filter_buf_size); } FlowParser::~FlowParser() { free(m_filtered); // for (int i=0;igain(); m_rate = flow->rate(); m_samples = flow->count(); EventStoreType *inraw = flow->rawData(); // Make sure we won't overflow internal buffers if (m_samples > max_filter_buf_size) { qDebug() << "Error: Sample size exceeds max_filter_buf_size in FlowParser::openFlow().. Capping!!!"; m_samples = max_filter_buf_size; } // Begin with the second internal buffer EventDataType *buf = m_filtered; // Apply gain to waveform EventStoreType *eptr = inraw + m_samples; // Convert from store type to floats.. for (; inraw < eptr; ++inraw) { *buf++ = EventDataType(*inraw) * m_gain; } // Apply the rest of the filters chain buf = applyFilters(m_filtered, m_samples); // Scan for and create an index of each breath calcPeaks(m_filtered, m_samples); } // Calculates breath upper & lower peaks for a chunk of EventList data void FlowParser::calcPeaks(EventDataType *input, int samples) { if (samples <= 0) { return; } EventDataType min = 0, max = 0, c, lastc = 0; EventDataType zeroline = 0; double rate = m_flow->rate(); double flowstart = m_flow->first(); double lasttime, time; double peakmax = flowstart, peakmin = flowstart; time = lasttime = flowstart; breaths.clear(); // Estimate storage space needed using typical average breaths per minute. m_minutes = double(m_flow->last() - m_flow->first()) / 60000.0; const double avgbpm = 20; // average breaths per minute of a standard human int guestimate = m_minutes * avgbpm; // reserve some memory breaths.reserve(guestimate); // Prime min & max, and see which side of the zero line we are starting from. c = input[0]; min = max = c; lastc = c; m_startsUpper = (c >= zeroline); qint32 start = 0, middle = 0; int sps = 1000 / m_rate; int len = 0, lastk = 0; qint64 sttime = time; // For each samples, find the peak upper and lower breath components for (int k = 0; k < samples; k++) { c = input[k]; if (c >= zeroline) { // Did we just cross the zero line going up? if (lastc < zeroline) { // This helps filter out dirty breaths.. len = k - start; if ((max > 3) && ((max - min) > 8) && (len > sps) && (middle > start)) { // peak detection may not be needed.. breaths.push_back(BreathPeak(min, max, start, middle, k)); // Set max for start of the upper breath cycle max = c; peakmax = time; // Starting point of next breath cycle start = k; sttime = time; } } else if (c > max) { // Update upper breath peak max = c; peakmax = time; } } if (c < zeroline) { // Did we just cross the zero line going down? if (lastc >= zeroline) { // Set min for start of the lower breath cycle min = c; peakmin = time; middle = k; } else if (c < min) { // Update lower breath peak min = c; peakmin = time; } } lasttime = time; time += rate; lastc = c; lastk = k; } } //! \brief Calculate Respiratory Rate, TidalVolume, Minute Ventilation, Ti & Te.. // These are grouped together because, a) it's faster, and b) some of these calculations rely on others. void FlowParser::calc(bool calcResp, bool calcTv, bool calcTi, bool calcTe, bool calcMv) { if (!m_session) { return; } // Don't even bother if only a few breaths in this chunk const int lowthresh = 4; int nm = breaths.size(); if (nm < lowthresh) { return; } const qint64 minute = 60000; double start = m_flow->first(); double time = start; int bs, be, bm; double st, et, mt; ///////////////////////////////////////////////////////////////////////////////// // Respiratory Rate setup ///////////////////////////////////////////////////////////////////////////////// EventDataType minrr = 0, maxrr = 0; EventList *RR = nullptr; quint32 *rr_tptr = nullptr; EventStoreType *rr_dptr = nullptr; if (calcResp) { RR = m_session->AddEventList(CPAP_RespRate, EVL_Event); minrr = RR->Min(), maxrr = RR->Max(); RR->setGain(0.2F); RR->setFirst(time + minute); RR->getData().resize(nm); RR->getTime().resize(nm); rr_tptr = RR->rawTime(); rr_dptr = RR->rawData(); } int rr_count = 0; double len, st2, et2, adj, stmin, b, rr = 0; double len2; ///////////////////////////////////////////////////////////////////////////////// // Inspiratory / Expiratory Time setup ///////////////////////////////////////////////////////////////////////////////// double lastte2 = 0, lastti2 = 0, lastte = 0, lastti = 0, te, ti, ti1, te1, c; EventList *Te = nullptr, * Ti = nullptr; if (calcTi) { Ti = m_session->AddEventList(CPAP_Ti, EVL_Event); Ti->setGain(0.02F); } if (calcTe) { Te = m_session->AddEventList(CPAP_Te, EVL_Event); Te->setGain(0.02F); } ///////////////////////////////////////////////////////////////////////////////// // Tidal Volume setup ///////////////////////////////////////////////////////////////////////////////// EventList *TV = nullptr; EventDataType mintv = 0, maxtv = 0, tv = 0; double val1, val2; quint32 *tv_tptr = nullptr; EventStoreType *tv_dptr = nullptr; int tv_count = 0; if (calcTv) { TV = m_session->AddEventList(CPAP_TidalVolume, EVL_Event); mintv = TV->Min(), maxtv = TV->Max(); TV->setGain(20); TV->setFirst(start); TV->getData().resize(nm); TV->getTime().resize(nm); tv_tptr = TV->rawTime(); tv_dptr = TV->rawData(); } ///////////////////////////////////////////////////////////////////////////////// // Minute Ventilation setup ///////////////////////////////////////////////////////////////////////////////// EventList *MV = nullptr; EventDataType mv; if (calcMv) { MV = m_session->AddEventList(CPAP_MinuteVent, EVL_Event); MV->setGain(0.125); // gain set to 1/8th } EventDataType sps = (1000.0 / m_rate); // Samples Per Second qint32 timeval = 0; // Time relative to start BreathPeak * bpstr = breaths.data(); BreathPeak * bpend = bpstr + nm; // For each breath... for (BreathPeak * bp = bpstr; bp != bpend; ++bp) { bs = bp->start; bm = bp->middle; be = bp->end; // Calculate start, middle and end time of this breath st = start + bs * m_rate; mt = start + bm * m_rate; timeval = be * m_rate; et = start + timeval; ///////////////////////////////////////////////////////////////////// // Calculate Inspiratory Time (Ti) for this breath ///////////////////////////////////////////////////////////////////// if (calcTi) { // Ti is simply the time between the start of a breath and it's midpoint // Note the 50.0 is the gain value, to give it better resolution // (and mt and st are in milliseconds) ti = ((mt - st) / 1000.0) * 50.0; // Average for a little smoothing ti1 = (lastti2 + lastti + ti * 2) / 4.0; Ti->AddEvent(mt, ti1); // Add the event // Track the last two values to use for averaging lastti2 = lastti; lastti = ti; } ///////////////////////////////////////////////////////////////////// // Calculate Expiratory Time (Te) for this breath ///////////////////////////////////////////////////////////////////// if (calcTe) { // Te is simply the time between the second half of the breath te = ((et - mt) / 1000.0) * 50.0; // Average last three values.. te1 = (lastte2 + lastte + te * 2 ) / 4.0; Te->AddEvent(mt, te1); lastte2 = lastte; lastte = te; } ///////////////////////////////////////////////////////////////////// // Calculate TidalVolume ///////////////////////////////////////////////////////////////////// if (calcTv) { val1 = 0, val2 = 0; // Scan the upper breath for (int j = bs; j < bm; j++) { // convert flow to ml/s to L/min and divide by samples per second c = double(qAbs(m_filtered[j])) * 1000.0 / 60.0 / sps; val2 += c; //val2+=c*c; // for RMS } tv = val2; bool usebothhalves = false; if (usebothhalves) { for (int j = bm; j < be; j++) { // convert flow to ml/s to L/min and divide by samples per second c = double(qAbs(m_filtered[j])) * 1000.0 / 60.0 / sps; val1 += c; //val1 += c*c; // for RMS } tv = (qAbs(val2) + qAbs(val1)) / 2; } // Add the other half here and average might make it more accurate // But last time I tried it was pretty messy // Perhaps needs a bit of history averaging.. // calculate root mean square //double n=bm-bs; //double q=(1/n)*val2; //double x=sqrt(q)*2; //val2=x; if (tv < mintv) { mintv = tv; } if (tv > maxtv) { maxtv = tv; } *tv_tptr++ = timeval; *tv_dptr++ = tv / 20.0; tv_count++; } ///////////////////////////////////////////////////////////////////// // Respiratory Rate Calculations ///////////////////////////////////////////////////////////////////// if (calcResp) { stmin = et - minute; if (stmin < start) { stmin = start; } len = et - stmin; rr = 0; len2 = 0; // Step back through last minute and count breaths BreathPeak *bpstr1 = bpstr-1; for (BreathPeak *p = bp; p != bpstr1; --p) { st2 = start + double(p->start) * m_rate; et2 = start + double(p->end) * m_rate; if (et2 < stmin) { break; } len = et2 - st2; if (st2 < stmin) { // Partial breath st2 = stmin; adj = et2 - st2; b = (1.0 / len) * adj; len2 += adj; } else { b = 1; len2 += len; } rr += b; } if (len2 < minute) { rr *= minute / len2; } // Calculate min & max if (rr < minrr) { minrr = rr; } if (rr > maxrr) { maxrr = rr; } // Add manually.. (much quicker) *rr_tptr++ = timeval; // Use the same gains as ResMed.. *rr_dptr++ = rr * 5.0; rr_count++; } if (calcMv && calcResp && calcTv) { // Minute Ventilation is tidal volume times respiratory rate mv = (tv / 1000.0) * rr; // The 8.0 is the gain of the MV EventList to boost resolution MV->AddEvent(et, mv * 8.0); } } ///////////////////////////////////////////////////////////////////// // Respiratory Rate post filtering ///////////////////////////////////////////////////////////////////// if (calcResp) { RR->setMin(minrr); RR->setMax(maxrr); RR->setFirst(start); RR->setLast(et); RR->setCount(rr_count); } ///////////////////////////////////////////////////////////////////// // Tidal Volume post filtering ///////////////////////////////////////////////////////////////////// if (calcTv) { TV->setMin(mintv); TV->setMax(maxtv); TV->setFirst(start); TV->setLast(et); TV->setCount(tv_count); } } void FlowParser::flagUserEvents(ChannelID code, EventDataType restriction, EventDataType duration) { int numbreaths = breaths.size(); EventDataType val, mx, mn; QVector br; QVector bstart; QVector bend; // Allocate some memory beforehand so it doesn't have to slow it down mid calculations bstart.reserve(numbreaths * 2); bend.reserve(numbreaths * 2); br.reserve(numbreaths * 2); double start = m_flow->first(); double st, et, dur; qint64 len; bool allowDuplicates = p_profile->cpap->userEventDuplicates(); // Get the Breath list, which is calculated by the previously run breath marker algorithm. BreathPeak *bpstr = breaths.data(); BreathPeak *bpend = bpstr + numbreaths; // Create a list containing the abs of min and max waveform flow for each breath for (BreathPeak *p = bpstr; p != bpend; ++p) { br.push_back(qAbs(p->max)); br.push_back(qAbs(p->min)); } // The following ignores the outliers to get a cleaner cutoff value // 60th percentile was chosen because it's a little more than median, and, well, reasons I can't remember specifically.. :-} // Look for the 60th percentile of the abs'ed min/max values const EventDataType perc = 0.6F; int idx = float(br.size()) * perc; nth_element(br.begin(), br.begin() + idx, br.end() - 1); // Take this value as the peak EventDataType peak = br[idx]; ; // Scale the restriction percentage to the peak to find the cutoff value EventDataType cutoffval = peak * (restriction / 100.0F); int bs, bm, be, bs1, bm1, be1; // For each Breath, search for flow restrictions for (BreathPeak *p = bpstr; p != bpend; ++p) { // Todo: Define these markers in the comments better bs = p->start; // breath start bm = p->middle; // breath middle be = p->end; // breath end mx = p->max; mn = p->min; val = mx - mn; // the total height from top to bottom of this breath // Scan the breath in the flow data and stop at the first location more than the cutoff value // (Only really needs to scan to the middle.. I'm not sure why I made it go all the way to the end.) for (bs1 = bs; bs1 < be; bs1++) { if (qAbs(m_filtered[bs1]) > cutoffval) { break; } } // if bs1 has reached the end, this means the entire marked breath is within the restriction // Scan backwards from the middle to the start, stopping at the first value past the cutoff value for (bm1 = bm; bm1 > bs; bm1--) { if (qAbs(m_filtered[bm1]) > cutoffval) { break; } } // Now check if a value was found in the first half of the breath above the cutoff value if (bm1 >= bs1) { // Good breath... And add it as a beginning/end marker for the next stage bstart.push_back(bs1); bend.push_back(bm1); } // else we crossed over and the first half of the breath is under the threshold, therefore has a flow restricted // Now do the other half of the breath.... // Scan from middle to end of breath, stopping at first cutoff value for (bm1 = bm; bm1 < be; bm1++) { if (qAbs(m_filtered[bm1]) > cutoffval) { break; } } // Scan backwards from the end to the middle of the breath, stopping at the first cutoff value for (be1 = be; be1 > bm; be1--) { if (qAbs(m_filtered[be1]) > cutoffval) { break; } } // Check for crossover again if (be1 >= bm1) { // Good strong healthy breath.. add the beginning and end to the breath markers. bstart.push_back(bm1); bend.push_back(be1); } // else crossed over again.. breathe damn you! // okay, this looks like cruft.. // st = start + bs1 * m_rate; // et = start + be1 * m_rate; } int bsize = bstart.size(); // Number of breath components over cutoff threshold EventList *uf = nullptr; // For each good breath marker, look at the gaps in between for (int i = 0; i < bsize - 1; i++) { bs = bend[i]; // start at the end of the healthy breath be = bstart[i + 1]; // look ahead to the beginning of the next one // Calculate the start and end timestamps st = start + bs * m_rate; et = start + be * m_rate; // Calculate the length of the flow restriction len = et - st; dur = len / 1000.0; // (scale to seconds, not milliseconds) if (dur >= duration) { // is the event greater than the duration threshold? // Unless duplicates have been specifically allowed, scan for any apnea's already detected by the machine if (allowDuplicates || !SearchApnea(m_session, et, dur)) { if (!uf) { // Create event list if not already done uf = m_session->AddEventList(code, EVL_Event); } // Add the user flag at the end uf->AddEvent(et, dur); } } } } void FlowParser::flagEvents() { if (!p_profile->cpap->userEventFlagging()) { return; } int numbreaths = breaths.size(); if (numbreaths < 5) { return; } flagUserEvents(CPAP_UserFlag1, p_profile->cpap->userFlowRestriction(), p_profile->cpap->userEventDuration()); flagUserEvents(CPAP_UserFlag2, p_profile->cpap->userFlowRestriction2(), p_profile->cpap->userEventDuration2()); } void calcRespRate(Session *session, FlowParser *flowparser) { if (session->type() != MT_CPAP) { return; } // if (session->machine()->loaderName() != STR_MACH_PRS1) return; if (!session->eventlist.contains(CPAP_FlowRate)) { //qDebug() << "calcRespRate called without FlowRate waveform available"; return; //need flow waveform } bool trashfp; if (!flowparser) { flowparser = new FlowParser(); trashfp = true; //qDebug() << "calcRespRate called without valid FlowParser object.. using a slow throw-away!"; //return; } else { trashfp = false; } bool calcResp = !session->eventlist.contains(CPAP_RespRate); bool calcTv = !session->eventlist.contains(CPAP_TidalVolume); bool calcTi = !session->eventlist.contains(CPAP_Ti); bool calcTe = !session->eventlist.contains(CPAP_Te); bool calcMv = !session->eventlist.contains(CPAP_MinuteVent); int z = (calcResp ? 1 : 0) + (calcTv ? 1 : 0) + (calcMv ? 1 : 0); // If any of these three missing, remove all, and switch all on if (z > 0 && z < 3) { if (!calcResp && !calcTv && !calcMv) { calcTv = calcMv = calcResp = true; } QVector &list = session->eventlist[CPAP_RespRate]; int size = list.size(); for (int i = 0; i < size; ++i) { delete list[i]; } session->eventlist[CPAP_RespRate].clear(); QVector &list2 = session->eventlist[CPAP_TidalVolume]; size = list2.size(); for (int i = 0; i < size; ++i) { delete list2[i]; } session->eventlist[CPAP_TidalVolume].clear(); QVector &list3 = session->eventlist[CPAP_MinuteVent]; size = list3.size(); for (int i = 0; i < size; ++i) { delete list3[i]; } session->eventlist[CPAP_MinuteVent].clear(); } flowparser->clearFilters(); // No filters works rather well with the new peak detection algorithm.. // Although the output could use filtering. //flowparser->addFilter(FilterPercentile,7,0.5); //flowparser->addFilter(FilterPercentile,5,0.5); //flowparser->addFilter(FilterXPass,0.5); EventList *flow; QVector &EVL = session->eventlist[CPAP_FlowRate]; int size = EVL.size(); for (int ws = 0; ws < size; ++ws) { flow = EVL[ws]; if (flow->count() > 20) { flowparser->openFlow(session, flow); flowparser->calc(calcResp, calcTv, calcTi , calcTe, calcMv); flowparser->flagEvents(); } } if (trashfp) { delete flowparser; } } EventDataType calcAHI(Session *session, qint64 start, qint64 end) { bool rdi = p_profile->general->calculateRDI(); double hours, ahi, cnt; if (start < 0) { // much faster.. hours = session->hours(); cnt = session->count(CPAP_Obstructive) + session->count(CPAP_Hypopnea) + session->count(CPAP_ClearAirway) + session->count(CPAP_Apnea); if (rdi) { cnt += session->count(CPAP_RERA); } ahi = cnt / hours; } else { hours = double(end - start) / 3600000L; if (hours == 0) { return 0; } cnt = session->rangeCount(CPAP_Obstructive, start, end) + session->rangeCount(CPAP_Hypopnea, start, end) + session->rangeCount(CPAP_ClearAirway, start, end) + session->rangeCount(CPAP_Apnea, start, end); if (rdi) { cnt += session->rangeCount(CPAP_RERA, start, end); } ahi = cnt / hours; } return ahi; } int calcAHIGraph(Session *session) { bool calcrdi = session->machine()->loaderName() == "PRS1"; const qint64 window_step = 30000; // 30 second windows double window_size = p_profile->cpap->AHIWindow(); qint64 window_size_ms = window_size * 60000L; bool zeroreset = p_profile->cpap->AHIReset(); if (session->type() != MT_CPAP) { return 0; } bool hasahi = session->eventlist.contains(CPAP_AHI); bool hasrdi = session->eventlist.contains(CPAP_RDI); if (hasahi && hasrdi) { return 0; // abort if already there } if (!(!hasahi && !hasrdi)) { session->destroyEvent(CPAP_AHI); session->destroyEvent(CPAP_RDI); } if (!session->channelExists(CPAP_Obstructive) && !session->channelExists(CPAP_Hypopnea) && !session->channelExists(CPAP_Apnea) && !session->channelExists(CPAP_ClearAirway) && !session->channelExists(CPAP_RERA) ) { return 0; } qint64 first = session->first(), last = session->last(), f; EventList *AHI = new EventList(EVL_Event); AHI->setGain(0.02F); session->eventlist[CPAP_AHI].push_back(AHI); EventList *RDI = nullptr; if (calcrdi) { RDI = new EventList(EVL_Event); RDI->setGain(0.02F); session->eventlist[CPAP_RDI].push_back(RDI); } EventDataType ahi, rdi; qint64 ti = first, lastti = first; double avgahi = 0; double avgrdi = 0; int cnt = 0; double events; double hours = (window_size / 60.0F); if (zeroreset) { // I personally don't see the point of resetting each hour. do { // For each window, in 30 second increments for (qint64 t = ti; t < ti + window_size_ms; t += window_step) { if (t > last) { break; } events = session->rangeCount(CPAP_Obstructive, ti, t) + session->rangeCount(CPAP_Hypopnea, ti, t) + session->rangeCount(CPAP_ClearAirway, ti, t) + session->rangeCount(CPAP_Apnea, ti, t); ahi = events / hours; AHI->AddEvent(t, ahi * 50); avgahi += ahi; if (calcrdi) { events += session->rangeCount(CPAP_RERA, ti, t); rdi = events / hours; RDI->AddEvent(t, rdi * 50); avgrdi += rdi; } cnt++; } lastti = ti; ti += window_size_ms; } while (ti < last); } else { for (ti = first; ti < last; ti += window_step) { f = ti - window_size_ms; //hours=window_size; //double(ti-f)/3600000L; events = session->rangeCount(CPAP_Obstructive, f, ti) + session->rangeCount(CPAP_Hypopnea, f, ti) + session->rangeCount(CPAP_ClearAirway, f, ti) + session->rangeCount(CPAP_Apnea, f, ti); ahi = events / hours; avgahi += ahi; AHI->AddEvent(ti, ahi * 50); if (calcrdi) { events += session->rangeCount(CPAP_RERA, f, ti); rdi = events / hours; RDI->AddEvent(ti, rdi * 50); avgrdi += rdi; } cnt++; lastti = ti; ti += window_step; } } AHI->AddEvent(last, 0); if (calcrdi) { RDI->AddEvent(last, 0); } if (!cnt) { avgahi = 0; avgrdi = 0; } else { avgahi /= double(cnt); avgrdi /= double(cnt); } cnt++; session->setAvg(CPAP_AHI, avgahi); if (calcrdi) { session->setAvg(CPAP_RDI, avgrdi); } return cnt; } struct TimeValue { TimeValue() { time = 0; value = 0; } TimeValue(qint64 t, EventStoreType v) { time = t; value = v; } TimeValue(const TimeValue ©) { time = copy.time; value = copy.value; } qint64 time; EventStoreType value; }; struct zMaskProfile { public: zMaskProfile(MaskType type, QString name); ~zMaskProfile(); void reset() { pressureleaks.clear(); } void scanLeaks(Session *session); void scanPressure(Session *session); void updatePressureMin(); void updateProfile(Session *session); void load(Profile *profile); void save(); QMap pressuremax; QMap pressuremin; QMap pressurecount; QMap pressuretotal; QMap pressuremean; QMap pressurestddev; QVector Pressure; EventDataType calcLeak(EventStoreType pressure); protected: static const quint32 version = 0; void scanLeakList(EventList *leak); void scanPressureList(Session *session, ChannelID code); MaskType m_type; QString m_name; Profile *m_profile; QString m_filename; QMap > pressureleaks; EventDataType maxP, minP, maxL, minL, m_factor; }; bool operator<(const TimeValue &p1, const TimeValue &p2) { return p1.time < p2.time; } zMaskProfile::zMaskProfile(MaskType type, QString name) : m_type(type), m_name(name) { } zMaskProfile::~zMaskProfile() { save(); } void zMaskProfile::load(Profile *profile) { m_profile = profile; m_filename = m_profile->Get("{" + STR_GEN_DataFolder + "}/MaskProfile.mp"); QFile f(m_filename); if (!f.open(QFile::ReadOnly)) { return; } QDataStream in(&f); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); quint32 m, v; in >> m; in >> v; if (m != magic) { qDebug() << "Magic wrong in zMaskProfile::load"; } in >> pressureleaks; f.close(); } void zMaskProfile::save() { if (m_filename.isEmpty()) { return; } QFile f(m_filename); if (!f.open(QFile::WriteOnly)) { return; } QDataStream out(&f); out.setVersion(QDataStream::Qt_4_6); out.setByteOrder(QDataStream::LittleEndian); out << (quint32)magic; out << (quint32)version; out << pressureleaks; f.close(); } void zMaskProfile::scanPressureList(Session *session, ChannelID code) { QHash >::iterator it = session->eventlist.find(code); if (it == session->eventlist.end()) return; int prescnt = session->count(code); Pressure.reserve(Pressure.size() + prescnt); QVector &EVL = it.value(); int size = EVL.size(); for (int j = 0; j < size; ++j) { EventList * el = EVL[j]; qint64 start = el->first(); int count = el->count(); EventStoreType *dptr = el->rawData(); EventStoreType *eptr = dptr + count; quint32 *tptr = el->rawTime(); qint64 time; EventStoreType pressure; for (; dptr < eptr; dptr++) { time = start + *tptr++; pressure = *dptr; Pressure.push_back(TimeValue(time, pressure)); } } } void zMaskProfile::scanPressure(Session *session) { Pressure.clear(); scanPressureList(session, CPAP_Pressure); scanPressureList(session, CPAP_IPAP); qSort(Pressure); } void zMaskProfile::scanLeakList(EventList *el) { // Scans through Leak list, and builds a histogram of each leak value for each pressure. qint64 start = el->first(); int count = el->count(); EventStoreType *dptr = el->rawData(); EventStoreType *eptr = dptr + count; quint32 *tptr = el->rawTime(); //EventDataType gain=el->gain(); EventStoreType pressure, leak; //EventDataType fleak; QMap::iterator pmin; qint64 ti; bool found; int psize = Pressure.size(); if (psize == 0) return; TimeValue *tvstr = Pressure.data(); TimeValue *tvend = tvstr + (psize - 1); TimeValue *p1, *p2; // Scan through each leak item in event list for (; dptr < eptr; dptr++) { leak = *dptr; ti = start + *tptr++; found = false; pressure = Pressure[0].value; if (psize > 1) { // Scan through pressure list to find pressure at this particular leak time for (p1 = tvstr; p1 != tvend; ++p1) { p2 = p1+1; if ((p2->time > ti) && (p1->time <= ti)) { // leak within current pressure range pressure = p1->value; found = true; break; } else if (p2->time == ti) { // can't remember why a added this condition... pressure = p2->value; found = true; break; } // for (int i = 0; i < Pressure.size() - 1; i++) { // const TimeValue &p1 = Pressure[i]; // const TimeValue &p2 = Pressure[i + 1]; // if ((p2.time > ti) && (p1.time <= ti)) { // pressure = p1.value; // found = true; // break; // } else if (p2.time == ti) { // pressure = p2.value; // found = true; // break; // } } } else { // were talking CPAP here with no ramp.. found = true; } if (found) { // update the histogram of leak values for this pressure pressureleaks[pressure][leak]++; // pmin=pressuremin.find(pressure); // fleak=EventDataType(leak) * gain; // if (pmin==pressuremin.end()) { // pressuremin[pressure]=fleak; // pressurecount[pressure]=pressureleaks[pressure][leak]; // } else { // if (pmin.value() > fleak) { // pmin.value()=fleak; // pressurecount[pressure]=pressureleaks[pressure][leak]; // } // } } } } void zMaskProfile::scanLeaks(Session *session) { QHash >::iterator ELV = session->eventlist.find(CPAP_LeakTotal); if (ELV == session->eventlist.end()) return; QVector &elv = ELV.value(); int size=elv.size(); if (!size) return; QVector::iterator end = elv.end(); QVector::iterator it; for (it = elv.begin(); it != end; ++it) { scanLeakList(*it); } } void zMaskProfile::updatePressureMin() { QMap >::iterator it; EventStoreType pressure; //EventDataType perc=0.1; //EventDataType tmp,l1,l2; //int idx1, idx2, int lks; double SN; double percentile = 0.40; double p = 100.0 * percentile; double nth, nthi; int sum1, sum2, w1, w2, N, k; QMap >::iterator plend = pressureleaks.end(); QMap::iterator lmend; for (it = pressureleaks.begin(); it != plend; it++) { pressure = it.key(); QMap &leakmap = it.value(); lks = leakmap.size(); SN = 0; // First sum total counts of all leaks lmend = leakmap.end(); for (QMap::iterator lit = leakmap.begin(); lit != lmend; ++lit) { SN += lit.value(); } nth = double(SN) * percentile; // index of the position in the unweighted set would be nthi = floor(nth); sum1 = 0, sum2 = 0; w1 = 0, w2 = 0; EventDataType v1 = 0, v2; N = leakmap.size(); k = 0; bool found = false; double total = 0; // why do this effectively twice? and k = size for (QMap::iterator lit = leakmap.begin(); lit != lmend; ++lit, ++k) { total += lit.value(); } pressuretotal[pressure] = total; for (QMap::iterator lit = leakmap.begin(); lit != lmend; ++lit, ++k) { //for (k=0;k < N;k++) { v1 = lit.key(); w1 = lit.value(); sum1 += w1; if (sum1 > nthi) { pressuremin[pressure] = v1; pressurecount[pressure] = w1; found = true; break; } if (sum1 == nthi) { break; // boundary condition } } if (found) { continue; } if (k >= N) { pressuremin[pressure] = v1; pressurecount[pressure] = w1; continue; } v2 = (leakmap.begin() + (k + 1)).key(); w2 = (leakmap.begin() + (k + 1)).value(); sum2 = sum1 + w2; // value lies between v1 and v2 double px = 100.0 / double(SN); // Percentile represented by one full value // calculate percentile ranks double p1 = px * (double(sum1) - (double(w1) / 2.0)); double p2 = px * (double(sum2) - (double(w2) / 2.0)); // calculate linear interpolation double v = v1 + ((p - p1) / (p2 - p1)) * (v2 - v1); pressuremin[pressure] = v; pressurecount[pressure] = w1; } } EventDataType zMaskProfile::calcLeak(EventStoreType pressure) { if (maxP == minP) { return pressuremin[pressure]; } EventDataType leak = (pressure - minP) * (m_factor) + minL; return leak; } void zMaskProfile::updateProfile(Session *session) { scanPressure(session); scanLeaks(session); updatePressureMin(); if (pressuremin.size() <= 1) { maxP = minP = 0; maxL = minL = 0; m_factor = 0; return; } EventDataType p, l, tmp, mean, sum; minP = 250, maxP = 0; minL = 1000, maxL = 0; long cnt = 0, vcnt; int n; EventDataType maxcnt, maxval, lastval, lastcnt; QMap >::iterator plend = pressureleaks.end(); QMap >::iterator it = pressureleaks.begin(); QMap::iterator lit; QMap::iterator lvend; for (; it != plend; ++it) { p = it.key(); l = pressuremin[p]; QMap &leakval = it.value(); cnt = 0; vcnt = -1; n = leakval.size(); sum = 0; maxcnt = 0, maxval = 0, lastval = 0, lastcnt = 0; lvend = leakval.end(); for (lit = leakval.begin(); lit != lvend; ++lit) { cnt += lit.value(); if (lit.value() > maxcnt) { lastcnt = maxcnt; maxcnt = lit.value(); lastval = maxval; maxval = lit.key(); } sum += lit.key() * lit.value(); if (lit.key() == (EventStoreType)l) { vcnt = lit.value(); } } pressuremean[p] = mean = sum / EventDataType(cnt); if (lastval > 0) { maxval = qMax(maxval, lastval); //((maxval*maxcnt)+(lastval*lastcnt)) / (maxcnt+lastcnt); } pressuremax[p] = lastval; sum = 0; for (lit = leakval.begin(); lit != lvend; lit++) { tmp = lit.key() - mean; sum += tmp * tmp; } pressurestddev[p] = tmp = sqrt(sum / EventDataType(n)); if (vcnt >= 0) { tmp = 1.0 / EventDataType(cnt) * EventDataType(vcnt); } } QMap pressureval; QMap pressureval2; EventDataType max = 0, tmp2, tmp3; QMap::iterator ptit; QMap::iterator ptend = pressuretotal.end(); for (ptit = pressuretotal.begin(); ptit != ptend; ++ptit) { if (max < ptit.value()) { max = ptit.value(); } } for (ptit = pressuretotal.begin(); ptit != pressuretotal.end(); ptit++) { p = ptit.key(); tmp = pressurecount[p]; tmp2 = ptit.value(); tmp3 = (tmp / tmp2) * (tmp2 / max); if (tmp3 > 0.05) { tmp = pressuremean[p]; if (tmp > 0) { pressureval[p] = tmp; // / tmp2; if (p < minP) { minP = p; } if (p > maxP) { maxP = p; } if (tmp < minL) { minL = tmp; } if (tmp > maxL) { maxL = tmp; } } } } if ((maxP == minP) || (minL == maxL) || (minP == 250) || (minL == 1000)) { // crappy data set maxP = minP = 0; maxL = minL = 0; m_factor = 0; return; } m_factor = (maxL - minL) / (maxP - minP); // for (QMap::iterator it=pressuremin.begin();it!=pressuremin.end()-1;it++) { // p1=it.key(); // p2=(it+1).key(); // l1=it.value(); // l2=(it+1).value(); // if (l2 > l1) { // factor=(l2 - l1) / (p2 - p1); // sum+=factor; // cnt++; // } // } // m_factor=sum/double(cnt); // int i=0; // if (i==1) { // QFile f("/home/mark/leaks.csv"); // f.open(QFile::WriteOnly); // QTextStream out(&f); // EventDataType p,l,c; // QString fmt; // for (QMap::iterator it=pressuremin.begin();it!=pressuremin.end();it++) { // p=EventDataType(it.key()/10.0); // l=it.value(); // fmt=QString("%1,%2\n").arg(p,0,'f',1).arg(l); // out << fmt; // } // cruft // for (QMap >::iterator it=pressureleaks.begin();it!=pressureleaks.end();it++) { // QMap & leakval=it.value(); // for (QMap::iterator lit=leakval.begin();lit!=leakval.end();lit++) { // l=lit.key(); // c=lit.value(); // fmt=QString("%1,%2,%3\n").arg(p,0,'f',2).arg(l).arg(c); // out << fmt; // } // } // f.close(); // } } void flagLargeLeaks(Session *session) { // Already contains? if (session->eventlist.contains(CPAP_LargeLeak)) return; if (!session->eventlist.contains(CPAP_Leak)) return; EventDataType threshold = p_profile->cpap->leakRedline(); if (threshold <= 0) { return; } QVector & EVL = session->eventlist[CPAP_Leak]; int evlsize = EVL.size(); if (evlsize == 0) return; EventList * LL = nullptr; qint64 time = 0; EventDataType lastvalue; qint64 leaktime; for (int ec = 0; ec < evlsize; ++ec) { EventList &el = *EVL[ec]; int count = el.count(); if (!count) continue; leaktime = 0; EventDataType leakvalue = 0; lastvalue = -1; for (int i=0; i < count; ++i) { time = el.time(i); EventDataType value = el.data(i); if (value >= threshold) { if (lastvalue < threshold) { leaktime = time; leakvalue = value; } } else if (lastvalue > threshold) { if (!LL) { LL=session->AddEventList(CPAP_LargeLeak, EVL_Event); } int duration = (time - leaktime) / 1000L; LL->AddEvent(time, duration); } lastvalue = value; } } if (lastvalue > threshold) { if (!LL) { LL=session->AddEventList(CPAP_LargeLeak, EVL_Event); } int duration = (time - leaktime) / 1000L; LL->AddEvent(time, duration); } } QMutex zMaskmutex; zMaskProfile mmaskProfile(Mask_NasalPillows, "ResMed Swift FX"); bool mmaskFirst = true; int calcLeaks(Session *session) { if (session->type() != MT_CPAP) { return 0; } if (session->eventlist.contains(CPAP_Leak)) { return 0; } // abort if already there if (!session->eventlist.contains(CPAP_LeakTotal)) { return 0; } // can't calculate without this.. zMaskmutex.lock(); zMaskProfile *maskProfile = &mmaskProfile; if (mmaskFirst) { mmaskFirst = false; maskProfile->load(p_profile); } // if (!maskProfile) { // maskProfile=new zMaskProfile(Mask_NasalPillows,"ResMed Swift FX"); // } maskProfile->reset(); maskProfile->updateProfile(session); EventList *leak = session->AddEventList(CPAP_Leak, EVL_Event, 1); QVector & EVL = session->eventlist[CPAP_LeakTotal]; int evlsize = EVL.size(); TimeValue *p2, *pstr, *pend; // can this go out of the loop? int mppressize = maskProfile->Pressure.size(); pstr = maskProfile->Pressure.data(); pend = maskProfile->Pressure.data()+(mppressize-1); for (int i = 0; i < evlsize; ++i) { EventList &el = *EVL[i]; EventDataType gain = el.gain(), tmp, val; int count = el.count(); EventStoreType *dptr = el.rawData(); EventStoreType *eptr = dptr + count; quint32 *tptr = el.rawTime(); qint64 start = el.first(), ti; EventStoreType pressure; tptr = el.rawTime(); start = el.first(); bool found; for (; dptr < eptr; ++dptr) { tmp = EventDataType(*dptr) * gain; ti = start + *tptr++; found = false; pressure = pstr->value; for (TimeValue *p1 = pstr; p1 != pend; ++p1) { p2 = p1+1; if ((p2->time > ti) && (p1->time <= ti)) { pressure = p1->value; found = true; break; } else if (p2->time == ti) { pressure = p2->value; found = true; break; } } // for (int i = 0; i < mppressize - 1; ++i) { // const TimeValue &p1 = &maskProfile->Pressure[i]; // const TimeValue &p2 = maskProfile->Pressure[i + 1]; // if ((p2.time > ti) && (p1.time <= ti)) { // pressure = p1.value; // found = true; // break; // } else if (p2.time == ti) { // pressure = p2.value; // found = true; // break; // } // } if (found) { val = tmp - maskProfile->calcLeak(pressure); if (val < 0) { val = 0; } leak->AddEvent(ti, val); } } } zMaskmutex.unlock(); return leak->count(); } int calcPulseChange(Session *session) { if (session->eventlist.contains(OXI_PulseChange)) { return 0; } QHash >::iterator it = session->eventlist.find(OXI_Pulse); if (it == session->eventlist.end()) { return 0; } EventDataType val, val2, change, tmp; qint64 time, time2; qint64 window = p_profile->oxi->pulseChangeDuration(); window *= 1000; change = p_profile->oxi->pulseChangeBPM(); EventList *pc = new EventList(EVL_Event, 1, 0, 0, 0, 0, true); pc->setFirst(session->first(OXI_Pulse)); qint64 lastt; EventDataType lv = 0; int li = 0; int max; int size = it.value().size(); for (int e = 0; e < size; ++e) { EventList &el = *(it.value()[e]); int elcount=el.count(); for (int i = 0; i < elcount; ++i) { val = el.data(i); time = el.time(i); lastt = 0; lv = change; max = 0; for (int j = i + 1; j < elcount; ++j) { // scan ahead in the window time2 = el.time(j); if (time2 > time + window) { break; } val2 = el.data(j); tmp = qAbs(val2 - val); if (tmp > lv) { lastt = time2; if (tmp > max) { max = tmp; } //lv=tmp; li = j; } } if (lastt > 0) { qint64 len = (lastt - time) / 1000.0; pc->AddEvent(lastt, len, tmp); i = li; } } } if (pc->count() == 0) { delete pc; return 0; } session->eventlist[OXI_PulseChange].push_back(pc); session->setMin(OXI_PulseChange, pc->Min()); session->setMax(OXI_PulseChange, pc->Max()); session->setCount(OXI_PulseChange, pc->count()); session->setFirst(OXI_PulseChange, pc->first()); session->setLast(OXI_PulseChange, pc->last()); return pc->count(); } int calcSPO2Drop(Session *session) { if (session->eventlist.contains(OXI_SPO2Drop)) { return 0; } QHash >::iterator it = session->eventlist.find(OXI_SPO2); if (it == session->eventlist.end()) { return 0; } EventDataType val, val2, change, tmp; qint64 time, time2; qint64 window = p_profile->oxi->spO2DropDuration(); window *= 1000; change = p_profile->oxi->spO2DropPercentage(); EventList *pc = new EventList(EVL_Event, 1, 0, 0, 0, 0, true); qint64 lastt; EventDataType lv = 0; int li = 0; // Fix me.. Time scale varies. //const unsigned ringsize=30; //EventDataType ring[ringsize]={0}; //qint64 rtime[ringsize]={0}; //int rp=0; int min; int cnt = 0; tmp = 0; qint64 start = 0; // Calculate median baseline QList med; int evsize = it.value().size(); for (int e = 0; e < evsize; ++e) { EventList &el = *(it.value()[e]); int elcount = el.count(); for (int i = 0; i < elcount; i++) { val = el.data(i); time = el.time(i); if (val > 0) { med.push_back(val); } if (!start) { start = time; } if (time > start + 3600000) { break; } // just look at the first hour tmp += val; cnt++; } } EventDataType baseline = 0; if (med.size() > 0) { qSort(med); int midx = float(med.size()) * 0.90; if (midx > med.size() - 1) { midx = med.size() - 1; } if (midx < 0) { midx = 0; } baseline = med[midx]; } session->settings[OXI_SPO2Drop] = baseline; //EventDataType baseline=round(tmp/EventDataType(cnt)); EventDataType current; qDebug() << "Calculated baseline" << baseline; for (int e = 0; e < evsize; ++e) { EventList &el = *(it.value()[e]); int elcount = el.count(); for (int i = 0; i < elcount; ++i) { current = el.data(i); if (!current) { continue; } time = el.time(i); /*ring[rp]=val; rtime[rp]=time; rp++; rp=rp % ringsize; if (i time-300000) { // only look at recent entries.. tmp+=ring[j]; cnt++; } } if (!cnt) { unsigned j=abs((rp-1) % ringsize); tmp=(ring[j]+val)/2; } else tmp/=EventDataType(cnt); */ val = baseline; lastt = 0; lv = val; min = val; for (int j = i; j < elcount; ++j) { // scan ahead in the window time2 = el.time(j); //if (time2 > time+window) break; val2 = el.data(j); if (val2 > baseline - change) { break; } lastt = time2; li = j + 1; } if (lastt > 0) { qint64 len = (lastt - time); if (len >= window) { pc->AddEvent(lastt, len / 1000, val - min); i = li; } } } } if (pc->count() == 0) { delete pc; return 0; } session->eventlist[OXI_SPO2Drop].push_back(pc); session->setMin(OXI_SPO2Drop, pc->Min()); session->setMax(OXI_SPO2Drop, pc->Max()); session->setCount(OXI_SPO2Drop, pc->count()); session->setFirst(OXI_SPO2Drop, pc->first()); session->setLast(OXI_SPO2Drop, pc->last()); return pc->count(); } sleepyhead-0.9.8/sleepyhead/SleepLib/machine_loader.h0000644000175000017500000001167112412506713022151 0ustar sergiosergio/* SleepLib MachineLoader Base Class Header * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef MACHINE_LOADER_H #define MACHINE_LOADER_H #include #include #include #include "profiles.h" #include "machine.h" #include "zlib.h" class MachineLoader; enum DeviceStatus { NEUTRAL, IMPORTING, LIVE, DETECTING }; const QString genericPixmapPath = ":/icons/mask.png"; /*! \class MachineLoader \brief Base class to derive a new Machine importer from */ class MachineLoader: public QObject { Q_OBJECT friend class ImportThread; friend class Machine; public: MachineLoader(); virtual ~MachineLoader(); //! \brief Detect if the given path contains a valid folder structure virtual bool Detect(const QString & path) = 0; //! \brief Look up and return machine model information stored at path virtual MachineInfo PeekInfo(const QString & path) { Q_UNUSED(path); return MachineInfo(); } //! \brief Override this to scan path and detect new machine data virtual int Open(QString path) = 0; //! \brief Override to returns the Version number of this MachineLoader virtual int Version() = 0; static Machine * CreateMachine(MachineInfo info, MachineID id = 0); Machine * lookupMachine(QString serial); // !\\brief Used internally by loaders, override to return base MachineInfo record virtual MachineInfo newInfo() { return MachineInfo(); } //! \brief Override to returns the class name of this MachineLoader virtual const QString &loaderName() = 0; inline MachineType type() { return m_type; } void unsupported(Machine * m) { Q_ASSERT(m != nullptr); m->setUnsupported(true); emit machineUnsupported(m); } void queTask(ImportTask * task); void addSession(Session * sess) { sessionMutex.lock(); new_sessions[sess->session()] = sess; sessionMutex.unlock(); } //! \brief Process Task list using all available threads. void runTasks(bool threaded=true); int countTasks() { return m_tasklist.size(); } inline bool isAborted() { return m_abort; } void abort() { m_abort = true; } virtual void process() {} DeviceStatus status() { return m_status; } void setStatus(DeviceStatus status) { m_status = status; } QMutex sessionMutex; QMutex saveMutex; void removeMachine(Machine * m); virtual void initChannels() {} QPixmap & getPixmap(QString series) { QHash::iterator it = m_pixmaps.find(series); if (it != m_pixmaps.end()) { return it.value(); } return *genericCPAPPixmap; } QString getPixmapPath(QString series) { QHash::iterator it = m_pixmap_paths.find(series); if (it != m_pixmap_paths.end()) { return it.value(); } return genericPixmapPath; } signals: void updateProgress(int cnt, int total); void machineUnsupported(Machine *); protected: //! \brief Contains a list of Machine records known by this loader QList m_machlist; static QPixmap * genericCPAPPixmap; MachineType m_type; QString m_class; Profile *m_profile; int m_currenttask; int m_totaltasks; bool m_abort; DeviceStatus m_status; void finishAddingSessions(); QMap new_sessions; QHash m_pixmaps; QHash m_pixmap_paths; private: QList m_tasklist; }; class CPAPLoader:public MachineLoader { Q_OBJECT public: CPAPLoader() : MachineLoader() {} virtual ~CPAPLoader() {} virtual QList eventFlags(Day * day); virtual QString PresReliefLabel() { return QString(""); } virtual ChannelID PresReliefMode() { return NoChannel; } virtual ChannelID PresReliefLevel() { return NoChannel; } virtual ChannelID HumidifierConnected() { return NoChannel; } virtual ChannelID HumidifierLevel() { return CPAP_HumidSetting; } virtual ChannelID CPAPModeChannel() { return CPAP_Mode; } virtual void initChannels() {} }; struct ImportPath { ImportPath() { loader = nullptr; } ImportPath(const ImportPath & copy) { loader = copy.loader; path = copy.path; } ImportPath(QString path, MachineLoader * loader) : path(path), loader(loader) {} QString path; MachineLoader * loader; }; // Put in machine loader class as static?? void RegisterLoader(MachineLoader *loader); MachineLoader * lookupLoader(Machine * m); MachineLoader * lookupLoader(QString loaderName); void DestroyLoaders(); bool compressFile(QString inpath, QString outpath = ""); QList GetLoaders(MachineType mt = MT_UNKNOWN); #endif //MACHINE_LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/day.cpp0000644000175000017500000012177412412506713020335 0ustar sergiosergio/* SleepLib Day Class Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include "day.h" #include "profiles.h" Day::Day() { d_firstsession = true; d_summaries_open = false; d_events_open = false; d_invalidate = true; } Day::~Day() { for (QList::iterator s = sessions.begin(); s != sessions.end(); ++s) { delete(*s); } } void Day::updateCPAPCache() { d_count.clear(); d_sum.clear(); OpenSummary(); QList channels = getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN); int num_channels = channels.size(); for (int i=0; i< num_channels; ++i) { ChannelID code = channels.at(i); d_count[code] = count(code); d_sum[code] = count(code); d_machhours[MT_CPAP] = hours(MT_CPAP); } } Session * Day::firstSession(MachineType type) { for (int i=0; ienabled()) continue; if (sess->type() == type) { return sess; } } return nullptr; } bool Day::addMachine(Machine *mach) { invalidate(); if (!machines.contains(mach->type())) { machines[mach->type()] = mach; return true; } return false; } Machine *Day::machine(MachineType type) { QHash::iterator it = machines.find(type); if (it != machines.end()) return it.value(); return nullptr; } QList Day::getSessions(MachineType type, bool ignore_enabled) { QList::iterator it; QList::iterator sess_end = sessions.end(); QList newlist; for (it = sessions.begin(); it != sess_end; ++it) { if (!ignore_enabled && !(*it)->enabled()) continue; if ((*it)->type() == type) newlist.append((*it)); } return newlist; } Session *Day::find(SessionID sessid) { QList::iterator end=sessions.end(); for (QList::iterator s = sessions.begin(); s != end; ++s) { if ((*s)->session() == sessid) { return (*s); } } return nullptr; } void Day::addSession(Session *s) { invalidate(); Q_ASSERT(s!=nullptr); QHash::iterator mi = machines.find(s->type()); if (mi != machines.end()) { if (mi.value() != s->machine()) { qDebug() << "SleepyHead can't add session" << s->session() << "to this day record, as it already contains a different machine of the same MachineType"; return; } } else { machines[s->type()] = s->machine(); } sessions.push_back(s); } EventDataType Day::calcMiddle(ChannelID code) { int c = p_profile->general->prefCalcMiddle(); if (c == 0) { return percentile(code, 0.5); // Median } else if (c == 1 ) { return wavg(code); // Weighted Average } else { return avg(code); // Average } } EventDataType Day::calcMax(ChannelID code) { return p_profile->general->prefCalcMax() ? percentile(code, 0.995) : Max(code); } EventDataType Day::calcPercentile(ChannelID code) { double p = p_profile->general->prefCalcPercentile() / 100.0; return percentile(code, p); } QString Day::calcMiddleLabel(ChannelID code) { int c = p_profile->general->prefCalcMiddle(); if (c == 0) { return QObject::tr("%1 %2").arg(STR_TR_Median).arg(schema::channel[code].label()); } else if (c == 1) { return QObject::tr("%1 %2").arg(STR_TR_Average).arg(schema::channel[code].label()); } else { return QObject::tr("%1 %2").arg(STR_TR_Average).arg(schema::channel[code].label()); } } QString Day::calcMaxLabel(ChannelID code) { return QObject::tr("%1 %2").arg(p_profile->general->prefCalcMax() ? QObject::tr("Peak") : STR_TR_Max).arg(schema::channel[code].label()); } QString Day::calcPercentileLabel(ChannelID code) { return QObject::tr("%1% %2").arg(p_profile->general->prefCalcPercentile(),0, 'f',0).arg(schema::channel[code].label()); } EventDataType Day::countInsideSpan(ChannelID span, ChannelID code) { QList::iterator end = sessions.end(); int count = 0; for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { count += sess.countInsideSpan(span, code); } } return count; } EventDataType Day::lookupValue(ChannelID code, qint64 time, bool square) { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { if ((time > sess.first()) && (time < sess.last())) { if (sess.channelExists(code)) { return sess.SearchValue(code,time,square); } } } } return 0; } EventDataType Day::timeAboveThreshold(ChannelID code, EventDataType threshold) { EventDataType val = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled() && sess.m_availableChannels.contains(code)) { val += sess.timeAboveThreshold(code,threshold); } } return val; } EventDataType Day::timeBelowThreshold(ChannelID code, EventDataType threshold) { EventDataType val = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { val += sess.timeBelowThreshold(code,threshold); } } return val; } EventDataType Day::settings_sum(ChannelID code) { EventDataType val = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { QHash::iterator set = sess.settings.find(code); if (set != sess.settings.end()) { val += set.value().toDouble(); } } } return val; } EventDataType Day::settings_max(ChannelID code) { EventDataType min = -std::numeric_limits::max(); EventDataType max = min; EventDataType value; QList::iterator end = sessions.end(); for(QList::iterator it = sessions.begin(); it < end; ++it) { Session &sess = *(*it); if (sess.enabled()) { value = sess.settings.value(code, min).toFloat(); if (value > max) { max = value; } } } return max; } EventDataType Day::settings_min(ChannelID code) { EventDataType max = std::numeric_limits::max(); EventDataType min = max; EventDataType value; QList::iterator end=sessions.end(); for(QList::iterator it = sessions.begin(); it < end; ++it) { Session &sess = *(*it); if (sess.enabled()) { value = sess.settings.value(code, max).toFloat(); if (value < min) { min = value; } } } return min; } EventDataType Day::settings_avg(ChannelID code) { EventDataType val = 0; int cnt = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; it++) { Session &sess = *(*it); if (sess.enabled()) { QHash::iterator set = sess.settings.find(code); if (set != sess.settings.end()) { val += set.value().toDouble(); cnt++; } } } val = (cnt > 0) ? val /= EventDataType(cnt) : val; return val; } EventDataType Day::settings_wavg(ChannelID code) { double s0 = 0, s1 = 0, s2 = 0, tmp; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; it++) { Session &sess = *(*it); if (sess.enabled()) { QHash::iterator set = sess.settings.find(code); if (set != sess.settings.end()) { s0 = sess.hours(); tmp = set.value().toDouble(); s1 += tmp * s0; s2 += s0; } } } if (s2 == 0) { return 0; } tmp = (s1 / s2); return tmp; } EventDataType Day::percentile(ChannelID code, EventDataType percentile) { // Cache this calculation? // QHash >::iterator pi; // pi=perc_cache.find(code); // if (pi!=perc_cache.end()) { // QHash & hsh=pi.value(); // QHash::iterator hi=hsh.find( // if (hi!=pi.value().end()) { // return hi.value(); // } // } QHash wmap; // weight map QHash::iterator wmapit; qint64 SN = 0; EventDataType lastgain = 0, gain = 0; // First Calculate count of all events bool timeweight; QList::iterator sess_end = sessions.end(); for (QList::iterator sess_it = sessions.begin(); sess_it != sess_end; ++sess_it) { Session &sess = *(*sess_it); if (!sess.enabled()) { continue; } QHash >::iterator ei = sess.m_valuesummary.find(code); if (ei == sess.m_valuesummary.end()) { continue; } QHash >::iterator tei = sess.m_timesummary.find(code); timeweight = (tei != sess.m_timesummary.end()); gain = sess.m_gain[code]; // Here's assuming gains don't change accross a days sessions // Can't assume this in any multi day calculations.. if (lastgain > 0) { if (gain != lastgain) { qDebug() << "Gains differ across sessions: " << gain << lastgain; } } lastgain = gain; qint64 weight; //qint64 tval; if (timeweight) { QHash::iterator teival_end = tei.value().end(); wmap.reserve(wmap.size() + tei.value().size()); for (QHash::iterator it = tei.value().begin(); it != teival_end; ++it) { weight = it.value(); SN += weight; wmap[it.key()] += weight; } } else { QHash::iterator eival_end = ei.value().end(); wmap.reserve(wmap.size() + ei.value().size()); for (QHash::iterator it = ei.value().begin(); it != eival_end; ++it) { weight = it.value(); SN += weight; wmap[it.key()] += weight; } } } QVector valcnt; valcnt.resize(wmap.size()); // Build sorted list of value/counts QHash::iterator wmap_end = wmap.end(); int ii=0; for (QHash::iterator it = wmap.begin(); it != wmap_end; ++it) { valcnt[ii++]=ValueCount(EventDataType(it.key()) * gain, it.value(), 0); } // sort by weight, then value qSort(valcnt); //double SN=100.0/double(N); // 100% / overall sum double p = 100.0 * percentile; double nth = double(SN) * percentile; // index of the position in the unweighted set would be double nthi = floor(nth); qint64 sum1 = 0, sum2 = 0; qint64 w1, w2 = 0; double v1 = 0, v2; int N = valcnt.size(); int k = 0; for (k = 0; k < N; k++) { v1 = valcnt.at(k).value; w1 = valcnt.at(k).count; sum1 += w1; if (sum1 > nthi) { return v1; } if (sum1 == nthi) { break; // boundary condition } } if (k >= N) { return v1; } if (valcnt.size() == 1) { return valcnt[0].value; } v2 = valcnt[k + 1].value; w2 = valcnt[k + 1].count; sum2 = sum1 + w2; // value lies between v1 and v2 double px = 100.0 / double(SN); // Percentile represented by one full value // calculate percentile ranks double p1 = px * (double(sum1) - (double(w1) / 2.0)); double p2 = px * (double(sum2) - (double(w2) / 2.0)); // calculate linear interpolation double v = v1 + ((p - p1) / (p2 - p1)) * (v2 - v1); return v; // p1.....p.............p2 // 37 55 70 } EventDataType Day::p90(ChannelID code) { return percentile(code, 0.90F); } EventDataType Day::rangeCount(ChannelID code, qint64 st, qint64 et) { int cnt = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { cnt += sess.rangeCount(code, st, et); } } return cnt; } EventDataType Day::rangeSum(ChannelID code, qint64 st, qint64 et) { double val = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { val += sess.rangeSum(code, st, et); } } return val; } EventDataType Day::rangeAvg(ChannelID code, qint64 st, qint64 et) { double val = 0; int cnt = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { val += sess.rangeSum(code, st, et); cnt += sess.rangeCount(code, st,et); } } if (cnt == 0) { return 0; } val /= double(cnt); return val; } EventDataType Day::rangeWavg(ChannelID code, qint64 st, qint64 et) { double sum = 0; double cnt = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); QHash >::iterator EVEC = sess.eventlist.find(code); if (EVEC == sess.eventlist.end()) continue; QVector::iterator EL; QVector::iterator EVEC_end = EVEC.value().end(); for (EL = EVEC.value().begin(); EL != EVEC_end; ++EL) { EventList * el = *EL; if (el->count() < 1) continue; EventDataType lastdata = el->data(0); qint64 lasttime = el->time(0); if (lasttime < st) lasttime = st; for (unsigned i=1; icount(); i++) { double data = el->data(i); qint64 time = el->time(i); if (time < st) { lasttime = st; lastdata = data; continue; } if (time > et) { time = et; } double duration = double(time - lasttime) / 1000.0; sum += data * duration; cnt += duration; if (time >= et) break; lasttime = time; lastdata = data; } } } if (cnt < 0.000001) return 0; return sum / cnt; } // Boring non weighted percentile EventDataType Day::rangePercentile(ChannelID code, float p, qint64 st, qint64 et) { int count = rangeCount(code, st,et); QVector list; list.resize(count); int idx = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); QHash >::iterator EVEC = sess.eventlist.find(code); if (EVEC == sess.eventlist.end()) continue; QVector::iterator EL; QVector::iterator EVEC_end = EVEC.value().end(); for (EL = EVEC.value().begin(); EL != EVEC_end; ++EL) { EventList * el = *EL; for (unsigned i=0; icount(); i++) { qint64 time = el->time(i); if ((time < st) || (time > et)) continue; list[idx++] = el->data(i); } } } // TODO: use nth_element instead.. qSort(list); float b = float(idx) * p; int a = floor(b); int c = ceil(b); if ((a == c) || (c >= idx)) { return list[a]; } EventDataType v1 = list[a]; EventDataType v2 = list[c]; EventDataType diff = v2 - v1; // the whole == C-A double ba = b - float(a); // A....B...........C == B-A double val = v1 + diff * ba; return val; } EventDataType Day::avg(ChannelID code) { double val = 0; // Cache this? int cnt = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled()) { val += sess.sum(code); cnt += sess.count(code); } } if (cnt == 0) { return 0; } val /= double(cnt); return val; } EventDataType Day::sum(ChannelID code) { // Cache this? EventDataType val = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled() && sess.m_sum.contains(code)) { val += sess.sum(code); } } return val; } EventDataType Day::wavg(ChannelID code) { double s0 = 0, s1 = 0, s2 = 0; qint64 d; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); if (sess.enabled() && sess.m_wavg.contains(code)) { d = sess.length(); //.last(code)-sess.first(code); s0 = double(d) / 3600000.0; if (s0 > 0) { s1 += sess.wavg(code) * s0; s2 += s0; } } } if (s2 == 0) { return 0; } return (s1 / s2); } // Total session time in milliseconds qint64 Day::total_time() { qint64 d_totaltime = 0; QMultiMap range; //range.reserve(size()*2); // Remember sessions may overlap.. qint64 first, last; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); int slicesize = sess.m_slices.size(); if (sess.enabled() && (sess.type() != MT_JOURNAL)) { first = sess.first(); last = sess.last(); if (slicesize == 0) { // This algorithm relies on non zero length, and correctly ordered sessions if (last > first) { range.insert(first, 0); range.insert(last, 1); d_totaltime += sess.length(); } } else { for (int i=0; i::iterator rend = range.end(); for (QMultiMap::iterator rit = range.begin(); rit != rend; ++rit) { b = rit.value(); if (!b) { if (!ti) { ti = rit.key(); } nest++; } else { if (--nest <= 0) { total += rit.key() - ti; ti = 0; } } } if (total != d_totaltime) { // They can overlap.. tough. // qDebug() << "Sessions Times overlaps!" << total << d_totaltime; } return total; //d_totaltime; } // Total session time in milliseconds, only considering machinetype qint64 Day::total_time(MachineType type) { qint64 d_totaltime = 0; QMultiMap range; //range.reserve(size()*2); // Remember sessions may overlap.. qint64 first, last; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session &sess = *(*it); int slicesize = sess.m_slices.size(); if ((sess.type() == type) && sess.enabled()) { first = sess.first(); last = sess.last(); // This algorithm relies on non zero length, and correctly ordered sessions if (slicesize == 0) { if (last > first) { range.insert(first, 0); range.insert(last, 1); d_totaltime += sess.length(); } } else { for (int i=0; i::iterator rend = range.end(); for (QMultiMap::iterator rit = range.begin(); rit != rend; ++rit) { b = rit.value(); if (!b) { if (!ti) { ti = rit.key(); } nest++; } else { if (--nest <= 0) { total += rit.key() - ti; ti = 0; } } } if (total != d_totaltime) { // They can overlap.. tough. // qDebug() << "Sessions Times overlaps!" << total << d_totaltime; } return total; //d_totaltime; } bool Day::hasEnabledSessions() { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { if ((*it)->enabled()) { return true; } } return false; } bool Day::hasEnabledSessions(MachineType type) { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { if (((*it)->type() == type) && (*it)->enabled()) { return true; } } return false; } /*EventDataType Day::percentile(ChannelID code,double percent) { double val=0; int cnt=0; for (QList::iterator s=sessions.begin();s!=sessions.end();s++) { Session & sess=*(*s); if (sess.eventlist.find(code)!=sess.eventlist.end()) { val+=sess.percentile(code,percent); cnt++; } } if (cnt==0) return 0; return EventDataType(val/cnt); }*/ qint64 Day::first(ChannelID code) { qint64 date = 0; qint64 tmp; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess=*(*it); if (sess.enabled()) { tmp = sess.first(code); if (!tmp) { continue; } if (!date) { date = tmp; } else { if (tmp < date) { date = tmp; } } } } return date; } qint64 Day::last(ChannelID code) { qint64 date = 0; qint64 tmp; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; it++) { Session & sess = *(*it); if (sess.enabled()) { tmp = sess.last(code); if (!tmp) { continue; } if (!date) { date = tmp; } else { if (tmp > date) { date = tmp; } } } } return date; } EventDataType Day::Min(ChannelID code) { EventDataType min = 0; EventDataType tmp; bool first = true; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; it++) { Session & sess = *(*it); if (sess.enabled() && sess.m_min.contains(code)) { tmp = sess.Min(code); if (first) { min = tmp; first = false; } else { if (tmp < min) { min = tmp; } } } } return min; } EventDataType Day::physMin(ChannelID code) { EventDataType min = 0; EventDataType tmp; bool first = true; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled() && sess.m_min.contains(code)) { tmp = sess.physMin(code); if (first) { min = tmp; first = false; } else { if (tmp < min) { min = tmp; } } } } return min; } bool Day::hasData(ChannelID code, SummaryType type) { bool has = false; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.type() == MT_JOURNAL) continue; if (sess.enabled()) { switch (type) { // case ST_90P: // has=sess->m_90p.contains(code); // break; case ST_PERC: has = sess.m_valuesummary.contains(code); break; case ST_MIN: has = sess.m_min.contains(code); break; case ST_MAX: has = sess.m_max.contains(code); break; case ST_CNT: has = sess.m_cnt.contains(code); break; case ST_AVG: has = sess.m_avg.contains(code); break; case ST_WAVG: has = sess.m_wavg.contains(code); break; case ST_CPH: has = sess.m_cph.contains(code); break; case ST_SPH: has = sess.m_sph.contains(code); break; case ST_FIRST: has = sess.m_firstchan.contains(code); break; case ST_LAST: has = sess.m_lastchan.contains(code); break; case ST_SUM: has = sess.m_sum.contains(code); break; default: break; } if (has) { break; } } } return has; } EventDataType Day::Max(ChannelID code) { EventDataType max = 0; EventDataType tmp; bool first = true; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled() && sess.m_max.contains(code)) { tmp = sess.Max(code); if (first) { max = tmp; first = false; } else { if (tmp > max) { max = tmp; } } } } return max; } EventDataType Day::physMax(ChannelID code) { EventDataType max = 0; EventDataType tmp; bool first = true; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled() && sess.m_max.contains(code)) { tmp = sess.physMax(code); if (first) { max = tmp; first = false; } else { if (tmp > max) { max = tmp; } } } } return max; } EventDataType Day::cph(ChannelID code) { double sum = 0; //EventDataType h=0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled() && sess.m_cnt.contains(code)) { sum += sess.count(code); } } sum /= hours(); return sum; } EventDataType Day::sph(ChannelID code) { EventDataType sum = 0; EventDataType h = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled() && sess.m_sum.contains(code)) { sum += sess.sum(code) / 3600.0; //*sessions[i]->hours(); //h+=sessions[i]->hours(); } } h = hours(); sum = (100.0 / h) * sum; return sum; } EventDataType Day::count(ChannelID code) { EventDataType total = 0; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled() && sess.m_cnt.contains(code)) { total += sess.count(code); } } return total; } bool Day::summaryOnly() { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.summaryOnly()) return true; } return false; } bool Day::settingExists(ChannelID id) { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled()) { QHash::iterator set = sess.settings.find(id); if (set != sess.settings.end()) { return true; } } } return false; } bool Day::eventsLoaded() { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.eventsLoaded()) { return true; } } return false; } bool Day::channelExists(ChannelID id) { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled() && sess.eventlist.contains(id)) { return true; } } return false; } bool Day::hasEvents() { int s=sessions.size(); for (int i=0; ieventlist.size() > 0) return true; } return false; } bool Day::channelHasData(ChannelID id) { QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.enabled()) { if (sess.m_cnt.contains(id)) { return true; } if (sess.eventlist.contains(id)) { return true; } if (sess.m_valuesummary.contains(id)) { return true; } } } return false; } void Day::OpenEvents() { // if (d_events_open) // return; Q_FOREACH(Session * session, sessions) { if (session->type() != MT_JOURNAL) session->OpenEvents(); } d_events_open = true; } void Day::OpenSummary() { if (d_summaries_open) return; Q_FOREACH(Session * session, sessions) { session->LoadSummary(); } d_summaries_open = true; } void Day::CloseEvents() { Q_FOREACH(Session * session, sessions) { session->TrashEvents(); } d_events_open = false; } QList Day::getSortedMachineChannels(MachineType type, quint32 chantype) { QList available; QHash::iterator mi_end = machines.end(); for (QHash::iterator mi = machines.begin(); mi != mi_end; mi++) { if (mi.key() != type) continue; available.append(mi.value()->availableChannels(chantype)); } QMultiMap order; for (int i=0; i < available.size(); ++i) { ChannelID code = available.at(i); order.insert(schema::channel[code].order(), code); } QMultiMap::iterator it; QList channels; for (it = order.begin(); it != order.end(); ++it) { ChannelID code = it.value(); channels.append(code); } return channels; } QList Day::getSortedMachineChannels(quint32 chantype) { QList available; QHash::iterator mi_end = machines.end(); for (QHash::iterator mi = machines.begin(); mi != mi_end; mi++) { if (mi.key() == MT_JOURNAL) continue; available.append(mi.value()->availableChannels(chantype)); } QMultiMap order; for (int i=0; i < available.size(); ++i) { ChannelID code = available.at(i); order.insert(schema::channel[code].order(), code); } QMultiMap::iterator it; QList channels; for (it = order.begin(); it != order.end(); ++it) { ChannelID code = it.value(); channels.append(code); } return channels; } qint64 Day::first(MachineType type) { qint64 date = 0; qint64 tmp; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if ((sess.type() == type) && sess.enabled()) { tmp = sess.first(); if (!tmp) { continue; } if (!date) { date = tmp; } else { if (tmp < date) { date = tmp; } } } } return date; } qint64 Day::first() { qint64 date = 0; qint64 tmp; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.type() == MT_JOURNAL) continue; if (sess.enabled()) { tmp = sess.first(); if (!tmp) { continue; } if (!date) { date = tmp; } else { if (tmp < date) { date = tmp; } } } } return date; } //! \brief Returns the last session time of this day qint64 Day::last() { qint64 date = 0; qint64 tmp; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if (sess.type() == MT_JOURNAL) continue; if (sess.enabled()) { tmp = sess.last(); if (!tmp) { continue; } if (!date) { date = tmp; } else { if (tmp > date) { date = tmp; } } } } return date; } qint64 Day::last(MachineType type) { qint64 date = 0; qint64 tmp; QList::iterator end = sessions.end(); for (QList::iterator it = sessions.begin(); it != end; ++it) { Session & sess = *(*it); if ((sess.type() == type) && sess.enabled()) { tmp = sess.last(); if (!tmp) { continue; } if (!date) { date = tmp; } else { if (tmp > date) { date = tmp; } } } } return date; } bool Day::removeSession(Session *sess) { MachineType mt = sess->type(); bool b = sessions.removeAll(sess) > 0; if (!searchMachine(mt)) { machines.remove(mt); } return b; } bool Day::searchMachine(MachineType mt) { for (int i=0; i < sessions.size(); ++i) { if (sessions.at(i)->type() == mt) return true; } return false; } QString Day::getCPAPMode() { Machine * mach = machine(MT_CPAP); if (!mach) return STR_MessageBox_Error; CPAPLoader * loader = qobject_cast(mach->loader()); ChannelID modechan = loader->CPAPModeChannel(); schema::Channel & chan = schema::channel[modechan]; int mode = (CPAPMode)(int)qRound(settings_wavg(modechan)); return chan.option(mode); // if (mode == MODE_CPAP) { // return QObject::tr("Fixed"); // } else if (mode == MODE_APAP) { // return QObject::tr("Auto"); // } else if (mode == MODE_BILEVEL_FIXED ) { // return QObject::tr("Fixed Bi-Level"); // } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { // return QObject::tr("Auto Bi-Level (Fixed PS)"); // } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { // return QObject::tr("Auto Bi-Level (Variable PS)"); // } else if (mode == MODE_ASV) { // return QObject::tr("ASV Fixed EPAP"); // } else if (mode == MODE_ASV_VARIABLE_EPAP) { // return QObject::tr("ASV Variable EPAP"); // } // return STR_TR_Unknown; } QString Day::getPressureRelief() { Machine * mach = machine(MT_CPAP); if (!mach) return STR_MessageBox_Error; CPAPLoader * loader = qobject_cast(mach->loader()); if (!loader) return STR_MessageBox_Error; QString pr_str; ChannelID pr_level_chan = loader->PresReliefLevel(); ChannelID pr_mode_chan = loader->PresReliefMode(); if ((pr_mode_chan != NoChannel) && settingExists(pr_mode_chan)) { int pr_mode = qRound(settings_wavg(pr_mode_chan)); pr_str = QObject::tr("%1%2").arg(loader->PresReliefLabel()).arg(schema::channel[pr_mode_chan].option(pr_mode)); int pr_level = -1; if (pr_level_chan != NoChannel && settingExists(pr_level_chan)) { pr_level = qRound(settings_wavg(pr_level_chan)); } if (pr_level >= 0) pr_str += QString(" %1").arg(schema::channel[pr_level_chan].option(pr_level)); } else pr_str = STR_TR_None; return pr_str; } QString Day::getPressureSettings() { Q_ASSERT(machine(MT_CPAP) != nullptr); CPAPMode mode = (CPAPMode)(int)settings_max(CPAP_Mode); QString units = schema::channel[CPAP_Pressure].units(); if (mode == MODE_CPAP) { return QObject::tr("Fixed %1 (%2)").arg(settings_min(CPAP_Pressure)).arg(units); } else if (mode == MODE_APAP) { return QObject::tr("Min %1 Max %2 (%3)").arg(settings_min(CPAP_PressureMin)).arg(settings_max(CPAP_PressureMax)).arg(units); } else if (mode == MODE_BILEVEL_FIXED ) { return QObject::tr("EPAP %1 IPAP %2 (%3)").arg(settings_min(CPAP_EPAP),0,'f',1).arg(settings_max(CPAP_IPAP),0,'f',1).arg(units); } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) { return QObject::tr("PS %1 over %2-%3 (%4)").arg(settings_max(CPAP_PS),0,'f',1).arg(settings_min(CPAP_EPAPLo),0,'f',1).arg(settings_max(CPAP_IPAPHi),0,'f',1).arg(units); } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { return QObject::tr("Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)").arg(settings_min(CPAP_EPAPLo),0,'f',1).arg(settings_max(CPAP_IPAPHi),0,'f',1).arg(settings_min(CPAP_PSMin),0,'f',1).arg(settings_max(CPAP_PSMax),0,'f',1).arg(units); } else if (mode == MODE_ASV) { return QObject::tr("EPAP %1 PS %2-%3 (%6)").arg(settings_min(CPAP_EPAP),0,'f',1).arg(settings_min(CPAP_PSMin),0,'f',1).arg(settings_max(CPAP_PSMax),0,'f',1).arg(units); } else if (mode == MODE_ASV_VARIABLE_EPAP) { return QObject::tr("Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)"). arg(settings_min(CPAP_EPAPLo),0,'f',1). arg(settings_max(CPAP_IPAPHi),0,'f',1). arg(settings_max(CPAP_PSMin),0,'f',1). arg(settings_min(CPAP_PSMax),0,'f',1). arg(units); } return STR_TR_Unknown; } EventDataType Day::calc(ChannelID code, ChannelCalcType type) { EventDataType value; switch(type) { case Calc_Min: value = Min(code); break; case Calc_Middle: value = calcMiddle(code); break; case Calc_Perc: value = calcPercentile(code); break; case Calc_Max: value = calcMax(code); break; case Calc_UpperThresh: value = schema::channel[code].upperThreshold(); break; case Calc_LowerThresh: value = schema::channel[code].lowerThreshold(); break; case Calc_Zero: default: value = 0; break; }; return value; } sleepyhead-0.9.8/sleepyhead/SleepLib/progressdialog.cpp0000644000175000017500000000174012412506713022572 0ustar sergiosergio/* SleepLib Progress Dialog Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "progressdialog.h" ProgressDialog::ProgressDialog(QWidget * parent): QDialog(parent, Qt::SplashScreen) { waitmsg = new QLabel(QObject::tr("PLease Wait...")); hlayout = new QHBoxLayout; imglabel = new QLabel(this); vlayout = new QVBoxLayout; progress = new QProgressBar(this); this->setLayout(vlayout); vlayout->addLayout(hlayout); hlayout->addWidget(imglabel); hlayout->addWidget(waitmsg,1,Qt::AlignCenter); vlayout->addWidget(progress,1); progress->setMaximum(100); } ProgressDialog::~ProgressDialog() { } void ProgressDialog::doUpdateProgress(int cnt, int total) { progress->setMaximum(total); progress->setValue(cnt); } sleepyhead-0.9.8/sleepyhead/SleepLib/common.cpp0000644000175000017500000005222512412506713021042 0ustar sergiosergio/* SleepLib Common Functions * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include "profiles.h" // Used by internal settings const QString getDeveloperName() { return STR_DeveloperName; } const QString getAppName() { QString name = STR_AppName; #ifdef TEST_BUILD name += STR_TestBuild; #endif return name; } const QString getDefaultAppRoot() { QString approot = STR_AppRoot; #ifdef TEST_BUILD approot += STR_TestBuild; #endif return approot; } qint64 timezoneOffset() { static bool ok = false; static qint64 _TZ_offset = 0; if (ok) { return _TZ_offset; } QDateTime d1 = QDateTime::currentDateTime(); QDateTime d2 = d1; d1.setTimeSpec(Qt::UTC); _TZ_offset = d2.secsTo(d1); _TZ_offset *= 1000L; return _TZ_offset; } QString weightString(float kg, UnitSystem us) { if (us == US_Undefined) { us = p_profile->general->unitSystem(); } if (us == US_Metric) { return QString("%1kg").arg(kg, 0, 'f', 2); } else if (us == US_Archiac) { int oz = (kg * 1000.0) / (float)ounce_convert; int lb = oz / 16.0; oz = oz % 16; return QString("%1lb %2oz").arg(lb, 0, 10).arg(oz); } return ("Bad UnitSystem"); } bool operator <(const ValueCount &a, const ValueCount &b) { return a.value < b.value; } bool removeDir(const QString &path) { bool result = true; QDir dir(path); if (dir.exists(path)) { Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) { if (info.isDir()) { // Recurse to remove this child directory result = removeDir(info.absoluteFilePath()); } else { // File result = QFile::remove(info.absoluteFilePath()); } if (!result) { return result; } } result = dir.rmdir(path); } return result; } void copyPath(QString src, QString dst) { QDir dir(src); if (!dir.exists()) return; // Recursively handle directories foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { QString dst_path = dst + QDir::separator() + d; dir.mkpath(dst_path); copyPath(src + QDir::separator() + d, dst_path); } // Files foreach (QString f, dir.entryList(QDir::Files)) { QString srcFile = src + QDir::separator() + f; QString destFile = dst + QDir::separator() + f; if (!QFile::exists(destFile)) { QFile::copy(srcFile, destFile); } } } QString STR_UNIT_CM; QString STR_UNIT_INCH; QString STR_UNIT_FOOT; QString STR_UNIT_POUND; QString STR_UNIT_OUNCE; QString STR_UNIT_KG; QString STR_UNIT_CMH2O; QString STR_UNIT_Hours; QString STR_UNIT_Minutes; QString STR_UNIT_Seconds; QString STR_UNIT_BPM; // Beats per Minute QString STR_UNIT_LPM; // Litres per Minute QString STR_UNIT_ml; // MilliLitres QString STR_UNIT_Litres; QString STR_UNIT_Hz; QString STR_UNIT_EventsPerHour; QString STR_UNIT_BreathsPerMinute; QString STR_UNIT_Percentage; QString STR_UNIT_Unknown; QString STR_UNIT_Ratio; QString STR_UNIT_Severity; QString STR_UNIT_Degrees; QString STR_MessageBox_Question; QString STR_MessageBox_Error; QString STR_MessageBox_Warning; QString STR_MessageBox_Information; QString STR_MessageBox_Busy; QString STR_MessageBox_PleaseNote; QString STR_MessageBox_Yes; QString STR_MessageBox_No; QString STR_MessageBox_Cancel; QString STR_MessageBox_Destroy; QString STR_MessageBox_Save; QString STR_Empty_NoData; QString STR_Empty_Brick; QString STR_Empty_NoGraphs; QString STR_Empty_SummaryOnly; QString STR_Empty_NoSessions; QString STR_TR_BMI; // Short form of Body Mass Index QString STR_TR_Weight; QString STR_TR_Zombie; QString STR_TR_PulseRate; // Pulse / Heart rate QString STR_TR_SpO2; QString STR_TR_Plethy; // Plethysomogram QString STR_TR_Pressure; QString STR_TR_Daily; QString STR_TR_Overview; QString STR_TR_Oximetry; QString STR_TR_Oximeter; QString STR_TR_EventFlags; QString STR_TR_Inclination; QString STR_TR_Orientation; // Machine type names. QString STR_TR_CPAP; // Constant Positive Airway Pressure QString STR_TR_BIPAP; // Bi-Level Positive Airway Pressure QString STR_TR_BiLevel; // Another name for BiPAP QString STR_TR_EPAP; // Expiratory Positive Airway Pressure QString STR_TR_EPAPLo; // Expiratory Positive Airway Pressure, Low QString STR_TR_EPAPHi; // Expiratory Positive Airway Pressure, High QString STR_TR_IPAP; // Inspiratory Positive Airway Pressure QString STR_TR_IPAPLo; // Inspiratory Positive Airway Pressure, Low QString STR_TR_IPAPHi; // Inspiratory Positive Airway Pressure, High QString STR_TR_APAP; // Automatic Positive Airway Pressure QString STR_TR_ASV; // Assisted Servo Ventilator QString STR_TR_STASV; QString STR_TR_Humidifier; QString STR_TR_H; // Short form of Hypopnea QString STR_TR_OA; // Short form of Obstructive Apnea QString STR_TR_UA; // Short form of Unspecified Apnea QString STR_TR_CA; // Short form of Clear Airway Apnea QString STR_TR_FL; // Short form of Flow Limitation QString STR_TR_SA; // Short form of SensAwake QString STR_TR_LE; // Short form of Leak Event QString STR_TR_EP; // Short form of Expiratory Puff QString STR_TR_VS; // Short form of Vibratory Snore QString STR_TR_VS2; // Short form of Secondary Vibratory Snore (Some Philips Respironics Machines have two sources) QString STR_TR_RERA; // Acronym for Respiratory Effort Related Arousal QString STR_TR_PP; // Short form for Pressure Pulse QString STR_TR_P; // Short form for Pressure Event QString STR_TR_RE; // Short form of Respiratory Effort Related Arousal QString STR_TR_NR; // Short form of Non Responding event? (forgot sorry) QString STR_TR_NRI; // Sorry I Forgot.. it's a flag on Intellipap machines QString STR_TR_O2; // SpO2 Desaturation QString STR_TR_PC; // Short form for Pulse Change QString STR_TR_UF1; // Short form for User Flag 1 QString STR_TR_UF2; // Short form for User Flag 2 QString STR_TR_UF3; // Short form for User Flag 3 QString STR_TR_PS; // Short form of Pressure Support QString STR_TR_AHI; // Short form of Apnea Hypopnea Index QString STR_TR_RDI; // Short form of Respiratory Distress Index QString STR_TR_AI; // Short form of Apnea Index QString STR_TR_HI; // Short form of Hypopnea Index QString STR_TR_UAI; // Short form of Uncatagorized Apnea Index QString STR_TR_CAI; // Short form of Clear Airway Index QString STR_TR_FLI; // Short form of Flow Limitation Index //QString STR_TR_SAI; // Short form of SensAwake Index QString STR_TR_REI; // Short form of RERA Index QString STR_TR_EPI; // Short form of Expiratory Puff Index QString STR_TR_CSR; // Short form of Cheyne Stokes Respiration QString STR_TR_PB; // Short form of Periodic Breathing // Graph Titles QString STR_TR_IE; // Inspiratory Expiratory Ratio QString STR_TR_InspTime; // Inspiratory Time QString STR_TR_ExpTime; // Expiratory Time QString STR_TR_RespEvent; // Respiratory Event QString STR_TR_FlowLimitation; QString STR_TR_FlowLimit; //QString STR_TR_FlowLimitation; QString STR_TR_SensAwake; QString STR_TR_PatTrigBreath; // Patient Triggered Breath QString STR_TR_TgtMinVent; // Target Minute Ventilation QString STR_TR_TargetVent; // Target Ventilation QString STR_TR_MinuteVent; // Minute Ventilation QString STR_TR_TidalVolume; QString STR_TR_RespRate; // Respiratory Rate QString STR_TR_Snore; QString STR_TR_Leak; QString STR_TR_Leaks; QString STR_TR_LargeLeak; QString STR_TR_LL; QString STR_TR_TotalLeaks; QString STR_TR_UnintentionalLeaks; QString STR_TR_MaskPressure; QString STR_TR_FlowRate; QString STR_TR_SleepStage; QString STR_TR_Usage; QString STR_TR_Sessions; QString STR_TR_PrRelief; // Pressure Relief QString STR_TR_Bookmarks; QString STR_TR_SleepyHead; QString STR_TR_Mode; QString STR_TR_Model; QString STR_TR_Brand; QString STR_TR_Serial; QString STR_TR_Series; QString STR_TR_Machine; QString STR_TR_Channel; QString STR_TR_Settings; QString STR_TR_Name; QString STR_TR_DOB; // Date of Birth QString STR_TR_Phone; QString STR_TR_Address; QString STR_TR_Email; QString STR_TR_PatientID; QString STR_TR_Date; QString STR_TR_BedTime; QString STR_TR_WakeUp; QString STR_TR_MaskTime; QString STR_TR_Unknown; QString STR_TR_None; QString STR_TR_Ready; QString STR_TR_First; QString STR_TR_Last; QString STR_TR_Start; QString STR_TR_End; QString STR_TR_On; QString STR_TR_Off; QString STR_TR_Yes; QString STR_TR_No; QString STR_TR_Min; // Minimum QString STR_TR_Max; // Maximum QString STR_TR_Med; // Median QString STR_TR_Average; QString STR_TR_Median; QString STR_TR_Avg; // Short form of Average QString STR_TR_WAvg; // Short form of Weighted Average void initializeStrings() { STR_UNIT_CM = QObject::tr("cm"); STR_UNIT_INCH = QObject::tr("\""); STR_UNIT_FOOT = QObject::tr("ft"); STR_UNIT_POUND = QObject::tr("lb"); STR_UNIT_OUNCE = QObject::tr("oz"); STR_UNIT_KG = QObject::tr("Kg"); STR_UNIT_CMH2O = QObject::tr("cmH2O"); STR_UNIT_Hours = QObject::tr("Hours"); STR_UNIT_Minutes = QObject::tr("Minutes"); STR_UNIT_Seconds = QObject::tr("Seconds"); STR_UNIT_EventsPerHour = QObject::tr("Events/hr"); // Events per hour STR_UNIT_Percentage = QObject::tr("%"); STR_UNIT_Hz = QObject::tr("Hz"); // Hertz STR_UNIT_BPM = QObject::tr("bpm"); // Beats per Minute STR_UNIT_LPM = QObject::tr("L/min"); // Litres per Minute STR_UNIT_Litres = QObject::tr("Litres"); STR_UNIT_ml = QObject::tr("ml"); // millilitres STR_UNIT_BreathsPerMinute = QObject::tr("Breaths/min"); // Breaths per minute STR_UNIT_Unknown = QObject::tr("?"); STR_UNIT_Ratio = QObject::tr("ratio"); STR_UNIT_Severity = QObject::tr("Severity (0-1)"); STR_UNIT_Degrees = QObject::tr("Degrees"); STR_MessageBox_Question = QObject::tr("Question"); STR_MessageBox_Error = QObject::tr("Error"); STR_MessageBox_Warning = QObject::tr("Warning"); STR_MessageBox_Information = QObject::tr("Information"); STR_MessageBox_Busy = QObject::tr("Busy"); STR_MessageBox_PleaseNote = QObject::tr("Please Note"); STR_Empty_NoData = QObject::tr("No Data Available"); STR_Empty_Brick = QObject::tr("Compliance Only :("); STR_Empty_NoGraphs = QObject::tr("Graphs Switched Off"); STR_Empty_SummaryOnly = QObject::tr("Summary Only :("); STR_Empty_NoSessions = QObject::tr("Sessions Switched Off"); // Dialog box options STR_MessageBox_Yes = QObject::tr("&Yes"); STR_MessageBox_No = QObject::tr("&No"); STR_MessageBox_Cancel = QObject::tr("&Cancel"); STR_MessageBox_Destroy = QObject::tr("&Destroy");; STR_MessageBox_Save = QObject::tr("&Save"); STR_TR_BMI = QObject::tr("BMI"); // Short form of Body Mass Index STR_TR_Weight = QObject::tr("Weight"); STR_TR_Zombie = QObject::tr("Zombie"); STR_TR_PulseRate = QObject::tr("Pulse Rate"); // Pulse / Heart rate STR_TR_SpO2 = QObject::tr("SpO2"); STR_TR_Plethy = QObject::tr("Plethy"); // Plethysomogram STR_TR_Pressure = QObject::tr("Pressure"); STR_TR_Daily = QObject::tr("Daily"); STR_TR_Overview = QObject::tr("Overview"); STR_TR_Oximetry = QObject::tr("Oximetry"); STR_TR_Oximeter = QObject::tr("Oximeter"); STR_TR_EventFlags = QObject::tr("Event Flags"); // Machine type names. STR_TR_CPAP = QObject::tr("CPAP"); // Constant Positive Airway Pressure STR_TR_BIPAP = QObject::tr("BiPAP"); // Bi-Level Positive Airway Pressure STR_TR_BiLevel = QObject::tr("Bi-Level"); // Another name for BiPAP STR_TR_EPAP = QObject::tr("EPAP"); // Expiratory Positive Airway Pressure STR_TR_EPAPLo = QObject::tr("Min EPAP"); // Lower Expiratory Positive Airway Pressure STR_TR_EPAPHi = QObject::tr("Max EPAP"); // Higher Expiratory Positive Airway Pressure STR_TR_IPAP = QObject::tr("IPAP"); // Inspiratory Positive Airway Pressure STR_TR_IPAPLo = QObject::tr("Min IPAP"); // Lower Inspiratory Positive Airway Pressure STR_TR_IPAPHi = QObject::tr("Max IPAP"); // Higher Inspiratory Positive Airway Pressure STR_TR_APAP = QObject::tr("APAP"); // Automatic Positive Airway Pressure STR_TR_ASV = QObject::tr("ASV"); // Assisted Servo Ventilator STR_TR_STASV = QObject::tr("ST/ASV"); STR_TR_Humidifier = QObject::tr("Humidifier"); STR_TR_H = QObject::tr("H"); // Short form of Hypopnea STR_TR_OA = QObject::tr("OA"); // Short form of Obstructive Apnea STR_TR_UA = QObject::tr("A"); // Short form of Unspecified Apnea STR_TR_CA = QObject::tr("CA"); // Short form of Clear Airway Apnea STR_TR_FL = QObject::tr("FL"); // Short form of Flow Limitation STR_TR_SA = QObject::tr("SA"); // Short form of Flow Limitation STR_TR_LE = QObject::tr("LE"); // Short form of Leak Event STR_TR_EP = QObject::tr("EP"); // Short form of Expiratory Puff STR_TR_VS = QObject::tr("VS"); // Short form of Vibratory Snore STR_TR_VS2 = QObject::tr("VS2"); // Short form of Secondary Vibratory Snore (Some Philips Respironics Machines have two sources) STR_TR_RERA = QObject::tr("RERA"); // Acronym for Respiratory Effort Related Arousal STR_TR_PP = QObject::tr("PP"); // Short form for Pressure Pulse STR_TR_P = QObject::tr("P"); // Short form for Pressure Event STR_TR_RE = QObject::tr("RE"); // Short form of Respiratory Effort Related Arousal STR_TR_NR = QObject::tr("NR"); // Short form of Non Responding event? (forgot sorry) STR_TR_NRI = QObject::tr("NRI"); // Sorry I Forgot.. it's a flag on Intellipap machines STR_TR_O2 = QObject::tr("O2"); // SpO2 Desaturation STR_TR_PC = QObject::tr("PC"); // Short form for Pulse Change STR_TR_UF1 = QObject::tr("UF1"); // Short form for User Flag 1 STR_TR_UF2 = QObject::tr("UF2"); // Short form for User Flag 2 STR_TR_UF3 = QObject::tr("UF3"); // Short form for User Flag 3 STR_TR_PS = QObject::tr("PS"); // Short form of Pressure Support STR_TR_AHI = QObject::tr("AHI"); // Short form of Apnea Hypopnea Index STR_TR_RDI = QObject::tr("RDI"); // Short form of Respiratory Distress Index STR_TR_AI = QObject::tr("AI"); // Short form of Apnea Index STR_TR_HI = QObject::tr("HI"); // Short form of Hypopnea Index STR_TR_UAI = QObject::tr("UAI"); // Short form of Uncatagorized Apnea Index STR_TR_CAI = QObject::tr("CAI"); // Short form of Clear Airway Index STR_TR_FLI = QObject::tr("FLI"); // Short form of Flow Limitation Index // STR_TR_SAI = QObject::tr("SAI"); // Short form of SleepAwake Index STR_TR_REI = QObject::tr("REI"); // Short form of RERA Index STR_TR_EPI = QObject::tr("EPI"); // Short form of Expiratory Puff Index STR_TR_CSR = QObject::tr("ÇSR"); // Short form of Cheyne Stokes Respiration STR_TR_PB = QObject::tr("PB"); // Short form of Periodic Breathing // Graph Titles STR_TR_IE = QObject::tr("IE"); // Inspiratory Expiratory Ratio STR_TR_InspTime = QObject::tr("Insp. Time"); // Inspiratory Time STR_TR_ExpTime = QObject::tr("Exp. Time"); // Expiratory Time STR_TR_RespEvent = QObject::tr("Resp. Event"); // Respiratory Event STR_TR_FlowLimitation = QObject::tr("Flow Limitation"); STR_TR_FlowLimit = QObject::tr("Flow Limit"); STR_TR_SensAwake = QObject::tr("SensAwake"); STR_TR_PatTrigBreath = QObject::tr("Pat. Trig. Breath"); // Patient Triggered Breath STR_TR_TgtMinVent = QObject::tr("Tgt. Min. Vent"); // Target Minute Ventilation STR_TR_TargetVent = QObject::tr("Target Vent."); // Target Ventilation STR_TR_MinuteVent = QObject::tr("Minute Vent."); // Minute Ventilation STR_TR_TidalVolume = QObject::tr("Tidal Volume"); STR_TR_RespRate = QObject::tr("Resp. Rate"); // Respiratory Rate STR_TR_Snore = QObject::tr("Snore"); STR_TR_Leak = QObject::tr("Leak"); STR_TR_Leaks = QObject::tr("Leaks"); STR_TR_LargeLeak = QObject::tr("Large Leak"); STR_TR_LL = QObject::tr("LL"); // Large Leak STR_TR_TotalLeaks = QObject::tr("Total Leaks"); STR_TR_UnintentionalLeaks = QObject::tr("Unintentional Leaks"); STR_TR_MaskPressure = QObject::tr("MaskPressure"); STR_TR_FlowRate = QObject::tr("Flow Rate"); STR_TR_SleepStage = QObject::tr("Sleep Stage"); STR_TR_Usage = QObject::tr("Usage"); STR_TR_Sessions = QObject::tr("Sessions"); STR_TR_PrRelief = QObject::tr("Pr. Relief"); // Pressure Relief STR_TR_Bookmarks = QObject::tr("Bookmarks"); STR_TR_SleepyHead = QObject::tr("SleepyHead"); STR_TR_Mode = QObject::tr("Mode"); STR_TR_Model = QObject::tr("Model"); STR_TR_Brand = QObject::tr("Brand"); STR_TR_Serial = QObject::tr("Serial"); STR_TR_Series = QObject::tr("Series"); STR_TR_Machine = QObject::tr("Machine"); STR_TR_Channel = QObject::tr("Channel"); STR_TR_Settings = QObject::tr("Settings"); STR_TR_Inclination = QObject::tr("Inclination"); STR_TR_Orientation = QObject::tr("Orientation"); STR_TR_Name = QObject::tr("Name"); STR_TR_DOB = QObject::tr("DOB"); // Date of Birth STR_TR_Phone = QObject::tr("Phone"); STR_TR_Address = QObject::tr("Address"); STR_TR_Email = QObject::tr("Email"); STR_TR_PatientID = QObject::tr("Patient ID"); STR_TR_Date = QObject::tr("Date"); STR_TR_BedTime = QObject::tr("Bedtime"); STR_TR_WakeUp = QObject::tr("Wake-up"); STR_TR_MaskTime = QObject::tr("Mask Time"); STR_TR_Unknown = QObject::tr("Unknown"); STR_TR_None = QObject::tr("None"); STR_TR_Ready = QObject::tr("Ready"); STR_TR_First = QObject::tr("First"); STR_TR_Last = QObject::tr("Last"); STR_TR_Start = QObject::tr("Start"); STR_TR_End = QObject::tr("End"); STR_TR_On = QObject::tr("On"); STR_TR_Off = QObject::tr("Off"); STR_TR_Yes = QObject::tr("Yes"); STR_TR_No = QObject::tr("No"); STR_TR_Min = QObject::tr("Min"); // Minimum STR_TR_Max = QObject::tr("Max"); // Maximum STR_TR_Med = QObject::tr("Med"); // Median STR_TR_Average = QObject::tr("Average"); STR_TR_Median = QObject::tr("Median"); STR_TR_Avg = QObject::tr("Avg"); // Average STR_TR_WAvg = QObject::tr("W-Avg"); // Weighted Average } quint32 CRC32(const char * data, quint32 length) { quint32 crc32 = 0xffffffff; for (quint32 idx=0; idx 0; j--) { if (i & 1) { i = (i >> 1) ^ 0xedb88320; } else { i >>= 1; } } crc32 = ((crc32) >> 8) ^ i; } return ~crc32; } quint32 crc32buf(const QByteArray& data) { return CRC32(data.constData(), data.size()); } // Gzip function QByteArray gCompress(const QByteArray& data) { QByteArray compressedData = qCompress(data); // Strip the first six bytes (a 4-byte length put on by qCompress and a 2-byte zlib header) // and the last four bytes (a zlib integrity check). compressedData.remove(0, 6); compressedData.chop(4); QByteArray header; QDataStream ds1(&header, QIODevice::WriteOnly); // Prepend a generic 10-byte gzip header (see RFC 1952), ds1 << quint16(0x1f8b) << quint16(0x0800) << quint16(0x0000) << quint16(0x0000) << quint16(0x000b); // Append a four-byte CRC-32 of the uncompressed data // Append 4 bytes uncompressed input size modulo 2^32 QByteArray footer; QDataStream ds2(&footer, QIODevice::WriteOnly); ds2.setByteOrder(QDataStream::LittleEndian); ds2 << crc32buf(data) << quint32(data.size()); return header + compressedData + footer; } // Pinched from http://stackoverflow.com/questions/2690328/qt-quncompress-gzip-data QByteArray gUncompress(const QByteArray &data) { if (data.size() <= 4) { qWarning("gUncompress: Input data is truncated"); return QByteArray(); } QByteArray result; int ret; z_stream strm; static const int CHUNK_SIZE = 1024; char out[CHUNK_SIZE]; /* allocate inflate state */ strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = data.size(); strm.next_in = (Bytef*)(data.data()); ret = inflateInit2(&strm, 15 + 32); // gzip decoding if (ret != Z_OK) return QByteArray(); // run inflate() do { strm.avail_out = CHUNK_SIZE; strm.next_out = (Bytef*)(out); ret = inflate(&strm, Z_NO_FLUSH); Q_ASSERT(ret != Z_STREAM_ERROR); // state not clobbered switch (ret) { case Z_NEED_DICT: ret = Z_DATA_ERROR; // and fall through case Z_DATA_ERROR: case Z_MEM_ERROR: (void)inflateEnd(&strm); return QByteArray(); } result.append(out, CHUNK_SIZE - strm.avail_out); } while (strm.avail_out == 0); // clean up and return inflateEnd(&strm); return result; } sleepyhead-0.9.8/sleepyhead/SleepLib/preferences.cpp0000644000175000017500000002153112412506713022047 0ustar sergiosergio/* SleepLib Preferences Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 #include "windows.h" #include "lmcons.h" #endif #include "common.h" #include "preferences.h" const QString &getUserName() { static QString userName; userName = getenv("USER"); if (userName.isEmpty()) { userName = QObject::tr("Windows User"); #if defined (Q_OS_WIN32) #if defined(UNICODE) if (QSysInfo::WindowsVersion >= QSysInfo::WV_NT) { TCHAR winUserName[UNLEN + 1]; // UNLEN is defined in LMCONS.H DWORD winUserNameSize = sizeof(winUserName); GetUserNameW(winUserName, &winUserNameSize); userName = QString::fromStdWString(winUserName); } else #endif { char winUserName[UNLEN + 1]; // UNLEN is defined in LMCONS.H DWORD winUserNameSize = sizeof(winUserName); GetUserNameA(winUserName, &winUserNameSize); userName = QString::fromLocal8Bit(winUserName); } #endif } return userName; } QString GetAppRoot() { QSettings settings(getDeveloperName(), getAppName()); QString HomeAppRoot = settings.value("Settings/AppRoot").toString(); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) const QString desktopFolder = QDesktopServices::storageLocation( QDesktopServices::DocumentsLocation); #else const QString desktopFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); #endif if (HomeAppRoot.isEmpty()) { HomeAppRoot = desktopFolder + "/" + getDefaultAppRoot(); } return HomeAppRoot; } Preferences::Preferences() { p_name = "Preferences"; p_path = GetAppRoot(); } Preferences::Preferences(QString name, QString filename) { if (name.endsWith(STR_ext_XML)) { p_name = name.section(".", 0, 0); } else { p_name = name; } if (filename.isEmpty()) { p_filename = GetAppRoot() + "/" + p_name + STR_ext_XML; } else { if (!filename.contains("/")) { p_filename = GetAppRoot() + "/"; } else { p_filename = ""; } p_filename += filename; if (!p_filename.endsWith(STR_ext_XML)) { p_filename += STR_ext_XML; } } } Preferences::~Preferences() { //Save(); // Don't..Save calls a virtual function. } /*int Preferences::GetCode(QString s) { int prefcode=0; for (QHash::iterator i=p_codes.begin(); i!=p_codes.end(); i++) { if (i.value()==s) return i.key(); prefcode++; } p_codes[prefcode]=s; return prefcode; }*/ const QString Preferences::Get(QString name) { QString temp; QChar obr = QChar('{'); QChar cbr = QChar('}'); QString t, a, ref; // How I miss Regular Expressions here.. if (p_preferences.find(name) != p_preferences.end()) { temp = ""; t = p_preferences[name].toString(); if (p_preferences[name].type() != QVariant::String) { return t; } } else { t = name; // parse the string.. } while (t.contains(obr)) { temp += t.section(obr, 0, 0); a = t.section(obr, 1); if (a.startsWith("{")) { temp += obr; t = a.section(obr, 1); continue; } ref = a.section(cbr, 0, 0); if (ref.toLower() == "home") { temp += GetAppRoot(); } else if (ref.toLower() == "user") { temp += getUserName(); } else if (ref.toLower() == "sep") { // redundant in QT temp += "/"; } else { temp += Get(ref); } t = a.section(cbr, 1); } temp += t; temp.replace("}}", "}"); // Make things look a bit better when escaping braces. return temp; } bool Preferences::Open(QString filename) { if (!filename.isEmpty()) { p_filename = filename; } QDomDocument doc(p_name); QFile file(p_filename); qDebug() << "Reading " << QDir::toNativeSeparators(p_filename); if (!file.open(QIODevice::ReadOnly)) { qWarning() << "Could not open" << QDir::toNativeSeparators(p_filename); return false; } if (!doc.setContent(&file)) { qWarning() << "Invalid XML Content in" << QDir::toNativeSeparators(p_filename); return false; } file.close(); QDomElement root = doc.documentElement(); if (root.tagName() != STR_AppName) { return false; } root = root.firstChildElement(); if (root.tagName() != p_name) { return false; } bool ok; p_preferences.clear(); QDomNode n = root.firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { QString name = e.tagName(); QString type = e.attribute("type").toLower(); QString value = e.text(); if (type == "double") { double d; d = value.toDouble(&ok); if (ok) { p_preferences[name] = d; } else { qDebug() << "XML Error:" << name << "=" << value << "??"; } } else if (type == "qlonglong") { qint64 d; d = value.toLongLong(&ok); if (ok) { p_preferences[name] = d; } else { qDebug() << "XML Error:" << name << "=" << value << "??"; } } else if (type == "int") { int d; d = value.toInt(&ok); if (ok) { p_preferences[name] = d; } else { qDebug() << "XML Error:" << name << "=" << value << "??"; } } else if (type == "bool") { QString v = value.toLower(); if ((v == "true") || (v == "on") || (v == "yes")) { p_preferences[name] = true; } else if ((v == "false") || (v == "off") || (v == "no")) { p_preferences[name] = false; } else { int d; d = value.toInt(&ok); if (ok) { p_preferences[name] = d != 0; } else { qDebug() << "XML Error:" << name << "=" << value << "??"; } } } else if (type == "qdatetime") { QDateTime d; d = QDateTime::fromString(value, "yyyy-MM-dd HH:mm:ss"); if (d.isValid()) { p_preferences[name] = d; } else { qWarning() << "XML Error: Invalid DateTime record" << name << value; } } else if (type == "qtime") { QTime d; d = QTime::fromString(value, "hh:mm:ss"); if (d.isValid()) { p_preferences[name] = d; } else { qWarning() << "XML Error: Invalid Time record" << name << value; } } else { p_preferences[name] = value; } } n = n.nextSibling(); } root = root.nextSiblingElement(); ExtraLoad(root); return true; } bool Preferences::Save(QString filename) { if (!filename.isEmpty()) { p_filename = filename; } QDomDocument doc(p_name); QDomElement droot = doc.createElement(STR_AppName); doc.appendChild(droot); QDomElement root = doc.createElement(p_name); droot.appendChild(root); for (QHash::iterator i = p_preferences.begin(); i != p_preferences.end(); i++) { QVariant::Type type = i.value().type(); if (type == QVariant::Invalid) { continue; } QDomElement cn = doc.createElement(i.key()); cn.setAttribute("type", i.value().typeName()); if (type == QVariant::DateTime) { cn.appendChild(doc.createTextNode(i.value().toDateTime().toString("yyyy-MM-dd HH:mm:ss"))); } else if (type == QVariant::Time) { cn.appendChild(doc.createTextNode(i.value().toTime().toString("hh:mm:ss"))); } else { cn.appendChild(doc.createTextNode(i.value().toString())); } root.appendChild(cn); } droot.appendChild(ExtraSave(doc)); QFile file(p_filename); if (!file.open(QIODevice::WriteOnly)) { return false; } QTextStream ts(&file); ts << doc.toString(); file.close(); return true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/0000755000175000017500000000000012412506713022047 5ustar sergiosergiosleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp0000644000175000017500000026503412412506713025000 0ustar sergiosergio/* SleepLib PRS1 Loader Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include "SleepLib/schema.h" #include "prs1_loader.h" #include "SleepLib/session.h" #include "SleepLib/calcs.h" //const int PRS1_MAGIC_NUMBER = 2; //const int PRS1_SUMMARY_FILE=1; //const int PRS1_EVENT_FILE=2; //const int PRS1_WAVEFORM_FILE=5; //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the prs1_data_version in prs1_loader.h when making changes to this loader // that change loader behaviour or modify channels. //******************************************************************************************** extern QProgressBar *qprogress; QHash ModelMap; #define PRS1_CRC_CHECK #ifdef PRS1_CRC_CHECK typedef quint16 crc_t; static const crc_t crc_table[256] = { 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; crc_t CRC16(const unsigned char *data, size_t data_len) { crc_t crc = 0; unsigned int tbl_idx; while (data_len--) { tbl_idx = (crc ^ *data) & 0xff; crc = (crc_table[tbl_idx] ^ (crc >> 8)) & 0xffff; data++; } return crc & 0xffff; } #endif enum FlexMode { FLEX_None, FLEX_CFlex, FLEX_CFlexPlus, FLEX_AFlex, FLEX_RiseTime, FLEX_BiFlex, FLEX_Unknown }; ChannelID PRS1_TimedBreath = 0, PRS1_HeatedTubing = 0; PRS1::PRS1(MachineID id): CPAP(id) { } PRS1::~PRS1() { } /*! \struct WaveHeaderList \brief Used in PRS1 Waveform Parsing */ struct WaveHeaderList { quint16 interleave; quint8 sample_format; WaveHeaderList(quint16 i, quint8 f) { interleave = i; sample_format = f; } }; PRS1Loader::PRS1Loader() { const QString PRS1_ICON = ":/icons/prs1.png"; const QString PRS1_60_ICON = ":/icons/prs1_60s.png"; QString s = newInfo().series; m_pixmap_paths["System One"] = PRS1_ICON; m_pixmaps["System One"] = QPixmap(PRS1_ICON); m_pixmap_paths["System One (60 Series)"] = PRS1_60_ICON; m_pixmaps["System One (60 Series)"] = QPixmap(PRS1_60_ICON); //genCRCTable(); // find what I did with this.. m_type = MT_CPAP; } PRS1Loader::~PRS1Loader() { } bool isdigit(QChar c) { if ((c >= '0') && (c <= '9')) { return true; } return false; } const QString PR_STR_PSeries = "P-Series"; // Tests path to see if it has (what looks like) a valid PRS1 folder structure bool PRS1Loader::Detect(const QString & path) { QString newpath = checkDir(path); return !newpath.isEmpty(); } QString PRS1Loader::checkDir(const QString & path) { QString newpath = path; newpath.replace("\\", "/"); if (!newpath.endsWith("/" + PR_STR_PSeries)) { newpath = path + "/" + PR_STR_PSeries; } QDir dir(newpath); if ((!dir.exists() || !dir.isReadable())) { return QString(); } qDebug() << "PRS1Loader::Detect path=" << newpath; QFile lastfile(newpath+"/last.txt"); bool exists = true; if (!lastfile.exists()) { lastfile.setFileName(newpath+"/LAST.TXT"); if (!lastfile.exists()) exists = false; } QString machpath; if (exists) { if (!lastfile.open(QIODevice::ReadOnly)) { qDebug() << "PRS1Loader: last.txt exists but I couldn't open it!"; } else { QTextStream ts(&lastfile); QString serial = ts.readLine(64).trimmed(); lastfile.close(); machpath = newpath+"/"+serial; if (!QDir(machpath).exists()) { machpath = QString(); } } } if (machpath.isEmpty()) { QDir dir(newpath); QStringList dirs = dir.entryList(QDir::NoDotAndDotDot | QDir::Dirs); if (dirs.size() > 0) { machpath = dirs[0]; } } return machpath; } void parseModel(MachineInfo & info, QString modelnum) { info.modelnumber = modelnum; if (!modelnum.endsWith("P")) { qDebug() << "Weird PRS1 Model number" << modelnum; } modelnum.chop(1); int country = modelnum[modelnum.length() - 1].digitValue(); modelnum.chop(1); int ser = modelnum[modelnum.length() - 1].digitValue(); modelnum.chop(1); bool ok; int typ = modelnum.toInt(&ok); switch (typ) { case 4: // cpap info.model = QObject::tr("RemStar Plus with C-Flex+"); break; case 5: // apap info.model = QObject::tr("RemStar Auto with A-Flex"); break; case 6: // bipap info.model = QObject::tr("RemStar BiPAP Pro with Bi-Flex"); break; case 7: // bipap auto info.model = QObject::tr("RemStar BiPAP Auto with Bi-Flex"); break; case 9: // asv info.model = QObject::tr("BiPAP autoSV Advanced"); break; case 10: // Avaps info.model = QObject::tr("BiPAP AVAPS"); break; default: info.model = QObject::tr("Unknown Model"); } switch (ser) { case 5: info.series = QObject::tr("System One"); break; case 6: info.series = QObject::tr("System One (60 Series)"); break; default: info.series = QObject::tr("unknown"); break; } switch (country) { case '0': break; case '1': break; default: break; } } bool PRS1Loader::PeekProperties(MachineInfo & info, QString filename, Machine * mach) { QFile f(filename); if (!f.open(QFile::ReadOnly)) { return false; } QTextStream in(&f); do { QString line = in.readLine(); QStringList pair = line.split("="); bool skip = false; if (pair[0].contains("ModelNumber", Qt::CaseInsensitive)) { QString modelnum = pair[1]; parseModel(info, modelnum); skip = true; } if (pair[0].contains("SerialNumber", Qt::CaseInsensitive)) { info.serial = pair[1]; skip = true; } if (!mach || skip) continue; mach->properties[pair[0]] = pair[1]; } while (!in.atEnd()); return true; } MachineInfo PRS1Loader::PeekInfo(const QString & path) { QString newpath = checkDir(path); if (newpath.isEmpty()) return MachineInfo(); MachineInfo info = newInfo(); info.serial = newpath.section("/", -1); PeekProperties(info, newpath+"/properties.txt"); return info; } int PRS1Loader::Open(QString path) { QString newpath; path = path.replace("\\", "/"); if (path.endsWith("/" + PR_STR_PSeries)) { newpath = path; } else { newpath = path + "/" + PR_STR_PSeries; } qDebug() << "PRS1Loader::Open path=" << newpath; QDir dir(newpath); if ((!dir.exists() || !dir.isReadable())) { return -1; } dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); QFileInfoList flist = dir.entryInfoList(); QStringList SerialNumbers; QStringList::iterator sn; for (int i = 0; i < flist.size(); i++) { QFileInfo fi = flist.at(i); QString filename = fi.fileName(); if (fi.isDir() && (filename.size() > 4) && (isdigit(filename[1])) && (isdigit(filename[2]))) { SerialNumbers.push_back(filename); } else if (filename.toLower() == "last.txt") { // last.txt points to the current serial number QString file = fi.canonicalFilePath(); QFile f(file); if (!fi.isReadable()) { qDebug() << "PRS1Loader: last.txt exists but I couldn't read it!"; continue; } if (!f.open(QIODevice::ReadOnly)) { qDebug() << "PRS1Loader: last.txt exists but I couldn't open it!"; continue; } last = f.readLine(64); last = last.trimmed(); f.close(); } } if (SerialNumbers.empty()) { return -1; } int c = 0; for (sn = SerialNumbers.begin(); sn != SerialNumbers.end(); sn++) { if ((*sn)[0].isLetter()) { c += OpenMachine(newpath + "/" + *sn); } } for (sn = SerialNumbers.begin(); sn != SerialNumbers.end(); sn++) { if (!(*sn)[0].isLetter()) { c += OpenMachine(newpath + "/" + *sn); } } return c; } /*bool PRS1Loader::ParseProperties(Machine *m, QString filename) { QFile f(filename); if (!f.open(QIODevice::ReadOnly)) { return false; } QString line; QHash prop; QString s = f.readLine(); QChar sep = '='; QString key, value; MachineInfo info = newInfo(); bool ok; while (!f.atEnd()) { key = s.section(sep, 0, 0); if (key == s) { continue; } value = s.section(sep, 1).trimmed(); if (value == s) { continue; } if (key.contains("serialnumber",Qt::CaseInsensitive)) { info.serial = value; } else if (key.contains("modelnumber",Qt::CaseInsensitive)) { parseModel(info, value); } else { if (key.contains("producttype", Qt::CaseInsensitive)) { int i = value.toInt(&ok, 16); if (ok) { if (ModelMap.find(i) != ModelMap.end()) { info.model = ModelMap[i]; } } } prop[key] = value; } s = f.readLine(); } if (info.serial != m->serial()) { qDebug() << "Serial Number in PRS1 properties.txt doesn't match machine record"; } m->setInfo(info); for (QHash::iterator i = prop.begin(); i != prop.end(); i++) { m->properties[i.key()] = i.value(); } f.close(); return true; }*/ int PRS1Loader::OpenMachine(QString path) { Q_ASSERT(p_profile != nullptr); qDebug() << "Opening PRS1 " << path; QDir dir(path); if (!dir.exists() || (!dir.isReadable())) { return 0; } dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); QFileInfoList flist = dir.entryInfoList(); QString filename; if (qprogress) { qprogress->setValue(0); } QStringList paths; int sessionid_base = 10; QString propertyfile; for (int i = 0; i < flist.size(); i++) { QFileInfo fi = flist.at(i); filename = fi.fileName(); if (fi.isDir()) { if ((filename[0].toLower() == 'p') && (isdigit(filename[1]))) { // p0, p1, p2.. etc.. folders contain the session data paths.push_back(fi.canonicalFilePath()); } else if (filename.toLower() == "e") { // Error files.. // Reminder: I have been given some info about these. should check it over. } } else if (filename.compare("properties.txt",Qt::CaseInsensitive) == 0) { propertyfile = fi.canonicalFilePath(); } else if (filename.compare("PROP.TXT",Qt::CaseInsensitive) == 0) { sessionid_base = 16; propertyfile = fi.canonicalFilePath(); } } MachineInfo info = newInfo(); // Have a peek first to get the serial number. PeekProperties(info, propertyfile); QString modelstr = info.modelnumber; if (modelstr.endsWith("P")) modelstr.chop(1); bool ok; int model = modelstr.toInt(&ok); if (ok) { int series = ((model / 10) % 10); int type = (model / 100); // Assumption is made here all PRS1 machines less than 450P are not data capable.. this could be wrong one day. if ((type < 4) && p_profile->cpap->brickWarning()) { QApplication::processEvents(); QMessageBox::information(QApplication::activeWindow(), QObject::tr("Non Data Capable Machine"), QString(QObject::tr("Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.")+"\n\n"+ QObject::tr("I'm sorry to report that SleepyHead can only track hours of use and very basic settings for this machine.")). arg(info.modelnumber),QMessageBox::Ok); p_profile->cpap->setBrickWarning(false); } // A bit of protection against future annoyances.. if (((series != 5) && (series != 6)) || (type >= 10)) { QMessageBox::information(QApplication::activeWindow(), QObject::tr("Machine Unsupported"), QObject::tr("Sorry, your Philips Respironics CPAP machine (Model %1) is not supported yet.").arg(info.modelnumber) +"\n\n"+ QObject::tr("JediMark needs a .zip copy of this machines' SD card and matching Encore .pdf reports to make it work with SleepyHead.") ,QMessageBox::Ok); return -1; } } else { // model number didn't parse.. Meh... Silently ignore it // QMessageBox::information(QApplication::activeWindow(), // QObject::tr("Machine Unsupported"), // QObject::tr("SleepyHead could not parse the model number, this machine can not be imported..") +"\n\n"+ // QObject::tr("JediMark needs a .zip copy of this machines' SD card and matching Encore .pdf reports to make it work with SleepyHead.") // ,QMessageBox::Ok); return -1; } // Which is needed to get the right machine record.. Machine *m = CreateMachine(info); // This time supply the machine object so it can populate machine properties.. PeekProperties(m->info, propertyfile, m); QString backupPath = m->getBackupPath() + path.section("/", -2); if (QDir::cleanPath(path).compare(QDir::cleanPath(backupPath)) != 0) { copyPath(path, backupPath); } SessionID sid; long ext; int size = paths.size(); sesstasks.clear(); new_sessions.clear(); // this hash is used by OpenFile PRS1Import * task = nullptr; // Note, I have observed p0/p1/etc folders containing duplicates session files (in Robin Sanders data.) // for each p0/p1/p2/etc... folder for (int p=0; p < size; ++p) { dir.setPath(paths.at(p)); if (!dir.exists() || !dir.isReadable()) { continue; } flist = dir.entryInfoList(); // Scan for individual session files for (int i = 0; i < flist.size(); i++) { QFileInfo fi = flist.at(i); QString ext_s = fi.fileName().section(".", -1); ext = ext_s.toInt(&ok); if (!ok) { // not a numerical extension continue; } QString session_s = fi.fileName().section(".", 0, -2); sid = session_s.toInt(&ok, sessionid_base); if (!ok) { // not a numerical session ID continue; } if (m->SessionExists(sid)) { // Skip already imported session continue; } if ((ext == 5) || (ext == 6)) { // Waveform files aren't grouped... so we just want to add the filename for later QHash::iterator it = sesstasks.find(sid); if (it != sesstasks.end()) { task = it.value(); } else { // Should probably check if session already imported has this data missing.. // Create the group if we see it first.. task = new PRS1Import(this, sid, m); sesstasks[sid] = task; queTask(task); } if (ext == 5) { if (!task->wavefile.isEmpty()) continue; task->wavefile = fi.canonicalFilePath(); } else if (ext == 6) { if (!task->oxifile.isEmpty()) continue; task->oxifile = fi.canonicalFilePath(); } continue; } // Parse the data chunks and read the files.. QList Chunks = ParseFile(fi.canonicalFilePath()); for (int i=0; i < Chunks.size(); ++i) { PRS1DataChunk * chunk = Chunks.at(i); if (ext <= 1) { const unsigned char * data = (unsigned char *)chunk->m_data.constData(); if (data[0x00] != 0) { delete chunk; continue; } } SessionID chunk_sid = chunk->sessionid; if (m->SessionExists(sid)) { delete chunk; continue; } task = nullptr; QHash::iterator it = sesstasks.find(chunk_sid); if (it != sesstasks.end()) { task = it.value(); } else { task = new PRS1Import(this, chunk_sid, m); sesstasks[chunk_sid] = task; // save a loop an que this now queTask(task); } switch (ext) { case 0: if (task->compliance) continue; task->compliance = chunk; break; case 1: if (task->summary) continue; task->summary = chunk; break; case 2: if (task->event) continue; task->event = chunk; break; default: break; } } } } int tasks = countTasks(); runTasks(p_profile->session->multithreading()); finishAddingSessions(); return m->unsupported() ? -1 : tasks; } bool PRS1Import::ParseF5Events() { ChannelID Codes[] = { PRS1_00, PRS1_01, CPAP_Pressure, CPAP_EPAP, CPAP_PressurePulse, CPAP_Obstructive, CPAP_ClearAirway, CPAP_Hypopnea, PRS1_08, CPAP_FlowLimit, PRS1_0A, CPAP_CSR, PRS1_0C, CPAP_VSnore, PRS1_0E, PRS1_0F, CPAP_LargeLeak, // Large leak apparently CPAP_LeakTotal, PRS1_12 }; int ncodes = sizeof(Codes) / sizeof(ChannelID); EventList *Code[0x20] = {nullptr}; EventList *OA = session->AddEventList(CPAP_Obstructive, EVL_Event); EventList *HY = session->AddEventList(CPAP_Hypopnea, EVL_Event); EventList *CSR = session->AddEventList(CPAP_CSR, EVL_Event); EventList *LEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event); EventList *LL = session->AddEventList(CPAP_LargeLeak, EVL_Event); EventList *SNORE = session->AddEventList(CPAP_Snore, EVL_Event); EventList *IPAP = session->AddEventList(CPAP_IPAP, EVL_Event, 0.1F); EventList *EPAP = session->AddEventList(CPAP_EPAP, EVL_Event, 0.1F); EventList *PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F); EventList *IPAPLo = session->AddEventList(CPAP_IPAPLo, EVL_Event, 0.1F); EventList *IPAPHi = session->AddEventList(CPAP_IPAPHi, EVL_Event, 0.1F); EventList *RR = session->AddEventList(CPAP_RespRate, EVL_Event); EventList *PTB = session->AddEventList(CPAP_PTB, EVL_Event); EventList *TB = session->AddEventList(PRS1_TimedBreath, EVL_Event); EventList *MV = session->AddEventList(CPAP_MinuteVent, EVL_Event); EventList *TV = session->AddEventList(CPAP_TidalVolume, EVL_Event, 10.0F); EventList *CA = session->AddEventList(CPAP_ClearAirway, EVL_Event); EventList *FL = session->AddEventList(CPAP_FlowLimit, EVL_Event); EventList *VS = session->AddEventList(CPAP_VSnore, EVL_Event); // EventList *VS2 = session->AddEventList(CPAP_VSnore2, EVL_Event); //EventList * PRESSURE=nullptr; //EventList * PP=nullptr; EventDataType data[10];//,tmp; //qint64 start=timestamp; qint64 t = qint64(event->timestamp) * 1000L; session->updateFirst(t); qint64 tt; int pos = 0; int cnt = 0; short delta;//,duration; QDateTime d; bool badcode = false; unsigned char lastcode3 = 0, lastcode2 = 0, lastcode = 0, code = 0; int lastpos = 0, startpos = 0, lastpos2 = 0, lastpos3 = 0; int size = event->m_data.size(); unsigned char * buffer = (unsigned char *)event->m_data.data(); while (pos < size) { lastcode3 = lastcode2; lastcode2 = lastcode; lastcode = code; lastpos3 = lastpos2; lastpos2 = lastpos; lastpos = startpos; startpos = pos; code = buffer[pos++]; if (code >= ncodes) { qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos; qDebug() << "1: (" << int(lastcode) << hex << lastpos << ")"; qDebug() << "2: (" << int(lastcode2) << hex << lastpos2 << ")"; qDebug() << "3: (" << int(lastcode3) << hex << lastpos3 << ")"; return false; } if (code == 0) { } else if (code != 0x12) { delta = buffer[pos]; //duration=buffer[pos+1]; //delta=buffer[pos+1] << 8 | buffer[pos]; pos += 2; t += qint64(delta) * 1000L; } ChannelID cpapcode = Codes[(int)code]; //EventDataType PS; tt = t; cnt++; int fc = 0; switch (code) { case 0x00: // Unknown (ASV Pressure value) // offset? data[0] = buffer[pos++]; fc++; if (!buffer[pos - 1]) { // WTH??? data[1] = buffer[pos++]; fc++; } if (!buffer[pos - 1]) { data[2] = buffer[pos++]; fc++; } break; case 0x01: // Unknown if (!Code[1]) { if (!(Code[1] = session->AddEventList(cpapcode, EVL_Event, 0.1F))) { return false; } } Code[1]->AddEvent(t, 0); break; case 0x02: // Pressure ??? data[0] = buffer[pos++]; // if (!Code[2]) { // if (!(Code[2]=session->AddEventList(cpapcode,EVL_Event,0.1))) return false; // } // Code[2]->AddEvent(t,data[0]); break; case 0x04: // Pressure Pulse?? data[0] = buffer[pos++]; // if (!Code[3]) { // if (!(Code[3] = session->AddEventList(cpapcode, EVL_Event))) { return false; } // } TB->AddEvent(t, data[0]); break; case 0x05: //code=CPAP_Obstructive; data[0] = buffer[pos++]; tt -= qint64(data[0]) * 1000L; // Subtract Time Offset OA->AddEvent(tt, data[0]); break; case 0x06: //code=CPAP_ClearAirway; data[0] = buffer[pos++]; tt -= qint64(data[0]) * 1000L; // Subtract Time Offset CA->AddEvent(tt, data[0]); break; case 0x07: //code=CPAP_Hypopnea; data[0] = buffer[pos++]; tt -= qint64(data[0]) * 1000L; // Subtract Time Offset HY->AddEvent(tt, data[0]); break; case 0x08: // ??? data[0] = buffer[pos++]; tt -= qint64(data[0]) * 1000L; // Subtract Time Offset qDebug() << "Code 8 found at " << hex << pos - 1 << " " << tt; if (!Code[10]) { if (!(Code[10] = session->AddEventList(cpapcode, EVL_Event))) { return false; } } //???? //data[1]=buffer[pos++]; // ??? Code[10]->AddEvent(tt, data[0]); pos++; break; case 0x09: // ASV Codes //code=CPAP_FlowLimit; data[0] = buffer[pos++]; tt -= qint64(data[0]) * 1000L; // Subtract Time Offset FL->AddEvent(tt, data[0]); break; case 0x0a: data[0] = buffer[pos++]; tt -= qint64(data[0]) * 1000L; // Subtract Time Offset if (!Code[7]) { if (!(Code[7] = session->AddEventList(cpapcode, EVL_Event))) { return false; } } Code[7]->AddEvent(tt, data[0]); break; case 0x0b: // Cheyne Stokes data[0] = ((unsigned char *)buffer)[pos + 1] << 8 | ((unsigned char *)buffer)[pos]; //data[0]*=2; pos += 2; data[1] = ((unsigned char *)buffer)[pos]; //|buffer[pos+1] << 8 pos += 1; //tt-=delta; tt -= qint64(data[1]) * 1000L; if (!CSR) { if (!(CSR = session->AddEventList(cpapcode, EVL_Event))) { qDebug() << "!CSR addeventlist exit"; return false; } } CSR->AddEvent(tt, data[0]); break; case 0x0c: data[0] = buffer[pos++]; tt -= qint64(data[0]) * 1000L; // Subtract Time Offset qDebug() << "Code 12 found at " << hex << pos - 1 << " " << tt; if (!Code[8]) { if (!(Code[8] = session->AddEventList(cpapcode, EVL_Event))) { return false; } } Code[8]->AddEvent(tt, data[0]); pos += 2; break; case 0x0d: // All the other ASV graph stuff. IPAP->AddEvent(t, data[0] = buffer[pos++]); // 00=IAP data[4] = buffer[pos++]; IPAPLo->AddEvent(t, data[4]); // 01=IAP Low data[5] = buffer[pos++]; IPAPHi->AddEvent(t, data[5]); // 02=IAP High LEAK->AddEvent(t, buffer[pos++]); // 03=LEAK RR->AddEvent(t, buffer[pos++]); // 04=Breaths Per Minute PTB->AddEvent(t, buffer[pos++]); // 05=Patient Triggered Breaths MV->AddEvent(t, buffer[pos++]); // 06=Minute Ventilation //tmp=buffer[pos++] * 10.0; TV->AddEvent(t, buffer[pos++]); // 07=Tidal Volume SNORE->AddEvent(t, data[2] = buffer[pos++]); // 08=Snore if (data[2] > 0) { if (!VS) { if (!(VS = session->AddEventList(CPAP_VSnore, EVL_Event))) { qDebug() << "!VS eventlist exit"; return false; } } VS->AddEvent(t, 0); //data[2]); // VSnore } EPAP->AddEvent(t, data[1] = buffer[pos++]); // 09=EPAP data[2] = data[0] - data[1]; PS->AddEvent(t, data[2]); // Pressure Support if (event->familyVersion >= 1) { data[0] = buffer[pos++]; } break; case 0x03: // BIPAP Pressure qDebug() << "0x03 Observed in ASV data!!????"; data[0] = buffer[pos++]; data[1] = buffer[pos++]; // data[0]/=10.0; // data[1]/=10.0; // session->AddEvent(new Event(t,CPAP_EAP, 0, data, 1)); // session->AddEvent(new Event(t,CPAP_IAP, 0, &data[1], 1)); break; case 0x11: // Not Leak Rate qDebug() << "0x11 Observed in ASV data!!????"; //if (!Code[24]) { // Code[24]=new EventList(cpapcode,EVL_Event); //} //Code[24]->AddEvent(t,buffer[pos++]); break; case 0x0e: // Unknown qDebug() << "0x0E Observed in ASV data!!????"; data[0] = buffer[pos++]; // << 8) | buffer[pos]; //session->AddEvent(new Event(t,cpapcode, 0, data, 1)); break; case 0x10: // Unknown data[0] = buffer[pos + 1] << 8 | buffer[pos]; pos += 2; data[1] = buffer[pos++]; tt = t - qint64(data[1]) * 1000L; LL->AddEvent(tt, data[0]); // qDebug() << "0x10 Observed in ASV data!!????"; // data[0] = buffer[pos++]; // << 8) | buffer[pos]; // data[1] = buffer[pos++]; // data[2] = buffer[pos++]; //session->AddEvent(new Event(t,cpapcode, 0, data, 3)); break; case 0x0f: qDebug() << "0x0f Observed in ASV data!!????"; data[0] = buffer[pos + 1] << 8 | buffer[pos]; pos += 2; data[1] = buffer[pos]; //|buffer[pos+1] << 8 pos += 1; tt -= qint64(data[1]) * 1000L; //session->AddEvent(new Event(tt,cpapcode, 0, data, 2)); break; case 0x12: // Summary qDebug() << "0x12 Observed in ASV data!!????"; data[0] = buffer[pos++]; data[1] = buffer[pos++]; data[2] = buffer[pos + 1] << 8 | buffer[pos]; pos += 2; //session->AddEvent(new Event(t,cpapcode, 0, data,3)); break; default: // ERROR!!! qWarning() << "Some new fandangled PRS1 code detected " << hex << int(code) << " at " << pos - 1; badcode = true; break; } if (badcode) { break; } } session->updateLast(t); session->m_cnt.clear(); session->m_cph.clear(); session->settings[CPAP_IPAPLo] = session->Min(CPAP_IPAPLo); session->settings[CPAP_IPAPHi] = session->Max(CPAP_IPAPHi); session->settings[CPAP_PSMax] = session->Max(CPAP_IPAPHi) - session->Min(CPAP_EPAP); session->settings[CPAP_PSMin] = session->Min(CPAP_IPAPLo) - session->Min(CPAP_EPAP); session->m_valuesummary[CPAP_Pressure].clear(); session->m_valuesummary.erase(session->m_valuesummary.find(CPAP_Pressure)); return true; } bool PRS1Import::ParseF0Events() { unsigned char code=0; EventList *Code[0x20] = {0}; EventDataType data[10]; int cnt = 0; short delta; int tdata; int pos; qint64 t = qint64(event->timestamp) * 1000L, tt; session->updateFirst(t); EventList *OA = session->AddEventList(CPAP_Obstructive, EVL_Event); EventList *HY = session->AddEventList(CPAP_Hypopnea, EVL_Event); EventList *CSR = session->AddEventList(CPAP_CSR, EVL_Event); EventList *LEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event); EventList *SNORE = session->AddEventList(CPAP_Snore, EVL_Event); EventList *PP = session->AddEventList(CPAP_PressurePulse, EVL_Event); EventList *RE = session->AddEventList(CPAP_RERA, EVL_Event); EventList *CA = session->AddEventList(CPAP_ClearAirway, EVL_Event); EventList *FL = session->AddEventList(CPAP_FlowLimit, EVL_Event); EventList *VS = session->AddEventList(CPAP_VSnore, EVL_Event); EventList *VS2 = session->AddEventList(CPAP_VSnore2, EVL_Event); //EventList *T1 = session->AddEventList(CPAP_Test1, EVL_Event, 0.1); Code[12] = session->AddEventList(PRS1_0B, EVL_Event); Code[17] = session->AddEventList(PRS1_0E, EVL_Event); EventList * LL = session->AddEventList(CPAP_LargeLeak, EVL_Event); EventList *PRESSURE = nullptr; EventList *EPAP = nullptr; EventList *IPAP = nullptr; EventList *PS = nullptr; //session->AddEventList(CPAP_VSnore, EVL_Event); //EventList * VS=session->AddEventList(CPAP_Obstructive, EVL_Event); unsigned char lastcode3 = 0, lastcode2 = 0, lastcode = 0; int lastpos = 0, startpos = 0, lastpos2 = 0, lastpos3 = 0; int size = event->m_data.size(); unsigned char * buffer = (unsigned char *)event->m_data.data(); for (pos = 0; pos < size;) { lastcode3 = lastcode2; lastcode2 = lastcode; lastcode = code; lastpos3 = lastpos2; lastpos2 = lastpos; lastpos = startpos; startpos = pos; code = buffer[pos++]; if (code > 0x12) { qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos; qDebug() << "1: (" << hex << int(lastcode) << hex << lastpos << ")"; qDebug() << "2: (" << hex << int(lastcode2) << hex << lastpos2 << ")"; qDebug() << "3: (" << hex << int(lastcode3) << hex << lastpos3 << ")"; return false; } if (code != 0x12) { delta = buffer[pos + 1] << 8 | buffer[pos]; pos += 2; t += qint64(delta) * 1000L; tt = t; } cnt++; switch (code) { case 0x00: // Unknown 00 if (!Code[0]) { if (!(Code[0] = session->AddEventList(PRS1_00, EVL_Event))) { return false; } } Code[0]->AddEvent(t, buffer[pos++]); if ((event->family == 0) && (event->familyVersion >= 4)) { pos++; } break; case 0x01: // Unknown if (!Code[1]) { if (!(Code[1] = session->AddEventList(PRS1_01, EVL_Event))) { return false; } } Code[1]->AddEvent(t, 0); if ((event->family == 0) && (event->familyVersion >= 4)) { if (!PRESSURE) { PRESSURE = session->AddEventList(CPAP_Pressure, EVL_Event, 0.1F); if (!PRESSURE) { return false; } } PRESSURE->AddEvent(t, buffer[pos++]); } break; case 0x02: // Pressure if ((event->family == 0) && (event->familyVersion >= 4)) { // BiPAP Pressure if (!EPAP) { if (!(EPAP = session->AddEventList(CPAP_EPAP, EVL_Event, 0.1F))) { return false; } if (!(IPAP = session->AddEventList(CPAP_IPAP, EVL_Event, 0.1F))) { return false; } if (!(PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F))) { return false; } } EPAP->AddEvent(t, data[0] = buffer[pos++]); IPAP->AddEvent(t, data[1] = buffer[pos++]); PS->AddEvent(t, data[1] - data[0]); } else { if (!PRESSURE) { PRESSURE = session->AddEventList(CPAP_Pressure, EVL_Event, 0.1F); if (!PRESSURE) { return false; } } PRESSURE->AddEvent(t, buffer[pos++]); } break; case 0x03: // BIPAP Pressure if (!EPAP) { if (!(EPAP = session->AddEventList(CPAP_EPAP, EVL_Event, 0.1F))) { return false; } if (!(IPAP = session->AddEventList(CPAP_IPAP, EVL_Event, 0.1F))) { return false; } if (!(PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F))) { return false; } } EPAP->AddEvent(t, data[0] = buffer[pos++]); IPAP->AddEvent(t, data[1] = buffer[pos++]); PS->AddEvent(t, data[1] - data[0]); break; case 0x04: // Pressure Pulse PP->AddEvent(t, buffer[pos++]); break; case 0x05: // RERA data[0] = buffer[pos++]; tt = t - (qint64(data[0]) * 1000L); RE->AddEvent(tt, data[0]); break; case 0x06: // Obstructive Apoanea data[0] = buffer[pos++]; tt = t - (qint64(data[0]) * 1000L); OA->AddEvent(tt, data[0]); break; case 0x07: // Clear Airway data[0] = buffer[pos++]; tt = t - (qint64(data[0]) * 1000L); CA->AddEvent(tt, data[0]); break; case 0x0a: // Hypopnea data[0] = buffer[pos++]; tt = t - (qint64(data[0]) * 1000L); HY->AddEvent(tt, data[0]); break; case 0x0c: // Flow Limitation data[0] = buffer[pos++]; tt = t - (qint64(data[0]) * 1000L); FL->AddEvent(tt, data[0]); break; case 0x0b: // Hypopnea related code data[0] = buffer[pos++]; data[1] = buffer[pos++]; // FIXME Code[12]->AddEvent(t, data[0]); break; case 0x0d: // Vibratory Snore VS->AddEvent(t, 0); break; case 0x11: // Leak Rate & Snore Graphs data[0] = buffer[pos++]; data[1] = buffer[pos++]; LEAK->AddEvent(t, data[0]); SNORE->AddEvent(t, data[1]); if (data[1] > 0) { VS2->AddEvent(t, data[1]); } if ((event->family == 0) && (event->familyVersion >= 4)) { data[0] = buffer[pos]; pos++; } break; case 0x0e: // Unknown data[0] = ((char *)buffer)[pos++]; data[1] = buffer[pos++]; //(buffer[pos+1] << 8) | buffer[pos]; //data[0]/=10.0; //pos+=2; data[2] = buffer[pos++]; tdata = unsigned(data[1]) << 8 | unsigned(data[0]); Code[17]->AddEvent(t, tdata); //qDebug() << hex << data[0] << data[1] << data[2]; //session->AddEvent(new Event(t,cpapcode, 0, data, 3)); //tt-=data[1]*1000; //session->AddEvent(new Event(t,CPAP_CSR, data, 2)); break; case 0x10: // Large Leak data[0] = buffer[pos + 1] << 8 | buffer[pos]; pos += 2; data[1] = buffer[pos++]; tt = t - qint64(data[1]) * 1000L; LL->AddEvent(tt, data[0]); break; case 0x0f: // Cheyne Stokes Respiration data[0] = buffer[pos + 1] << 8 | buffer[pos]; pos += 2; data[1] = buffer[pos++]; tt = t - qint64(data[1]) * 1000L; CSR->AddEvent(tt, data[0]); break; case 0x12: // Summary data[0] = buffer[pos++]; data[1] = buffer[pos++]; data[2] = buffer[pos + 1] << 8 | buffer[pos]; pos += 2; // if (!Code[24]) { // if (!(Code[24] = session->AddEventList(PRS1_12, EVL_Event))) { return false; } // } // Code[24]->AddEvent(t, data[0]); break; default: // ERROR!!! qWarning() << "Some new fandangled PRS1 code detected in" << event->sessionid << hex << int(code) << " at " << pos - 1; return false; } } session->updateLast(t); session->m_cnt.clear(); session->m_cph.clear(); session->m_lastchan.clear(); session->m_firstchan.clear(); session->m_valuesummary[CPAP_Pressure].clear(); session->m_valuesummary.erase(session->m_valuesummary.find(CPAP_Pressure)); return true; } bool PRS1Import::ParseCompliance() { const unsigned char * data = (unsigned char *)compliance->m_data.constData(); if (data[0x00] > 0) { return false; } session->settings[CPAP_Mode] = (int)MODE_CPAP; EventDataType min_pressure = float(data[0x03]) / 10.0; // EventDataType max_pressure = float(data[0x04]) / 10.0; session->settings[CPAP_Pressure] = min_pressure; int ramp_time = data[0x06]; EventDataType ramp_pressure = float(data[0x07]) / 10.0; session->settings[CPAP_RampTime] = (int)ramp_time; session->settings[CPAP_RampPressure] = ramp_pressure; quint8 flex = data[0x09]; int flexlevel = flex & 0x03; FlexMode flexmode = FLEX_Unknown; flex &= 0xf8; bool split = false; if (flex & 0x40) { // This bit defines the Flex setting for the CPAP component of the Split night split = true; } if (flex & 0x80) { // CFlex bit if (flex & 8) { // Plus bit flexmode = FLEX_CFlexPlus; } else { flexmode = FLEX_CFlex; } } else flexmode = FLEX_None; session->settings[PRS1_FlexMode] = (int)flexmode; session->settings[PRS1_FlexLevel] = (int)flexlevel; session->setSummaryOnly(true); //session->settings[CPAP_SummaryOnly] = true; session->settings[PRS1_HumidStatus] = (bool)(data[0x0A] & 0x80); // Humidifier Connected session->settings[PRS1_HumidLevel] = (int)(data[0x0A] & 7); // Humidifier Value // need to parse a repeating structure here containing lengths of mask on/off.. // 0x03 = mask on // 0x01 = mask off qint64 start = qint64(compliance->timestamp) * 1000L; qint64 tt = start; int len = compliance->size()-3; int pos = 0x11; do { quint8 c = data[pos++]; quint64 duration = data[pos] | data[pos+1] << 8; pos+=2; duration *= 1000L; SliceStatus status; if (c == 0x03) { status = EquipmentOn; } else if (c == 0x02) { status = EquipmentLeaking; } else if (c == 0x01) { status = EquipmentOff; } else { qDebug() << compliance->sessionid << "Wasn't expecting" << c; break; } session->m_slices.append(SessionSlice(tt, tt + duration, status)); qDebug() << compliance->sessionid << "Added Slice" << tt << (tt+duration) << status; tt += duration; } while (pos < len); session->set_first(start); session->set_last(tt); // Bleh!! There is probably 10 different formats for these useless piece of junk machines return true; } bool PRS1Import::ParseSummaryF0() { const unsigned char * data = (unsigned char *)summary->m_data.constData(); if (data[0x00] > 0) { return false; } session->set_first(qint64(summary->timestamp) * 1000L); CPAPMode cpapmode = MODE_UNKNOWN; switch (data[0x02]) { // PRS1 mode // 0 = CPAP, 2 = APAP case 0x00: cpapmode = MODE_CPAP; break; case 0x01: cpapmode = MODE_BILEVEL_FIXED; break; case 0x02: cpapmode = MODE_APAP; break; case 0x03: cpapmode = MODE_BILEVEL_AUTO_VARIABLE_PS; } EventDataType min_pressure = float(data[0x03]) / 10.0; EventDataType max_pressure = float(data[0x04]) / 10.0; EventDataType ps = float(data[0x05]) / 10.0; // pressure support if (cpapmode == MODE_CPAP) { session->settings[CPAP_Pressure] = min_pressure; } else if (cpapmode == MODE_APAP) { session->settings[CPAP_PressureMin] = min_pressure; session->settings[CPAP_PressureMax] = max_pressure; } else if (cpapmode == MODE_BILEVEL_FIXED) { session->settings[CPAP_EPAP] = min_pressure; session->settings[CPAP_IPAP] = max_pressure; session->settings[CPAP_PS] = ps; } else if (cpapmode == MODE_BILEVEL_AUTO_VARIABLE_PS) { session->settings[CPAP_EPAPLo] = min_pressure; session->settings[CPAP_EPAPHi] = max_pressure - 2.0; session->settings[CPAP_IPAPLo] = min_pressure + 2.0; session->settings[CPAP_IPAPHi] = max_pressure; session->settings[CPAP_PSMin] = 2.0f; session->settings[CPAP_PSMax] = ps; } session->settings[CPAP_Mode] = (int)cpapmode; int ramp_time = data[0x06]; EventDataType ramp_pressure = float(data[0x07]) / 10.0; session->settings[CPAP_RampTime] = (int)ramp_time; session->settings[CPAP_RampPressure] = ramp_pressure; // Tubing lock has no setting byte // Menu Options session->settings[PRS1_SysLock] = (bool) (data[0x0a] & 0x80); // System One Resistance Lock Setting session->settings[PRS1_SysOneResistSet] = (int)data[0x0a] & 7; // SYstem One Resistance setting value session->settings[PRS1_SysOneResistStat] = (bool) (data[0x0a] & 0x40); // System One Resistance Status bit session->settings[PRS1_HoseDiam] = (data[0x0a] & 0x08) ? QObject::tr("15mm") : QObject::tr("22mm"); session->settings[PRS1_AutoOn] = (bool) (data[0x0b] & 0x40); session->settings[PRS1_AutoOff] = (bool) (data[0x0c] & 0x10); session->settings[PRS1_MaskAlert] = (bool) (data[0x0c] & 0x08); session->settings[PRS1_ShowAHI] = (bool) (data[0x0c] & 0x04); session->settings[PRS1_HumidStatus] = (bool)(data[0x09] & 0x80); // Humidifier Connected session->settings[PRS1_HumidLevel] = (int)(data[0x09] & 7); // Humidifier Value // session-> quint8 flex = data[0x08]; int flexlevel = flex & 0x03; FlexMode flexmode = FLEX_Unknown; // 88 CFlex+ / AFlex (depending on CPAP mode) // 80 CFlex // 00 NoFlex // c0 Split CFlex then None // c8 Split CFlex+ then None flex &= 0xf8; bool split = false; if (flex & 0x40) { // This bit defines the Flex setting for the CPAP component of the Split night split = true; } if (flex & 0x80) { // CFlex bit if (flex & 0x10) { flexmode = FLEX_RiseTime; } else if (flex & 8) { // Plus bit if (split || (cpapmode == MODE_CPAP)) { flexmode = FLEX_CFlexPlus; } else if (cpapmode == MODE_APAP) { flexmode = FLEX_AFlex; } } else { // CFlex bits refer to Rise Time on BiLevel machines flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex; } } else flexmode = FLEX_None; session->settings[PRS1_FlexMode] = (int)flexmode; session->settings[PRS1_FlexLevel] = (int)flexlevel; summary_duration = data[0x14] | data[0x15] << 8; return true; } bool PRS1Import::ParseSummaryF0V4() { const unsigned char * data = (unsigned char *)summary->m_data.constData(); if (data[0x00] > 0) { return false; } session->set_first(qint64(summary->timestamp) * 1000L); CPAPMode cpapmode = MODE_UNKNOWN; switch (data[0x02]) { // PRS1 mode // 0 = CPAP, 2 = APAP case 0x00: cpapmode = MODE_CPAP; break; case 0x20: cpapmode = MODE_BILEVEL_FIXED; break; case 0x40: cpapmode = MODE_APAP; break; case 0x60: cpapmode = MODE_BILEVEL_AUTO_VARIABLE_PS; } EventDataType min_pressure = float(data[0x03]) / 10.0; EventDataType max_pressure = float(data[0x04]) / 10.0; EventDataType min_ps = float(data[0x05]) / 10.0; // pressure support EventDataType max_ps = float(data[0x06]) / 10.0; // pressure support if (cpapmode == MODE_CPAP) { session->settings[CPAP_Pressure] = min_pressure; } else if (cpapmode == MODE_APAP) { session->settings[CPAP_PressureMin] = min_pressure; session->settings[CPAP_PressureMax] = max_pressure; } else if (cpapmode == MODE_BILEVEL_FIXED) { session->settings[CPAP_EPAP] = min_pressure; session->settings[CPAP_IPAP] = max_pressure; session->settings[CPAP_PS] = max_pressure - min_pressure; } else if (cpapmode == MODE_BILEVEL_AUTO_VARIABLE_PS) { session->settings[CPAP_EPAPLo] = min_pressure; session->settings[CPAP_EPAPHi] = max_pressure; session->settings[CPAP_IPAPLo] = min_pressure + min_ps; session->settings[CPAP_IPAPHi] = max_pressure; session->settings[CPAP_PSMin] = min_ps; session->settings[CPAP_PSMax] = max_ps; } session->settings[CPAP_Mode] = (int)cpapmode; quint8 flex = data[0x0a]; int flexlevel = flex & 0x03; FlexMode flexmode = FLEX_Unknown; flex &= 0xf8; bool split = false; if (flex & 0x40) { // This bit defines the Flex setting for the CPAP component of the Split night split = true; } if (flex & 0x80) { // CFlex bit if (flex & 0x10) { flexmode = FLEX_RiseTime; } else if (flex & 8) { // Plus bit if (split || (cpapmode == MODE_CPAP)) { flexmode = FLEX_CFlexPlus; } else if (cpapmode == MODE_APAP) { flexmode = FLEX_AFlex; } } else { // CFlex bits refer to Rise Time on BiLevel machines flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex; } } else flexmode = FLEX_None; int ramp_time = data[0x08]; EventDataType ramp_pressure = float(data[0x09]) / 10.0; session->settings[CPAP_RampTime] = (int)ramp_time; session->settings[CPAP_RampPressure] = ramp_pressure; session->settings[PRS1_FlexMode] = (int)flexmode; session->settings[PRS1_FlexLevel] = (int)flexlevel; session->settings[PRS1_HumidStatus] = (bool)(data[0x0b] & 0x80); // Humidifier Connected session->settings[PRS1_HeatedTubing] = (bool)(data[0x0b] & 0x10); // Heated Hose?? session->settings[PRS1_HumidLevel] = (int)(data[0x0b] & 7); // Humidifier Value summary_duration = data[0x14] | data[0x15] << 8; return true; } bool PRS1Import::ParseSummaryF3() { const unsigned char * data = (unsigned char *)summary->m_data.constData(); if (data[0x00] > 0) { return false; } session->set_first(qint64(summary->timestamp) * 1000L); EventDataType epap = data[0x04] | (data[0x05] << 8); EventDataType ipap = data[0x06] | (data[0x07] << 8); EventDataType f1 = data[0x08] | (data[0x09] << 8); return true; } bool PRS1Import::ParseSummaryF5V0() { const unsigned char * data = (unsigned char *)summary->m_data.constData(); if (data[0x00] > 0) { return false; } session->set_first(qint64(summary->timestamp) * 1000L); CPAPMode cpapmode = MODE_UNKNOWN; int imin_epap = data[0x3]; int imax_epap = data[0x4]; int imin_ps = data[0x5]; int imax_ps = data[0x6]; int imax_pressure = data[0x2]; cpapmode = MODE_ASV_VARIABLE_EPAP; session->settings[CPAP_Mode] = (int)cpapmode; if (cpapmode == MODE_CPAP) { session->settings[CPAP_Pressure] = imin_epap/10.0f; } else if (cpapmode == MODE_BILEVEL_FIXED) { session->settings[CPAP_EPAP] = imin_epap/10.0f; session->settings[CPAP_IPAP] = imax_epap/10.0f; } else if (cpapmode == MODE_ASV_VARIABLE_EPAP) { int imax_ipap = imax_epap + imax_ps; int imin_ipap = imin_epap + imin_ps; session->settings[CPAP_EPAPLo] = imin_epap / 10.0f; session->settings[CPAP_EPAPHi] = imax_epap / 10.0f; session->settings[CPAP_IPAPLo] = imin_ipap / 10.0f; session->settings[CPAP_IPAPHi] = imax_pressure / 10.0f; session->settings[CPAP_PSMin] = imin_ps / 10.0f; session->settings[CPAP_PSMax] = imax_ps / 10.0f; } quint8 flex = data[0x0c]; int flexlevel = flex & 0x03; FlexMode flexmode = FLEX_Unknown; flex &= 0xf8; bool split = false; if (flex & 0x40) { // This bit defines the Flex setting for the CPAP component of the Split night split = true; } if (flex & 0x80) { // CFlex bit if (flex & 0x10) { flexmode = FLEX_RiseTime; } else if (flex & 8) { // Plus bit if (split || (cpapmode == MODE_CPAP)) { flexmode = FLEX_CFlexPlus; } else if (cpapmode == MODE_APAP) { flexmode = FLEX_AFlex; } } else { // CFlex bits refer to Rise Time on BiLevel machines flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex; } } else flexmode = FLEX_None; session->settings[PRS1_FlexMode] = (int)flexmode; session->settings[PRS1_FlexLevel] = (int)flexlevel; int ramp_time = data[0x0a]; EventDataType ramp_pressure = float(data[0x0b]) / 10.0; session->settings[CPAP_RampTime] = (int)ramp_time; session->settings[CPAP_RampPressure] = ramp_pressure; session->settings[PRS1_HumidStatus] = (bool)(data[0x0d] & 0x80); // Humidifier Connected session->settings[PRS1_HeatedTubing] = (bool)(data[0x0d] & 0x10); // Heated Hose?? session->settings[PRS1_HumidLevel] = (int)(data[0x0d] & 7); // Humidifier Value summary_duration = data[0x18] | data[0x19] << 8; return true; } bool PRS1Import::ParseSummaryF5V1() { const unsigned char * data = (unsigned char *)summary->m_data.constData(); if (data[0x00] > 0) { return false; } session->set_first(qint64(summary->timestamp) * 1000L); CPAPMode cpapmode = MODE_UNKNOWN; int imin_epap = data[0x3]; int imax_epap = data[0x4]; int imin_ps = data[0x5]; int imax_ps = data[0x6]; int imax_pressure = data[0x2]; cpapmode = MODE_ASV_VARIABLE_EPAP; session->settings[CPAP_Mode] = (int)cpapmode; if (cpapmode == MODE_CPAP) { session->settings[CPAP_Pressure] = imin_epap/10.0f; } else if (cpapmode == MODE_BILEVEL_FIXED) { session->settings[CPAP_EPAP] = imin_epap/10.0f; session->settings[CPAP_IPAP] = imax_epap/10.0f; } else if (cpapmode == MODE_ASV_VARIABLE_EPAP) { int imax_ipap = imax_epap + imax_ps; int imin_ipap = imin_epap + imin_ps; session->settings[CPAP_EPAPLo] = imin_epap / 10.0f; session->settings[CPAP_EPAPHi] = imax_epap / 10.0f; session->settings[CPAP_IPAPLo] = imin_ipap / 10.0f; session->settings[CPAP_IPAPHi] = imax_pressure / 10.0f; session->settings[CPAP_PSMin] = imin_ps / 10.0f; session->settings[CPAP_PSMax] = imax_ps / 10.0f; } quint8 flex = data[0x0c]; int flexlevel = flex & 0x03; FlexMode flexmode = FLEX_Unknown; flex &= 0xf8; bool split = false; if (flex & 0x40) { // This bit defines the Flex setting for the CPAP component of the Split night split = true; } if (flex & 0x80) { // CFlex bit if (flex & 0x10) { flexmode = FLEX_RiseTime; } else if (flex & 8) { // Plus bit if (split || (cpapmode == MODE_CPAP)) { flexmode = FLEX_CFlexPlus; } else if (cpapmode == MODE_APAP) { flexmode = FLEX_AFlex; } } else { // CFlex bits refer to Rise Time on BiLevel machines flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex; } } else flexmode = FLEX_None; session->settings[PRS1_FlexMode] = (int)flexmode; session->settings[PRS1_FlexLevel] = (int)flexlevel; int ramp_time = data[0x0a]; EventDataType ramp_pressure = float(data[0x0b]) / 10.0; session->settings[CPAP_RampTime] = (int)ramp_time; session->settings[CPAP_RampPressure] = ramp_pressure; session->settings[PRS1_HumidStatus] = (bool)(data[0x0d] & 0x80); // Humidifier Connected session->settings[PRS1_HeatedTubing] = (bool)(data[0x0d] & 0x10); // Heated Hose?? session->settings[PRS1_HumidLevel] = (int)(data[0x0d] & 7); // Humidifier Value summary_duration = data[0x18] | data[0x19] << 8; return true; } bool PRS1Import::ParseSummary() { // Family 0 = XPAP // Family 3 = BIPAP AVAPS // Family 5 = BIPAP AutoSV if (!summary) return false; session->setPhysMax(CPAP_LeakTotal, 120); session->setPhysMin(CPAP_LeakTotal, 0); session->setPhysMax(CPAP_Pressure, 25); session->setPhysMin(CPAP_Pressure, 4); session->setPhysMax(CPAP_IPAP, 25); session->setPhysMin(CPAP_IPAP, 4); session->setPhysMax(CPAP_EPAP, 25); session->setPhysMin(CPAP_EPAP, 4); session->setPhysMax(CPAP_PS, 25); session->setPhysMin(CPAP_PS, 0); switch (summary->family) { case 0: if (summary->familyVersion == 4) { return ParseSummaryF0V4(); } else { return ParseSummaryF0(); } case 3: // return ParseSummaryF3(); break; case 5: if (summary->familyVersion == 0) { return ParseSummaryF5V0(); } else { return ParseSummaryF5V1(); } } this->loader->saveMutex.lock(); if (!mach->unsupported()) { this->loader->unsupported(mach); } this->loader->saveMutex.unlock(); return false; const unsigned char * data = (unsigned char *)summary->m_data.constData(); ////////////////////////////////////////////////////////////////////////////////////////// // ASV Codes (Family 5) Recheck 17/10/2013 // These are all confirmed off Encore reports //cpapmax=EventDataType(data[0x02])/10.0; // Max Pressure in ASV machines //minepap=EventDataType(data[0x03])/10.0; // Min EPAP //maxepap=EventDataType(data[0x04])/10.0; // Max EPAP //minps=EventDataType(data[0x05])/10.0 // Min Pressure Support //maxps=EventDataType(data[0x06])/10.0 // Max Pressure Support //duration=data[0x1B] | data[0x1C] << 8) // Session length in seconds //epap90=EventDataType(data[0x21])/10.0; // EPAP 90% //epapavg=EventDataType(data[0x22])/10.0; // EPAP Average //ps90=EventDataType(data[0x23])/10.0; // Pressure Support 90% //psavg=EventDataType(data[0x24])/10.0; // Pressure Support Average //TODO: minpb=data[0x] | data[0x] << 8; // Minutes in PB //TODO: minleak=data[0x] | data[0x] << 8; // Minutes in Large Leak //TODO: oa_cnt=data[0x] | data[0x] << 8; // Obstructive events count //ca_cnt=data[0x2d] | data[0x2e] << 8; // Clear Airway Events count //h_cnt=data[0x2f] | data[0x30] << 8; // Hypopnea events count //fl_cnt=data[0x33] | data[0x34] << 8; // Flow Limitation events count //avg_leak=EventDataType(data[0x35]); // Average Leak //avgptb=EventDataType(data[0x36]); // Average Patient Triggered Breaths % //avgbreathrate=EventDataType(data[0x37]); // Average Breaths Per Minute //avgminvent=EventDataType(data[0x38]); // Average Minute Ventilation //avg_tidalvol=EventDataType(data[0x39])*10.0; // Average Tidal Volume ////////////////////////////////////////////////////////////////////////////////////////// //quint8 rectype = data[0x00]; EventDataType max, min; min = float(data[0x03]) / 10.0; // Min EPAP max = float(data[0x04]) / 10.0; // Max EPAP int offset = 0; int duration = 0; // This is a time value for ASV stuff if (summary->family == 5) { offset = 4; // non zero adds 4 extra fields.. if (summary->familyVersion == 0) { duration = data[0x1B] | data[0x1C] << 8; } } else if (summary->family == 0) { if (summary->familyVersion == 2) { duration = data[0x14] | data[0x15] << 8; } if (summary->familyVersion >= 4) { offset = 2; } } if (duration > 0) { session->set_last(qint64(summary->timestamp + duration) * 1000L); } if (!event) { session->setSummaryOnly(true); } // Minutes. Convert to seconds/hours here? session->settings[CPAP_RampTime] = (int)data[offset + 0x06]; session->settings[CPAP_RampPressure] = (EventDataType)data[offset + 0x07] / 10.0; if (max > 0) { // Ignoring bipap until we see some more data during import session->settings[CPAP_Mode] = (summary->family == 5) ? (int)MODE_ASV : (int)MODE_APAP; session->settings[CPAP_PressureMin] = (EventDataType)min; session->settings[CPAP_PressureMax] = (EventDataType)max; } else { session->settings[CPAP_Mode] = (int)MODE_CPAP; session->settings[CPAP_Pressure] = (EventDataType)min; } if (data[offset + 0x08] & 0x80) { // Flex Setting if (data[offset + 0x08] & 0x08) { if (max > 0) { if (summary->family == 5) { session->settings[PRS1_FlexMode] = (int)PR_BIFLEX; } else { session->settings[PRS1_FlexMode] = (int)PR_AFLEX; } } else { session->settings[PRS1_FlexMode] = (int)PR_CFLEXPLUS; } } else { session->settings[PRS1_FlexMode] = (int)PR_CFLEX; } } else { session->settings[PRS1_FlexMode] = (int)PR_NONE; } // Map the channels session->settings[PRS1_FlexLevel] = (int)(data[offset + 0x08] & 7); session->settings[PRS1_SysLock] = (data[offset + 0x0a] & 0x80) == 0x80; session->settings[PRS1_HoseDiam] = ((data[offset + 0x0a] & 0x08) ? "15mm" : "22mm"); session->settings[PRS1_AutoOff] = (data[offset + 0x0c] & 0x10) == 0x10; session->settings[PRS1_MaskAlert] = (data[offset + 0x0c] & 0x08) == 0x08; session->settings[PRS1_ShowAHI] = (data[offset + 0x0c] & 0x04) == 0x04; if (summary->family == 0 && summary->familyVersion >= 4) { if ((data[offset + 0x0a] & 0x04) == 0x04) { // heated tubing off session->settings[CPAP_HumidSetting] = (int)data[offset + 0x09] & 0x0f; } else { session->settings[CPAP_HumidSetting] = (int)(data[offset + 0x09] & 0x30) >> 4; } session->settings[PRS1_SysOneResistSet] = (int)(data[offset + 0x0b] & 0x38) >> 3; /* These should be added to channels, if they are correct(?) */ /* for now, leave commented out */ /* session->settings[PRS1_HeatedTubing]=(data[offset+0x0a]&0x04)!=0x04; session->settings[PRS1_HeatedTubingConnected]=(data[offset+0x0b]&0x01)==0x01; session->settings[PRS1_HeatedTubingTemp]=(int)(data[offset+0x09]&0x80)>>5 + (data[offset+0x0a]&0x03); */ } else { session->settings[CPAP_HumidSetting] = (int)data[offset + 0x09] & 0x0f; session->settings[PRS1_HumidStatus] = (data[offset + 0x09] & 0x80) == 0x80; session->settings[PRS1_SysOneResistStat] = (data[offset + 0x0a] & 0x40) == 0x40; session->settings[PRS1_SysOneResistSet] = (int)data[offset + 0x0a] & 7; } // Set recommended Graph values.. if (summary->family == 0 && summary->familyVersion == 0) { } return true; } bool PRS1Import::ParseEvents() { bool res = false; if (!event) return false; switch (event->family) { case 0: res = ParseF0Events(); break; case 5: res= ParseF5Events(); break; default: qDebug() << "Unknown PRS1 familyVersion" << event->familyVersion; return false; } if (res) { if (session->count(CPAP_IPAP) > 0) { // if (session->settings[CPAP_Mode].toInt() != (int)MODE_ASV) { // session->settings[CPAP_Mode] = MODE_BILEVEL_FIXED; // } // if (session->settings[CPAP_PresReliefType].toInt() != PR_NONE) { // session->settings[CPAP_PresReliefType] = PR_BIFLEX; // } // EventDataType min = session->settings[CPAP_PressureMin].toDouble(); // EventDataType max = session->settings[CPAP_PressureMax].toDouble(); // session->settings[CPAP_EPAP] = min; // session->settings[CPAP_IPAP] = max; // session->settings[CPAP_PS] = max - min; // session->settings.erase(session->settings.find(CPAP_PressureMin)); // session->settings.erase(session->settings.find(CPAP_PressureMax)); // session->m_valuesummary.erase(session->m_valuesummary.find(CPAP_Pressure)); // session->m_wavg.erase(session->m_wavg.find(CPAP_Pressure)); // session->m_min.erase(session->m_min.find(CPAP_Pressure)); // session->m_max.erase(session->m_max.find(CPAP_Pressure)); // session->m_gain.erase(session->m_gain.find(CPAP_Pressure)); } else { if (!session->settings.contains(CPAP_Pressure) && !session->settings.contains(CPAP_PressureMin)) { session->settings[CPAP_BrokenSummary] = true; //session->set_last(session->first()); if (session->Min(CPAP_Pressure) == session->Max(CPAP_Pressure)) { session->settings[CPAP_Mode] = MODE_CPAP; // no ramp session->settings[CPAP_Pressure] = session->Min(CPAP_Pressure); } else { session->settings[CPAP_Mode] = MODE_APAP; session->settings[CPAP_PressureMin] = session->Min(CPAP_Pressure); session->settings[CPAP_PressureMax] = 0; //session->Max(CPAP_Pressure); } //session->Set("FlexMode",PR_UNKNOWN); } } } return res; } bool PRS1Import::ParseOximetery() { int size = oximetery.size(); for (int i=0; i < size; ++i) { PRS1DataChunk * oxi = oximetery.at(i); int num = oxi->waveformInfo.size(); int size = oxi->m_data.size(); if (size == 0) { continue; } quint64 ti = quint64(oxi->timestamp) * 1000L; qint64 dur = qint64(oxi->duration) * 1000L; if (num > 1) { // Process interleaved samples QVector data; data.resize(num); int pos = 0; do { for (int n=0; n < num; n++) { int interleave = oxi->waveformInfo.at(n).interleave; data[n].append(oxi->m_data.mid(pos, interleave)); pos += interleave; } } while (pos < size); if (data[0].size() > 0) { EventList * pulse = session->AddEventList(OXI_Pulse, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / data[0].size()); pulse->AddWaveform(ti, (unsigned char *)data[0].data(), data[0].size(), dur); } if (data[1].size() > 0) { EventList * spo2 = session->AddEventList(OXI_SPO2, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / data[1].size()); spo2->AddWaveform(ti, (unsigned char *)data[1].data(), data[1].size(), dur); } } } return true; } bool PRS1Import::ParseWaveforms() { int size = waveforms.size(); for (int i=0; i < size; ++i) { PRS1DataChunk * waveform = waveforms.at(i); int num = waveform->waveformInfo.size(); int size = waveform->m_data.size(); if (size == 0) { continue; } quint64 ti = quint64(waveform->timestamp) * 1000L; qint64 dur = qint64(waveform->duration) * 1000L; if (num > 1) { // Process interleaved samples QVector data; data.resize(num); int pos = 0; do { for (int n=0; n < num; n++) { int interleave = waveform->waveformInfo.at(n).interleave; data[n].append(waveform->m_data.mid(pos, interleave)); pos += interleave; } } while (pos < size); if (data[0].size() > 0) { EventList * flow = session->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / data[0].size()); flow->AddWaveform(ti, (char *)data[0].data(), data[0].size(), dur); } if (data[1].size() > 0) { EventList * pres = session->AddEventList(CPAP_MaskPressureHi, EVL_Waveform, 0.1, 0.0, 0.0, 0.0, dur / data[1].size()); pres->AddWaveform(ti, (unsigned char *)data[1].data(), data[1].size(), dur); } } else { // Non interleaved, so can process it much faster EventList * flow = session->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / waveform->m_data.size()); flow->AddWaveform(ti, (char *)waveform->m_data.data(), waveform->m_data.size(), dur); } } return true; } void PRS1Import::run() { if (mach->unsupported()) return; session = new Session(mach, sessionid); if ((compliance && ParseCompliance()) || (summary && ParseSummary())) { if (event && !ParseEvents()) { } waveforms = loader->ParseFile(wavefile); ParseWaveforms(); oximetery = loader->ParseFile(oxifile); ParseOximetery(); if (session->first() > 0) { if (session->last() < session->first()) { // if last isn't set, duration couldn't be gained from summary, parsing events or waveforms.. // This session is dodgy, so kill it session->setSummaryOnly(true); session->really_set_last(session->first()+(qint64(summary_duration) * 1000L)); } session->SetChanged(true); loader->addSession(session); // Update indexes, process waveform and perform flagging session->UpdateSummaries(); // Save is not threadsafe loader->saveMutex.lock(); session->Store(mach->getDataPath()); loader->saveMutex.unlock(); session->TrashEvents(); } } } QList PRS1Loader::ParseFile(QString path) { QList CHUNKS; if (path.isEmpty()) return CHUNKS; QFile f(path); if (!f.exists()) { return CHUNKS; } if (!f.open(QIODevice::ReadOnly)) { return CHUNKS; } PRS1DataChunk *chunk = nullptr, *lastchunk = nullptr; quint16 blocksize; quint16 wvfm_signals; unsigned char * header; int cnt = 0; int lastheadersize = 0; int lastblocksize = 0; int cruft = 0; int firstsession = 0; do { QByteArray headerBA = f.read(16); if (headerBA.size() != 16) { break; } header = (unsigned char *)headerBA.data(); blocksize = (header[2] << 8) | header[1]; if (blocksize == 0) break; chunk = new PRS1DataChunk(); chunk->sessionid = (header[10] << 24) | (header[9] << 16) | (header[8] << 8) | header[7]; if (!firstsession) { firstsession = chunk->sessionid; } chunk->fileVersion = header[0]; chunk->htype = header[3]; // 00 = normal ?? // 01=waveform ?? // could be a bool signifying extra header bytes? chunk->family = header[4]; chunk->familyVersion = header[5]; chunk->ext = header[6]; chunk->timestamp = (header[14] << 24) | (header[13] << 16) | (header[12] << 8) | header[11]; if (lastchunk != nullptr) { if ((lastchunk->fileVersion != chunk->fileVersion) && (lastchunk->ext != chunk->ext) && (lastchunk->family != chunk->family) && (lastchunk->familyVersion != chunk->familyVersion) && (lastchunk->htype != chunk->htype)) { QByteArray junk = f.read(lastblocksize - 16); Q_UNUSED(junk) if (lastchunk->ext == 5) { // The data is random crap // lastchunk->m_data.append(junk.mid(lastheadersize-16)); } delete chunk; ++cruft; if (cruft > 3) break; continue; // Corrupt header.. skip it. } } int diff = 0; ////////////////////////////////////////////////////////// // Waveform Header ////////////////////////////////////////////////////////// if ((chunk->ext == 5) || (chunk->ext == 6)) { // Get extra 8 bytes in waveform header. QByteArray extra = f.read(4); if (extra.size() != 4) { delete chunk; break; } headerBA.append(extra); // Get the header address again to be safe header = (unsigned char *)headerBA.data(); chunk->duration = header[0x0f] | header[0x10] << 8; wvfm_signals = header[0x12] | header[0x13] << 8; int sbsize = wvfm_signals * 3 + 1; QByteArray sbextra = f.read(sbsize); if (sbextra.size() != sbsize) { delete chunk; break; } headerBA.append(sbextra); header = (unsigned char *)headerBA.data(); // Read the waveform information in reverse. int pos = 0x14 + (wvfm_signals - 1) * 3; for (int i = 0; i < wvfm_signals; ++i) { quint16 interleave = header[pos] | header[pos + 1] << 8; quint8 sample_format = header[pos + 2]; chunk->waveformInfo.push_back(PRS1Waveform(interleave, sample_format)); pos -= 3; } if (lastchunk != nullptr) { diff = (chunk->timestamp - lastchunk->timestamp) - lastchunk->duration; } } int headersize = headerBA.size(); lastblocksize = blocksize; lastheadersize = headersize; blocksize -= headersize; // Check header checksum quint8 csum = 0; for (int i=0; i < headersize-1; ++i) csum += header[i]; if (csum != header[headersize-1]) { // header checksum error. delete chunk; return CHUNKS; } // Read data block chunk->m_data = f.read(blocksize); if (chunk->m_data.size() < blocksize) { delete chunk; break; } // last two bytes contain crc16 checksum. int ds = chunk->m_data.size(); quint16 crc16 = chunk->m_data.at(ds-2) | chunk->m_data.at(ds-1) << 8; chunk->m_data.chop(2); #ifdef PRS1_CRC_CHECK // This fails.. it needs to include the header! quint16 calc16 = CRC16((unsigned char *)chunk->m_data.data(), chunk->m_data.size()); if (calc16 != crc16) { // corrupt data block.. bleh.. // qDebug() << "CRC16 doesn't match for chunk" << chunk->sessionid << "for" << path; } #endif if ((chunk->ext == 5) || (chunk->ext == 6)){ if (lastchunk != nullptr) { Q_ASSERT(lastchunk->sessionid == chunk->sessionid); if (diff == 0) { // In sync, so append waveform data to previous chunk lastchunk->m_data.append(chunk->m_data); lastchunk->duration += chunk->duration; delete chunk; cnt++; chunk = lastchunk; continue; } // else start a new chunk to resync } } CHUNKS.append(chunk); lastchunk = chunk; cnt++; } while (!f.atEnd()); return CHUNKS; } void InitModelMap() { ModelMap[0x34] = "RemStar Pro with C-Flex+"; // 450/460P ModelMap[0x35] = "RemStar Auto with A-Flex"; // 550/560P ModelMap[0x36] = "RemStar BiPAP Pro with Bi-Flex"; ModelMap[0x37] = "RemStar BiPAP Auto with Bi-Flex"; ModelMap[0x38] = "RemStar Plus :("; // 150/250P/260P ModelMap[0x41] = "BiPAP autoSV Advanced"; ModelMap[0x4a] = "BiPAP autoSV Advanced 60 Series"; ModelMap[0x4E] = "BiPAP AVAPS"; } bool initialized = false; using namespace schema; Channel PRS1Channels; void PRS1Loader::initChannels() { Channel * chan = nullptr; channel.add(GRP_CPAP, new Channel(CPAP_PressurePulse = 0x1009, MINOR_FLAG, MT_CPAP, SESSION, "PressurePulse", QObject::tr("Pressure Pulse"), QObject::tr("A pulse of pressure 'pinged' to detect a closed airway."), QObject::tr("PP"), STR_UNIT_EventsPerHour, DEFAULT, QColor("dark red"))); channel.add(GRP_CPAP, chan = new Channel(PRS1_FlexMode = 0xe105, SETTING, MT_CPAP, SESSION, "PRS1FlexMode", QObject::tr("Flex Mode"), QObject::tr("PRS1 pressure relief mode."), QObject::tr("Flex Mode"), "", LOOKUP, Qt::green)); chan->addOption(FLEX_None, STR_TR_None); chan->addOption(FLEX_CFlex, QObject::tr("C-Flex")); chan->addOption(FLEX_CFlexPlus, QObject::tr("C-Flex+")); chan->addOption(FLEX_AFlex, QObject::tr("A-Flex")); chan->addOption(FLEX_RiseTime, QObject::tr("Rise Time")); chan->addOption(FLEX_BiFlex, QObject::tr("Bi-Flex")); channel.add(GRP_CPAP, chan = new Channel(PRS1_FlexLevel = 0xe106, SETTING, MT_CPAP, SESSION, "PRS1FlexSet", QObject::tr("Flex Level"), QObject::tr("PRS1 pressure relief setting."), QObject::tr("Flex Level"), "", LOOKUP, Qt::blue)); chan->addOption(0, STR_TR_Off); chan->addOption(1, QObject::tr("x1")); chan->addOption(2, QObject::tr("x2")); chan->addOption(3, QObject::tr("x3")); chan->addOption(4, QObject::tr("x4")); chan->addOption(5, QObject::tr("x5")); channel.add(GRP_CPAP, chan = new Channel(PRS1_HumidStatus = 0xe101, SETTING, MT_CPAP, SESSION, "PRS1HumidStat", QObject::tr("Humidifier Status"), QObject::tr("PRS1 humidifier connected?"), QObject::tr("Humidifier Status"), "", LOOKUP, Qt::green)); chan->addOption(0, QObject::tr("Disconnected")); chan->addOption(1, QObject::tr("Connected")); channel.add(GRP_CPAP, chan = new Channel(PRS1_HeatedTubing = 0xe10d, SETTING, MT_CPAP, SESSION, "PRS1HeatedTubing", QObject::tr("Heated Tubing"), QObject::tr("Heated Tubing Connected"), QObject::tr("Headed Tubing"), "", LOOKUP, Qt::green)); chan->addOption(0, QObject::tr("Yes")); chan->addOption(1, QObject::tr("No")); channel.add(GRP_CPAP, chan = new Channel(PRS1_HumidLevel = 0xe102, SETTING, MT_CPAP, SESSION, "PRS1HumidLevel", QObject::tr("Humidification Level"), QObject::tr("PRS1 Humidification level"), QObject::tr("Humid. Lvl."), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, QObject::tr("x1")); chan->addOption(2, QObject::tr("x2")); chan->addOption(3, QObject::tr("x3")); chan->addOption(4, QObject::tr("x4")); chan->addOption(5, QObject::tr("x5")); channel.add(GRP_CPAP, chan = new Channel(PRS1_SysOneResistStat = 0xe103, SETTING, MT_CPAP, SESSION, "SysOneResistStat", QObject::tr("System One Resistance Status"), QObject::tr("System One Resistance Status"), QObject::tr("Sys1 Resist. Status"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, STR_TR_On); channel.add(GRP_CPAP, chan = new Channel(PRS1_SysOneResistSet = 0xe104, SETTING, MT_CPAP, SESSION, "SysOneResistSet", QObject::tr("System One Resistance Setting"), QObject::tr("System One Mask Resistance Setting"), QObject::tr("Sys1 Resist. Set"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, QObject::tr("x1")); chan->addOption(2, QObject::tr("x2")); chan->addOption(3, QObject::tr("x3")); chan->addOption(4, QObject::tr("x4")); chan->addOption(5, QObject::tr("x5")); channel.add(GRP_CPAP, chan = new Channel(PRS1_HoseDiam = 0xe107, SETTING, MT_CPAP, SESSION, "PRS1HoseDiam", QObject::tr("Hose Diameter"), QObject::tr("Diameter of primary CPAP hose"), QObject::tr("Hose Diameter"), "", LOOKUP, Qt::green)); chan->addOption(0, QObject::tr("22mm")); chan->addOption(1, QObject::tr("15mm")); channel.add(GRP_CPAP, chan = new Channel(PRS1_SysOneResistStat = 0xe108, SETTING, MT_CPAP, SESSION, "SysOneLock", QObject::tr("System One Resistance Lock"), QObject::tr("Whether System One resistance settings are available to you."), QObject::tr("Sys1 Resist. Lock"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, STR_TR_On); channel.add(GRP_CPAP, chan = new Channel(PRS1_AutoOn = 0xe109, SETTING, MT_CPAP, SESSION, "PRS1AutoOn", QObject::tr("Auto On"), QObject::tr("A few breaths automatically starts machine"), QObject::tr("Auto On"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, STR_TR_On); channel.add(GRP_CPAP, chan = new Channel(PRS1_AutoOff = 0xe10a, SETTING, MT_CPAP, SESSION, "PRS1AutoOff", QObject::tr("Auto Off"), QObject::tr("Machine automatically switches off"), QObject::tr("Auto Off"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, STR_TR_On); channel.add(GRP_CPAP, chan = new Channel(PRS1_MaskAlert = 0xe10b, SETTING, MT_CPAP, SESSION, "PRS1MaskAlert", QObject::tr("Mask Alert"), QObject::tr("Whether or not machine allows Mask checking."), QObject::tr("Mask Alert"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, STR_TR_On); channel.add(GRP_CPAP, chan = new Channel(PRS1_MaskAlert = 0xe10c, SETTING, MT_CPAP, SESSION, "PRS1ShowAHI", QObject::tr("Show AHI"), QObject::tr("Whether or not machine shows AHI via LCD panel."), QObject::tr("Show AHI"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, STR_TR_On); // // QString unknowndesc=QObject::tr("Unknown PRS1 Code %1"); QString unknownname=QObject::tr("PRS1_%1"); QString unknownshort=QObject::tr("PRS1_%1"); channel.add(GRP_CPAP, new Channel(PRS1_00 = 0x1150, UNKNOWN, MT_CPAP, SESSION, "PRS1_00", QString(unknownname).arg(0,2,16,QChar('0')), QString(unknowndesc).arg(0,2,16,QChar('0')), QString(unknownshort).arg(0,2,16,QChar('0')), STR_UNIT_Unknown, DEFAULT, QColor("black"))); channel.add(GRP_CPAP, new Channel(PRS1_01 = 0x1151, UNKNOWN, MT_CPAP, SESSION, "PRS1_01", QString(unknownname).arg(1,2,16,QChar('0')), QString(unknowndesc).arg(1,2,16,QChar('0')), QString(unknownshort).arg(1,2,16,QChar('0')), STR_UNIT_Unknown, DEFAULT, QColor("black"))); channel.add(GRP_CPAP, new Channel(PRS1_08 = 0x1152, UNKNOWN, MT_CPAP, SESSION, "PRS1_08", QString(unknownname).arg(8,2,16,QChar('0')), QString(unknowndesc).arg(8,2,16,QChar('0')), QString(unknownshort).arg(8,2,16,QChar('0')), STR_UNIT_Unknown, DEFAULT, QColor("black"))); channel.add(GRP_CPAP, new Channel(PRS1_0A = 0x1154, UNKNOWN, MT_CPAP, SESSION, "PRS1_0A", QString(unknownname).arg(0xa,2,16,QChar('0')), QString(unknowndesc).arg(0xa,2,16,QChar('0')), QString(unknownshort).arg(0xa,2,16,QChar('0')), STR_UNIT_Unknown, DEFAULT, QColor("black"))); channel.add(GRP_CPAP, new Channel(PRS1_0B = 0x1155, UNKNOWN, MT_CPAP, SESSION, "PRS1_0B", QString(unknownname).arg(0xb,2,16,QChar('0')), QString(unknowndesc).arg(0xb,2,16,QChar('0')), QString(unknownshort).arg(0xb,2,16,QChar('0')), STR_UNIT_Unknown, DEFAULT, QColor("black"))); channel.add(GRP_CPAP, new Channel(PRS1_0C = 0x1156, UNKNOWN, MT_CPAP, SESSION, "PRS1_0C", QString(unknownname).arg(0xc,2,16,QChar('0')), QString(unknowndesc).arg(0xc,2,16,QChar('0')), QString(unknownshort).arg(0xc,2,16,QChar('0')), STR_UNIT_Unknown, DEFAULT, QColor("black"))); channel.add(GRP_CPAP, new Channel(PRS1_0E = 0x1157, UNKNOWN, MT_CPAP, SESSION, "PRS1_0E", QString(unknownname).arg(0xe,2,16,QChar('0')), QString(unknowndesc).arg(0xe,2,16,QChar('0')), QString(unknownshort).arg(0xe,2,16,QChar('0')), STR_UNIT_Unknown, DEFAULT, QColor("black"))); // channel.add(GRP_CPAP, new Channel(PRS1_12 = 0x1159, UNKNOWN, MT_CPAP, SESSION, // "PRS1_12", // QString(unknownname).arg(0x12,2,16,QChar('0')), // QString(unknowndesc).arg(0x12,2,16,QChar('0')), // QString(unknownshort).arg(0x12,2,16,QChar('0')), // STR_UNIT_Unknown, // DEFAULT, QColor("black"))); channel.add(GRP_CPAP, new Channel(PRS1_TimedBreath = 0x1180, MINOR_FLAG, MT_CPAP, SESSION, "PRS1TimedBreath", QObject::tr("Timed Breath"), QObject::tr("Machine Initiated Breath"), QObject::tr("TB"), STR_UNIT_Unknown, DEFAULT, QColor("black"))); } void PRS1Loader::Register() { if (initialized) { return; } qDebug() << "Registering PRS1Loader"; RegisterLoader(new PRS1Loader()); InitModelMap(); initialized = true; } /* Thanks SleepyCPAP :) CODE ERROR DESCRIPTION ERROR TYPE ERROR CATEGORY 1 SOFTWARE STOP STOP General Errors 2 Not Used General Errors 3 INT RAM REBOOT General Errors 4 NULL PTR REBOOT General Errors 5 DATA REBOOT General Errors 6 STATE MACHINE REBOOT General Errors 7 SOFTWARE REBOOT General Errors 8-9 Not Used General Errors 10 WDOG TEST RAM REBOOT Watchdog & Timer Errors 11 WDOG TEST REBOOT Watchdog & Timer Errors 12 BACKGROUND WDOG NO CARD REBOOT Watchdog & Timer Errors 13 BACKGROUND WDOG SD CARD REBOOT Watchdog & Timer Errors 14 WDOG LOWRES TIMER REBOOT Watchdog & Timer Errors 15 CYCLE HANDLER OVERRUN REBOOT Watchdog & Timer Errors 16 RASP RESTORE TIMEOUT CONTINUE Watchdog & Timer Errors 17 ONEMS HANDLER OVERRUN REBOOT Watchdog & Timer Errors 18 Not Used Watchdog & Timer Errors 19 WDOG TIMEOUT REBOOT Watchdog & Timer Errors 20 MOTOR SPINUP FLUX LOW REBOOT Motor/Blower Errors 21 MOTOR VBUS HIGH STOP Motor/Blower Errors 22 MOTOR FLUX MAGNITUDE REBOOT Motor/Blower Errors 23 MOTOR OVERSPEED REBOOT Motor/Blower Errors 24 MOTOR SPEED REVERSE REBOOT Motor/Blower Errors 25 MOTOR THERMISTOR OPEN CONTINUE Motor/Blower Errors 26 MOTOR THERMISTOR SHORTED CONTINUE Motor/Blower Errors 27 MOTOR RL NOCONVERGE STOP Motor/Blower Errors 28 NEGATIVE QUADRATURE VOLTAGE VECTOR REBOOT Motor/Blower Errors 29 VBUS GAIN ZERO: REBOOT Motor/Blower Errors 30 MOTOR SPINUP FLUX HIGH REBOOT Motor/Blower Errors 31 (incorrect power supply - 60series) Motor/Blower Errors 32-39 Not Used Motor/Blower Errors 40 NVRAM REBOOT NVRAM Low Level Errors 41 STORAGE UNIT RAM REBOOT NVRAM Low Level Errors 42 UNABLE TO OBTAIN BUS REBOOT NVRAM Low Level Errors 43 NVRAM NO CALLBACK OCCURRED REBOOT NVRAM Low Level Errors 44 NV BUFFER NULL REBOOT NVRAM Low Level Errors 45 NV CALLBACK NULL REBOOT NVRAM Low Level Errors 46 NV ZERO LENGTH REBOOT NVRAM Low Level Errors 47 NVRAM INVALID BYTES XFRRED REBOOT NVRAM Low Level Errors 48-49 Not Used NVRAM Low Level Errors 50 DAILY VALUES CORRUPT LOG ONLY NVRAM Unit Related Errors 51 CORRUPT COMPLIANCE LOG CONTINUE NVRAM Unit Related Errors 52 CORRUPT COMPLIANCE CB CONTINUE NVRAM Unit Related Errors 53 COMP LOG SEM TIMEOUT CONTINUE NVRAM Unit Related Errors 54 COMPLOG REQS OVERFLOW REBOOT NVRAM Unit Related Errors 55 THERAPY QUEUE FULL CONTINUE NVRAM Unit Related Errors 56 COMPLOG PACKET STATUS REBOOT NVRAM Unit Related Errors 57 SESS OBS QUEUE OVF REBOOT NVRAM Unit Related Errors 58 SESS OBS NO CALLBACK REBOOT NVRAM Unit Related Errors 59 Not Used NVRAM Unit Related Errors 60 UNSUPPORTED HARDWARE REBOOT General Hardware Errors 61 PLL UNLOCKED REBOOT General Hardware Errors 62 STUCK RAMP KEY CONTINUE General Hardware Errors 63 STUCK KNOB KEY CONTINUE General Hardware Errors 64 DSP OVERTIME PWM REBOOT General Hardware Errors 65 STUCK ENCODER A CONTINUE General Hardware Errors 66 STUCK ENCODER B CONTINUE General Hardware Errors 67-69 Not Used General Hardware Errors 70 PRESSURE SENSOR ABSENT STOP Pressure Sensor Errors 71 Not Used Pressure Sensor Errors 72 PSENS UNABLE TO OBTAIN BUS REBOOT Pressure Sensor Errors 73 SENSOR PRESS OFFSET STOP STOP Pressure Sensor Errors 74-79 Not Used Pressure Sensor Errors 80 UNABLE TO INIT FLOW SENSOR REBOOT Flow Sensor Errors 81 FLOW SENSOR TABLE CONTINUE Flow Sensor Errors 82 FLOW SENSOR OFFSET CONTINUE Flow Sensor Errors 83 FSENS UNABLE TO OBTAIN BUS REBOOT / 2nd failure=STOP Flow Sensor Errors 84 FLOW SENSOR STOP STOP Flow Sensor Errors 85 FLOW SENSOR OCCLUDED CONTINUE Flow Sensor Errors 86 FLOW SENSOR ABSENT CONTINUE Flow Sensor Errors 87 FLOW SENSOR BUS CONTINUE Flow Sensor Errors 88-89 Not Used Flow Sensor Errors 90 OTP NOT CONFIGURED STOP OTP & RTC Errors 91 OTP INCORRECTLY CONFIGURED STOP OTP & RTC Errors 92 Not Used OTP & RTC Errors 93 RTC VALUE CONTINUE OTP & RTC Errors 94 RTC STOPPED CONTINUE OTP & RTC Errors 95-99 Not Used OTP & RTC Errors 100 HUMID NO HEAT CONTINUE Humidifier Errors 101 HUMID TEMP MAX STOP Humidifier Errors 102 THERMISTOR HIGH CONTINUE Humidifier Errors 103 THERMISTOR LOW CONTINUE Humidifier Errors 104 HUMID AMBIENT OFF CONTINUE Humidifier Errors 105 HUMID AMBIENT COMM CONTINUE Humidifier Errors 106-109 Not Used Humidifier Errors 110 STACK REBOOT Stack & Exception Handler Errors 111 EXCEPTION STACK OVERFLOW REBOOT Stack & Exception Handler Errors 112 EXCEPTION STACK RESERVE LOG ONLY Stack & Exception Handler Errors 113 EXCEPTION STACK UNDERFLOW REBOOT Stack & Exception Handler Errors 114 FIQ STACK OVERFLOW REBOOT Stack & Exception Handler Errors 115 FIQ STACK RESERVE LOG ONLY Stack & Exception Handler Errors 116 FIQ STACK UNDERFLOW REBOOT Stack & Exception Handler Errors 117 IRQ STACK OVERFLOW REBOOT Stack & Exception Handler Errors 118 IRQ STACK RESERVE LOG ONLY Stack & Exception Handler Errors 119 IRQ STACK UNDERFLOW REBOOT Stack & Exception Handler Errors 120 SVC STACK OVERFLOW REBOOT Stack & Exception Handler Errors 121 SVC STACK RESERVE LOG ONLY Stack & Exception Handler Errors 122 SVC STACK UNDERFLOW REBOOT Stack & Exception Handler Errors 123 DATA ABORT EXCEPTION REBOOT Stack & Exception Handler Errors 124 PREFETCH EXCEPTION REBOOT Stack & Exception Handler Errors 125 ILLEGAL INSTRUCTION EXCEPTION REBOOT Stack & Exception Handler Errors 126 SWI ABORT EXCEPTION REBOOT Stack & Exception Handler Errors */ sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/icon_loader.cpp0000644000175000017500000006203012412506713025032 0ustar sergiosergio/* SleepLib Fisher & Paykel Icon Loader Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include "icon_loader.h" extern QProgressBar *qprogress; const QString FPHCARE = "FPHCARE"; FPIcon::FPIcon(MachineID id) : CPAP(id) { } FPIcon::~FPIcon() { } FPIconLoader::FPIconLoader() { m_buffer = nullptr; m_type = MT_CPAP; } FPIconLoader::~FPIconLoader() { } bool FPIconLoader::Detect(const QString & givenpath) { QDir dir(givenpath); if (!dir.exists()) { return false; } // F&P Icon have a folder called FPHCARE in the root directory if (!dir.exists(FPHCARE)) { return false; } // CHECKME: I can't access F&P ICON data right now if (!dir.exists("FPHCARE/ICON")) { return false; } return true; } int FPIconLoader::Open(QString path) { QString newpath; path = path.replace("\\", "/"); if (path.endsWith("/")) { path.chop(1); } if (path.endsWith("/" + FPHCARE)) { newpath = path; } else { newpath = path + "/" + FPHCARE; } newpath += "/ICON/"; QString filename; QDir dir(newpath); if ((!dir.exists() || !dir.isReadable())) { return -1; } dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); QFileInfoList flist = dir.entryInfoList(); QStringList SerialNumbers; bool ok; for (int i = 0; i < flist.size(); i++) { QFileInfo fi = flist.at(i); QString filename = fi.fileName(); filename.toInt(&ok); if (ok) { SerialNumbers.push_back(filename); } } Machine *m; QString npath; int c = 0; for (int i = 0; i < SerialNumbers.size(); i++) { MachineInfo info = newInfo(); info.serial = SerialNumbers[i]; m = CreateMachine(info); npath = newpath + "/" + info.serial; try { if (m) { c+=OpenMachine(m, npath); } } catch (OneTypePerDay e) { Q_UNUSED(e) p_profile->DelMachine(m); MachList.erase(MachList.find(info.serial)); QMessageBox::warning(nullptr, tr("Import Error"), tr("This Machine Record cannot be imported in this profile.")+"\n\n"+tr("The Day records overlap with already existing content."), QMessageBox::Ok); delete m; } } return c; } struct FPWaveChunk { FPWaveChunk() { st = 0; duration = 0; flow = nullptr; pressure = nullptr; leak = nullptr; file = 0; } FPWaveChunk(qint64 start, qint64 dur, int f) { st = start; duration = dur; file = f, flow = nullptr; leak = nullptr; pressure = nullptr; } FPWaveChunk(const FPWaveChunk ©) { st = copy.st; duration = copy.duration; flow = copy.flow; leak = copy.leak; pressure = copy.pressure; file = copy.file; } qint64 st; qint64 duration; int file; EventList *flow; EventList *leak; EventList *pressure; }; bool operator<(const FPWaveChunk &a, const FPWaveChunk &b) { return (a.st < b.st); } int FPIconLoader::OpenMachine(Machine *mach, QString &path) { qDebug() << "Opening FPIcon " << path; QDir dir(path); if (!dir.exists() || (!dir.isReadable())) { return -1; } dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); QFileInfoList flist = dir.entryInfoList(); QString filename, fpath; if (qprogress) { qprogress->setValue(0); } QStringList summary, log, flw, det; Sessions.clear(); for (int i = 0; i < flist.size(); i++) { QFileInfo fi = flist.at(i); filename = fi.fileName(); fpath = path + "/" + filename; if (filename.left(3).toUpper() == "SUM") { summary.push_back(fpath); OpenSummary(mach, fpath); } else if (filename.left(3).toUpper() == "DET") { det.push_back(fpath); } else if (filename.left(3).toUpper() == "FLW") { flw.push_back(fpath); } else if (filename.left(3).toUpper() == "LOG") { log.push_back(fpath); } } for (int i = 0; i < det.size(); i++) { OpenDetail(mach, det[i]); } for (int i = 0; i < flw.size(); i++) { OpenFLW(mach, flw[i]); } SessionID sid;//,st; float hours, mins; qDebug() << "Last 20 Sessions"; int cnt = 0; QDateTime dt; QString a; if (Sessions.size() > 0) { QMap::iterator it = Sessions.end(); it--; dt = QDateTime::fromTime_t(qint64(it.value()->first()) / 1000L); QDate date = dt.date().addDays(-7); it++; do { it--; Session *sess = it.value(); sid = sess->session(); hours = sess->hours(); mins = hours * 60; dt = QDateTime::fromTime_t(sid); if (sess->channelDataExists(CPAP_FlowRate)) { a = "(flow)"; } else { a = ""; } qDebug() << cnt << ":" << dt << "session" << sid << "," << mins << "minutes" << a; if (dt.date() < date) { break; } ++cnt; } while (it != Sessions.begin()); } // qDebug() << "Unmatched Sessions"; // QList chunks; // for (QMap::iterator dit=FLWDate.begin();dit!=FLWDate.end();dit++) { // int k=dit.key(); // //QDate date=dit.value(); //// QList values = SessDate.values(date); // for (int j=0;jchannelDataExists(CPAP_FlowRate)) c=true; // } // qDebug() << k << "-" <channelDataExists(CPAP_FlowRate)) c=true; // } // qDebug() << chunk.file << ":" << i << zz << dur << "minutes" << (b ? "*" : "") << (c ? QDateTime::fromTime_t(zz).toString() : ""); // } int c = Sessions.size(); finishAddingSessions(); mach->Save(); return c; } // !\brief Convert F&P 32bit date format to 32bit UNIX Timestamp quint32 convertDate(quint32 timestamp) { quint16 day, month,hour=0, minute=0, second=0; quint16 year; day = timestamp & 0x1f; month = (timestamp >> 5) & 0x0f; year = 2000 + ((timestamp >> 9) & 0x3f); timestamp >>= 15; second = timestamp & 0x3f; minute = (timestamp >> 6) & 0x3f; hour = (timestamp >> 12); QDateTime dt = QDateTime(QDate(year, month, day), QTime(hour, minute, second),Qt::UTC); // Q_ASSERT(dt.isValid()); // if ((year == 2013) && (month == 9) && (day == 18)) { // // this is for testing.. set a breakpoint on here and // int i=5; // } // From Rudd's data set compared to times reported from his F&P software's report (just the time bits left over) // 90514 = 00:06:18 WET 23:06:18 UTC 09:06:18 AEST // 94360 = 01:02:24 WET // 91596 = 00:23:12 WET // 19790 = 23:23:50 WET return dt.addSecs(-54).toTime_t(); } quint32 convertFLWDate(quint32 timestamp) // Bit format: hhhhhmmmmmmssssssYYYYYYMMMMDDDDD { quint16 day, month, hour, minute, second; quint16 year; day = timestamp & 0x1f; month = (timestamp >> 5) & 0x0f; year = 2000 + ((timestamp >> 9) & 0x3f); timestamp >>= 15; second = timestamp & 0x3f; minute = (timestamp >> 6) & 0x3f; hour = (timestamp >> 12); QDateTime dt = QDateTime(QDate(year, month, day), QTime(hour, minute, second), Qt::UTC); if(!dt.isValid()){ dt = QDateTime(QDate(2015,1,1), QTime(0,0,1)); } // Q_ASSERT(dt.isValid()); // if ((year == 2013) && (month == 9) && (day == 18)) { // int i=5; // } // 87922 23:23:50 WET return dt.addSecs(-54).toTime_t(); } //QDateTime FPIconLoader::readFPDateTime(quint8 *data) //{ // quint32 ts = (data[3] << 24) | (data[2] << 16) | ((data[1] << 8) | data[0]); // ^ 0xc00000; // // 0x20a41b18 // quint8 day = ts & 0x1f; // 0X18 24 // ts >>= 5; // 10520D8 // quint8 month = ts & 0x0f; // 0X08 8 // ts >>= 4; // 10520D // quint8 year = ts & 0x3f; // 0X0D 13 // ts >>= 6; // 4148 // quint8 second = ts & 0x3f; // 0X08 8 // ts >>= 6; // 20A // quint8 minute = ts & 0x3f; // 0A 10 // ts >>= 6; // 10 // quint8 hour = ts & 0x1f; // 10 16 // QDate date = QDate(2000 + year, month, day); // QTime time = QTime(hour, minute, second); // QDateTime datetime = QDateTime(date, time, Qt::UTC); // return datetime; //} /* *in >> a1; in >> a2; t1=a2 << 8 | a1; if (t1==0xfafe) break; day=t1 & 0x1f; month=(t1 >> 5) & 0x0f; year=2000+((t1 >> 9) & 0x3f); in >> a1; in >> a2; ts=((a2 << 8) | a1) << 1; ts|=(t1 >> 15) & 1; second=(ts & 0x3f); minute=(ts >> 6) & 0x3f; hour=(ts >> 12) & 0x1f; */ // FLW Header Structure // 0x0000-0x01fe // newline (0x0d) seperated list of machine information strings. // magic? 0201 // version 1.5.0 // serial number 12 digits // Machine Series "ICON" // Machine Model "Auto" // Remainder of header is 0 filled... // 0x01ff 8 bit additive sum checksum byte of previous header bytes // 0x0200-0x0203 32bit timestamp in bool FPIconLoader::OpenFLW(Machine *mach, QString filename) { Q_UNUSED(mach); quint32 ts; double ti; EventList *flow = nullptr, * pressure = nullptr; qDebug() << filename; QFile file(filename); if (!file.open(QFile::ReadOnly)) { qDebug() << "Couldn't open" << filename; return false; } QByteArray header = file.read(0x200); if (header.size() != 0x200) { qDebug() << "Short file" << filename; return false; } unsigned char hsum = 0x0; for (int i = 0; i < 0x1ff; i++) { hsum ^= header[i]; } if (hsum != header[0x1ff]) { qDebug() << "Header checksum mismatch" << filename; } QTextStream htxt(&header); QString h1, version, fname, serial, model, type; htxt >> h1; htxt >> version; htxt >> fname; htxt >> serial; htxt >> model; htxt >> type; if (mach->model().isEmpty()) { mach->setModel(model+" "+type); } QByteArray buf = file.read(4); unsigned char * data = (unsigned char *)buf.data(); quint32 t2 = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24; // this line is probably superflous crud. if (t2 == 0xffffffff) return false; QByteArray block = file.readAll(); file.close(); data = (unsigned char *)block.data(); // Abort if crapy if (!(data[103]==0xff && data[104]==0xff)) return false; ts = convertFLWDate(t2); if (ts > QDateTime(QDate(2015,1,1), QTime(0,0,0)).toTime_t()) { return false; } ti = qint64(ts) * 1000L; QMap::iterator sit = Sessions.find(ts); Session *sess; bool newsess = false; if (sit != Sessions.end()) { sess = sit.value(); // qDebug() << filenum << ":" << date << sess->session() << ":" << sess->hours() * 60.0; } else { // Create a session qint64 k = -1; Session *s1 = nullptr; sess = nullptr; sit = Sessions.end(); if (Sessions.begin() != sit) { do { sit--; s1 = sit.value(); qint64 z = qAbs(qint64(sit.key()) - qint64(ts)); if (z < 3600) { if ((k < 0) || (k > z)) { k = z; sess = s1; } } } while (sit != Sessions.begin()); } if (sess) { sess->set_first(ti); sess->setFirst(CPAP_FlowRate, ti); sess->setFirst(CPAP_MaskPressure, ti); } else { sess = new Session(mach, ts); sess->set_first(ti); sess->setFirst(CPAP_FlowRate, ti); sess->setFirst(CPAP_MaskPressure, ti); newsess = true; // qDebug() << filenum << ":" << date << "couldn't find matching session for" << ts; } } const int samples_per_block = 50; const double rate = 1000.0 / double(samples_per_block); // F&P Overwrites this file, not appends to it. flow = new EventList(EVL_Waveform, 1.0F, 0, 0, 0, rate); pressure = new EventList(EVL_Event, 0.01F, 0, 0, 0, rate * double(samples_per_block)); flow->setFirst(ti); pressure->setFirst(ti); quint16 endMarker; qint8 offset; // offset from center for this block quint16 pres; // mask pressure qint16 tmp; qint16 samples[samples_per_block]; EventDataType val; unsigned char *p = data; int datasize = block.size(); unsigned char *end = data+datasize; do { endMarker = *((quint16 *)p); if (endMarker == 0xffff) { p += 2; continue; } if (endMarker == 0x7fff) { break; } offset = ((qint8*)p)[102]; for (int i=0; i< samples_per_block; ++i) { tmp = ((char *)p)[1] << 8 | p[0]; p += 2; // Assuming Litres per hour, converting to litres per minute and applying offset? // As in should be 60.0? val = (EventDataType(tmp) / 100.0) - offset; samples[i] = val; } flow->AddWaveform(ti, samples, samples_per_block, rate); pres = *((quint16 *)p); pressure->AddEvent(ti, pres); ti += samples_per_block * rate; p+=3; // (offset too) } while (p < end); if (endMarker != 0x7fff) { qDebug() << fname << "waveform does not end with the corrent marker" << hex << endMarker; } if (sess) { sess->setLast(CPAP_FlowRate, ti); sess->setLast(CPAP_MaskPressure, ti); sess->eventlist[CPAP_FlowRate].push_back(flow); sess->eventlist[CPAP_MaskPressure].push_back(pressure); } if (newsess) { addSession(sess); } if (p_profile->session->backupCardData()) { QString backup = mach->getBackupPath()+"FPHCARE/ICON/"+serial.right(serial.size()-4)+"/"; QDir dir; QString newname = QString("FLW%1.FPH").arg(ts); dir.mkpath(backup); dir.cd(backup); if (!dir.exists(newname)) { file.copy(backup+newname); } } return true; } //////////////////////////////////////////////////////////////////////////////////////////// // Open Summary file //////////////////////////////////////////////////////////////////////////////////////////// bool FPIconLoader::OpenSummary(Machine *mach, QString filename) { qDebug() << filename; QByteArray header; QFile file(filename); if (!file.open(QFile::ReadOnly)) { qDebug() << "Couldn't open" << filename; return false; } header = file.read(0x200); if (header.size() != 0x200) { qDebug() << "Short file" << filename; return false; } unsigned char hsum = 0xff; for (int i = 0; i < 0x1ff; i++) { hsum += header[i]; } if (hsum != header[0x1ff]) { qDebug() << "Header checksum mismatch" << filename; } QTextStream htxt(&header); QString h1, version, fname, serial, model, type; htxt >> h1; htxt >> version; htxt >> fname; htxt >> serial; htxt >> model; htxt >> type; mach->setModel(model + " " + type); QByteArray data; data = file.readAll(); QDataStream in(data); in.setVersion(QDataStream::Qt_4_8); in.setByteOrder(QDataStream::LittleEndian); quint32 ts; //QByteArray line; unsigned char a1, a2, a3, a4, a5, p1, p2, p3, p4, p5, j1, j2, j3 , j4, j5, j6, j7, x1, x2; quint16 d1, d2, d3; int runtime, usage; QDate date; do { in >> ts; if (ts == 0xffffffff) break; if ((ts & 0xfafe) == 0xfafe) break; ts = convertDate(ts); // the following two quite often match in value in >> a1; // 0x04 Run Time in >> a2; // 0x05 Usage Time runtime = a1 * 360; // durations are in tenth of an hour intervals usage = a2 * 360; in >> a3; // 0x06 // Ramps??? in >> a4; // 0x07 // a pressure value? in >> a5; // 0x08 // ?? varies.. always less than 90% leak.. in >> d1; // 0x09 in >> d2; // 0x0b in >> d3; // 0x0d // 90% Leak value.. in >> p1; // 0x0f in >> p2; // 0x10 in >> j1; // 0x11 in >> j2; // 0x12 // Apnea Events in >> j3; // 0x13 // Hypopnea events in >> j4; // 0x14 // Flow Limitation events in >> j5; // 0x15 in >> j6; // 0x16 in >> j7; // 0x17 in >> p3; // 0x18 in >> p4; // 0x19 in >> p5; // 0x1a in >> x1; // 0x1b in >> x2; // 0x1c // humidifier setting if (!mach->SessionExists(ts)) { Session *sess = new Session(mach, ts); sess->really_set_first(qint64(ts) * 1000L); sess->really_set_last(qint64(ts + usage) * 1000L); sess->SetChanged(true); sess->setCount(CPAP_Obstructive, j2); sess->setCph(CPAP_Obstructive, j2 / (float(usage)/3600.00)); sess->setCount(CPAP_Hypopnea, j3); sess->setCph(CPAP_Hypopnea, j3 / (float(usage)/3600.00)); sess->setCount(CPAP_FlowLimit, j4); sess->setCph(CPAP_FlowLimit, j4 / (float(usage)/3600.00)); SessDate.insert(date, sess); // sess->setCount(CPAP_Obstructive,j1); // sess->setCount(CPAP_Hypopnea,j2); // sess->setCount(CPAP_ClearAirway,j3); // sess->setCount(CPAP_Apnea,j4); //sess->setCount(CPAP_,j5); if (p1 != p2) { sess->settings[CPAP_Mode] = (int)MODE_APAP; sess->settings[CPAP_PressureMin] = p3 / 10.0; sess->settings[CPAP_PressureMax] = p4 / 10.0; } else { sess->settings[CPAP_Mode] = (int)MODE_CPAP; sess->settings[CPAP_Pressure] = p1 / 10.0; } sess->settings[CPAP_HumidSetting] = x2; //sess->settings[CPAP_PresReliefType]=PR_SENSAWAKE; Sessions[ts] = sess; addSession(sess); } } while (!in.atEnd()); if (p_profile->session->backupCardData()) { QString backup = mach->getBackupPath()+"FPHCARE/ICON/"+serial.right(serial.size()-4)+"/"; QDir dir; QString newname = QString("SUM%1.FPH").arg(QDate::currentDate().year(),4,10,QChar('0')); dir.mkpath(backup); dir.cd(backup); if (!dir.exists(newname)) { file.copy(backup+newname); } } return true; } bool FPIconLoader::OpenDetail(Machine *mach, QString filename) { Q_UNUSED(mach); qDebug() << filename; QByteArray header; QFile file(filename); if (!file.open(QFile::ReadOnly)) { qDebug() << "Couldn't open" << filename; return false; } header = file.read(0x200); if (header.size() != 0x200) { qDebug() << "Short file" << filename; return false; } // Calculate and test checksum unsigned char hsum = 0; for (int i = 0; i < 0x1ff; i++) { hsum += header[i]; } if (hsum != header[0x1ff]) { qDebug() << "Header checksum mismatch" << filename; } QTextStream htxt(&header); QString h1, version, fname, serial, model, type; htxt >> h1; htxt >> version; htxt >> fname; htxt >> serial; htxt >> model; htxt >> type; QByteArray index = file.read(0x800); if (index.size()!=0x800) { // faulty file.. return false; } QDataStream in(index); quint32 ts; in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::LittleEndian); QVector times; QVector start; QVector records; quint16 strt; quint8 recs; int totalrecs = 0; do { in >> ts; if (ts == 0xffffffff) break; if ((ts & 0xfafe) == 0xfafe) break; ts = convertDate(ts); in >> strt; in >> recs; totalrecs += recs; if (Sessions.contains(ts)) { times.push_back(ts); start.push_back(strt); records.push_back(recs); } } while (!in.atEnd()); QByteArray databytes = file.readAll(); in.setVersion(QDataStream::Qt_4_6); in.setByteOrder(QDataStream::BigEndian); // 5 byte repeating patterns quint8 *data = (quint8 *)databytes.data(); qint64 ti; quint8 pressure, leak, a1, a2, a3, a4; // quint8 sa1, sa2; // The two sense awake bits per 2 minutes SessionID sessid; Session *sess; int idx; for (int r = 0; r < start.size(); r++) { sessid = times[r]; sess = Sessions[sessid]; ti = qint64(sessid) * 1000L; sess->really_set_first(ti); EventList *LK = sess->AddEventList(CPAP_LeakTotal, EVL_Event, 1); EventList *PR = sess->AddEventList(CPAP_Pressure, EVL_Event, 0.1F); EventList *OA = sess->AddEventList(CPAP_Obstructive, EVL_Event); EventList *H = sess->AddEventList(CPAP_Hypopnea, EVL_Event); EventList *FL = sess->AddEventList(CPAP_FlowLimit, EVL_Event); EventList *SA = sess->AddEventList(CPAP_SensAwake, EVL_Event); unsigned stidx = start[r]; int rec = records[r]; idx = stidx * 15; quint8 bitmask; for (int i = 0; i < rec; ++i) { for (int j = 0; j < 3; ++j) { pressure = data[idx]; PR->AddEvent(ti+120000, pressure); leak = data[idx + 1]; LK->AddEvent(ti+120000, leak); a1 = data[idx + 2]; // [0..5] Obstructive flag, [6..7] Unknown a2 = data[idx + 3]; // [0..5] Hypopnea, [6..7] Unknown a3 = data[idx + 4]; // [0..5] Flow Limitation, [6..7] SensAwake bitflags, 1 per minute // Sure there isn't 6 SenseAwake bits? // a4 = (a1 >> 6) << 4 | ((a2 >> 6) << 2) | (a3 >> 6); // this does the same thing as behaviour a4 = (a3 >> 7) << 3 | ((a3 >> 6) & 1); bitmask = 1; for (int k = 0; k < 6; k++) { // There are 6 flag sets per 2 minutes if (a1 & bitmask) { OA->AddEvent(ti, 1); } if (a2 & bitmask) { H->AddEvent(ti, 1); } if (a3 & bitmask) { FL->AddEvent(ti, 1); } if (a4 & bitmask) { SA->AddEvent(ti, 1); } bitmask <<= 1; ti += 20000L; // Increment 20 seconds } idx += 5; } } // sess->really_set_last(ti-360000L); // sess->SetChanged(true); // addSession(sess,profile); } if (p_profile->session->backupCardData()) { unsigned char *data = (unsigned char *)index.data(); ts = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24; ts = convertDate(ts); QString backup = mach->getBackupPath()+"FPHCARE/ICON/"+serial.right(serial.size()-4)+"/"; QDir dir; QString newname = QString("DET%1.FPH").arg(ts); dir.mkpath(backup); dir.cd(backup); if (!dir.exists(newname)) { file.copy(backup+newname); } } return 1; } bool fpicon_initialized = false; void FPIconLoader::Register() { if (fpicon_initialized) { return; } qDebug() << "Registering F&P Icon Loader"; RegisterLoader(new FPIconLoader()); //InitModelMap(); fpicon_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/weinmann_loader.cpp0000644000175000017500000004105012412506713025715 0ustar sergiosergio/* SleepLib Weinmann SOMNOsoft/Balance Loader Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include "weinmann_loader.h" extern QProgressBar *qprogress; Weinmann::Weinmann(MachineID id) : CPAP(id) { } Weinmann::~Weinmann() { } WeinmannLoader::WeinmannLoader() { m_buffer = nullptr; m_type = MT_CPAP; } WeinmannLoader::~WeinmannLoader() { } bool WeinmannLoader::Detect(const QString & givenpath) { QDir dir(givenpath); if (!dir.exists()) { return false; } // Check for the settings file inside the .. folder if (!dir.exists("WM_DATA.TDF")) { return false; } return true; } int WeinmannLoader::ParseIndex(QFile & wmdata) { QByteArray xml; do { xml += wmdata.readLine(250); } while (!wmdata.atEnd()); QDomDocument index_xml("weinmann"); index_xml.setContent(xml); QDomElement docElem = index_xml.documentElement(); QDomNode n = docElem.firstChild(); index.clear(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { bool ok; int val = e.attribute("val").toInt(&ok); if (ok) { index[e.attribute("name")] = val; qDebug() << e.attribute("name") << "=" << hex << val; } } n = n.nextSibling(); } return index.size(); } const QString DayComplianceCount = "DayComplianceCount"; const QString CompOffset = "DayComplianceOffset"; const QString FlowOffset = "TID_Flow_Offset"; const QString StatusOffset = "TID_Status_Offset"; const QString PresOffset = "TID_P_Offset"; const QString AMVOffset = "TID_AMV_Offset"; const QString EventsOffset = "TID_Events_Offset"; void HighPass(char * data, int samples, float cutoff, float dt) { float *Y = new float [samples]; for (int i=0; i < samples; ++i) Y[i] = 0.0f; Y[0] = ((unsigned char *)data)[0] ; float RC = 1.0 / (cutoff * 2 * 3.1415926); float alpha = RC / (RC + dt); for (int i=1; i < samples; ++i) { float x = ((unsigned char *)data)[i] ; float x1 = ((unsigned char *)data)[i-1] ; Y[i] = alpha * (Y[i-1] + x - x1); } for (int i=0; i< samples; ++i) { data[i] = Y[i]; } delete Y; } int WeinmannLoader::Open(QString path) { path = path.replace("\\", "/"); QFile wmdata(path + "/WM_DATA.TDF"); if (!wmdata.open(QFile::ReadOnly)) { return -1; } int res = ParseIndex(wmdata); if (res < 0) return -1; MachineInfo info = newInfo(); info.serial = "141819"; Machine * mach = CreateMachine(info); int WeekComplianceOffset = index["WeekComplianceOffset"]; int WCD_Pin_Offset = index["WCD_Pin_Offset"]; int WCD_Pex_Offset = index["WCD_Pex_Offset"]; int WCD_Snore_Offset = index["WCD_Snore_Offset"]; int WCD_Lf_Offset = index["WCD_Lf_Offset"]; int WCD_Events_Offset = index["WCD_Events_Offset"]; int WCD_IO_Offset = index["WCD_IO_Offset"]; int comp_start = index[CompOffset]; int wccount = index["WeekComplianceCount"]; int size = WCD_Pin_Offset - WeekComplianceOffset; quint8 * weekco = new quint8 [size]; memset(weekco, 0, size); wmdata.seek(WeekComplianceOffset); wmdata.read((char *)weekco, size); unsigned char *p = weekco; for (int c=0; c < wccount; ++c) { int year = QString().sprintf("%02i%02i", p[0], p[1]).toInt(); int month = p[2]; int day = p[3]; int hour = p[5]; int minute = p[6]; int second = p[7]; QDateTime date = QDateTime(QDate(year,month,day), QTime(hour,minute,second)); quint32 ts = date.toTime_t(); if (!mach->SessionExists(ts)) { qDebug() << date; } // stores used length of data at 0x46, in 16bit integers, for IPAP, EPAP, snore, leak, // stores total length of data block at 0x66, in 16 bit integers for IPAP, EPAP, snore, leak p+=0x84; } delete [] weekco; ////////////////////////////////////////////////////////////////////// // Read Day Compliance Information.... ////////////////////////////////////////////////////////////////////// int comp_end = index[FlowOffset]; int comp_size = comp_end - comp_start; quint8 * comp = new quint8 [comp_size]; memset((char *)comp, 0, comp_size); wmdata.seek(comp_start); wmdata.read((char *)comp, comp_size); p = comp; QDateTime dt_epoch(QDate(2000,1,1), QTime(0,0,0)); int epoch = dt_epoch.toTime_t(); epoch = 0; float flow_sample_duration = 1000.0 / 5; float pressure_sample_duration = 1000.0 / 2; float amv_sample_duration = 200 * 10; int c = index[DayComplianceCount]; for (int i=0; i < 5; i++) { int year = QString().sprintf("%02i%02i", p[0], p[1]).toInt(); int month = p[2]; int day = p[3]; int hour = p[5]; int minute = p[6]; int second = p[7]; QDateTime date = QDateTime(QDate(year,month,day), QTime(hour,minute,second)); quint32 ts = date.toTime_t(); if (mach->SessionExists(ts)) continue; Session * sess = new Session(mach, ts); sess->SetChanged(true); // Flow Waveform quint32 fs = p[8] | p[9] << 8 | p[10] << 16 | p[11] << 24; quint32 fl = p[0x44] | p[0x45] << 8 | p[0x46] << 16 | p[0x47] << 24; // Status quint32 ss = p[12] | p[13] << 8 | p[14] << 16 | p[15] << 24; quint32 sl = p[0x48] | p[0x49] << 8 | p[0x4a] << 16 | p[0x4b] << 24; // Pressure quint32 ps = p[16] | p[17] << 8 | p[18] << 16 | p[19] << 24; quint32 pl = p[0x4c] | p[0x4d] << 8 | p[0x4e] << 16 | p[0x4f] << 24; // AMV quint32 ms = p[20] | p[21] << 8 | p[22] << 16 | p[23] << 24; quint32 ml = p[0x50] | p[0x51] << 8 | p[0x52] << 16 | p[0x53] << 24; // Events quint32 es = p[24] | p[25] << 8 | p[26] << 16 | p[27] << 24; quint32 er = p[0x54] | p[0x55] << 8 | p[0x56] << 16 | p[0x57] << 24; // number of records compinfo.append(CompInfo(sess, date, fs, fl, ss, sl, ps, pl, ms, ml, es, er)); int dur = fl / 5; sess->really_set_first(qint64(ts) * 1000L); sess->really_set_last(qint64(ts+dur) * 1000L); sessions[ts] = sess; // qDebug() << date << ts << dur << QString().sprintf("%02i:%02i:%02i", dur / 3600, dur/60 % 60, dur % 60); p += 0xd6; } delete [] comp; ////////////////////////////////////////////////////////////////////// // Read Flow Waveform.... ////////////////////////////////////////////////////////////////////// int flowstart = index[FlowOffset]; int flowend = index[StatusOffset]; wmdata.seek(flowstart); int flowsize = flowend - flowstart; char * data = new char [flowsize]; memset((char *)data, 0, flowsize); wmdata.read((char *)data, flowsize); float dt = 1.0 / (1000.0 / flow_sample_duration); // samples per second // Centre Waveform using High Pass Filter HighPass(data, flowsize, 0.1f, dt); ////////////////////////////////////////////////////////////////////// // Read Status.... ////////////////////////////////////////////////////////////////////// int st_start = index[StatusOffset]; int st_end = index[PresOffset]; int st_size = st_end - st_start; char * st = new char [st_size]; memset(st, 0, st_size); wmdata.seek(st_start); wmdata.read(st, st_size); ////////////////////////////////////////////////////////////////////// // Read Mask Pressure.... ////////////////////////////////////////////////////////////////////// int pr_start = index[PresOffset]; int pr_end = index[AMVOffset]; int pr_size = pr_end - pr_start; char * pres = new char [pr_size]; memset(pres, 0, pr_size); wmdata.seek(pr_start); wmdata.read(pres, pr_size); ////////////////////////////////////////////////////////////////////// // Read AMV.... ////////////////////////////////////////////////////////////////////// int mv_start = index[AMVOffset]; int mv_end = index[EventsOffset]; int mv_size = mv_end - mv_start; char * mv = new char [mv_size]; memset(mv, 0, mv_size); wmdata.seek(mv_start); wmdata.read(mv, mv_size); ////////////////////////////////////////////////////////////////////// // Read Events.... ////////////////////////////////////////////////////////////////////// int ev_start = index[EventsOffset]; int ev_end = wmdata.size(); int ev_size = ev_end - ev_start; quint8 * ev = new quint8 [ev_size]; memset((char *) ev, 0, ev_size); wmdata.seek(ev_start); wmdata.read((char *) ev, ev_size); ////////////////////////////////////////////////////////////////////// // Process sessions ////////////////////////////////////////////////////////////////////// for (int i=0; i< compinfo.size(); ++i) { const CompInfo & ci = compinfo.at(i); Session * sess = ci.session; qint64 ti = sess->first(); EventList * flow = sess->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, flow_sample_duration); flow->AddWaveform(ti, &data[ci.flow_start], ci.flow_size, (ci.flow_size/(1000.0/flow_sample_duration)) * 1000.0); EventList * PR = sess->AddEventList(CPAP_MaskPressure, EVL_Waveform, 0.1f, 0.0, 0.0, 0.0, pressure_sample_duration); PR->AddWaveform(ti, (unsigned char *)&pres[ci.pres_start], ci.pres_size, (ci.pres_size/(1000.0/pressure_sample_duration)) * 1000.0); // Weinmann's MV graph is pretty dodgy... commenting this out and using my flow calced ones instead (the code below is mapped to snore for comparison purposes) //EventList * MV = sess->AddEventList(CPAP_Snore, EVL_Waveform, 1.0f, 0.0, 0.0, 0.0, amv_sample_duration); //MV->AddWaveform(ti, (unsigned char *)&mv[ci.amv_start], ci.amv_size, (ci.amv_size/(1000/amv_sample_duration)) * 1000L); EventList * L = sess->AddEventList(CPAP_Leak, EVL_Event); EventList * S = sess->AddEventList(CPAP_Snore, EVL_Event); EventList * OA = sess->AddEventList(CPAP_Obstructive, EVL_Event); EventList * A = sess->AddEventList(CPAP_Apnea, EVL_Event); EventList * H = sess->AddEventList(CPAP_Hypopnea, EVL_Event); EventList * FL = sess->AddEventList(CPAP_FlowLimit, EVL_Event); EventList * VS = sess->AddEventList(CPAP_VSnore, EVL_Event); quint64 tt = ti; quint64 step = sess->length() / ci.event_recs; unsigned char *p = &ev[ci.event_start]; for (quint32 j=0; j < ci.event_recs; ++j) { QDate evdate = ci.time.date(); QTime evtime(p[1], p[2], p[3]); if (evtime < ci.time.time()) { evdate = evdate.addDays(1); } quint64 ts = QDateTime(evdate, evtime).toMSecsSinceEpoch(); // I think p[0] is amount of flow restriction.. unsigned char evcode = p[0]; EventStoreType data = p[4] | p[5] << 8; if (evcode == '@') { OA->AddEvent(ts,data/10.0); } else if (evcode =='A') { A->AddEvent(ts,data/10.0); } else if (evcode == 'F') { FL->AddEvent(ts,data/10.0); } else if (evcode == '*') { H->AddEvent(ts,data/10.0); } /* switch (evcode) { case 0x03: break; case 0x04: break; case 0x08: break; case 0x09: break; case 0x0a: break; case 0x0b: break; case 0x0c: break; case 0x10: break; case 0x11: break; case 0x12: break; case 0x13: S->AddEvent(ts, data); break; case 0x22: // VS->AddEvent(ts, data/10.0); break; case 0x28: VS->AddEvent(ts, data/10.0); break; case 'F': FL->AddEvent(ts, data/10.0); break; case '@': OA->AddEvent(ts, data/10.0); break; case '\'': //A->AddEvent(ts, data/10.0); break; case 'a': A->AddEvent(ts, data/10.0); break; case 'A': // A->AddEvent(ts, data/10.0); break; case '*': H->AddEvent(ts, data/10.0); break; case 'd': break; case 0x91: break; case 0x96: break; case 0x84: break; default: qDebug() << (int)evcode << endl; }*/ // S->AddEvent(ts, p[5]); // p[5] == 0 corresponds to peak events // p[5] == 1 corresponds to hypopnea/bstructive events //if (p[5] == 2) OA->AddEvent(ts, p[4]); // This is ugggggly... tt += step; p += 6; } sess->UpdateSummaries(); mach->AddSession(sess); } delete [] data; delete [] st; delete [] pres; delete [] mv; delete [] ev; mach->Save(); return 1; /* // Center the waveform HighPass(data, flowsize, 0.6, dt); EventList * flow = sess->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, sample_duration); flow->AddWaveform(tt, (char *)data, flowsize, (flowsize/(1000/sample_duration)) * 1000L); qint64 ti = tt; for (int i=0; i < pr_size; ++i) { EventStoreType c = ((unsigned char *)pres)[i]; PR->AddEvent(ti, c); ti += sample_duration * 2.5; //46296296296296; } // Their calcs is uglier than mine! EventList * MV = sess->AddEventList(CPAP_Snore, EVL_Event, 1.0); ti = tt; for (int i=0; i < mv_size; ++i) { EventStoreType c = ((unsigned char *)mv)[i]; MV->AddEvent(ti, c); ti += sample_duration * 9; } // Their calcs is uglier than mine! EventList * ST = sess->AddEventList(CPAP_Leak, EVL_Event, 1.0); int st_start = index[StatusOffset]; int st_end = index[PresOffset]; int st_size = st_end - st_start; char st[st_size]; memset(st, 0, st_size); wmdata.seek(st_start); wmdata.read(st, st_size); ti = tt; for (int i=0; i < st_size; ++i) { EventStoreType c = ((unsigned char *)st)[i]; // if (c & 0x80) { ST->AddEvent(ti, c & 0x10); // } ti += sample_duration*4; // *9 } // EventList * LEAK = sess->AddEventList(CPAP_Leak, EVL_Event); // EventList * SNORE = sess->AddEventList(CPAP_Snore, EVL_Event); // int ev_start = index[EventsOffset]; // int ev_end = wmdata.size(); // int ev_size = ev_end - ev_start; // int recs = ev_size / 0x12; // unsigned char ev[ev_size]; // memset((char *) ev, 0, ev_size); // wmdata.seek(ev_start); // wmdata.read((char *) ev, ev_size); sess->really_set_last(flow->last()); // int pos = 0; // ti = tt; // // 6 byte repeating structure.. No Leaks :( // do { // //EventStoreType c = ((unsigned char*)ev)[pos+0]; // TV? // //c = ((unsigned char*)ev)[pos+6]; // MV? // EventStoreType c = ((EventStoreType*)ev)[pos+0]; // LEAK->AddEvent(ti, c); // SNORE->AddEvent(ti, ((unsigned char*)ev)[pos+2]); // pos += 0x6; // ti += 30000; // if (ti > sess->last()) // break; // } while (pos < (ev_size - 0x12)); m->AddSession(sess); sess->UpdateSummaries(); return 1;*/ } void WeinmannLoader::initChannels() { using namespace schema; Channel * chan = nullptr; // channel.add(GRP_CPAP, chan = new Channel(INTP_SmartFlex = 0x1165, SETTING, SESSION, // "INTPSmartFlex", QObject::tr("SmartFlex"), // QObject::tr("Weinmann pressure relief setting."), // QObject::tr("SmartFlex"), // "", DEFAULT, Qt::green)); // chan->addOption(1, STR_TR_None); } bool weinmann_initialized = false; void WeinmannLoader::Register() { if (weinmann_initialized) { return; } qDebug() << "Registering WeinmannLoader"; RegisterLoader(new WeinmannLoader()); //InitModelMap(); weinmann_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.cpp0000644000175000017500000006047512412506713025364 0ustar sergiosergio/* SleepLib CMS50X Loader Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the cms50_data_version in cms50_loader.h when making changes to this loader // that change loader behaviour or modify channels. //******************************************************************************************** #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include "cms50f37_loader.h" #include "SleepLib/machine.h" #include "SleepLib/session.h" extern QProgressBar *qprogress; CMS50F37Loader::CMS50F37Loader() { m_type = MT_OXIMETER; m_abort = false; m_streaming = false; m_importing = false; started_reading = false; imp_callbacks = 0; m_vendorID = 0x10c4; m_productID = 0xea60; oxirec = nullptr; startTimer.setParent(this); resetTimer.setParent(this); duration_divisor = 2; model = QString(); vendor = QString(); } CMS50F37Loader::~CMS50F37Loader() { } bool CMS50F37Loader::openDevice() { if (port.isEmpty()) { bool b = scanDevice("",m_vendorID, m_productID); if (!b) { b = scanDevice("rfcomm", 0, 0); // Linux } if (!b) { return false; } } serial.setPortName(port); if (!serial.open(QSerialPort::ReadWrite)) return false; // forward this stuff // Set up serial port attributes serial.setBaudRate(QSerialPort::Baud115200); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setDataBits(QSerialPort::Data8); serial.setFlowControl(QSerialPort::NoFlowControl); m_streaming = true; m_abort = false; m_importing = false; // connect relevant signals connect(&serial,SIGNAL(readyRead()), this, SLOT(dataAvailable())); started_import = false; started_reading = false; finished_import = false; resetDevice(); return true; } bool CMS50F37Loader::Detect(const QString &path) { if (p_profile->oxi->oximeterType() == 0) { return true; } Q_UNUSED(path); return false; } int CMS50F37Loader::Open(QString path) { // Only one active Oximeter module at a time, set in preferences m_itemCnt = 0; m_itemTotal = 0; m_abort = false; m_importing = false; started_import = false; started_reading = false; finished_import = false; setStatus(NEUTRAL); imp_callbacks = 0; cb_reset = 0; m_time.start(); if (oxirec) { trashRecords(); } // Cheating using path for two serial oximetry modes if (path.compare("import") == 0) { serial.clear(); sequence = 0; buffer.clear(); // nextCommand(); setStatus(IMPORTING); return 1; } else if (path.compare("live") == 0) { return 0; } QString ext = path.section(".",1); if ((ext.compare("spo2", Qt::CaseInsensitive)==0) || (ext.compare("spo", Qt::CaseInsensitive)==0) || (ext.compare("spor", Qt::CaseInsensitive)==0)) { // try to read and process SpoR file.. return readSpoRFile(path) ? 1 : 0; } return 0; } unsigned char cms50_sequence[] = { 0xa7, 0xa2, 0xa0, 0xb0, 0xac, 0xb3, 0xad, 0xa3, 0xab, 0xa4, 0xa5, 0xaf, 0xa7, 0xa2, 0xa6 }; const int TIMEOUT = 2000; const quint8 COMMAND_CMS50_HELLO1 = 0xa7; const quint8 COMMAND_CMS50_HELLO2 = 0xa2; const quint8 COMMAND_GET_SESSION_COUNT = 0xA3; const quint8 COMMAND_GET_SESSION_TIME = 0xA5; const quint8 COMMAND_GET_SESSION_DURATION = 0xA4; const quint8 COMMAND_GET_USER_INFO = 0xAB; const quint8 COMMAND_GET_SESSION_DATA = 0xA6; const quint8 COMMAND_GET_OXIMETER_DEVICEID = 0xAA; const quint8 COMMAND_GET_OXIMETER_INFO = 0xb0; const quint8 COMMAND_GET_OXIMETER_MODEL = 0xA8; const quint8 COMMAND_GET_OXIMETER_VENDOR = 0xA9; const quint8 COMMAND_SESSION_ERASE = 0xAE; int cms50_seqlength = sizeof(cms50_sequence); QString CMS50F37Loader::getUser() { if (!user.isEmpty()) return user; sendCommand(COMMAND_GET_USER_INFO); QTime time; time.start(); do { QApplication::processEvents(); } while (user.isEmpty() && (time.elapsed() < TIMEOUT)); return user; } QString CMS50F37Loader::getVendor() { if (!vendor.isEmpty()) return vendor; sendCommand(COMMAND_GET_OXIMETER_VENDOR); QTime time; time.start(); do { QApplication::processEvents(); } while (vendor.isEmpty() && (time.elapsed() < TIMEOUT)); return vendor; } QString CMS50F37Loader::getModel() { if (!model.isEmpty()) return model; modelsegments = 0; sendCommand(COMMAND_GET_OXIMETER_MODEL); QTime time; time.start(); do { QApplication::processEvents(); } while ((modelsegments < 2) && (time.elapsed() < TIMEOUT)); // Give a little more time for the second one.. QThread::msleep(100); QApplication::processEvents(); if (model.startsWith("CMS50I") || model.startsWith("CMS50H")) { duration_divisor = 4; } else { duration_divisor = 2; } return model; } QString CMS50F37Loader::getDeviceString() { return QString("%1 %2").arg(getVendor()).arg(getModel()); } QString CMS50F37Loader::getDeviceID() { if (!devid.isEmpty()) return devid; sendCommand(COMMAND_GET_OXIMETER_DEVICEID); QTime time; time.start(); do { QApplication::processEvents(); } while (devid.isEmpty() && (time.elapsed() < TIMEOUT)); return devid; } int CMS50F37Loader::getSessionCount() { session_count = -1; sendCommand(COMMAND_GET_SESSION_COUNT); QTime time; time.start(); do { QApplication::processEvents(); } while ((session_count < 0) && (time.elapsed() < TIMEOUT)); return session_count; } int CMS50F37Loader::getOximeterInfo() { device_info = -1; sendCommand(COMMAND_GET_OXIMETER_INFO); QTime time; time.start(); do { QApplication::processEvents(); } while ((device_info < 0) && (time.elapsed() < TIMEOUT)); return device_info; } int CMS50F37Loader::getDuration(int session) { getOximeterInfo(); duration = -1; sendCommand(COMMAND_GET_SESSION_DURATION, session); QTime time; time.start(); do { QApplication::processEvents(); } while ((duration < 0) && (time.elapsed() < TIMEOUT)); return duration / duration_divisor; } QDateTime CMS50F37Loader::getDateTime(int session) { imp_date = QDate(); imp_time = QTime(); sendCommand(COMMAND_GET_SESSION_TIME, session); QTime time; time.start(); do { QApplication::processEvents(); } while ((imp_date.isNull() || imp_time.isNull()) && (time.elapsed() < TIMEOUT)); if (imp_date.isNull() || imp_time.isNull()) return QDateTime(); return QDateTime(imp_date, imp_time); } void CMS50F37Loader::processBytes(QByteArray bytes) { static quint8 resimport = 0; int data; QString tmpstr; int lengths[32] = { 0, 0, 9, 9, 9, 9, 4, 8, 8, 6, 4, 4, 2, 0, 3, 8, 3, 9, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; buffer.append(bytes); int size = buffer.size(); int idx = 0; int len; int year, month, day; quint8 pulse; do { quint8 res = buffer.at(idx); len = lengths[res & 0x1f]; if ((idx+len) > size) break; if (started_reading && (res != resimport)) { len = 0; } if (len == 0) { // lost sync if (started_reading) { while (idx < size) { res = buffer.at(idx++); if (res == resimport) break; } // add a dummy to make up for it. qDebug() << "lost sync, padding..."; oxirec->append(OxiRecord(0,0,0)); } continue; } for (int i = 1; i < len; i++) { buffer[idx+i] = buffer[idx+i] ^ 0x80; } if (!started_reading) switch(res) { case 0x02: // Model name string (there are two in sequnce.. second might be the next chunk!) data = buffer.at(idx+1); if (data == 0) { model = QString(buffer.mid(idx+3, 6)); modelsegments++; } else { QString extra = QString(buffer.mid(idx+3, 6)); model += extra.trimmed(); modelsegments++; qDebug() << "Model:" << model; } break; case 0x03: // Vendor string data = buffer.at(idx+1); if (data == 0) { vendor = QString(buffer.mid(idx+2, 6)); qDebug() << "Vendor:" << vendor; } break; case 0x04: // Device Identifiers for (int i = 2, msb = buffer.at(idx+1); i < len; i++, msb>>= 1) { buffer[idx+i] = (buffer[idx+i] & 0x7f) | (msb & 0x01 ? 0x80 : 0); } devid = QString(buffer.mid(idx+2, 7)); qDebug() << "Device ID:" << devid; break; // COMMAND_GET_USER_INFO case 0x05: // 5,80,80,f5,f3,e5,f2,80,80 // User user = QString(buffer.mid(idx+3).trimmed()); qDebug() << "0x05:" << user; break; case 0x6: // 6,80,80,87 data = buffer.at(idx+3) ^ 0x80; break; // COMMAND_GET_SESSION_TIME case 0x07: // 7,80,80,80,94,8e,88,92 for (int i = 2, msb = buffer.at(idx+1); i < len; i++, msb>>= 1) { buffer[idx+i] = (buffer[idx+i] & 0x7f) | (msb & 0x01 ? 0x80 : 0); } year = QString().sprintf("%02i%02i",buffer.at(idx+4), buffer.at(idx+5)).toInt(); month = QString().sprintf("%02i", buffer.at(idx+6)).toInt(); day = QString().sprintf("%02i", buffer.at(idx+7)).toInt(); imp_date = QDate(year,month,day); qDebug() << imp_date; break; // COMMAND_GET_SESSION_DURATION case 0x08: // 8,80,80,80,a4,81,80,80 // 00, 00, 24, 01, 00, 00 duration = ((buffer.at(idx+1) & 0x4) << 5); duration |= buffer.at(idx+4); duration |= (buffer.at(idx+5) | ((buffer.at(idx+1) & 0x8) << 4)) << 8; duration |= (buffer.at(idx+6) | ((buffer.at(idx+1) & 0x10) << 3)) << 16; break; // COMMAND_GET_SESSION_COUNT case 0x0a: // a,80,80,81 session_count = buffer.at(idx+3); break; case 0x0b: timectr++; break; // COMMAND_CMS50_HELLO1 && COMMAND_CMS50_HELLO2 case 0xc: // a7 & a2 // responds with: c,80 data = buffer.at(idx+1); break; case 0x0e: // e,80,81 break; case 0x10: // 10,80,81 data = buffer.at(idx+2); break; // COMMAND_GET_OXIMETER_INFO case 0x11: // 11,80,81,81,80,80,80,80,80 device_info = buffer.at(idx+3); break; // COMMAND_GET_SESSION_TIME case 0x12: // 12,80,80,80,82,a6,92,80 tmpstr = QString().sprintf("%02i:%02i:%02i",buffer.at(idx+4), buffer.at(idx+5), buffer.at(idx+6)); imp_time = QTime::fromString(tmpstr, "HH:mm:ss"); qDebug() << imp_time; break; case 0x13: // 13,80,a0,a0,a0,a0,a0,a0,a0 break; case 0x14: //14,80,80,80,80,80,80,80,80 break; case 0x09: // cms50i data sequence case 0x0f: // f,80,de,c2,de,c2,de,c2 cms50F data... if (!started_import) { started_import = true; started_reading = true; finished_import = false; m_importing = true; m_itemCnt=0; m_itemTotal=duration; have_perfindex = (res == 0x9); oxirec = new QVector; oxirec->reserve(30000); oxisessions[m_startTime] = oxirec; cb_reset = 1; resetTimer.singleShot(2000,this,SLOT(resetImportTimeout())); resimport = res; } break; default: qDebug() << "unknown cms50 result?" << hex << (int)res; break; } if (res == 0x09) { // 9,80,e1,c4,ce,82 // cms50i data quint8 * buf = &((quint8 *)buffer.data())[idx]; quint8 msb = buf[1]; for (int i = 2; i < len-1; i++, msb >>= 1) { buf[i] = (buf[i] & 0x7f) | ((msb & 0x01) ? 0x80 : 0); } quint16 pi = buf[4] | buf[5] << 8; pulse = buf[3]; quint8 spo2 = buf[2] & 0x7f; qDebug() << "Pulse=" << pulse << "SPO2=" << spo2 << "Pi=" << pi; oxirec->append(((spo2 == 0) || (pulse == 0)) ? OxiRecord(0,0,0) : OxiRecord(pulse, spo2, pi)); } else if (res == 0x0f) { // f,80,de,c2,de,c2,de,c2 cms50F data... for (int i = 2, msb = buffer.at(idx+1); i < len; i++, msb>>= 1) { buffer[idx+i] = (buffer[idx+i] & 0x7f) | (msb & 0x01 ? 0x80 : 0); } pulse = buffer.at(idx+3); oxirec->append((pulse == 0xff) ? OxiRecord(0,0) : OxiRecord(pulse, buffer.at(idx+2))); pulse = buffer.at(idx+5); oxirec->append((pulse == 0xff) ? OxiRecord(0,0) : OxiRecord(pulse, buffer.at(idx+4))); pulse = buffer.at(idx+7); oxirec->append((pulse == 0xff) ? OxiRecord(0,0) : OxiRecord(pulse, buffer.at(idx+6))); } QStringList str; for (int i=0; i < len; ++i) { str.append(QString::number((unsigned char)buffer.at(idx + i),16)); } if (!started_import) { // startTimer.singleShot(2000, this, SLOT(requestData())); qDebug() << "Read:" << len << size << str.join(","); } else { qDebug() << "Import:" << len << size << str.join(","); } idx += len; } while (idx < size); if (!started_import) { imp_callbacks = 0; } else { emit updateProgress(oxirec->size(), duration); imp_callbacks++; } buffer = buffer.mid(idx); } //int CMS50F37Loader::doLiveMode() //{ // Q_ASSERT(oxirec != nullptr); // int available = buffer.size(); // int idx = 0; // QByteArray plethy; // while (idx < available-5) { // if (((unsigned char)buffer.at(idx) & 0x80) != 0x80) { // idx++; // continue; // } // int pwave=(unsigned char)buffer.at(idx + 1); // int pbeat=(unsigned char)buffer.at(idx + 2); // int pulse=((unsigned char)buffer.at(idx + 3) & 0x7f) | ((pbeat & 0x40) << 1); // int spo2=(unsigned char)buffer.at(idx + 4) & 0x7f; // oxirec->append(OxiRecord(pulse, spo2)); // plethy.append(pwave); // idx += 5; // } // emit updatePlethy(plethy); // return idx; //} void CMS50F37Loader::sendCommand(quint8 c) { quint8 cmd[] = { 0x7d, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; cmd[2] |= (c & 0x7f); QString out; for (int i=0;i < 9;i++) out += QString().sprintf("%02X ",cmd[i]); qDebug() << "Write:" << out; if (serial.write((char *)cmd, 9) == -1) { qDebug() << "Couldn't write data reset bytes to CMS50"; } } void CMS50F37Loader::sendCommand(quint8 c, quint8 c2) { quint8 cmd[] = { 0x7d, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; cmd[2] |= (c & 0x7f); cmd[4] |= (c2 & 0x7f); QString out; for (int i=0; i < 9; ++i) out += QString().sprintf("%02X ",cmd[i]); qDebug() << "Write:" << out; if (serial.write((char *)cmd, 9) == -1) { qDebug() << "Couldn't write data reset bytes to CMS50"; } } void CMS50F37Loader::eraseSession(int user, int session) { quint8 cmd[] = { 0x7d, 0x81, COMMAND_SESSION_ERASE, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; cmd[3] = (user & 0x7f) | 0x80; cmd[4] = (session & 0x7f) | 0x80; QString out; for (int i=0; i < 9; ++i) out += QString().sprintf("%02X ",cmd[i]); qDebug() << "Write:" << out; if (serial.write((char *)cmd, 9) == -1) { qDebug() << "Couldn't write data reset bytes to CMS50"; } int z = timectr; QTime time; time.start(); do { QApplication::processEvents(); } while ((timectr == z) && (time.elapsed() < TIMEOUT)); } void CMS50F37Loader::setDeviceID(QString str) { str.truncate(7); if (str.length() < 7) { str = QString(" ").repeated(7-str.length()) + str; } quint8 cmd[] = { 0x04, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; quint8 msb = 0; QByteArray ba = str.toLocal8Bit(); for (int i=6; i >= 0; i--) { msb <<= 1; msb |= (ba.at(i) >> 7) & 1; cmd[i+2] = ba.at(i) | 0x80; } cmd[1] = msb | 0x80; QString out; for (int i=0; i < 9; ++i) out += QString().sprintf("%02X ",cmd[i]); qDebug() << "Write:" << out; if (serial.write((char *)cmd, 9) == -1) { qDebug() << "Couldn't write data reset bytes to CMS50"; } // Supposed to return 0x04 command, so reset devid.. devid = QString(); QTime time; time.start(); do { QApplication::processEvents(); } while (devid.isEmpty() && (time.elapsed() < TIMEOUT)); } void CMS50F37Loader::syncClock() { QDate date = QDate::currentDate(); int year = date.year(); quint8 yh = year / 100; quint8 yl = year % 100; quint8 mon = date.month(); quint8 day = date.day(); quint8 wd = date.dayOfWeek() % 7; quint8 datecmd[] = { 0x7d, 0x81, 0xb2, yh | 0x80, yl |0x80, mon|0x80, day|0x80, wd|0x80, 0x80 }; timectr = 0; if (serial.write((char *)datecmd, 9) == -1) { qDebug() << "Couldn't write data reset bytes to CMS50"; } QTime time; time.start(); do { QApplication::processEvents(); } while ((timectr == 0) && (time.elapsed() < TIMEOUT)); QThread::msleep(100); QApplication::processEvents(); QTime ctime = QTime::currentTime(); quint8 h = ctime.hour(); quint8 m = ctime.minute(); quint8 s = ctime.second(); quint8 timecmd[] = { 0x7d, 0x81, 0xb1, h | 0x80, m |0x80, s|0x80, 0x80, 0x80, 0x80 }; timectr = 0; if (serial.write((char *)timecmd, 9) == -1) { qDebug() << "Couldn't write data reset bytes to CMS50"; } time.start(); do { QApplication::processEvents(); } while ((timectr == 0) && (time.elapsed() < TIMEOUT)); } void CMS50F37Loader::nextCommand() { if (++sequence < cms50_seqlength) { // Send the next command packet in sequence sendCommand(cms50_sequence[sequence]); } else { qDebug() << "Run out of startup tasks to do and import failed!"; } } void CMS50F37Loader::getSessionData(int session) { resetDevice(); selected_session = session; requestData(); } void CMS50F37Loader::resetDevice() { sendCommand(COMMAND_CMS50_HELLO1); QThread::msleep(100); QApplication::processEvents(); sendCommand(COMMAND_CMS50_HELLO2); QThread::msleep(100); QApplication::processEvents(); } void CMS50F37Loader::requestData() { sendCommand(COMMAND_GET_SESSION_DATA, selected_session); } void CMS50F37Loader::killTimers() { if (resetTimer.isActive()) resetTimer.stop(); if (startTimer.isActive()) startTimer.stop(); } void CMS50F37Loader::startImportTimeout() { } void CMS50F37Loader::resetImportTimeout() { if (finished_import) { return; } if (imp_callbacks != cb_reset) { // Still receiving data.. reset timer qDebug() << "Still receiving data in resetImportTimeout()" << imp_callbacks << cb_reset; if (resetTimer.isActive()) resetTimer.stop(); if (!finished_import) resetTimer.singleShot(2000, this, SLOT(resetImportTimeout())); } else { qDebug() << "Oximeter device stopped transmitting.. Transfer complete"; // We were importing, but now are done if (!finished_import && (started_import && started_reading)) { qDebug() << "Switching CMS50 back to live mode and finalizing import"; // Turn back on live streaming so the end of capture can be dealt with killTimers(); finished_import = true; m_streaming = false; m_importing = false; started_reading = false; started_import = false; emit importComplete(this); m_status = NEUTRAL; shutdownPorts(); return; } qDebug() << "Should CMS50 resetImportTimeout reach here?"; // else what??? } cb_reset = imp_callbacks; } void CMS50F37Loader::shutdownPorts() { closeDevice(); } bool CMS50F37Loader::readSpoRFile(QString path) { QFile file(path); if (!file.exists()) { return false; } if (!file.open(QFile::ReadOnly)) { return false; } bool spo2header = false; QString ext = path.section('.', -1); if (ext.compare("spo2",Qt::CaseInsensitive) == 0) { spo2header = true; } QByteArray data; qint64 filesize = file.size(); data = file.readAll(); QDataStream in(data); in.setByteOrder(QDataStream::LittleEndian); quint16 pos; in >> pos; in.skipRawData(pos - 2); //long size = data.size(); int bytes_per_record = 2; if (!spo2header) { // next is 0x0002 // followed by 16bit duration in seconds // Read date and time (it's a 16bit charset) char dchr[20]; int j = 0; for (int i = 0; i < 18 * 2; i += 2) { dchr[j++] = data.at(8 + i); } dchr[j] = 0; if (dchr[0]) { QString dstr(dchr); m_startTime = QDateTime::fromString(dstr, "MM/dd/yy HH:mm:ss"); if (m_startTime.date().year() < 2000) { m_startTime = m_startTime.addYears(100); } } else { m_startTime = QDateTime(QDate::currentDate(), QTime(0,0,0)); } } else { // !spo2header quint32 samples = 0; // number of samples quint32 year, month, day; quint32 hour, minute, second; if (data.at(pos) != 1) { qWarning() << ".spo2 file" << path << "might be a different"; } // Unknown cruft header... in.skipRawData(200); in >> year >> month >> day; in >> hour >> minute >> second; m_startTime = QDateTime(QDate(year, month, day), QTime(hour, minute, second)); // ignoring it for now pos += 0x1c + 200; in >> samples; int remainder = filesize - pos; bytes_per_record = remainder / samples; qDebug() << samples << "samples of" << bytes_per_record << "bytes each"; // CMS50I .spo2 data have 4 digits, a 16bit, followed by spo2 then pulse } oxirec = new QVector; oxisessions[m_startTime] = oxirec; unsigned char o2, pr; quint16 un; // Read all Pulse and SPO2 data do { if (bytes_per_record > 2) { in >> un; } in >> o2; in >> pr; if ((o2 == 0x7f) && (pr == 0xff)) { o2 = pr = 0; un = 0; } if (spo2header) { oxirec->append(OxiRecord(pr, o2)); } else { oxirec->append(OxiRecord(o2, pr)); } } while (!in.atEnd()); // for (int i = pos; i < size - 2;) { // o2 = (unsigned char)(data.at(i + 1)); // pr = (unsigned char)(data.at(i + 0)); // oxirec->append(OxiRecord(pr, o2)); // i += 2; // } // processing gets done later return true; } void CMS50F37Loader::process() { // Just clean up any extra crap before oximeterimport parses the oxirecords.. return; // if (!oxirec) // return; // int size=oxirec->size(); // if (size<10) // return; } static bool cms50f37_initialized = false; void CMS50F37Loader::Register() { if (cms50f37_initialized) { return; } qDebug() << "Registering CMS50F37Loader"; RegisterLoader(new CMS50F37Loader()); cms50f37_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/icon_loader.h0000644000175000017500000000723412412506713024504 0ustar sergiosergio/* SleepLib Fisher & Paykel Icon Loader Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef ICON_LOADER_H #define ICON_LOADER_H #include #include "SleepLib/machine.h" #include "SleepLib/machine_loader.h" #include "SleepLib/profiles.h" //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the following value when making changes to this loaders implementation. // const int fpicon_data_version = 3; // //******************************************************************************************** /*! \class FPIcon \brief F&P Icon customized machine object */ class FPIcon: public CPAP { public: FPIcon(MachineID id = 0); virtual ~FPIcon(); }; const int fpicon_load_buffer_size = 1024 * 1024; const QString fpicon_class_name = STR_MACH_FPIcon; /*! \class FPIconLoader \brief Loader for Fisher & Paykel Icon data This is only relatively recent addition and still needs more work */ class FPIconLoader : public CPAPLoader { public: FPIconLoader(); virtual ~FPIconLoader(); //! \brief Detect if the given path contains a valid Folder structure virtual bool Detect(const QString & path); //! \brief Scans path for F&P Icon data signature, and Loads any new data virtual int Open(QString path); int OpenMachine(Machine *mach, QString &path); bool OpenSummary(Machine *mach, QString path); bool OpenDetail(Machine *mach, QString path); bool OpenFLW(Machine *mach, QString filename); //! \brief Returns SleepLib database version of this F&P Icon loader virtual int Version() { return fpicon_data_version; } //! \brief Returns the machine class name of this CPAP machine, "FPIcon" virtual const QString &loaderName() { return fpicon_class_name; } // ! \brief Creates a machine object, indexed by serial number //Machine *CreateMachine(QString serial); virtual MachineInfo newInfo() { return MachineInfo(MT_CPAP, 0, fpicon_class_name, QObject::tr("Fisher & Paykel"), QString(), QString(), QString(), QObject::tr("ICON"), QDateTime::currentDateTime(), fpicon_data_version); } //! \brief Registers this MachineLoader with the master list, so F&P Icon data can load static void Register(); //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Now for some CPAPLoader overrides //////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual QString presRelType() { return QObject::tr(""); } // might not need this one virtual ChannelID presRelSet() { return NoChannel; } virtual ChannelID presRelLevel() { return NoChannel; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// protected: QDateTime readFPDateTime(quint8 *data); QString last; QHash MachList; QMap Sessions; QMultiMap SessDate; //QMap > FLWMapFlow; //QMap > FLWMapLeak; //QMap > FLWMapPres; //QMap > FLWDuration; //QMap > FLWTS; //QMap FLWDate; unsigned char *m_buffer; }; #endif // ICON_LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/mseries_loader.cpp0000644000175000017500000003415112412506713025554 0ustar sergiosergio/* SleepLib RemStar M-Series Loader Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include "mseries_loader.h" extern QProgressBar *qprogress; MSeries::MSeries(MachineID id) : CPAP(id) { } MSeries::~MSeries() { } MSeriesLoader::MSeriesLoader() { m_type = MT_CPAP; epoch = QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0), Qt::UTC).toTime_t(); epoch -= QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0), Qt::UTC).toTime_t(); } MSeriesLoader::~MSeriesLoader() { } //struct MSeriesHeader { // quint8 b1; //0x52 // quint32 a32; //0x00000049 // quint16 u16[8]; // quint8 b2; //0x02 // char setname[16]; // char firstname[25]; // char lastname[25]; // char serial[50]; // quint16 b3; //0x00 // quint16 b4; //0x66 // quint16 b5; //0xff //} __attribute__((packed)); /* blockLayoutOffsets { cardInformationBlock = 0, brandID = 0, cardType = 2, cardVersion = 3 startUIDB = 4 endUIDB = 6, startCPB = 8, endCPB = 10, startCDCB = 12, endCDCB = 14, startCDB = 0x10, endCDB = 0x12, checksum = 20, userIDBlock = 0x15 personalID = 1, patientFName = 0x11, patientLName = 0x2a, serialNumber = 0x43, modelNumber = 0x4d, textData = 0x57 checksum = 0x77, cardPrescriptionBlock = 0x8d, cardDataControlBlock = 0xa3, validFlagOne = 3, headPtrOne = 4, tailPtrOne = 6, cdbChecksumOne = 8, validFlagTwo = 9 headPtrTwo = 10, tailPtrTwo = 12, cdbChecksumTwo = 14, cardDataBlock = 0xb2, basicCompliance = 1, fosq = 2, Invalid = 0xff, sleepProfile = 8, sleepProfile2 = 10, sleepProfile3 = 14, sleepTrend = 9, sleepTrend2 = 11, sleepTrend3 = 15, smartAutoCPAPProfile = 3, smartAutoCPAPTrend = 4, ventCompliance2 = 13, ventilatorCompliance = 7, ventilatorProfile = 6, ventProfile2 = 12 startChar = 0xfe, stopChar = 0x7f */ int MSeriesLoader::Open(QString path) { // Until a smartcard reader is written, this is not an auto-scanner.. it just opens a block file.. QFile file(path); if (!file.exists()) { return 0; } if (file.size() != 32768) { // Check filesize matches smartcard? return 0; } if (!file.open(QFile::ReadOnly)) { qDebug() << "Couldn't open M-Series file:" << path; return 0; } QByteArray block = file.readAll(); // Thanks to Phil Gillam for the pointers on this one.. const unsigned char *cardinfo = (unsigned char *)block.data(); quint16 magic = cardinfo[0] << 8 | cardinfo[1]; if (magic != 0x5249) { // "RI" Respironics Magic number return 0; } //quint8 cardtype=cardinfo[2]; //quint8 cardver=cardinfo[3]; quint16 user_offset = (cardinfo[4] << 8) | cardinfo[5]; //quint16 rx_offset=(cardinfo[8] << 8) | cardinfo[9]; quint16 control_offset = (cardinfo[12] << 8) | cardinfo[13]; //quint16 data_offset=(cardinfo[16] << 8) | cardinfo[17]; const char *userinfo = block.data() + user_offset; QString setname = QString(userinfo + 0x1); QString firstname = QString(userinfo + 0x11); QString lastname = QString(userinfo + 0x2a); QString serial = QString(userinfo + 0x43); serial.truncate(10); QString model = QString(userinfo + 0x4d); QString textdata = QString(userinfo + 0x57); quint8 userinfochk = *(userinfo + 0x77); quint8 tmp = 0; for (int i = 0; i < 0x77; i++) { tmp += userinfo[i]; } if (tmp != userinfochk) { qDebug() << "MSeries UserInfo block checksum failure" << path; } //const unsigned char * rxblock=(unsigned char *)block.data()+rx_offset; unsigned char *controlblock = (unsigned char *)block.data() + control_offset; quint16 count = controlblock[0] << 8 | controlblock[1]; // number of control blocks if (controlblock[1] != controlblock[2]) { qDebug() << "Control block count does not match." << path; } QList head, tail; controlblock += 3; quint16 datastarts, dataends, tmp16, h16, t16; if (controlblock[0]) { datastarts = controlblock[1] | (controlblock[2] << 8); dataends = controlblock[3] | (controlblock[4] << 8); } controlblock += 6; if (controlblock[0]) { if ((controlblock[1] | (controlblock[2] << 8)) != datastarts) { qDebug() << "Non matching card size start identifier" << path; } if ((controlblock[3] | (controlblock[4] << 8)) != dataends) { qDebug() << "Non matching card size end identifier" << path; } } controlblock += 6; count -= 2; tmp16 = controlblock[0] | controlblock[1] << 8; controlblock += 2; for (int i = 0; i < count / 2; i++) { if (controlblock[0]) { h16 = controlblock[1] | (controlblock[2] << 8); t16 = controlblock[3] | (controlblock[4] << 8); head.push_back(h16); tail.push_back(t16); } controlblock += 6; if (controlblock[0]) { if ((controlblock[1] | (controlblock[2] << 8)) != h16) { qDebug() << "Non matching control block head value" << path; } if ((controlblock[3] | (controlblock[4] << 8)) != t16) { qDebug() << "Non matching control block tail value" << path; } } controlblock += 6; } unsigned char *cb = controlblock; quint16 u1, u2, u3, u4, d1; quint32 ts, st, lt; QDateTime dt; QDate date; QTime time; for (int chk = 0; chk < 7; chk++) { ts = cb[0] << 24 | cb[1] << 16 | cb[2] << 8 | cb[3]; //ts-=epoch; dt = QDateTime::fromTime_t(ts); date = dt.date(); time = dt.time(); qDebug() << "New Sparse Chunk" << chk << dt << hex << ts; cb += 4; quint8 sum = 0; for (int i = 0; i < 0x268; i++) { sum += cb[i]; } if (cb[0x268] == sum) { qDebug() << "Checksum bad for block" << chk << path; } cb += 0x26a; } unsigned char *endcard = (unsigned char *)block.data() + dataends; bool done = false; qint64 ti; int cnt = 0; do { ts = cb[0] << 24 | cb[1] << 16 | cb[2] << 8 | cb[3]; lt = st = ts; ti = qint64(ts) * 1000L; dt = QDateTime::fromTime_t(ts); date = dt.date(); time = dt.time(); qDebug() << "Details New Data Chunk" << cnt << dt << hex << ts; cb += 4; do { if (cb[0] == 0xfe) { // not sure what this means cb++; } u1 = cb[0] << 8 | cb[1]; // expecting 0xCXXX if (u1 == 0xffff) { // adjust timestamp code cb += 2; u1 = cb[0]; cb++; if (cb[0] == 0xfe) { u1 = cb[0] << 8 | cb[1]; // fe 0a, followed by timestamp cb += 2; break; // start on the next timestamp } } else { if ((cb[0] & 0xc0) == 0xc0) { cb += 2; u1 &= 0x0fff; // time delta?? lt = ts; ts = st + (u1 * 60); ti = qint64(ts) * 1000L; d1 = cb[0] << 8 | cb[1]; u2 = cb[2] << 8 | cb[3]; u3 = cb[4] << 8 | cb[5]; u4 = cb[6] << 8 | cb[7]; if ((d1 != 0xf302) || (u2 != 0xf097) || (u3 != 0xf2ff) || (u4 != 0xf281)) { qDebug() << "Lost details sync reading M-Series file" << path; return false; } cb += 8; } else { cb++; } dt = QDateTime::fromTime_t(ts); qDebug() << "Details Data Chunk" << cnt++ << dt; do { d1 = cb[0] << 8 | cb[1]; cb += 2; if (d1 == 0x7f0a) { // end of entire block done = true; break; } if ((d1 & 0xb000) == 0xb000) { qDebug() << "Duration" << (d1 & 0x7ff); break; // end of section } // process binary data.. // 64 c0 } while (cb < endcard); } } while (cb < endcard && !done); } while (cb < endcard && !done); done = false; //bool first=true; quint8 exch; cnt = 0; do { u1 = cb[0] << 8 | cb[1]; if (u1 != 0xfe0b) { done = true; break; } cb += 2; st = ts = cb[0] << 24 | cb[1] << 16 | cb[2] << 8 | cb[3]; dt = QDateTime::fromTime_t(ts); date = dt.date(); time = dt.time(); //qDebug() << "Summary Data Chunk" << cnt << dt << hex << ts; cb += 4; while (cb < endcard) { if (((cb[0] & 0xc0) != 0xc0) || ((cb[0] & 0xf0) == 0xf0)) { // what is this for?? exch = cb[0]; cb++; } u1 = (cb[0] << 8 | cb[1]) & 0x7ff; // time delta u2 = (cb[2] << 8 | cb[3]) & 0x7ff; // 0xBX XX?? ts = st + u1 * 60; dt = QDateTime::fromTime_t(ts); //qDebug() << "Summary Sub Chunk" << dt << u1 << u2 << hex << ts; cb += 4; if (cb[0] == 0xff) { break; } } cb++; // ff; // 05905: "22 48 00 00 04 01 01 5C 9E 30 00 F0 00 01 73 00 00 00 F2 Sat Jul 9 2011 10:44:25" // 05905: "20 58 00 00 00 00 00 32 69 88 00 70 00 01 73 00 00 00 AF Sun Jul 10 2011 05:09:21" // 05906: "22 00 00 00 0B 00 01 4E 79 F8 02 70 00 01 73 00 00 00 56 Sun Jul 10 2011 10:27:05" // 05907: "21 4C 00 00 11 00 01 5C 95 F8 01 F0 00 01 73 00 00 00 54 Mon Jul 11 2011 10:59:42" // 05908: "20 A8 00 00 02 00 01 4E 7D 88 00 F0 00 01 73 00 00 00 90 Tue Jul 12 2011 03:44:38" // 05909: "21 94 00 00 34 01 01 6A 96 D8 01 70 00 01 73 00 00 00 FC Tue Jul 12 2011 10:30:49" // 05910: "21 84 00 00 19 01 01 6A A2 30 00 F0 00 01 73 00 00 00 3E Wed Jul 13 2011 10:30:14" // 05911: "22 38 00 00 3F 01 01 86 B2 A0 00 F1 00 01 73 00 00 00 F4 Thu Jul 14 2011 10:01:50" // 05912: "21 68 00 00 36 01 01 5C 91 F8 02 70 00 01 73 00 00 00 BF Fri Jul 15 2011 10:46:33" // 05913: "22 6C 0E 00 A1 01 01 78 AB 10 00 F0 00 01 73 00 00 00 9A Sat Jul 16 2011 10:44:56" // 0x04 Vibratory Snore cnt++; QString a; for (int i = 0; i < 0x13; i++) { a += QString().sprintf("%02X ", cb[i]); } a += " " + date.toString() + " " + time.toString(); qDebug() << a; cb += 0x13; } while (cb < endcard && !done); //graph data //starts with timestamp.. or time delta if high bit is set. // validFlagOne = 3, // headPtrOne = 4, // tailPtrOne = 6, // cdbChecksumOne = 8, // validFlagTwo = 9 // headPtrTwo = 10, // tailPtrTwo = 12, // cdbChecksumTwo = 14, // const char * datablock=block.data()+data_offset; // quint8 basicCompliance=datablock[1]; // quint8 fosq=datablock[2]; // quint8 smartAutoCPAPProfile=datablock[3]; // quint8 smartAutoCPAPTrend=datablock[4]; // quint8 ventProfile=datablock[6]; // quint8 ventCompliance1=datablock[7]; // quint8 sleepProfile1=datablock[8]; // quint8 sleepTrend1=datablock[9]; // quint8 sleepProfile2=datablock[10]; // quint8 sleepTrend2=datablock[11]; // quint8 ventProfile2=datablock[12]; // quint8 ventCompliance2=datablock[13]; // quint8 sleepProfile3=datablock[14]; // quint8 sleepTrend3=datablock[15]; // 0xa6: 01 00 b2 7f ff 31 // 0xac: 01 00 b2 7f ff 31 // 0xb2: ??? block... ? // 0xb2: 00 00 // 0xb4: 01 36 a3 36 a2 b2 // the last bytes of all these are 8 bit additive checksums. // 0xba: 01 36 a3 36 a2 b2 // 0xc0: 01 00 26 00 07 2e // 0xc6: 01 00 26 00 07 2e // 0xcc: 01 52 5a 58 e6 eb // 0xd2: 01 52 5a 58 e6 eb // repeat 8 times // 0xd8: 4e 1a 4a fe // 268 bytes // 1 byte checksum // starting at 0xD8, with timestamp? // 8 blocks of 0x26e in size // idx 0x159 = // basicCompliance = 1, // fosq = 2, // sleepProfile = 8, // sleepProfile2 = 10, // sleepProfile3 = 14, // sleepTrend = 9, // sleepTrend2 = 11, // sleepTrend3 = 15, // smartAutoCPAPProfile = 3, // smartAutoCPAPTrend = 4, // ventCompliance2 = 13, // ventilatorCompliance = 7, // ventilatorProfile = 6, // ventProfile2 = 12 // Invalid = 0xff, // startChar = 0xfe, // stopChar = 0x7f //Machine *mach=CreateMachine(serial,profile); // 0xcount till next block (between f3 02... blocks) // 0xc0 00 // varies // 0xf3 02 f0 97 f2 ff f2 81 return 1; } bool mseries_initialized = false; void MSeriesLoader::Register() { if (mseries_initialized) { return; } qDebug() << "Registering RemStar M-Series Loader"; RegisterLoader(new MSeriesLoader()); //InitModelMap(); mseries_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/prs1_loader.h0000644000175000017500000001421112412506713024432 0ustar sergiosergio/* SleepLib PRS1 Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef PRS1LOADER_H #define PRS1LOADER_H //#include //using namespace std; #include "SleepLib/machine.h" // Base class: MachineLoader #include "SleepLib/machine_loader.h" #include "SleepLib/profiles.h" //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the following value when making changes to this loaders implementation. // const int prs1_data_version = 13; // //******************************************************************************************** /*! \class PRS1 \brief PRS1 customized machine object (via CPAP) */ class PRS1: public CPAP { public: PRS1(MachineID id = 0); virtual ~PRS1(); }; const int max_load_buffer_size = 1024 * 1024; const QString prs1_class_name = STR_MACH_PRS1; /*! \struct PRS1Waveform \brief Used in PRS1 Waveform Parsing */ struct PRS1Waveform { PRS1Waveform(quint16 i, quint8 f) { interleave = i; sample_format = f; } quint16 interleave; quint8 sample_format; }; class PRS1DataChunk { friend class PRS1DataGroup; public: PRS1DataChunk() { timestamp = 0; ext = 255; sessionid = 0; htype = 0; family = 0; familyVersion = 0; duration = 0; } ~PRS1DataChunk() { } inline int size() const { return m_data.size(); } QByteArray m_data; SessionID sessionid; quint8 fileVersion; quint8 ext; quint8 htype; quint8 family; quint8 familyVersion; quint32 timestamp; quint16 duration; QList waveformInfo; }; class PRS1Loader; class PRS1Import:public ImportTask { public: PRS1Import(PRS1Loader * l, SessionID s, Machine * m): loader(l), sessionid(s), mach(m) { summary = nullptr; compliance = nullptr; event = nullptr; session = nullptr; } virtual ~PRS1Import() { delete compliance; delete summary; delete event; for (int i=0;i < waveforms.size(); ++i) {delete waveforms.at(i); } } virtual void run(); PRS1DataChunk * compliance; PRS1DataChunk * summary; PRS1DataChunk * event; QList waveforms; QList oximetery; QString wavefile; QString oxifile; bool ParseCompliance(); bool ParseSummary(); bool ParseEvents(); bool ParseWaveforms(); bool ParseOximetery(); bool ParseSummaryF0(); bool ParseSummaryF0V4(); bool ParseSummaryF3(); bool ParseSummaryF5V0(); bool ParseSummaryF5V1(); //! \brief Parse a single data chunk from a .002 file containing event data for a standard system one machine bool ParseF0Events(); //! \brief Parse a single data chunk from a .002 file containing event data for a family 5 ASV machine (which has a different format) bool ParseF5Events(); protected: Session * session; PRS1Loader * loader; SessionID sessionid; Machine * mach; int summary_duration; }; /*! \class PRS1Loader \brief Philips Respironics System One Loader Module */ class PRS1Loader : public CPAPLoader { public: PRS1Loader(); virtual ~PRS1Loader(); QString checkDir(const QString & path); bool PeekProperties(MachineInfo & info, QString path, Machine * mach = nullptr); //! \brief Detect if the given path contains a valid Folder structure virtual bool Detect(const QString & path); virtual MachineInfo PeekInfo(const QString & path); //! \brief Scans directory path for valid PRS1 signature virtual int Open(QString path); //! \brief Returns the database version of this loader virtual int Version() { return prs1_data_version; } //! \brief Return the loaderName, in this case "PRS1" virtual const QString &loaderName() { return prs1_class_name; } QList ParseFile(QString path); //! \brief Register this Module to the list of Loaders, so it knows to search for PRS1 data. static void Register(); virtual MachineInfo newInfo() { return MachineInfo(MT_CPAP, 0, prs1_class_name, QObject::tr("Philips Respironics"), QString(), QString(), QString(), QObject::tr("System One"), QDateTime::currentDateTime(), prs1_data_version); } virtual QString PresReliefLabel() { return QObject::tr(""); } virtual ChannelID PresReliefMode() { return PRS1_FlexMode; } virtual ChannelID PresReliefLevel() { return PRS1_FlexLevel; } virtual ChannelID HumidifierConnected() { return PRS1_HumidStatus; } virtual ChannelID HumidifierLevel() { return PRS1_HumidLevel; } void initChannels(); QHash sesstasks; protected: QString last; QHash PRS1List; //! \brief Opens the SD folder structure for this machine, scans for data files and imports any new sessions int OpenMachine(QString path); // //! \brief Parses "properties.txt" file containing machine information // bool ParseProperties(Machine *m, QString filename); //! \brief Parse a .005 waveform file, extracting Flow Rate waveform (and Mask Pressure data if available) bool OpenWaveforms(SessionID sid, QString filename); //! \brief Parse a data chunk from the .000 (brick) and .001 (summary) files. bool ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp, unsigned char *data, quint16 size, int family, int familyVersion); //! \brief Open a PRS1 data file, and break into data chunks, delivering them to the correct parser. bool OpenFile(Machine *mach, QString filename); QHash extra_session; //! \brief PRS1 Data files can store multiple sessions, so store them in this list for later processing. QHash new_sessions; qint32 summary_duration; }; #endif // PRS1LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/zeo_loader.cpp0000644000175000017500000002241212412506713024677 0ustar sergiosergio/* SleepLib ZEO Loader Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ //******************************************************************************************** // IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the zeo_data_version in zel_loader.h when making changes to this loader // that change loader behaviour or modify channels. //******************************************************************************************** #include #include #include "zeo_loader.h" #include "SleepLib/machine.h" ZEOLoader::ZEOLoader() { m_type = MT_SLEEPSTAGE; } ZEOLoader::~ZEOLoader() { } int ZEOLoader::Open(QString path) { Q_UNUSED(path) QString newpath; QString dirtag = "zeo"; // Could Scan the ZEO folder for a list of CSVs path = path.replace("\\", "/"); if (path.toLower().endsWith("/" + dirtag)) { return 0; //newpath=path; } else { newpath = path + "/" + dirtag.toUpper(); } //QString filename; // ZEO folder structure detection stuff here. return 0; // number of machines affected } /*15233: "Sleep Date" 15234: "ZQ" 15236: "Total Z" 15237: "Time to Z" 15237: "Time in Wake" 15238: "Time in REM" 15238: "Time in Light" 15241: "Time in Deep" 15242: "Awakenings" 15245: "Start of Night" 15246: "End of Night" 15246: "Rise Time" 15247: "Alarm Reason" 15247: "Snooze Time" 15254: "Wake Tone" 15259: "Wake Window" 15259: "Alarm Type" 15260: "First Alarm Ring" 15261: "Last Alarm Ring" 15261: "First Snooze Time" 15265: "Last Snooze Time" 15266: "Set Alarm Time" 15266: "Morning Feel" 15267: "Sleep Graph" 15267: "Detailed Sleep Graph" 15268: "Firmware Version" */ int ZEOLoader::OpenFile(QString filename) { QFile file(filename); if (filename.toLower().endsWith(".csv")) { if (!file.open(QFile::ReadOnly)) { qDebug() << "Couldn't open zeo file" << filename; return 0; } } else {// if (filename.toLower().endsWith(".dat")) { return 0; // not supported. } QTextStream text(&file); QString headerdata = text.readLine(); QStringList header = headerdata.split(","); QString line; QStringList linecomp; QDateTime start_of_night, end_of_night, rise_time; SessionID sid; //const qint64 WindowSize=30000; qint64 st, tt; int stage; int ZQ, TotalZ, TimeToZ, TimeInWake, TimeInREM, TimeInLight, TimeInDeep, Awakenings; int AlarmReason, SnoozeTime, WakeTone, WakeWindow, AlarmType, MorningFeel; QString FirmwareVersion, MyZeoVersion; QDateTime FirstAlarmRing, LastAlarmRing, FirstSnoozeTime, LastSnoozeTime, SetAlarmTime; QStringList SG, DSG; MachineInfo info = newInfo(); Machine *mach = CreateMachine(info); int idxZQ = header.indexOf("ZQ"); int idxTotalZ = header.indexOf("Total Z"); int idxAwakenings = header.indexOf("Awakenings"); int idxSG = header.indexOf("Sleep Graph"); int idxDSG = header.indexOf("Detailed Sleep Graph"); int idxTimeInWake = header.indexOf("Time in Wake"); int idxTimeToZ = header.indexOf("Time to Z"); int idxTimeInREM = header.indexOf("Time in REM"); int idxTimeInLight = header.indexOf("Time in Light"); int idxTimeInDeep = header.indexOf("Time in Deep"); int idxStartOfNight = header.indexOf("Start of Night"); int idxEndOfNight = header.indexOf("End of Night"); int idxRiseTime = header.indexOf("Rise Time"); int idxAlarmReason = header.indexOf("Alarm Reason"); int idxSnoozeTime = header.indexOf("Snooze Time"); int idxWakeTone = header.indexOf("Wake Tone"); int idxWakeWindow = header.indexOf("Wake Window"); int idxAlarmType = header.indexOf("Alarm Type"); int idxFirstAlaramRing = header.indexOf("First Alarm Ring"); int idxLastAlaramRing = header.indexOf("Last Alarm Ring"); int idxFirstSnoozeTime = header.indexOf("First Snooze Time"); int idxLastSnoozeTime = header.indexOf("Last Snooze Time"); int idxSetAlarmTime = header.indexOf("Set Alarm Time"); int idxMorningFeel = header.indexOf("Morning Feel"); int idxFirmwareVersion = header.indexOf("Firmware Version"); int idxMyZEOVersion = header.indexOf("My ZEO Version"); bool ok; bool dodgy; do { line = text.readLine(); dodgy = false; if (line.isEmpty()) { continue; } linecomp = line.split(","); ZQ = linecomp[idxZQ].toInt(&ok); if (!ok) { dodgy = true; } TotalZ = linecomp[idxTotalZ].toInt(&ok); if (!ok) { dodgy = true; } TimeToZ = linecomp[idxTimeToZ].toInt(&ok); if (!ok) { dodgy = true; } TimeInWake = linecomp[idxTimeInWake].toInt(&ok); if (!ok) { dodgy = true; } TimeInREM = linecomp[idxTimeInREM].toInt(&ok); if (!ok) { dodgy = true; } TimeInLight = linecomp[idxTimeInLight].toInt(&ok); if (!ok) { dodgy = true; } TimeInDeep = linecomp[idxTimeInDeep].toInt(&ok); if (!ok) { dodgy = true; } Awakenings = linecomp[idxAwakenings].toInt(&ok); if (!ok) { dodgy = true; } start_of_night = QDateTime::fromString(linecomp[idxStartOfNight], "MM/dd/yyyy HH:mm"); if (!start_of_night.isValid()) { dodgy = true; } end_of_night = QDateTime::fromString(linecomp[idxEndOfNight], "MM/dd/yyyy HH:mm"); if (!end_of_night.isValid()) { dodgy = true; } rise_time = QDateTime::fromString(linecomp[idxRiseTime], "MM/dd/yyyy HH:mm"); if (!rise_time.isValid()) { dodgy = true; } AlarmReason = linecomp[idxAlarmReason].toInt(&ok); if (!ok) { dodgy = true; } SnoozeTime = linecomp[idxSnoozeTime].toInt(&ok); if (!ok) { dodgy = true; } WakeTone = linecomp[idxWakeTone].toInt(&ok); if (!ok) { dodgy = true; } WakeWindow = linecomp[idxWakeWindow].toInt(&ok); if (!ok) { dodgy = true; } AlarmType = linecomp[idxAlarmType].toInt(&ok); if (!ok) { dodgy = true; } if (!linecomp[idxFirstAlaramRing].isEmpty()) { FirstAlarmRing = QDateTime::fromString(linecomp[idxFirstAlaramRing], "MM/dd/yyyy HH:mm"); if (!FirstAlarmRing.isValid()) { dodgy = true; } } if (!linecomp[idxLastAlaramRing].isEmpty()) { LastAlarmRing = QDateTime::fromString(linecomp[idxLastAlaramRing], "MM/dd/yyyy HH:mm"); if (!LastAlarmRing.isValid()) { dodgy = true; } } if (!linecomp[idxFirstSnoozeTime].isEmpty()) { FirstSnoozeTime = QDateTime::fromString(linecomp[idxFirstSnoozeTime], "MM/dd/yyyy HH:mm"); if (!FirstSnoozeTime.isValid()) { dodgy = true; } } if (!linecomp[idxLastSnoozeTime].isEmpty()) { LastSnoozeTime = QDateTime::fromString(linecomp[idxLastSnoozeTime], "MM/dd/yyyy HH:mm"); if (!LastSnoozeTime.isValid()) { dodgy = true; } } if (!linecomp[idxSetAlarmTime].isEmpty()) { SetAlarmTime = QDateTime::fromString(linecomp[idxSetAlarmTime], "MM/dd/yyyy HH:mm"); if (!SetAlarmTime.isValid()) { dodgy = true; } } MorningFeel = linecomp[idxMorningFeel].toInt(&ok); if (!ok) { MorningFeel = 0; } FirmwareVersion = linecomp[idxFirmwareVersion]; if (idxMyZEOVersion >= 0) { MyZeoVersion = linecomp[idxMyZEOVersion]; } if (dodgy) { continue; } SG = linecomp[idxSG].split(" "); DSG = linecomp[idxDSG].split(" "); const int WindowSize = 30000; sid = start_of_night.toTime_t(); if (DSG.size() == 0) { continue; } if (mach->SessionExists(sid)) { continue; } Session *sess = new Session(mach, sid); sess->settings[ZEO_Awakenings] = Awakenings; sess->settings[ZEO_MorningFeel] = MorningFeel; sess->settings[ZEO_TimeToZ] = TimeToZ; sess->settings[ZEO_ZQ] = ZQ; sess->settings[ZEO_TimeInWake] = TimeInWake; sess->settings[ZEO_TimeInREM] = TimeInREM; sess->settings[ZEO_TimeInLight] = TimeInLight; sess->settings[ZEO_TimeInDeep] = TimeInDeep; st = qint64(start_of_night.toTime_t()) * 1000L; sess->really_set_first(st); tt = st; EventList *sleepstage = sess->AddEventList(ZEO_SleepStage, EVL_Event, 1, 0, 0, 4); for (int i = 0; i < DSG.size(); i++) { stage = DSG[i].toInt(&ok); if (ok) { sleepstage->AddEvent(tt, stage); } tt += WindowSize; } sess->really_set_last(tt); int size = DSG.size(); sess->SetChanged(true); mach->AddSession(sess); qDebug() << linecomp[0] << start_of_night << end_of_night << rise_time << size << "30 second chunks"; } while (!line.isNull()); mach->Save(); return true; } static bool zeo_initialized = false; void ZEOLoader::Register() { if (zeo_initialized) { return; } qDebug("Registering ZEOLoader"); RegisterLoader(new ZEOLoader()); //InitModelMap(); zeo_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/somnopose_loader.h0000644000175000017500000000255012412506713025572 0ustar sergiosergio/* SleepLib Somnopose Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef SOMNOPOSELOADER_H #define SOMNOPOSELOADER_H #include "SleepLib/machine_loader.h" const QString somnopose_class_name = "Somnopose"; const int somnopose_data_version = 1; /*! \class SomnoposeLoader \brief Unfinished stub for loading Somnopose Positional CSV data */ class SomnoposeLoader : public MachineLoader { public: SomnoposeLoader(); virtual ~SomnoposeLoader(); virtual bool Detect(const QString &path) { Q_UNUSED(path); return false; } // bypass autoscanner virtual int Open(QString path); virtual int OpenFile(QString filename); static void Register(); virtual int Version() { return somnopose_data_version; } virtual const QString &loaderName() { return somnopose_class_name; } virtual MachineInfo newInfo() { return MachineInfo(MT_POSITION, 0, somnopose_class_name, QObject::tr("Somnopose"), QString(), QString(), QString(), QObject::tr("Somnopose Software"), QDateTime::currentDateTime(), somnopose_data_version); } //Machine *CreateMachine(); protected: private: }; #endif // SOMNOPOSELOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp0000644000175000017500000004455312412506713025043 0ustar sergiosergio/* SleepLib CMS50X Loader Implementation * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the cms50_data_version in cms50_loader.h when making changes to this loader // that change loader behaviour or modify channels. //******************************************************************************************** #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include "cms50_loader.h" #include "SleepLib/machine.h" #include "SleepLib/session.h" CMS50Loader::CMS50Loader() { m_type = MT_OXIMETER; m_abort = false; m_streaming = false; m_importing = false; imp_callbacks = 0; m_vendorID = 0x10c4; m_productID = 0xea60; cms50dplus = false; oxirec = nullptr; startTimer.setParent(this); resetTimer.setParent(this); } CMS50Loader::~CMS50Loader() { } bool CMS50Loader::Detect(const QString &path) { if (p_profile->oxi->oximeterType() == 1) { return true; } Q_UNUSED(path); return false; } int CMS50Loader::Open(QString path) { // Only one active Oximeter module at a time, set in preferences m_itemCnt = 0; m_itemTotal = 0; m_abort = false; m_importing = false; started_import = false; started_reading = false; finished_import = false; setStatus(NEUTRAL); imp_callbacks = 0; cb_reset = 0; m_time.start(); if (oxirec) { trashRecords(); } // Cheating using path for two serial oximetry modes if (path.compare("import") == 0) { for (int i=0; i<5; ++i) { resetDevice(); serial.flush(); // QThread::msleep(50); QApplication::processEvents(); } serial.clear(); setStatus(IMPORTING); startTimer.stop(); startImportTimeout(); return 1; } else if (path.compare("live") == 0) { for (int i=0; i<5; ++i) { resetDevice(); serial.flush(); QApplication::processEvents(); } serial.clear(); m_startTime = QDateTime::currentDateTime(); oxirec = new QVector; oxisessions[m_startTime] = oxirec; setStatus(LIVE); return 1; } QString ext = path.section(".",1); if ((ext.compare("spo2", Qt::CaseInsensitive)==0) || (ext.compare("spo", Qt::CaseInsensitive)==0) || (ext.compare("spor", Qt::CaseInsensitive)==0)) { // try to read and process SpoR file.. return readSpoRFile(path) ? 1 : 0; } return 0; } void CMS50Loader::processBytes(QByteArray bytes) { // Sync to start of message type we are interested in quint8 c; quint8 msgcode = 0x80; int idx=0; int bytesread = bytes.size(); while ((idx < bytesread) && (((c=(quint8)bytes.at(idx)) & msgcode)!=msgcode)) { if (buffer.length()>0) { // If buffer is the start of a valid but short frame, add to it.. buffer.append(c); }// otherwise dump these bytes, as they are out of sequence. ++idx; } // Copy the rest to the buffer. buffer.append(bytes.mid(idx)); int available = buffer.length(); switch (status()) { case IMPORTING: idx = doImportMode(); break; case LIVE: idx = doLiveMode(); break; default: ; // qDebug() << "Device mode not supported by" << loaderName(); } if (idx >= available) { buffer.clear(); } else if (idx > 0) { // Trim any processed bytes from the buffer. buffer = buffer.mid(idx); } if (buffer.length() > 0) { // If what's left doesn't start with a marker bit, dump it if (((unsigned char)buffer.at(0) & 0x80) != 0x80) { buffer.clear(); } } } int CMS50Loader::doImportMode() { int available = buffer.size(); // Q_ASSERT(!finished_import); int hour,minute; int idx = 0; while (idx < available) { unsigned char c=(unsigned char)buffer.at(idx); if (!started_import) { // There are three [0xf2 0xXX 0xXX] trio's at start of recording // Followed by [0xfX 0xXX 0xXX] trios containing spo2 and pulse till the end of recording // Scan for first header trio starting byte. if (c != 0xf2) { idx++; continue; } // sometimes a f2 starting trio can be corrupted by live data // peek ahead and see where the f2 headers are int f2cnt = 0; int f2idx[3] = {-1}; for (int i=0; i < 30; ++i) { if ((idx + i) >= available) { qDebug() << "Not enough bytes to read CMS50 headers"; break; } c = (unsigned char)buffer.at(idx+i); if (c == 0xf2) { f2idx[f2cnt++] = idx+i; if (f2cnt >= 3) break; // got all 3 headers // Skip the following two bytes i += 2; } } if (f2cnt<3) { qDebug() << "Did not get all header Trio's"; } f2cnt--; // CHECK: Check there might be length data after the last header trio.. received_bytes=0; bool badheader = false; // Look for the best of three headers trios int bestf2 = 0; if ((f2cnt >= 1) && ((f2idx[1] - f2idx[0]) == 3)) { bestf2 = f2idx[0]; } else if ((f2cnt >= 2) && ((f2idx[2] - f2idx[1]) == 3)) { bestf2 = f2idx[1]; } else { bestf2 = f2idx[f2cnt]; // ouch.. check if f0 starts afterwards if (((unsigned char)buffer.at(bestf2+3) & 0xf0) != 0xf0) { // crap.. bad time badheader = true; } } if (!badheader) { hour = (unsigned char)buffer.at(bestf2 + 1) & 0x7f; minute = (unsigned char)buffer.at(bestf2 + 2) & 0x7f; } else { hour = 0; minute = 0; } // Either a CMS50D+, has a bad header, or it's really midnight, set a flag anyway for later to help choose the right sync time cms50dplus = (hour == 0) && (minute == 0); MachineInfo info = newInfo(); info.model = cms50dplus ? QObject::tr("CMS50D+") : QObject::tr("CMS50E/F"); info.serial = QString(); Machine * mach = CreateMachine(info); qDebug() << QString("Receiving Oximeter transmission %1:%2").arg(hour).arg(minute); // set importing to true or whatever.. finished_import = false; started_import = true; started_reading = false; m_importing = true; m_itemCnt=0; m_itemTotal=5000; killTimers(); qDebug() << "Getting ready for import"; oxirec = new QVector; oxirec->reserve(30000); QDate oda=QDate::currentDate(); QTime oti=QTime(hour,minute); // Only CMS50E/F's have a realtime clock. CMS50D+ will set this to midnight // If the oximeter record time is more than the current time, then assume it was from the day before // Or should I use split time preference instead??? Foggy Confusements.. if (oti > QTime::currentTime()) { oda = oda.addDays(-1); } m_startTime = QDateTime(oda,oti); oxisessions[m_startTime] = oxirec; qDebug() << "Session start (according to CMS50)" << m_startTime << hex << buffer.at(idx + 1) << buffer.at(idx + 2) << ":" << dec << hour << minute ; cb_reset = 1; // CMS50D+ needs an end timer because it just stops dead after uploading resetTimer.singleShot(2000,this,SLOT(resetImportTimeout())); QStringList data; int len = f2idx[f2cnt]+3; for (int i=idx; i < len; ++i) { data.append(QString::number((unsigned char)buffer.at(i),16)); } qDebug() << "CMS50 Record Header bytes:" << data.join(","); idx = len; // peek ahead to see if there really is data length bytes.. data.clear(); for (int i=0; i < 12; ++i) { if ((idx+i) > available) break; data.push_back(QString::number((unsigned char)buffer.at(idx+i), 16)); } qDebug() << "bytes directly following header trio's:" << data.join(","); } else { // have started import if ((c & 0xf0) == 0xf0) { // Data trio started_reading=true; // Sometimes errornous crap is sent after data rec header // Recording import if ((idx + 2) >= available) { return idx; } quint8 pulse=(unsigned char)((buffer.at(idx + 1) & 0x7f) | ((c & 1) << 7)); quint8 spo2=(unsigned char)buffer.at(idx + 2) & 0xff; oxirec->append(OxiRecord(pulse,spo2)); received_bytes+=3; // TODO: Store the data to the session emit updateProgress(0, 0); idx += 3; } else if (!started_reading) { // have not got a valid trio yet, skip... idx += 1; } else { // scan ahead for another 0xf0 in case it's corrupted.. bool resync = false; for (int i=idx; i < available; ++i) { c=(unsigned char)buffer.at(i); if ((c & 0xf0) == 0xf0) { idx = i; resync = true; break; } } if (!resync) { // Data transfer has completed finished_import = true; killTimers(); m_importing = false; m_status = NEUTRAL; emit importComplete(this); resetTimer.singleShot(2000, this, SLOT(shutdownPorts())); return available; } } } } if (!started_import) { imp_callbacks = 0; } else { imp_callbacks++; } return idx; } int CMS50Loader::doLiveMode() { Q_ASSERT(oxirec != nullptr); int available = buffer.size(); int idx = 0; QByteArray plethy; while (idx < available-5) { if (((unsigned char)buffer.at(idx) & 0x80) != 0x80) { idx++; continue; } int pwave=(unsigned char)buffer.at(idx + 1); int pbeat=(unsigned char)buffer.at(idx + 2); int pulse=((unsigned char)buffer.at(idx + 3) & 0x7f) | ((pbeat & 0x40) << 1); int spo2=(unsigned char)buffer.at(idx + 4) & 0x7f; oxirec->append(OxiRecord(pulse, spo2)); plethy.append(pwave); idx += 5; } emit updatePlethy(plethy); return idx; } void CMS50Loader::resetDevice() // Switch CMS50D+ device to live streaming mode { //qDebug() << "Sending reset code to CMS50 device"; //m_port->flush(); static unsigned char b1[3]={0xf6,0xf6,0xf6}; if (serial.write((char *)b1,3) == -1) { qDebug() << "Couldn't write data reset bytes to CMS50"; } QApplication::processEvents(); } void CMS50Loader::requestData() // Switch CMS50D+ device to record transmission mode { static unsigned char b1[2]={0xf5,0xf5}; //qDebug() << "Sending request code to CMS50 device"; if (serial.write((char *)b1,2) == -1) { qDebug() << "Couldn't write data request bytes to CMS50"; } QApplication::processEvents(); } void CMS50Loader::killTimers() { startTimer.stop(); resetTimer.stop(); } void CMS50Loader::startImportTimeout() { if (!m_streaming) return; if (started_import) { return; } Q_ASSERT(finished_import == false); //qDebug() << "Starting oximeter import timeout"; // Wait until events really are jammed on the CMS50D+ before re-requesting data. const int delay = 500; if (m_abort) { m_streaming = false; closeDevice(); return; } if (imp_callbacks == 0) { // Frozen, but still hasn't started? m_itemCnt = m_time.elapsed(); if (m_itemCnt > START_TIMEOUT) { // Give up after START_TIMEOUT closeDevice(); abort(); QMessageBox::warning(nullptr, STR_MessageBox_Error, "

    "+tr("Could not get data transmission from oximeter.")+"

    "+tr("Please ensure you select 'upload' from the oximeter devices menu.")+"

    "); return; } else { // Note: Newer CMS50 devices transmit from user input, but there is no way of differentiating between models requestData(); } emit updateProgress(m_itemCnt, START_TIMEOUT); // Schedule another callback to make sure it's started startTimer.singleShot(delay, this, SLOT(startImportTimeout())); } } void CMS50Loader::resetImportTimeout() { if (finished_import) { return; } if (imp_callbacks != cb_reset) { // Still receiving data.. reset timer qDebug() << "Still receiving data in resetImportTimeout()" << imp_callbacks << cb_reset; if (resetTimer.isActive()) resetTimer.stop(); if (!finished_import) resetTimer.singleShot(2000, this, SLOT(resetImportTimeout())); } else { qDebug() << "Oximeter device stopped transmitting.. Transfer complete"; // We were importing, but now are done if (!finished_import && (started_import && started_reading)) { qDebug() << "Switching CMS50 back to live mode and finalizing import"; // Turn back on live streaming so the end of capture can be dealt with resetTimer.stop(); resetDevice(); // Send Reset to CMS50D+ serial.flush(); QThread::msleep(200); resetDevice(); // Send Reset to CMS50D+ serial.flush(); serial.clear(); //started_import = false; // finished_import = true; //m_streaming=false; //closeDevice(); //emit transferComplete(); //doImportComplete(); return; } qDebug() << "Should CMS50 resetImportTimeout reach here?"; // else what??? } cb_reset = imp_callbacks; } void CMS50Loader::shutdownPorts() { closeDevice(); } bool CMS50Loader::readSpoRFile(QString path) { QFile file(path); if (!file.exists()) { return false; } if (!file.open(QFile::ReadOnly)) { return false; } bool spo2header = false; QString ext = path.section('.', -1); if (ext.compare("spo2",Qt::CaseInsensitive) == 0) { spo2header = true; } QByteArray data; qint64 filesize = file.size(); data = file.readAll(); QDataStream in(data); in.setByteOrder(QDataStream::LittleEndian); quint16 pos; in >> pos; in.skipRawData(pos - 2); //long size = data.size(); int bytes_per_record = 2; if (!spo2header) { // next is 0x0002 // followed by 16bit duration in seconds // Read date and time (it's a 16bit charset) char dchr[20]; int j = 0; for (int i = 0; i < 18 * 2; i += 2) { dchr[j++] = data.at(8 + i); } dchr[j] = 0; if (dchr[0]) { QString dstr(dchr); m_startTime = QDateTime::fromString(dstr, "MM/dd/yy HH:mm:ss"); if (m_startTime.date().year() < 2000) { m_startTime = m_startTime.addYears(100); } } else { m_startTime = QDateTime(QDate::currentDate(), QTime(0,0,0)); } } else { // !spo2header quint32 samples = 0; // number of samples quint32 year, month, day; quint32 hour, minute, second; if (data.at(pos) != 1) { qWarning() << ".spo2 file" << path << "might be a different"; } // Unknown cruft header... in.skipRawData(200); in >> year >> month >> day; in >> hour >> minute >> second; m_startTime = QDateTime(QDate(year, month, day), QTime(hour, minute, second)); // ignoring it for now pos += 0x1c + 200; in >> samples; int remainder = filesize - pos; bytes_per_record = remainder / samples; qDebug() << samples << "samples of" << bytes_per_record << "bytes each"; // CMS50I .spo2 data have 4 digits, a 16bit, followed by spo2 then pulse } oxirec = new QVector; oxisessions[m_startTime] = oxirec; unsigned char o2, pr; quint16 un; // Read all Pulse and SPO2 data do { if (bytes_per_record > 2) { in >> un; } in >> o2; in >> pr; if ((o2 == 0x7f) && (pr == 0xff)) { o2 = pr = 0; un = 0; } if (spo2header) { oxirec->append(OxiRecord(pr, o2)); } else { oxirec->append(OxiRecord(o2, pr)); } } while (!in.atEnd()); // for (int i = pos; i < size - 2;) { // o2 = (unsigned char)(data.at(i + 1)); // pr = (unsigned char)(data.at(i + 0)); // oxirec->append(OxiRecord(pr, o2)); // i += 2; // } // processing gets done later return true; } void CMS50Loader::process() { // Just clean up any extra crap before oximeterimport parses the oxirecords.. return; // if (!oxirec) // return; // int size=oxirec->size(); // if (size<10) // return; } static bool cms50_initialized = false; void CMS50Loader::Register() { if (cms50_initialized) { return; } qDebug() << "Registering CMS50Loader"; RegisterLoader(new CMS50Loader()); cms50_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/md300w1_loader.h0000644000175000017500000000402212412506713024637 0ustar sergiosergio/* SleepLib ChoiceMMed MD300W1 Oximeter Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef MD300W1LOADER_H #define MD300W1LOADER_H #include "SleepLib/serialoximeter.h" const QString md300w1_class_name = "MD300W1"; const int md300w1_data_version = 1; /*! \class MD300W1Loader \brief Importer for ChoiceMMed MD300W1 data format.. */ class MD300W1Loader : public SerialOximeter { Q_OBJECT public: MD300W1Loader(); virtual ~MD300W1Loader(); virtual bool Detect(const QString &path); virtual int Open(QString path); static void Register(); virtual int Version() { return md300w1_data_version; } virtual const QString &loaderName() { return md300w1_class_name; } // Machine *CreateMachine(); virtual MachineInfo newInfo() { return MachineInfo(MT_OXIMETER, 0, md300w1_class_name, QObject::tr("ChoiceMMed"), QString(), QString(), QString(), QObject::tr("MD300"), QDateTime::currentDateTime(), md300w1_data_version); } virtual void process(); virtual bool isStartTimeValid() { return true; } protected slots: virtual void resetImportTimeout(); virtual void startImportTimeout(); protected: bool readDATFile(QString path); virtual void processBytes(QByteArray bytes); int doImportMode(); int doLiveMode(); virtual void killTimers(); // Switch MD300W1 device to live streaming mode virtual void resetDevice(); // Switch MD300W1 device to record transmission mode void requestData(); private: EventList *PULSE; EventList *SPO2; QTime m_time; QByteArray buffer; bool started_import; bool finished_import; bool started_reading; QDateTime oxitime; int cb_reset,imp_callbacks; int received_bytes; int m_itemCnt; int m_itemTotal; }; #endif // MD300W1LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp0000644000175000017500000004647712412506713026264 0ustar sergiosergio/* SleepLib (DeVilbiss) Intellipap Loader Implementation * * Notes: Intellipap requires the SmartLink attachment to access this data. * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include "intellipap_loader.h" extern QProgressBar *qprogress; ChannelID INTP_SmartFlexMode, INTP_SmartFlexLevel; Intellipap::Intellipap(MachineID id) : CPAP(id) { } Intellipap::~Intellipap() { } IntellipapLoader::IntellipapLoader() { const QString INTELLIPAP_ICON = ":/icons/intellipap.png"; QString s = newInfo().series; m_pixmap_paths[s] = INTELLIPAP_ICON; m_pixmaps[s] = QPixmap(INTELLIPAP_ICON); m_buffer = nullptr; m_type = MT_CPAP; } IntellipapLoader::~IntellipapLoader() { } bool IntellipapLoader::Detect(const QString & givenpath) { QDir dir(givenpath); if (!dir.exists()) { return false; } // Intellipap has a folder called SL in the root directory if (!dir.cd("SL")) { return false; } // Check for the settings file inside the SL folder if (!dir.exists("SET1")) { return false; } return true; } int IntellipapLoader::Open(QString path) { // Check for SL directory // Check for DV5MFirm.bin? QString newpath; path = path.replace("\\", "/"); QString dirtag = "SL"; if (path.endsWith("/" + dirtag)) { return -1; //newpath=path; } else { newpath = path + "/" + dirtag; } QString filename; ////////////////////////// // Parse the Settings File ////////////////////////// filename = newpath + "/SET1"; QFile f(filename); if (!f.exists()) { return -1; } f.open(QFile::ReadOnly); QTextStream tstream(&f); const QString INT_PROP_Serial = "Serial"; const QString INT_PROP_Model = "Model"; const QString INT_PROP_Mode = "Mode"; const QString INT_PROP_MaxPressure = "Max Pressure"; const QString INT_PROP_MinPressure = "Min Pressure"; const QString INT_PROP_IPAP = "IPAP"; const QString INT_PROP_EPAP = "EPAP"; const QString INT_PROP_PS = "PS"; const QString INT_PROP_RampPressure = "Ramp Pressure"; const QString INT_PROP_RampTime = "Ramp Time"; const QString INT_PROP_HourMeter = "Usage Hours"; const QString INT_PROP_ComplianceMeter = "Compliance Hours"; const QString INT_PROP_ErrorCode = "Error"; const QString INT_PROP_LastErrorCode = "Long Error"; const QString INT_PROP_LowUseThreshold = "Low Usage"; const QString INT_PROP_SmartFlex = "SmartFlex"; const QString INT_PROP_SmartFlexMode = "SmartFlexMode"; QHash lookup; lookup["Sn"] = INT_PROP_Serial; lookup["Mn"] = INT_PROP_Model; lookup["Mo"] = INT_PROP_Mode; // 0 cpap, 1 auto //lookup["Pn"]="??"; lookup["Pu"] = INT_PROP_MaxPressure; lookup["Pl"] = INT_PROP_MinPressure; lookup["Pi"] = INT_PROP_IPAP; lookup["Pe"] = INT_PROP_EPAP; // == WF on Auto models lookup["Ps"] = INT_PROP_PS; // == WF on Auto models, Pressure support //lookup["Ds"]="??"; //lookup["Pc"]="??"; lookup["Pd"] = INT_PROP_RampPressure; lookup["Dt"] = INT_PROP_RampTime; //lookup["Ld"]="??"; //lookup["Lh"]="??"; //lookup["FC"]="??"; //lookup["FE"]="??"; //lookup["FL"]="??"; lookup["A%"]="ApneaThreshold"; lookup["Ad"]="ApneaDuration"; lookup["H%"]="HypopneaThreshold"; lookup["Hd"]="HypopneaDuration"; //lookup["Pi"]="??"; //lookup["Pe"]="??"; lookup["Ri"]="SmartFlexIRnd"; // Inhale Rounding (0-5) lookup["Re"]="SmartFlexERnd"; // Inhale Rounding (0-5) //lookup["Bu"]="??"; // WF //lookup["Ie"]="??"; // 20 //lookup["Se"]="??"; // 05 //Inspiratory trigger? //lookup["Si"]="??"; // 05 // Expiratory Trigger? //lookup["Mi"]="??"; // 0 lookup["Uh"]="HoursMeter"; // 0000.0 lookup["Up"]="ComplianceMeter"; // 0000.00 //lookup["Er"]="ErrorCode";, // E00 //lookup["El"]="LongErrorCode"; // E00 00/00/0000 //lookup["Hp"]="??";, // 1 //lookup["Hs"]="??";, // 02 //lookup["Lu"]="LowUseThreshold"; // defaults to 0 (4 hours) lookup["Sf"] = INT_PROP_SmartFlex; lookup["Sm"] = INT_PROP_SmartFlexMode; lookup["Ks=s"]="Ks_s"; lookup["Ks=i"]="ks_i"; QHash set1; QHash::iterator hi; Machine *mach = nullptr; MachineInfo info = newInfo(); bool ok; EventDataType min_pressure = 0, max_pressure = 0, ramp_pressure = 0, set_epap = 0, set_ipap = 0, set_ps = 0, ramp_time = 0; int papmode = 0, smartflex = 0, smartflexmode = 0; while (1) { QString line = tstream.readLine(); if ((line.length() <= 2) || (line.isNull())) { break; } QString key = line.section("\t", 0, 0).trimmed(); hi = lookup.find(key); if (hi != lookup.end()) { key = hi.value(); } QString value = line.section("\t", 1).trimmed(); if (key == INT_PROP_Mode) { papmode = value.toInt(&ok); } else if (key == INT_PROP_Serial) { info.serial = value; } else if (key == INT_PROP_Model) { info.model = value; } else if (key == INT_PROP_MinPressure) { min_pressure = value.toFloat() / 10.0; } else if (key == INT_PROP_MaxPressure) { max_pressure = value.toFloat() / 10.0; } else if (key == INT_PROP_IPAP) { set_ipap = value.toFloat() / 10.0; } else if (key == INT_PROP_EPAP) { set_epap = value.toFloat() / 10.0; } else if (key == INT_PROP_PS) { set_ps = value.toFloat() / 10.0; } else if (key == INT_PROP_RampPressure) { ramp_pressure = value.toFloat() / 10.0; } else if (key == INT_PROP_RampTime) { ramp_time = value.toFloat() / 10.0; } else if (key == INT_PROP_SmartFlex) { smartflex = value.toInt(); } else if (key == INT_PROP_SmartFlexMode) { smartflexmode = value.toInt(); } else { set1[key] = value; } qDebug() << key << "=" << value; } CPAPMode mode = MODE_UNKNOWN; switch (papmode) { case 0: mode = MODE_CPAP; break; case 1: mode = (set_epap > 0) ? MODE_BILEVEL_FIXED : MODE_APAP; break; default: qDebug() << "New machine mode"; } if (!info.serial.isEmpty()) { mach = CreateMachine(info); } if (!mach) { qDebug() << "Couldn't get Intellipap machine record"; return -1; } QString backupPath = mach->getBackupPath(); QString copypath = path; if (QDir::cleanPath(path).compare(QDir::cleanPath(backupPath)) != 0) { copyPath(path, backupPath); } // Refresh properties data.. for (QHash::iterator i = set1.begin(); i != set1.end(); i++) { mach->properties[i.key()] = i.value(); } f.close(); /////////////////////////////////////////////// // Parse the Session Index (U File) /////////////////////////////////////////////// unsigned char buf[27]; filename = newpath + "/U"; f.setFileName(filename); if (!f.exists()) { return -1; } QVector SessionStart; QVector SessionEnd; QHash Sessions; quint32 ts1, ts2;//, length; //unsigned char cs; f.open(QFile::ReadOnly); int cnt = 0; QDateTime epoch(QDate(2002, 1, 1), QTime(0, 0, 0), Qt::UTC); // Intellipap Epoch int ep = epoch.toTime_t(); do { cnt = f.read((char *)buf, 9); // big endian ts1 = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; ts2 = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]; // buf[8] == ??? What is this byte? A Bit Field? A checksum? ts1 += ep; ts2 += ep; SessionStart.append(ts1); SessionEnd.append(ts2); } while (cnt > 0); qDebug() << "U file logs" << SessionStart.size() << "sessions."; f.close(); /////////////////////////////////////////////// // Parse the Session Data (L File) /////////////////////////////////////////////// filename = newpath + "/L"; f.setFileName(filename); if (!f.exists()) { return -1; } f.open(QFile::ReadOnly); long size = f.size(); int recs = size / 26; m_buffer = new unsigned char [size]; if (size != f.read((char *)m_buffer, size)) { qDebug() << "Couldn't read 'L' data" << filename; return -1; } Session *sess; SessionID sid; QHash rampstart; QHash rampend; for (int i = 0; i < SessionStart.size(); i++) { sid = SessionStart[i]; if (mach->SessionExists(sid)) { // knock out the already imported sessions.. SessionStart[i] = 0; SessionEnd[i] = 0; } else if (!Sessions.contains(sid)) { sess = Sessions[sid] = new Session(mach, sid); sess->really_set_first(qint64(sid) * 1000L); // sess->really_set_last(qint64(SessionEnd[i]) * 1000L); rampstart[sid] = 0; rampend[sid] = 0; sess->SetChanged(true); if (mode >= MODE_BILEVEL_FIXED) { sess->AddEventList(CPAP_IPAP, EVL_Event); sess->AddEventList(CPAP_EPAP, EVL_Event); sess->AddEventList(CPAP_PS, EVL_Event); } else { sess->AddEventList(CPAP_Pressure, EVL_Event); } sess->AddEventList(INTELLIPAP_Unknown1, EVL_Event); sess->AddEventList(INTELLIPAP_Unknown2, EVL_Event); sess->AddEventList(CPAP_LeakTotal, EVL_Event); sess->AddEventList(CPAP_MaxLeak, EVL_Event); sess->AddEventList(CPAP_TidalVolume, EVL_Event); sess->AddEventList(CPAP_MinuteVent, EVL_Event); sess->AddEventList(CPAP_RespRate, EVL_Event); sess->AddEventList(CPAP_Snore, EVL_Event); sess->AddEventList(CPAP_Obstructive, EVL_Event); sess->AddEventList(CPAP_VSnore, EVL_Event); sess->AddEventList(CPAP_Hypopnea, EVL_Event); sess->AddEventList(CPAP_NRI, EVL_Event); sess->AddEventList(CPAP_LeakFlag, EVL_Event); sess->AddEventList(CPAP_ExP, EVL_Event); } else { // If there is a double up, null out the earlier session // otherwise there will be a crash on shutdown. for (int z = 0; z < SessionStart.size(); z++) { if (SessionStart[z] == (quint32)sid) { SessionStart[z] = 0; SessionEnd[z] = 0; break; } } QDateTime d = QDateTime::fromTime_t(sid); qDebug() << sid << "has double ups" << d; /*Session *sess=Sessions[sid]; Sessions.erase(Sessions.find(sid)); delete sess; SessionStart[i]=0; SessionEnd[i]=0; */ } } long pos = 0; int rampval = 0; sid = 0; SessionID lastsid = 0; int last_minp=0, last_maxp=0, last_ps=0, last_pres = 0; for (int i = 0; i < recs; i++) { // convert timestamp to real epoch ts1 = ((m_buffer[pos] << 24) | (m_buffer[pos + 1] << 16) | (m_buffer[pos + 2] << 8) | m_buffer[pos + 3]) + ep; for (int j = 0; j < SessionStart.size(); j++) { sid = SessionStart[j]; if (!sid) { continue; } if ((ts1 >= (quint32)sid) && (ts1 <= SessionEnd[j])) { Session *sess = Sessions[sid]; qint64 time = quint64(ts1) * 1000L; sess->really_set_last(time); sess->settings[CPAP_Mode] = mode; int minp = m_buffer[pos + 0x13]; int maxp = m_buffer[pos + 0x14]; int ps = m_buffer[pos + 0x15]; int pres = m_buffer[pos + 0xd]; if (mode >= MODE_BILEVEL_FIXED) { rampval = maxp; } else { rampval = minp; } qint64 rs = rampstart[sid]; if (pres < rampval) { if (!rs) { // ramp started // int rv = pres-rampval; // double ramp = rampstart[sid] = time; } rampend[sid] = time; } else { if (rs > 0) { if (!sess->eventlist.contains(CPAP_Ramp)) { sess->AddEventList(CPAP_Ramp, EVL_Event); } int duration = (time - rs) / 1000L; sess->eventlist[CPAP_Ramp][0]->AddEvent(time, duration); rampstart.remove(sid); rampend.remove(sid); } } // Do this after ramp, because ramp calcs might need to insert interpolated pressure samples if (mode >= MODE_BILEVEL_FIXED) { sess->settings[CPAP_EPAP] = float(minp) / 10.0; sess->settings[CPAP_IPAP] = float(maxp) / 10.0; sess->settings[CPAP_PS] = float(ps) / 10.0; sess->eventlist[CPAP_IPAP][0]->AddEvent(time, float(pres) / 10.0); sess->eventlist[CPAP_EPAP][0]->AddEvent(time, float(pres-ps) / 10.0); // rampval = maxp; } else { sess->eventlist[CPAP_Pressure][0]->AddEvent(time, float(pres) / 10.0); // current pressure // rampval = minp; if (mode == MODE_APAP) { sess->settings[CPAP_PressureMin] = float(minp) / 10.0; sess->settings[CPAP_PressureMax] = float(maxp) / 10.0; } else if (mode == MODE_CPAP) { sess->settings[CPAP_Pressure] = float(maxp) / 10.0; } } sess->eventlist[CPAP_LeakTotal][0]->AddEvent(time, m_buffer[pos + 0x7]); // "Average Leak" sess->eventlist[CPAP_MaxLeak][0]->AddEvent(time, m_buffer[pos + 0x6]); // "Max Leak" int rr = m_buffer[pos + 0xa]; sess->eventlist[CPAP_RespRate][0]->AddEvent(time, rr); // Respiratory Rate // sess->eventlist[INTELLIPAP_Unknown1][0]->AddEvent(time, m_buffer[pos + 0xf]); // sess->eventlist[INTELLIPAP_Unknown1][0]->AddEvent(time, m_buffer[pos + 0xc]); sess->eventlist[CPAP_Snore][0]->AddEvent(time, m_buffer[pos + 0x4]); //4/5?? if (m_buffer[pos+0x4] > 0) { sess->eventlist[CPAP_VSnore][0]->AddEvent(time, m_buffer[pos + 0x5]); } // 0x0f == Leak Event // 0x04 == Snore? if (m_buffer[pos + 0xf] > 0) { // Leak Event sess->eventlist[CPAP_LeakFlag][0]->AddEvent(time, m_buffer[pos + 0xf]); } if (m_buffer[pos + 0x5] > 4) { // This matches Exhale Puff.. not sure why 4 //MW: Are the lower 2 bits something else? sess->eventlist[CPAP_ExP][0]->AddEvent(time, m_buffer[pos + 0x5]); } if (m_buffer[pos + 0x10] > 0) { sess->eventlist[CPAP_Obstructive][0]->AddEvent(time, m_buffer[pos + 0x10]); } if (m_buffer[pos + 0x11] > 0) { sess->eventlist[CPAP_Hypopnea][0]->AddEvent(time, m_buffer[pos + 0x11]); } if (m_buffer[pos + 0x12] > 0) { // NRI // is this == to RERA?? CA?? sess->eventlist[CPAP_NRI][0]->AddEvent(time, m_buffer[pos + 0x12]); } quint16 tv = (m_buffer[pos + 0x8] << 8) | m_buffer[pos + 0x9]; // correct sess->eventlist[CPAP_TidalVolume][0]->AddEvent(time, tv); EventDataType mv = tv * rr; // MinuteVent=TidalVolume * Respiratory Rate sess->eventlist[CPAP_MinuteVent][0]->AddEvent(time, mv / 1000.0); break; } else { } lastsid = sid; } pos += 26; } // Close any open ramps and store the event. QHash::iterator rit; QHash::iterator rit_end = rampstart.end(); for (rit = rampstart.begin(); rit != rit_end; ++rit) { qint64 rs = rit.value(); SessionID sid = rit.key(); if (rs > 0) { qint64 re = rampend[rit.key()]; Session *sess = Sessions[sid]; if (!sess->eventlist.contains(CPAP_Ramp)) { sess->AddEventList(CPAP_Ramp, EVL_Event); } int duration = (re - rs) / 1000L; sess->eventlist[CPAP_Ramp][0]->AddEvent(re, duration); rit.value() = 0; } } for (int i = 0; i < SessionStart.size(); i++) { SessionID sid = SessionStart[i]; if (sid) { sess = Sessions[sid]; if (!sess) continue; // quint64 first = qint64(sid) * 1000L; quint64 last = qint64(SessionEnd[i]) * 1000L; if (sess->last() > 0) { // sess->really_set_last(last); sess->settings[INTP_SmartFlexLevel] = smartflex; if (smartflexmode == 0) { sess->settings[INTP_SmartFlexMode] = PM_FullTime; } else { sess->settings[INTP_SmartFlexMode] = PM_RampOnly; } sess->settings[CPAP_RampPressure] = ramp_pressure; sess->settings[CPAP_RampTime] = ramp_time; sess->UpdateSummaries(); addSession(sess); } else { delete sess; } } } finishAddingSessions(); mach->Save(); delete [] m_buffer; if (qprogress) { qprogress->setValue(100); } f.close(); int c = Sessions.size(); return c; } void IntellipapLoader::initChannels() { using namespace schema; Channel * chan = nullptr; channel.add(GRP_CPAP, chan = new Channel(INTP_SmartFlexMode = 0x1165, SETTING, MT_CPAP, SESSION, "INTPSmartFlexMode", QObject::tr("SmartFlex Mode"), QObject::tr("Intellipap pressure relief mode."), QObject::tr("SmartFlex Mode"), "", DEFAULT, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, QObject::tr("Ramp Only")); chan->addOption(2, QObject::tr("Full Time")); channel.add(GRP_CPAP, chan = new Channel(INTP_SmartFlexLevel = 0x1169, SETTING, MT_CPAP, SESSION, "INTPSmartFlexLevel", QObject::tr("SmartFlex Level"), QObject::tr("Intellipap pressure relief level."), QObject::tr("SmartFlex Level"), "", DEFAULT, Qt::green)); } bool intellipap_initialized = false; void IntellipapLoader::Register() { if (intellipap_initialized) { return; } qDebug() << "Registering IntellipapLoader"; RegisterLoader(new IntellipapLoader()); //InitModelMap(); intellipap_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/md300w1_loader.cpp0000644000175000017500000001250712412506713025201 0ustar sergiosergio/* SleepLib ChoiceMMed MD300W1 Oximeter Loader Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the md300w1_data_version in md300w1_loader.h when making changes to this // loader that change loader behaviour or modify channels. //******************************************************************************************** #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include "md300w1_loader.h" #include "SleepLib/machine.h" #include "SleepLib/session.h" extern QProgressBar *qprogress; MD300W1Loader::MD300W1Loader() { m_type = MT_OXIMETER; m_abort = false; m_streaming = false; m_importing = false; imp_callbacks = 0; // have no idea.. assuming it's another CP2102 USB UART, which won't help detection :/ m_vendorID = 0; m_productID = 0; startTimer.setParent(this); resetTimer.setParent(this); } MD300W1Loader::~MD300W1Loader() { } bool MD300W1Loader::Detect(const QString &path) { Q_UNUSED(path); return false; } int MD300W1Loader::Open(QString path) { // Only one active Oximeter module at a time, set in preferences m_itemCnt = 0; m_itemTotal = 0; m_abort = false; m_importing = false; started_import = false; started_reading = false; finished_import = false; imp_callbacks = 0; cb_reset = 0; m_time.start(); // Cheating using path for two serial oximetry modes if (path.compare("import") == 0) { setStatus(IMPORTING); startTimer.stop(); startImportTimeout(); return 1; } else if (path.compare("live") == 0) { m_startTime = oxitime = QDateTime::currentDateTime(); setStatus(LIVE); return 1; } QString ext = path.section(".",1); if (ext.compare("dat", Qt::CaseInsensitive)==0) { // try to read and process SpoR file.. return readDATFile(path) ? 1 : 0; } return 0; } void MD300W1Loader::processBytes(QByteArray bytes) { Q_UNUSED(bytes); return; } int MD300W1Loader::doImportMode() { return 0; } int MD300W1Loader::doLiveMode() { return 0; } // Switch MD300W1 device to live streaming mode void MD300W1Loader::resetDevice() { } // Switch MD300W1 device to record transmission mode void MD300W1Loader::requestData() { } void MD300W1Loader::killTimers() { startTimer.stop(); resetTimer.stop(); } void MD300W1Loader::startImportTimeout() { return; } void MD300W1Loader::resetImportTimeout() { return; } // MedView .dat file (ChoiceMMed MD300B, MD300KI, MD300I, MD300W1, MD300C318, MD2000A) // Format: // Bytes 0 (1 2) // id n // n*11 0 1 2 3 4 5 6 7 8 9 10 // 0 0 id yr mm dd hh mm ss o2 pulse // report title etc. bool MD300W1Loader::readDATFile(QString path) { QFile file(path); if (!file.exists()) { return false; } if (!file.open(QFile::ReadOnly)) { return false; } QByteArray data; data = file.readAll(); long size = data.size(); // Number of records int n = ((unsigned char)data.at(2) << 8) | (unsigned char)data.at(1); // CHECKME: if (size < (n*11)+3) { qDebug() << "Short MD300W1 .dat file" << path; return false; } unsigned char o2, pr; qint32 lasttime=0, ts=0; int gap; for (int pos = 0; pos < n; ++pos) { int i = 3 + (pos * 11); QString datestr = QString().sprintf("%02d/%02d/%02d %02d:%02d:%02d",(unsigned char)data.at(i+4),(unsigned char)data.at(i+5),(unsigned char)data.at(i+3),(unsigned char)data.at(i+6),(unsigned char)data.at(i+7),(unsigned char)data.at(i+8)); QDateTime datetime = QDateTime::fromString(datestr,"MM/dd/yy HH:mm:ss"); if (datetime.date().year() < 2000) datetime = datetime.addYears(100); ts = datetime.toTime_t(); gap = ts - lasttime; if (gap > 1) { if (gap < 360) { // Less than 5 minutes? Merge session gap--; // fill with zeroes for (int j = 0; j < gap; j++) { oxirec->append(OxiRecord(0,0)); } } else { // Create a new session oxirec = new QVector; oxisessions[datetime] = oxirec; } } pr=(unsigned char)(data.at(i+10)); o2=(unsigned char)(data.at(i+9)); oxirec->append(OxiRecord(pr, o2)); lasttime = ts; } // processing gets done later return true; } void MD300W1Loader::process() { } static bool MD300W1_initialized = false; void MD300W1Loader::Register() { if (MD300W1_initialized) { return; } qDebug() << "Registering MD300W1Loader"; RegisterLoader(new MD300W1Loader()); MD300W1_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/resmed_loader.h0000644000175000017500000003331512412506713025032 0ustar sergiosergio/* SleepLib RESMED Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef RESMED_LOADER_H #define RESMED_LOADER_H //#include //using namespace std; #include #include "SleepLib/machine.h" // Base class: MachineLoader #include "SleepLib/machine_loader.h" #include "SleepLib/profiles.h" //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the following value when making changes to this loaders implementation. // const int resmed_data_version = 9; // //******************************************************************************************** enum EDFType { EDF_UNKNOWN, EDF_BRP, EDF_PLD, EDF_SAD, EDF_EVE, EDF_CSL }; EDFType lookupEDFType(QString text); const QString resmed_class_name = STR_MACH_ResMed; /*! \struct EDFHeader \brief Represents the EDF+ header structure, used as a place holder while processing the text data. \note More information on the EDF+ file format can be obtained from http://edfplus.info */ struct EDFHeader { char version[8]; char patientident[80]; char recordingident[80]; char datetime[16]; char num_header_bytes[8]; char reserved[44]; char num_data_records[8]; char dur_data_records[8]; char num_signals[4]; } #ifndef BUILD_WITH_MSVC __attribute__((packed)) #endif ; const int EDFHeaderSize = sizeof(EDFHeader); /*! \struct EDFSignal \brief Contains information about a single EDF+ Signal \note More information on the EDF+ file format can be obtained from http://edfplus.info */ struct EDFSignal { public: //! \brief Name of this Signal QString label; //! \brief Tranducer Type (source of the data, usually blank) QString transducer_type; //! \brief The units of measurements represented by this signal QString physical_dimension; //! \brief The minimum limits of the ungained data EventDataType physical_minimum; //! \brief The maximum limits of the ungained data EventDataType physical_maximum; //! \brief The minimum limits of the data with gain and offset applied EventDataType digital_minimum; //! \brief The maximum limits of the data with gain and offset applied EventDataType digital_maximum; //! \brief Raw integer data is multiplied by this value EventDataType gain; //! \brief This value is added to the raw data EventDataType offset; //! \brief Any prefiltering methods used (usually blank) QString prefiltering; //! \brief Number of records long nr; //! \brief Reserved (usually blank) QString reserved; //! \brief Pointer to the signals sample data qint16 *data; //! \brief a non-EDF extra used internally to count the signal data int pos; }; struct STRRecord { STRRecord() { maskon = 0; maskoff = 0; maskdur = 0; maskevents = -1; mode = -1; rms9_mode = -1; set_pressure = -1; epap = -1; max_pressure = -1; min_pressure = -1; max_epap = -1; min_epap = -1; max_ps = -1; min_ps = -1; ps = -1; ipap = -1; max_ipap = -1; min_ipap = -1; epr = -1; epr_level = -1; sessionid = 0; ahi = -1; ai = -1; hi = -1; uai = -1; cai = -1; leakmed = -1; leak95 = -1; leakmax = -1; leakgain = 0; s_RampTime = -1; s_RampEnable = -1; s_EPR_ClinEnable = -1; s_EPREnable = -1; s_PtAccess = -1; s_ABFilter = -1; s_Mask = -1; s_Tube = -1; s_ClimateControl = -1; s_HumEnable = -1; s_HumLevel = -1; s_TempEnable = -1; s_Temp = -1; s_SmartStart = -1; ramp_pressure = -1; date=QDate(); } STRRecord(const STRRecord & copy) { maskon = copy.maskon; maskoff = copy.maskoff; maskdur = copy.maskdur; maskevents = copy.maskevents; mode = copy.mode; rms9_mode = copy.rms9_mode; set_pressure = copy.set_pressure; epap = copy.epap; max_pressure = copy.max_pressure; min_pressure = copy.min_pressure; max_ps = copy.max_ps; min_ps = copy.min_ps; ps = copy.ps; max_epap = copy.max_epap; min_epap = copy.min_epap; ipap = copy.ipap; max_ipap = copy.max_ipap; min_ipap = copy.min_ipap; epr = copy.epr; epr_level = copy.epr_level; sessionid = copy.sessionid; ahi = copy.ahi; ai = copy.ai; hi = copy.hi; uai = copy.uai; cai = copy.cai; date = copy.date; leakmed = copy.leakmed; leak95 = copy.leak95; leakmax = copy.leakmax; leakgain = copy.leakgain; s_SmartStart = copy.s_SmartStart; s_PtAccess = copy.s_PtAccess; s_ABFilter = copy.s_ABFilter; s_Mask = copy.s_Mask; s_Tube = copy.s_Tube; s_ClimateControl = copy.s_ClimateControl; s_HumEnable = copy.s_HumEnable; s_HumLevel = copy.s_HumLevel; s_TempEnable = copy.s_TempEnable; s_Temp = copy.s_Temp; ramp_pressure = copy.ramp_pressure; } quint32 maskon; quint32 maskoff; EventDataType maskdur; EventDataType maskevents; EventDataType mode; EventDataType rms9_mode; EventDataType set_pressure; EventDataType max_pressure; EventDataType min_pressure; EventDataType epap; EventDataType max_ps; EventDataType min_ps; EventDataType ps; EventDataType max_epap; EventDataType min_epap; EventDataType ipap; EventDataType max_ipap; EventDataType min_ipap; EventDataType epr; EventDataType epr_level; quint32 sessionid; EventDataType ahi; EventDataType ai; EventDataType hi; EventDataType uai; EventDataType cai; EventDataType leakmed; EventDataType leak95; EventDataType leakmax; EventDataType leakgain; EventDataType ramp_pressure; QDate date; EventDataType s_RampTime; int s_RampEnable; int s_EPR_ClinEnable; int s_EPREnable; int s_PtAccess; int s_ABFilter; int s_Mask; int s_Tube; int s_ClimateControl; int s_HumEnable; EventDataType s_HumLevel; int s_TempEnable; EventDataType s_Temp; int s_SmartStart; }; /*! \class EDFParser \author Mark Watkins \brief Parse an EDF+ data file into a list of EDFSignal's \note More information on the EDF+ file format can be obtained from http://edfplus.info */ class EDFParser { public: //! \brief Constructs an EDFParser object, opening the filename if one supplied EDFParser(QString filename = ""); ~EDFParser(); //! \brief Open the EDF+ file, and read it's header bool Open(QString name); //! \brief Read n bytes of 8 bit data from the EDF+ data stream QString Read(unsigned n); //! \brief Read 16 bit word of data from the EDF+ data stream qint16 Read16(); //! \brief Vector containing the list of EDFSignals contained in this edf file QVector edfsignals; //! \brief An by-name indexed into the EDFSignal data QStringList signal_labels; //! \brief ResMed likes to use the SAME signal name QHash > signalList; QList signal; //! \brief Look up signal names by SleepLib ChannelID.. A little "ResMed"ified.. :/ EDFSignal *lookupSignal(ChannelID); EDFSignal *lookupLabel(QString name, int index=0); //! \brief Returns the number of signals contained in this EDF file long GetNumSignals() { return num_signals; } //! \brief Returns the number of data records contained per signal. long GetNumDataRecords() { return num_data_records; } //! \brief Returns the duration represented by this EDF file (in milliseconds) qint64 GetDuration() { return dur_data_record; } //! \brief Returns the patientid field from the EDF header QString GetPatient() { return patientident; } //! \brief Parse the EDF+ file into the list of EDFSignals.. Must be call Open(..) first. bool Parse(); char *buffer; //! \brief The EDF+ files header structure, used as a place holder while processing the text data. EDFHeader header; QString filename; long filesize; long datasize; long pos; long version; long num_header_bytes; long num_data_records; qint64 dur_data_record; long num_signals; QString patientident; QString recordingident; QString serialnumber; qint64 startdate; qint64 enddate; QString reserved44; }; class ResmedLoader; struct EDFGroup { EDFGroup() { } EDFGroup(QString brp, QString eve, QString pld, QString sad, QString csl) { BRP = brp; EVE = eve; CSL = csl; PLD = pld; SAD = sad; } EDFGroup(const EDFGroup & copy) { BRP = copy.BRP; EVE = copy.EVE; CSL = copy.CSL; PLD = copy.PLD; SAD = copy.SAD; } QString BRP; QString EVE; QString CSL; QString PLD; QString SAD; }; class ResmedImport:public ImportTask { public: ResmedImport(ResmedLoader * l, SessionID s, QHash f, Machine * m): loader(l), sessionid(s), files(f), mach(m) {} virtual ~ResmedImport() {} virtual void run(); protected: ResmedLoader * loader; SessionID sessionid; QHash files; Machine * mach; }; class ResmedImportStage2:public ImportTask { public: ResmedImportStage2(ResmedLoader * l, STRRecord r, Machine * m): loader(l), R(r), mach(m) {} virtual ~ResmedImportStage2() {} virtual void run(); protected: ResmedLoader * loader; STRRecord R; Machine * mach; }; /*! \class ResmedLoader \brief Importer for ResMed S9 Data */ class ResmedLoader : public CPAPLoader { friend class ResmedImport; friend class ResmedImportStage2; public: ResmedLoader(); virtual ~ResmedLoader(); //! \brief Detect if the given path contains a valid Folder structure virtual bool Detect(const QString & path); //! \brief Look up machine model information of ResMed file structure stored at path virtual MachineInfo PeekInfo(const QString & path); //! \brief Scans for S9 SD folder structure signature, and loads any new data if found virtual int Open(QString path); //! \brief Returns the version number of this ResMed loader virtual int Version() { return resmed_data_version; } //! \brief Returns the Machine class name of this loader. ("ResMed") virtual const QString &loaderName() { return resmed_class_name; } //! \brief Converts EDFSignal data to time delta packed EventList, and adds to Session void ToTimeDelta(Session *sess, EDFParser &edf, EDFSignal &es, ChannelID code, long recs, qint64 duration, EventDataType min = 0, EventDataType max = 0, bool square = false); //! \brief Register the ResmedLoader with the list of other machine loaders static void Register(); //! \brief Parse the EVE Event annotation data, and save to Session * sess //! This contains all Hypopnea, Obstructive Apnea, Central and Apnea codes bool LoadEVE(Session *sess, const QString & path); //! \brief Parse the CSL Event annotation data, and save to Session * sess //! This contains Cheyne Stokes Respiration flagging on the AirSense 10 bool LoadCSL(Session *sess, const QString & path); //! \brief Parse the BRP High Resolution data, and save to Session * sess //! This contains Flow Rate, Mask Pressure, and Resp. Event data bool LoadBRP(Session *sess, const QString & path); //! \brief Parse the SAD Pulse oximetry attachment data, and save to Session * sess //! This contains Pulse Rate and SpO2 Oxygen saturation data bool LoadSAD(Session *sess, const QString & path); //! \brief Parse the PRD low resolution data, and save to Session * sess //! This contains the Pressure, Leak, Respiratory Rate, Minute Ventilation, Tidal Volume, etc.. bool LoadPLD(Session *sess, const QString & path); virtual MachineInfo newInfo() { return MachineInfo(MT_CPAP, 0, resmed_class_name, QObject::tr("ResMed"), QString(), QString(), QString(), QObject::tr("S9"), QDateTime::currentDateTime(), resmed_data_version); } virtual void initChannels(); //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Now for some CPAPLoader overrides //////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual QString PresReliefLabel() { return QObject::tr("EPR: "); } virtual ChannelID PresReliefMode(); virtual ChannelID PresReliefLevel(); virtual ChannelID CPAPModeChannel(); //////////////////////////////////////////////////////////////////////////////////////////////////////////// protected: void ParseSTR(Machine *mach, QStringList strfiles); //! \brief Scan for new files to import, group into sessions and add to task que int scanFiles(Machine * mach, QString datalog_path); QString backup(QString file, QString backup_path); QMap sessfiles; QMap strsess; QMap > strdate; #ifdef DEBUG_EFFICIENCY QHash channel_efficiency; QHash channel_time; #endif }; #endif // RESMED_LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/somnopose_loader.cpp0000644000175000017500000001160512412506713026126 0ustar sergiosergio/* SleepLib Somnopose Loader Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ //******************************************************************************************** // IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the somnopose_data_version in somnopose_loader.h when making changes to this loader // that change loader behaviour or modify channels. //******************************************************************************************** #include #include #include "somnopose_loader.h" #include "SleepLib/machine.h" SomnoposeLoader::SomnoposeLoader() { m_type = MT_POSITION; } SomnoposeLoader::~SomnoposeLoader() { } int SomnoposeLoader::Open(QString path) { Q_UNUSED(path) QString newpath; QString dirtag = "somnopose"; // Could Scan the ZEO folder for a list of CSVs path = path.replace("\\", "/"); if (path.toLower().endsWith("/" + dirtag)) { return 0; //newpath=path; } else { newpath = path + "/" + dirtag.toUpper(); } //QString filename; // Somnopose folder structure detection stuff here. return 0; // number of machines affected } int SomnoposeLoader::OpenFile(QString filename) { QFile file(filename); if (filename.toLower().endsWith(".csv")) { if (!file.open(QFile::ReadOnly)) { qDebug() << "Couldn't open Somnopose data file" << filename; return 0; } } else { return 0; } qDebug() << "Opening file" << filename; QTextStream ts(&file); // Read header line and determine order of fields QString hdr = ts.readLine(); QStringList headers = hdr.split(","); int col_inclination = -1, col_orientation = -1, col_timestamp = -1; int hdr_size = headers.size(); for (int i = 0; i < hdr_size; i++) { if (headers.at(i).compare("timestamp", Qt::CaseInsensitive) == 0) { col_timestamp = i; } if (headers.at(i).compare("inclination", Qt::CaseInsensitive) == 0) { col_inclination = i; } if (headers.at(i).compare("orientation", Qt::CaseInsensitive) == 0) { col_orientation = i; } } // Check we have all fields available if ((col_timestamp < 0) || (col_inclination < 0) || (col_orientation < 0)) { return 0; } QDateTime epoch(QDate(2001, 1, 1), QTime(0, 0, 0)); qint64 ep = qint64(epoch.toTime_t()) * 1000, time; double timestamp, orientation, inclination; QString data; QStringList fields; bool ok; bool first = true; MachineInfo info = newInfo(); Machine *mach = CreateMachine(info); Session *sess = nullptr; SessionID sid; EventList *ev_orientation = nullptr, *ev_inclination = nullptr; while (!(data = ts.readLine()).isEmpty()) { fields = data.split(","); if (fields.size() < hdr_size) { // missing fields.. skip this record continue; } timestamp = fields[col_timestamp].toDouble(&ok); if (!ok) { continue; } orientation = fields[col_orientation].toDouble(&ok); if (!ok) { continue; } inclination = fields[col_inclination].toDouble(&ok); if (!ok) { continue; } // convert to milliseconds since epoch time = (timestamp * 1000.0) + ep; if (first) { sid = time / 1000; if (mach->SessionExists(sid)) { return 0; // Already imported } sess = new Session(mach, sid); sess->really_set_first(time); ev_orientation = sess->AddEventList(POS_Orientation, EVL_Event, 1, 0, 0, 0); ev_inclination = sess->AddEventList(POS_Inclination, EVL_Event, 1, 0, 0, 0); first = false; } sess->set_last(time); ev_orientation->AddEvent(time, orientation); ev_inclination->AddEvent(time, inclination); // QDateTime dt=QDateTime::fromMSecsSinceEpoch(time); // qDebug() << dt << orientation << inclination; } sess->setMin(POS_Orientation, ev_orientation->Min()); sess->setMax(POS_Orientation, ev_orientation->Max()); sess->setMin(POS_Inclination, ev_inclination->Min()); sess->setMax(POS_Inclination, ev_inclination->Max()); sess->really_set_last(time); sess->SetChanged(true); mach->AddSession(sess); mach->Save(); return true; } static bool somnopose_initialized = false; void SomnoposeLoader::Register() { if (somnopose_initialized) { return; } qDebug("Registering SomnoposeLoader"); RegisterLoader(new SomnoposeLoader()); //InitModelMap(); somnopose_initialized = true; } sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/cms50_loader.h0000644000175000017500000000404312412506713024476 0ustar sergiosergio/* SleepLib CMS50X Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef CMS50LOADER_H #define CMS50LOADER_H #include "SleepLib/serialoximeter.h" const QString cms50_class_name = "CMS50"; const int cms50_data_version = 4; /*! \class CMS50Loader \brief Importer for CMS50 Oximeter */ class CMS50Loader : public SerialOximeter { Q_OBJECT public: CMS50Loader(); virtual ~CMS50Loader(); virtual bool Detect(const QString &path); virtual int Open(QString path); static void Register(); virtual int Version() { return cms50_data_version; } virtual const QString &loaderName() { return cms50_class_name; } virtual MachineInfo newInfo() { return MachineInfo(MT_OXIMETER, 0, cms50_class_name, QObject::tr("Contec"), QObject::tr("CMS50"), QString(), QString(), QObject::tr("CMS50"), QDateTime::currentDateTime(), cms50_data_version); } // Machine *CreateMachine(); virtual void process(); virtual bool isStartTimeValid() { return !cms50dplus; } protected slots: // virtual void dataAvailable(); virtual void resetImportTimeout(); virtual void startImportTimeout(); virtual void shutdownPorts(); protected: bool readSpoRFile(QString path); virtual void processBytes(QByteArray bytes); int doImportMode(); int doLiveMode(); virtual void killTimers(); // Switch CMS50D+ device to live streaming mode virtual void resetDevice(); // Switch CMS50D+ device to record transmission mode void requestData(); private: EventList *PULSE; EventList *SPO2; QTime m_time; QByteArray buffer; bool started_import; bool finished_import; bool started_reading; bool cms50dplus; int cb_reset,imp_callbacks; int received_bytes; int m_itemCnt; int m_itemTotal; }; #endif // CMS50LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/zeo_loader.h0000644000175000017500000000241412412506713024344 0ustar sergiosergio/* SleepLib ZEO Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef ZEOLOADER_H #define ZEOLOADER_H #include "SleepLib/machine_loader.h" const QString zeo_class_name = "ZEO"; const int zeo_data_version = 1; /*! \class ZEOLoader \brief Unfinished stub for loading ZEO Personal Sleep Coach data */ class ZEOLoader : public MachineLoader { public: ZEOLoader(); virtual ~ZEOLoader(); virtual bool Detect(const QString &path) { Q_UNUSED(path); return false; } // bypass autoscanner virtual int Open(QString path); virtual int OpenFile(QString filename); static void Register(); virtual int Version() { return zeo_data_version; } virtual const QString &loaderName() { return zeo_class_name; } //Machine *CreateMachine(); virtual MachineInfo newInfo() { return MachineInfo(MT_SLEEPSTAGE, 0, zeo_class_name, QObject::tr("Zeo"), QString(), QString(), QString(), QObject::tr("Personal Sleep Coach"), QDateTime::currentDateTime(), zeo_data_version); } protected: private: }; #endif // ZEOLOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp0000644000175000017500000032326012412506713025366 0ustar sergiosergio/* SleepLib ResMed Loader Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include "resmed_loader.h" #include "SleepLib/session.h" #include "SleepLib/calcs.h" #ifdef DEBUG_EFFICIENCY #include // only available in 4.8 #endif extern QProgressBar *qprogress; QHash > Resmed_Model_Map; const QString STR_UnknownModel = "Resmed S9 ???"; ChannelID RMS9_EPR, RMS9_EPRLevel, RMS9_Mode; const QString STR_ResMed_AirSense10 = "AirSense 10"; const QString STR_ResMed_S9 = "S9"; // Return the model name matching the supplied model number. const QString & lookupModel(quint16 model) { QHash >::iterator end = Resmed_Model_Map.end(); for (QHash >::iterator it = Resmed_Model_Map.begin(); it != end; ++it) { QList & list = it.value(); for (int i=0; i < list.size(); ++i) { if (list.at(i) == model) { return it.key(); } } } return STR_UnknownModel; } QHash resmed_codes; const QString STR_ext_TGT = "tgt"; const QString STR_ext_CRC = "crc"; const QString STR_ext_EDF = "edf"; const QString STR_ext_gz = ".gz"; // Looks up foreign language Signal names that match this channelID EDFSignal *EDFParser::lookupSignal(ChannelID ch) { // Get list of all known foreign language names for this channel QHash::iterator channames = resmed_codes.find(ch); if (channames == resmed_codes.end()) { // no alternatives strings found for this channel return nullptr; } // This is bad, because ResMed thinks it was a cool idea to use two channels with the same name. // Scan through EDF's list of signals to see if any match for (int i = 0; i < channames.value().size(); i++) { EDFSignal *sig = lookupLabel(channames.value()[i]); if (sig) return sig; } // Failed return nullptr; } // Check if given string matches any alternative signal names for this channel bool matchSignal(ChannelID ch, const QString & name) { QHash::iterator channames = resmed_codes.find(ch); if (channames == resmed_codes.end()) { return false; } QStringList & strings = channames.value(); int size = strings.size(); for (int i=0; i < size; ++i) { // Using starts with, because ResMed is very lazy about consistency if (name.startsWith(strings.at(i), Qt::CaseInsensitive)) { return true; } } return false; } EDFSignal *EDFParser::lookupLabel(QString name, int index) { QHash >::iterator it = signalList.find(name); if (it == signalList.end()) return nullptr; if (index >= it.value().size()) return nullptr; return it.value()[index]; } EDFParser::EDFParser(QString name) { buffer = nullptr; Open(name); } EDFParser::~EDFParser() { for (QVector::iterator s = edfsignals.begin(); s != edfsignals.end(); s++) { if ((*s).data) { delete [](*s).data; } } if (buffer) { delete [] buffer; } } void ResmedLoader::ParseSTR(Machine *mach, QStringList strfiles) { QStringList::iterator strend = strfiles.end(); for (QStringList::iterator it = strfiles.begin(); it != strend; ++it) { EDFParser str(*it); if (!str.Parse()) continue; if (mach->serial() != str.serialnumber) { qDebug() << "Trying to import a STR.edf from another machine, skipping" << mach->serial() << str.serialnumber; qDebug() << (*it); continue; } QDateTime start = QDateTime::fromMSecsSinceEpoch(str.startdate); QDate date = start.date(); qDebug() << "Parsing" << *it << date << str.GetNumDataRecords() << str.GetNumSignals(); EDFSignal *maskon = str.lookupLabel("Mask On"); if (!maskon) { maskon = str.lookupLabel("MaskOn"); } EDFSignal *maskoff = str.lookupLabel("Mask Off"); if (!maskoff) { maskoff = str.lookupLabel("MaskOff"); } EDFSignal *sig = nullptr; quint32 laston = 0; bool skipday; int size = str.GetNumDataRecords(); int cnt=0; QDateTime dt = start; // For each data record, representing 1 day each for (int rec = 0; rec < str.GetNumDataRecords(); ++rec) { uint timestamp = dt.toTime_t(); int recstart = rec * maskon->nr; skipday = false; if ((++cnt % 10) == 0) { // TODO: Change me to emit once MachineLoader is QObjectified... if (qprogress) { qprogress->setValue(10.0 + (float(cnt) / float(size) * 90.0)); } QApplication::processEvents(); } // Scan the mask on/off events for (int s = 0; s < maskon->nr; ++s) { qint32 on = maskon->data[recstart+s]; qint32 off = maskoff->data[recstart+s]; quint32 ontime = timestamp + on * 60; quint32 offtime = timestamp + off * 60; // -1 marks empty record, but can start with mask off, if sleep crosses noon if (on < 0) { if (off < 0) continue; // Both are -1, skip the rest of this day // laston stops on this record QMap::iterator si = strsess.find(laston); if (si != strsess.end()) { if (si.value().maskoff == 0) { if (offtime > laston) { si.value().maskoff = offtime; } } else { if (si.value().maskoff != offtime) { // not sure why this happens. qDebug() << "WTF?? mask off's don't match" << QDateTime::fromTime_t(laston).toString() << QDateTime::fromTime_t(si.value().maskoff).toString() << "!=" << QDateTime::fromTime_t(offtime).toString(); } //Q_ASSERT(si.value().maskoff == offtime); } } continue; } QMap::iterator sid = strsess.find(ontime); // Record already exists? if (sid != strsess.end()) { // then skip laston = ontime; continue; } // For every mask on, there will be a session within 1 minute either way // We can use that for data matching STRRecord R; R.maskon = ontime; if (offtime > 0) { R.maskoff = offtime; } CPAPMode mode = MODE_UNKNOWN; if ((sig = str.lookupSignal(CPAP_Mode))) { int mod = EventDataType(sig->data[rec]) * sig->gain + sig->offset; R.rms9_mode = mod; if (mod == 11) { mode = MODE_APAP; } else if (mod >= 8) { // mod 8 == vpap adapt variable epap mode = MODE_ASV_VARIABLE_EPAP; } else if (mod >= 7) { // mod 7 == vpap adapt mode = MODE_ASV; } else if (mod >= 6) { // mod 6 == vpap auto (Min EPAP, Max IPAP, PS) mode = MODE_BILEVEL_AUTO_FIXED_PS; } else if (mod >= 3) {// mod 3 == vpap s fixed pressure (EPAP, IPAP, No PS) mode = MODE_BILEVEL_FIXED; // 4,5 are S/T types... } else if (mod >= 1) { mode = MODE_APAP; // mod 1 == apap // not sure what mode 2 is ?? split ? } else { mode = MODE_CPAP; // mod 0 == cpap } R.mode = mode; if ((mod == 0) && (sig = str.lookupLabel("S.C.StartPress"))) { R.ramp_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if (((mod == 1) || (mod == 11)) && (sig = str.lookupLabel("S.AS.StartPress"))) { R.ramp_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } } if ((sig = str.lookupLabel("Mask Dur"))) { R.maskdur = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("Leak Med"))) { float gain = sig->gain * 60.0; R.leakgain = gain; R.leakmed = EventDataType(sig->data[rec]) * gain + sig->offset; } if ((sig = str.lookupLabel("Leak Max"))) { float gain = sig->gain * 60.0; R.leakgain = gain; R.leakmax = EventDataType(sig->data[rec]) * gain + sig->offset; } if ((sig = str.lookupLabel("Leak 95"))) { float gain = sig->gain * 60.0; R.leakgain = gain; R.leak95 = EventDataType(sig->data[rec]) * gain + sig->offset; } if ((sig = str.lookupSignal(CPAP_PressureMax))) { R.max_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupSignal(CPAP_PressureMin))) { R.min_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupSignal(RMS9_SetPressure))) { R.set_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupSignal(CPAP_EPAP))) { R.epap = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupSignal(CPAP_EPAPHi))) { R.max_epap = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupSignal(CPAP_EPAPLo))) { R.min_epap = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } bool haveipap = false; if ((sig = str.lookupSignal(CPAP_IPAP))) { R.ipap = EventDataType(sig->data[rec]) * sig->gain + sig->offset; haveipap = true; } if ((sig = str.lookupSignal(CPAP_IPAPHi))) { R.max_ipap = EventDataType(sig->data[rec]) * sig->gain + sig->offset; haveipap = true; } if ((sig = str.lookupSignal(CPAP_IPAPLo))) { R.min_ipap = EventDataType(sig->data[rec]) * sig->gain + sig->offset; haveipap = true; } if ((sig = str.lookupSignal(CPAP_PS))) { R.ps = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } // Okay, problem here: THere are TWO PSMin & MAX values on the 36037 with the same string // One is for ASV mode, and one is for ASVAuto int psvar = (mode == MODE_ASV_VARIABLE_EPAP) ? 1 : 0; if ((sig = str.lookupLabel("Max PS", psvar))) { R.max_ps = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("Min PS", psvar))) { R.min_ps = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if (!haveipap) { } if (mode == MODE_ASV_VARIABLE_EPAP) { R.min_ipap = R.min_epap + R.min_ps; R.max_ipap = R.max_epap + R.max_ps; } else if (mode == MODE_ASV) { R.min_ipap = R.epap + R.min_ps; R.max_ipap = R.epap + R.max_ps; } EventDataType epr = -1, epr_level = -1; if ((sig = str.lookupSignal(RMS9_EPR))) { epr= EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupSignal(RMS9_EPRLevel))) { epr_level= EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.EPR.EPRType"))) { epr = EventDataType(sig->data[rec]) * sig->gain + sig->offset; epr += 1; } if ((epr >= 0) && (epr_level >= 0)) { R.epr_level = epr_level; R.epr = epr; } else { if (epr >= 0) { static bool warn=false; if (!warn) { // just nag once qDebug() << "If you can read this, please tell Jedimark you found a ResMed with EPR but no EPR_LEVEL so he can remove this warning"; warn = true; } R.epr = (epr > 0) ? 1 : 0; R.epr_level = epr; } else if (epr_level >= 0) { R.epr_level = epr_level; R.epr = (epr_level > 0) ? 1 : 0; } } if ((sig = str.lookupLabel("AHI"))) { R.ahi = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("AI"))) { R.ai = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("HI"))) { R.hi = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("UAI"))) { R.uai = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("CAI"))) { R.cai = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.RampTime"))) { R.s_RampTime = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.RampEnable"))) { R.s_RampEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.EPR.ClinEnable"))) { R.s_EPR_ClinEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.EPR.EPREnable"))) { R.s_EPREnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.ABFilter"))) { R.s_ABFilter = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.ClimateControl"))) { R.s_ClimateControl = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.Mask"))) { R.s_Mask = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.PtAccess"))) { R.s_PtAccess = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.SmartStart"))) { R.s_SmartStart = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.HumEnable"))) { R.s_HumEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.HumLevel"))) { R.s_HumLevel = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.TempEnable"))) { R.s_TempEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.Temp"))) { R.s_Temp = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } if ((sig = str.lookupLabel("S.Tube"))) { R.s_Tube = EventDataType(sig->data[rec]) * sig->gain + sig->offset; } laston = ontime; QDateTime dontime = QDateTime::fromTime_t(ontime); date = dontime.date(); R.date = date; //CHECKME: Should I be taking noon day split time into account here? strdate[date].push_back(&strsess.insert(ontime, R).value()); //QDateTime dofftime = QDateTime::fromTime_t(offtime); //qDebug() << "Mask on" << dontime << "Mask off" << dofftime; } // Wait... ResMed has a DST bug here...should I be replicating it by using multiples of 86400 seconds? dt = dt.addDays(1); } } } // Read a 16 bits integer qint16 EDFParser::Read16() { if ((pos + 2) > filesize) { return 0; } #ifdef Q_LITTLE_ENDIAN // Intel, etc... qint16 res = *(qint16 *)&buffer[pos]; #else // ARM, PPC, etc.. qint16 res = quint8(buffer[pos]) | (qint8(buffer[pos+1]) << 8); #endif pos += 2; return res; } QString EDFParser::Read(unsigned n) { if ((pos + long(n)) > filesize) { return ""; } QByteArray buf(&buffer[pos], n); pos+=n; return buf.trimmed(); } bool EDFParser::Parse() { bool ok; QString temp, temp2; version = QString::fromLatin1(header.version, 8).toLong(&ok); if (!ok) { return false; } //patientident=QString::fromLatin1(header.patientident,80); recordingident = QString::fromLatin1(header.recordingident, 80); // Serial number is in here.. int snp = recordingident.indexOf("SRN="); serialnumber.clear(); /*char * idx=index(header.recordingident,'='); idx++; for (int i=0;i<16;++i) { if (*idx==0x20) break; serialnumber+=*idx; ++idx; } */ for (int i = snp + 4; i < recordingident.length(); i++) { if (recordingident[i] == ' ') { break; } serialnumber += recordingident[i]; } QDateTime startDate = QDateTime::fromString(QString::fromLatin1(header.datetime, 16), "dd.MM.yyHH.mm.ss"); //startDate.toTimeSpec(Qt::UTC); QDate d2 = startDate.date(); if (d2.year() < 2000) { d2.setDate(d2.year() + 100, d2.month(), d2.day()); startDate.setDate(d2); } if (!startDate.isValid()) { qDebug() << "Invalid date time retreieved parsing EDF File " << filename; return false; } startdate = qint64(startDate.toTime_t()) * 1000L; //startdate-=timezoneOffset(); //qDebug() << startDate.toString("yyyy-MM-dd HH:mm:ss"); num_header_bytes = QString::fromLatin1(header.num_header_bytes, 8).toLong(&ok); if (!ok) { return false; } //reserved44=QString::fromLatin1(header.reserved,44); num_data_records = QString::fromLatin1(header.num_data_records, 8).toLong(&ok); if (!ok) { return false; } dur_data_record = (QString::fromLatin1(header.dur_data_records, 8).toDouble(&ok) * 1000.0L); if (!ok) { return false; } num_signals = QString::fromLatin1(header.num_signals, 4).toLong(&ok); if (!ok) { return false; } enddate = startdate + dur_data_record * qint64(num_data_records); // if (dur_data_record==0) // return false; // this could be loaded quicker by transducer_type[signal] etc.. // Initialize fixed-size signal list. edfsignals.resize(num_signals); for (int i = 0; i < num_signals; i++) { EDFSignal &sig = edfsignals[i]; sig.data = nullptr; sig.label = Read(16); signal_labels.push_back(sig.label); signalList[sig.label].push_back(&sig); signal.push_back(&sig); } for (int i = 0; i < num_signals; i++) { edfsignals[i].transducer_type = Read(80); } for (int i = 0; i < num_signals; i++) { edfsignals[i].physical_dimension = Read(8); } for (int i = 0; i < num_signals; i++) { edfsignals[i].physical_minimum = Read(8).toDouble(&ok); } for (int i = 0; i < num_signals; i++) { edfsignals[i].physical_maximum = Read(8).toDouble(&ok); } for (int i = 0; i < num_signals; i++) { edfsignals[i].digital_minimum = Read(8).toDouble(&ok); } for (int i = 0; i < num_signals; i++) { EDFSignal &e = edfsignals[i]; e.digital_maximum = Read(8).toDouble(&ok); e.gain = (e.physical_maximum - e.physical_minimum) / (e.digital_maximum - e.digital_minimum); e.offset = 0; } for (int i = 0; i < num_signals; i++) { edfsignals[i].prefiltering = Read(80); } for (int i = 0; i < num_signals; i++) { edfsignals[i].nr = Read(8).toLong(&ok); } for (int i = 0; i < num_signals; i++) { edfsignals[i].reserved = Read(32); } // allocate the buffers for (int i = 0; i < num_signals; i++) { //qDebug//cout << "Reading signal " << signals[i]->label << endl; EDFSignal &sig = edfsignals[i]; long recs = sig.nr * num_data_records; if (num_data_records < 0) { sig.data = nullptr; continue; } sig.data = new qint16 [recs]; sig.pos = 0; } for (int x = 0; x < num_data_records; x++) { for (int i = 0; i < num_signals; i++) { EDFSignal &sig = edfsignals[i]; #ifdef Q_LITTLE_ENDIAN // Intel x86, etc.. memcpy((char *)&sig.data[sig.pos], (char *)&buffer[pos], sig.nr * 2); sig.pos += sig.nr; pos += sig.nr * 2; #else // Big endian safe for (int j=0;jsaveMutex.lock(); Session * sess = mach->SessionExists(sessionid); if (sess) { if (sess->summaryOnly()) { // Reuse this session sess->wipeSummary(); } else { // Already imported loader->saveMutex.unlock(); return; } } else { // Could be importing from an older backup.. if so, destroy the summary only records quint32 key = int(sessionid / 60) * 60; sess = mach->SessionExists(key); if (sess) { if (sess->summaryOnly()) { sess->Destroy(); delete sess; } } // Create the session sess = new Session(mach, sessionid); } loader->saveMutex.unlock(); Q_FOREACH(QString file, files[EDF_PLD]) { loader->LoadPLD(sess, file); #ifdef SESSION_DEBUG sess->session_files.append(file); #endif } Q_FOREACH(QString file, files[EDF_BRP]) { loader->LoadBRP(sess, file); #ifdef SESSION_DEBUG sess->session_files.append(file); #endif } Q_FOREACH(QString file, files[EDF_SAD]) { loader->LoadSAD(sess, file); #ifdef SESSION_DEBUG sess->session_files.append(file); #endif } Q_FOREACH(QString file, files[EDF_CSL]) { loader->LoadCSL(sess, file); #ifdef SESSION_DEBUG sess->session_files.append(file); #endif } bool haveeve = false; Q_FOREACH(QString file, files[EDF_EVE]) { loader->LoadEVE(sess, file); #ifdef SESSION_DEBUG sess->session_files.append(file); #endif haveeve = true; } if (!haveeve) { sess->AddEventList(CPAP_Obstructive, EVL_Event); sess->AddEventList(CPAP_ClearAirway, EVL_Event); sess->AddEventList(CPAP_Apnea, EVL_Event); sess->AddEventList(CPAP_Hypopnea, EVL_Event); } if (sess->first() == 0) { // loader->saveMutex.lock(); //if (mach->sessionlist.contains(sess->session())) { // sess->Destroy(); //mach->sessionlist.remove(sess->session()); //} delete sess; //loader->saveMutex.unlock(); return; } sess->setSummaryOnly(false); sess->SetChanged(true); ///////////////////////////////////////////////////////////////////////////////// // Process STR.edf now all valid Session data is imported ///////////////////////////////////////////////////////////////////////////////// quint32 key = quint32(sessionid / 60) * 60; // round to 1 minute QMap::iterator strsess_end = loader->strsess.end(); QMap::iterator it = loader->strsess.find(key); if (it == strsess_end) { // ResMed merges mask on/off groups that are less than a minute apart // this means have to jump back to the last session closest. it = loader->strsess.lowerBound(key); if (it != loader->strsess.begin()) it--; } if (it != strsess_end) { STRRecord & R = it.value(); // calculate the time between session record and mask-on record. int gap = sessionid - R.maskon; if (gap > 3600*6) { QDateTime dt = QDateTime::fromTime_t(sessionid); QDateTime rt = QDateTime::fromTime_t(R.maskon); QString msg = QString("Warning: Closest matching STR record for %1 is %2 by %3 seconds"). arg(dt.toString(Qt::ISODate)). arg(sess->length() / 1000.0L,0,'f',1). arg(gap); qDebug() << msg; } // Claim this session R.sessionid = sessionid; // Save maskon time in session setting so we can use it later to avoid doubleups. sess->settings[RMS9_MaskOnTime] = R.maskon; #ifdef SESSION_DEBUG sess->session_files.append("STR.edf"); #endif if (R.mode >= 0) { sess->settings[CPAP_Mode] = R.mode; sess->settings[RMS9_Mode] = R.rms9_mode; if (R.mode == MODE_CPAP) { if (R.set_pressure >= 0) { sess->settings[CPAP_Pressure] = R.set_pressure; } } else if (R.mode == MODE_APAP) { if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure; if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure; } else if (R.mode == MODE_BILEVEL_FIXED) { if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap; if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap; if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps; } else if (R.mode == MODE_BILEVEL_AUTO_FIXED_PS) { if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps; } else if (R.mode == MODE_ASV) { if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap; if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps; if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; } else if (R.mode == MODE_ASV_VARIABLE_EPAP) { if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap; if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap; if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps; if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps; } } else { if (R.set_pressure >= 0) sess->settings[CPAP_Pressure] = R.set_pressure; if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure; if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure; if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap; if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap; if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps; if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps; if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps; if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap; if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap; } if (R.epr >= 0) { sess->settings[RMS9_EPR] = (int)R.epr; if (R.epr > 0) { if (R.epr_level >= 0) { sess->settings[RMS9_EPRLevel] = (int)R.epr_level; } } } // Ignore all the rest of the sumary data, because there is enough available to calculate it with higher accuracy. if (sess->length() > 0) { loader->addSession(sess); } else { delete sess; return; } } // Update indexes, process waveform and perform flagging sess->UpdateSummaries(); // Save is not threadsafe loader->saveMutex.lock(); sess->Store(mach->getDataPath()); loader->saveMutex.unlock(); // Free the memory used by this session sess->TrashEvents(); } ResmedLoader::ResmedLoader() { const QString RMS9_ICON = ":/icons/rms9.png"; const QString RM10_ICON = ":/icons/rms9.png"; m_pixmaps[STR_ResMed_S9] = QPixmap(RMS9_ICON); m_pixmaps[STR_ResMed_AirSense10] = QPixmap(RM10_ICON); m_pixmap_paths[STR_ResMed_S9] = RMS9_ICON; m_pixmap_paths[STR_ResMed_AirSense10] = RM10_ICON; m_type = MT_CPAP; } ResmedLoader::~ResmedLoader() { } void ResmedImportStage2::run() { if (R.maskon == R.maskoff) return; Session * sess = new Session(mach, R.maskon); sess->really_set_first(qint64(R.maskon) * 1000L); sess->really_set_last(qint64(R.maskoff) * 1000L); // Claim this record for future imports sess->settings[RMS9_MaskOnTime] = R.maskon; sess->setSummaryOnly(true); #ifdef SESSION_DEBUG sess->session_files.append("STR.edf"); #endif sess->SetChanged(true); // First take the settings if (R.mode >= 0) { sess->settings[CPAP_Mode] = R.mode; sess->settings[RMS9_Mode] = R.rms9_mode; if (R.mode == MODE_CPAP) { if (R.set_pressure >= 0) { sess->settings[CPAP_Pressure] = R.set_pressure; } } else if (R.mode == MODE_APAP) { if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure; if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure; } else if (R.mode == MODE_BILEVEL_FIXED) { if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap; if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap; if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps; } else if (R.mode == MODE_BILEVEL_AUTO_FIXED_PS) { if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps; } else if (R.mode == MODE_ASV) { if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap; if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps; if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; } else if (R.mode == MODE_ASV_VARIABLE_EPAP) { if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap; if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap; if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps; if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps; } } else { if (R.set_pressure >= 0) sess->settings[CPAP_Pressure] = R.set_pressure; if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure; if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure; if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap; if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap; if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap; if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap; if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps; if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps; if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps; if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap; if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap; } if (R.epr >= 0) { sess->settings[RMS9_EPR] = (int)R.epr; if (R.epr > 0) { if (R.epr_level >= 0) { sess->settings[RMS9_EPRLevel] = (int)R.epr_level; } } } if (R.leakmax >= 0) sess->setMax(CPAP_Leak, R.leakmax); if (R.leakmax >= 0) sess->setMin(CPAP_Leak, 0); if ((R.leakmed >= 0) && (R.leak95 >= 0) && (R.leakmax >= 0)) { sess->m_timesummary[CPAP_Leak][short(R.leakmax / R.leakgain)]=1; sess->m_timesummary[CPAP_Leak][short(R.leak95 / R.leakgain)]=9; sess->m_timesummary[CPAP_Leak][short(R.leakmed / R.leakgain)]=65; sess->m_timesummary[CPAP_Leak][0]=25; } // Find the matching date group for this record QMap >::iterator dtit = loader->strdate.find(R.date); // should not be possible, but my brain hurts... Q_ASSERT(dtit != loader->strdate.end()); if (dtit != loader->strdate.end()) { QList & dayrecs = dtit.value(); bool hasdatasess=false; EventDataType time=0, totaltime=0; for (int c=0; c < dayrecs.size(); ++c) { STRRecord *r = dayrecs[c]; if (r->sessionid > 0) { // get complicated.. calculate all the counts for valid sessions, and use the summary to make up the rest hasdatasess = true; } totaltime += r->maskoff - r->maskon; } if (!hasdatasess) { for (int c=0; c < dayrecs.size(); ++c) { STRRecord *r = dayrecs[c]; time = r->maskoff - r->maskon; float ratio = time / totaltime; // Add the time weighted proportion of the events counts if (r->ai >= 0) { sess->setCount(CPAP_Obstructive, r->ai * ratio); sess->setCph(CPAP_Obstructive, (r->ai * ratio) / (time / 3600.0)); } if (r->uai >= 0) { sess->setCount(CPAP_Apnea, r->uai * ratio); sess->setCph(CPAP_Apnea, (r->uai * ratio) / (time / 3600.0)); } if (r->hi >= 0) { sess->setCount(CPAP_Hypopnea, r->hi * ratio); sess->setCph(CPAP_Hypopnea, (r->hi * ratio) / (time / 3600.0)); } if (r->cai >= 0) { sess->setCount(CPAP_ClearAirway, r->cai * ratio); sess->setCph(CPAP_ClearAirway, (r->ai * ratio) / (time / 3600.0)); } } } } loader->addSession(sess); loader->saveMutex.lock(); sess->Store(mach->getDataPath()); loader->saveMutex.unlock(); } long event_cnt = 0; const QString RMS9_STR_datalog = "DATALOG"; const QString RMS9_STR_idfile = "Identification."; const QString RMS9_STR_strfile = "STR."; bool ResmedLoader::Detect(const QString & givenpath) { QDir dir(givenpath); if (!dir.exists()) { return false; } // ResMed drives contain a folder named "DATALOG". if (!dir.exists(RMS9_STR_datalog)) { return false; } // They also contain a file named "STR.edf". if (!dir.exists("STR.edf")) { return false; } return true; } MachineInfo ResmedLoader::PeekInfo(const QString & path) { if (!Detect(path)) return MachineInfo(); QFile f(path+"/"+RMS9_STR_idfile+"tgt"); // Abort if this file is dodgy.. if (!f.exists() || !f.open(QIODevice::ReadOnly)) { return MachineInfo(); } MachineInfo info = newInfo(); // Parse # entries into idmap. while (!f.atEnd()) { QString line = f.readLine().trimmed(); if (!line.isEmpty()) { QString key = line.section(" ", 0, 0).section("#", 1); QString value = line.section(" ", 1); if (key == "SRN") { // Serial Number info.serial = value; } else if (key == "PNA") { // Product Name value.replace("_"," "); if (value.contains(STR_ResMed_S9)) { value.replace(STR_ResMed_S9, ""); info.series = STR_ResMed_S9; } else if (value.contains(STR_ResMed_AirSense10)) { value.replace(STR_ResMed_AirSense10, ""); info.series = STR_ResMed_AirSense10; } value.replace("(",""); value.replace(")",""); if (value.contains("Adapt", Qt::CaseInsensitive)) { if (!value.contains("VPAP")) { value.replace("Adapt", QObject::tr("VPAP Adapt")); } } info.model = value.trimmed(); } else if (key == "PCD") { // Product Code info.modelnumber = value; } } } return info; } struct EDFduration { EDFduration() { start = end = 0; type = EDF_UNKNOWN; } EDFduration(const EDFduration & copy) { path = copy.path; start = copy.start; end = copy.end; type = copy.type; filename = copy.filename; } EDFduration(quint32 start, quint32 end, QString path) : start(start), end(end), path(path) {} quint32 start; quint32 end; QString path; QString filename; EDFType type; }; EDFType lookupEDFType(QString text) { if (text == "EVE") { return EDF_EVE; } else if (text =="BRP") { return EDF_BRP; } else if (text == "PLD") { return EDF_PLD; } else if (text == "SAD") { return EDF_SAD; } else if (text == "CSL") { return EDF_CSL; } else return EDF_UNKNOWN; } // Pretend to parse the EVE file to get the duration out of it. int PeekAnnotations(const QString & path, quint32 &start, quint32 &end) { EDFParser edf(path); if (!edf.Parse()) return -1; QString t; double duration; char *data; char c; long pos; bool sign, ok; double d; double tt; int recs = 0; int goodrecs = 0; // Notes: Event records have useless duration record. start = edf.startdate / 1000L; // Process event annotation records for (int s = 0; s < edf.GetNumSignals(); s++) { recs = edf.edfsignals[s].nr * edf.GetNumDataRecords() * 2; data = (char *)edf.edfsignals[s].data; pos = 0; tt = edf.startdate; duration = 0; while (pos < recs) { c = data[pos]; if ((c != '+') && (c != '-')) { break; } if (data[pos++] == '+') { sign = true; } else { sign = false; } t = ""; c = data[pos]; do { t += c; pos++; c = data[pos]; } while ((c != 20) && (c != 21)); // start code d = t.toDouble(&ok); if (!ok) { qDebug() << "Faulty EDF Annotations file " << edf.filename; break; } if (!sign) { d = -d; } tt = edf.startdate + qint64(d * 1000.0); duration = 0; // First entry if (data[pos] == 21) { pos++; // get duration. t = ""; do { t += data[pos]; pos++; } while ((data[pos] != 20) && (pos < recs)); // start code duration = t.toDouble(&ok); if (!ok) { qDebug() << "Faulty EDF Annotations file (at %" << pos << ") " << edf.filename; break; } } end = (tt / 1000.0); while ((data[pos] == 20) && (pos < recs)) { t = ""; pos++; if (data[pos] == 0) { break; } if (data[pos] == 20) { pos++; break; } do { t += tolower(data[pos++]); } while ((data[pos] != 20) && (pos < recs)); // start code if (!t.isEmpty() && (t!="recording starts")) { goodrecs++; } if (pos >= recs) { qDebug() << "Short EDF Annotations file" << edf.filename; break; } } while ((data[pos] == 0) && (pos < recs)) { pos++; } if (pos >= recs) { break; } } } return goodrecs; } // Looks inside an EDF or EDF.gz and grabs the start and duration EDFduration getEDFDuration(QString filename) { QString ext = filename.section("_", -1).section(".",0,0).toUpper(); bool ok1, ok2; int num_records; double rec_duration; QDateTime startDate; if (!filename.endsWith(".gz", Qt::CaseInsensitive)) { QFile file(filename); if (!file.open(QFile::ReadOnly)) { return EDFduration(0, 0, filename); } if (!file.seek(0xa8)) { file.close(); return EDFduration(0, 0, filename); } QByteArray bytes = file.read(16).trimmed(); startDate = QDateTime::fromString(QString::fromLatin1(bytes, 16), "dd.MM.yyHH.mm.ss"); if (!file.seek(0xec)) { file.close(); return EDFduration(0, 0, filename); } bytes = file.read(8).trimmed(); num_records = bytes.toInt(&ok1); bytes = file.read(8).trimmed(); rec_duration = bytes.toDouble(&ok2); file.close(); } else { gzFile f = gzopen(filename.toLatin1(), "rb"); if (!f) { return EDFduration(0, 0, filename); } if (!gzseek(f, 0xa8, SEEK_SET)) { gzclose(f); return EDFduration(0, 0, filename); } char datebytes[17] = {0}; gzread(f, (char *)&datebytes, 16); QString str = QString(QString::fromLatin1(datebytes,16)).trimmed(); startDate = QDateTime::fromString(str, "dd.MM.yyHH.mm.ss"); if (!gzseek(f, 0xec-0xa8-16, SEEK_CUR)) { // 0xec gzclose(f); return EDFduration(0, 0, filename); } // Decompressed header and data block char cbytes[9] = {0}; gzread(f, (char *)&cbytes, 8); str = QString(cbytes).trimmed(); num_records = str.toInt(&ok1); gzread(f, (char *)&cbytes, 8); str = QString(cbytes).trimmed(); rec_duration = str.toDouble(&ok2); gzclose(f); } QDate d2 = startDate.date(); if (d2.year() < 2000) { d2.setDate(d2.year() + 100, d2.month(), d2.day()); startDate.setDate(d2); } if (!startDate.isValid()) { qDebug() << "Invalid date time retreieved parsing EDF duration for" << filename; return EDFduration(0, 0, filename); } if (!(ok1 && ok2)) { return EDFduration(0, 0, filename); } quint32 start = startDate.toTime_t(); quint32 end = start + rec_duration * num_records; QString filedate = filename.section("/",-1).section("_",0,1); QDateTime dt2 = QDateTime::fromString(filedate, "yyyyMMdd_hhmmss"); quint32 st2 = dt2.toTime_t(); start = qMin(st2, start); if (end < start) end = qMax(st2, start); if ((ext == "EVE") || (ext == "CSL")) { // S10 Forces us to parse EVE files to find their real durations quint32 en2; // Have to get the actual duration of the EVE file by parsing the annotations. :( int recs = PeekAnnotations(filename, st2, en2); if (recs > 0) { start = qMin(st2, start); end = qMax(en2, end); EDFduration dur(start, end, filename); dur.type = lookupEDFType(ext.toUpper()); return dur; } else { // empty annotations file, don't give a crap about it... return EDFduration(0, 0, filename); } // A Firmware bug causes (perhaps with failing SD card) sessions to sometimes take a long time to write } EDFduration dur(start, end, filename); dur.type = lookupEDFType(ext.toUpper()); return dur; } int ResmedLoader::scanFiles(Machine * mach, QString datalog_path) { QHash skipfiles; bool create_backups = true; //p_profile->session->backupCardData(); QString backup_path = mach->getBackupPath(); QString dlog = datalog_path; if (datalog_path == backup_path + RMS9_STR_datalog + "/") { // Don't create backups if importing from backup folder create_backups = false; } // Read the "already imported" file list QFile impfile(mach->getDataPath()+"/imported_files.csv"); if (impfile.open(QFile::ReadOnly)) { QTextStream impstream(&impfile); QString serial; impstream >> serial; if (mach->serial() == serial) { QString line, file, str; SessionID sid; bool ok; do { line = impstream.readLine(); file = line.section(',',0,0); str = line.section(',',1); sid = str.toInt(&ok); skipfiles[file] = sid; } while (!impstream.atEnd()); } } impfile.close(); QStringList dirs; dirs.push_back(datalog_path); QDir dir(datalog_path); dir.setFilter(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot); QFileInfoList flist = dir.entryInfoList(); QString filename; bool ok, gz; // Scan for any sub folders for (int i = 0; i < flist.size(); i++) { QFileInfo fi = flist.at(i); filename = fi.fileName(); if (filename.length() == 4) { // year folder (used in backups) filename.toInt(&ok); if (ok) { dirs.push_back(fi.canonicalFilePath()); } } else if (filename.length() == 8) { // S10 stores sessions per day folders filename.toInt(&ok); if (ok) { dirs.push_back(fi.canonicalFilePath()); } } } QStringList newSkipFiles; QMap newfiles; // used for duplicate checking, and session overlap testing to group sessions QHash > filesbytype; // Scan through all folders looking for EDF files, skip any already imported and peek inside to get durations for (int d=0; d < dirs.size(); ++d) { dir.setPath(dirs.at(d)); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); flist = dir.entryInfoList(); // get number of files in current directory being processed int size = flist.size(); // For each file in flist... for (int i = 0; i < size; i++) { QFileInfo fi = flist.at(i); filename = fi.fileName(); // Forget about it if it can't be read. if (!fi.isReadable()) { continue; } // Chop off the .gz component if it exists if (filename.endsWith(STR_ext_gz)) { filename.chop(3); gz = true; } else { gz = false; } // Skip if this file is in the already imported list if (skipfiles.contains(filename)) continue; if (newfiles.contains(filename)) { // Not sure what to do with it.. delete it? check compress status and delete the other one? qDebug() << "Duplicate EDF file detected" << filename; continue; } // Peek inside file and get duration in seconds.. // Accept only .edf and .edf.gz files if (filename.right(4).toLower() != "." + STR_ext_EDF) { continue; } QString fullname = fi.canonicalFilePath(); // Peek inside the EDF file and get the EDFDuration record for the session matching that follows EDFduration dur = getEDFDuration(fullname); dur.filename = filename; if (dur.start != dur.end) { // make sure empty EVE's are skipped QMap::iterator it = newfiles.insert(filename, getEDFDuration(fullname)); filesbytype[dur.type].append(&it.value()); } } } QList EDForder; EDForder.push_back(EDF_PLD); EDForder.push_back(EDF_BRP); EDForder.push_back(EDF_SAD); for (int i=0; i<3; i++) { EDFType basetype = EDForder.takeFirst(); // Process PLD files QList & LIST = filesbytype[basetype]; int base_size = LIST.size(); for (int f=0; f < base_size; ++f) { const EDFduration * dur = LIST.at(f); quint32 start = dur->start; if (start == 0) continue; quint32 end = dur->end; QHash grp; grp[basetype].append(create_backups ? backup(dur->path, backup_path) : dur->path); QStringList files; files.append(dur->filename); for (int o=0; o & EDF_list = filesbytype[type]; QList::iterator item; QList::iterator list_end = EDF_list.end(); for (item = EDF_list.begin(); item != list_end; ++item) { const EDFduration * dur2 = *item; if (dur2->start == 0) continue; // Do the sessions Overlap? if ((start < dur2->end) && ( dur2->start < end)) { start = qMin(start, dur2->start); end = qMax(end, dur2->end); files.append(dur2->filename); grp[type].append(create_backups ? backup(dur2->path, backup_path) : dur2->path); filesbytype[type].erase(item); } } } // EVE annotation files can cover multiple sessions QList & EDF_list = filesbytype[EDF_EVE]; QList::iterator item; QList::iterator list_end = EDF_list.end(); for (item = EDF_list.begin(); item != list_end; ++item) { const EDFduration * dur2 = *item; if (dur2->start == 0) continue; // Do the sessions Overlap? if ((start < dur2->end) && ( dur2->start < end)) { // start = qMin(start, dur2->start); // end = qMax(end, dur2->end); files.append(dur2->filename); grp[EDF_EVE].append(create_backups ? backup(dur2->path, backup_path) : dur2->path); } } // CSL files contain CSR flags QList & CSL_list = filesbytype[EDF_CSL]; list_end = CSL_list.end(); for (item = CSL_list.begin(); item != list_end; ++item) { const EDFduration * dur2 = *item; if (dur2->start == 0) continue; // Do the sessions Overlap? if ((start < dur2->end) && ( dur2->start < end)) { // start = qMin(start, dur2->start); // end = qMax(end, dur2->end); files.append(dur2->filename); grp[EDF_CSL].append(create_backups ? backup(dur2->path, backup_path) : dur2->path); } } if (mach->SessionExists(start) == nullptr) { //EDFGroup group(grp[EDF_BRP], grp[EDF_EVE], grp[EDF_PLD], grp[EDF_SAD], grp[EDF_CSL]); if (grp.size() > 0) { queTask(new ResmedImport(this, start, grp, mach)); for (int i=0; i::iterator it; QMap::iterator itn; QMap::iterator it_end = newfiles.end(); // Now scan through all new files, and group together into sessions for (it = newfiles.begin(); it != it_end; ++it) { quint32 start = it.value().start; if (start == 0) continue; const QString & file = it.key(); quint32 end = it.value().end; QString type = file.section("_", -1).section(".", 0, 0).toUpper(); QString newpath = create_backups ? backup(it.value().path, backup_path) : it.value().path; EDFGroup group; if (type == "BRP") group.BRP = newpath; else if (type == "EVE") { if (group.BRP.isEmpty()) { qDebug() << "Jedimark's Order theory was wrong.. EVE's need to be parsed seperately!"; } group.EVE = newpath; } else if (type == "PLD") group.PLD = newpath; else if (type == "SAD") group.SAD = newpath; else continue; QStringList sessfiles; sessfiles.push_back(file); for (itn = it+1; itn != it_end; ++itn) { if (itn.value().start == 0) continue; // already processed const EDFduration & dur2 = itn.value(); // Do the sessions Overlap? if ((start < dur2.end) && ( dur2.start < end)) { start = qMin(start, dur2.start); end = qMax(end, dur2.end); type = itn.key().section("_",-1).section(".",0,0).toUpper(); newpath = create_backups ? backup(dur2.path, backup_path) : dur2.path; if (type == "BRP") { if (!group.BRP.isEmpty()) { itn.value().start = 0; continue; } group.BRP = newpath; } else if (type == "EVE") { if (!group.EVE.isEmpty()) { itn.value().start = 0; continue; } group.EVE = newpath; } else if (type == "PLD") { if (!group.PLD.isEmpty()) { itn.value().start = 0; continue; } group.PLD = newpath; } else if (type == "SAD") { if (!group.SAD.isEmpty()) { itn.value().start = 0; continue; } group.SAD = newpath; } else { itn.value().start = 0; continue; } sessfiles.push_back(itn.key()); itn.value().start = 0; } } if (mach->SessionExists(start) == nullptr) { queTask(new ResmedImport(this, start, group, mach)); for (int i=0; i < sessfiles.size(); ++i) { skipfiles[sessfiles.at(i)] = start; } } } */ // Run the tasks... int c = countTasks(); runTasks(p_profile->session->multithreading()); newSkipFiles.append(skipfiles.keys()); impfile.remove(); if (impfile.open(QFile::WriteOnly)) { QTextStream out(&impfile); out << mach->serial(); QHash::iterator skit; QHash::iterator skit_end = skipfiles.end(); for (skit = skipfiles.begin(); skit != skit_end; ++skit) { QString a = QString("%1,%2\n").arg(skit.key()).arg(skit.value());; out << a; } out.flush(); } impfile.close(); return c; } int ResmedLoader::Open(QString path) { QString key, value; QString line; QString newpath; QString filename; QHash idmap; // Temporary properties hash path = path.replace("\\", "/"); // Strip off end "/" if any if (path.endsWith("/")) { path = path.section("/", 0, -2); } // Strip off DATALOG from path, and set newpath to the path contianing DATALOG if (path.endsWith(RMS9_STR_datalog)) { newpath = path + "/"; path = path.section("/", 0, -2); } else { newpath = path + "/" + RMS9_STR_datalog + "/"; } // Add separator back path += "/"; // Check DATALOG folder exists and is readable if (!QDir().exists(newpath)) { return -1; } /////////////////////////////////////////////////////////////////////////////////// // Parse Identification.tgt file (containing serial number and machine information) /////////////////////////////////////////////////////////////////////////////////// filename = path + RMS9_STR_idfile + STR_ext_TGT; QFile f(filename); // Abort if this file is dodgy.. if (!f.exists() || !f.open(QIODevice::ReadOnly)) { return -1; } MachineInfo info = newInfo(); // Parse # entries into idmap. while (!f.atEnd()) { line = f.readLine().trimmed(); if (!line.isEmpty()) { key = line.section(" ", 0, 0).section("#", 1); value = line.section(" ", 1); if (key == "SRN") { // Serial Number info.serial = value; continue; } else if (key == "PNA") { // Product Name value.replace("_"," "); if (value.contains("S9")) { value.replace("S9", ""); info.series = "S9"; } else if (value.contains("AirSense 10")) { value.replace("AirSense 10", ""); info.series = "AirSense 10"; } value.replace("(",""); value.replace(")",""); if (value.contains("Adapt", Qt::CaseInsensitive)) { if (!value.contains("VPAP")) { value.replace("Adapt", QObject::tr("VPAP Adapt")); } } info.model = value.trimmed(); continue; } else if (key == "PCD") { // Product Code info.modelnumber = value; continue; } idmap[key] = value; } } f.close(); // Abort if no serial number if (info.serial.isEmpty()) { qDebug() << "S9 Data card has no valid serial number in Indentification.tgt"; return -1; } // Early check for STR.edf file, so we can early exit before creating faulty machine record. QString strpath = path + RMS9_STR_strfile + STR_ext_EDF; // STR.edf file f.setFileName(strpath); if (!f.exists()) { // No STR.edf.. Do we have a STR.edf.gz? strpath += STR_ext_gz; f.setFileName(strpath); if (!f.exists()) { qDebug() << "Missing STR.edf file"; return -1; } } /////////////////////////////////////////////////////////////////////////////////// // Create machine object (unless it's already registered) /////////////////////////////////////////////////////////////////////////////////// Machine *m = CreateMachine(info); bool create_backups = p_profile->session->backupCardData(); bool compress_backups = p_profile->session->compressBackupData(); QString backup_path = m->getBackupPath(); if (path == backup_path) { // Don't create backups if importing from backup folder create_backups = false; } /////////////////////////////////////////////////////////////////////////////////// // Parse the idmap into machine objects properties, (overwriting any old values) /////////////////////////////////////////////////////////////////////////////////// for (QHash::iterator i = idmap.begin(); i != idmap.end(); i++) { m->properties[i.key()] = i.value(); } /////////////////////////////////////////////////////////////////////////////////// // Open and Parse STR.edf file /////////////////////////////////////////////////////////////////////////////////// QStringList strfiles; strfiles.push_back(strpath); QDir dir(path + "STR_Backup"); dir.setFilter(QDir::Files | QDir::Hidden | QDir::Readable); QFileInfoList flist = dir.entryInfoList(); { int size = flist.size(); for (int i = 0; i < size; i++) { QFileInfo fi = flist.at(i); filename = fi.fileName(); if (filename.startsWith("STR", Qt::CaseInsensitive)) { strfiles.push_back(fi.filePath()); } } } strsess.clear(); ParseSTR(m, strfiles); EDFParser stredf(strpath); if (!stredf.Parse()) { qDebug() << "Faulty file" << RMS9_STR_strfile; return 0; } if (stredf.serialnumber != info.serial) { qDebug() << "Identification.tgt Serial number doesn't match STR.edf!"; } // Creating early as we need the object dir.setPath(newpath); /////////////////////////////////////////////////////////////////////////////////// // Create the backup folder for storing a copy of everything in.. // (Unless we are importing from this backup folder) /////////////////////////////////////////////////////////////////////////////////// if (create_backups) { if (!dir.exists(backup_path)) { if (!dir.mkpath(backup_path + RMS9_STR_datalog)) { qDebug() << "Could not create S9 backup directory :-/"; } } // Copy Identification files to backup folder QFile::copy(path + RMS9_STR_idfile + STR_ext_TGT, backup_path + RMS9_STR_idfile + STR_ext_TGT); QFile::copy(path + RMS9_STR_idfile + STR_ext_CRC, backup_path + RMS9_STR_idfile + STR_ext_CRC); QDateTime dts = QDateTime::fromMSecsSinceEpoch(stredf.startdate); dir.mkpath(backup_path + "STR_Backup"); QString strmonthly = backup_path + "STR_Backup/STR-" + dts.toString("yyyyMM") + "." + STR_ext_EDF; //copy STR files to backup folder if (strpath.endsWith(STR_ext_gz)) { // Already compressed. Don't bother decompressing.. QFile::copy(strpath, backup_path + RMS9_STR_strfile + STR_ext_EDF + STR_ext_gz); } else { // Compress STR file to backup folder QString strf = backup_path + RMS9_STR_strfile + STR_ext_EDF; // Copy most recent to STR.edf if (QFile::exists(strf)) { QFile::remove(strf); } if (QFile::exists(strf + STR_ext_gz)) { QFile::remove(strf + STR_ext_gz); } compress_backups ? compressFile(strpath, strf) : QFile::copy(strpath, strf); } // Keep one STR.edf backup every month if (!QFile::exists(strmonthly) && !QFile::exists(strmonthly + ".gz")) { compress_backups ? compressFile(strpath, strmonthly) : QFile::copy(strpath, strmonthly); } // Meh.. these can be calculated if ever needed for ResScan SDcard export QFile::copy(path + "STR.crc", backup_path + "STR.crc"); } /////////////////////////////////////////////////////////////////////////////////// // Process the actual STR.edf data /////////////////////////////////////////////////////////////////////////////////// qint64 numrecs = stredf.GetNumDataRecords(); qint64 duration = numrecs * stredf.GetDuration(); int days = duration / 86400000L; // GetNumDataRecords = this.. Duh! // Process STR.edf and find first and last time for each day QVector dayused; dayused.resize(days); time_t time = stredf.startdate / 1000L; // == 12pm on first day // reset time to first day time = stredf.startdate / 1000; /////////////////////////////////////////////////////////////////////////////////// // Scan DATALOG files, sort, and import any new sessions /////////////////////////////////////////////////////////////////////////////////// int num_new_sessions = scanFiles(m, newpath); //////////////////////////////////////////////////////////////////////////////////// // Now look for any new summary data that can be extracted from STR.edf records //////////////////////////////////////////////////////////////////////////////////// int size = m->sessionlist.size(); int cnt=0; Session * sess; // Scan through all sessions, and remove any strsess records that have a matching session already // for (sessit = m->sessionlist.begin(); sessit != sessend; ++sessit) { // sess = *sessit; // quint32 key = sess->settings[RMS9_MaskOnTime].toUInt(); // // Ugly.. need to check sessions overlaps.. // QMap::iterator e = strsess.find(key); // if (e != end) { // strsess.erase(e); // } // } /// QHash::iterator sessit; QHash::iterator sessend = m->sessionlist.end();; QMap::iterator sit; QMap::iterator ns_end = new_sessions.end(); QMap::iterator it; QMap::iterator end = strsess.end(); QList strlist; for (it = strsess.begin(); it != end; ++it) { STRRecord & R = it.value(); quint32 s1 = R.maskon; quint32 e1 = R.maskoff; bool fnd = false; for (sessit = m->sessionlist.begin(); sessit != sessend; ++sessit) { sess = sessit.value(); quint32 s2 = sess->session(); quint32 e2 = s2 + (sess->length() / 1000L); if ((s1 < e2) && (s2 < e1)) { strlist.push_back(it.key()); fnd = true; break; } } if (!fnd) for (sit = new_sessions.begin(); sit != ns_end; ++sit) { sess = sit.value(); quint32 s2 = sess->session(); quint32 e2 = s2 + (sess->length() / 1000L); if ((s1 < e2) && (s2 < e1)) { strlist.push_back(it.key()); fnd = true; break; } } } for (int i=0; isession->ignoreOlderSessionsDate().toTime_t(); bool ignoreold = p_profile->session->ignoreOlderSessions(); // strsess end can change above. end = strsess.end(); ///////////////////////////////////////////////////////////////////////////////////////////// // Scan through unmatched strsess records, and attempt to get at summary data ///////////////////////////////////////////////////////////////////////////////////////////// for (it = strsess.begin(); it != end; ++it) { STRRecord & R = it.value(); if (ignoreold && (R.maskon < ignoreolder)) { m->skipSaveTask(); continue; } //Q_ASSERT(R.sessionid == 0); // the following should not happen if (R.sessionid > 0) { m->skipSaveTask(); continue; } queTask(new ResmedImportStage2(this, R, m)); } num_new_sessions += countTasks(); runTasks(); finishAddingSessions(); #ifdef DEBUG_EFFICIENCY { qint64 totalbytes = 0; qint64 totalns = 0; qDebug() << "Time Delta Efficiency Information"; for (QHash::iterator it = channel_efficiency.begin(); it != channel_efficiency.end(); it++) { ChannelID code = it.key(); qint64 value = it.value(); qint64 ns = channel_time[code]; totalbytes += value; totalns += ns; double secs = double(ns) / 1000000000.0L; QString s = value < 0 ? "saved" : "cost"; qDebug() << "Time-Delta conversion for " + schema::channel[code].label() + " " + s + " " + QString::number(qAbs(value)) + " bytes and took " + QString::number(secs, 'f', 4) + "s"; } qDebug() << "Total toTimeDelta function usage:" << totalbytes << "in" << double( totalns) / 1000000000.0 << "seconds"; } #endif if (qprogress) { qprogress->setValue(100); } sessfiles.clear(); strsess.clear(); strdate.clear(); channel_efficiency.clear(); channel_time.clear(); qDebug() << "Total Events " << event_cnt; return num_new_sessions; } QString ResmedLoader::backup(QString fullname, QString backup_path) { bool compress = p_profile->session->compressBackupData(); QString filename, yearstr, newname, oldname; bool ok, gz = (fullname.right(3).toLower() == STR_ext_gz); filename = fullname.section("/", -1); if (gz) { filename.chop(3); } yearstr = filename.left(4); yearstr.toInt(&ok, 10); if (!ok) { qDebug() << "Invalid EDF filename given to ResMedLoader::backup()"; return ""; } newname = backup_path + RMS9_STR_datalog + "/" + yearstr; QDir dir; dir.mkpath(newname); newname += "/" + filename; QString tmpname = newname; if (compress) { newname += STR_ext_gz; } // First make sure the correct backup exists. if (!QFile::exists(newname)) { if (compress) { gz ? QFile::copy(fullname, newname) // Already compressed.. copy it to the right location : compressFile(fullname, newname); } else { // dont really care if it's compressed and not meant to be, leave it that way QFile::copy(fullname, newname); } } // else backup already exists... // Now the correct backup is in place, we can trash any if (compress) { // Remove any uncompressed duplicate if (QFile::exists(tmpname)) { QFile::remove(tmpname); } } else { // Delete the non compressed copy and choose it instead. if (QFile::exists(tmpname + STR_ext_gz)) { QFile::remove(tmpname); newname = tmpname + STR_ext_gz; } } // Remove any traces from old backup directory structure oldname = backup_path + RMS9_STR_datalog + "/" + filename; if (QFile::exists(oldname)) { QFile::remove(oldname); } if (QFile::exists(oldname + STR_ext_gz)) { QFile::remove(oldname + STR_ext_gz); } return newname; } bool ResmedLoader::LoadCSL(Session *sess, const QString & path) { EDFParser edf(path); if (!edf.Parse()) return false; QString t; long recs; double duration; char *data; char c; long pos; bool sign, ok; double d; double tt; // Notes: Event records have useless duration record. // sess->updateFirst(edf.startdate); EventList *CSR = nullptr; // Allow for empty sessions.. qint64 csr_starts = 0; // Process event annotation records for (int s = 0; s < edf.GetNumSignals(); s++) { recs = edf.edfsignals[s].nr * edf.GetNumDataRecords() * 2; data = (char *)edf.edfsignals[s].data; pos = 0; tt = edf.startdate; // sess->updateFirst(tt); duration = 0; while (pos < recs) { c = data[pos]; if ((c != '+') && (c != '-')) { break; } if (data[pos++] == '+') { sign = true; } else { sign = false; } t = ""; c = data[pos]; do { t += c; pos++; c = data[pos]; } while ((c != 20) && (c != 21)); // start code d = t.toDouble(&ok); if (!ok) { qDebug() << "Faulty EDF CSL file " << edf.filename; break; } if (!sign) { d = -d; } tt = edf.startdate + qint64(d * 1000.0); duration = 0; // First entry if (data[pos] == 21) { pos++; // get duration. t = ""; do { t += data[pos]; pos++; } while ((data[pos] != 20) && (pos < recs)); // start code duration = t.toDouble(&ok); if (!ok) { qDebug() << "Faulty EDF CSL file (at %" << pos << ") " << edf.filename; break; } } while ((data[pos] == 20) && (pos < recs)) { t = ""; pos++; if (data[pos] == 0) { break; } if (data[pos] == 20) { pos++; break; } do { t += tolower(data[pos++]); } while ((data[pos] != 20) && (pos < recs)); // start code if (!t.isEmpty()) { if (t == "csr start") { csr_starts = tt; } else if (t == "csr end") { if (!CSR) { CSR = sess->AddEventList(CPAP_CSR, EVL_Event); } if (csr_starts > 0) { if (sess->checkInside(csr_starts)) CSR->AddEvent(tt, double(tt - csr_starts) / 1000.0); csr_starts = 0; } else { qDebug() << "If you can read this, ResMed sucks and split CSR flagging!"; } } else if (t != "recording starts") { qDebug() << "Unobserved ResMed CSL annotation field: " << t; } } if (pos >= recs) { qDebug() << "Short EDF CSL file" << edf.filename; break; } // pos++; } while ((data[pos] == 0) && (pos < recs)) { pos++; } if (pos >= recs) { break; } } // sess->updateLast(tt); } return true; } bool ResmedLoader::LoadEVE(Session *sess, const QString & path) { EDFParser edf(path); if (!edf.Parse()) return false; QString t; long recs; double duration; char *data; char c; long pos; bool sign, ok; double d; double tt; // Notes: Event records have useless duration record. // sess->updateFirst(edf.startdate); EventList *OA = nullptr, *HY = nullptr, *CA = nullptr, *UA = nullptr, *RE = nullptr; // Allow for empty sessions.. // Create EventLists OA = sess->AddEventList(CPAP_Obstructive, EVL_Event); HY = sess->AddEventList(CPAP_Hypopnea, EVL_Event); UA = sess->AddEventList(CPAP_Apnea, EVL_Event); // Process event annotation records for (int s = 0; s < edf.GetNumSignals(); s++) { recs = edf.edfsignals[s].nr * edf.GetNumDataRecords() * 2; data = (char *)edf.edfsignals[s].data; pos = 0; tt = edf.startdate; // sess->updateFirst(tt); duration = 0; while (pos < recs) { c = data[pos]; if ((c != '+') && (c != '-')) { break; } if (data[pos++] == '+') { sign = true; } else { sign = false; } t = ""; c = data[pos]; do { t += c; pos++; c = data[pos]; } while ((c != 20) && (c != 21)); // start code d = t.toDouble(&ok); if (!ok) { qDebug() << "Faulty EDF EVE file " << edf.filename; break; } if (!sign) { d = -d; } tt = edf.startdate + qint64(d * 1000.0); duration = 0; // First entry if (data[pos] == 21) { pos++; // get duration. t = ""; do { t += data[pos]; pos++; } while ((data[pos] != 20) && (pos < recs)); // start code duration = t.toDouble(&ok); if (!ok) { qDebug() << "Faulty EDF EVE file (at %" << pos << ") " << edf.filename; break; } } while ((data[pos] == 20) && (pos < recs)) { t = ""; pos++; if (data[pos] == 0) { break; } if (data[pos] == 20) { pos++; break; } do { t += tolower(data[pos++]); } while ((data[pos] != 20) && (pos < recs)); // start code if (!t.isEmpty()) { if (matchSignal(CPAP_Obstructive, t)) { if (sess->checkInside(tt)) OA->AddEvent(tt, duration); } else if (matchSignal(CPAP_Hypopnea, t)) { if (sess->checkInside(tt)) HY->AddEvent(tt, duration + 10); // Only Hyponea's Need the extra duration??? } else if (matchSignal(CPAP_Apnea, t)) { if (sess->checkInside(tt)) UA->AddEvent(tt, duration); } else if (matchSignal(CPAP_RERA, t)) { // Not all machines have it, so only create it when necessary.. if (!RE) { if (!(RE = sess->AddEventList(CPAP_RERA, EVL_Event))) { return false; } } if (sess->checkInside(tt)) RE->AddEvent(tt, duration); } else if (matchSignal(CPAP_ClearAirway, t)) { // Not all machines have it, so only create it when necessary.. if (!CA) { if (!(CA = sess->AddEventList(CPAP_ClearAirway, EVL_Event))) { return false; } } if (sess->checkInside(tt)) CA->AddEvent(tt, duration); } else { if (t != "recording starts") { qDebug() << "Unobserved ResMed annotation field: " << t; } } } if (pos >= recs) { qDebug() << "Short EDF EVE file" << edf.filename; break; } // pos++; } while ((data[pos] == 0) && (pos < recs)) { pos++; } if (pos >= recs) { break; } } // sess->updateLast(tt); } return true; } bool ResmedLoader::LoadBRP(Session *sess, const QString & path) { EDFParser edf(path); if (!edf.Parse()) return false; sess->updateFirst(edf.startdate); qint64 duration = edf.GetNumDataRecords() * edf.GetDuration(); sess->updateLast(edf.startdate + duration); for (int s = 0; s < edf.GetNumSignals(); s++) { EDFSignal &es = edf.edfsignals[s]; long recs = es.nr * edf.GetNumDataRecords(); if (recs < 0) continue; ChannelID code; if (matchSignal(CPAP_FlowRate, es.label)) { code = CPAP_FlowRate; es.gain *= 60.0; es.physical_minimum *= 60.0; es.physical_maximum *= 60.0; es.physical_dimension = "L/M"; } else if (matchSignal(CPAP_MaskPressureHi, es.label)) { code = CPAP_MaskPressureHi; } else if (matchSignal(CPAP_RespEvent, es.label)) { code = CPAP_RespEvent; } else if (es.label != "Crc16") { qDebug() << "Unobserved ResMed BRP Signal " << es.label; continue; } else continue; if (code) { double rate = double(duration) / double(recs); EventList *a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate); a->setDimension(es.physical_dimension); a->AddWaveform(edf.startdate, es.data, recs, duration); sess->setMin(code, a->Min()); sess->setMax(code, a->Max()); sess->setPhysMin(code, es.physical_minimum); sess->setPhysMax(code, es.physical_maximum); } } return true; } // Convert EDFSignal data to sleepyheads Time-Delta Event format void ResmedLoader::ToTimeDelta(Session *sess, EDFParser &edf, EDFSignal &es, ChannelID code, long recs, qint64 duration, EventDataType t_min, EventDataType t_max, bool square) { if (t_min == t_max) { t_min = es.physical_minimum; t_max = es.physical_maximum; } #ifdef DEBUG_EFFICIENCY QElapsedTimer time; time.start(); #endif double rate = (duration / recs); // milliseconds per record double tt = edf.startdate; EventStoreType c, last; int startpos = 0; if ((code == CPAP_Pressure) || (code == CPAP_IPAP) || (code == CPAP_EPAP)) { startpos = 20; // Shave the first 20 seconds of pressure data tt += rate * startpos; } qint16 *sptr = es.data; qint16 *eptr = sptr + recs; sptr += startpos; EventDataType min = t_max, max = t_min, tmp; EventList *el = nullptr; if (recs > startpos + 1) { // Prime last with a good starting value do { last = *sptr++; tmp = EventDataType(last) * es.gain; if ((tmp >= t_min) && (tmp <= t_max)) { min = tmp; max = tmp; el = sess->AddEventList(code, EVL_Event, es.gain, es.offset, 0, 0); el->AddEvent(tt, last); tt += rate; break; } tt += rate; } while (sptr < eptr); if (!el) { return; } for (; sptr < eptr; sptr++) { c = *sptr; if (last != c) { if (square) { tmp = EventDataType(last) * es.gain; if ((tmp >= t_min) && (tmp <= t_max)) { if (tmp < min) { min = tmp; } if (tmp > max) { max = tmp; } el->AddEvent(tt, last); } else { // Out of bounds value, start a new eventlist if (el->count() > 1) { // that should be in session, not the eventlist.. handy for debugging though el->setDimension(es.physical_dimension); el = sess->AddEventList(code, EVL_Event, es.gain, es.offset, 0, 0); } else { el->clear(); // reuse the object } } } tmp = EventDataType(c) * es.gain; if ((tmp >= t_min) && (tmp <= t_max)) { if (tmp < min) { min = tmp; } if (tmp > max) { max = tmp; } el->AddEvent(tt, c); } else { if (el->count() > 1) { el->setDimension(es.physical_dimension); // Create and attach new EventList el = sess->AddEventList(code, EVL_Event, es.gain, es.offset, 0, 0); } else { el->clear(); } } } tt += rate; last = c; } tmp = EventDataType(c) * es.gain; if ((tmp >= t_min) && (tmp <= t_max)) { el->AddEvent(tt, c); } sess->setMin(code, min); sess->setMax(code, max); sess->setPhysMin(code, es.physical_minimum); sess->setPhysMax(code, es.physical_maximum); sess->updateLast(tt); } #ifdef DEBUG_EFFICIENCY qint64 t = time.nsecsElapsed(); int cnt = el->count(); int bytes = cnt * (sizeof(EventStoreType) + sizeof(quint32)); int wvbytes = recs * (sizeof(EventStoreType)); QHash::iterator it = channel_efficiency.find(code); if (it == channel_efficiency.end()) { channel_efficiency[code] = wvbytes - bytes; channel_time[code] = t; } else { it.value() += wvbytes - bytes; channel_time[code] += t; } #endif } // Load SAD Oximetry Signals bool ResmedLoader::LoadSAD(Session *sess, const QString & path) { EDFParser edf(path); if (!edf.Parse()) return false; sess->updateFirst(edf.startdate); qint64 duration = edf.GetNumDataRecords() * edf.GetDuration(); sess->updateLast(edf.startdate + duration); for (int s = 0; s < edf.GetNumSignals(); s++) { EDFSignal &es = edf.edfsignals[s]; //qDebug() << "SAD:" << es.label << es.digital_maximum << es.digital_minimum << es.physical_maximum << es.physical_minimum; long recs = es.nr * edf.GetNumDataRecords(); ChannelID code; bool hasdata = false; for (int i = 0; i < recs; ++i) { if (es.data[i] != -1) { hasdata = true; break; } } if (!hasdata) { continue; } if (matchSignal(OXI_Pulse, es.label)) { code = OXI_Pulse; ToTimeDelta(sess, edf, es, code, recs, duration); sess->setPhysMax(code, 180); sess->setPhysMin(code, 18); } else if (matchSignal(OXI_SPO2, es.label)) { code = OXI_SPO2; es.physical_minimum = 60; ToTimeDelta(sess, edf, es, code, recs, duration); sess->setPhysMax(code, 100); sess->setPhysMin(code, 60); } else if (es.label != "Crc16") { qDebug() << "Unobserved ResMed SAD Signal " << es.label; } } return true; } bool ResmedLoader::LoadPLD(Session *sess, const QString & path) { EDFParser edf(path); if (!edf.Parse()) return false; // Is it save to assume the order does not change here? enum PLDType { MaskPres = 0, TherapyPres, ExpPress, Leak, RR, Vt, Mv, SnoreIndex, FFLIndex, U1, U2 }; qint64 duration = edf.GetNumDataRecords() * edf.GetDuration(); sess->updateFirst(edf.startdate); sess->updateLast(edf.startdate + duration); QString t; int emptycnt = 0; EventList *a = nullptr; double rate; long recs; ChannelID code; for (int s = 0; s < edf.GetNumSignals(); s++) { a = nullptr; EDFSignal &es = edf.edfsignals[s]; recs = es.nr * edf.GetNumDataRecords(); if (recs <= 0) { continue; } rate = double(duration) / double(recs); //qDebug() << "EVE:" << es.digital_maximum << es.digital_minimum << es.physical_maximum << es.physical_minimum << es.gain; if (matchSignal(CPAP_Snore, es.label)) { code = CPAP_Snore; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_Pressure, es.label)) { code = CPAP_Pressure; es.physical_maximum = 25; es.physical_minimum = 4; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_IPAP, es.label)) { code = CPAP_IPAP; es.physical_maximum = 25; es.physical_minimum = 4; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_EPAP, es.label)) { // Expiratory Pressure code = CPAP_EPAP; es.physical_maximum = 25; es.physical_minimum = 4; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_MinuteVent,es.label)) { code = CPAP_MinuteVent; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_RespRate, es.label)) { code = CPAP_RespRate; a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate); a->AddWaveform(edf.startdate, es.data, recs, duration); } else if (matchSignal(CPAP_TidalVolume, es.label)) { code = CPAP_TidalVolume; es.gain *= 1000.0; es.physical_maximum *= 1000.0; es.physical_minimum *= 1000.0; // es.digital_maximum*=1000.0; // es.digital_minimum*=1000.0; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_Leak, es.label)) { code = CPAP_Leak; es.gain *= 60.0; es.physical_maximum *= 60.0; es.physical_minimum *= 60.0; // es.digital_maximum*=60.0; // es.digital_minimum*=60.0; es.physical_dimension = "L/M"; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0, true); sess->setPhysMax(code, 120.0); sess->setPhysMin(code, 0); } else if (matchSignal(CPAP_FLG, es.label)) { code = CPAP_FLG; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_MaskPressure, es.label)) { code = CPAP_MaskPressure; es.physical_maximum = 25; es.physical_minimum = 4; ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0); } else if (matchSignal(CPAP_IE, es.label)) { //I:E ratio code = CPAP_IE; a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate); a->AddWaveform(edf.startdate, es.data, recs, duration); //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0); } else if (matchSignal(CPAP_Ti, es.label)) { code = CPAP_Ti; // There are TWO of these with the same label on my VPAP Adapt 36037 if (sess->eventlist.contains(code)) { continue; } a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate); a->AddWaveform(edf.startdate, es.data, recs, duration); //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0); } else if (matchSignal(CPAP_Te, es.label)) { code = CPAP_Te; // There are TWO of these with the same label on my VPAP Adapt 36037 if (sess->eventlist.contains(code)) { continue; } a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate); a->AddWaveform(edf.startdate, es.data, recs, duration); //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0); } else if (matchSignal(CPAP_TgMV, es.label)) { code = CPAP_TgMV; a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate); a->AddWaveform(edf.startdate, es.data, recs, duration); //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0); } else if (es.label == "") { // What the hell resmed?? if (emptycnt == 0) { code = RMS9_E01; // ToTimeDelta(sess, edf, es, code, recs, duration); } else if (emptycnt == 1) { code = RMS9_E02; // ToTimeDelta(sess, edf, es, code, recs, duration); } else { qDebug() << "Unobserved Empty Signal " << es.label; } emptycnt++; } else if (es.label != "Crc16") { qDebug() << "Unobserved ResMed PLD Signal " << es.label; a = nullptr; } if (a) { sess->setMin(code, a->Min()); sess->setMax(code, a->Max()); sess->setPhysMin(code, es.physical_minimum); sess->setPhysMax(code, es.physical_maximum); a->setDimension(es.physical_dimension); } } return true; } void ResInitModelMap() { // don't really need this anymore // Resmed_Model_Map = { // { "S9 Escape", { 36001, 36011, 36021, 36141, 36201, 36221, 36261, 36301, 36361 } }, // { "S9 Escape Auto", { 36002, 36012, 36022, 36302, 36362 } }, // { "S9 Elite", { 36003, 36013, 36023, 36103, 36113, 36123, 36143, 36203, 36223, 36243, 36263, 36303, 36343, 36363 } }, // { "S9 Autoset", { 36005, 36015, 36025, 36105, 36115, 36125, 36145, 36205, 36225, 36245, 36265, 36305, 36325, 36345, 36365 } }, // { "S9 AutoSet CS", { 36100, 36110, 36120, 36140, 36200, 36220, 36360 } }, // { "S9 AutoSet 25", { 36106, 36116, 36126, 36146, 36206, 36226, 36366 } }, // { "S9 AutoSet for Her", { 36065 } }, // { "S9 VPAP S", { 36004, 36014, 36024, 36114, 36124, 36144, 36204, 36224, 36284, 36304 } }, // { "S9 VPAP Auto", { 36006, 36016, 36026 } }, // { "S9 VPAP Adapt", { 36037, 36007, 36017, 36027, 36367 } }, // { "S9 VPAP ST", { 36008, 36018, 36028, 36108, 36148, 36208, 36228, 36368 } }, // { "S9 VPAP ST 22", { 36118, 36128 } }, // { "S9 VPAP ST-A", { 36039, 36159, 36169, 36379 } }, // //S8 Series // { "S8 Escape", { 33007 } }, // { "S8 Elite II", { 33039 } }, // { "S8 Escape II", { 33051 } }, // { "S8 Escape II AutoSet", { 33064 } }, // { "S8 AutoSet II", { 33129 } }, // }; //////////////////////////////////////////////////////////////////////////// // Translation lookup table for non-english machines //////////////////////////////////////////////////////////////////////////// // Only put the first part, enough to be identifiable, because ResMed likes // to signal names crop short // Read this from a table? resmed_codes.clear(); // BRP file resmed_codes[CPAP_FlowRate].push_back("Flow"); resmed_codes[CPAP_FlowRate].push_back("Flow.40ms"); resmed_codes[CPAP_MaskPressureHi].push_back("Mask Pres"); resmed_codes[CPAP_MaskPressureHi].push_back("Press.40ms"); // PLD File resmed_codes[CPAP_MaskPressure].push_back("Mask Pres"); resmed_codes[CPAP_RespEvent].push_back("Resp Event"); resmed_codes[CPAP_Pressure].push_back("Therapy Pres"); resmed_codes[CPAP_IPAP].push_back("Insp Pres"); resmed_codes[CPAP_IPAP].push_back("IPAP"); resmed_codes[CPAP_EPAP].push_back("Exp Pres"); resmed_codes[CPAP_EPAP].push_back("EPAP"); resmed_codes[CPAP_EPAPHi].push_back("Max EPAP"); resmed_codes[CPAP_EPAPLo].push_back("Min EPAP"); resmed_codes[CPAP_IPAPHi].push_back("Max IPAP"); resmed_codes[CPAP_IPAPLo].push_back("Min IPAP"); resmed_codes[CPAP_PS].push_back("PS"); resmed_codes[CPAP_PSMin].push_back("Min PS"); resmed_codes[CPAP_PSMax].push_back("Max PS"); resmed_codes[CPAP_Leak].push_back("Leak"); // Leak Leck Lekk Läck Fuites resmed_codes[CPAP_Leak].push_back("Leck"); resmed_codes[CPAP_Leak].push_back("Fuites"); resmed_codes[CPAP_Leak].push_back("\xE6\xBC\x8F\xE6\xB0\x94"); resmed_codes[CPAP_Leak].push_back("Lekk"); resmed_codes[CPAP_Leak].push_back("Läck"); resmed_codes[CPAP_Leak].push_back("Läck"); resmed_codes[CPAP_RespRate].push_back("RR"); resmed_codes[CPAP_RespRate].push_back("AF"); resmed_codes[CPAP_RespRate].push_back("FR"); resmed_codes[CPAP_MinuteVent].push_back("MV"); resmed_codes[CPAP_MinuteVent].push_back("VM"); resmed_codes[CPAP_TidalVolume].push_back("Vt"); resmed_codes[CPAP_TidalVolume].push_back("VC"); resmed_codes[CPAP_IE].push_back("I:E"); resmed_codes[CPAP_Snore].push_back("Snore"); resmed_codes[CPAP_FLG].push_back("FFL Index"); resmed_codes[CPAP_Ti].push_back("Ti"); resmed_codes[CPAP_Te].push_back("Te"); resmed_codes[CPAP_TgMV].push_back("TgMV"); resmed_codes[OXI_Pulse].push_back("Pulse"); resmed_codes[OXI_Pulse].push_back("Puls"); resmed_codes[OXI_Pulse].push_back("Pouls"); resmed_codes[OXI_Pulse].push_back("Pols"); resmed_codes[OXI_SPO2].push_back("SpO2"); resmed_codes[CPAP_Obstructive].push_back("Obstructive apnea"); resmed_codes[CPAP_Hypopnea].push_back("Hypopnea"); resmed_codes[CPAP_Apnea].push_back("Apnea"); resmed_codes[CPAP_RERA].push_back("Arousal"); resmed_codes[CPAP_ClearAirway].push_back("Central apnea"); resmed_codes[CPAP_Mode].push_back("Mode"); resmed_codes[CPAP_Mode].push_back("Modus"); resmed_codes[CPAP_Mode].push_back("Funktion"); resmed_codes[CPAP_Mode].push_back("\xE6\xA8\xA1\xE5\xBC\x8F"); // Chinese resmed_codes[RMS9_SetPressure].push_back("Set Pressure"); resmed_codes[RMS9_SetPressure].push_back("Eingest. Druck"); resmed_codes[RMS9_SetPressure].push_back("Ingestelde druk"); resmed_codes[RMS9_SetPressure].push_back("\xE8\xAE\xBE\xE5\xAE\x9A\xE5\x8E\x8B\xE5\x8A\x9B"); // Chinese resmed_codes[RMS9_SetPressure].push_back("Pres. prescrite"); resmed_codes[RMS9_SetPressure].push_back("Inställt tryck"); resmed_codes[RMS9_SetPressure].push_back("Inställt tryck"); resmed_codes[RMS9_EPR].push_back("EPR"); //resmed_codes[RMS9_EPR].push_back("S.EPR.EPRType"); resmed_codes[RMS9_EPR].push_back("\xE5\x91\xBC\xE6\xB0\x94\xE9\x87\x8A\xE5\x8E\x8B\x28\x45\x50"); // Chinese resmed_codes[RMS9_EPRLevel].push_back("EPR Level"); resmed_codes[RMS9_EPRLevel].push_back("EPR-Stufe"); resmed_codes[RMS9_EPRLevel].push_back("EPR-niveau"); resmed_codes[RMS9_EPRLevel].push_back("\x45\x50\x52\x20\xE6\xB0\xB4\xE5\xB9\xB3"); // Chinese resmed_codes[RMS9_EPRLevel].push_back("Niveau EPR"); resmed_codes[RMS9_EPRLevel].push_back("EPR-nivå"); resmed_codes[RMS9_EPRLevel].push_back("EPR-nivÃ¥"); resmed_codes[CPAP_PressureMax].push_back("Max Pressure"); resmed_codes[CPAP_PressureMax].push_back("Max. Druck"); resmed_codes[CPAP_PressureMax].push_back("Max druk"); resmed_codes[CPAP_PressureMax].push_back("\xE6\x9C\x80\xE5\xA4\xA7\xE5\x8E\x8B\xE5\x8A\x9B"); // Chinese resmed_codes[CPAP_PressureMax].push_back("Pression max."); resmed_codes[CPAP_PressureMax].push_back("Max tryck"); resmed_codes[CPAP_PressureMin].push_back("Min Pressure"); resmed_codes[CPAP_PressureMin].push_back("Min. Druck"); resmed_codes[CPAP_PressureMin].push_back("Min druk"); resmed_codes[CPAP_PressureMin].push_back("\xE6\x9C\x80\xE5\xB0\x8F\xE5\x8E\x8B\xE5\x8A\x9B"); // Chinese resmed_codes[CPAP_PressureMin].push_back("Pression min."); resmed_codes[CPAP_PressureMin].push_back("Min tryck"); // SAD file resmed_codes[OXI_Pulse].push_back("Pulse.1s"); resmed_codes[OXI_SPO2].push_back("SpO2.1s"); // PLD file resmed_codes[CPAP_MaskPressure].push_back("MaskPress.2s"); resmed_codes[CPAP_Pressure].push_back("Press.2s"); //resmed_codes[RMS9_EPRPressure].push_back("EPRPress.2s"); resmed_codes[CPAP_Leak].push_back("Leak.2s"); resmed_codes[CPAP_RespRate].push_back("RespRate.2s"); resmed_codes[CPAP_TidalVolume].push_back("TidVol.2s"); resmed_codes[CPAP_MinuteVent].push_back("MinVent.2s"); resmed_codes[CPAP_Snore].push_back("Snore.2s"); resmed_codes[CPAP_FLG].push_back("FlowLim.2s"); //S.AS.StartPress resmed_codes[CPAP_PressureMin].push_back("S.AS.MinPress"); resmed_codes[CPAP_PressureMax].push_back("S.AS.MaxPress"); resmed_codes[RMS9_SetPressure].push_back("S.C.Press"); resmed_codes[RMS9_EPRLevel].push_back("S.EPR.Level"); } ChannelID ResmedLoader::CPAPModeChannel() { return RMS9_Mode; } ChannelID ResmedLoader::PresReliefMode() { return RMS9_EPR; } ChannelID ResmedLoader::PresReliefLevel() { return RMS9_EPRLevel; } void ResmedLoader::initChannels() { using namespace schema; Channel * chan = nullptr; channel.add(GRP_CPAP, chan = new Channel(RMS9_Mode = 0xe203, SETTING, MT_CPAP, SESSION, "RMS9_Mode", QObject::tr("Mode"), QObject::tr("CPAP Mode"), QObject::tr("Mode"), "", LOOKUP, Qt::green)); chan->addOption(0, QObject::tr("CPAP")); chan->addOption(1, QObject::tr("APAP")); chan->addOption(2, QObject::tr("VPAP-T")); chan->addOption(3, QObject::tr("VPAP-S")); chan->addOption(4, QObject::tr("VPAP-S/T")); chan->addOption(5, QObject::tr("??")); chan->addOption(6, QObject::tr("VPAPauto")); chan->addOption(7, QObject::tr("ASV")); chan->addOption(8, QObject::tr("ASVAuto")); chan->addOption(9, QObject::tr("???")); chan->addOption(10, QObject::tr("???")); chan->addOption(11, QObject::tr("Auto for Her")); channel.add(GRP_CPAP, chan = new Channel(RMS9_EPR = 0xe201, SETTING, MT_CPAP, SESSION, "EPR", QObject::tr("EPR"), QObject::tr("ResMed Exhale Pressure Relief"), QObject::tr("EPR"), "", LOOKUP, Qt::green)); chan->addOption(0, STR_TR_Off); chan->addOption(1, QObject::tr("Ramp Only")); chan->addOption(2, QObject::tr("Full Time")); chan->addOption(3, QObject::tr("Patient???")); channel.add(GRP_CPAP, chan = new Channel(RMS9_EPRLevel = 0xe202, SETTING, MT_CPAP, SESSION, "EPRLevel", QObject::tr("EPR Level"), QObject::tr("Exhale Pressure Relief Level"), QObject::tr("EPR Level"), "", LOOKUP, Qt::blue)); chan->addOption(0, QObject::tr("0cmH2O")); chan->addOption(1, QObject::tr("1cmH2O")); chan->addOption(2, QObject::tr("2cmH2O")); chan->addOption(3, QObject::tr("3cmH2O")); // Modelmap needs channels initalized above!!! ResInitModelMap(); } bool resmed_initialized = false; void ResmedLoader::Register() { if (resmed_initialized) { return; } qDebug() << "Registering ResmedLoader"; RegisterLoader(new ResmedLoader()); resmed_initialized = true; } //////////////////////////////////////////////////////////////////////////////////////////////// // Model number information // 36003, 36013, 36023, 36103, 36113, 36123, 36143, 36203, // 36223, 36243, 36263, 36303, 36343, 36363 S9 Elite Series // 36005, 36015, 36025, 36105, 36115, 36125, 36145, 36205, // 36225, 36245, 36265, 36305, 36325, 36345, 36365 S9 AutoSet Series // 36065 S9 AutoSet for Her // 36001, 36011, 36021, 36141, 36201, 36221, 36261, 36301, // 36361 S9 Escape // 36002, 36012, 36022, 36302, 36362 S9 Escape Auto // 36004, 36014, 36024, 36114, 36124, 36144, 36204, 36224, // 36284, 36304 S9 VPAP S (+ H5i, + Climate Control) // 36006, 36016, 36026 S9 VPAP AUTO (+ H5i, + Climate Control) // 36007, 36017, 36027, 36367 // S9 VPAP ADAPT (+ H5i, + Climate // Control) // 36008, 36018, 36028, 36108, 36148, 36208, 36228, 36368 S9 VPAP ST (+ H5i, + Climate Control) // 36100, 36110, 36120, 36140, 36200, 36220, 36360 S9 AUTOSET CS // 36106, 36116, 36126, 36146, 36206, 36226, 36366 S9 AUTOSET 25 // 36118, 36128 S9 VPAP ST 22 // 36039, 36159, 36169, 36379 S9 VPAP ST-A // 24921, 24923, 24925, 24926, 24927 ResMed Power Station II (RPSII) // 33030 S8 Compact // 33001, 33007, 33013, 33036, 33060 S8 Escape // 33032 S8 Lightweight // 33033 S8 AutoScore // 33048, 33051, 33052, 33053, 33054, 33061 S8 Escape II // 33055 S8 Lightweight II // 33021 S8 Elite // 33039, 33045, 33062, 33072, 33073, 33074, 33075 S8 Elite II // 33044 S8 AutoScore II // 33105, 33112, 33126 S8 AutoSet (including Spirit & Vantage) // 33128, 33137 S8 Respond // 33129, 33141, 33150 S8 AutoSet II // 33136, 33143, 33144, 33145, 33146, 33147, 33148 S8 AutoSet Spirit II // 33138 S8 AutoSet C // 26101, 26121 VPAP Auto 25 // 26119, 26120 VPAP S // 26110, 26122 VPAP ST // 26104, 26105, 26125, 26126 S8 Auto 25 // 26102, 26103, 26106, 26107, 26108, 26109, 26123, 26127 VPAP IV // 26112, 26113, 26114, 26115, 26116, 26117, 26118, 26124 VPAP IV ST sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/intellipap_loader.h0000644000175000017500000000641012412506713025710 0ustar sergiosergio/* Intellipap Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef INTELLIPAP_LOADER_H #define INTELLIPAP_LOADER_H #include "SleepLib/machine.h" // Base class: MachineLoader #include "SleepLib/machine_loader.h" #include "SleepLib/profiles.h" //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the following value when making changes to this loaders implementation. // const int intellipap_data_version = 3; // //******************************************************************************************** /*! \class Intellipap \brief Intellipap customized machine object */ class Intellipap: public CPAP { public: Intellipap(MachineID id = 0); virtual ~Intellipap(); }; const int intellipap_load_buffer_size = 1024 * 1024; extern ChannelID INTP_SmartFlexMode; extern ChannelID INTP_SmartFlexLevel; const QString intellipap_class_name = STR_MACH_Intellipap; /*! \class IntellipapLoader \brief Loader for DeVilbiss Intellipap Auto data This is only relatively recent addition and still needs more work */ class IntellipapLoader : public CPAPLoader { public: IntellipapLoader(); virtual ~IntellipapLoader(); //! \brief Detect if the given path contains a valid Folder structure virtual bool Detect(const QString & path); //! \brief Scans path for Intellipap data signature, and Loads any new data virtual int Open(QString path); //! \brief Returns SleepLib database version of this IntelliPap loader virtual int Version() { return intellipap_data_version; } //! \brief Returns the machine class name of this IntelliPap, "Intellipap" virtual const QString &loaderName() { return intellipap_class_name; } //! \brief Creates a machine object, indexed by serial number // Machine *CreateMachine(QString serial); //! \brief Registers this MachineLoader with the master list, so Intellipap data can load static void Register(); virtual MachineInfo newInfo() { return MachineInfo(MT_CPAP, 0, intellipap_class_name, QObject::tr("DeVilbiss"), QString(), QString(), QString(), QObject::tr("Intellipap"), QDateTime::currentDateTime(), intellipap_data_version); } virtual void initChannels(); //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Now for some CPAPLoader overrides //////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual QString presRelLabel() { return QObject::tr("SmartFlex Settings"); } // might not need this one virtual ChannelID presReliefMode() { return INTP_SmartFlexMode; } virtual ChannelID presRelLevel() { return INTP_SmartFlexLevel; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// protected: QString last; unsigned char *m_buffer; }; #endif // INTELLIPAP_LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h0000644000175000017500000000614612412506713025024 0ustar sergiosergio/* SleepLib CMS50X Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef CMS50F37LOADER_H #define CMS50F37LOADER_H #include "SleepLib/serialoximeter.h" const QString cms50f37_class_name = "CMS50F37"; const int cms50f37_data_version = 0; /*! \class CMS5037Loader \brief Bulk Importer for newer CMS50 oximeters */ class CMS50F37Loader : public SerialOximeter { Q_OBJECT public: CMS50F37Loader(); virtual ~CMS50F37Loader(); virtual bool Detect(const QString &path); virtual int Open(QString path); virtual bool openDevice(); static void Register(); virtual int Version() { return cms50f37_data_version; } virtual const QString &loaderName() { return cms50f37_class_name; } virtual MachineInfo newInfo() { return MachineInfo(MT_OXIMETER, 0, cms50f37_class_name, QObject::tr("Contec"), QObject::tr("CMS50F3.7"), QString(), QString(), QObject::tr("CMS50F"), QDateTime::currentDateTime(), cms50f37_data_version); } // Machine *CreateMachine(); virtual void process(); virtual bool isStartTimeValid() { return true; } virtual QString getUser(); virtual QString getModel(); virtual QString getVendor(); virtual QString getDeviceString(); virtual QDateTime getDateTime(int session); virtual int getDuration(int session); virtual int getSessionCount(); virtual int getOximeterInfo(); virtual void eraseSession(int user, int session); virtual void syncClock(); virtual QString getDeviceID(); virtual void setDeviceID(QString); virtual void setDuration(int d) { duration=d; } virtual bool commandDriven() { return true; } virtual void getSessionData(int session); // Switch device to record transmission mode void requestData(); protected slots: // virtual void dataAvailable(); virtual void resetImportTimeout(); virtual void startImportTimeout(); virtual void shutdownPorts(); void nextCommand(); protected: bool readSpoRFile(QString path); virtual void processBytes(QByteArray bytes); // int doLiveMode(); virtual void killTimers(); void sendCommand(quint8 c); void sendCommand(quint8 c, quint8 c2); // Switch device to live streaming mode virtual void resetDevice(); private: int sequence; EventList *PULSE; EventList *SPO2; QTime m_time; QByteArray buffer; bool started_import; bool finished_import; bool started_reading; int cb_reset,imp_callbacks; int received_bytes; int m_itemCnt; int m_itemTotal; QDate imp_date; QTime imp_time; QString user; unsigned char current_command; volatile int session_count; volatile int duration; int device_info; QString model; QString vendor; QString devid; int duration_divisor; int selected_session; int timectr; int modelsegments; }; #endif // CMS50F37LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/mseries_loader.h0000644000175000017500000000466112412506713025224 0ustar sergiosergio/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * * SleepLib RemStar M-Series Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef MSERIES_LOADER_H #define MSERIES_LOADER_H #include "SleepLib/machine.h" #include "SleepLib/machine_loader.h" #include "SleepLib/profiles.h" //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the following value when making changes to this loaders implementation. // const int mseries_data_version = 2; // //******************************************************************************************** /*! \class MSeries \brief RemStar M-Series customized machine object */ class MSeries: public CPAP { public: MSeries(MachineID id = 0); virtual ~MSeries(); }; const int mseries_load_buffer_size = 1024 * 1024; const QString mseries_class_name = STR_MACH_MSeries; class MSeriesLoader : public MachineLoader { public: MSeriesLoader(); virtual ~MSeriesLoader(); //! \brief Detect if the given path contains a valid Folder structure virtual bool Detect(const QString & path) { Q_UNUSED(path); return false; } //! \brief Opens M-Series block device virtual int Open(QString file); //! \brief Returns the database version of this loader virtual int Version() { return mseries_data_version; } //! \brief Return the loaderName, in this case "MSeries" virtual const QString &loaderName() { return mseries_class_name; } //! \brief Create a new PRS1 machine record, indexed by Serial number. // Machine *CreateMachine(QString serial); virtual MachineInfo newInfo() { return MachineInfo(MT_CPAP, 0, mseries_class_name, QObject::tr("Respironics"), QString(), QString(), QString(), QObject::tr("M-Series"), QDateTime::currentDateTime(), mseries_data_version); } //! \brief Register this Module to the list of Loaders, so it knows to search for PRS1 data. static void Register(); protected: QHash MachList; quint32 epoch; }; #endif // MSERIES_LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/loader_plugins/weinmann_loader.h0000644000175000017500000001110312412506713025356 0ustar sergiosergio/* SleepLib Weinmann SOMNOsoft/Balance Loader Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef WEINMANN_LOADER_H #define WEINMANN_LOADER_H #include "SleepLib/machine.h" // Base class: MachineLoader #include "SleepLib/machine_loader.h" #include "SleepLib/profiles.h" //******************************************************************************************** /// IMPORTANT!!! //******************************************************************************************** // Please INCREMENT the following value when making changes to this loaders implementation. // const int weinmann_data_version = 3; // //******************************************************************************************** /*! \class Weinmann \brief Weinmann customized machine object */ class Weinmann: public CPAP { public: Weinmann(MachineID id = 0); virtual ~Weinmann(); }; struct CompInfo { CompInfo() { session = nullptr; flow_start = 0; flow_size = 0; stat_start = 0; stat_size = 0; pres_start = 0; pres_size = 0; amv_start = 0; amv_size =0; event_start = 0; event_recs = 0; } CompInfo(const CompInfo & copy) { session = copy.session; time = copy.time; flow_start = copy.flow_start; flow_size= copy.flow_size; stat_start = copy.flow_start; stat_size= copy.flow_size; pres_start = copy.pres_start; pres_size = copy.pres_size; amv_start = copy.amv_start; amv_size = copy.amv_size; event_start = copy.event_start; event_recs = copy.event_recs; } CompInfo(Session * sess, QDateTime dt, quint32 fs, quint32 fl, quint32 ss, quint32 sl,quint32 ps, quint32 pl, quint32 ms, quint32 ml, quint32 es, quint32 er): session(sess), time(dt), flow_start(fs), flow_size(fl), stat_start(ss), stat_size(sl), pres_start(ps), pres_size(pl), amv_start(ms), amv_size(ml), event_start(es), event_recs(er) {} Session * session; QDateTime time; quint32 flow_start; quint32 flow_size; quint32 stat_start; quint32 stat_size; quint32 pres_start; quint32 pres_size; quint32 amv_start; quint32 amv_size; quint32 event_start; quint32 event_recs; }; const QString weinmann_class_name = STR_MACH_Weinmann; /*! \class WeinmannLoader \brief Loader for Weinmann CPAP data This is only relatively recent addition and still needs more work */ class WeinmannLoader : public CPAPLoader { public: WeinmannLoader(); virtual ~WeinmannLoader(); //! \brief Detect if the given path contains a valid Folder structure virtual bool Detect(const QString & path); //! \brief Scans path for Weinmann data signature, and Loads any new data virtual int Open(QString path); //! \brief Returns SleepLib database version of this Weinmann loader virtual int Version() { return weinmann_data_version; } //! \brief Returns the machine loader name of this class virtual const QString &loaderName() { return weinmann_class_name; } int ParseIndex(QFile & wmdata); //! \brief Creates a machine object, indexed by serial number // Machine *CreateMachine(QString serial); //! \brief Registers this MachineLoader with the master list, so Weinmann data can load static void Register(); virtual MachineInfo newInfo() { return MachineInfo(MT_CPAP, 0, weinmann_class_name, QObject::tr("Weinmann"), QObject::tr("SOMNOsoft2"), QString(), QString(), QObject::tr(""), QDateTime::currentDateTime(), weinmann_data_version); } virtual void initChannels(); //////////////////////////////////////////////////////////////////////////////////////////////////////////// // Now for some CPAPLoader overrides //////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual QString presRelType() { return QObject::tr("Unknown"); } // might not need this one virtual ChannelID presRelSet() { return NoChannel; } virtual ChannelID presRelLevel() { return NoChannel; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// protected: QHash index; QList compinfo; QMap sessions; QString last; unsigned char *m_buffer; }; #endif // WEINMANN_LOADER_H sleepyhead-0.9.8/sleepyhead/SleepLib/machine_common.cpp0000644000175000017500000000472312412506713022526 0ustar sergiosergio/* SleepLib Common Machine Stuff * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "machine_common.h" ChannelID NoChannel, SESSION_ENABLED, CPAP_SummaryOnly; ChannelID CPAP_IPAP, CPAP_IPAPLo, CPAP_IPAPHi, CPAP_EPAP, CPAP_EPAPLo, CPAP_EPAPHi, CPAP_Pressure, CPAP_PS, CPAP_Mode, CPAP_AHI, CPAP_PressureMin, CPAP_PressureMax, CPAP_Ramp, CPAP_RampTime, CPAP_RampPressure, CPAP_Obstructive, CPAP_Hypopnea, CPAP_ClearAirway, CPAP_Apnea, CPAP_CSR, CPAP_LeakFlag, CPAP_ExP, CPAP_NRI, CPAP_VSnore, CPAP_VSnore2, CPAP_RERA, CPAP_PressurePulse, CPAP_FlowLimit, CPAP_SensAwake, CPAP_FlowRate, CPAP_MaskPressure, CPAP_MaskPressureHi, CPAP_RespEvent, CPAP_Snore, CPAP_MinuteVent, CPAP_RespRate, CPAP_TidalVolume, CPAP_PTB, CPAP_Leak, CPAP_LeakMedian, CPAP_LeakTotal, CPAP_MaxLeak, CPAP_FLG, CPAP_IE, CPAP_Te, CPAP_Ti, CPAP_TgMV, CPAP_UserFlag1, CPAP_UserFlag2, CPAP_UserFlag3, CPAP_BrokenSummary, CPAP_BrokenWaveform, CPAP_RDI, CPAP_PresReliefMode, CPAP_PresReliefLevel, CPAP_PSMin, CPAP_PSMax, CPAP_Test1, CPAP_Test2, CPAP_HumidSetting; ChannelID RMS9_E01, RMS9_E02, RMS9_SetPressure, RMS9_MaskOnTime; ChannelID INTELLIPAP_Unknown1, INTELLIPAP_Unknown2; ChannelID PRS1_00, PRS1_01, PRS1_08, PRS1_0A, PRS1_0B, PRS1_0C, PRS1_0E, PRS1_0F, CPAP_LargeLeak, PRS1_12, PRS1_FlexMode, PRS1_FlexLevel, PRS1_HumidStatus, PRS1_HumidLevel, PRS1_SysLock, PRS1_SysOneResistStat, PRS1_SysOneResistSet, PRS1_HoseDiam, PRS1_AutoOn, PRS1_AutoOff, PRS1_MaskAlert, PRS1_ShowAHI; ChannelID OXI_Pulse, OXI_SPO2, OXI_Perf, OXI_PulseChange, OXI_SPO2Drop, OXI_Plethy; ChannelID Journal_Notes, Journal_Weight, Journal_BMI, Journal_ZombieMeter, LastUpdated, Bookmark_Start, Bookmark_End, Bookmark_Notes; ChannelID ZEO_SleepStage, ZEO_ZQ, ZEO_TotalZ, ZEO_TimeToZ, ZEO_TimeInWake, ZEO_TimeInREM, ZEO_TimeInLight, ZEO_TimeInDeep, ZEO_Awakenings, ZEO_AlarmReason, ZEO_SnoozeTime, ZEO_WakeTone, ZEO_WakeWindow, ZEO_AlarmType, ZEO_MorningFeel, ZEO_FirmwareVersion, ZEO_FirstAlarmRing, ZEO_LastAlarmRing, ZEO_FirstSnoozeTime, ZEO_LastSnoozeTime, ZEO_SetAlarmTime, ZEO_RiseTime; ChannelID POS_Orientation, POS_Inclination; sleepyhead-0.9.8/sleepyhead/SleepLib/machine.cpp0000644000175000017500000007774212412506713021171 0ustar sergiosergio/* SleepLib Machine Class Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mainwindow.h" #include "progressdialog.h" #include #include "machine.h" #include "profiles.h" #include #include "SleepLib/schema.h" #include "SleepLib/day.h" extern QProgressBar *qprogress; ////////////////////////////////////////////////////////////////////////////////////////// // Machine Base-Class implmementation ////////////////////////////////////////////////////////////////////////////////////////// Machine::Machine(MachineID id) { day.clear(); highest_sessionid = 0; m_unsupported = false; if (!id) { srand(time(nullptr)); MachineID temp; do { temp = rand(); } while (p_profile->machlist.find(temp) != p_profile->machlist.end()); m_id = temp; } else { m_id = id; } m_loader = nullptr; // qDebug() << "Create Machine: " << hex << m_id; //%lx",m_id); m_type = MT_UNKNOWN; firstsession = true; } Machine::~Machine() { saveSessionInfo(); qDebug() << "Destroy Machine" << info.loadername << hex << m_id; } Session *Machine::SessionExists(SessionID session) { if (sessionlist.find(session) != sessionlist.end()) { return sessionlist[session]; } else { return nullptr; } } const quint16 sessinfo_version = 2; bool Machine::saveSessionInfo() { if (info.type == MT_JOURNAL) return false; qDebug() << "Saving" << info.brand << "session info" << info.loadername; QString filename = getDataPath() + "Sessions.info"; QFile file(filename); if (!file.open(QFile::WriteOnly)) { qDebug() << "Couldn't open" << filename << "for writing"; return false; } QDataStream out(&file); out.setByteOrder(QDataStream::LittleEndian); out.setVersion(QDataStream::Qt_5_0); out << magic; out << filetype_sessenabled; out << sessinfo_version; QHash::iterator s; out << (int)sessionlist.size(); for (s = sessionlist.begin(); s != sessionlist.end(); ++s) { Session * sess = s.value(); out << (quint32) sess->session(); out << (bool)(sess->enabled()); //out << sess->m_availableChannels; } qDebug() << "Done Saving" << info.brand << "session info"; return true; } bool Machine::loadSessionInfo() { if (info.type == MT_JOURNAL) return true; QHash::iterator s; QFile file(getDataPath() + "Sessions.info"); if (!file.open(QFile::ReadOnly)) { for (s = sessionlist.begin(); s!= sessionlist.end(); ++s) { Session * sess = s.value(); QHash::iterator it = sess->settings.find(SESSION_ENABLED); bool b = true; if (it != sess->settings.end()) { b = it.value().toBool(); } sess->setEnabled(b); // Extract from session settings and save.. } saveSessionInfo(); return true; } QDataStream in(&file); in.setByteOrder(QDataStream::LittleEndian); in.setVersion(QDataStream::Qt_5_0); quint32 mag32; in >> mag32; quint16 ft16, version; in >> ft16; in >> version; if (version == 1) { // was available channels QHash crap; in >> crap; } int size; in >> size; quint32 sid; bool b; for (int i=0; i< size; ++i) { in >> sid; in >> b; s = sessionlist.find(sid); if (s != sessionlist.end()) { Session * sess = s.value(); sess->setEnabled(b); } } return true; } // Find date this session belongs in QDate Machine::pickDate(qint64 first) { QTime split_time = p_profile->session->daySplitTime(); int combine_sessions = p_profile->session->combineCloseSessions(); QDateTime d2 = QDateTime::fromTime_t(first / 1000); QDate date = d2.date(); QTime time = d2.time(); int closest_session = 0; if (time < split_time) { date = date.addDays(-1); } else if (combine_sessions > 0) { QMap::iterator dit = day.find(date.addDays(-1)); // Check Day Before if (dit != day.end()) { QDateTime lt = QDateTime::fromTime_t(dit.value()->last() / 1000L); closest_session = lt.secsTo(d2) / 60; if (closest_session < combine_sessions) { date = date.addDays(-1); } } } return date; } bool Machine::AddSession(Session *s) { Q_ASSERT(s != nullptr); Q_ASSERT(p_profile); Q_ASSERT(p_profile->isOpen()); if (s->type() == MT_OXIMETER) { int i=5; } updateChannels(s); if (p_profile->session->ignoreOlderSessions()) { qint64 ignorebefore = p_profile->session->ignoreOlderSessionsDate().toMSecsSinceEpoch(); if (s->last() < ignorebefore) { skipped_sessions++; return false; } } if (s->session() > highest_sessionid) { highest_sessionid = s->session(); } QTime split_time; int combine_sessions; bool locksessions = p_profile->session->lockSummarySessions(); if (locksessions) { split_time = s->summaryOnly() ? QTime(12,0,0) : p_profile->session->daySplitTime(); combine_sessions = s->summaryOnly() ? 0 : p_profile->session->combineCloseSessions(); } else { split_time = p_profile->session->daySplitTime(); combine_sessions = p_profile->session->combineCloseSessions(); } int ignore_sessions = p_profile->session->ignoreShortSessions(); int session_length = s->last() - s->first(); session_length /= 60000; sessionlist[s->session()] = s; // To make sure it get's saved later even if it's not wanted. //int drift=p_profile->cpap->clockDrift(); QDateTime d2 = QDateTime::fromTime_t(s->first() / 1000); QDate date = d2.date(); QTime time = d2.time(); QMap::iterator dit, nextday; bool combine_next_day = false; int closest_session = 0; // Multithreaded import screws this up. :( if (time < split_time) { date = date.addDays(-1); } else if (combine_sessions > 0) { dit = day.find(date.addDays(-1)); // Check Day Before if (dit != day.end()) { QDateTime lt = QDateTime::fromTime_t(dit.value()->last() / 1000); closest_session = lt.secsTo(d2) / 60; if (closest_session < combine_sessions) { date = date.addDays(-1); } else { if ((split_time < time) && (split_time.secsTo(time) < 2)) { if (s->machine()->loaderName() == STR_MACH_ResMed) { date = date.addDays(-1); } } } } else { nextday = day.find(date.addDays(1)); // Check Day Afterwards if (nextday != day.end()) { QDateTime lt = QDateTime::fromTime_t(nextday.value()->first() / 1000); closest_session = d2.secsTo(lt) / 60; if (closest_session < combine_sessions) { // add todays here. pull all tomorrows records to this date. combine_next_day = true; } } } } if (session_length < ignore_sessions) { // keep the session to save importing it again, but don't add it to the day record this time return true; } if (!firstsession) { if (firstday > date) { firstday = date; } if (lastday < date) { lastday = date; } } else { firstday = lastday = date; firstsession = false; } Day *dd = nullptr; dit = day.find(date); if (dit == day.end()) { dit = day.insert(date, p_profile->addDay(date)); } dd = dit.value(); dd->addSession(s); if (combine_next_day) { for (QList::iterator i = nextday.value()->begin(); i != nextday.value()->end(); i++) { // i may need to do something here if (locksessions && (*i)->summaryOnly()) continue; // can't move summary only sessions.. unlinkSession(*i); // Add it back sessionlist[(*i)->session()] = *i; dd->addSession(*i); } // QMap >::iterator nd = p_profile->daylist.find(date.addDays(1)); // if (nd != p_profile->daylist.end()) { // p_profile->unlinkDay(nd.key(), nd.value()); // } // QList::iterator iend = nd.value().end(); // for (QList::iterator i = nd.value()->begin(); i != iend; ++i) { // if (*i == nextday.value()) { // nd.value().erase(i); // } // } // day.erase(nextday); } return true; } bool Machine::unlinkDay(Day * d) { return day.remove(day.key(d)) > 0; } QString Machine::getPixmapPath() { if (!loader()) return ""; return loader()->getPixmapPath(info.series); } QPixmap & Machine::getPixmap() { static QPixmap pm; if (!loader()) return pm; return loader()->getPixmap(info.series); } bool Machine::unlinkSession(Session * sess) { MachineType mt = sess->type(); // Remove the object from the machine object's session list bool b=sessionlist.remove(sess->session()); QList dates; QList days; QMap::iterator it; Day * d; // Doing this in case of accidental double linkages for (it = day.begin(); it != day.end(); ++it) { d = it.value(); if (it.value()->sessions.contains(sess)) { days.push_back(d); dates.push_back(it.key()); } } for (int i=0; i < days.size(); ++i) { d = days.at(i); if (d->sessions.removeAll(sess)) { b=true; if (!d->searchMachine(mt)) { d->machines.remove(mt); day.remove(dates[i]); } if (d->size() == 0) { p_profile->unlinkDay(d); } } } return b; } // This functions purpose is murder and mayhem... It deletes all of a machines data. bool Machine::Purge(int secret) { // Boring api key to stop this function getting called by accident :) if (secret != 3478216) { return false; } QString path = getDataPath(); QDir dir(path); if (!dir.exists()) { // It doesn't exist anyway. return true; } if (!dir.isReadable()) { return false; } qDebug() << "Purging" << info.loadername << info.serial << dir.absoluteFilePath(path); // Remove any imported file list QFile impfile(getDataPath()+"/imported_files.csv"); impfile.remove(); QFile rxcache(p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" )); rxcache.remove(); QFile sumfile(getDataPath()+"Summaries.xml.gz"); sumfile.remove(); // Create a copy of the list so the hash can be manipulated QList sessions = sessionlist.values(); // Clean up any loaded sessions from memory first.. bool success = true; for (int i=0; i < sessions.size(); ++i) { Session * sess = sessions[i]; if (!sess->Destroy()) { qDebug() << "Could not destroy "+ info.loadername +" ("+info.serial+") session" << sess->session(); success = false; } else { // sessionlist.remove(sess->session()); } delete sess; } // Remove EVERYTHING under Events folder.. QString eventspath = getEventsPath(); QDir evdir(eventspath); evdir.removeRecursively(); QString summariespath = getSummariesPath(); QDir sumdir(summariespath); sumdir.removeRecursively(); // Clean up any straggling files (like from short sessions not being loaded...) dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Name); QFileInfoList list = dir.entryInfoList(); int could_not_kill = 0; int size = list.size(); for (int i = 0; i < size; ++i) { QFileInfo fi = list.at(i); QString fullpath = fi.canonicalFilePath(); QString ext_s = fullpath.section('.', -1); bool ok; ext_s.toInt(&ok, 10); if (ok) { qDebug() << "Deleting " << QDir::toNativeSeparators(fullpath); if (!dir.remove(fullpath)) { qDebug() << "Could not purge file" << fullpath; success=false; could_not_kill++; } } else { qDebug() << "Didn't bother deleting cruft file" << fullpath; // cruft file.. } } if (could_not_kill > 0) { qWarning() << "Could not purge path" << could_not_kill << "files in " << path; return false; } return true; } void Machine::setLoaderName(QString value) { info.loadername = value; m_loader = GetLoader(value); } void Machine::setInfo(MachineInfo inf) { info = inf; m_loader = GetLoader(inf.loadername); } //const quint32 channel_version=1; const QString Machine::getDataPath() { if (m_dataPath.isEmpty()) { m_dataPath = p_profile->Get("{" + STR_GEN_DataFolder + "}/" + info.loadername + "_" + (info.serial.isEmpty() ? hexid() : info.serial)) + "/"; } return m_dataPath; } const QString Machine::getSummariesPath() { return getDataPath() + "Summaries/"; } const QString Machine::getEventsPath() { return getDataPath() + "Events/"; } const QString Machine::getBackupPath() { return p_profile->Get("{" + STR_GEN_DataFolder + "}/" + info.loadername + "_" + (info.serial.isEmpty() ? hexid() : info.serial) + "/Backup/"); } bool Machine::Load() { QString path = getDataPath(); QDir dir(path); qDebug() << "Loading Database" << QDir::toNativeSeparators(path); if (!dir.exists() || !dir.isReadable()) { return false; } ProgressDialog * popup = new ProgressDialog(nullptr); QPixmap image = getPixmap().scaled(64,64); popup->setPixmap(image); popup->setMessage(QObject::tr("Loading %1 data...").arg(info.brand)); popup->show(); QProgressBar * progress = popup->progress; if (!LoadSummary(progress)) { // No XML index file, so assume upgrading, or it simply just got screwed up or deleted... QTime time; time.start(); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); /////////////////////////////////////////////////////////////////////// // First move any old files to correct locations /////////////////////////////////////////////////////////////////////// QString summarypath = getSummariesPath(); QString eventpath = getEventsPath(); if (!dir.exists(summarypath)) dir.mkpath(summarypath); QStringList filters; filters << "*.000"; dir.setNameFilters(filters); QStringList filelist = dir.entryList(); int size = filelist.size(); if (progress) { progress->setMinimum(0); progress->setMaximum(0); progress->setValue(0); QApplication::processEvents(); } for (int i=0; i < size; i++) { QString filename = filelist.at(i); QFile::copy(path+filename, summarypath+filename); QFile::remove(path+filename); } // Copy old Event files to folder filters.clear(); filters << "*.001"; dir.setNameFilters(filters); filelist = dir.entryList(); size = filelist.size(); if (size > 0) { if (!dir.exists(eventpath)) dir.mkpath(eventpath); for (int i=0; i< filelist.size(); i++) { if ((i % 50) == 0) { // This is slow.. :-/ if (progress) { progress->setValue((float(i) / float(size) * 100.0)); } QApplication::processEvents(); } QString filename = filelist.at(i); QFile::copy(path+filename, eventpath+filename); QFile::remove(path+filename); } } /////////////////////////////////////////////////////////////////////// // Now read summary files from correct location and load them /////////////////////////////////////////////////////////////////////// dir.setPath(summarypath); filters.clear(); filters << "*.000"; dir.setNameFilters(filters); filelist = dir.entryList(); size = filelist.size(); if (progress) { progress->setMinimum(0); progress->setMaximum(size); progress->setValue(0); QApplication::processEvents(); } QString sesstr; SessionID sessid; bool ok; for (int i=0; i < size; i++) { if ((i % 50) == 0) { // This is slow.. :-/ if (progress) { progress->setValue(i); } QApplication::processEvents(); } QString filename = filelist.at(i); sesstr = filename.section(".", 0, -2); sessid = sesstr.toLong(&ok, 16); if (!ok) { continue; } Session *sess = new Session(this, sessid); // Forced to load it, because know nothing about this session.. if (sess->LoadSummary()) { AddSession(sess); } else { qWarning() << "Error loading summary file" << filename; delete sess; } } SaveSummary(); qDebug() << "Loaded" << info.model << "data in" << time.elapsed() << "ms"; if (progress) { progress->setValue(size); } } else { if (progress) { progress->setValue(100); } } loadSessionInfo(); QApplication::processEvents(); popup->hide(); delete popup; return true; } bool Machine::SaveSession(Session *sess) { QString path = getDataPath(); if (sess->IsChanged()) { sess->Store(path); } return true; } void Machine::queSaveList(Session * sess) { if (!m_save_threads_running) { // Threads aren't being used.. so run the actual immediately... int i = (float(m_donetasks) / float(m_totaltasks) * 100.0); qprogress->setValue(i); QApplication::processEvents(); sess->UpdateSummaries(); sess->Store(getDataPath()); if (!p_profile->session->cacheSessions()) { sess->TrashEvents(); } } else { listMutex.lock(); m_savelist.append(sess); listMutex.unlock(); } } Session *Machine::popSaveList() { Session *sess = nullptr; listMutex.lock(); if (!m_savelist.isEmpty()) { sess = m_savelist.at(0); m_savelist.pop_front(); m_donetasks++; } listMutex.unlock(); return sess; } // Call any time queing starts void Machine::StartSaveThreads() { m_savelist.clear(); if (!p_profile->session->multithreading()) return; QString path = getDataPath(); int threads = QThread::idealThreadCount(); savelistSem = new QSemaphore(threads); savelistSem->acquire(threads); m_save_threads_running = true; m_donetasks=0; m_totaltasks=0; for (int i = 0; i < threads; i++) { SaveThread * thr = new SaveThread(this, path); QObject::connect(thr, SIGNAL(UpdateProgress(int)), qprogress, SLOT(setValue(int))); thread.push_back(thr); thread[i]->start(); } } // Call when all queing is completed void Machine::FinishSaveThreads() { if (!m_save_threads_running) return; m_save_threads_running = false; // Wait for all tasks to finish while (!savelistSem->tryAcquire(thread.size(), 250)) { if (qprogress) { QApplication::processEvents(); } } for (int i = 0; i < thread.size(); ++i) { while (thread[i]->isRunning()) { SaveThread::msleep(250); QApplication::processEvents(); } QObject::disconnect(thread[i], SIGNAL(UpdateProgress(int)), qprogress, SLOT(setValue(int))); delete thread[i]; } delete savelistSem; } void SaveThread::run() { bool running = true; while (running) { Session *sess = machine->popSaveList(); if (sess) { if (machine->m_donetasks % 10 == 0) { int i = (float(machine->m_donetasks) / float(machine->m_totaltasks) * 100.0); emit UpdateProgress(i); } sess->UpdateSummaries(); machine->saveMutex.lock(); sess->Store(path); machine->saveMutex.unlock(); sess->TrashEvents(); } else { if (!machine->m_save_threads_running) { break; // done } else { yieldCurrentThread(); // go do something else for a while } } } machine->savelistSem->release(1); } class SaveTask:public ImportTask { public: SaveTask(Session * s, Machine * m): sess(s), mach(m) {} virtual ~SaveTask() {} virtual void run(); protected: Session * sess; Machine * mach; }; void SaveTask::run() { sess->UpdateSummaries(); mach->saveMutex.lock(); sess->Store(mach->getDataPath()); mach->saveMutex.unlock(); sess->TrashEvents(); } void Machine::queTask(ImportTask * task) { if (0) { //p_profile->session->multithreading()) { m_tasklist.push_back(task); return; } task->run(); return; } void Machine::runTasks() { if (0) { //!p_profile->session->multithreading()) { Q_ASSERT(m_tasklist.isEmpty()); return; } QThreadPool * threadpool = QThreadPool::globalInstance(); int m_totaltasks=m_tasklist.size(); int m_currenttask=0; while (!m_tasklist.isEmpty()) { if (threadpool->tryStart(m_tasklist.at(0))) { m_tasklist.pop_front(); float f = float(m_currenttask) / float(m_totaltasks) * 100.0; qprogress->setValue(f); m_currenttask++; } QApplication::processEvents(); } QThreadPool::globalInstance()->waitForDone(-1); } bool Machine::hasModifiedSessions() { QHash::iterator s; for (s = sessionlist.begin(); s != sessionlist.end(); s++) { if (s.value()->IsChanged()) { return true; } } return false; } const QString summaryFileName = "Summaries.xml"; const int summaryxml_version=1; bool Machine::LoadSummary(QProgressBar * progress) { QTime time; time.start(); qDebug() << "Loading Summaries"; QString filename = getDataPath() + summaryFileName + ".gz"; QDomDocument doc; QFile file(filename); qDebug() << "Opening " << filename; if (!file.open(QIODevice::ReadOnly)) { qWarning() << "Could not open" << filename; return false; } QByteArray data = file.readAll(); QByteArray uncompressed = gUncompress(data); QString errorMsg; int errorLine; if (!doc.setContent(uncompressed, false, &errorMsg, &errorLine)) { qWarning() << "Invalid XML Content in" << filename; qWarning() << "Error line" << errorLine << ":" << errorMsg; return false; } file.close(); QDomElement root = doc.documentElement(); if (root.tagName().compare("sessions", Qt::CaseInsensitive) != 0) { qDebug() << "Summaries cache messed up, recreating..."; return false; } bool ok; int version = root.attribute("version", "").toInt(&ok); if (!ok || (version != summaryxml_version)) { qDebug() << "Summaries cache outdated, recreating..."; return false; } QDomNode node; bool s_ok; QDomNodeList sessionlist = root.childNodes(); int size = sessionlist.size(); QMap sess_order; for (int s=0; s < size; ++s) { node = sessionlist.at(s); QDomElement e = node.toElement(); SessionID sessid = e.attribute("id", "0").toLong(&s_ok); qint64 first = e.attribute("first", "0").toLongLong(); qint64 last = e.attribute("last", "0").toLongLong(); bool enabled = e.attribute("enabled", "1").toInt() == 1; bool events = e.attribute("events", "1").toInt() == 1; if (s_ok) { Session * sess = new Session(this, sessid); sess->really_set_first(first); sess->really_set_last(last); sess->setEnabled(enabled); sess->setSummaryOnly(!events); if (e.hasChildNodes()) { QList available_channels; QList available_settings; QDomElement chans = e.firstChildElement("channels"); if (chans.isElement()) { QDomNode node = chans.firstChild(); QString txt = node.nodeValue(); QStringList channels = txt.split(","); for (int i=0; im_availableChannels = available_channels; QDomElement sete = e.firstChildElement("settings"); if (sete.isElement()) { QString sets = sete.firstChild().nodeValue(); QStringList settings = sets.split(","); for (int i=0; im_availableSettings = available_settings; } sess_order[first] = sess; } } QMap::iterator it_end = sess_order.end(); QMap::iterator it; int cnt = 0; bool loadSummaries = p_profile->session->preloadSummaries(); progress->setMaximum(sess_order.size()); for (it = sess_order.begin(); it != it_end; ++it, ++cnt) { if ((cnt % 100) == 0) { progress->setValue(cnt); QApplication::processEvents(); } Session * sess = it.value(); if (!AddSession(sess)) { delete sess; } else { if (loadSummaries) sess->LoadSummary(); } } progress->setValue(sess_order.size()); QApplication::processEvents(); qDebug() << "Loaded" << info.series << info.model << "data in" << time.elapsed() << "ms"; return true; } bool Machine::SaveSummary() { qDebug() << "Saving" << info.brand << info.model << "Summaries"; QString filename = getDataPath() + summaryFileName; QDomDocument doc("SleepyHeadSessionIndex"); QDomElement root = doc.createElement("sessions"); root.setAttribute("version", summaryxml_version); root.setAttribute("profile", p_profile->user->userName()); root.setAttribute("count", sessionlist.size()); root.setAttribute("loader", info.loadername); root.setAttribute("serial", info.serial); doc.appendChild(root); if (!QDir().exists(getSummariesPath())) QDir().mkpath(getSummariesPath()); QHash::iterator s; QHash::iterator sess_end = sessionlist.end(); for (s = sessionlist.begin(); s != sess_end; ++s) { QDomElement el = doc.createElement("session"); Session * sess = s.value(); el.setAttribute("id", (quint32)sess->session()); el.setAttribute("first", sess->realFirst()); el.setAttribute("last", sess->realLast()); el.setAttribute("enabled", sess->enabled() ? "1" : "0"); el.setAttribute("events", sess->summaryOnly() ? "0" : "1"); QHash >::iterator ev; QHash >::iterator ev_end = sess->eventlist.end(); QStringList chanlist; for (ev = sess->eventlist.begin(); ev != ev_end; ++ev) { chanlist.append(QString::number(ev.key(), 16)); } if (chanlist.size() == 0) { for (int i=0; im_availableChannels.size(); i++) { ChannelID code = sess->m_availableChannels.at(i); chanlist.append(QString::number(code, 16)); } } QDomElement chans = doc.createElement("channels"); chans.appendChild(doc.createTextNode(chanlist.join(","))); el.appendChild(chans); chanlist.clear(); QHash::iterator si; QHash::iterator set_end = sess->settings.end(); for (si = sess->settings.begin(); si != set_end; ++si) { chanlist.append(QString::number(si.key(), 16)); } QDomElement settings = doc.createElement("settings"); settings.appendChild(doc.createTextNode(chanlist.join(","))); el.appendChild(settings); root.appendChild(el); if (sess->IsChanged()) sess->StoreSummary(); } QString xmltext; QTextStream ts(&xmltext); doc.save(ts, 1); QByteArray data = gCompress(xmltext.toUtf8()); QFile file(filename + ".gz"); file.open(QFile::WriteOnly); file.write(data); return true; } bool Machine::Save() { //int size; int cnt = 0; QString path = getDataPath(); QDir dir(path); if (!dir.exists()) { dir.mkdir(path); } QHash::iterator s; m_savelist.clear(); // store any event summaries.. for (s = sessionlist.begin(); s != sessionlist.end(); s++) { cnt++; if ((*s)->IsChanged()) { queTask(new SaveTask(*s, this)); } } runTasks(); return true; } void Machine::updateChannels(Session * sess) { int size = sess->m_availableChannels.size(); for (int i=0; i < size; ++i) { ChannelID code = sess->m_availableChannels.at(i); m_availableChannels[code] = true; } size = sess->m_availableSettings.size(); for (int i=0; i < size; ++i) { ChannelID code = sess->m_availableSettings.at(i); m_availableSettings[code] = true; } } QList Machine::availableChannels(quint32 chantype) { QList list; QHash::iterator end = m_availableChannels.end(); QHash::iterator it; for (it = m_availableChannels.begin(); it != end; ++it) { ChannelID code = it.key(); const schema::Channel & chan = schema::channel[code]; if (chan.type() & chantype) { list.push_back(code); } } return list; } ////////////////////////////////////////////////////////////////////////////////////////// // CPAP implmementation ////////////////////////////////////////////////////////////////////////////////////////// CPAP::CPAP(MachineID id): Machine(id) { m_type = MT_CPAP; } CPAP::~CPAP() { } ////////////////////////////////////////////////////////////////////////////////////////// // Oximeter Class implmementation ////////////////////////////////////////////////////////////////////////////////////////// Oximeter::Oximeter(MachineID id): Machine(id) { m_type = MT_OXIMETER; } Oximeter::~Oximeter() { } ////////////////////////////////////////////////////////////////////////////////////////// // SleepStage Class implmementation ////////////////////////////////////////////////////////////////////////////////////////// SleepStage::SleepStage(MachineID id): Machine(id) { m_type = MT_SLEEPSTAGE; } SleepStage::~SleepStage() { } ////////////////////////////////////////////////////////////////////////////////////////// // PositionSensor Class implmementation ////////////////////////////////////////////////////////////////////////////////////////// PositionSensor::PositionSensor(MachineID id): Machine(id) { m_type = MT_POSITION; } PositionSensor::~PositionSensor() { } sleepyhead-0.9.8/sleepyhead/SleepLib/journal.cpp0000644000175000017500000002345412412506713021226 0ustar sergiosergio/* SleepLib Journal Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include "journal.h" #include "machine_common.h" #include #include #include #include #include #include const int journal_data_version = 1; JournalEntry::JournalEntry(QDate date) { Machine * jmach = p_profile->GetMachine(MT_JOURNAL); if (!jmach) { MachineInfo info(MT_JOURNAL,0, "Journal", QObject::tr("Journal Data"), QString(), QString(), QString(), QObject::tr("SleepyHead"), QDateTime::currentDateTime(), journal_data_version); // Using machine ID 1 rather than a random number, so in future, if profile.xml gets screwed up they'll get their data back.. // TODO: Perhaps search for unlinked journal folders here to save some anger and frustration? :P MachineID machid = 1; QString path = p_profile->Get("{" + STR_GEN_DataFolder + "}"); QDir dir(path); QStringList filters; filters << "Journal_*"; QStringList dirs = dir.entryList(filters,QDir::Dirs); int journals = dirs.size(); if (journals > 0) { QString tmp = dirs[0].section("_", -1); bool ok; machid = tmp.toUInt(&ok, 16); if (!ok) { QMessageBox::warning(nullptr, STR_MessageBox_Warning, QObject::tr("SleepyHead found an old Journal folder, but it looks like it's been renamed:")+"\n\n"+ QString("%1").arg(dirs[0])+ QObject::tr("SleepyHead will not touch this folder, and will create a new one instead.")+"\n\n"+ QObject::tr("Please be careful when playing in SleepyHead's profile folders :-P"), QMessageBox::Ok); // User renamed the folder.. report this machid = 1; } if (journals > 1) { QMessageBox::warning(nullptr, STR_MessageBox_Warning, QObject::tr("For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.")+"\n\n"+ QObject::tr("SleepyHead picked only the first one of these, and will use it in future:")+"\n\n"+ QString("%1").arg(dirs[0])+ QObject::tr("If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually."), QMessageBox::Ok); // more then one.. report this. } } jmach = MachineLoader::CreateMachine(info, machid); } m_date = date; session = nullptr; day = p_profile->GetDay(date, MT_JOURNAL); if (!day) { session = day->firstSession(MT_JOURNAL); } else { // Doesn't exist.. create a new one.. session = new Session(jmach,0); qint64 st,et; QDateTime dt(date,QTime(22,0)); // 10pm localtime st=qint64(dt.toTime_t())*1000L; et=st+3600000L; session->set_first(st); session->set_last(et); // Let it live in memory...but not on disk unless data is changed... jmach->AddSession(session); } } JournalEntry::~JournalEntry() { if (session && session->IsChanged()) { Save(); } } bool JournalEntry::Save() { if (session && session->IsChanged()) { qDebug() << "Saving journal session for" << m_date; // just need to write bookmarks, the rest are already stored in the session QVariantList start; QVariantList end; QStringList notes; int size = bookmarks.size(); for (int i=0; isettings[Bookmark_Start] = start; session->settings[Bookmark_End] = end; session->settings[Bookmark_Notes] = notes; session->settings[LastUpdated] = QDateTime::currentDateTime().toTime_t(); session->StoreSummary(); return true; } return false; } QString JournalEntry::notes() { QHash::iterator it; if (session && ((it=session->settings.find(Journal_Notes)) != session->settings.end())) { return it.value().toString(); } return QString(); } void JournalEntry::setNotes(QString notes) { if (!session) return; session->settings[Journal_Notes] = notes; session->SetChanged(true); } EventDataType JournalEntry::weight() { QHash::iterator it; if (session && ((it = session->settings.find(Journal_Weight)) != session->settings.end())) { return it.value().toFloat(); } return 0; } void JournalEntry::setWeight(EventDataType weight) { if (!session) return; session->settings[Journal_Weight] = weight; session->SetChanged(true); } int JournalEntry::zombie() { QHash::iterator it; if (session && ((it = session->settings.find(Journal_ZombieMeter)) != session->settings.end())) { return it.value().toFloat(); } return 0; } void JournalEntry::setZombie(int zombie) { if (!session) return; session->settings[Journal_ZombieMeter] = zombie; session->SetChanged(true); } QList & JournalEntry::getBookmarks() { bookmarks.clear(); if (!session || !session->settings.contains(Bookmark_Start)) { return bookmarks; } QVariantList start=session->settings[Bookmark_Start].toList(); QVariantList end=session->settings[Bookmark_End].toList(); QStringList notes=session->settings[Bookmark_Notes].toStringList(); int size = start.size(); for (int i=0; i < size; ++i) { bookmarks.append(Bookmark(start.at(i).toLongLong(), end.at(i).toLongLong(), notes.at(i))); } return bookmarks; } void JournalEntry::addBookmark(qint64 start, qint64 end, QString note) { bookmarks.append(Bookmark(start,end,note)); session->SetChanged(true); } void JournalEntry::delBookmark(qint64 start, qint64 end) { bool removed; do { removed = false; int size = bookmarks.size(); for (int i=0; iSetChanged(true); // make sure it gets saved later.. removed=true; break; } } } while (removed); // clean up any stupid duplicates just in case.. :P // if I wanted to be nice above, I could add the note string to the search as well.. // (some users might be suprised to see the lot go with the same start and end index) } void BackupJournal(QString filename) { QDomDocument doc("SleepyHead Journal"); QDomElement droot = doc.createElement(STR_AppName); doc.appendChild(droot); QDomElement root = doc.createElement("Journal"); root.setAttribute("username", p_profile->user->userName()); droot.appendChild(root); QDate first = p_profile->FirstDay(MT_JOURNAL); QDate last = p_profile->LastDay(MT_JOURNAL); QDate date = first.addDays(-1); do { date = date.addDays(1); Day * journal = p_profile->GetDay(date, MT_JOURNAL); if (!journal) continue; Session * sess = journal->firstSession(MT_JOURNAL); if (!sess) continue; QDomElement day = doc.createElement("day"); day.setAttribute("date", date.toString()); //notes.setAttribute("date", date.toString()); if (journal->settingExists(Journal_Notes)) { QString notedata = sess->settings[Journal_Notes].toString(); QDomElement notes = doc.createElement("note"); notes.appendChild(doc.createCDATASection(notedata)); day.appendChild(notes); } if (journal->settingExists(Journal_Weight)) { EventDataType weight = sess->settings[Journal_Weight].toFloat(); day.setAttribute("weight", weight); } if (journal->settingExists(Journal_ZombieMeter)) { int zombie = sess->settings[Journal_ZombieMeter].toInt(); day.setAttribute("zombie", zombie); } if (journal->settingExists(LastUpdated)) { QDateTime dt = sess->settings[LastUpdated].toDateTime(); day.setAttribute("lastupdated", dt.toTime_t()); } if (journal->settingExists(Bookmark_Start)) { QVariantList start=sess->settings[Bookmark_Start].toList(); QVariantList end=sess->settings[Bookmark_End].toList(); QStringList notes=sess->settings[Bookmark_Notes].toStringList(); QDomElement bookmarks = doc.createElement("bookmarks"); int size = start.size(); for (int i=0; i< size; i++) { QDomElement bookmark = doc.createElement("bookmark"); bookmark.setAttribute("start",start.at(i).toString()); bookmark.setAttribute("end",end.at(i).toString()); bookmark.setAttribute("notes",notes.at(i)); bookmarks.appendChild(bookmark); } day.appendChild(bookmarks); } root.appendChild(day); } while (date <= last); QFile file(filename); if (!file.open(QIODevice::WriteOnly)) { return; } QTextStream ts(&file); ts << doc.toString(); file.close(); } DayController::DayController() { journal = nullptr; cpap = nullptr; oximeter = nullptr; } DayController::~DayController() { delete journal; } void DayController::setDate(QDate date) { if (journal) { delete journal; } journal = new JournalEntry(date); } sleepyhead-0.9.8/sleepyhead/SleepLib/machine.h0000644000175000017500000002035212412506713020617 0ustar sergiosergio/* SleepLib Machine Class Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef MACHINE_H #define MACHINE_H #include #include #include #include #include #include #include #include #include #include #include #include #include "SleepLib/preferences.h" #include "SleepLib/machine_common.h" #include "SleepLib/event.h" #include "SleepLib/session.h" #include "SleepLib/schema.h" #include "SleepLib/day.h" class Day; class Session; class Profile; class Machine; /*! \class SaveThread \brief This class is used in the multithreaded save code.. It accelerates the indexing of summary data. */ class SaveThread: public QThread { Q_OBJECT public: SaveThread(Machine *m, QString p) { machine = m; path = p; } //! \brief Static millisecond sleep function.. Can be used from anywhere static void msleep(unsigned long msecs) { QThread::msleep(msecs); } //! \brief Start Save processing thread running virtual void run(); protected: Machine *machine; QString path; signals: //! \brief Signal sent to update the Progress Bar void UpdateProgress(int i); }; class ImportTask:public QRunnable { public: explicit ImportTask() {} virtual ~ImportTask() {} virtual void run() {} }; class MachineLoader; /*! \class Machine \brief This Machine class is the Heart of SleepyLib, representing a single Machine and holding it's data */ class Machine { friend class SaveThread; friend class MachineLaoder; public: /*! \fn Machine(MachineID id=0); \brief Constructs a Machine object with MachineID id If supplied MachineID is zero, it will generate a new unused random one. */ Machine(MachineID id = 0); virtual ~Machine(); //! \brief Load all Machine summary data bool Load(); bool LoadSummary(QProgressBar * progress); //! \brief Save all Sessions where changed bit is set. bool Save(); bool SaveSummary(); //! \brief Save individual session bool SaveSession(Session *sess); //! \brief Deletes the crud out of all machine data in the SleepLib database bool Purge(int secret); //! \brief Unlink a session from any Machine related indexes bool unlinkSession(Session * sess); bool unlinkDay(Day * day); inline bool hasChannel(ChannelID code) { return m_availableChannels.contains(code); } inline bool hasSetting(ChannelID code) { return m_availableSettings.contains(code); } //! \brief Contains a secondary index of day data, containing just this machines sessions QMap day; //! \brief Contains all sessions for this machine, indexed by SessionID QHash sessionlist; //! \brief List of text machine properties, like brand, model, etc... QHash properties; //! \brief Returns a pointer to a valid Session object if SessionID exists Session *SessionExists(SessionID session); //! \brief Adds the session to this machine object, and the Master Profile list. (used during load) bool AddSession(Session *s); //! \brief Find the date this session belongs in, according to profile settings QDate pickDate(qint64 start); const QString getDataPath(); const QString getEventsPath(); const QString getSummariesPath(); const QString getBackupPath(); //! \brief Returns the machineID as a lower case hexadecimal string QString hexid() { return QString().sprintf("%08lx", m_id); } //! \brief Unused, increments the most recent sessionID SessionID CreateSessionID() { return highest_sessionid + 1; } //! \brief Returns this objects MachineID const MachineID &id() { return m_id; } void setId(MachineID id) { m_id = id; } //! \brief Returns the date of the first loaded Session const QDate &FirstDay() { return firstday; } //! \brief Returns the date of the most recent loaded Session const QDate &LastDay() { return lastday; } //! \brief Add a new task to the multithreaded save code void queSaveList(Session * sess); bool hasModifiedSessions(); //! \brief Grab the next task in the multithreaded save code Session *popSaveList(); //! \brief Start the save threads which handle indexing, file storage and waveform processing void StartSaveThreads(); //! \brief Finish the save threads and safely close them void FinishSaveThreads(); //! \brief The list of sessions that need saving (for multithreaded save code) QList m_savelist; //yuck QVectorthread; volatile int savelistCnt; int savelistSize; QMutex listMutex; QSemaphore *savelistSem; bool m_unsupported; bool unsupported() { return m_unsupported; } void setUnsupported(bool b) { m_unsupported = b; } void lockSaveMutex() { listMutex.lock(); } void unlockSaveMutex() { listMutex.unlock(); } void skipSaveTask() { lockSaveMutex(); m_donetasks++; unlockSaveMutex(); } void clearSkipped() { skipped_sessions = 0; } int skippedSessions() { return skipped_sessions; } inline int totalTasks() { return m_totaltasks; } inline void setTotalTasks(int value) { m_totaltasks = value; } inline int doneTasks() { return m_donetasks; } inline MachineType type() const { return info.type; } inline QString brand() const { return info.brand; } inline QString loaderName() const { return info.loadername; } inline QString model() const { return info.model; } inline QString modelnumber() const { return info.modelnumber; } inline QString serial() const { return info.serial; } inline QString series() const { return info.series; } inline quint32 cap() const { return info.cap; } inline int version() const { return info.version; } inline QDateTime lastImported() const { return info.lastimported; } inline void setModel(QString value) { info.model = value; } inline void setBrand(QString value) { info.brand = value; } inline void setSerial(QString value) { info.serial = value; } inline void setType(MachineType type) { info.type = type; } inline void setCap(quint32 value) { info.cap = value; } bool saveSessionInfo(); bool loadSessionInfo(); void setLoaderName(QString value); QList availableChannels(quint32 chantype); MachineLoader * loader() { return m_loader; } // much more simpler multithreading... void queTask(ImportTask * task); void runTasks(); QMutex saveMutex; void setInfo(MachineInfo inf); const MachineInfo getInfo() { return info; } void updateChannels(Session * sess); QString getPixmapPath(); QPixmap & getPixmap(); MachineInfo info; protected: QDate firstday, lastday; SessionID highest_sessionid; MachineID m_id; MachineType m_type; QString m_path; MachineLoader * m_loader; bool changed; bool firstsession; int m_totaltasks; int m_donetasks; int skipped_sessions; volatile bool m_save_threads_running; QList m_tasklist; QHash m_availableChannels; QHash m_availableSettings; QString m_summaryPath; QString m_eventsPath; QString m_dataPath; }; /*! \class CPAP \brief A CPAP classed machine object.. */ class CPAP: public Machine { public: CPAP(MachineID id = 0); virtual ~CPAP(); }; /*! \class Oximeter \brief An Oximeter classed machine object.. */ class Oximeter: public Machine { public: Oximeter(MachineID id = 0); virtual ~Oximeter(); protected: }; /*! \class SleepStage \brief A SleepStage classed machine object.. */ class SleepStage: public Machine { public: SleepStage(MachineID id = 0); virtual ~SleepStage(); protected: }; /*! \class PositionSensor \brief A PositionSensor classed machine object.. */ class PositionSensor: public Machine { public: PositionSensor(MachineID id = 0); virtual ~PositionSensor(); protected: }; #endif // MACHINE_H sleepyhead-0.9.8/sleepyhead/SleepLib/preferences.h0000644000175000017500000001147012412506713021515 0ustar sergiosergio/* SleepLib Preferences Header * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef PREFERENCES_H #define PREFERENCES_H #include #include #include #include #include #include const QString STR_ext_XML = ".xml"; extern QString GetAppRoot(); //returns app root path plus trailing path separator. inline QString PrefMacro(QString s) { return "{" + s + "}"; } //! \brief Returns a QString containing the Username, according to the Operating System const QString &getUserName(); /*! \class Preferences \author Mark Watkins \brief Holds a group of preference variables */ class Preferences { public: //! \brief Constructs a Preferences object 'name', and remembers sets the filename Preferences(QString name, QString filename = ""); Preferences(); virtual ~Preferences(); //! \brief Returns a QString containing preference 'name', processing any {} macros const QString Get(QString name); //! \brief Returns the QVariant value of the selected preference.. Note, preference must exist, and will not expand {} macros QVariant &operator[](QString name) { return p_preferences[name]; } //! \brief Sets the Preference 'name' to QVariant 'value' void Set(QString name, QVariant value) { p_preferences[name] = value; } //! \brief Returns true if preference 'name' exists bool contains(QString name) { return (p_preferences.contains(name)); } //! \brief Create a preference and set the default if it doesn't exists void init(QString name, QVariant value) { if (!contains(name)) { p_preferences[name] = value; } } //! \brief Returns true if preference 'name' exists, and contains a boolean true value bool ExistsAndTrue(QString name) { QHash::iterator i = p_preferences.find(name); if (i == p_preferences.end()) { return false; } return i.value().toBool(); } //! \brief Removes preference 'name' from this Preferences group void Erase(QString name) { QHash::iterator i = p_preferences.find(name); if (i != p_preferences.end()) { p_preferences.erase(i); } } //! \brief Derive from this to handle Loading of any custom XML sections virtual void ExtraLoad(QDomElement &root) { root = root; } //! \brief Derive from this to handle Saving of any custom XML sections //! \return Must return a QDomElement to be inserted into the generated XML virtual QDomElement ExtraSave(QDomDocument &doc) { doc = doc; QDomElement e; return e; } //! \brief Opens, processes the XML for this Preferences group, loading all preferences stored therein. //! \note If filename is empty, it will use the one specified in the constructor //! \returns true if succesful virtual bool Open(QString filename = ""); //! \brief Saves all preferences to XML file. //! \note If filename is empty, it will use the one specified in the constructor //! \returns true if succesful virtual bool Save(QString filename = ""); //! \note Sets a comment string whici will be stored in the XML void SetComment(const QString &str) { p_comment = str; } //! \brief Finds a given preference. //! \returns a QHash::iterator pointing to the preference named 'key', or an empty end() iterator inline QHash::iterator find(QString key) { return p_preferences.find(key); } //! \brief Returns an empty iterator pointing to the end of the preferences list inline QHash::iterator end() { return p_preferences.end(); } //! \brief Returns an iterator pointing to the first item in the preferences list inline QHash::iterator begin() { return p_preferences.begin(); } //int GetCode(QString name); // For registering/looking up new preference code. //! \brief Stores all the variants indexed by a QString name for this Preferences object QHash p_preferences; void setPath(const QString &path) { p_path = path; } void setFilename(const QString &filename) { p_filename = filename; } const QString name() { return p_name; } protected: //QHash p_codes; QString p_comment; QString p_name; QString p_filename; QString p_path; }; //! \brief Main Preferences Object used throughout the application extern Preferences PREF; //! \brief Layout Preferences Object used throughout the application extern Preferences LAYOUT; #endif // PREFERENCES_H sleepyhead-0.9.8/sleepyhead/SleepLib/event.h0000644000175000017500000001547312412506713020344 0ustar sergiosergio/* SleepLib Event Class Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef EVENT_H #define EVENT_H #include #include "machine_common.h" //! \brief EventLists can either be Waveform or Event types enum EventListType { EVL_Waveform, EVL_Event }; /*! \class EventList \author Mark Watkins \brief EventLists contains waveforms at a specified rate, or a list of event and time data. */ class EventList { friend class Session; public: EventList(EventListType et, EventDataType gain = 1.0, EventDataType offset = 0.0, EventDataType min = 0.0, EventDataType max = 0.0, double rate = 0.0, bool second_field = false); //! \brief Wipe the event list so it can be reused void clear(); /*! \brief Add an event starting at time, containing data to this event list Note, data2 is only used if second_field is specified in the constructor */ void AddEvent(qint64 time, EventStoreType data); void AddEvent(qint64 time, EventStoreType data, EventStoreType data2); void AddWaveform(qint64 start, qint16 *data, int recs, qint64 duration); void AddWaveform(qint64 start, unsigned char *data, int recs, qint64 duration); void AddWaveform(qint64 start, char *data, int recs, qint64 duration); //! \brief Returns a count of records contained in this EventList inline quint32 count() const { return m_count; } //! \brief Manually sets a count of records contained in this EventList void setCount(quint32 count) { m_count = count; } //! \brief Returns a raw ("ungained") data value from index position i inline EventStoreType raw(int i) const { return m_data[i]; } //! \brief Returns a raw ("ungained") data2 value from index position i inline EventStoreType raw2(int i) const { return m_data2[i]; } //! \brief Returns a data value multiplied by gain from index position i EventDataType data(quint32 i); //! \brief Returns a data2 value multiplied by gain from index position i EventDataType data2(quint32 i); //! \brief Returns either the timestamp for the i'th event, or calculates the waveform time position i qint64 time(quint32 i) const; //! \brief Returns true if this EventList uses the second data field bool hasSecondField() { return m_second_field; } //! \brief Returns the first events/waveforms starting time in milliseconds since epoch inline qint64 first() const { return m_first; } //! \brief Returns the last events/waveforms ending time in milliseconds since epoch inline qint64 last() const { return m_last; } //! \brief Returns the timespan covered by this EventList, in milliseconds since epoch inline qint64 duration() { return m_last - m_first; } //! \brief Sets the first events/waveforms starting time in milliseconds since epoch void setFirst(qint64 val) { m_first = val; } //! \brief Sets the last events/waveforms ending time in milliseconds since epoch void setLast(qint64 val) { m_last = val; } //! \brief Set this EventList to either EVL_Waveform or EVL_Event type void setType(EventListType type) { m_type = type; } //! \brief Change the gain multiplier value void setGain(EventDataType v) { m_gain = v; } //! \brief Change the gain offset value void setOffset(EventDataType v) { m_offset = v; } //! \brief Set the Minimum value for data void setMin(EventDataType v) { m_min = v; } //! \brief Set the Maximum value for data void setMax(EventDataType v) { m_max = v; } //! \brief Set the Minimum value for data2 void setMin2(EventDataType v) { m_min2 = v; } //! \brief Set the Maximum value for data2 void setMax2(EventDataType v) { m_max2 = v; } //! \brief Set the sample rate void setRate(EventDataType v) { m_rate = v; } //void setCode(ChannelID id) { m_code=id; } //! \brief Return the Minimum data value inline EventDataType Min() { return m_min; } //! \brief Return the Maximum data value inline EventDataType Max() { return m_max; } //! \brief Return the Minimum data2 value inline EventDataType min2() { return m_min2; } //! \brief Return the Maximum data value inline EventDataType max2() { return m_max2; } //! \brief Return the gain value inline EventDataType gain() const { return m_gain; } //! \brief Return the gain offset inline EventDataType offset() { return m_offset; } //! \brief Return the sample rate inline EventDataType rate() { return m_rate; } //! \brief Return the EventList type, either EVL_Waveform or EVL_Event inline EventListType type() { return m_type; } //inline const ChannelID & code() { return m_code; } //! \brief Returns whether or not min/max values are updated while adding events inline const bool &update_minmax() { return m_update_minmax; } //! \brief Returns the dimension (units type) of the contained data object QString dimension() { return m_dimension; } //! \brief Sets the dimension (units type) of the contained data object void setDimension(QString dimension) { m_dimension = dimension; } //! \brief Returns the data storage vector QVector &getData() { return m_data; } //! \brief Returns the data2 storage vector QVector &getData2() { return m_data2; } //! \brief Returns the time storage vector (only used in EVL_Event types) QVector &getTime() { return m_time; } // Don't mess with these without considering the consequences void rawDataResize(quint32 i) { m_data.resize(i); m_count = i; } void rawData2Resize(quint32 i) { m_data2.resize(i); m_count = i; } void rawTimeResize(quint32 i) { m_time.resize(i); m_count = i; } EventStoreType *rawData() { return m_data.data(); } EventStoreType *rawData2() { return m_data2.data(); } quint32 *rawTime() { return m_time.data(); } protected: //! \brief The time storage vector, in 32bits delta format, added as offsets to m_first QVector m_time; //! \brief The "ungained" raw data storage vector QVector m_data; //! \brief The "ungained" raw data2 storage vector QVector m_data2; //ChannelID m_code; //! \brief Either EVL_Waveform or EVL_Event EventListType m_type; //! \brief Count of events quint32 m_count; EventDataType m_gain; EventDataType m_offset; EventDataType m_min, m_min2; EventDataType m_max, m_max2; EventDataType m_rate; // Waveform sample rate QString m_dimension; qint64 m_first, m_last; bool m_update_minmax; bool m_second_field; }; #endif // EVENT_H sleepyhead-0.9.8/sleepyhead/SleepLib/profiles.h0000644000175000017500000012057512412506713021046 0ustar sergiosergio/* SleepLib Profiles Header * * Copyright (c) 2011 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef PROFILES_H #define PROFILES_H #include #include #include #include "version.h" #include "machine.h" #include "machine_loader.h" #include "preferences.h" #include "common.h" class Machine; enum Gender { GenderNotSpecified, Male, Female }; enum MaskType { Mask_Unknown, Mask_NasalPillows, Mask_Hybrid, Mask_StandardNasal, Mask_FullFace }; enum OverviewLinechartModes { OLC_Bartop, OLC_Lines }; class DoctorInfo; class UserInfo; class UserSettings; class OxiSettings; class CPAPSettings; class AppearanceSettings; class SessionSettings; /*! \class Profile \author Mark Watkins \date 28/04/11 \brief The User profile system, containing all information for a user, and an index into all Machine data */ class Profile : public Preferences { public: //! \brief Constructor.. Does not open profile Profile(QString path); virtual ~Profile(); //! \brief Open profile, parse profile.xml file, and initialize helper classes virtual bool Open(QString filename = ""); //! \brief Parse machines.xml bool OpenMachines(); bool StoreMachines(); //! \brief Returns hostname that locked profile, or empty string if unlocked QString checkLock(); //! \brief Removes a lockfile bool removeLock(); //! \brief Save Profile object (This is an extension to Preference::Save(..)) virtual bool Save(QString filename = ""); //! \brief Add machine to this profiles machlist void AddMachine(Machine *m); //! \brief Remove machine from this profiles machlist void DelMachine(Machine *m); //! \brief Loads all machine (summary) data belonging to this profile void LoadMachineData(); //! \brief Barf because data format has changed. This does a purge of CPAP data for machine *m void DataFormatError(Machine *m); QString path() { return p_path; } /*! \brief Import Machine Data \param path containing import location */ int Import(QString path); //! \brief Removes a given day from the date, destroying the daylist date record if empty bool unlinkDay(Day * day); // bool trashMachine(Machine * mach); //! \brief Add Day record to Profile Day list Day *addDay(QDate date); //! \brief Get Day record if data available for date and machine type, else return nullptr Day *GetDay(QDate date, MachineType type = MT_UNKNOWN); //! \brief Same as GetDay but does not open the summaries Day *FindDay(QDate date, MachineType type = MT_UNKNOWN); //! \brief Get Day record if data available for date and machine type, // and has enabled session data, else return nullptr Day *GetGoodDay(QDate date, MachineType type); //! \breif Same as GetGoodDay but does not open the summaries Day *FindGoodDay(QDate date, MachineType type); //! \brief Returns a list of all machines of type t QList GetMachines(MachineType t = MT_UNKNOWN); //! \brief Returns the machine of type t used on date, nullptr if none.. Machine *GetMachine(MachineType t, QDate date); //! \brief return the first machine of type t Machine *GetMachine(MachineType t); //! \brief Returns true if this profile stores this variable identified by key bool contains(QString key) { return p_preferences.contains(key); } //! \brief Get all days records of machine type between start and end dates QList getDays(MachineType mt, QDate start, QDate end); //! \brief Returns a count of all days (with data) of machine type, between start and end dates int countDays(MachineType mt = MT_UNKNOWN, QDate start = QDate(), QDate end = QDate()); //! \brief Returns a count of all compliant days of machine type between start and end dates int countCompliantDays(MachineType mt, QDate start, QDate end); //! \brief Returns a count of all event entries for code, matching machine type between start an end dates EventDataType calcCount(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Returns a sum of all event data for Channel code, matching machine type between start an end dates double calcSum(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Returns a sum of all session durations for machine type, between start and end dates EventDataType calcHours(MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates Channel Average (Sums and counts all events, returning the sum divided by the count.) EventDataType calcAvg(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates Channel Weighted Average between start and end dates EventDataType calcWavg(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates the minimum value for channel code, between start and end dates EventDataType calcMin(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates the maximum value for channel code, between start and end dates EventDataType calcMax(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates a percentile value percent for channel code, between start and end dates EventDataType calcPercentile(ChannelID code, EventDataType percent, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Tests if Channel code is available in all day sets bool hasChannel(ChannelID code); //! \brief Looks up if any machines report channel is available bool channelAvailable(ChannelID code); //! \brief Calculates the minimum session settings value for channel code, between start and end dates EventDataType calcSettingsMin(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates the maximum session settings value for channel code, between start and end dates EventDataType calcSettingsMax(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates the time channel code spends above threshold value for machine type, between start and end dates EventDataType calcAboveThreshold(ChannelID code, EventDataType threshold, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); //! \brief Calculates the time channel code spends below threshold value for machine type, between start and end dates EventDataType calcBelowThreshold(ChannelID code, EventDataType threshold, MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate()); // XML load components virtual void ExtraLoad(QDomElement &root); //! \brief Looks for the first date containing a day record matching machinetype QDate FirstDay(MachineType mt = MT_UNKNOWN); //! \brief Looks for the last date containing a day record matching machinetype QDate LastDay(MachineType mt = MT_UNKNOWN); //! \brief Looks for the first date containing a day record with enabled sessions matching machinetype QDate FirstGoodDay(MachineType mt = MT_UNKNOWN); //! \brief Looks for the last date containing a day record with enabled sessions matching machinetype QDate LastGoodDay(MachineType mt = MT_UNKNOWN); //! \brief Returns this profiles data folder QString dataFolder() { return (*this).Get("{DataFolder}"); } //! \brief Return if this profile has been opened or not bool isOpen() { return m_opened; } //! \brief QMap of day records (iterates in order). QMap daylist; //! \brief List of machines, indexed by MachineID. QHash machlist; bool is_first_day; UserInfo *user; CPAPSettings *cpap; OxiSettings *oxi; DoctorInfo *doctor; AppearanceSettings *appearance; UserSettings *general; SessionSettings *session; protected: QDate m_first; QDate m_last; bool m_opened; bool m_machopened; }; class MachineLoader; extern MachineLoader *GetLoader(QString name); extern Preferences *p_pref; extern Preferences *p_layout; extern Profile *p_profile; // these are bad and must change #define PREF (*p_pref) #define LAYOUT (*p_layout) // DoctorInfo Strings const QString STR_DI_Name = "DoctorName"; const QString STR_DI_Phone = "DoctorPhone"; const QString STR_DI_Email = "DoctorEmail"; const QString STR_DI_Practice = "DoctorPractice"; const QString STR_DI_Address = "DoctorAddress"; const QString STR_DI_PatientID = "DoctorPatientID"; // UserInfo Strings const QString STR_UI_DOB = "DOB"; const QString STR_UI_FirstName = "FirstName"; const QString STR_UI_LastName = "LastName"; const QString STR_UI_UserName = "UserName"; const QString STR_UI_Password = "Password"; const QString STR_UI_Address = "Address"; const QString STR_UI_Phone = "Phone"; const QString STR_UI_EmailAddress = "EmailAddress"; const QString STR_UI_Country = "Country"; const QString STR_UI_Height = "Height"; const QString STR_UI_Gender = "Gender"; const QString STR_UI_TimeZone = "TimeZone"; const QString STR_UI_DST = "DST"; // OxiSettings Strings const QString STR_OS_EnableOximetry = "EnableOximetry"; const QString STR_OS_DefaultDevice = "DefaultOxiDevice"; const QString STR_OS_SyncOximeterClock = "SyncOximeterClock"; const QString STR_OS_OximeterType = "OximeterType"; const QString STR_OS_OxiDiscardThreshold = "OxiDiscardThreshold"; const QString STR_OS_SPO2DropDuration = "SPO2DropDuration"; const QString STR_OS_SPO2DropPercentage = "SPO2DropPercentage"; const QString STR_OS_PulseChangeDuration = "PulseChangeDuration"; const QString STR_OS_PulseChangeBPM = "PulseChangeBPM"; const QString STR_OS_SkipOxiIntroScreen = "SkipOxiIntroScreen"; // CPAPSettings Strings const QString STR_CS_ComplianceHours = "ComplianceHours"; const QString STR_CS_ShowCompliance = "ShowCompliance"; const QString STR_CS_ShowLeaksMode = "ShowLeaksMode"; const QString STR_CS_MaskStartDate = "MaskStartDate"; const QString STR_CS_MaskDescription = "MaskDescription"; const QString STR_CS_MaskType = "MaskType"; const QString STR_CS_PrescribedMode = "CPAPPrescribedMode"; const QString STR_CS_PrescribedMinPressure = "CPAPPrescribedMinPressure"; const QString STR_CS_PrescribedMaxPressure = "CPAPPrescribedMaxPressure"; const QString STR_CS_UntreatedAHI = "UntreatedAHI"; const QString STR_CS_Notes = "CPAPNotes"; const QString STR_CS_DateDiagnosed = "DateDiagnosed"; const QString STR_CS_UserEventFlagging = "UserEventFlagging"; const QString STR_CS_UserEventPieChart = "UserEventPieChart"; const QString STR_CS_AutoImport = "AutoImport"; const QString STR_CS_BrickWarning = "BrickWarning"; const QString STR_CS_UserFlowRestriction = "UserFlowRestriction"; const QString STR_CS_UserEventDuration = "UserEventDuration"; const QString STR_CS_UserFlowRestriction2 = "UserFlowRestriction2"; const QString STR_CS_UserEventDuration2 = "UserEventDuration2"; const QString STR_CS_UserEventDuplicates = "UserEventDuplicates"; const QString STR_CS_ResyncFromUserFlagging = "ResyncFromUserFlagging"; const QString STR_CS_AHIWindow = "AHIWindow"; const QString STR_CS_AHIReset = "AHIReset"; const QString STR_CS_ClockDrift = "ClockDrift"; const QString STR_CS_LeakRedline = "LeakRedline"; const QString STR_CS_ShowLeakRedline = "ShowLeakRedline"; // ImportSettings Strings const QString STR_IS_DaySplitTime = "DaySplitTime"; const QString STR_IS_PreloadSummaries = "PreloadSummaries"; const QString STR_IS_CacheSessions = "MemoryHog"; const QString STR_IS_CombineCloseSessions = "CombineCloserSessions"; const QString STR_IS_IgnoreShorterSessions = "IgnoreShorterSessions"; const QString STR_IS_Multithreading = "EnableMultithreading"; const QString STR_IS_BackupCardData = "BackupCardData"; const QString STR_IS_CompressBackupData = "CompressBackupData"; const QString STR_IS_CompressSessionData = "CompressSessionData"; const QString STR_IS_IgnoreOlderSessions = "IgnoreOlderSessions"; const QString STR_IS_IgnoreOlderSessionsDate = "IgnoreOlderSessionsDate"; const QString STR_IS_LockSummarySessions = "LockSummarySessions"; // AppearanceSettings Strings const QString STR_AS_GraphHeight = "GraphHeight"; const QString STR_AS_AntiAliasing = "UseAntiAliasing"; const QString STR_AS_GraphSnapshots = "EnableGraphSnapshots"; const QString STR_AS_Animations = "AnimationsAndTransitions"; const QString STR_AS_SquareWave = "SquareWavePlots"; const QString STR_AS_OverlayType = "OverlayType"; const QString STR_AS_OverviewLinechartMode = "OverviewLinechartMode"; const QString STR_AS_UsePixmapCaching = "UsePixmapCaching"; const QString STR_AS_AllowYAxisScaling = "AllowYAxisScaling"; const QString STR_AS_GraphTooltips = "GraphTooltips"; const QString STR_AS_LineThickness = "LineThickness"; const QString STR_AS_LineCursorMode = "LineCursorMode"; const QString STR_AS_CalendarVisible = "CalendarVisible"; const QString STR_AS_RightSidebarVisible = "RightSidebarVisible"; // UserSettings Strings const QString STR_US_UnitSystem = "UnitSystem"; const QString STR_US_EventWindowSize = "EventWindowSize"; const QString STR_US_SkipEmptyDays = "SkipEmptyDays"; const QString STR_US_RebuildCache = "RebuildCache"; const QString STR_US_ShowDebug = "ShowDebug"; const QString STR_US_ShowPerformance = "ShowPerformance"; const QString STR_US_LinkGroups = "LinkGroups"; const QString STR_US_CalculateRDI = "CalculateRDI"; const QString STR_US_ShowSerialNumbers = "ShowSerialNumbers"; const QString STR_US_PrefCalcMiddle = "PrefCalcMiddle"; const QString STR_US_PrefCalcPercentile = "PrefCalcPercentile"; const QString STR_US_PrefCalcMax = "PrefCalcMax"; const QString STR_US_TooltipTimeout = "TooltipTimeout"; const QString STR_US_ScrollDampening = "ScrollDampening"; const QString STR_US_ShowUnknownFlags = "ShowUnknownFlags"; const QString STR_US_StatReportMode = "StatReportMode"; const QString STR_US_LastOverviewRange = "LastOverviewRange"; // Parent class for subclasses that manipulate the profile. class ProfileSettings { public: ProfileSettings(Profile *profile) : m_profile(profile) { } inline void setPref(QString name, QVariant value) { (*m_profile)[name] = value; } inline void initPref(QString name, QVariant value) { m_profile->init(name, value); } inline QVariant getPref(QString name) const { return (*m_profile)[name]; } void setProfile(Profile *profile) { m_profile = profile; } public: Profile *m_profile; }; class DoctorInfo : public ProfileSettings { public: DoctorInfo(Profile *profile) : ProfileSettings(profile) { initPref(STR_DI_Name, QString()); initPref(STR_DI_Phone, QString()); initPref(STR_DI_Email, QString()); initPref(STR_DI_Practice, QString()); initPref(STR_DI_Address, QString()); initPref(STR_DI_PatientID, QString()); } const QString name() const { return getPref(STR_DI_Name).toString(); } const QString phone() const { return getPref(STR_DI_Phone).toString(); } const QString email() const { return getPref(STR_DI_Email).toString(); } const QString practiceName() const { return getPref(STR_DI_Practice).toString(); } const QString address() const { return getPref(STR_DI_Address).toString(); } const QString patientID() const { return getPref(STR_DI_PatientID).toString(); } void setName(QString name) { setPref(STR_DI_Name, name); } void setPhone(QString phone) { setPref(STR_DI_Phone, phone); } void setEmail(QString phone) { setPref(STR_DI_Email, phone); } void setPracticeName(QString practice) { setPref(STR_DI_Practice, practice); } void setAddress(QString address) { setPref(STR_DI_Address, address); } void setPatientID(QString pid) { setPref(STR_DI_PatientID, pid); } }; /*! \class UserInfo \brief Profile Options relating to the User Information */ class UserInfo : public ProfileSettings { public: UserInfo(Profile *profile) : ProfileSettings(profile) { initPref(STR_UI_DOB, QDate(1970, 1, 1)); initPref(STR_UI_FirstName, QString()); initPref(STR_UI_LastName, QString()); initPref(STR_UI_UserName, QString()); initPref(STR_UI_Password, QString()); initPref(STR_UI_Address, QString()); initPref(STR_UI_Phone, QString()); initPref(STR_UI_EmailAddress, QString()); initPref(STR_UI_Country, QString()); initPref(STR_UI_Height, 0.0); initPref(STR_UI_Gender, (int)GenderNotSpecified); initPref(STR_UI_TimeZone, QString()); initPref(STR_UI_DST, false); } QDate DOB() const { return getPref(STR_UI_DOB).toDate(); } const QString firstName() const { return getPref(STR_UI_FirstName).toString(); } const QString lastName() const { return getPref(STR_UI_LastName).toString(); } const QString userName() const { return getPref(STR_UI_UserName).toString(); } const QString address() const { return getPref(STR_UI_Address).toString(); } const QString phone() const { return getPref(STR_UI_Phone).toString(); } const QString email() const { return getPref(STR_UI_EmailAddress).toString(); } double height() const { return getPref(STR_UI_Height).toDouble(); } const QString country() const { return getPref(STR_UI_Country).toString(); } Gender gender() const { return (Gender)getPref(STR_UI_Gender).toInt(); } const QString timeZone() const { return getPref(STR_UI_TimeZone).toString(); } bool daylightSaving() const { return getPref(STR_UI_DST).toBool(); } void setDOB(QDate date) { setPref(STR_UI_DOB, date); } void setFirstName(QString name) { setPref(STR_UI_FirstName, name); } void setLastName(QString name) { setPref(STR_UI_LastName, name); } void setUserName(QString username) { setPref(STR_UI_UserName, username); } void setAddress(QString address) { setPref(STR_UI_Address, address); } void setPhone(QString phone) { setPref(STR_UI_Phone, phone); } void setEmail(QString email) { setPref(STR_UI_EmailAddress, email); } void setHeight(double height) { setPref(STR_UI_Height, height); } void setCountry(QString country) { setPref(STR_UI_Country, country); } void setGender(Gender g) { setPref(STR_UI_Gender, (int)g); } void setTimeZone(QString tz) { setPref(STR_UI_TimeZone, tz); } void setDaylightSaving(bool ds) { setPref(STR_UI_DST, ds); } bool hasPassword() { return !getPref(STR_UI_Password).toString().isEmpty(); } bool checkPassword(QString password) { QByteArray ba = password.toUtf8(); QString hashedPass = QString(QCryptographicHash::hash(ba, QCryptographicHash::Sha1).toHex()); return getPref(STR_UI_Password).toString() == hashedPass; } void setPassword(QString password) { QByteArray ba = password.toUtf8(); QString hashedPass = QString(QCryptographicHash::hash(ba, QCryptographicHash::Sha1).toHex()); setPref(STR_UI_Password, hashedPass); } }; /*! \class OxiSettings \brief Profile Options relating to the Oximetry settings */ class OxiSettings : public ProfileSettings { public: //! \brief Create OxiSettings object given Profile *p, and initialize the defaults OxiSettings(Profile *profile) : ProfileSettings(profile) { initPref(STR_OS_EnableOximetry, false); initPref(STR_OS_DefaultDevice, QString()); initPref(STR_OS_SyncOximeterClock, true); initPref(STR_OS_OximeterType, 0); initPref(STR_OS_OxiDiscardThreshold, 0.0); initPref(STR_OS_SPO2DropDuration, 8.0); initPref(STR_OS_SPO2DropPercentage, 3.0); initPref(STR_OS_PulseChangeDuration, 8.0); initPref(STR_OS_PulseChangeBPM, 5.0); initPref(STR_OS_SkipOxiIntroScreen, false); } bool oximetryEnabled() const { return getPref(STR_OS_EnableOximetry).toBool(); } QString defaultDevice() const { return getPref(STR_OS_DefaultDevice).toString(); } bool syncOximeterClock() const { return getPref(STR_OS_SyncOximeterClock).toBool(); } int oximeterType() const { return getPref(STR_OS_OximeterType).toInt(); } double oxiDiscardThreshold() const { return getPref(STR_OS_OxiDiscardThreshold).toDouble(); } double spO2DropDuration() const { return getPref(STR_OS_SPO2DropDuration).toDouble(); } double spO2DropPercentage() const { return getPref(STR_OS_SPO2DropPercentage).toDouble(); } double pulseChangeDuration() const { return getPref(STR_OS_PulseChangeDuration).toDouble(); } double pulseChangeBPM() const { return getPref(STR_OS_PulseChangeBPM).toDouble(); } bool skipOxiIntroScreen() const { return getPref(STR_OS_SkipOxiIntroScreen).toBool(); } void setOximetryEnabled(bool enabled) { setPref(STR_OS_EnableOximetry, enabled); } void setDefaultDevice(QString name) { setPref(STR_OS_DefaultDevice, name); } void setSyncOximeterClock(bool synced) { setPref(STR_OS_SyncOximeterClock, synced); } void setOximeterType(int oxitype) { setPref(STR_OS_OximeterType, oxitype); } void setOxiDiscardThreshold(double thresh) { setPref(STR_OS_OxiDiscardThreshold, thresh); } void setSpO2DropDuration(double duration) { setPref(STR_OS_SPO2DropDuration, duration); } void setPulseChangeBPM(double bpm) { setPref(STR_OS_PulseChangeBPM, bpm); } void setSkipOxiIntroScreen(bool skip) { setPref(STR_OS_SkipOxiIntroScreen, skip); } void setSpO2DropPercentage(double percentage) { setPref(STR_OS_SPO2DropPercentage, percentage); } void setPulseChangeDuration(double duration) { setPref(STR_OS_PulseChangeDuration, duration); } }; /*! \class CPAPSettings \brief Profile Options relating to the CPAP settings */ class CPAPSettings : public ProfileSettings { public: CPAPSettings(Profile *profile) : ProfileSettings(profile) { initPref(STR_CS_ComplianceHours, 4); initPref(STR_CS_ShowCompliance, true); initPref(STR_CS_ShowLeaksMode, 0); // TODO: jedimark: Check if this date is initiliazed yet initPref(STR_CS_MaskStartDate, QDate()); initPref(STR_CS_MaskDescription, QString()); initPref(STR_CS_MaskType, Mask_Unknown); initPref(STR_CS_PrescribedMode, MODE_UNKNOWN); initPref(STR_CS_PrescribedMinPressure, 0.0); initPref(STR_CS_PrescribedMaxPressure, 0.0); initPref(STR_CS_UntreatedAHI, 0.0); initPref(STR_CS_Notes, QString()); initPref(STR_CS_DateDiagnosed, QDate()); initPref(STR_CS_UserFlowRestriction, 20.0); initPref(STR_CS_UserEventDuration, 8.0); initPref(STR_CS_UserFlowRestriction2, 50.0); initPref(STR_CS_UserEventDuration2, 8.0); initPref(STR_CS_UserEventDuplicates, false); initPref(STR_CS_UserEventFlagging, false); initPref(STR_CS_AHIWindow, 60.0); initPref(STR_CS_AHIReset, false); initPref(STR_CS_LeakRedline, 24.0); initPref(STR_CS_ShowLeakRedline, true); initPref(STR_CS_UserEventPieChart, false); initPref(STR_CS_ResyncFromUserFlagging, false); initPref(STR_CS_AutoImport, false); initPref(STR_CS_BrickWarning, true); initPref(STR_CS_ClockDrift, (int)0); m_clock_drift = getPref(STR_CS_ClockDrift).toInt(); } //Getters double complianceHours() const { return getPref(STR_CS_ComplianceHours).toDouble(); } bool showComplianceInfo() const { return getPref(STR_CS_ShowCompliance).toBool(); } int leakMode() const { return getPref(STR_CS_ShowLeaksMode).toInt(); } QDate maskStartDate() const { return getPref(STR_CS_MaskStartDate).toDate(); } QString maskDescription() const { return getPref(STR_CS_MaskDescription).toString(); } MaskType maskType() const { return (MaskType)getPref(STR_CS_MaskType).toInt(); } CPAPMode mode() const { return CPAPMode(getPref(STR_CS_PrescribedMode).toInt()); } double minPressure() const { return getPref(STR_CS_PrescribedMinPressure).toDouble(); } double maxPressure() const { return getPref(STR_CS_PrescribedMaxPressure).toDouble(); } double untreatedAHI() const { return getPref(STR_CS_UntreatedAHI).toDouble(); } const QString notes() const { return getPref(STR_CS_Notes).toString(); } QDate dateDiagnosed() const { return getPref(STR_CS_DateDiagnosed).toDate(); } double userFlowRestriction() const { return getPref(STR_CS_UserFlowRestriction).toDouble(); } double userEventDuration() const { return getPref(STR_CS_UserEventDuration).toDouble(); } double userFlowRestriction2() const { return getPref(STR_CS_UserFlowRestriction2).toDouble(); } double userEventDuration2() const { return getPref(STR_CS_UserEventDuration2).toDouble(); } bool userEventDuplicates() const { return getPref(STR_CS_UserEventDuplicates).toBool(); } double AHIWindow() const { return getPref(STR_CS_AHIWindow).toDouble(); } bool AHIReset() const { return getPref(STR_CS_AHIReset).toBool(); } bool userEventFlagging() const { return getPref(STR_CS_UserEventFlagging).toBool(); } int clockDrift() const { return m_clock_drift; } EventDataType leakRedline() const { return getPref(STR_CS_LeakRedline).toFloat(); } bool showLeakRedline() const { return getPref(STR_CS_ShowLeakRedline).toBool(); } bool userEventPieChart() const { return getPref(STR_CS_UserEventPieChart).toBool(); } bool resyncFromUserFlagging() const { return getPref(STR_CS_ResyncFromUserFlagging).toBool(); } bool autoImport() const { return getPref(STR_CS_AutoImport).toBool(); } bool brickWarning() const { return getPref(STR_CS_BrickWarning).toBool(); } //Setters void setMode(CPAPMode mode) { setPref(STR_CS_PrescribedMode, (int)mode); } void setMinPressure(double pressure) { setPref(STR_CS_PrescribedMinPressure, pressure); } void setMaxPressure(double pressure) { setPref(STR_CS_PrescribedMaxPressure, pressure); } void setUntreatedAHI(double ahi) { setPref(STR_CS_UntreatedAHI, ahi); } void setNotes(QString notes) { setPref(STR_CS_Notes, notes); } void setDateDiagnosed(QDate date) { setPref(STR_CS_DateDiagnosed, date); } void setComplianceHours(double hours) { setPref(STR_CS_ComplianceHours, hours); } void setShowComplianceInfo(bool b) { setPref(STR_CS_ShowCompliance, b); } void setLeakMode(int leakmode) { setPref(STR_CS_ShowLeaksMode, (int)leakmode); } void setMaskStartDate(QDate date) { setPref(STR_CS_MaskStartDate, date); } void setMaskType(MaskType masktype) { setPref(STR_CS_MaskType, (int)masktype); } void setUserFlowRestriction(double flow) { setPref(STR_CS_UserFlowRestriction, flow); } void setUserEventDuration(double duration) { setPref(STR_CS_UserEventDuration, duration); } void setUserFlowRestriction2(double flow) { setPref(STR_CS_UserFlowRestriction2, flow); } void setUserEventDuration2(double duration) { setPref(STR_CS_UserEventDuration2, duration); } void setAHIWindow(double window) { setPref(STR_CS_AHIWindow, window); } void setAHIReset(bool reset) { setPref(STR_CS_AHIReset, reset); } void setUserEventFlagging(bool flagging) { setPref(STR_CS_UserEventFlagging, flagging); } void setUserEventDuplicates(bool dup) { setPref(STR_CS_UserEventDuplicates, dup); } void setMaskDescription(QString description) { setPref(STR_CS_MaskDescription, description); } void setClockDrift(int seconds) { setPref(STR_CS_ClockDrift, m_clock_drift = (int)seconds); } void setLeakRedline(EventDataType value) { setPref(STR_CS_LeakRedline, value); } void setShowLeakRedline(bool reset) { setPref(STR_CS_ShowLeakRedline, reset); } void setUserEventPieChart(bool b) { setPref(STR_CS_UserEventPieChart, b); } void setResyncFromUserFlagging(bool b) { setPref(STR_CS_ResyncFromUserFlagging, b); } void setAutoImport(bool b) { setPref(STR_CS_AutoImport, b); } void setBrickWarning(bool b) { setPref(STR_CS_BrickWarning, b); } public: int m_clock_drift; }; /*! \class ImportSettings \brief Profile Options relating to the Import process */ class SessionSettings : public ProfileSettings { public: SessionSettings(Profile *profile) : ProfileSettings(profile) { initPref(STR_IS_DaySplitTime, QTime(12, 0, 0)); initPref(STR_IS_CacheSessions, false); initPref(STR_IS_PreloadSummaries, false); initPref(STR_IS_CombineCloseSessions, 240); initPref(STR_IS_IgnoreShorterSessions, 5); initPref(STR_IS_Multithreading, QThread::idealThreadCount() > 1); initPref(STR_IS_BackupCardData, true); initPref(STR_IS_CompressBackupData, false); initPref(STR_IS_CompressSessionData, false); initPref(STR_IS_IgnoreOlderSessions, false); initPref(STR_IS_IgnoreOlderSessionsDate, QDateTime(QDate::currentDate().addYears(-1), daySplitTime()) ); initPref(STR_IS_LockSummarySessions, true); } QTime daySplitTime() const { return getPref(STR_IS_DaySplitTime).toTime(); } bool cacheSessions() const { return getPref(STR_IS_CacheSessions).toBool(); } bool preloadSummaries() const { return getPref(STR_IS_PreloadSummaries).toBool(); } double combineCloseSessions() const { return getPref(STR_IS_CombineCloseSessions).toDouble(); } double ignoreShortSessions() const { return getPref(STR_IS_IgnoreShorterSessions).toDouble(); } bool multithreading() const { return getPref(STR_IS_Multithreading).toBool(); } bool compressSessionData() const { return getPref(STR_IS_CompressSessionData).toBool(); } bool compressBackupData() const { return getPref(STR_IS_CompressBackupData).toBool(); } bool backupCardData() const { return getPref(STR_IS_BackupCardData).toBool(); } bool ignoreOlderSessions() const { return getPref(STR_IS_IgnoreOlderSessions).toBool(); } QDateTime ignoreOlderSessionsDate() const { return getPref(STR_IS_IgnoreOlderSessionsDate).toDateTime(); } bool lockSummarySessions() const { return getPref(STR_IS_LockSummarySessions).toBool(); } void setDaySplitTime(QTime time) { setPref(STR_IS_DaySplitTime, time); } void setCacheSessions(bool c) { setPref(STR_IS_CacheSessions, c); } void setPreloadSummaries(bool b) { setPref(STR_IS_PreloadSummaries, b); } void setCombineCloseSessions(double val) { setPref(STR_IS_CombineCloseSessions, val); } void setIgnoreShortSessions(double val) { setPref(STR_IS_IgnoreShorterSessions, val); } void setMultithreading(bool enabled) { setPref(STR_IS_Multithreading, enabled); } void setBackupCardData(bool enabled) { setPref(STR_IS_BackupCardData, enabled); } void setCompressBackupData(bool enabled) { setPref(STR_IS_CompressBackupData, enabled); } void setCompressSessionData(bool enabled) { setPref(STR_IS_CompressSessionData, enabled); } void setIgnoreOlderSessions(bool enabled) { setPref(STR_IS_IgnoreOlderSessions, enabled); } void setIgnoreOlderSessionsDate(QDate date) { setPref(STR_IS_IgnoreOlderSessionsDate, QDateTime(date, daySplitTime())); } void setLockSummarySessions(bool b) { setPref(STR_IS_LockSummarySessions, b); } }; /*! \class AppearanceSettings \brief Profile Options relating to Visual Appearance */ class AppearanceSettings : public ProfileSettings { public: //! \brief Create AppearanceSettings object given Profile *p, and initialize the defaults AppearanceSettings(Profile *profile) : ProfileSettings(profile) { initPref(STR_AS_GraphHeight, 180.0); initPref(STR_AS_AntiAliasing, true); initPref(STR_AS_GraphSnapshots, true); initPref(STR_AS_Animations, true); initPref(STR_AS_SquareWave, false); initPref(STR_AS_AllowYAxisScaling, true); initPref(STR_AS_GraphTooltips, true); initPref(STR_AS_UsePixmapCaching, false); initPref(STR_AS_OverlayType, ODT_Bars); initPref(STR_AS_OverviewLinechartMode, OLC_Bartop); initPref(STR_AS_LineThickness, 1.0); initPref(STR_AS_LineCursorMode, true); initPref(STR_AS_CalendarVisible, true); initPref(STR_AS_RightSidebarVisible, true); } //! \brief Returns the normal (unscaled) height of a graph int graphHeight() const { return getPref(STR_AS_GraphHeight).toInt(); } //! \brief Returns true if AntiAliasing (the graphical smoothing method) is enabled bool antiAliasing() const { return getPref(STR_AS_AntiAliasing).toBool(); } //! \brief Returns true if renderPixmap function is in use, which takes snapshots of graphs bool graphSnapshots() const { return getPref(STR_AS_GraphSnapshots).toBool(); } //! \brief Returns true if Graphical animations & Transitions will be drawn bool animations() const { return getPref(STR_AS_Animations).toBool(); } //! \brief Returns true if PixmapCaching acceleration will be used bool usePixmapCaching() const { return getPref(STR_AS_UsePixmapCaching).toBool(); } //! \brief Returns true if Square Wave plots are preferred (where possible) bool squareWavePlots() const { return getPref(STR_AS_SquareWave).toBool(); } //! \brief Whether to allow double clicking on Y-Axis labels to change vertical scaling mode bool allowYAxisScaling() const { return getPref(STR_AS_AllowYAxisScaling).toBool(); } //! \brief Whether to show graph tooltips bool graphTooltips() const { return getPref(STR_AS_GraphTooltips).toBool(); } //! \brief Pen width of line plots float lineThickness() const { return getPref(STR_AS_LineThickness).toFloat(); } //! \brief Whether to show line cursor bool lineCursorMode() const { return getPref(STR_AS_LineCursorMode).toBool(); } //! \brief Whether to show the calendar bool calendarVisible() const { return getPref(STR_AS_CalendarVisible).toBool(); } //! \brief Whether to show the right sidebar bool rightSidebarVisible() const { return getPref(STR_AS_RightSidebarVisible).toBool(); } //! \brief Returns the type of overlay flags (which are displayed over the Flow Waveform) OverlayDisplayType overlayType() const { return (OverlayDisplayType)getPref(STR_AS_OverlayType).toInt(); } //! \brief Returns the display type of Overview pages linechart OverviewLinechartModes overviewLinechartMode() const { return (OverviewLinechartModes)getPref(STR_AS_OverviewLinechartMode).toInt(); } //! \brief Set the normal (unscaled) height of a graph. void setGraphHeight(int height) { setPref(STR_AS_GraphHeight, height); } //! \brief Set to true to turn on AntiAliasing (the graphical smoothing method) void setAntiAliasing(bool aa) { setPref(STR_AS_AntiAliasing, aa); } //! \brief Set to true if renderPixmap functions are in use, which takes snapshots of graphs. void setGraphSnapshots(bool gs) { setPref(STR_AS_GraphSnapshots, gs); } //! \brief Set to true if Graphical animations & Transitions will be drawn void setAnimations(bool anim) { setPref(STR_AS_Animations, anim); } //! \brief Set to true to use Pixmap Caching of Text and other graphics caching speedup techniques void setUsePixmapCaching(bool b) { setPref(STR_AS_UsePixmapCaching, b); } //! \brief Set whether or not to useSquare Wave plots (where possible) void setSquareWavePlots(bool sw) { setPref(STR_AS_SquareWave, sw); } //! \brief Sets the type of overlay flags (which are displayed over the Flow Waveform) void setOverlayType(OverlayDisplayType od) { setPref(STR_AS_OverlayType, (int)od); } //! \brief Sets whether to allow double clicking on Y-Axis labels to change vertical scaling mode void setAllowYAxisScaling(bool b) { setPref(STR_AS_AllowYAxisScaling, b); } //! \brief Sets whether to allow double clicking on Y-Axis labels to change vertical scaling mode void setGraphTooltips(bool b) { setPref(STR_AS_GraphTooltips, b); } //! \brief Sets the type of overlay flags (which are displayed over the Flow Waveform) void setOverviewLinechartMode(OverviewLinechartModes od) { setPref(STR_AS_OverviewLinechartMode, (int)od); } //! \brief Set the pen width of line plots. void setLineThickness(float size) { setPref(STR_AS_LineThickness, size); } //! \brief Sets whether to display Line Cursor void setLineCursorMode(bool b) { setPref(STR_AS_LineCursorMode, b); } //! \brief Sets whether to display the (Daily View) Calendar void setCalendarVisible(bool b) { setPref(STR_AS_CalendarVisible, b); } //! \brief Sets whether to display the right sidebar void setRightSidebarVisible(bool b) { setPref(STR_AS_RightSidebarVisible, b); } }; /*! \class UserSettings \brief Profile Options relating to General User Settings */ class UserSettings : public ProfileSettings { public: UserSettings(Profile *profile) : ProfileSettings(profile) { initPref(STR_US_UnitSystem, US_Metric); initPref(STR_US_EventWindowSize, 4.0); initPref(STR_US_SkipEmptyDays, true); initPref(STR_US_RebuildCache, false); // FIXME: jedimark: can't remember... initPref(STR_US_ShowDebug, false); initPref(STR_US_ShowPerformance, false); initPref(STR_US_CalculateRDI, false); initPref(STR_US_ShowSerialNumbers, false); initPref(STR_US_PrefCalcMiddle, (int)0); initPref(STR_US_PrefCalcPercentile, (double)95.0); initPref(STR_US_PrefCalcMax, (int)0); initPref(STR_US_TooltipTimeout, (int)2500); initPref(STR_US_ScrollDampening, (int)50); initPref(STR_US_StatReportMode, 0); initPref(STR_US_ShowUnknownFlags, false); initPref(STR_US_LastOverviewRange, 4); } UnitSystem unitSystem() const { return (UnitSystem)getPref(STR_US_UnitSystem).toInt(); } double eventWindowSize() const { return getPref(STR_US_EventWindowSize).toDouble(); } bool skipEmptyDays() const { return getPref(STR_US_SkipEmptyDays).toBool(); } bool rebuildCache() const { return getPref(STR_US_RebuildCache).toBool(); } bool showDebug() const { return getPref(STR_US_ShowDebug).toBool(); } bool showPerformance() const { return getPref(STR_US_ShowPerformance).toBool(); } bool calculateRDI() const { return getPref(STR_US_CalculateRDI).toBool(); } bool showSerialNumbers() const { return getPref(STR_US_ShowSerialNumbers).toBool(); } int prefCalcMiddle() const { return getPref(STR_US_PrefCalcMiddle).toInt(); } double prefCalcPercentile() const { return getPref(STR_US_PrefCalcPercentile).toDouble(); } int prefCalcMax() const { return getPref(STR_US_PrefCalcMax).toInt(); } int tooltipTimeout() const { return getPref(STR_US_TooltipTimeout).toInt(); } int scrollDampening() const { return getPref(STR_US_ScrollDampening).toInt(); } int statReportMode() const { return getPref(STR_US_StatReportMode).toInt(); } bool showUnknownFlags() const { return getPref(STR_US_ShowUnknownFlags).toBool(); } int lastOverviewRange() const { return getPref(STR_US_LastOverviewRange).toInt(); } void setUnitSystem(UnitSystem us) { setPref(STR_US_UnitSystem, (int)us); } void setEventWindowSize(double size) { setPref(STR_US_EventWindowSize, size); } void setSkipEmptyDays(bool skip) { setPref(STR_US_SkipEmptyDays, skip); } void setRebuildCache(bool rebuild) { setPref(STR_US_RebuildCache, rebuild); } void setShowDebug(bool b) { setPref(STR_US_ShowDebug, b); } void setShowPerformance(bool b) { setPref(STR_US_ShowPerformance, b); } void setCalculateRDI(bool rdi) { setPref(STR_US_CalculateRDI, rdi); } void setShowSerialNumbers(bool enabled) { setPref(STR_US_ShowSerialNumbers, enabled); } void setPrefCalcMiddle(int i) { setPref(STR_US_PrefCalcMiddle, i); } void setPrefCalcPercentile(double p) { setPref(STR_US_PrefCalcPercentile, p); } void setPrefCalcMax(int i) { setPref(STR_US_PrefCalcMax, i); } void setTooltipTimeout(int i) { setPref(STR_US_TooltipTimeout, i); } void setScrollDampening(int i) { setPref(STR_US_ScrollDampening, i); } void setStatReportMode(int i) { setPref(STR_US_StatReportMode, i); } void setShowUnknownFlags(bool b) { setPref(STR_US_ShowUnknownFlags, b); } void setLastOverviewRange(int i) { setPref(STR_US_LastOverviewRange, i); } }; //! \brief Returns a count of all files & directories in a supplied folder int dirCount(QString path); namespace Profiles { extern QMap profiles; void Scan(); // Initialize and load Profile void Done(); // Save all Profile objects and clear list Profile *Create(QString name); Profile *Get(QString name); Profile *Get(); } #endif // PROFILES_H sleepyhead-0.9.8/sleepyhead/UpdaterWindow.h0000644000175000017500000000534312412506713020313 0ustar sergiosergio/* UpdaterWindow * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef UPDATEWINDOW_H #define UPDATEWINDOW_H #include #include #include #include #include #include #include "version.h" #include "updateparser.h" namespace Ui { class UpdaterWindow; } /*! \enum RequestMode \brief Used in replyFinished() to differentiate the current update task. */ enum RequestMode { RM_None, RM_CheckUpdates, RM_GetFile }; /*! \class UpdaterWindow \brief Auto-Update Module for SleepyHead This class handles the complete Auto-Update procedure for SleepyHead, it does the network checks, parses the update.xml from SourceForge host, checks for any new updates, and provides the UI and mechanisms to download and replace the binaries according to what is specified in update.xml. */ class UpdaterWindow : public QMainWindow { Q_OBJECT public: explicit UpdaterWindow(QWidget *parent = 0); ~UpdaterWindow(); //! Start the void checkForUpdates(); /*! \fn ParseUpdateXML(QIODevice * dev) \brief Parses the update.xml from either QFile or QNetworkReply source */ void ParseUpdateXML(QIODevice *dev); protected slots: //! \brief Network reply completed void replyFinished(QNetworkReply *reply); //! \brief Update the progress bars as data is received void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); //! \brief Save incomming data void dataReceived(); //! \brief Request a file to download void requestFile(); //! \brief Request the update.xml file void downloadUpdateXML(); private slots: //! \brief Just close the Updater window void on_CloseButton_clicked(); //! \brief Start processing the download que, and applying the updates void on_upgradeButton_clicked(); //! \brief Selects the next file in the download queue void upgradeNext(); //! \brief Click on finished, restart if app has been upgraded, otherwise just close the window. void on_FinishedButton_clicked(); private: //! \brief Holds the results of parsing the update.xml file UpdateParser updateparser; Ui::UpdaterWindow *ui; RequestMode requestmode; QTime dltime; Update *update; Release *release; QFile file; QNetworkAccessManager *netmanager; QNetworkReply *reply; QList updates; int current_row; bool success; QUrl update_url; // for update.xml redirects.. }; #endif // UPDATEWINDOW_H sleepyhead-0.9.8/sleepyhead/UpdaterWindow.cpp0000644000175000017500000005730212412506713020650 0ustar sergiosergio/* UpdaterWindow * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "SleepLib/profiles.h" #include #include #include "UpdaterWindow.h" #include "ui_UpdaterWindow.h" #include "version.h" #include "mainwindow.h" #include "common_gui.h" extern MainWindow *mainwin; UpdaterWindow::UpdaterWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::UpdaterWindow) { ui->setupUi(this); QDesktopWidget *desktop = QApplication::desktop(); int screenWidth = desktop->width(); // get width of screen int screenHeight = desktop->height(); // get height of screen QSize windowSize = size(); // size of our application window int width = windowSize.width(); int height = windowSize.height(); // little computations int x = (screenWidth - width) / 2; int y = (screenHeight - height) / 2; y -= 50; // move window to desired coordinates move(x, y); requestmode = RM_None; netmanager = new QNetworkAccessManager(this); connect(netmanager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); update = nullptr; ui->stackedWidget->setCurrentIndex(0); } UpdaterWindow::~UpdaterWindow() { disconnect(netmanager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); delete ui; } void UpdaterWindow::checkForUpdates() { QString filename = QApplication::applicationDirPath() + "/update.xml"; // Check updates.xml file if it's still recent.. if (QFile::exists(filename)) { QFileInfo fi(filename); QDateTime created = fi.created(); int age = created.secsTo(QDateTime::currentDateTime()); if (age < 7200) { QFile file(filename); file.open(QFile::ReadOnly); ParseUpdateXML(&file); file.close(); return; } } mainwin->Notify(tr("Checking for SleepyHead Updates")); // language code? update_url = QUrl("http://sourceforge.net/projects/sleepyhead/files/AutoUpdate/update.xml/download"); downloadUpdateXML(); } void UpdaterWindow::downloadUpdateXML() { requestmode = RM_CheckUpdates; QNetworkRequest req = QNetworkRequest(update_url); req.setRawHeader("User-Agent", "Wget/1.12 (linux-gnu)"); reply = netmanager->get(req); ui->plainTextEdit->appendPlainText(tr("Requesting ") + update_url.toString()); netmanager->connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64))); dltime.start(); } void UpdaterWindow::dataReceived() { QString rs = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString(); if (rs != "200") { return; } QByteArray read = reply->read(reply->bytesAvailable()); qDebug() << "Received" << read.size() << "bytes"; file.write(read); } void UpdaterWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) { QString rs = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString(); if (rs != "200") { return; } if (ui->tableWidget->rowCount() > 0) { double f = (double(bytesReceived) / double(bytesTotal)) * 100.0; QProgressBar *bar = qobject_cast(ui->tableWidget->cellWidget(current_row, 3)); if (bar) { bar->setValue(f); } ui->tableWidget->item(current_row, 2)->setText(QString::number(bytesTotal / 1048576.0, 'f', 3) + "MB"); } //ui->progressBar->setValue(f); // int elapsed=dltime.elapsed(); } void UpdaterWindow::requestFile() { if (!update) { return; } QProgressBar *bar = qobject_cast(ui->tableWidget->cellWidget(current_row, 3)); QString style = "QProgressBar{\ border: 1px solid gray;\ border-radius: 3px;\ text-align: center;\ text-decoration: bold;\ color: yellow;\ }\ QProgressBar::chunk {\ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 \"light green\", stop: 1 green);\ width: 10px;\ margin: 0px;\ }"; if (bar) { bar->setStyleSheet(style); } QString filename = update->filename; ui->plainTextEdit->appendPlainText(tr("Requesting ") + update->url); requestmode = RM_GetFile; QString path = QApplication::applicationDirPath() + "/Download"; QDir().mkpath(path); path += "/" + filename; ui->plainTextEdit->appendPlainText(tr("Saving as ") + path); file.setFileName(path); file.open(QFile::WriteOnly); dltime.start(); QNetworkRequest req = QNetworkRequest(QUrl(update->url)); req.setRawHeader("User-Agent", "Wget/1.12 (linux-gnu)"); reply = netmanager->get(req); connect(reply, SIGNAL(readyRead()), this, SLOT(dataReceived())); connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64))); } // Compare supplied version string with current version // < 0 = this one is newer or version supplied is dodgy, 0 = same, and > 0 there is a newer version int compareVersion(QString version) { QStringList parts = version.split("."); bool ok; if (parts.size() < 3) { // dodgy version string supplied. return -1; } short major = parts[0].toInt(&ok); if (!ok) return -1; short minor = parts[1].toInt(&ok); if (!ok) return -1; if (major > major_version) { return 1; } else if (major < major_version) { return -1; } if (minor > minor_version) { return 1; } else if (minor < minor_version) { return -1; } QStringList patchver = parts[2].split("-"); short revision = patchver[0].toInt(&ok); if (!ok) return -1; if (revision > revision_number) { return 1; } else if (revision < revision_number) { return -1; } short build = patchver[1].toInt(&ok); if (!ok) return -1; if (build > build_number) { return 1; } else if (build < build_number) { return -1; } // patchver[1] = tag.. // Versions match return 0; } void UpdaterWindow::ParseUpdateXML(QIODevice *dev) { QXmlInputSource src(dev); QXmlSimpleReader reader; reader.setContentHandler(&updateparser); UpdateStatus AcceptUpdates = PREF[STR_PREF_AllowEarlyUpdates].toBool() ? UPDATE_TESTING : UPDATE_BETA; if (reader.parse(src)) { ui->plainTextEdit->appendPlainText(tr("XML update structure parsed cleanly")); QStringList versions; for (QHash::iterator it = updateparser.releases.begin(); it != updateparser.releases.end(); ++it) { versions.push_back(it.key()); } // Um... not optimal. qSort(versions); QString platform = PlatformString.toLower(); release = nullptr; // Find the highest version number available for this platform for (int i = versions.size() - 1; i >= 0; i--) { QString verstr = versions[i]; release = &updateparser.releases[verstr]; if (release->updates.contains(platform) // Valid Release? && (release->status >= AcceptUpdates) && (release->version >= VersionString)) { break; } else { release = nullptr; } } if (!release) { mainwin->Notify(tr("No updates were found for your platform."), tr("SleepyHead Updates"), 5000); PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime(); close(); return; } qDebug() << "Version" << release->version << "has release section" << platform; QString latestapp = "", latestqt = ""; updates.clear(); Update *upd = nullptr; Update *upq = nullptr; for (int i = 0; i < release->updates[platform].size(); i++) { update = &release->updates[platform][i]; if (update->type == "qtlibs") { qDebug() << "QT Version" << update->version; if (update->version > latestqt) { if (update->status >= AcceptUpdates) { latestqt = update->version; upq = update; } } } else if (update->type == "application") { qDebug() << "Application Version" << update->version; if (update->version > latestapp) { if (update->status >= AcceptUpdates) { latestapp = update->version; upd = update; } } } } if (!upq && !upd) { mainwin->Notify(tr("No new updates were found for your platform."), tr("SleepyHead Updates"), 5000); PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime(); close(); return; } if (upq && (upq->version > QT_VERSION_STR)) { updates.push_back(upq); } if (upd && upd->version > FullVersionString) { updates.push_back(upd); } if (updates.size() > 0) { QString html = "

    " + tr("SleepyHead v%1, codename \"%2\"").arg(release->version). arg(release->codename) + "

    " + release->notes[""] + "

    "; html += platform.left(1).toUpper() + platform.mid(1); html += " " + tr("platform notes") + "

    " + release->notes[platform] + "

    "; ui->webView->setHtml(html); QString info; if (compareVersion(release->version)) { ui->Title->setText("" + tr("A new version of SleepyHead is available!") + ""); info = tr("Shiny new v%1 is available. You're running old and busted v%2"). arg(latestapp).arg(FullVersionString); ui->notesTabWidget->setCurrentIndex(0); } else { ui->Title->setText("" + tr("An update for SleepyHead is available.") + ""); info = tr("Version %1 is available. You're currently running v%1"). arg(latestapp).arg(FullVersionString); ui->notesTabWidget->setCurrentIndex(1); } ui->versionInfo->setText(info); QString notes; for (int i = 0; i < release->updates[platform].size(); i++) { update = &release->updates[platform][i]; if ((update->type == "application") && (update->version > FullVersionString)) { notes += "" + tr("SleepyHead v%1 build notes").arg(update->version) + "
    " + update->notes.trimmed() + "

    "; } else if ((update->type == "qtlibs") && (update->version > QT_VERSION_STR)) { notes += "" + tr("Update to QtLibs (v%1)").arg(update->version) + "
    " + update->notes.trimmed(); } } ui->buildNotes->setText(notes); setWindowModality(Qt::ApplicationModal); show(); } } else { mainwin->Notify(tr("There was an error parsing the XML Update file.")); } } void UpdaterWindow::replyFinished(QNetworkReply *reply) { netmanager->disconnect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64))); if (reply->error() == QNetworkReply::NoError) { if (requestmode == RM_CheckUpdates) { QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!redirectUrl.isEmpty() && (redirectUrl != reply->url())) { update_url = redirectUrl; reply->deleteLater(); QTimer::singleShot(100, this, SLOT(downloadUpdateXML())); return; } ui->plainTextEdit->appendPlainText(tr("%1 bytes received").arg(reply->size())); QString filename = QApplication::applicationDirPath() + "/update.xml"; qDebug() << filename; QFile file(filename); file.open(QFile::WriteOnly); file.write(reply->readAll()); file.close(); file.open(QFile::ReadOnly); //QTextStream ts(&file); ParseUpdateXML(&file); file.close(); reply->deleteLater(); } else if (requestmode == RM_GetFile) { disconnect(reply, SIGNAL(readyRead()), this, SLOT(dataReceived())); file.close(); //HttpStatusCodeAttribute QString rs = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString(); qDebug() << "HTTP Status Code" << rs; bool failed = false; if (rs == "404") { qDebug() << "File not found"; failed = true; } else { QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (!redirectUrl.isEmpty() && (redirectUrl != reply->url())) { file.open(QFile::WriteOnly); //reopen file.. update->url = redirectUrl.toString(); ui->plainTextEdit->appendPlainText(tr("Redirected to ") + update->url); QTimer::singleShot(100, this, SLOT(requestFile())); reply->deleteLater(); return; } ui->plainTextEdit->appendPlainText("Received " + QString::number(file.size()) + " bytes"); if (update->size > 0) { double s1 = update->size / 1048576.0; double s2 = ui->tableWidget->item(current_row, 2)->text().toDouble(); if (s1 != s2) { failed = true; ui->plainTextEdit->appendPlainText(tr("File size mismatch for %1").arg(update->filename)); } } else { QString path = QApplication::applicationDirPath() + "/Download/" + update->filename; QFile f(path); f.open(QFile::ReadOnly); QCryptographicHash hash(QCryptographicHash::Sha1); hash.addData(f.readAll()); QString res = hash.result().toHex(); if (res != update->hash) { ui->plainTextEdit->appendPlainText(tr("File integrity check failed for %1").arg(update->filename)); failed = true; } } } reply->deleteLater(); QProgressBar *bar = qobject_cast(ui->tableWidget->cellWidget(current_row, 3)); if (!failed) { //file.open(QFile::ReadOnly); QuaZip zip(&file); if (!zip.open(QuaZip::mdUnzip)) { failed = true; } else { QStringList files = zip.getFileNameList(); QFile f; int errors = 0; int fsize = files.size(); QByteArray ba; QStringList update_txt; QString apppath = QApplication::applicationDirPath() + "/"; QString backups = apppath + "Backups/"; QString downloads = apppath + "Downloads/"; QDir().mkpath(backups); for (int i = 0; i < fsize; i++) { ui->plainTextEdit->appendPlainText(tr("Extracting ") + files.at(i)); QuaZipFile qzf(file.fileName(), files.at(i)); qzf.open(QuaZipFile::ReadOnly); QString path = downloads + files.at(i); if (path.endsWith("/") || path.endsWith("\\")) { QDir().mkpath(path); if (update->unzipped_path.isEmpty()) { update->unzipped_path = path; } } else { ba = qzf.readAll(); if (qzf.getZipError()) { errors++; } else if (files.at(i) == "update.txt") { QTextStream ts(ba); QString line; do { line = ts.readLine(); if (!line.isNull()) { update_txt.append(line); } } while (!line.isNull()); } else { QString fn = files.at(i).section("/", -1); QFile::Permissions perm = QFile::permissions(apppath + fn); // delete backups if (f.exists(backups + fn)) { f.remove(backups + fn); } // rename (move) current file to backup if (!f.rename(apppath + fn, backups + fn)) { errors++; } //Save zip data as new file f.setFileName(apppath + fn); f.open(QFile::WriteOnly); f.write(ba); f.close(); f.setPermissions(perm); } } if (bar) { bar->setValue((1.0 / float(fsize)*float(i + 1)) * 100.0); QApplication::processEvents(); } qzf.close(); } zip.close(); if (errors) { // gone and wrecked the install here.. // probably should wait till get here before replacing files.. // but then again, this is probably what would screw up mainwin->Notify(tr("You might need to reinstall manually. Sorry :("), tr("Ugh.. Something went wrong with unzipping."), 5000); // TODO: Roll back from the backup folder failed = true; } } } ui->tableWidget->item(current_row, 0)->setCheckState(Qt::Checked); if (failed) { qDebug() << "File is corrupted"; if (bar) { bar->setFormat(tr("Failed")); QString style = "QProgressBar{\ border: 1px solid gray;\ border-radius: 3px;\ text-align: center;\ text-decoration: bold;\ color: yellow;\ }\ QProgressBar::chunk {\ background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 \"dark red\", stop: 1 red);\ width: 10px;\ margin: 0px;\ }"; //: qlineargradient(x1: 0, y1: 0.5, x2: 1, y2: 0.5, stop: 0 red, stop: 1 white); bar->setStyleSheet(style); } } ui->tableWidget->item(current_row, 0)->setData(Qt::UserRole + 1, failed); QTimer::singleShot(100, this, SLOT(upgradeNext())); ui->plainTextEdit->appendPlainText(tr("Download Complete")); } } else { mainwin->Notify(tr("There was an error completing a network request:\n\n(") + reply->errorString() + ")"); } } void UpdaterWindow::on_CloseButton_clicked() { close(); } void UpdaterWindow::upgradeNext() { QTableWidgetItem *item; bool fnd = false; for (current_row = 0; current_row < ui->tableWidget->rowCount(); current_row++) { item = ui->tableWidget->item(current_row, 0); bool complete = item->checkState() == Qt::Checked; if (complete) { continue; } update = item->data(Qt::UserRole).value(); qDebug() << "Processing" << update->url; fnd = true; requestFile(); break; } if (!fnd) { bool ok = true; for (current_row = 0; current_row < ui->tableWidget->rowCount(); current_row++) { bool failed = ui->tableWidget->item(current_row, 0)->data(Qt::UserRole + 1).toBool(); if (failed) { ok = false; break; } } if (ok) { success = true; //QMessageBox::information(this,tr("Updates Complete"),tr("SleepyHead has been updated and needs to restart."),QMessageBox::Ok); ui->downloadTitle->setText(tr("Update Complete!")); ui->FinishedButton->setVisible(true); ui->downloadLabel->setText( tr("Updates Complete. SleepyHead needs to restart now, click Finished to do so.")); PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime(); } else { ui->downloadTitle->setText(tr("Update Failed :(")); success = false; ui->downloadLabel->setText(tr("Download Error. Sorry, try again later.")); ui->FinishedButton->setVisible(true); //QMessageBox::warning(this,tr("Download Error"),tr("Sorry, could not get all necessary files for upgrade.. Try again later."),QMessageBox::Ok); //close(); } } } void UpdaterWindow::on_upgradeButton_clicked() { if (!updates.size()) { return; } ui->tableWidget->clearContents(); ui->tableWidget->setColumnHidden(4, true); ui->tableWidget->setColumnHidden(5, true); ui->FinishedButton->setVisible(false); ui->downloadLabel->setText(tr("Downloading & Installing Updates...")); ui->downloadTitle->setText(tr("Please wait while downloading and installing updates.")); success = false; for (int i = 0; i < updates.size(); i++) { update = updates.at(i); ui->tableWidget->insertRow(i); QTableWidgetItem *item = new QTableWidgetItem(update->type); QVariant av; av.setValue(update); item->setData(Qt::UserRole, av); item->setCheckState(Qt::Unchecked); item->setFlags(Qt::ItemIsEnabled); ui->tableWidget->setItem(i, 0, item); ui->tableWidget->setItem(i, 1, new QTableWidgetItem(update->version)); ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QString::number(update->size / 1048576.0, 'f', 3) + "MB")); QProgressBar *bar = new QProgressBar(ui->tableWidget); bar->setMaximum(100); bar->setValue(0); ui->tableWidget->setCellWidget(i, 3, bar); ui->tableWidget->setItem(i, 4, new QTableWidgetItem(update->url)); } ui->stackedWidget->setCurrentIndex(1); upgradeNext(); } void UpdaterWindow::on_FinishedButton_clicked() { if (success) { mainwin->RestartApplication(); } else { close(); } } sleepyhead-0.9.8/sleepyhead/overview.h0000644000175000017500000001062712412506713017366 0ustar sergiosergio/* Overview GUI Headers * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef OVERVIEW_H #define OVERVIEW_H #include #include #include #include #include "SleepLib/profiles.h" #include "Graphs/gGraphView.h" #include "Graphs/gSummaryChart.h" #include "Graphs/gSessionTimesChart.h" namespace Ui { class Overview; } class Report; enum YTickerType { YT_Number, YT_Time, YT_Weight }; /*! \class Overview \author Mark Watkins \brief Overview tab, showing overall summary data */ class Overview : public QWidget { Q_OBJECT public: explicit Overview(QWidget *parent, gGraphView *shared = nullptr); ~Overview(); void closeEvent(QCloseEvent *); //! \brief Returns Overview gGraphView object containing it's graphs gGraphView *graphView() { return GraphView; } //! \brief Recalculates Overview chart info void ReloadGraphs(); //! \brief Recalculates Overview chart info, but keeps the date set void ResetGraphs(); //! \brief Reset graphs to uniform heights void ResetGraphLayout(); //! \brief Calls updateGL to redraw the overview charts void RedrawGraphs(); //! \brief Sets the currently selected date range of the overview display void setRange(QDate start, QDate end); /*! \brief Create an overview graph, adding it to the overview gGraphView object \param QString name The title of the graph \param QString units The units of measurements to show in the popup */ gGraph *createGraph(QString code, QString name, QString units = "", YTickerType yttype = YT_Number); gGraph *AHI, *AHIHR, *UC, *FL, *SA, *US, *PR, *LK, *NPB, *SET, *SES, *RR, *MV, *TV, *PTB, *PULSE, *SPO2, *NLL, *WEIGHT, *ZOMBIE, *BMI, *TGMV, *TOTLK, *STG, *SN, *TTIA; SummaryChart *bc, *sa, *us, *pr, *set, *ses, *ptb, *pulse, *spo2, *weight, *zombie, *bmi, *ahihr, *tgmv, *totlk; gSummaryChart * stg, *uc, *ahi, * pres, *lk, *npb, *rr, *mv, *tv, *nll, *sn, *ttia; //! \breif List of SummaryCharts shown on the overview page QVector OverviewCharts; void ResetGraph(QString name); void RebuildGraphs(bool reset = true); public slots: void onRebuildGraphs() { RebuildGraphs(true); } // ! \brief Print button down the bottom, does the same as File->Print //void on_printButton_clicked(); private slots: /* void on_drStart_dateChanged(const QDate &date); void on_drEnd_dateChanged(const QDate &date); void on_rbDateRange_toggled(bool checked); void on_rbLastWeek_clicked(); void on_rbLastMonth_clicked(); void on_rbEverything_clicked(); void on_rbDateRange_clicked(); */ void updateGraphCombo(); //! \brief Resets the graph view because the Start date has been changed void on_dateStart_dateChanged(const QDate &date); //! \brief Resets the graph view because the End date has been changed void on_dateEnd_dateChanged(const QDate &date); //! \brief Updates the calendar highlighting when changing to a new month void dateStart_currentPageChanged(int year, int month); //! \brief Updates the calendar highlighting when changing to a new month void dateEnd_currentPageChanged(int year, int month); //! \brief Resets view to currently shown start & end dates void on_toolButton_clicked(); //void on_printDailyButton_clicked(); void on_rangeCombo_activated(int index); void on_graphCombo_activated(int index); void on_toggleVisibility_clicked(bool checked); void on_LineCursorUpdate(double time); void on_RangeUpdate(double minx, double maxx); private: Ui::Overview *ui; gGraphView *GraphView; MyScrollBar *scrollbar; QHBoxLayout *layout; gGraphView *m_shared; QIcon *icon_on; QIcon *icon_off; MyLabel *dateLabel; //! \brief Updates the calendar highlighting for the calendar object for this date. void UpdateCalendarDay(QDateEdit *calendar, QDate date); void updateCube(); //SessionTimes *session_times; //,*PRESSURE,*LEAK,*SESSTIMES; //Layer *prmax,*prmin,*iap,*eap,*pr,*sesstime; Day *day; // dummy in this case }; #endif // OVERVIEW_H sleepyhead-0.9.8/sleepyhead/preferencesdialog.cpp0000644000175000017500000012650312412506713021535 0ustar sergiosergio/* SleepyHead Preferences Dialog Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include #include #include #include #include #include #include #include "preferencesdialog.h" #include "common_gui.h" #include #include #include "ui_preferencesdialog.h" #include "SleepLib/machine_common.h" extern QFont *defaultfont; extern QFont *mediumfont; extern QFont *bigfont; extern MainWindow *mainwin; typedef QMessageBox::StandardButton StandardButton; typedef QMessageBox::StandardButtons StandardButtons; QHash channeltype; PreferencesDialog::PreferencesDialog(QWidget *parent, Profile *_profile) : QDialog(parent), ui(new Ui::PreferencesDialog), profile(_profile) { ui->setupUi(this); channeltype.clear(); channeltype[schema::FLAG] = tr("Flag"); channeltype[schema::MINOR_FLAG] = tr("Minor Flag"); channeltype[schema::SPAN] = tr("Span"); channeltype[schema::UNKNOWN] = tr("Always Minor"); //#ifdef LOCK_RESMED_SESSIONS // QList machines = p_profile->GetMachines(MT_CPAP); // for (QList::iterator it = machines.begin(); it != machines.end(); ++it) { // const QString & mclass=(*it)->loaderName(); // if (mclass == STR_MACH_ResMed) { // ui->combineSlider->setEnabled(false); // ui->IgnoreSlider->setEnabled(false); // ui->timeEdit->setEnabled(false); // break; // } // } //#endif QLocale locale = QLocale::system(); QString shortformat = locale.dateFormat(QLocale::ShortFormat); if (!shortformat.toLower().contains("yyyy")) { shortformat.replace("yy", "yyyy"); } // Qt::DayOfWeek dow = firstDayOfWeekFromLocale(); // QTextCharFormat format = ui->startedUsingMask->calendarWidget()->weekdayTextFormat(Qt::Saturday); // format.setForeground(QBrush(Qt::black, Qt::SolidPattern)); Q_ASSERT(profile != nullptr); ui->tabWidget->setCurrentIndex(0); //i=ui->timeZoneCombo->findText((*profile)["TimeZone"].toString()); //ui->timeZoneCombo->setCurrentIndex(i); ui->showLeakRedline->setChecked(profile->cpap->showLeakRedline()); ui->leakRedlineSpinbox->setValue(profile->cpap->leakRedline()); ui->oxiDesaturationThreshold->setValue(schema::channel[OXI_SPO2].lowerThreshold()); ui->flagPulseAbove->setValue(schema::channel[OXI_Pulse].upperThreshold()); ui->flagPulseBelow->setValue(schema::channel[OXI_Pulse].lowerThreshold()); ui->spo2Drop->setValue(profile->oxi->spO2DropPercentage()); ui->spo2DropTime->setValue(profile->oxi->spO2DropDuration()); ui->pulseChange->setValue(profile->oxi->pulseChangeBPM()); ui->pulseChangeTime->setValue(profile->oxi->pulseChangeDuration()); ui->oxiDiscardThreshold->setValue(profile->oxi->oxiDiscardThreshold()); ui->eventIndexCombo->setCurrentIndex(profile->general->calculateRDI() ? 1 : 0); ui->automaticImport->setChecked(profile->cpap->autoImport()); ui->timeEdit->setTime(profile->session->daySplitTime()); int val = profile->session->combineCloseSessions(); ui->combineSlider->setValue(val); if (val > 0) { ui->combineLCD->display(val); } else { ui->combineLCD->display(STR_GEN_Off); } val = profile->session->ignoreShortSessions(); ui->IgnoreSlider->setValue(val); if (val > 0) { ui->IgnoreLCD->display(val); } else { ui->IgnoreLCD->display(STR_GEN_Off); } ui->LockSummarySessionSplitting->setChecked(profile->session->lockSummarySessions()); ui->applicationFont->setCurrentFont(QApplication::font()); //ui->applicationFont->setFont(QApplication::font()); ui->applicationFontSize->setValue(QApplication::font().pointSize()); ui->applicationFontBold->setChecked(QApplication::font().weight() == QFont::Bold); ui->applicationFontItalic->setChecked(QApplication::font().italic()); ui->graphFont->setCurrentFont(*defaultfont); //ui->graphFont->setFont(*defaultfont); ui->graphFontSize->setValue(defaultfont->pointSize()); ui->graphFontBold->setChecked(defaultfont->weight() == QFont::Bold); ui->graphFontItalic->setChecked(defaultfont->italic()); ui->titleFont->setCurrentFont(*mediumfont); //ui->titleFont->setFont(*mediumfont); ui->titleFontSize->setValue(mediumfont->pointSize()); ui->titleFontBold->setChecked(mediumfont->weight() == QFont::Bold); ui->titleFontItalic->setChecked(mediumfont->italic()); ui->bigFont->setCurrentFont(*bigfont); //ui->bigFont->setFont(*bigfont); ui->bigFontSize->setValue(bigfont->pointSize()); ui->bigFontBold->setChecked(bigfont->weight() == QFont::Bold); ui->bigFontItalic->setChecked(bigfont->italic()); ui->lineThicknessSlider->setValue(profile->appearance->lineThickness()*2); ui->resyncMachineDetectedEvents->setChecked(profile->cpap->resyncFromUserFlagging()); ui->useAntiAliasing->setChecked(profile->appearance->antiAliasing()); ui->usePixmapCaching->setChecked(profile->appearance->usePixmapCaching()); ui->useSquareWavePlots->setChecked(profile->appearance->squareWavePlots()); ui->enableGraphSnapshots->setChecked(profile->appearance->graphSnapshots()); ui->graphTooltips->setChecked(profile->appearance->graphTooltips()); ui->allowYAxisScaling->setChecked(profile->appearance->allowYAxisScaling()); ui->skipLoginScreen->setChecked(PREF[STR_GEN_SkipLogin].toBool()); ui->allowEarlyUpdates->setChecked(PREF[STR_PREF_AllowEarlyUpdates].toBool()); int s = profile->cpap->clockDrift(); int m = (s / 60) % 60; int h = (s / 3600); s %= 60; ui->clockDriftHours->setValue(h); ui->clockDriftMinutes->setValue(m); ui->clockDriftSeconds->setValue(s); ui->skipEmptyDays->setChecked(profile->general->skipEmptyDays()); ui->showUnknownFlags->setChecked(profile->general->showUnknownFlags()); ui->enableMultithreading->setChecked(profile->session->multithreading()); ui->cacheSessionData->setChecked(profile->session->cacheSessions()); ui->preloadSummaries->setChecked(profile->session->preloadSummaries()); ui->animationsAndTransitionsCheckbox->setChecked(profile->appearance->animations()); ui->complianceCheckBox->setChecked(profile->cpap->showComplianceInfo()); ui->complianceHours->setValue(profile->cpap->complianceHours()); ui->prefCalcMiddle->setCurrentIndex(profile->general->prefCalcMiddle()); ui->prefCalcMax->setCurrentIndex(profile->general->prefCalcMax()); float f = profile->general->prefCalcPercentile(); ui->prefCalcPercentile->setValue(f); ui->tooltipTimeoutSlider->setValue(profile->general->tooltipTimeout() / 50); ui->tooltipMS->display(profile->general->tooltipTimeout()); ui->scrollDampeningSlider->setValue(profile->general->scrollDampening() / 10); if (profile->general->scrollDampening() > 0) { ui->scrollDampDisplay->display(profile->general->scrollDampening()); } else { ui->scrollDampDisplay->display(STR_TR_Off); } bool bcd = profile->session->backupCardData(); ui->createSDBackups->setChecked(bcd); ui->compressSDBackups->setEnabled(bcd); ui->compressSDBackups->setChecked(profile->session->compressBackupData()); ui->compressSessionData->setChecked(profile->session->compressSessionData()); ui->ignoreOlderSessionsCheck->setChecked(profile->session->ignoreOlderSessions()); ui->ignoreOlderSessionsDate->setDate(profile->session->ignoreOlderSessionsDate().date()); ui->graphHeight->setValue(profile->appearance->graphHeight()); ui->automaticallyCheckUpdates->setChecked(PREF[STR_GEN_UpdatesAutoCheck].toBool()); ui->updateCheckEvery->setValue(PREF[STR_GEN_UpdateCheckFrequency].toInt()); if (PREF.contains(STR_GEN_UpdatesLastChecked)) { RefreshLastChecked(); } else { ui->updateLastChecked->setText("Never"); } ui->overlayFlagsCombo->setCurrentIndex(profile->appearance->overlayType()); ui->overviewLinecharts->setCurrentIndex(profile->appearance->overviewLinechartMode()); ui->ahiGraphWindowSize->setEnabled(false); ui->ahiGraphWindowSize->setValue(profile->cpap->AHIWindow()); ui->ahiGraphZeroReset->setChecked(profile->cpap->AHIReset()); ui->customEventGroupbox->setChecked(profile->cpap->userEventFlagging()); ui->apneaDuration->setValue(profile->cpap->userEventDuration()); ui->apneaFlowRestriction->setValue(profile->cpap->userFlowRestriction()); ui->apneaDuration2->setValue(profile->cpap->userEventDuration2()); ui->apneaFlowRestriction2->setValue(profile->cpap->userFlowRestriction2()); ui->userEventDuplicates->setChecked(profile->cpap->userEventDuplicates()); ui->userEventDuplicates->setVisible(false); ui->showUserFlagsInPie->setChecked(profile->cpap->userEventPieChart()); /* QLocale locale=QLocale::system(); QString shortformat=locale.dateFormat(QLocale::ShortFormat); if (!shortformat.toLower().contains("yyyy")) { shortformat.replace("yy","yyyy"); }*/ chanFilterModel = new MySortFilterProxyModel(this); chanModel = new QStandardItemModel(this); chanFilterModel->setSourceModel(chanModel); chanFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); chanFilterModel->setFilterKeyColumn(0); ui->chanView->setModel(chanFilterModel); InitChanInfo(); waveFilterModel = new MySortFilterProxyModel(this); waveModel = new QStandardItemModel(this); waveFilterModel->setSourceModel(waveModel); waveFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); waveFilterModel->setFilterKeyColumn(0); ui->waveView->setModel(waveFilterModel); InitWaveInfo(); ui->waveView->setSortingEnabled(true); ui->chanView->setSortingEnabled(true); ui->waveView->sortByColumn(0, Qt::AscendingOrder); ui->chanView->sortByColumn(0, Qt::AscendingOrder); } #include class SpinBoxDelegate : public QItemDelegate { public: SpinBoxDelegate(QObject *parent = 0):QItemDelegate(parent) {} virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; virtual void setEditorData(QWidget *editor, const QModelIndex &index) const; virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const { QDoubleSpinBox *editor = new QDoubleSpinBox(parent); //editor->setMinimum(0); //editor->setMaximum(100.0); return editor; } void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { double value = index.model()->data(index, Qt::EditRole).toDouble(); QDoubleSpinBox *spinBox = static_cast(editor); spinBox->setMinimum(-9999999.0); spinBox->setMaximum(9999999.0); spinBox->setValue(value); } void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QDoubleSpinBox *spinBox = static_cast(editor); spinBox->interpretText(); double value = spinBox->value(); model->setData(index, value, Qt::EditRole); } void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { editor->setGeometry(option.rect); } #include class ComboBoxDelegate : public QItemDelegate { public: ComboBoxDelegate(QObject *parent = 0):QItemDelegate(parent) {} virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; virtual void setEditorData(QWidget *editor, const QModelIndex &index) const; virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const { QComboBox *combo = new QComboBox(parent); QHash::iterator it; for (it = channeltype.begin(); it != channeltype.end(); ++it) { if (it.key() == schema::UNKNOWN) continue; combo->addItem(it.value()); } //editor->setMinimum(0); //editor->setMaximum(100.0); return combo; } void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QString value = index.model()->data(index, Qt::EditRole).toString(); QComboBox *combo = static_cast(editor); combo->setCurrentText(value); } void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QComboBox *combo = static_cast(editor); model->setData(index, combo->currentText(), Qt::EditRole); } void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { editor->setGeometry(option.rect); } void PreferencesDialog::InitChanInfo() { QHash toprows; chanModel->clear(); toplevel.clear(); toprows.clear(); QStringList headers; headers.append(tr("Name")); headers.append(tr("Color")); headers.append(tr("Overview")); headers.append(tr("Flag Type")); headers.append(tr("Label")); headers.append(tr("Details")); chanModel->setHorizontalHeaderLabels(headers); ui->chanView->setColumnWidth(0, 200); ui->chanView->setColumnWidth(1, 40); ui->chanView->setColumnWidth(2, 60); ui->chanView->setColumnWidth(3, 100); ui->chanView->setColumnWidth(4, 100); ui->chanView->setSelectionMode(QAbstractItemView::SingleSelection); ui->chanView->setSelectionBehavior(QAbstractItemView::SelectItems); chanModel->setColumnCount(6); QStandardItem *hdr = nullptr; QMap Section; Section[MT_CPAP] = tr("CPAP Events"); Section[MT_OXIMETER] = tr("Oximeter Events"); Section[MT_POSITION] = tr("Positional Events"); Section[MT_SLEEPSTAGE] = tr("Sleep Stage Events"); Section[MT_UNCATEGORIZED] = tr("Unknown Events"); QMap::iterator it; QHash::iterator ci; for (it = Section.begin(); it != Section.end(); ++it) { toplevel[it.key()] = hdr = new QStandardItem(it.value()); hdr->setEditable(false); QList list; list.append(hdr); for (int i=0; i<5; i++) { QStandardItem *it = new QStandardItem(); it->setEnabled(false); list.append(it); } chanModel->appendRow(list); } ui->chanView->setAlternatingRowColors(true); // ui->graphView->setFirstColumnSpanned(0,daily->index(),true); // Crashes on windows.. Why do I need this again? ComboBoxDelegate * combobox = new ComboBoxDelegate(ui->waveView); ui->chanView->setItemDelegateForColumn(3,combobox); int row = 0; for (ci = schema::channel.names.begin(); ci != schema::channel.names.end(); ci++) { schema::Channel * chan = ci.value(); if ((chan->type() == schema::DATA) || (chan->type() == schema::SETTING) || chan->type() == schema::WAVEFORM) continue; QList items; QStandardItem *it = new QStandardItem(chan->fullname()); it->setCheckable(true); it->setCheckState(chan->enabled() ? Qt::Checked : Qt::Unchecked); it->setEditable(true); it->setData(chan->id(), Qt::UserRole); // Dear translators: %1 is a unique ascii english string used to indentify channels in the code, I'd like feedback on how this goes.. // It's here in case users mess up which field is which.. it will always show the Channel Code underneath in the tooltip. it->setToolTip(tr("Double click to change the descriptive name the '%1' channel.").arg(chan->code())); items.push_back(it); it = new QStandardItem(); it->setBackground(QBrush(chan->defaultColor())); it->setEditable(false); it->setData(chan->defaultColor().rgba(), Qt::UserRole); it->setToolTip(tr("Double click to change the default color for this channel plot/flag/data.")); it->setSelectable(false); items.push_back(it); it = new QStandardItem(QString()); it->setToolTip(tr("Whether this flag has a dedicated overview chart.")); it->setCheckable(true); it->setCheckState(chan->showInOverview() ? Qt::Checked : Qt::Unchecked); it->setTextAlignment(Qt::AlignCenter); it->setData(chan->id(), Qt::UserRole); items.push_back(it); schema::ChanType type = chan->type(); it = new QStandardItem(channeltype[type]); it->setToolTip(tr("Here you can change the type of flag shown for this event")); it->setEditable(type != schema::UNKNOWN); items.push_back(it); it = new QStandardItem(chan->label()); it->setToolTip(tr("This is the short-form label to indicate this channel on screen.")); it->setEditable(true); items.push_back(it); it = new QStandardItem(chan->description()); it->setToolTip(tr("This is a description of what this channel does.")); it->setEditable(true); items.push_back(it); MachineType mt = chan->machtype(); if (chan->type() == schema::UNKNOWN) mt = MT_UNCATEGORIZED; row = toprows[mt]++; toplevel[mt]->insertRow(row, items); } for(QHash::iterator i = toplevel.begin(); i != toplevel.end(); ++i) { if (i.value()->rowCount() == 0) { chanModel->removeRow(i.value()->row()); } } ui->chanView->expandAll(); ui->chanView->setSortingEnabled(true); } void PreferencesDialog::InitWaveInfo() { QHash toprows; waveModel->clear(); machlevel.clear(); toprows.clear(); QStringList headers; headers.append(tr("Name")); headers.append(tr("Color")); headers.append(tr("Overview")); headers.append(tr("Lower")); headers.append(tr("Upper")); headers.append(tr("Label")); headers.append(tr("Details")); waveModel->setHorizontalHeaderLabels(headers); ui->waveView->setColumnWidth(0, 200); ui->waveView->setColumnWidth(1, 40); ui->waveView->setColumnWidth(2, 60); ui->waveView->setColumnWidth(3, 50); ui->waveView->setColumnWidth(4, 50); ui->waveView->setColumnWidth(5, 100); ui->waveView->setSelectionMode(QAbstractItemView::SingleSelection); ui->waveView->setSelectionBehavior(QAbstractItemView::SelectItems); waveModel->setColumnCount(7); QStandardItem *hdr = nullptr; QMap Section; Section[MT_CPAP] = tr("CPAP Waveforms"); Section[MT_OXIMETER] = tr("Oximeter Waveforms"); Section[MT_POSITION] = tr("Positional Waveforms"); Section[MT_SLEEPSTAGE] = tr("Sleep Stage Waveforms"); QMap::iterator it; for (it = Section.begin(); it != Section.end(); ++it) { machlevel[it.key()] = hdr = new QStandardItem(it.value()); hdr->setEditable(false); QList list; list.append(hdr); for (int i=0; i<6; i++) { QStandardItem *it = new QStandardItem(); it->setEnabled(false); list.append(it); } waveModel->appendRow(list); } ui->waveView->setAlternatingRowColors(true); // ui->graphView->setFirstColumnSpanned(0,daily->index(),true); // Crashes on windows.. Why do I need this again? QHash::iterator ci; SpinBoxDelegate * spinbox = new SpinBoxDelegate(ui->waveView); ui->waveView->setItemDelegateForColumn(3,spinbox); ui->waveView->setItemDelegateForColumn(4,spinbox); int row = 0; for (ci = schema::channel.names.begin(); ci != schema::channel.names.end(); ci++) { schema::Channel * chan = ci.value(); if (chan->type() != schema::WAVEFORM) continue; QList items; QStandardItem *it = new QStandardItem(chan->fullname()); it->setCheckable(true); it->setCheckState(chan->enabled() ? Qt::Checked : Qt::Unchecked); it->setEditable(true); it->setData(chan->id(), Qt::UserRole); it->setToolTip(tr("Double click to change the descriptive name this channel.")); items.push_back(it); it = new QStandardItem(); it->setBackground(QBrush(chan->defaultColor())); it->setEditable(false); it->setData(chan->defaultColor().rgba(), Qt::UserRole); it->setToolTip(tr("Double click to change the default color for this channel plot/flag/data.")); it->setSelectable(false); items.push_back(it); it = new QStandardItem(); it->setCheckable(true); it->setCheckState(chan->showInOverview() ? Qt::Checked : Qt::Unchecked); it->setEditable(true); it->setData(chan->id(), Qt::UserRole); it->setToolTip(tr("Whether a breakdown of this waveform displays in overview.")); items.push_back(it); it = new QStandardItem(QString::number(chan->lowerThreshold(),'f',1)); it->setToolTip(tr("Here you can set the lower threshold used for certain calculations on the %1 waveform").arg(chan->fullname())); it->setEditable(true); items.push_back(it); it = new QStandardItem(QString::number(chan->upperThreshold(),'f',1)); it->setToolTip(tr("Here you can set the upper threshold used for certain calculations on the %1 waveform").arg(chan->fullname())); it->setEditable(true); items.push_back(it); it = new QStandardItem(chan->label()); it->setToolTip(tr("This is the short-form label to indicate this channel on screen.")); it->setEditable(true); items.push_back(it); it = new QStandardItem(chan->description()); it->setToolTip(tr("This is a description of what this channel does.")); it->setEditable(true); items.push_back(it); row = toprows[chan->machtype()]++; machlevel[chan->machtype()]->insertRow(row, items); } for(QHash::iterator i = machlevel.begin(); i != machlevel.end(); ++i) { if (i.value()->rowCount() == 0) { waveModel->removeRow(i.value()->row()); } } ui->waveView->expandAll(); ui->waveView->setSortingEnabled(true); } PreferencesDialog::~PreferencesDialog() { delete ui; } bool PreferencesDialog::Save() { bool recalc_events = false; bool needs_restart = false; if (ui->ahiGraphZeroReset->isChecked() != profile->cpap->AHIReset()) { recalc_events = true; } if (ui->useSquareWavePlots->isChecked() != profile->appearance->squareWavePlots()) { needs_restart = true; } if ((profile->session->daySplitTime() != ui->timeEdit->time()) || (profile->session->combineCloseSessions() != ui->combineSlider->value()) || (profile->session->ignoreShortSessions() != ui->IgnoreSlider->value())) { needs_restart = true; } if (profile->session->lockSummarySessions() != ui->LockSummarySessionSplitting->isChecked()) { needs_restart = true; } if (profile->cpap->userEventPieChart() != ui->showUserFlagsInPie->isChecked()) { // lazy.. fix me needs_restart = true; } int rdi_set = profile->general->calculateRDI() ? 1 : 0; if (rdi_set != ui->eventIndexCombo->currentIndex()) { //recalc_events=true; needs_restart = true; } if ((profile->general->prefCalcMiddle() != ui->prefCalcMiddle->currentIndex()) || (profile->general->prefCalcMax() != ui->prefCalcMax->currentIndex()) || (profile->general->prefCalcPercentile() != ui->prefCalcPercentile->value())) { needs_restart = true; } if (profile->cpap->leakRedline() != ui->leakRedlineSpinbox->value()) { recalc_events = true; } if (profile->cpap->userEventFlagging() && (profile->cpap->userEventDuration() != ui->apneaDuration->value() || profile->cpap->userEventDuration2() != ui->apneaDuration2->value() || profile->cpap->userEventDuplicates() != ui->userEventDuplicates->isChecked() || profile->cpap->userFlowRestriction2() != ui->apneaFlowRestriction2->value() || profile->cpap->userFlowRestriction() != ui->apneaFlowRestriction->value())) { recalc_events = true; } // Restart if turning user event flagging on/off if (profile->cpap->userEventFlagging() != ui->customEventGroupbox->isChecked()) { // if (profile->cpap->userEventFlagging()) { // Don't bother recalculating, just switch off needs_restart = true; //} else recalc_events = true; } if (profile->session->compressSessionData() != ui->compressSessionData->isChecked()) { recalc_events = true; } if (recalc_events) { if (p_profile->countDays(MT_CPAP, p_profile->FirstDay(), p_profile->LastDay()) > 0) { if (QMessageBox::question(this, tr("Data Reindex Required"), tr("A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.\n\nAre you sure you want to make these changes?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { return false; } } else { recalc_events = false; } } else if (needs_restart) { if (QMessageBox::question(this, tr("Restart Required"), tr("One or more of the changes you have made will require this application to be restarted,\nin order for these changes to come into effect.\n\nWould you like do this now?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { return false; } } schema::channel[OXI_SPO2].setLowerThreshold(ui->oxiDesaturationThreshold->value()); schema::channel[OXI_Pulse].setLowerThreshold(ui->flagPulseBelow->value()); schema::channel[OXI_Pulse].setUpperThreshold(ui->flagPulseAbove->value()); profile->cpap->setUserEventPieChart(ui->showUserFlagsInPie->isChecked()); profile->session->setLockSummarySessions(ui->LockSummarySessionSplitting->isChecked()); profile->appearance->setAllowYAxisScaling(ui->allowYAxisScaling->isChecked()); profile->appearance->setGraphTooltips(ui->graphTooltips->isChecked()); profile->appearance->setAntiAliasing(ui->useAntiAliasing->isChecked()); profile->appearance->setUsePixmapCaching(ui->usePixmapCaching->isChecked()); profile->appearance->setSquareWavePlots(ui->useSquareWavePlots->isChecked()); profile->appearance->setGraphSnapshots(ui->enableGraphSnapshots->isChecked()); profile->appearance->setLineThickness(float(ui->lineThicknessSlider->value()) / 2.0); profile->general->setSkipEmptyDays(ui->skipEmptyDays->isChecked()); profile->general->setTooltipTimeout(ui->tooltipTimeoutSlider->value() * 50); profile->general->setScrollDampening(ui->scrollDampeningSlider->value() * 10); profile->general->setShowUnknownFlags(ui->showUnknownFlags->isChecked()); profile->session->setMultithreading(ui->enableMultithreading->isChecked()); profile->session->setCacheSessions(ui->cacheSessionData->isChecked()); profile->session->setPreloadSummaries(ui->preloadSummaries->isChecked()); profile->appearance->setAnimations(ui->animationsAndTransitionsCheckbox->isChecked()); profile->cpap->setShowLeakRedline(ui->showLeakRedline->isChecked()); profile->cpap->setLeakRedline(ui->leakRedlineSpinbox->value()); profile->cpap->setShowComplianceInfo(ui->complianceCheckBox->isChecked()); profile->cpap->setComplianceHours(ui->complianceHours->value()); if (ui->graphHeight->value() != profile->appearance->graphHeight()) { profile->appearance->setGraphHeight(ui->graphHeight->value()); mainwin->getDaily()->ResetGraphLayout(); mainwin->getOverview()->ResetGraphLayout(); } profile->general->setPrefCalcMiddle(ui->prefCalcMiddle->currentIndex()); profile->general->setPrefCalcMax(ui->prefCalcMax->currentIndex()); profile->general->setPrefCalcPercentile(ui->prefCalcPercentile->value()); profile->general->setCalculateRDI((ui->eventIndexCombo->currentIndex() == 1)); profile->session->setBackupCardData(ui->createSDBackups->isChecked()); profile->session->setCompressBackupData(ui->compressSDBackups->isChecked()); profile->session->setCompressSessionData(ui->compressSessionData->isChecked()); profile->session->setCombineCloseSessions(ui->combineSlider->value()); profile->session->setIgnoreShortSessions(ui->IgnoreSlider->value()); profile->session->setDaySplitTime(ui->timeEdit->time()); profile->session->setIgnoreOlderSessions(ui->ignoreOlderSessionsCheck->isChecked()); profile->session->setIgnoreOlderSessionsDate(ui->ignoreOlderSessionsDate->date()); int s = ui->clockDriftHours->value() * 3600 + ui->clockDriftMinutes->value() * 60 + ui->clockDriftSeconds->value(); profile->cpap->setClockDrift(s); profile->appearance->setOverlayType((OverlayDisplayType)ui->overlayFlagsCombo->currentIndex()); profile->appearance->setOverviewLinechartMode((OverviewLinechartModes)ui->overviewLinecharts->currentIndex()); profile->oxi->setSpO2DropPercentage(ui->spo2Drop->value()); profile->oxi->setSpO2DropDuration(ui->spo2DropTime->value()); profile->oxi->setPulseChangeBPM(ui->pulseChange->value()); profile->oxi->setPulseChangeDuration(ui->pulseChangeTime->value()); profile->oxi->setOxiDiscardThreshold(ui->oxiDiscardThreshold->value()); profile->cpap->setAHIWindow(ui->ahiGraphWindowSize->value()); profile->cpap->setAHIReset(ui->ahiGraphZeroReset->isChecked()); profile->cpap->setAutoImport(ui->automaticImport->isChecked()); profile->cpap->setUserEventFlagging(ui->customEventGroupbox->isChecked()); profile->cpap->setResyncFromUserFlagging(ui->resyncMachineDetectedEvents->isChecked()); profile->cpap->setUserEventDuration(ui->apneaDuration->value()); profile->cpap->setUserFlowRestriction(ui->apneaFlowRestriction->value()); profile->cpap->setUserEventDuration2(ui->apneaDuration2->value()); profile->cpap->setUserFlowRestriction2(ui->apneaFlowRestriction2->value()); profile->cpap->setUserEventDuplicates(ui->userEventDuplicates->isChecked()); PREF[STR_GEN_SkipLogin] = ui->skipLoginScreen->isChecked(); PREF[STR_GEN_UpdatesAutoCheck] = ui->automaticallyCheckUpdates->isChecked(); PREF[STR_GEN_UpdateCheckFrequency] = ui->updateCheckEvery->value(); PREF[STR_PREF_AllowEarlyUpdates] = ui->allowEarlyUpdates->isChecked(); PREF["Fonts_Application_Name"] = ui->applicationFont->currentText(); PREF["Fonts_Application_Size"] = ui->applicationFontSize->value(); PREF["Fonts_Application_Bold"] = ui->applicationFontBold->isChecked(); PREF["Fonts_Application_Italic"] = ui->applicationFontItalic->isChecked(); PREF["Fonts_Graph_Name"] = ui->graphFont->currentText(); PREF["Fonts_Graph_Size"] = ui->graphFontSize->value(); PREF["Fonts_Graph_Bold"] = ui->graphFontBold->isChecked(); PREF["Fonts_Graph_Italic"] = ui->graphFontItalic->isChecked(); PREF["Fonts_Title_Name"] = ui->titleFont->currentText(); PREF["Fonts_Title_Size"] = ui->titleFontSize->value(); PREF["Fonts_Title_Bold"] = ui->titleFontBold->isChecked(); PREF["Fonts_Title_Italic"] = ui->titleFontItalic->isChecked(); PREF["Fonts_Big_Name"] = ui->bigFont->currentText(); PREF["Fonts_Big_Size"] = ui->bigFontSize->value(); PREF["Fonts_Big_Bold"] = ui->bigFontBold->isChecked(); PREF["Fonts_Big_Italic"] = ui->bigFontItalic->isChecked(); QFont font = ui->applicationFont->currentFont(); font.setPointSize(ui->applicationFontSize->value()); font.setWeight(ui->applicationFontBold->isChecked() ? QFont::Bold : QFont::Normal); font.setItalic(ui->applicationFontItalic->isChecked()); QApplication::setFont(font); mainwin->menuBar()->setFont(font); *defaultfont = ui->graphFont->currentFont(); defaultfont->setPointSize(ui->graphFontSize->value()); defaultfont->setWeight(ui->graphFontBold->isChecked() ? QFont::Bold : QFont::Normal); defaultfont->setItalic(ui->graphFontItalic->isChecked()); *mediumfont = ui->titleFont->currentFont(); mediumfont->setPointSize(ui->titleFontSize->value()); mediumfont->setWeight(ui->titleFontBold->isChecked() ? QFont::Bold : QFont::Normal); mediumfont->setItalic(ui->titleFontItalic->isChecked()); *bigfont = ui->bigFont->currentFont(); bigfont->setPointSize(ui->bigFontSize->value()); bigfont->setWeight(ui->bigFontBold->isChecked() ? QFont::Bold : QFont::Normal); bigfont->setItalic(ui->bigFontItalic->isChecked()); saveChanInfo(); saveWaveInfo(); //qDebug() << "TODO: Save channels.xml to update channel data"; PREF.Save(); p_profile->Save(); if (recalc_events) { // send a signal instead? mainwin->reprocessEvents(needs_restart); } else if (needs_restart) { p_profile->removeLock(); mainwin->RestartApplication(); } else { mainwin->getDaily()->LoadDate(mainwin->getDaily()->getDate()); // Save early.. just in case.. mainwin->getDaily()->graphView()->SaveSettings("Daily"); mainwin->getOverview()->graphView()->SaveSettings("Overview"); } return true; } void PreferencesDialog::saveChanInfo() { // Change focus to force save of any open editors.. ui->channelSearch->setFocus(); int toprows = chanModel->rowCount(); bool ok; for (int i=0; i < toprows; i++) { QStandardItem * topitem = chanModel->item(i,0); if (!topitem) continue; int rows = topitem->rowCount(); for (int j=0; j< rows; ++j) { QStandardItem * item = topitem->child(j, 0); if (!item) continue; ChannelID id = item->data(Qt::UserRole).toUInt(&ok); schema::Channel & chan = schema::channel[id]; if (chan.isNull()) continue; chan.setEnabled(item->checkState() == Qt::Checked ? true : false); chan.setFullname(item->text()); chan.setDefaultColor(QColor(topitem->child(j,1)->data(Qt::UserRole).toUInt())); chan.setShowInOverview(topitem->child(j,2)->checkState() == Qt::Checked); QString ts = topitem->child(j,3)->text(); schema::ChanType type = schema::MINOR_FLAG; for (QHash::iterator it = channeltype.begin(); it!= channeltype.end(); ++it) { if (it.value() == ts) { type = it.key(); break; } } chan.setType(type); chan.setLabel(topitem->child(j,4)->text()); chan.setDescription(topitem->child(j,5)->text()); } } } void PreferencesDialog::saveWaveInfo() { // Change focus to force save of any open editors.. ui->waveSearch->setFocus(); int toprows = waveModel->rowCount(); bool ok; for (int i=0; i < toprows; i++) { QStandardItem * topitem = waveModel->item(i,0); if (!topitem) continue; int rows = topitem->rowCount(); for (int j=0; j< rows; ++j) { QStandardItem * item = topitem->child(j, 0); if (!item) continue; ChannelID id = item->data(Qt::UserRole).toUInt(&ok); schema::Channel & chan = schema::channel[id]; if (chan.isNull()) continue; chan.setEnabled(item->checkState() == Qt::Checked ? true : false); chan.setFullname(item->text()); chan.setDefaultColor(QColor(topitem->child(j,1)->data(Qt::UserRole).toUInt())); chan.setShowInOverview(topitem->child(j,2)->checkState() == Qt::Checked); chan.setLowerThreshold(topitem->child(j,3)->text().toDouble()); chan.setUpperThreshold(topitem->child(j,4)->text().toDouble()); chan.setLabel(topitem->child(j,5)->text()); chan.setDescription(topitem->child(j,6)->text()); } } } void PreferencesDialog::on_combineSlider_valueChanged(int position) { if (position > 0) { ui->combineLCD->display(position); } else { ui->combineLCD->display(STR_GEN_Off); } } void PreferencesDialog::on_IgnoreSlider_valueChanged(int position) { if (position > 0) { ui->IgnoreLCD->display(position); } else { ui->IgnoreLCD->display(STR_GEN_Off); } } #include "mainwindow.h" extern MainWindow *mainwin; void PreferencesDialog::RefreshLastChecked() { ui->updateLastChecked->setText(PREF[STR_GEN_UpdatesLastChecked].toDateTime().toString( Qt::SystemLocaleLongDate)); } void PreferencesDialog::on_checkForUpdatesButton_clicked() { mainwin->CheckForUpdates(); } MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent) { } bool MySortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { if (source_parent == qobject_cast (sourceModel())->invisibleRootItem()->index()) { // always accept children of rootitem, since we want to filter their children return true; } return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); } // Might still be useful.. //void PreferencesDialog::on_resetGraphButton_clicked() //{ // QString title = tr("Confirmation"); // QString text = tr("Are you sure you want to reset your graph preferences to the defaults?"); // StandardButtons buttons = QMessageBox::Yes | QMessageBox::No; // StandardButton defaultButton = QMessageBox::No; // // Display confirmation dialog. // StandardButton choice = QMessageBox::question(this, title, text, buttons, defaultButton); // if (choice == QMessageBox::No) { // return; // } // gGraphView *views[3] = {0}; // views[0] = mainwin->getDaily()->graphView(); // views[1] = mainwin->getOverview()->graphView(); // // Iterate over all graph containers. // for (unsigned j = 0; j < 3; j++) { // gGraphView *view = views[j]; // if (!view) { // continue; // } // // Iterate over all contained graphs. // for (int i = 0; i < view->size(); i++) { // gGraph *g = (*view)[i]; // g->setRecMaxY(0); // FIXME: should be g->reset(), but need other patches to land. // g->setRecMinY(0); // g->setVisible(true); // } // view->updateScale(); // } // resetGraphModel(); // ui->graphView->update(); //} void PreferencesDialog::on_createSDBackups_toggled(bool checked) { if (profile->session->backupCardData() && !checked) { QList mach = p_profile->GetMachines(MT_CPAP); bool haveS9 = false; for (int i = 0; i < mach.size(); i++) { if (mach[i]->loaderName() == STR_MACH_ResMed) { haveS9 = true; break; } } if (haveS9 && QMessageBox::question(this, tr("This may not be a good idea"), tr("ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).") + " " + tr("If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.") + " " + tr("If you need to conserve disk space, please remember to carry out manual backups.") + " " + tr("Are you sure you want to disable these backups?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) { ui->createSDBackups->setChecked(true); return; } } if (!checked) { ui->compressSDBackups->setChecked(false); } ui->compressSDBackups->setEnabled(checked); } void PreferencesDialog::on_okButton_clicked() { if (Save()) { accept(); } } void PreferencesDialog::on_scrollDampeningSlider_valueChanged(int value) { if (value > 0) { ui->scrollDampDisplay->display(value * 10); } else { ui->scrollDampDisplay->display(STR_TR_Off); } } void PreferencesDialog::on_tooltipTimeoutSlider_valueChanged(int value) { ui->tooltipMS->display(value * 50); } void PreferencesDialog::on_resetChannelDefaults_clicked() { if (QMessageBox::question(this, STR_MessageBox_Warning, QObject::tr("Are you sure you want to reset all your channel colors and settings to defaults?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { schema::resetChannels(); saveWaveInfo(); InitChanInfo(); } } void PreferencesDialog::on_createSDBackups_clicked(bool checked) { if (!checked && p_profile->session->backupCardData()) { if (QMessageBox::question(this, STR_MessageBox_Warning, tr("Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.")+"\n\n"+ tr("Are you really sure you want to do this?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { } else { ui->createSDBackups->setChecked(true); } } } void PreferencesDialog::on_channelSearch_textChanged(const QString &arg1) { chanFilterModel->setFilterFixedString(arg1); } void PreferencesDialog::on_chanView_doubleClicked(const QModelIndex &index) { if (index.column() == 1) { QColorDialog a; if (!(index.flags() & Qt::ItemIsEnabled)) return; quint32 color = index.data(Qt::UserRole).toUInt(); a.setCurrentColor(QColor((QRgb)color)); if (a.exec() == QColorDialog::Accepted) { quint32 cv = a.currentColor().rgba(); chanFilterModel->setData(index, cv, Qt::UserRole); chanFilterModel->setData(index, a.currentColor(), Qt::BackgroundRole); } } } void PreferencesDialog::on_waveSearch_textChanged(const QString &arg1) { waveFilterModel->setFilterFixedString(arg1); } void PreferencesDialog::on_resetWaveformChannels_clicked() { if (QMessageBox::question(this, STR_MessageBox_Warning, QObject::tr("Are you sure you want to reset all your waveform channel colors and settings to defaults?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { schema::resetChannels(); saveChanInfo(); // reset clears EVERYTHING, so have to put these back in case they cancel. InitWaveInfo(); } } void PreferencesDialog::on_waveView_doubleClicked(const QModelIndex &index) { if (index.column() == 1) { QColorDialog a; if (!(index.flags() & Qt::ItemIsEnabled)) return; quint32 color = index.data(Qt::UserRole).toUInt(); a.setCurrentColor(QColor((QRgb)color)); if (a.exec() == QColorDialog::Accepted) { quint32 cv = a.currentColor().rgba(); waveFilterModel->setData(index, cv, Qt::UserRole); waveFilterModel->setData(index, a.currentColor(), Qt::BackgroundRole); } } } sleepyhead-0.9.8/sleepyhead/COPYING0000644000175000017500000010451312412506713016400 0ustar sergiosergio GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . sleepyhead-0.9.8/sleepyhead/daily.ui0000644000175000017500000013355512412506713017016 0ustar sergiosergio Daily 0 0 1211 674 0 0 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 0 0 0 255 255 255 0 0 0 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 127 127 127 255 255 255 255 255 255 255 255 255 127 127 127 170 170 170 127 127 127 255 255 255 127 127 127 255 255 255 255 255 255 0 0 0 255 255 255 255 255 220 0 0 0 Form 0 0 0 0 0 Qt::Horizontal Qt::Vertical 0 0 1 0 4 0 4 0 0 0 25 16777215 25 Go to the previous day QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } Prev :/icons/arrow-left.png:/icons/arrow-left.png Qt::ToolButtonIconOnly false Qt::NoArrow 0 0 Show or hide the calender Qt::LeftToRight QToolButton { border: 2px solid #aaaaaa; border-radius: 10px; background: white; } QToolButton:hover { border: 2px solid #456789; border-radius: 10px; } QToolButton:pressed { border: 2px solid #456789; border-radius: 10px; } ... true true Qt::ToolButtonTextBesideIcon true Qt::UpArrow 0 0 0 25 16777215 25 Go to the next day Qt::LeftToRight QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } Next :/icons/arrow-right.png:/icons/arrow-right.png Qt::ToolButtonIconOnly false Qt::NoArrow 0 0 0 25 16777215 25 Go to the most recent day with data records QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } :/icons/arrow-end.png:/icons/arrow-end.png Qt::ToolButtonIconOnly false 0 0 QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 0 200 0 0 #qt_calendar_nextmonth { background: transparent; border-radius: 8px; } #qt_calendar_nextmonth:hover { border: 2px solid #456789; } #qt_calendar_nextmonth:pressed { border: 2px solid #456789; background: #89abcd; } #qt_calendar_prevmonth { background: transparent; border-radius: 8px; } #qt_calendar_prevmonth:hover { border: 2px solid #456789; } #qt_calendar_prevmonth:pressed { border: 2px solid #456789; background: #89abcd; } #qt_calendar_monthbutton { background: transparent; border: 2px solid transparent; border-radius: 8px; width: 6em; } #qt_calendar_monthbutton:hover { border: 2px solid #456789; } #qt_calendar_monthbutton:pressed { border: 2px solid #456789; background: #89abcd; } #qt_calendar_yearbutton { background: transparent; border-radius: 8px; } #qt_calendar_yearbutton:hover { border: 2px solid #456789; } #qt_calendar_yearbutton:pressed { border: 2px solid #456789; background: #89abcd; } Qt::Monday false QCalendarWidget::ShortDayNames QCalendarWidget::NoVerticalHeader true 0 0 true 0 true Events 0 0 0 0 0 QAbstractItemView::NoEditTriggers true true false false false 1 4 4 4 4 View Size 1 30 Qt::Horizontal QSlider::TicksAbove 2 0 0 3 QLCDNumber::Flat Notes 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised 2 4 0 0 0 0 0 Journal Qt::Horizontal 342 20 true i Ctrl+I 75 true B Ctrl+B true u color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 0, 0, 255), stop:0.166 rgba(255, 255, 0, 255), stop:0.333 rgba(0, 255, 0, 255), stop:0.5 rgba(0, 255, 255, 255), stop:0.666 rgba(0, 0, 255, 255), stop:0.833 rgba(255, 0, 255, 255), stop:1 rgba(255, 0, 0, 255)) Color 85 16777215 3 QComboBox::AdjustToContents Small Medium Big 0 0 QFormLayout::AllNonFixedFieldsGrow 4 4 2 0 2 2 0 0 75 true Zombie 50 false I'm feeling... Qt::AlignCenter 0 0 Weight 1499.000000000000000 QSlider::groove:horizontal { border: 1px solid #999999; border-radius: 4px; height: 8px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */ background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #ff6060, stop:1 #60ff60); margin: 2px 0; } QSlider::handle:horizontal { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f); border: 1px solid #5c5c5c; width: 18px; margin: -2px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */ border-radius: 3px; } 10 5 5 Qt::Horizontal QSlider::TicksAbove 1 0 0 75 true Awesome Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 QFrame::NoFrame true 5 QLCDNumber::Flat 0 0 B.M.I. Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Bookmarks 4 4 4 4 Add Bookmark true QAbstractItemView::SingleSelection QAbstractItemView::SelectRows true true Starts Notes Remove Bookmark 0 1 0 0 0 0 0 0 QFrame::StyledPanel QFrame::Raised QFrame::StyledPanel QFrame::Sunken 2 2 0 2 0 QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } Flags true true Qt::ToolButtonTextBesideIcon false Qt::DownArrow 12 QLayout::SetMaximumSize QToolButton { background: transparent; border-radius: 8px; border: 2px solid transparent; } QToolButton:hover { border: 2px solid #456789; } QToolButton:pressed { border: 2px solid #456789; background-color: #89abcd; } Graphs true Qt::ToolButtonTextBesideIcon false Qt::DownArrow 0 0 Drop down this list to show/hide available graphs. QComboBox::AdjustToContentsOnFirstShow 20 20 false sleepyhead-0.9.8/sleepyhead/welcome.cpp0000644000175000017500000003120412412506713017500 0ustar sergiosergio/* Welcome Page Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include #include #include "SleepLib/profiles.h" QString GenerateWelcomeHTML() { QList cpap_machines = p_profile->GetMachines(MT_CPAP); QList oximeters = p_profile->GetMachines(MT_OXIMETER); QList mach; mach.append(cpap_machines); mach.append(oximeters); bool havecpapdata = false; bool haveoximeterdata = false; for (int i=0; i < cpap_machines.size(); ++i) { int daysize = cpap_machines[i]->day.size(); if (daysize > 0) { havecpapdata = true; break; } } for (int i=0; i < oximeters.size(); ++i) { int daysize = oximeters[i]->day.size(); if (daysize > 0) { haveoximeterdata = true; break; } } QString html = QString("")+ "" "" "" "" "" ""; html += "
    "; html += QString("
    ") + "" "

    " + QObject::tr("Welcome to SleepyHead") + "

    " + ""; int cols=2; if (havecpapdata || haveoximeterdata) cols=4; html+=QString("" "" "" "" ""; if (havecpapdata || haveoximeterdata) { html += "" ""; } html += "
    ").arg(cols)+ ""+((havecpapdata || haveoximeterdata) ? QObject::tr("What would you like to do?") : QObject::tr("Please Import Some Data")) +"
    " "" "" "

    " + QObject::tr("CPAP
    Importer")+"
    " "
    " "" "" "

    " + QObject::tr("Oximetery
    Wizard")+"
    " "
    "+QObject::tr("or")+"" "" "" "

    " + QObject::tr("View
    Statistics")+"
    " "
    "; if (!havecpapdata && !haveoximeterdata) { html += "

    " + QObject::tr("It might be a good idea to check preferences first,
    as there are some options that affect import.")+"

    " "

    " + QObject::tr("First import can take a few minutes.") + "

    "; } else { QDate date = p_profile->LastDay(MT_CPAP); Day *day = p_profile->GetDay(date, MT_CPAP); if (havecpapdata && day) { QString cpapimage = ""; Machine * cpap = day->machine(MT_CPAP); if (cpap) { cpapimage = "qrc"+cpap->getPixmapPath(); } html += "

    "; html+="
    "+ QString("
    ").arg(date.toString(Qt::ISODate))+""+ QObject::tr("The last time you used your %1...").arg(cpap->brand()+" "+cpap->model())+"
    "; int daysto = date.daysTo(QDate::currentDate()); QString daystring; if (daysto == 1) daystring += QObject::tr("last night"); else if (daysto == 2) daystring += QObject::tr("yesterday"); else daystring += QObject::tr("%2 days ago").arg(date.daysTo(QDate::currentDate())); html += QObject::tr("was %1 (on %2)").arg(daystring).arg(date.toString(Qt::SystemLocaleLongDate)) + "
    "; EventDataType hours = day->hours(); EventDataType ahi=(day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count(CPAP_ClearAirway) + day->count(CPAP_Apnea)) / hours; QString ahitext; if (ahi < 0.000001) ahitext = QString("")+QObject::tr("perfect :)")+""; else if (ahi < 1) ahitext = QObject::tr("pretty darn good"); else if (ahi < 3) ahitext = QObject::tr("reasonably good"); else if (ahi < 5) ahitext = QObject::tr("technically \"treated\""); else if (ahi < 10) ahitext = QString("")+QObject::tr("not very good")+""; else ahitext = QString("")+QObject::tr("horrible, please consult your doctor")+""; html += QObject::tr("You had an AHI of %1, which is considered %2").arg(ahi,0,'f',2).arg(ahitext)+"
    "; int seconds = int(hours * 3600.0) % 60; int minutes = int(hours * 60) % 60; int hour = hours; QString timestr = QObject::tr("%1 hours, %2 minutes and %3 seconds").arg(hour).arg(minutes).arg(seconds); if (hours > 4) html += QObject::tr("You machine was on for %1.").arg(timestr)+"
    "; else html += QObject::tr("You only had the mask on for %1.").arg(timestr)+"
    "; EventDataType lat = day->timeAboveThreshold(CPAP_Leak, p_profile->cpap->leakRedline())/ 60.0; EventDataType leaks = 1.0/hours * lat; EventDataType leakmax = day->Max(CPAP_Leak); QString leaktext; if (leaks < 0.000001) leaktext=QObject::tr("You had no major mask leaks (maximum was %1 %2).").arg(leakmax,0,'f',2).arg(schema::channel[CPAP_Leak].units()); else if (leaks < 0.01) leaktext=QObject::tr("You had a small but acceptable amount of major mask leakage."); else if (leaks < 0.10) leaktext=QObject::tr("You had significant periods of major mask leakage."); else leaktext=QObject::tr("Your mask is leaking way too much.. Talk to your CPAP advisor."); html += leaktext + "
    "; CPAPMode cpapmode = (CPAPMode)(int)day->settings_max(CPAP_Mode); double perc= p_profile->general->prefCalcPercentile(); if (cpapmode == MODE_CPAP) { EventDataType pressure = day->settings_max(CPAP_Pressure); html += QObject::tr("Your CPAP machine blasted you with a constant %1%2 of air").arg(pressure).arg(schema::channel[CPAP_Pressure].units()); } else if (cpapmode == MODE_APAP) { EventDataType pressure = day->percentile(CPAP_Pressure, perc/100.0); html += QObject::tr("Your pressure was under %1%2 for %3% of the time.").arg(pressure).arg(schema::channel[CPAP_Pressure].units()).arg(perc); } else if (cpapmode == MODE_BILEVEL_FIXED) { EventDataType ipap = day->settings_max(CPAP_IPAP); EventDataType epap = day->settings_min(CPAP_EPAP); html += QObject::tr("Your machine blasted you with a constant %1-%2 %3 of air.").arg(epap).arg(ipap).arg(schema::channel[CPAP_Pressure].units()); } else if (cpapmode == MODE_BILEVEL_AUTO_FIXED_PS) { EventDataType ipap = day->percentile(CPAP_IPAP, perc/100.0); EventDataType epap = day->percentile(CPAP_EPAP, perc/100.0); html += QObject::tr("Your machine was under %1-%2 %3 for %4% of the time.").arg(epap).arg(ipap).arg(schema::channel[CPAP_Pressure].units()).arg(perc); } else if (cpapmode == MODE_ASV){ EventDataType ipap = day->percentile(CPAP_IPAP, perc/100.0); EventDataType epap = qRound(day->settings_wavg(CPAP_EPAP)); html += QObject::tr("Your EPAP pressure fixed at %1%2.").arg(epap).arg(schema::channel[CPAP_EPAP].units())+"
    "; html += QObject::tr("Your IPAP pressure was under %1%2 for %3% of the time.").arg(ipap).arg(schema::channel[CPAP_IPAP].units()).arg(perc); } else if (cpapmode == MODE_ASV_VARIABLE_EPAP){ EventDataType ipap = day->percentile(CPAP_IPAP, perc/100.0); EventDataType epap = day->percentile(CPAP_EPAP, perc/100.0); html += QObject::tr("Your EPAP pressure was under %1%2 for %3% of the time.").arg(epap).arg(schema::channel[CPAP_EPAP].units()).arg(perc)+"
    "; html += QObject::tr("Your IPAP pressure was under %1%2 for %3% of the time.").arg(ipap).arg(schema::channel[CPAP_IPAP].units()).arg(perc); } html+="
    "; } else { html += "

    "+QObject::tr("No CPAP data has been imported yet.")+"

    "; } if (haveoximeterdata) { QDate oxidate=p_profile->LastDay(MT_OXIMETER); int daysto = oxidate.daysTo(QDate::currentDate()); html += "

    "+QObject::tr("Most recent Oximetery data: %1 ").arg(oxidate.toString(Qt::SystemLocaleLongDate)).arg(oxidate.toString(Qt::ISODate)); if (daysto == 1) html += QObject::tr("(last night)"); else if (daysto == 2) html += QObject::tr("(yesterday)"); else html += QObject::tr("(%2 day ago)").arg(oxidate.daysTo(QDate::currentDate())); html+="

    "; } else { html += "

    "+QObject::tr("No oximetery data has been imported yet.")+"

    "; } } html += QString("
    ")+ "" "" "" "" "" "
    "+QObject::tr("Very Important Warning")+"
    "+ QObject::tr("

    ALWAYS write protect CPAP SDCards before inserting them into your computer.")+"

    "+ QObject::tr("

    Certain operating systems write index files to the card without asking, which can render your card unreadable by your cpap machine.")+"

    "+ QObject::tr("

    As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!

    ")+ "
    " "
    " "" ""; return html; } sleepyhead-0.9.8/sleepyhead/preferencesdialog.ui0000644000175000017500000031767012412506713021377 0ustar sergiosergio PreferencesDialog Qt::ApplicationModal 0 0 824 610 0 0 Preferences :/icons/preferences.png:/icons/preferences.png true true 4 4 4 4 4 1 &Import 4 4 4 4 4 Session Splitting Settings 4 0 4 0 0 <html><head/><body><p><span style=" font-weight:600;">Attention ResMed users:</span> There are some pitfalls you may want to consider before trying to split sessions away from ResMed's 12:00 noon day model, click <a href="http://sleepyhead.sf.net/wiki/index.php/Resmed_Session_Splitting">here</a> for more information.</p></body></html> true true Combine Close Sessions Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Minutes Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Multiple sessions closer together than this value will be kept on the same day. 0 240 10 30 0 Qt::Horizontal false false QSlider::TicksAbove 10 QFrame::Box 5 QLCDNumber::Flat Ignore Short Sessions Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Minutes Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> 90 5 Qt::Horizontal QSlider::TicksAbove 5 QFrame::Box QLCDNumber::Flat Day Split Time Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter Sessions starting before this time will go to the previous calendar day. QAbstractSpinBox::UpDownArrows 12 0 0 2000 1 1 Qt::Horizontal QSizePolicy::Minimum 10 20 <html><head/><body><p><span style=" font-weight:600;">This setting should be used with caution...</span> Switching it off comes with consequences involving accuracy of summary only days, as certain calculations only work properly provided summary only sessions that came from individual day records are kept together. </p><p><span style=" font-weight:600;">ResMed users:</span> Just because it seems natural to you and I that the 12 noon session restart should be in the previous day, does not mean ResMed's data agrees with us. The STF.edf summary index format has serious weaknesses that make doing this not a good idea.</p><p>This option exists to pacify those who don't care and want to see this &quot;fixed&quot; no matter the costs, but know it comes with a cost. If you keep your SD card in every night, and import at least once a week, and you won't see problems with this very often.</p></body></html> Don't Split Summary Days (Warning: read the tooltip!) Qt::Horizontal 40 20 0 0 Session Storage Options 4 9 4 0 0 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> true Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Compress SD Card Backups (slower first import, but makes backups smaller) true The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. true This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) Create SD Card Backups during Import (Turn this off at your own peril!) 0 0 0 Do not import sessions older than: Sessions older than this date will not be imported true true 2099 12 31 1970 1 2 QDateTimeEdit::DaySection dd MMMM yyyy true Qt::Horizontal 40 20 Memory and Startup Options <html><head/><body><p>Makes starting SleepyHead a bit slower, by pre-loading all the summary data in advance, which speeds up overview browsing and a few other calculations later on. </p><p>If you have a large amount of data, it might be worth keeping this switched off, but if you typically like to view <span style=" font-style:italic;">everything</span> in overview, all the summary data still has to be loaded anyway. </p><p>Note this setting doesn't affect waveform and event data, which is always demand loaded as needed.</p></body></html> Pre-Load all summary data at startup <html><head/><body><p>This setting keeps waveform and event data in memory after use to speed up revisiting days.</p><p>This is not really a necessary option, as your operating system caches previously used files too.</p><p>Recommendation is to leave it switched off, unless your computer has a ton of memory.</p></body></html> Keep Waveform/Event data in memory <html><head/><body><p>Cuts down on any unimportant confirmation dialogs during import.</p></body></html> Import without asking for confirmation Bypass the login screen and load the most recent User Profile Skip user selection screen Qt::Vertical 20 40 &CPAP 4 4 4 4 4 0 0 General CPAP and Related Settings 0 0 Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. hours 1 8.000000000000000 4.000000000000000 0 0 User definable threshold considered large leak L/min 1 Show flags for machine detected events that haven't been identified yet. Enable Unknown Events Channels 0 0 AHI RDI AHI/Hour Graph Time Window Preferred major event index Compliance defined as 0 0 Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. minutes 5 999 60 50 false Whether to show the leak redline in the leak graph Flag leaks over threshold Reset the counter to zero at beginning of each (time) window. Zero Reset Qt::Vertical 20 40 0 0 CPAP Clock Drift 4 4 4 4 4 -59 59 0 -99 Seconds 0 0 <html><head/><body><p>Note: This is not intended for timezone corrections! Make sure your operating system clock and timezone is set correctly.</p></body></html> true -9999 9999 Minutes Hours Qt::Vertical 20 40 0 0 Changes to the following settings needs a restart, but not a recalc. Preferred Calculation Methods Upper Percentile Maximum Calcs For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. % 1 0 0 Middle Calculations Median is recommended for ResMed users. Median Weighted Average Normal Average 0 0 140 0 <html><head/><body><p>True maximum is the maximum of the data set.</p><p>99th percentile filters out the rarest outliers.</p></body></html> True Maximum 99% Percentile Combined Count divided by Total Hours Time Weighted average of Indice Standard average of indice Median Culminative Indices 0 0 Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Custom CPAP User Event Flagging false true 4 9 4 4 4 s 10.000000000000000 % 10.000000000000000 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Resync Machine Detected Events (Experimental) #2 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Flow Restriction 0 0 true <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true 0 0 Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. % 10.000000000000000 Show in Event Breakdown Piechart Duration of airflow restriction s 1.000000000000000 10.000000000000000 #1 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Allow duplicates near machine events. 0 0 Event Duration &Oximetry 4 2 2 2 2 Oximetery Settings false 4 8 4 4 5 Other oximetry options % bpm Small chunks of oximetry data under this amount will be discarded. s 300 Discard segments under Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter bpm Flag SPO2 Desaturations Below Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Flag Pulse Rate Below Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Flag Pulse Rate Above Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Flag rapid changes in oximetry stats 0 0 SPO2 Minimum duration of drop in oxygen saturation s 0 Sudden change in Pulse Rate of at least this amount bpm 0 1.000000000000000 Minimum duration of pulse change event. s 0 0 0 Pulse Percentage drop in oxygen saturation % 0 1.000000000000000 Qt::Vertical 20 40 300 0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> Events 4 0 0 0 0 Search 0 0 Reset &Defaults 0 0 <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Waveforms 4 0 0 0 0 Search 0 0 Reset &Defaults 0 0 <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter &General 4 4 4 4 4 General Settings 4 4 4 4 4 Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. Enable Multithreading Qt::Vertical Qt::Horizontal 0 0 Automatically Check For Updates true 0 0 Check for new version every Sourceforge hosts this project for free.. Please be considerate of their resources.. 90 0 0 days. Qt::Horizontal 40 20 0 0 255 0 0 255 118 118 117 50 false false true &Check for Updates now Qt::ToolButtonTextOnly true 0 0 Last Checked For Updates: 0 0 TextLabel Qt::Horizontal 40 20 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> I want to try experimental and test builds (Advanced users only please.) Qt::Vertical 20 40 &Appearance 4 2 2 2 2 8 0 0 Graph Settings Bar Tops Line Chart Overview Linecharts Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Qt::Vertical 20 40 <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> 25 1 5 Qt::Horizontal false QSlider::TicksBelow 1 milliseconds QFrame::StyledPanel 3 QLCDNumber::Flat How long you want the tooltips to stay visible. 1 150 10 50 1 Qt::Horizontal QSlider::TicksBelow 10 QFrame::StyledPanel 5 QLCDNumber::Flat Scroll Dampening Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Tooltip Timeout Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Default display height of graphs in pixels 50 600 10 180 Graph Tooltips 0 0 The visual method of displaying waveform overlay flags. Standard Bars Top Markers Graph Height Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Overlay Flags Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Line Thickness Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter The pixel thickness of line plots 2 8 1 Qt::Horizontal QSlider::TicksBelow QFrame::Sunken 1 0 Qt::Vertical 0 0 Other Visual Settings Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. Use Anti-Aliasing Makes certain plots look more "square waved". Square Wave Plots Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. Show event breakdown pie chart Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. Use Pixmap Caching <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> Animations && Fancy Stuff Daily view navigation buttons will skip over days without data records Skip over Empty Days Whether to allow changing yAxis scales by double clicking on yAxis labels Allow YAxis Scaling Qt::Horizontal Fonts (Application wide settings) false 0 4 0 4 0 0 75 true Font 0 0 75 true Size 0 0 75 true Bold Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter 0 0 75 true Italic 0 0 Application 80 16777215 6 30 10 0 0 Qt::LeftToRight 0 0 0 0 Graph Text 80 16777215 6 40 11 0 0 0 0 0 0 Graph Titles 80 16777215 6 40 14 0 0 0 0 0 0 Big Text 80 16777215 6 72 18 0 0 0 0 75 true Details Qt::Vertical 20 40 0 0 0 0 Qt::Horizontal 40 20 &Cancel &Ok cancelButton clicked() PreferencesDialog reject() 757 605 286 274 sleepyhead-0.9.8/sleepyhead/sessionbar.h0000644000175000017500000000340612412506713017665 0ustar sergiosergio/* SessionBar Graph Header * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #ifndef SESSIONBAR_H #define SESSIONBAR_H #include #include #include #include #include "SleepLib/session.h" typedef qint64 SegType; class SBSeg { public: SBSeg(); SBSeg(Session *sess, QColor col); // SBSeg(const SBSeg & a); QColor color; bool highlight; Session *session; }; class SessionBar : public QWidget { Q_OBJECT public: SessionBar(QWidget *parent = 0); // // Q_DECLARE_METATYPE requires a copy-constructor // SessionBar(const SessionBar &); virtual ~SessionBar(); void clear() { segments.clear(); m_selectIDX = -1; } void add(Session *sess, QColor col) { if (sess) { segments.push_back(SBSeg(sess, col)); } } void setSelectMode(bool b) { m_selectMode = b; } void setSelectColor(QColor col) { m_selectColor = col; } int count() { return segments.size(); } int selected() { return m_selectIDX; } Session * session(int idx) { Q_ASSERT(idx < segments.size()); return segments[idx].session; } void setSelected(int idx) { m_selectIDX = idx; } protected slots: void updateTimer(); signals: void sessionClicked(Session *sess); protected: void paintEvent(QPaintEvent *event); void mouseMoveEvent(QMouseEvent *); void mousePressEvent(QMouseEvent *); SegType min(); SegType max(); QVector segments; QTimer timer; int m_selectIDX; bool m_selectMode; QColor m_selectColor; }; //Q_DECLARE_METATYPE(SessionBar) #endif sleepyhead-0.9.8/sleepyhead/overview.cpp0000644000175000017500000006750412412506713017727 0ustar sergiosergio/* Overview GUI Implementation * * Copyright (c) 2011-2014 Mark Watkins * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of the Linux * distribution for more details. */ #include #include //#include #include #include #include #include #include //#include #include "SleepLib/profiles.h" #include "overview.h" #include "ui_overview.h" #include "common_gui.h" #include "Graphs/gXAxis.h" #include "Graphs/gLineChart.h" #include "Graphs/gYAxis.h" #include "mainwindow.h" extern MainWindow *mainwin; //extern QProgressBar * qprogress; Overview::Overview(QWidget *parent, gGraphView *shared) : QWidget(parent), ui(new Ui::Overview), m_shared(shared) { ui->setupUi(this); // Set Date controls locale to 4 digit years QLocale locale = QLocale::system(); QString shortformat = locale.dateFormat(QLocale::ShortFormat); if (!shortformat.toLower().contains("yyyy")) { shortformat.replace("yy", "yyyy"); } ui->dateStart->setDisplayFormat(shortformat); ui->dateEnd->setDisplayFormat(shortformat); Qt::DayOfWeek dow = firstDayOfWeekFromLocale(); ui->dateStart->calendarWidget()->setFirstDayOfWeek(dow); ui->dateEnd->calendarWidget()->setFirstDayOfWeek(dow); // Stop both calendar drop downs highlighting weekends in red QTextCharFormat format = ui->dateStart->calendarWidget()->weekdayTextFormat(Qt::Saturday); format.setForeground(QBrush(COLOR_Black, Qt::SolidPattern)); ui->dateStart->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format); ui->dateStart->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format); ui->dateEnd->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format); ui->dateEnd->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format); // Connect the signals to update which days have CPAP data when the month is changed connect(ui->dateStart->calendarWidget(), SIGNAL(currentPageChanged(int, int)), SLOT(dateStart_currentPageChanged(int, int))); connect(ui->dateEnd->calendarWidget(), SIGNAL(currentPageChanged(int, int)), SLOT(dateEnd_currentPageChanged(int, int))); QVBoxLayout *framelayout = new QVBoxLayout; ui->graphArea->setLayout(framelayout); QFrame *border = new QFrame(ui->graphArea); framelayout->setMargin(1); border->setFrameShape(QFrame::StyledPanel); framelayout->addWidget(border,1); // Create the horizontal layout to hold the GraphView object and it's scrollbar layout = new QHBoxLayout(border); layout->setSpacing(0); // remove the ugly margins/spacing layout->setMargin(0); layout->setContentsMargins(0, 0, 0, 0); border->setLayout(layout); border->setAutoFillBackground(false); // Create the GraphView Object GraphView = new gGraphView(ui->graphArea, m_shared); GraphView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); GraphView->setEmptyText(STR_Empty_NoData); // Create the custom scrollbar and attach to GraphView scrollbar = new MyScrollBar(ui->graphArea); scrollbar->setOrientation(Qt::Vertical); scrollbar->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding); scrollbar->setMaximumWidth(20); GraphView->setScrollBar(scrollbar); // Add the graphView and scrollbar to the layout. layout->addWidget(GraphView, 1); layout->addWidget(scrollbar, 0); layout->layout(); dateLabel = new MyLabel(this); dateLabel->setAlignment(Qt::AlignVCenter); dateLabel->setText("[Date Widget]"); QFont font = dateLabel->font(); font.setPointSizeF(font.pointSizeF()*1.3F); dateLabel->setFont(font); QPalette palette = dateLabel->palette(); palette.setColor(QPalette::Base, Qt::blue); dateLabel->setPalette(palette); ui->dateLayout->addWidget(dateLabel,1); // uc = new SummaryChart(STR_UNIT_Hours, GT_BAR); // uc->addSlice(NoChannel, COLOR_Green, ST_HOURS); // UC->AddLayer(uc); /* return; // TODO: Automate graph creation process float percentile = p_profile->general->prefCalcPercentile() / 100.0; int mididx = p_profile->general->prefCalcMiddle(); SummaryType ST_mid; if (mididx == 0) { ST_mid = ST_PERC; } if (mididx == 1) { ST_mid = ST_WAVG; } if (mididx == 2) { ST_mid = ST_AVG; } SummaryType ST_max = p_profile->general->prefCalcMax() ? ST_PERC : ST_MAX; const EventDataType maxperc = 0.995F; US = createGraph(STR_GRAPH_SessionTimes, tr("Session Times"), tr("Session Times\n(hours)"), YT_Time); SET = createGraph("Settings", STR_TR_Settings, STR_TR_Settings); TGMV = createGraph(schema::channel[CPAP_TgMV].code(), schema::channel[CPAP_TgMV].label(), tr("Target\nVentilation\n(L/min)")); PTB = createGraph(schema::channel[CPAP_PTB].code(), schema::channel[CPAP_PTB].label(), tr("Patient\nTriggered\nBreaths\n(%)")); SES = createGraph(STR_GRAPH_Sessions, STR_TR_Sessions, STR_TR_Sessions + tr("\n(count)")); ahihr = new SummaryChart(STR_UNIT_EventsPerHour, GT_POINTS); ahihr->addSlice(ahicode, COLOR_Blue, ST_MAX); ahihr->addSlice(ahicode, COLOR_Orange, ST_WAVG); AHIHR->AddLayer(ahihr); weight = new SummaryChart(STR_TR_Weight, GT_POINTS); weight->setMachineType(MT_JOURNAL); weight->addSlice(Journal_Weight, COLOR_Black, ST_SETAVG); WEIGHT->AddLayer(weight); bmi = new SummaryChart(STR_TR_BMI, GT_POINTS); bmi->setMachineType(MT_JOURNAL); bmi->addSlice(Journal_BMI, COLOR_DarkBlue, ST_SETAVG); BMI->AddLayer(bmi); zombie = new SummaryChart(tr("Zombie Meter"), GT_POINTS); zombie->setMachineType(MT_JOURNAL); zombie->addSlice(Journal_ZombieMeter, COLOR_DarkRed, ST_SETAVG); ZOMBIE->AddLayer(zombie); pulse = new SummaryChart(STR_TR_PulseRate, GT_POINTS); pulse->setMachineType(MT_OXIMETER); pulse->addSlice(OXI_Pulse, COLOR_Red, ST_mid, 0.5); pulse->addSlice(OXI_Pulse, COLOR_Pink, ST_MIN); pulse->addSlice(OXI_Pulse, COLOR_Orange, ST_MAX); PULSE->AddLayer(pulse); spo2 = new SummaryChart(STR_TR_SpO2, GT_POINTS); spo2->setMachineType(MT_OXIMETER); spo2->addSlice(OXI_SPO2, COLOR_Cyan, ST_mid, 0.5); spo2->addSlice(OXI_SPO2, COLOR_LightBlue, ST_PERC, percentile); spo2->addSlice(OXI_SPO2, COLOR_Blue, ST_MIN); SPO2->AddLayer(spo2); fl = new SummaryChart(STR_TR_FL, GT_POINTS); fl->addSlice(CPAP_FlowLimit, COLOR_Brown, ST_CPH); FL->AddLayer(fl); sa = new SummaryChart(STR_TR_SA, GT_POINTS); sa->addSlice(CPAP_SensAwake, COLOR_Brown, ST_CNT); SA->AddLayer(sa); us = new SummaryChart(STR_UNIT_Hours, GT_SESSIONS); us->addSlice(NoChannel, COLOR_DarkBlue, ST_HOURS); us->addSlice(NoChannel, COLOR_Blue, ST_SESSIONS); US->AddLayer(us); ses = new SummaryChart(STR_TR_Sessions, GT_POINTS); ses->addSlice(NoChannel, COLOR_Blue, ST_SESSIONS); SES->AddLayer(ses); if (ahicode == CPAP_RDI) { bc = new SummaryChart(STR_TR_RDI, GT_BAR); } else { bc = new SummaryChart(STR_TR_AHI, GT_BAR); } bc->addSlice(CPAP_ClearAirway, COLOR_ClearAirway, ST_CPH); bc->addSlice(CPAP_Obstructive, COLOR_Obstructive, ST_CPH); bc->addSlice(CPAP_Apnea, COLOR_Apnea, ST_CPH); bc->addSlice(CPAP_Hypopnea, COLOR_Hypopnea, ST_CPH); if (p_profile->general->calculateRDI()) { bc->addSlice(CPAP_RERA, COLOR_RERA, ST_CPH); } // bc->addSlice(CPAP_UserFlag1, COLOR_UserFlag1, ST_CPH); // bc->addSlice(CPAP_UserFlag2, COLOR_UserFlag2, ST_CPH); AHI->AddLayer(bc); set = new SummaryChart("", GT_POINTS); //set->addSlice(PRS1_SysOneResistSet,COLOR_Gray,ST_SETAVG); set->addSlice(CPAP_HumidSetting, COLOR_Blue, ST_SETWAVG); set->addSlice(CPAP_PresReliefLevel, COLOR_Red, ST_SETWAVG); set->addSlice(CPAP_PresReliefMode, COLOR_Red, ST_SETWAVG); // set->addSlice(RMS9_EPRLevel,COLOR_Green,ST_SETWAVG); //set->addSlice(INTP_SmartFlex,COLOR_Purple,ST_SETWAVG); SET->AddLayer(set); rr = new SummaryChart(tr("breaths/min"), GT_POINTS); rr->addSlice(CPAP_RespRate, COLOR_LightBlue, ST_MIN); rr->addSlice(CPAP_RespRate, COLOR_Blue, ST_mid, 0.5); rr->addSlice(CPAP_RespRate, COLOR_LightGreen, ST_PERC, percentile); rr->addSlice(CPAP_RespRate, COLOR_Green, ST_max, maxperc); // rr->addSlice(CPAP_RespRate,COLOR_Green,ST_MAX); RR->AddLayer(rr); tv = new SummaryChart(tr("L/b"), GT_POINTS); tv->addSlice(CPAP_TidalVolume, COLOR_LightBlue, ST_MIN); tv->addSlice(CPAP_TidalVolume, COLOR_Blue, ST_mid, 0.5); tv->addSlice(CPAP_TidalVolume, COLOR_LightGreen, ST_PERC, percentile); tv->addSlice(CPAP_TidalVolume, COLOR_Green, ST_max, maxperc); TV->AddLayer(tv); mv = new SummaryChart(STR_UNIT_LPM, GT_POINTS); mv->addSlice(CPAP_MinuteVent, COLOR_LightBlue, ST_MIN); mv->addSlice(CPAP_MinuteVent, COLOR_Blue, ST_mid, 0.5); mv->addSlice(CPAP_MinuteVent, COLOR_LightGreen, ST_PERC, percentile); mv->addSlice(CPAP_MinuteVent, COLOR_Green, ST_max, maxperc); MV->AddLayer(mv); // should merge... tgmv = new SummaryChart(STR_UNIT_LPM, GT_POINTS); tgmv->addSlice(CPAP_TgMV, COLOR_LightBlue, ST_MIN); tgmv->addSlice(CPAP_TgMV, COLOR_Blue, ST_mid, 0.5); tgmv->addSlice(CPAP_TgMV, COLOR_LightGreen, ST_PERC, percentile); tgmv->addSlice(CPAP_TgMV, COLOR_Green, ST_max, maxperc); TGMV->AddLayer(tgmv); ptb = new SummaryChart(tr("%PTB"), GT_POINTS); ptb->addSlice(CPAP_PTB, COLOR_Yellow, ST_MIN); ptb->addSlice(CPAP_PTB, COLOR_Blue, ST_mid, 0.5); ptb->addSlice(CPAP_PTB, COLOR_LightGray, ST_PERC, percentile); ptb->addSlice(CPAP_PTB, COLOR_Orange, ST_WAVG); PTB->AddLayer(ptb); pr = new SummaryChart(STR_TR_Pressure, GT_POINTS); // Added in summarychart.. Slightly annoying.. PR->AddLayer(pr); totlk = new SummaryChart(STR_TR_TotalLeaks, GT_POINTS); totlk->addSlice(CPAP_LeakTotal, COLOR_LightBlue, ST_mid, 0.5); totlk->addSlice(CPAP_LeakTotal, COLOR_DarkGray, ST_PERC, percentile); totlk->addSlice(CPAP_LeakTotal, COLOR_Gray, ST_max, maxperc); //tot->addSlice(CPAP_Leak, COLOR_DarkBlue, ST_WAVG); //tot->addSlice(CPAP_Leak, COLOR_DarkYellow); TOTLK->AddLayer(totlk); NLL->AddLayer(nll = new SummaryChart(tr("% %1").arg(schema::channel[CPAP_LargeLeak].fullname()), GT_POINTS)); nll->addSlice(CPAP_LargeLeak, schema::channel[CPAP_LargeLeak].defaultColor(), ST_SPH); // <--- The code to the previous marker is crap AHI->setPinned(false); SES->setRecMinY(1); SET->setRecMinY(0); //SET->setRecMaxY(5); */ RebuildGraphs(false); ui->rangeCombo->setCurrentIndex(p_profile->general->lastOverviewRange()); icon_on = new QIcon(":/icons/session-on.png"); icon_off = new QIcon(":/icons/session-off.png"); GraphView->resetLayout(); GraphView->LoadSettings("Overview"); //no trans GraphView->setEmptyImage(QPixmap(":/docs/sheep.png")); connect(GraphView, SIGNAL(updateCurrentTime(double)), this, SLOT(on_LineCursorUpdate(double))); connect(GraphView, SIGNAL(updateRange(double,double)), this, SLOT(on_RangeUpdate(double,double))); connect(GraphView, SIGNAL(GraphsChanged()), this, SLOT(updateGraphCombo())); } Overview::~Overview() { delete ui; // delete icon_on; // delete icon_off; } void Overview::RebuildGraphs(bool reset) { qint64 minx, maxx; if (reset) { GraphView->GetXBounds(minx, maxx); } GraphView->trashGraphs(true); ChannelID ahicode = p_profile->general->calculateRDI() ? CPAP_RDI : CPAP_AHI; if (ahicode == CPAP_RDI) { AHI = createGraph("AHIBreakdown", STR_TR_RDI, tr("Respiratory\nDisturbance\nIndex")); } else { AHI = createGraph("AHIBreakdown", STR_TR_AHI, tr("Apnea\nHypopnea\nIndex")); } ahi = new gAHIChart(); AHI->AddLayer(ahi); UC = createGraph(STR_GRAPH_Usage, tr("Usage"), tr("Usage\n(hours)")); UC->AddLayer(uc = new gUsageChart()); STG = createGraph("New Session", tr("Session Times"), tr("Session Times"), YT_Time); stg = new gSessionTimesChart(); STG->AddLayer(stg); PR = createGraph("Pressure Settings", STR_TR_Pressure, STR_TR_Pressure + "\n(" + STR_UNIT_CMH2O + ")"); pres = new gPressureChart(); PR->AddLayer(pres); TTIA = createGraph("TTIA", tr("Total Time in Apnea"), tr("Total Time in Apnea\n(Minutes)")); ttia = new gTTIAChart(); TTIA->AddLayer(ttia); // LK = createGraph("Leaks", STR_TR_Leaks, STR_TR_UnintentionalLeaks + "\n(" + STR_UNIT_LPM + ")"); // LK->AddLayer(new gSummaryChart(CPAP_Leak, MT_CPAP)); // TOTLK = createGraph("TotalLeaks", STR_TR_TotalLeaks, STR_TR_TotalLeaks + "\n(" + STR_UNIT_LPM + ")"); // TOTLK->AddLayer(new gSummaryChart(CPAP_LeakTotal, MT_CPAP)); // NLL = createGraph("TimeInLL", tr("% in %1").arg(schema::channel[CPAP_LargeLeak].label()), tr("Large Leaks\n(% of night)")); // NLL->AddLayer(nll = new gSummaryChart("TimeInLL", MT_CPAP)); // nll->addCalc(CPAP_LargeLeak, ST_SPH); // RR = createGraph(schema::channel[CPAP_RespRate].code(), schema::channel[CPAP_RespRate].label(), schema::channel[CPAP_RespRate].fullname()+"\n"+schema::channel[CPAP_RespRate].units()); // RR->AddLayer(new gSummaryChart(CPAP_RespRate, MT_CPAP)); // TV = createGraph(schema::channel[CPAP_TidalVolume].code(),schema::channel[CPAP_TidalVolume].label(), tr("Tidal\nVolume\n(ml)")); // TV->AddLayer(new gSummaryChart(CPAP_TidalVolume, MT_CPAP)); // MV = createGraph(schema::channel[CPAP_MinuteVent].code(), schema::channel[CPAP_MinuteVent].label(), tr("Minute\nVentilation\n(L/min)")); // MV->AddLayer(new gSummaryChart(CPAP_MinuteVent, MT_CPAP)); // FL = createGraph(schema::channel[CPAP_FLG].code(), schema::channel[CPAP_FLG].label(), STR_TR_FlowLimit); // FL->AddLayer(new gSummaryChart(CPAP_FLG, MT_CPAP)); // SN = createGraph(schema::channel[CPAP_Snore].code(), schema::channel[CPAP_Snore].label(), schema::channel[CPAP_Snore].fullname()+"\n"+schema::channel[CPAP_Snore].units()); // SN->AddLayer(new gSummaryChart(CPAP_Snore, MT_CPAP)); QHash::iterator chit; QHash::iterator chit_end = schema::channel.channels.end(); for (chit = schema::channel.channels.begin(); chit != chit_end; ++chit) { schema::Channel * chan = chit.value(); if (chan->showInOverview()) { ChannelID code = chan->id(); QString name = chan->fullname(); if (name.length() > 16) name = chan->label(); gGraph *G = createGraph(chan->code(), name, chan->description()); if ((chan->type() == schema::FLAG) || (chan->type() == schema::MINOR_FLAG)) { gSummaryChart * sc = new gSummaryChart(chan->code(), MT_CPAP); sc->addCalc(code, ST_CPH, schema::channel[code].defaultColor()); G->AddLayer(sc); } else if (chan->type() == schema::SPAN) { gSummaryChart * sc = new gSummaryChart(chan->code(), MT_CPAP); sc->addCalc(code, ST_SPH, schema::channel[code].defaultColor()); G->AddLayer(sc); } else if (chan->type() == schema::WAVEFORM) { G->AddLayer(new gSummaryChart(code, chan->machtype())); } else if (chan->type() == schema::UNKNOWN) { gSummaryChart * sc = new gSummaryChart(chan->code(), MT_CPAP); sc->addCalc(code, ST_CPH, schema::channel[code].defaultColor()); G->AddLayer(sc); } } } /* PULSE = createGraph(schema::channel[OXI_Pulse].code(), schema::channel[OXI_Pulse].label(), STR_TR_PulseRate + "\n(" + STR_UNIT_BPM + ")"); PULSE->AddLayer(new gSummaryChart(OXI_Pulse, MT_OXIMETER)); SPO2 = createGraph(schema::channel[OXI_SPO2].code(), schema::channel[OXI_SPO2].label(), tr("Oxygen Saturation\n(%)")); SPO2->AddLayer(new gSummaryChart(OXI_SPO2, MT_OXIMETER)); NPB = createGraph("TimeInPB", tr("% in %1").arg(schema::channel[CPAP_CSR].label()), tr("%1\n(% of night)").arg(schema::channel[CPAP_LargeLeak].description())); NPB->AddLayer(npb = new gSummaryChart(tr("% PB"), MT_CPAP)); npb->addCalc(CPAP_CSR, ST_SPH); if (ahicode == CPAP_RDI) { AHIHR = createGraph(STR_GRAPH_PeakAHI, tr("Peak RDI"), tr("Peak RDI\nShows RDI Clusters\n(RDI/hr)")); AHIHR->AddLayer(new gSummaryChart(CPAP_RDI, MT_CPAP)); } else { AHIHR = createGraph(STR_GRAPH_PeakAHI, tr("Peak AHI"), tr("Peak AHI\nShows AHI Clusters\n(AHI/hr)")); AHIHR->AddLayer(new gSummaryChart(CPAP_AHI, MT_CPAP)); } */ WEIGHT = createGraph(STR_GRAPH_Weight, STR_TR_Weight, STR_TR_Weight, YT_Weight); BMI = createGraph(STR_GRAPH_BMI, STR_TR_BMI, tr("Body\nMass\nIndex")); ZOMBIE = createGraph(STR_GRAPH_Zombie, STR_TR_Zombie, tr("How you felt\n(0-10)")); if (reset) { // GraphView->setDay(nullptr); GraphView->resetLayout(); GraphView->setDay(nullptr); // GraphView->resetLayout(); GraphView->SetXBounds(minx, maxx, 0, false); GraphView->resetLayout(); updateGraphCombo(); } } void Overview::closeEvent(QCloseEvent *event) { GraphView->SaveSettings("Overview");//no trans disconnect(this, SLOT(dateStart_currentPageChanged(int, int))); disconnect(this, SLOT(dateEnd_currentPageChanged(int, int))); QWidget::closeEvent(event); } gGraph *Overview::createGraph(QString code, QString name, QString units, YTickerType yttype) { int default_height = p_profile->appearance->graphHeight(); gGraph *g = new gGraph(code, GraphView, name, units, default_height, 0); gYAxis *yt; switch (yttype) { case YT_Time: yt = new gYAxisTime(true); // Time scale break; case YT_Weight: yt = new gYAxisWeight(p_profile->general->unitSystem()); break; default: yt = new gYAxis(); // Plain numeric scale break; } g->AddLayer(yt, LayerLeft, gYAxis::Margin); gXAxisDay *x = new gXAxisDay(); g->AddLayer(x, LayerBottom, 0, gXAxisDay::Margin); g->AddLayer(new gXGrid()); return g; } void Overview::on_LineCursorUpdate(double time) { if (time > 1) { QDateTime dt = QDateTime::fromMSecsSinceEpoch(time,Qt::UTC); QString txt = dt.toString("dd MMM yyyy (dddd)"); dateLabel->setText(txt); } else dateLabel->setText(QString(GraphView->emptyText())); } void Overview::on_RangeUpdate(double minx, double /* maxx */) { if (minx > 1) { dateLabel->setText(GraphView->getRangeString()); } else { dateLabel->setText(QString(GraphView->emptyText())); } } void Overview::ReloadGraphs() { GraphView->setDay(nullptr); updateCube(); on_rangeCombo_activated(ui->rangeCombo->currentIndex()); } void Overview::updateGraphCombo() { ui->graphCombo->clear(); gGraph *g; // ui->graphCombo->addItem("Show All Graphs"); // ui->graphCombo->addItem("Hide All Graphs"); // ui->graphCombo->addItem("---------------"); for (int i = 0; i < GraphView->size(); i++) { g = (*GraphView)[i]; if (g->isEmpty()) { continue; } if (g->visible()) { ui->graphCombo->addItem(*icon_on, g->title(), true); } else { ui->graphCombo->addItem(*icon_off, g->title(), false); } } ui->graphCombo->setCurrentIndex(0); updateCube(); } void Overview::ResetGraphs() { //qint64 st,et; //GraphView->GetXBounds(st,et); QDate start = ui->dateStart->date(); QDate end = ui->dateEnd->date(); GraphView->setDay(nullptr); updateCube(); if (start.isValid() && end.isValid()) { setRange(start, end); } //GraphView->SetXBounds(st,et); } void Overview::ResetGraph(QString name) { gGraph *g = GraphView->findGraph(name); if (!g) { return; } g->setDay(nullptr); GraphView->redraw(); } void Overview::RedrawGraphs() { GraphView->redraw(); } void Overview::UpdateCalendarDay(QDateEdit *dateedit, QDate date) { QCalendarWidget *calendar = dateedit->calendarWidget(); QTextCharFormat bold; QTextCharFormat cpapcol; QTextCharFormat normal; QTextCharFormat oxiday; bold.setFontWeight(QFont::Bold); cpapcol.setForeground(QBrush(Qt::blue, Qt::SolidPattern)); cpapcol.setFontWeight(QFont::Bold); oxiday.setForeground(QBrush(Qt::red, Qt::SolidPattern)); oxiday.setFontWeight(QFont::Bold); bool hascpap = p_profile->FindDay(date, MT_CPAP) != nullptr; bool hasoxi = p_profile->FindDay(date, MT_OXIMETER) != nullptr; //bool hasjournal=p_profile->GetDay(date,MT_JOURNAL)!=nullptr; if (hascpap) { if (hasoxi) { calendar->setDateTextFormat(date, oxiday); } else { calendar->setDateTextFormat(date, cpapcol); } } else if (p_profile->GetDay(date)) { calendar->setDateTextFormat(date, bold); } else { calendar->setDateTextFormat(date, normal); } calendar->setHorizontalHeaderFormat(QCalendarWidget::ShortDayNames); } void Overview::dateStart_currentPageChanged(int year, int month) { QDate d(year, month, 1); int dom = d.daysInMonth(); for (int i = 1; i <= dom; i++) { d = QDate(year, month, i); UpdateCalendarDay(ui->dateStart, d); } } void Overview::dateEnd_currentPageChanged(int year, int month) { QDate d(year, month, 1); int dom = d.daysInMonth(); for (int i = 1; i <= dom; i++) { d = QDate(year, month, i); UpdateCalendarDay(ui->dateEnd, d); } } void Overview::on_dateEnd_dateChanged(const QDate &date) { qint64 d1 = qint64(QDateTime(ui->dateStart->date(), QTime(0, 10, 0), Qt::UTC).toTime_t()) * 1000L; qint64 d2 = qint64(QDateTime(date, QTime(23, 0, 0), Qt::UTC).toTime_t()) * 1000L; GraphView->SetXBounds(d1, d2); ui->dateStart->setMaximumDate(date); } void Overview::on_dateStart_dateChanged(const QDate &date) { qint64 d1 = qint64(QDateTime(date, QTime(0, 10, 0), Qt::UTC).toTime_t()) * 1000L; qint64 d2 = qint64(QDateTime(ui->dateEnd->date(), QTime(23, 0, 0), Qt::UTC).toTime_t()) * 1000L; GraphView->SetXBounds(d1, d2); ui->dateEnd->setMinimumDate(date); } void Overview::on_toolButton_clicked() { qint64 d1 = qint64(QDateTime(ui->dateStart->date(), QTime(0, 10, 0), Qt::UTC).toTime_t()) * 1000L; qint64 d2 = qint64(QDateTime(ui->dateEnd->date(), QTime(23, 00, 0), Qt::UTC).toTime_t()) * 1000L; GraphView->SetXBounds(d1, d2); } //void Overview::on_printButton_clicked() //{ // mainwin->PrintReport(GraphView,STR_TR_Overview); // Must be translated the same as PrintReport checks. //} void Overview::ResetGraphLayout() { GraphView->resetLayout(); } /*void Overview::on_printDailyButton_clicked() { qint64 st,et; GraphView->GetXBounds(st,et); QDate s1=QDateTime::fromTime_t(st/1000L).date(); QDate s2=QDateTime::fromTime_t(et/1000L).date(); int len=p_profile->countDays(MT_UNKNOWN,s1,s2); if (len>7) { if (QMessageBox::question(this, "Woah!", "Do you really want to print "+QString::number(len)+" days worth of Daily reports,\n from "+s1.toString(Qt::SystemLocaleShortDate)+" to "+s2.toString(Qt::SystemLocaleShortDate)+"?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) { return; } if (len>14) { int weeks=len/7; if (QMessageBox::question(this, "Hold Up!", "We are talking about over "+QString::number(weeks)+" weeks of information.\n\nThis will likely take a very long time, and a heck of a lot of paper if your not printing to a PDF file.\n\nAre you really sure?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) { return; } if (len>31) { if (QMessageBox::question(this, "Are you serious!!??", "We are talking about printing a lot of information.\n\nIf your not printing to a PDF file, you must really hate trees.\n\nAre you really REALLY sure?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) { return; } } } mainwin->Notify("I'm not going to nag you any more, but it would probably help if I implemented this feature.. ;)"); } else mainwin->Notify("If this was implemented yet, You'd be able to print multiple daily reports right now."); }*/ void Overview::on_rangeCombo_activated(int index) { p_profile->general->setLastOverviewRange(index); ui->dateStart->setMinimumDate(p_profile->FirstDay()); ui->dateEnd->setMaximumDate(p_profile->LastDay()); QDate end = p_profile->LastDay(); QDate start; if (index == 8) { // Custom ui->dateStartLabel->setEnabled(true); ui->dateEndLabel->setEnabled(true); ui->dateEnd->setEnabled(true); ui->dateStart->setEnabled(true); ui->dateStart->setMaximumDate(ui->dateEnd->date()); ui->dateEnd->setMinimumDate(ui->dateStart->date()); return; } ui->dateEnd->setEnabled(false); ui->dateStart->setEnabled(false); ui->dateStartLabel->setEnabled(false); ui->dateEndLabel->setEnabled(false); if (index == 0) { start = end.addDays(-6); } else if (index == 1) { start = end.addDays(-13); } else if (index == 2) { start = end.addMonths(-1).addDays(1); } else if (index == 3) { start = end.addMonths(-2).addDays(1); } else if (index == 4) { start = end.addMonths(-3).addDays(1); } else if (index == 5) { start = end.addMonths(-6).addDays(1); } else if (index == 6) { start = end.addYears(-1).addDays(1); } else if (index == 7) { // Everything start = p_profile->FirstDay(); } if (start < p_profile->FirstDay()) { start = p_profile->FirstDay(); } setRange(start, end); } void Overview::setRange(QDate start, QDate end) { ui->dateEnd->blockSignals(true); ui->dateStart->blockSignals(true); ui->dateStart->setMaximumDate(end); ui->dateEnd->setMinimumDate(start); ui->dateStart->setDate(start); ui->dateEnd->setDate(end); ui->dateEnd->blockSignals(false); ui->dateStart->blockSignals(false); this->on_toolButton_clicked(); updateGraphCombo(); } void Overview::on_graphCombo_activated(int index) { if (index < 0) { return; } gGraph *g; QString s; s = ui->graphCombo->currentText(); bool b = !ui->graphCombo->itemData(index, Qt::UserRole).toBool(); ui->graphCombo->setItemData(index, b, Qt::UserRole); if (b) { ui->graphCombo->setItemIcon(index, *icon_on); } else { ui->graphCombo->setItemIcon(index, *icon_off); } g = GraphView->findGraphTitle(s); g->setVisible(b); updateCube(); GraphView->updateScale(); GraphView->redraw(); } void Overview::updateCube() { if ((GraphView->visibleGraphs() == 0)) { ui->toggleVisibility->setArrowType(Qt::UpArrow); ui->toggleVisibility->setToolTip(tr("Show all graphs")); ui->toggleVisibility->blockSignals(true); ui->toggleVisibility->setChecked(true); ui->toggleVisibility->blockSignals(false); if (ui->graphCombo->count() > 0) { GraphView->setEmptyText(STR_Empty_NoGraphs); } else { GraphView->setEmptyText(STR_Empty_NoData); } } else { ui->toggleVisibility->setArrowType(Qt::DownArrow); ui->toggleVisibility->setToolTip(tr("Hide all graphs")); ui->toggleVisibility->blockSignals(true); ui->toggleVisibility->setChecked(false); ui->toggleVisibility->blockSignals(false); } } void Overview::on_toggleVisibility_clicked(bool checked) { gGraph *g; QString s; QIcon *icon = checked ? icon_off : icon_on; //ui->toggleVisibility->setArrowType(checked ? Qt::UpArrow : Qt::DownArrow); for (int i = 0; i < ui->graphCombo->count(); i++) { s = ui->graphCombo->itemText(i); ui->graphCombo->setItemIcon(i, *icon); ui->graphCombo->setItemData(i, !checked, Qt::UserRole); g = GraphView->findGraphTitle(s); g->setVisible(!checked); } updateCube(); GraphView->updateScale(); GraphView->redraw(); } sleepyhead-0.9.8/Translations/0000755000175000017500000000000012412506713015677 5ustar sergiosergiosleepyhead-0.9.8/Translations/Francais.fr.ts0000644000175000017500000156132612412506713020421 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. impossible d'obtenir des données de l'oxymètre. Please ensure you select 'upload' from the oximeter devices menu. Merci de vérifier que vous avez selectionné 'upload' dans les menus de votre oxymetre. CMS50Serial Question Question Daily Form Formulaire Go to the previous day Aller au jour précédent Prev Prec Show or hide the calender affiche ou cache le calendrier ... ... Go to the next day Aller au jour suivant Next Suivant Go to the most recent day with data records Aller au plus récent jour avec des données Details Détails about:blank ausujet:blanc Events Evènements View Size Taille de la vue Notes Notes Journal Journal Small Petit Medium Moyen Big Grand Color Couleur i italique Ctrl+I Ctrl+I u Souligné B Gras Ctrl+B Ctrl+B Zombie Zombie I'm feeling... Je me sens... Weight Poids Awesome Beau B.M.I. B.M.I. Bookmarks Favoris Add Bookmark Ajouter un Favoris Starts Début Remove Bookmark Enlever le Favoris Flags Marque Graphs Graphique Zoom fully out Zoom maximum 100% 100% Reset the graph heights to uniform sizes Uniformiser la taille des graphiques Reset Remettre a zéro Flags: Balises: Drop down this list to show/hide available graphs. Liste déroulante pour montrer/cacher les graphiques. Flow Rate Débit RDI IDR AHI IAH Mask Pressure Pression du masque Pressure Pression Leak Fuite Snore Ronflement Resp. Rate Taux de respiration Tidal Volume Tidal Volume Minute Vent. Minute Vent. Flow Limitation Limitation du débit Pat. Trig. Breath Pat Trig Breath Resp. Event Evenement Respiratoire Insp. Time Durée inspiration Exp. Time Durée expiration IE IE Sleep Stage Période du sommeil Breakdown arret events évènements H H A A OA AO CA CA RE RE NR NR FL FL PB PB E E L L NRI NRI VS VS VS2 VS2 UF1 UF1 UF2 UF2 UF3 UF3 Selection AHI Choix IAH CSR CSR PR PR U1 U1 U2 U2 U3 U3 O2 O2 Events/hour Evènement/Heure PD PD No Data Pas de donée No %1 events are recorded this day Aucun evenement %1 disponible pour ce jour %1 event Evenement %1 %1 events Evenements %1 Oximetry data exists for this day, however it's timestamps are too different, so the Graphs will not be linked. Il y a des données d'Oximetrie pour ce jour, mais les date sont trop différente et donc les graphiques ne seront pas liés. No Graphs :( Pas de Graphiques :( CPAP PPC APAP APAP Bi-Level Bi-Level ASV ASV Unknown Inconnue Date Date Sleep Sommeil Wake Eveil Hypopnea Hypopnée Apnea Apnée Obstructive Obstructive Flow Limit Limitation du Flux User Flags Balise utilisateur RERA RERA VSnore VRonflement VSnore2 VRonflement2 PB/CSR PB/CSR Event Breakdown Sessions all off! Toutes les Sessions sont off! Sessions exist for this day but are switched off. Des sessions existent pour ce jour mais sont éteintes. Impossibly short session Session trop courtes Zero hours?? Zero heures ?!? BRICK :( PLANTAGE :( Sorry, your machine does not record data. Désolé votre machine n'enregistre rien. Complain to your Equipment Provider! Plaignez vous a votre fournisseur d'équipement! Avg Moyenne Med Med Statistics Statistiques Channel Chaine Min Min %1% %1% Max Max <b>Please Note:</b> This day just contains summary data, only limited information is available . <b>Notification:</b>Ce jour ne contient que des données résumés, seul des informations restreintes sont disponibles. No data available Pas de donnée Oximeter Information Informations de l'Oxymètre Int. Pulse Poul Int. Int. SpO2 SpO2 Int. Session Start Times Début de Session Session End Times Fin de Session Duration Durée Oximetery Sessions Sessions d'Oxymetrie Position Sensor Sessions Session des capteurs de position Unknown Session Session inconnue SpO2 Desaturations Désaturation de SpO2 Pulse Change events Changement de pulsation SpO2 Baseline Used Ligne de base du SpO2 Total ramp time Durée total de la rampe Time outside of ramp Durée hors rampe AHI excluding ramp IAH hors rampe "Nothing's here!" Bob is bored with this days lack of data. Hide all events Cacher les évènements Show all events Afficher les évènements Machine Settings Réglages de la machine Pr. Relief Restants de Pressions Humidifier Humidifieur Session Information Information de Session SessionID ID de Session On On Start Début End Fin CPAP Sessions Session CPAP Oximetry Sessions Sessions d'Oxymetrie Oximeter Oximètre Sleep Stage Sessions Sessions du sommeil One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. Un ou plusieurs enregistrement de cette session a des données corompues. Certains points des graphiques peuvent ne pas coincider correctement. Machine Settings Unavailable Réglages de la machine indisponibles PAP Mode: %1<br/> Mode PAP :%1<br/> This day has missing pressure, mode and settings data. Jours sans pression,mode et réglages %1%2 %1%2 This day just contains summary data, only limited information is available . Jour avec informations limité, seulement le résumé. Total time in apnea Temps total en apnée Time over leak redline Durée audessus de la ligne rouge de fuite Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked. Il y a des données d'Oximetrie pour ce jour, mais les date sont trop différente et donc les graphiques ne seront pas liés. Sorry, your machine only provides compliance data. Désolé votre machine ne fournit que des donées de confotmité. Pick a Colour Choisir une couleur This bookmarked is in a currently disabled area.. Ce favoris pointe vers une zone inactive.. Bookmark at %1 Favoris a %1 Show all graphs Afficher les Graphiques No Graphs On! Aucun Graphique ! Summary Only :( Résumé seulement :( Hide all graphs Cacher les Graphiques ExportCSV Export as CSV Export en CSV Dates: Dates: Resolution: Résolution: Details Détails Sessions Sessions Daily Quotidien Filename: Nom de Fichier: Cancel Annuler Export Exporter Start: Début: End: Fin: Quick Range: Choix Rapide : Most Recent Day Jour le plus récent Last Week Semaine dernière Last Fortnight Quatres deniers Jours Last Month Dernier mois Last 6 Months Dernier 6 mois Last Year Dernière année Everything Tout Custom Personalisé ... ... SleepyHead_ SleepyHead_ Details_ Détails_ Sessions_ Sessions_ Summary_ Résumé_ Select file to export to Choisir le fichier pour export CSV Files (*.csv) Fichiers CSV (*.csv) DateTime Date et Heure Session Session Event Evenement Data/Duration Date/Durée Date Date Session Count Nb Session Start Début End Fin Total Time Temps Total AHI IAH Count Occurence Avg Moy %1% %1% FPIconLoader Import Error Erreur d'import This Machine Record cannot be imported in this profile. Import impossible des données de cette machined dans ce profil. The Day records overlap with already existing content. Les enregistrements du jour se chevauchent avec le contenu déjà existant. MainWindow SleepyHead SleepyHead &Statistics &Statistiques <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Attention: </span>Ceci est une pré-version, certaines parties de ce programme peuvent ne pas fonctionner comme prévu.</p></body></html> about:blank ausujet:blanc Report Mode Type de Rapport Standard Standard Monthly Mensuel Date Range Période &Help Browser &Aide ... ... qrc:/docs/index.html qrc:/docs/index.html &Navigation &Navigation Statistics Statistiques Daily Quotidien Overview Aperçus Oximetry Oximètrie Import Import Help Aide &Bookmarks &Favoris &Records &Enregistrer &File &Fichier &View &Vues &Help &Aide &Data &Données &Advanced &Avancé &Automatic Oximetry Cleanup Nettoyage &Automatique de l'Oximétrie Toggle &Line Cursor Activer le curseur type &Ligne Foo https://fr.wikipedia.org/wiki/Variable_m%C3%A9tasyntaxique cassé &Purge CPAP Data &Purger les données de la PPC Purge Oximetery Data Purger les données de l'Oximetrie Rebuild CPAP Data Reconstruire les données PPC &Import Data &Import de donnée Shift+F2 Shift+F2 &Preferences &Préférences &Profiles &Profils Utilisateurs Exit Quitter E&xit &Quitter View &Daily Vue &Quotidienne F5 F5 View &Overview Vue &Globale F6 F6 View &Welcome Vue &Bienvenue F4 F4 - - Ctrl+Tab Ctrl+Tab Use &AntiAliasing Utiliser l'&AntiAliasing &About SleepyHead &Au sujet de SleepyHead &Fullscreen Toggle &Passer en plein écran F11 F11 Show Debug Pane Afficher le paneau de debug &Reset Graph Layout &Réinitialiser la disposition des graphiques Check for &Updates &Vérifier les mises à jour Take &Screenshot &Faire une copie d'écran F12 F12 O&ximetry Wizard Assistant d'O&ximetrie Exp&ort Data Daily Calendar Calendrier Quotidien F9 F9 Backup &Journal View O&ximetry Vue O&xymetrie F7 F7 Print &Report Imprimer &Raport &Edit Profile &Modifier le profil utilisateur &Link Graph Groups &Lier les Goupe de Graphiquess Exp&ort Exp&orter Online Users &Guide &Guide utilisateur en ligne &Frequently Asked Questions Question &Fréquentes &Rebuild Oximetry Indices &Reconstruire les indices d'Oximétrie Change &User &Changer de profil utilisateur Purge &Current Selected Day Purger le jour &Courant sélectionné Current Days Jours courants &Current Selected Day &Jour actuel All data for current CPAP machine Toute les donnée pour la machine a PPC courante Right &Sidebar &Barre latérale droite Ctrl+L Ctrl+L Daily Sidebar Barre latérale Quotidiènne F8 F8 View S&tatistics Voir les S&tatistiques Navigation Navigation Records Enregistrements Purge ALL CPAP Data Purger toutes les données de la PPC F10 F10 View Statistics Voir les Statistiques &Support SleepyHead Development Aider au développement de &SleepyHead Change &Language Changer de &Langue Change &Data Folder Changer de Répertoire des &Données Import &Somnopose Data Importer des données &Somnopose View S&ummary Vue &Résumée Import &ZEO Data Importer des données &ZEO Import RemStar &MSeries Data Importer des données RemStar &MSeries &Support Sleepyhead Development &Aider au développement de SleepyHead Sleep Disorder Terms &Glossary &Glossaire des termes de désordre du sommeil Loading Data Chargement en cours Importing Data Import en cours RDI RDI AHI AHI No CPAP data available. pas de donnée disponibles. %1 day of CPAP Data, on %2. %1 jour de donnée , sur %2. %1 days of CPAP Data, between %2 and %3 %1 jours de donnée , entre %2 et %3 Details Détails Most Recent le plus récent Last 7 Days Semaine dernière Last 30 Days Dernier mois Last 6 months Dernier 6 mois Last Year Dernière année RERA Index Indexe RERA Flow Limit Index Index de Limitation du Flux Hours per Night Heures par Nuit Min EPAP EPAP Min %1% EPAP %1% EPAP Max IPAP IPAP Max %1% IPAP %1% IPAP Average Pressure Pression Moyenne %1% Pressure Pression %1% Pressure Pression Average %1 %1 Moyenne %1% %2 %1% %2 Oximetry Summary Résumé d'Oximétrie %1 day of Oximetry Data, on %2. %1 jour de donnée d'Oxymetrie , sur %2. %1 days of Oximetry Data, between %2 and %3 %1 jours de donnée d'Oxymetire, entre %2 et %3 Average SpO2 SpO2 Moyenne Minimum SpO2 SpO2 Minimum SpO2 Events / Hour Evènement SpO2 /Heure % of time in SpO2 Events % du temps en evènement SpO2 Average Pulse Rate Fréquence Pulsation Moyenne Minimum Pulse Rate Fréquence Pulsation Mini Maximum Pulse Rate Fréquence Pulsation Maxi Pulse Change Events / Hour Changement de pulsation Nb/Heure Usage Information Information d'utlisations Total Days Jours Total Compliant Days Jours Corrects Days AHI &gt;5.0 Jours AHI > 5.0 Best&nbsp;%1 Meilleur &bnsp; %1 Worst&nbsp;%1 Pire&nbsp;%1 CPAP PPC APAP APAP Bi-Level Bi-Level ST/ASV ST/ASV Best RX Setting Meilleur Réglages RX Mode Mode Worst RX Setting Pires Réglages RX EPAP EPAP IPAPLo IPAP bas IPAPHi IPAP haut PS Min PS Min PS Max PS Max IPAP IPAP PS PS Min Pres. Press. Min. Max Pres. Pres. Max. First Premier Last Dernier Days Jours FL FL Machine Machine Pr. Rel. Restants de Pressions. %5 %1% EPAP=%2<br/>%3% IPAP=%4 %5 %1% EPAP=%2<br/>%3% IPAP=%4 %3 %1% Pressure=%2 %3 %1% Pression=%2 Brand Marque Model Modele Serial Numéro de série First Use Première Utilisation Last Use Dernière Utilisation Loading Chargement About SleepyHead Au sujet de SleepyHead There are no graphs visible to print Pas de graphiques a imprimmer Bookmarks Favoris Would you like to show bookmarked areas in this report? voulez vous afficher les zones favorites dans ce rapport? This make take some time to complete.. Please don't touch anything until it's done. C'est long, ne touchez a rien en attendant. Printing %1 Report Impression du rapport %1 %1 Report rapport %1 Name: %1, %2 Nom: %1,%2 DOB: %1 Né le: %1 Patient ID: %1 Patient N°: %1 Phone: %1 Téléphone: %1 Email: %1 Courriel: %1 Address: %1 Adresse: %1 Mask Time: Utilisation du masque: Bedtime: Sommeil: Wake-up: Réveil: Machine: Machine: Mode: Mode: ASV ASV Unknown Inconnue RDI %1 RDI: %1 AHI %1 AHI: %1 AI=%1 HI=%2 CAI=%3 AI=%1 HI=%2 CAI=%3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% UAI=%1 UAI= %1 NRI=%1 LKI=%2 EPI=%3 NRI=%1 LKI=%2 EPI=%3 Weight %1 Poids %1 BMI %1 BMI %1 Zombie %1/10 Zombie %1/10 Reporting from %1 to %2 Rapport du %1 au %2 Reporting data goes here Localisation des donées des rapports Entire Day's Flow Waveform Flux du jour entier SleepyHead v%1 - http://sleepyhead.sourceforge.net SleepyHead v%1 - http://sleepyhead.sourceforge.net Page %1 of %2 Page %1 sur %2 Profile Profil Welcome Bienvenue &About &Au sujet Loading... Chargement en cours Access to Import has been blocked while recalculations are in progress. Accès à l'importation bloqué pendant les recalculs en cours. Cancel Annuler Please wait, importing from backup folder(s)... Patientez, importation de(s) dossier(s) de sauvegarde ... Please wait, scanning for CPAP data cards... Patientez,scan de la carte de donnée PPC... <b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum. <b> Attention: </ b> Cette pré-version est destinée aux bêta-testeurs uniquement. S'il vous plaît ne <b> PAS </ b> la diffuser à l'extérieur du Forum de test SLEEPYHEAD Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version. S'il vous plaît rapportez les bugs au Forum Test SLEEPYHEAD, mais d'abord, vérifier le fil de discussion BUILD pour vou assurer que vous utilisez la dernière version. When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. Quand vous rapportez un bug, s'il vous plaît assurez-vous de fournir le numéro de version SleepyHead, les détails du système d'exploitation et de la machine PPC. <b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes. <b> Attention: </ b> Ce rapport généré par ce logiciel ne doit pas etre utilisé à des fins de vérification de conformité ou de diagnostic médical. These messages are only a temporary feature. Some people thought they were an error. Ces messages sont temporaires. Certaines personnes pensaient q'il étaient une erreur. Import Problem Problème d'import Couldn't find any valid Machine Data at %1 Impossible de trouver des données de la machine valident a %1 Please insert your CPAP data card... Insérez la carte de donnée PPC svp... CPAP Data Located Données PPC trouvés Please wait, launching file dialog... Patientez, lancement du sélecteur de fichier.. No CPAP data card detected, launching file dialog... Pas de carte détecté, lancement du sélecteur de fichier... Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. S'il vous plaît choisissez le dossier racine ou la lettre de lecteur de votre carte de données, et non pas un sous-dossier. Import Reminder Rappel d'Import Welcome to SleepyHead Bienvenue dans SleepyHead This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. Ce logiciel a été crée pour vous aider à visualiser les données de votre machine a PPC. SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. SleepyHead a été conçus par un développeur ayant l'expérience des troubles du sommeil et adapté selon les retours de nombreux testeurs également souffrant des mêmes troubles. This is a beta release, some features may not yet behave as expected. e logiciel est une version Beta (de test) et certaines fonctions peuvent se comporter de façons inattendues. Please report any bugs you find to SleepyHead's SourceForge page. Merci de rapporter les erreurs sur la page web Sourceforge de SleepyHead. Currenly supported machines: Machine supportées : ResMed S9 models (CPAP, Auto, VPAP) ResMed S9 models (CPAP, Auto, VPAP) DeVilbiss Intellipap (Auto) DeVilbiss Intellipap (Auto) Fisher & Paykel ICON (CPAP, Auto) Fisher & Paykel ICON (CPAP, Auto) Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters les Oximetres Contec CMS50D+, CMS50E et CMS50F (pas 50FW) ResMed S9 Oximeter Attachment ResMed S9 Oximeter Attachment Online Help Resources Aide en ligne Note: Note: I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. Ce navigateur web est conçus pour afficher l'aide de ce logiciel, il n'est pas recommandé de l'utiliser pour une utilisation intensive. (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) (Il ne propose par l'ncrytion de donnée SSL, donc ce ne serait pas une bonne idée de saisir des informations confidentiels avec ce navigateur) SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Site Web du projet</a> chez SourceForge<br/> Further Information Plus d'information Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. Voici la <a href='qrc:/docs/release_notes.html'>note de publication</a> pour cette version. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. Plus quelques: <a href='qrc:/docs/usage.html'>documentations d'utilisation</a>, et quelques informations importantes pour les utilisateurs de Mac. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia Au sujet <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Des apnées du sommeil </a> sur Wikipedia Friendly forums to talk and learn about Sleep Apnea: Forum sur le sujet des apnées du Sommeil : <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, <a href='http://www.cpaptalk.com'>Forum CPAPTalk</a>, Copyright: Copyright: &copy;2011-2014 &copy;2011-2014 License: Licence: This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. Ce logiciel est publié sous licence <a href="qr:/COPYING">GNU License Publique</a>. DISCLAIMER: ATTENTION: This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. Ce n'est <font color='red'><u>PAS</u></font> un logiciel médical. Cette application est tout juste un visualiseur de données, et en aucune manière ne garantie la précision ni l'exactitude des calculs ou des données affichées. The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. L'auteur ne sera PAS tenu responsable si qui que ce soit se blesse ou blesse un tiers en utilisant correctement ou non ce logiciel. Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. Votre médecin doit toujours votre première et principale source de conseils en ce qui concerne la gestion de votre santé. *** <u>Use at your own risk</u> *** ***.<u>Utilisez le à vos risques et péril</u>.*** Revision: Révision: branch branche Data Folder Location: <a href="file://%1">%2</a> James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Are you sure you want to rebuild all CPAP data for the following machine: Etes-vous sûr de vouloir reconstruire toutes les données de PPC pour la machine suivante: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. S'il vous plaît notez que cela pourrait entraîner la perte de données graphiques si les sauvegardes internes de Sleepyhead ont été désactivées ou entravé. For some reason, SleepyHead does not have internal backups for the following machine: Pour une raison quelconque, Sleepyhead n'a pas sauvegardes internes pour la machine suivante: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Vu que vous avez fait vos <i> <b> propre </b> sauvegardes pour l'ensemble de vos données PPC </i>, vous pouvez toujours effectuer cette opération, mais vous aurez à restaurer manuellement à partir de vos sauvegardes. Are you really sure you want to do this? Etes-vous vraiement sur de vouloir faire cela ? You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: Vous êtes sur le point de <font size=+2>détruire</font> les données pour la machines suivante: Note as a precaution, the backup folder will be left in place. Par mesure de précaution, le dossier de sauvegarde sera laissé en place. Are you <b>absolutely sure</b> you want to proceed? Êtes-vous <b> absolument sûr</b> de vouloir continuer ? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: Une erreur d'autorisation de fichier à planté le processus de purge, vous devrez supprimer manuellement le dossier suivant : %1's Journal Choose where to save journal XML Files (*.xml) Because there are no internal backups to rebuild from, you will have to restore from your own. Comme il n'y a pas de sauvegardes internes,vous devrez restaurer à partir de votre propre sauvegarde. Would you like to import from your own backups now? (you will have no data visible for this machine until you do) Voulez-vous importer vos propres sauvegardes maintenant? (vous n'aurez pas de données visibles pour cette machine jusqu'à ce que vous le fassiez) Are you sure you want to delete oximetry data for %1 Voulez-vous effacer les données de l'oximètre pour %1 <b>Please be aware you can not undo this operation!</b> <b>Attention cette opération ne peut etre annulée !</b> Select the day with valid oximetry data in daily view first. Séléctionez d'abord un jour avec des données valides dans la vue journalière. Copyright Copyright: <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Please ensure you are running the latest version before reporting any bugs. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! This red message line is intentional, and will not be a feature in the final version... Imported %1 CPAP session(s) from %2 %1 Session(s) importée(s) de %2 Import Success Import réussi Already up to date with CPAP data at %1 déja a jour avec les donnée ici : %1 Up to date A jour Choose a folder Choisissez un répertoire A %1 file structure for a %2 was located at: une structure de fichier %1 pour un %2 a été situé à: A %1 file structure was located at: une structure de fichier %1 a été trouvé a: Would you like to import from this location? Voulez-vous importer de cet emplacement ? Specify Parcourir SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_User_Guide">Guide d'utilisation en ligne</a> de SleepyHead <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Questions Fréquentes</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossaires des Termes des troubles du sommeil</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">Wiki de SleepyHead</a><br/> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> This software is released under the GNU Public License v3.0<br/> Ce logiciel est distribué sous la licence Publique GNU V3.0 SleepyHead Project Page Site web du projet SleepyHead SleepyHead Wiki Wiki de SleepyHead Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ N'oubliez pas d'apprécier SleepyHead sur <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> ou <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ SleepyHead, brought to you by Jedimark SleepyHead, vous est proposé par Jedimark Kudos & Credits Remerciements Bugfixes, Patches and Platform Help: Débbugage, Correctifs et Aides : Translators: Traducteurs: 3rd Party Libaries: Librairies logiciel externes utilisées: SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. SleepyHead utilise le <a href="http://qt-project.org">Framework QT</a>. In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. Dans le module de mise à jour, SleepyHead utilise la librairie <a href="http://sourceforge.net/projects/quazip">QuaZip</a> de Sergey A. Tachenov, qui encapsule le package ZIP/UNZIP de Gilles Vollant. Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Un grand merci a Pugsy de <a href='http://cpaptalk.com'>CPAPTalk</a> pour son aide avec la documentation and les tutoriaux, ainsi qu'a tout ceux qui m'on aidé a tester et qui qui ont partagés leur données de PPC. Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. Merci d'utiliser SleepyHead. S'il vous est utile, merci d'aider au developement en faisant un don via Paypal. This software comes with absolutely no warranty, either express of implied. Ce logiciel est fournis sans aucune garantie explicte ou implicite. It comes with no guarantee of fitness for any particular purpose. Il n'est pas garantie de convenir à quelques usage que ce soit. No guarantees are made regarding the accuracy of any data this program displays. La précision des données affichées par ce programme n'est absoluement pas garantie. This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. Ce n'est pas un logiciel médical, ce n'est qu'un logiciel de recherche qui fournit une représenation visuelle des données enregistrée par les appareils supportés. This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. Ce logiciel n'est pas adapté pour effectuer un quelconque diagnostique ou rapport de conformité , ou autre usage médical quelconque. The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. Use this software entirely at your own risk. Utilisez ce logiciel à vos risques et périls. Access to Preferences has been blocked until recalculation completes. Les Préférence sont bloquée pendant le recalcul. Question Question Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) Philips Respironics System On (CPAP Pro, Auto, BiPAP et ASV) Build Date: %1 %2 Date de compilation : %1 %2 Graphics Engine: %1 Moteur Graphique: %1 Data Folder Location: %1 Répertoire des données : %1 James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone. James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl et Roy Stone. Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here. Arie Klerk (Hollandais), Steffen Reitz (Allemeand), Hao Chen (Chinois), Lars-Erik Söderström (Suédois,) Damien Vigneron (Français), et d'autre qu'il faut que je rajoute ici. There was an error saving screenshot to file "%1" Erreur en enregistrant la copie d'écran "%1" Screenshot saved to file "%1" Copie d'écran "%1" enregistrée Printing Disabled Impression déscativée Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt Merci de recompiler SleepyHead avec QT 4.8.5 ou plus, imprimer cause des plantages avec cette version de QT Gah! Zut! If you can read this, the restart command didn't work. Your going to have to do it yourself manually. Veuillez redémmarer manuellement. Are you sure? Etes vous sure ? Are you sure you want to purge all CPAP data for the following machine: Etes vous sur de vouloir purger tout les données pour la machine: Performance will be degraded during these recalculations. Les performances serons moindres pendant le recalcul. Recalculating Indices Recalcul des indices Loading Event Data Chargement en cours Recalculating Summaries Recalcule des résumés Restart Required Redémarage nécéssaire Recalculations are complete, the application now needs to restart to display the changes. Recalcul terminé, relancez l'application pour afficher les chagements. Recalculations are now complete. Recalcul terminé. Task Completed Tâche terminée There was a problem opening ZEO File: Problème à l'ouverture du fichier ZEO : Zeo CSV Import complete Import du Fichier CSV ZEO terminé There was a problem opening MSeries block File: Problème à l'ouverture du fichier MSeries : MSeries Import complete Import du Fichier terminé There was a problem opening Somnopose Data File: Problème à l'ouverture du fichier Somnopose : Somnopause Data Import complete Import du Fichier terminé MinMaxWidget Auto-Fit Defaults Override The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. The Minimum Y-Axis value.. Note this can be a negative number if you wish. The Maximum Y-Axis value.. Must be greater than Minimum to work. Scaling Mode This button resets the Min and Max to match the Auto-Fit NewProfile Edit User Profile Modifier le profil utilisateur Language Langue English Anglais Data Folder Répertoire des données Shows the directory where SleepyHead data will be stored. Affiche le répertoire où les données du logiciel seront sauvegardées. Click here to choose where to store SleepyHead data. Cliquez ici pour choisir où mettre les données du logiciel. ... ... I agree to all the conditions above. Je suis d'accord avec toutes ces conditions. User Information Information utlisateur User Name Nom d'utilisateur Keep the kids out.. Nothing more.. This isn't meant to be uber security. Eloigner les enfant. Rien de plus. Ce n'est pas non plus super sensible. Password Protect Profile Profil protégé par mot de passe Password Mot de passe ...twice... ...et de deux... Locale Settings Réglage locaux Country Pays TimeZone Fuseau Horaire about:blank ausujet:blanc DST Zone Zone heure d'été/Hiver Personal Information (for reports) Information Personnel (pour les rapports) First Name Prénom Last Name Nom D.O.B. Né le. Gender Sexe Male Homme Female Femme Height Taille metric metre archiac archiac Contact Information Coordonées Address Adresse Email Courriel Phone Téléphone CPAP Treatment Information Information sur le traitement PPC Date Diagnosed Date de diagnostic Untreated AHI AHI non traité CPAP Mode Mode de CPAP CPAP PPC APAP APAP Bi-Level Bi-Level ASV ASV RX Pressure Pression RX Doctors / Clinic Information Docteur / Informations sur la clinique Doctors Name Nom du médecin Practice Name Practice Name Patient ID Identifiant du Patient SleepyHead SleepyHead TextLabel TextLabel &Cancel &Annuler &Back &Précédent &Next &Suivant Select Country Choisissez le pays Welcome to SleepyHead Bienvenue dans SleepyHead This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. Ce logiciel est conçus pour vous aider à visualiser les données de votre machine respiratoire à Pression continue (PPC) et équipement en rapport. SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. SleepyHead est sous license <a href='qrc:/COPYING'>GNU Licence Publique</a> et vient sans aucune garantie et sans garantie de correspondre a un usage quelconque. PLEASE READ CAREFULLY MERCI DE LIRE ATTENTIVEMENT SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. SleepyHead est un outil de visualisation de donnée et n'est pas un substitue à la compétence de votre médecin. Accuracy of any data displayed is not and can not be guaranteed. La précision des données n'est pas et ne peut pas etre garantie. Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. Les rapports générés ne le sont QUE pour usage PERSONNEL et ne peuvent etre utilisé pour aucun diagnostique médical. The author will not be held liable for <u>anything</u> related to the use or misuse of this software. L'auteur n'est <u> en aucun cas </u> responsable de l' utilisation faites de ce logiciel. Use of this software is entirely at your own risk. Utilisez ce logiciel à vos risques et périls. SleepyHead is copyright &copy;2011-2014 Mark Watkins SleepyHeads (c) 2011-2014 par Mark Watkins Please provide a username for this profile Merci de donner un nom à ce profil Empty Username Nom d'utilisateur vide Passwords don't match Non correspondance des mots de passe Profile Changes Modifications du profile Accept and save this information? Accepter et sauvegarder ? &Finish &Fin &Close this window &Fermer la fenetre Overview Form Formulaire Range: Durée: Last Week Semaine dernière Last Two Weeks Dernières 2 semaines Last Month Dernier mois Last Two Months Dernier 2 mois Last Three Months Dernier 3 mois Last 6 Months Dernier 6 mois Last Year Dernière année Everything Tout Custom Personalisé Start: Début: End: Fin: Reset view to selected date range Réinitialiser à la durée choisie ... ... Toggle Graph Visibility Activer les Graphiques Drop down to see list of graphs to switch on/off. Dérouler pour voir la liste des graphique a activer. Graphs Graphique RDI IDR AHI IAH Apnea Hypopnea Index Index des Apnée etHypopnée Usage Utilisation Usage (hours) Utilisation (heures) Flow Limit Limitation du Flux Session Times Durée Session Session Times (hours) Durée Session (Heures)s Pressure (cmH2O) Pression (cmH2O)s Settings Réglages Leaks Fuites Unintentional Leaks (L/min) Fuites involontaires (L/min) Total Leaks Total Fuites Total Leaks (L/min) Total Fuites (L/min) Respiratory Disturbance Index Index des désordres respiratoires % in PB % en RP Periodic Breathing (% of night) Respiration Périodique (% de la nuit) % in %1 % in %1 %1 (% of night) %1 (% de la nuit) Large Leaks (% of night) Fuites importantes (% de la nuit) Peak RDI IDR Max Peak RDI Shows RDI Clusters (RDI/hr) IRD Max Affiche Regroupement (IDR/hr) Peak AHI IAH Max Peak AHI Shows AHI Clusters (AHI/hr) IHA Max Affiche Regroupement (IHA/hr) (count) (occurence) Resp. Rate Taux de respiration Respiratory Rate (breaths/min) Taux de respiration (resp.min) Tidal Volume Volume normal Tidal Volume (ml) Tidal Volume (ml) Minute Vent. Vent.Minute. Minute Ventilation (L/min) Vent.Minute. (L/min) Target Vent. Vent.Cible. Target Ventilation (L/min) Vent.Cible. (L/Min) Pat. Trig. Br. Pat Trig Breath. Patient Triggered Breaths (%) Pat Trig Breath (%) Sessions Sessions Sessions (count) Nb Session Pulse Rate Fréquence Pulsation Pulse Rate (bpm) Fréquence Pulsation (bpm) Oxygen Saturation (%) Saturation Oxygène (%) SensAwake (count) SensAwake (nombre) Body Mass Index Indice de Masse Corporel Zombie Zombie How you felt (0-10) Sensation (0-10) Events/Hr Evènement/Heure Zombie Meter Zombie Metre FL FL breaths/min Resp./min L/b L/b L/m L/m %PTB %PTB % PB %PB % %1 % %1 Show all graphs Afficher les Graphiques No Graphs On! Aucun Graphique ! Hide all graphs Cacher les Graphiques OximeterImport Dialog Boite de dialogue Oximeter Import Wizard Assistant d'import pour oximètre <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> Skip this page next time. Ne plus voir cette page. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> <html><head><body><p>SleepyHead est compatible avec les oximètres Contec CMS50D+/E/F,<br/> tout comme avec les données du logiciel ChoiceMMed-MD300W1</p></body></htlm> Where would you like to import from? D'oû voulez-vous importer ? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> <html><head/><body><p>cette option vous permet d'importer (via cable) les enregistrements internes de votre oximètre.</p><p>Après selection de cette option, certains oximètres peuvent nécéssiter une action dans leurs menu pour initialiser le téléversement.</p></body></html> Directly from a recording on a device Directement à partir d'un enregistreur <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> <html><head/><body><p>si cela ne vous gène pas d'etre relié à un ordinateur toute la nuit, cette option fournit un graphique plethysomogram , qui indique le rythme cardiaque, en complément des informations d'oxymétrie normales.</p></body></html> Record attached to computer overnight (provides plethysomogram) Enregistrement rattaché à l'odinateur toute la nuit (fournit un plethysomograme) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> <html><head/><body><p>Cette option vous permet d'importer des données crées par le logiciel de votre oximètre, comme SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review Import d'un fichier de données externe, comme ceux de SpO2Review <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Rappel pour les utilisateur de PPC : </span><span style=" color:#fb0000;">avez vous pensé a importer votre session de PPC en premier ?</span></p><p>si vous l'oubliez,vous n'aurez pas une heure valide pour synchoniser la session d'oximetrie<br/><br/>Afin d'assurer une bonne synchronisation entre les deux appareils, Essayez de toujours les démarrer simultanément</p></body></html> Please connect your oximeter device Connectez votre matériel d'Oximétrie SVP Press Start to commence recording Appuyez sur démarrer pour commencer à enregister Show Live Graphs Afficher les graphiques en temps réel Duration Durée SpO2 % SpO2 % Pulse Rate Fréquence Pulsation Multiple Sessions Detected Multiple Sessions Détectées Please choose which one you want to import into SleepyHead Merci de séléctionner celle que vous voulez importer Start Time Import Time Heure d'Import Details Détails Import Completed. When did the recording start? Import terminé.Quand l'enregistrement a-t-il commencé ? Day recording (normally would of) started Jour de début d'enregistrement Oximeter Starting time Heure de démarrage de l'Oximètre I want to use the time reported by my oximeter's built in clock. Utiliser l'heure de l'horloge interne de l'Oximètre. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. J'ai démarré l'Oximètre Démarer en même temp que la session de la machine à Pression Continue.en même temp que la session de la machine à Pression Continue. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>SleepyHead nécéssite un horaire de départ pour savoir où sauver sa session d'oxymétrie.</p><p>Choisissez une des options suivantes :</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> <html><head/><body><p>Note: Synchroniser avec l'horaire de démarrage de la session de PPC sera toujours plus précis.</p></body></html> Choose CPAP session to sync to: Choisir la session PPC avec laquelle synchoniser : ... ... You can manually adjust the time here if required: Vous pouvez ajuster l'heure manuellement : HH:mm:ssap HH:mm:ssap &Cancel &Annuler &Information Page Page d'&Information &Retry &Recomencer &Choose Session &Choisir la Session &End Recording T&erminer l'Enregistrement &Sync and Save &Synchroniser et Sauvegarder &Save and Finish &Sauvegarder et Terminer &Start &Débuter Scanning for compatible oximeters Recherche d'un Oximètre compatible Could not detect any connected oximeter devices. Aucun appareil détecté. Connecting to %1 Oximeter Connexion à l'Oximètre %1 "%1", session %2 Waiting for %1 to start Waiting for the device to start the upload process... Select upload option on %1 Séléctionner l'option Transmettre sur %1 Waiting for you to start the upload process... En attente de démarrage de la transmission... %1 device is uploading data... %1 transmet des données... Please wait until oximeter upload process completes. Do not unplug your oximeter. Merci d'attendre la fin du transfert. Ne pas le débrancher pendant ce temps. Oximeter import completed.. Import Terminé.. Select a valid oximetry data file Sélectionnez un fichier de donnée valide Oximetry Files (*.spo *.spor *.spo2 *.dat) Fichier d'Oximètre (*.spo *.spor *.spo2 *.dat) No Oximetery module could parse the given file: Impossible de traiter le fichier: Oximeter not detected Oximètre non détécté Couldn't access oximeter Impossible d'accéder à l'Oximètre Live Oximetery Mode Mode Oximétrie temps réel Starting up... Démarrage... If you can still read this after a few seconds, cancel and try again Si vous pouvez lire ceci après quelques secondes, annulez et recomencez Live Import Stopped Import temps-réel stoppé Live Oximetery Stopped Oximétrie temps-réel stoppé Live Oximetery import has been stopped Import temps-réel de l'Oximétrie stoppé %1 session(s) on %2, starting at %3 %1 session(s) sur %2, démarrage a %3 No CPAP data available on %1 Pas de données PPC disponible sur %1 %1 %1 Recording... Enregistrement en cours... Finger not detected Doigt non détécté I want to use the time my computer recorded for this live oximetry session. Utilisation de l'horaire d'enregistrement de l'ordinateur pour cette session d'oximétrie temps-réel. I need to set the time manually, because my oximeter doesn't have an internal clock. Réglage manuel du temps en l'absence d'horologe interne sur l'Oximètre. Something went wrong getting session data Erreur à la recupération des données de cette session CMS50 Session %1 Session CMS50 %1 Oximetry Form Formulaire Date Date d/MM/yy h:mm:ss AP d/MM/yy h:mm:ss AP R&eset R&emettre a zéro SpO2 SpO2 Pulse Pulsation ... ... &Open .spo/R File &Ouvrir Fic.spo/R Serial &Import &Importer Série &Start Live &Début Mesures Serial Port Port série &Rescan Ports &Rescanner les Ports Control Controle No Oximetry Data Pas de donnée Oximetry live recording has been terminated due to timeout. L'enregistrement de l'oxymètrie a été terminé suite a un timeout. &Start &Débuter Save Session? Enregistrer la Sessions ? Creating a new oximetry session will destroy the old one. Would you like to save it first? La création d'une nouvelle session d'oxymetrie va effacer la précédente. Voulez-vous l'enregistrer avant ? Save Enregistrer Destroy It Détruire Cancel Annuler Please Wait Veuillez patienter Oximetry Error! Something is wrong with the device connection. Erreur d'Oxymetrie Erreur de connexion au matériel. &Stop &Stop Oximeter Error The device has not responded.. Make sure it's switched on. Erreur d'Oxymetrie le matériel ne répond pas. Verifier qu'il est sous tension. Ready Pret Oximeter Error The device did not respond.. Make sure it's switched on. Erreur d'Oxymetrie le matériel ne répond pas. Verifier qu'il est sous tension. Please make sure your oximeter is switched on, and in the right mode to transmit data. le matériel ne répond pas. Verifier qu'il est sous tension et dans le mode transmission de donée adéquat. Oximeter Error! Erreur de l'Oximètre! PreferencesDialog Preferences Préférences &Import &Import Session Settings Réglage des sessions Combine Close Sessions Fermeture combiné de Session (Combine Close Sessions) Minutes Minutes Multiple sessions closer together than this value will be kept on the same day. Les session plus rapprochées que cette valeur seront sur le même jour. Ignore Short Sessions Ignorer les session plus courte que <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les Sessions plus courtes que cela ne serons pas affichées<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> Day Split Time Heure de séparation des jours Sessions starting before this time will go to the previous calendar day. Le sessions démarrée avant cette heure irons dans le jour précédent. Keep session data in memory to speed up revisiting days. Garder les données de session en mémoire pour accélérer l'utilisation quotidiene. Cache Session Data (uses more system memory) Mettre en cache les session Session Storage Options Option de stockage des Sessions This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. Sleepyhead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) Ceci garde un copie de la carte SD des machines ResMes, Les machines ResMed effacent les données précises après 7jours, et les graphique de plus de 30 jours.. SleepyHead peut garder ces donnée si vous devez réinstaller. (Hautement recommandé, a moins que vous n'ayez pas de place disque ou que les graph ne vous intéressent pas) Create SD Card Backups during Import (only for ResMed so far, highly recommended) Créer une copie de la SD Card prendant l'Import (seulement pour les machines ResMed, hautement recommandé) This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. Réduit de moitié l'occupation des donnée. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) Compresser les donées de Session Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Compresse la sauvegarde des machines ResMed (fichiers EDF en .gz). Compress SD Card Backups (slower first import, but makes backups smaller) Compression de la sauvegarde de la cate SD The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. Options affectant l'espace disque utilisé et la durée de l'import. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changer les option de compression ne recompresse pas automatiquement les données.</span></p></body></html> &CPAP &PPC CPAP Mask Information Information sur leMasque Mask Type Type du masque Generic mask type. Select the one that's closest to your mask. Type de masque générique. Utilisez le plus ressemblant au votre. Description Description The name of your mask, or at least the name you call it. Nom de votre masque. Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. La méthode de caclul de fuite non volontaires n'est pas proposé par votre machine Note : le modèle statistique est expérimental. Mask Profile Forme de masque Statistical Model Modèle Statistique Leak calcs Calcul des Fuites Started Using Début d'utilisation The date you started using this mask Date d'utilisation de ce masque Leak Profile Suivi / fuite Pressure Pression Leak Fuite <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Le suivi des fuites ne fonctionne pas</p></body></html> Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) Afficher le IDR (Index de Désordre Respiratoire) plutot que l'IAH Index Apnée/Hypopnée ( IDR=IAH + RERA) Use RDI instead of AHI (PRS1 only) Utiliser IDR plutôt que IAH (pour PRS1) Don't show any compliance information Ne pas afficher les informations de conformité Do not import sessions older than: Ne pas importer de session antérieures a : Sessions older than this date will not be imported Les sessions antérieures à cette date ne seront pas importées dd MMMM yyyy dd MMMM yyyy Show Compliance Afficher la conformité Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. considérez les jours sous cette valeur comme non conforme. 4heures est considéré comme conforme. hours Heures as over au plus (as over) of usage per night utilisation par nuit Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Activer/désactive le marquage amélioré expérimental Permet de détécer le événements raté par certaines machines. Option a activer avant import sinon une purge est nécéssaire. Custom User Event Flagging Notifier les evénements Utilisateurs Flow Restriction Restriction de Flux Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. % de restriction de flux a partir de la valeur médiane. Une valeur de 20% est adéquate pour détecter les apnées. % % <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Le marquage personalisé est une méthode expérimentale de détection des evènement raté par la machine. Il ne sont <span style=" text-decoration: underline;">pas</span> pris en compte dans l' IAH (Index d'Apnée et Hypopnée). </span></p></body></html> Duration of airflow restriction Durée de restriction de flux d'air s s Event Duration Durée d'évènement Allow duplicates near machine events. Autoriser les évènement proche (allow duplicate near machine events). AHI/Hour Graph Settings Réglages du graphique AHI/Heure Window Fenètre Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. Ajuste le nombre de donnée pour chaque poitn du graphique IAH/Heure. 60 min par défaut. Il est hautement recommandé de le laisser à cette valeur. minutes Minutes Reset the counter to zero at beginning of each (time) window. RAZ du conteur a chaque début de fenêtre de temps. Zero Reset Remettre a zéro CPAP Clock Drift Décalage d'horloge de PPC Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) Ne pas modifier sauf si l'horloge PPC est déffecteuse. Essaye de la synchroniser avec l'Horloge du PC seconds secondes User definable threshold considered large leak Seuil de fuites importante personalisé L/min L/min Whether to show the leak redline in the leak graph Montrer la ligne rouge des fuites dans le graph Show Leak Redline Afficher la ligne rouge des fuites &Events &Evenements Not entirely sure if this will get to live or not.. Il n'est pas garantie que cela va fonctionner.. Show Affiche Colour Couleur Event Evenement ID N° Graphs Graphique Search Rechercher Filters the graph list. Simply start typing the name of the graph your looking for. Filtre la liste des graphiques. Saisir le début du nom du graphique recherché. &Defaults Par &Défaut Double click on the (Y-axis) min/max values to edit them Double cliquez sur les valeur min/max pour les modifier (Axe Y) &Oximetry &Oximètrie Use Oximetry Utiliser l'Oxymètrie Type Oxymètre Contec CMS50 Contec CMS50 <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> <htlm><head/><body><p>Fonctionnalités récement.désactivées. Elles reviendrons plus tard</p></body></html> Overpriced ResMed S9 Oximeter Oximètre ResMed S9 Tries to forces the oximetry data to link with CPAP when possible. Essayer de forcer le lien entre les donnée oximetriques et de PPC si possible. Link Oximetry and CPAP graphs Lier les graphiques d'Oxymétrire et PPC Flag changes in oximetry stats mentioner les chagements de statistiques d'oximétrie SPO2 SpO2 Percentage drop in oxygen saturation % perdu lors de la saturation d'oxygène Pulse Pulsation Sudden change in Pulse Rate of at least this amount Chagement soudain de fréquence pulsation d'au moins ce montant bpm bpm Minimum duration of drop in oxygen saturation durée minimum de perte en saturation d'oxygène Minimum duration of pulse change event. Durée minimum du chagement de pulsation. Discard chunks under Passer les mesure inférieures à Small chunks of oximetry data under this amount will be discarded. Les données d'oxymétrie sous cette valeur seront ignorées. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does <span style=" font-weight:600; text-decoration: underline;">not</span> have the correct timestamp needed to sync.</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you start your Oximeters recording mode at <span style=" font-style:italic;">exactly </span>the same time you start your CPAP machine, you can now also achieve sync. </p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Synchronisation des données d'Oxymétrie et de PPC</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les donnée CMS50 importés de SpO2Review (des fichier .spoR) ou la méthode d'import en serie n'a pas</span> d'horodatage correct pour importer automatiquement</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le mode temps réel par cabel série est un façons de synchroniser les oxymètre CMS50, mais ne prend pas en compte la dérive de l'horloge des machines à PPC.</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si vous démarrer l'oxymètre<span style=" font-style:italic;"> exactement</span> en même temp que la machine a PPC vous pouvez réussir à les synchroniser. </p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'import par port série prend le temps de départ de la première session de PPC de la dernière nuit comme repère . (Pensez a importer les données de PPC auparavant !)</p></body></html> &General &Générale General Settings Réglages Généraux Daily view navigation buttons will skip over days without data records Le bouton Quotidien passe les jours sans données Skip over Empty Days Ne pas prendre en compte les jours sans mesures Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. Autorise la parallélisation pour les processeurs multicoeurs pour améliorer les performance. Surtout pour l'import. Enable Multithreading Autoriser la parallélisation Bypass the login screen and load the most recent User Profile Pas de choix d'utilisateur, choisir le plus récent Skip Login Screen Pas d'écran de choix utilisateur Changes to the following settings needs a restart, but not a recalc. Un chagement des réglages ci-dessous nécéssitera un redémarrage. Events Evènements Flag rapid changes in oximetry stats Other oximetry options Flag SPO2 Desaturations Below Discard segments under Flag Pulse Rate Above Flag Pulse Rate Below Contec CMS50D+/E/F Contec CMS50F v3.7+ Contec CMS50F v3.7+ {50F?} ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Update Oximeter Clock during import Preferred Calculation Methods Choix de la méthode de calcul Middle Calculations Calcul du Milieu Upper Percentile Pourcentage haut For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. Les utilisateurs de ResMed devrait utiliser le pourcentage 95 Ici pour une meilleur visualisation. Car c'est la seul valeur possible dans ce cas. Median is recommended for ResMed users. Médian est recommande pour les machines ResMed. Median Médian Weighted Average Moyenne pondérée Normal Average Moyenne simple ResMed users probably should use 99th Percentile for visual consistency. Les utilisateurs de ResMed devrait utiliser le pourcentage 99 pour une meilleur visualisation. True Maximum Maximum réel 99% Percentile 99% Pourcent Maximum Calcs Calculs Maximum Import Locations Importer de Add Ajouter Remove Enlever Automatically Check For Updates Vérifier les mises à jour automatiquement Check for new version every Verifier les nouvelles versions tout les Sourceforge hosts this project for free.. Please be considerate of their resources.. Sourceforge héberge gratuitement ce projet, soyez respectueux de leur bande passante. days. Jours. &Check for Updates now &Vérifier les mises à jour Last Checked For Updates: Dernière Vérification de disponibilité de mise à jour: TextLabel TextLabel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Pour tester les nouveautés cliquez ici</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Attention sans garantie de bon fonctionnement</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> I want to try experimental and test builds (Advanced users only please.) Je veux essayer les versions expérimentales (Utilisateur confirmé seulement) &Appearance &Apparence Graph Settings Réglages du graphique Bar Tops Haut des bars Line Chart Graphique en Ligne Overview Linecharts Lignes résumé <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> <html><head><body><p>Permet de défiler plus facilement avec les touchpad bidirectionels en mode zoom</p><p>50 ms est une valeur recommandée.</p></body></html> milliseconds millisecondes Scroll Dampening Défilement adoucis Graph Tooltips Bulle d'aide du graphique Top Markers Overlay Flags Marque de dépassement The visual method of displaying waveform overlay flags. Méthode visuelle d'affichage des marque de limite des courbes. Standard Bars Barres standards Top & Bottom Markers Marque de plafond et de plancher Graph Height Hauteur des graph Default display height of graphs in pixels Afficher la hauteur des graph en pixels Summary only data is more accurate for ResMed users if this is left on. Le résumé des donné est plus précis pour les utilisateurs de ResMed si ceci est activé. Don't Split Summary Days Ne pas séparer le jours résumé This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) Ceci garde un copie de la carte SD des machines ResMes, Les machines ResMed effacent les données précises après 7jours, et les graphique de plus de 30 jours.. SleepyHead peut garder ces donnée si vous devez réinstaller. (Hautement recommandé, a moins que vous n'ayez pas de place disque ou que les graph ne vous intéressent pas) Create SD Card Backups during Import (Turn this off at your own peril!) Créer des sauvegardes de la carte SD pendant l'importation (Désactivez cette option à vos risques et périls!) Show in Event Breakdown Piechart Montrer en la répartition des évènements en cammenbert #1 #1 #2 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Cette option expérimentale tente d'utiliser le système de repérage de SleepyHead pour améliorer la détection d'évènement de position. Resync Machine Detected Events (Experimental) Resynchro. des évènements detectés par la machine C&hannels C&haine Reset &Defaults Remettre aux valeurs par défaut <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Attention: </span>c'est n'est parceque c'est possible que c'est la bonne méthode</p></body></html> Oximetery Settings Réglages de l'oximétrie Contec CMS50D+ Contec CMS50+ Contec CMS50E/F Contec CMS50E/F Contec CMS50F v3.7 Contec CMS50F v3.7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncrhonisation de données d'Oximetrie et de PPC</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Données de CMS50 importées de SpO2Review (de .spoR files) ou l'import par port série n'a </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">pas</span><span style=" font-family:'Sans'; font-size:10pt;"> la bonne base horaire pour synchroniser.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">L'affichage temps réel (avec le cable série) est une façons de synchroniser précisement un Oximètre CMS50, mais ne prend pas en compte le décalage de la machine à PPC.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">si vous démarrez votre enreigstreemnt d'oximétrie a</span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactement </span><span style=" font-family:'Sans'; font-size:10pt;">en mêêm temps que la machine PPC vous pouvez aussi synchroniser </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">L'import par port série prend l'horaire de départ de la première session de PPC de la dernière nuit. (Rappelez vous d'importer vos données PPC en premier !)</span></p></body></html> Show flags for machine detected events that haven't been identified yet. Afficher les marqueurs des évènement détectés mais non identifiés. Show Unknown Flags Affiche les marqueurs inconnues Import without nagging How long you want the tooltips to stay visible. Durée d'affichage des astuces. Tooltip Timeout Durée des Astuce Line Thickness Epaisseur des lignes The pixel thickness of line plots Epaisseur de la ligne en pixel Other Visual Settings Autre réglages visuels Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. Anti-Aliasing pour les graphiques Certains sont plus beau ainsi Cela affecte aussi les impressions A essayer pour voir. Use Anti-Aliasing Utiliser l'AntiAliasing Makes certain plots look more "square waved". Rendre certain tacés plus "carré". Square Wave Plots Points Carrés Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. Autoriser les copie d'écran. Peut causer des soucis avec les versions obsolete de QT. Show event breakdown pie chart Graphique des evenements de breakdown Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. Le cache des Pixels est une technique d'accéleration graphique qui peut poser des soucis à l'affichage des caractères sur votre plateforme. Use Pixmap Caching Utiliser le cache des pixel Turn on/off the spinning "context" cube. It really doesn't use that much resources.. :) Active/Désactive le cube rotatif "contex" Animations && Fancy Stuff Animation et effets Whether to allow changing yAxis scales by double clicking on yAxis labels Autoriser de changer l'axe des y en double cliquant sur l'intitulé Allow YAxis Scaling Autoriser la mise à l'échelle de l'axe Y Application Fonts Fontes de l'application Font Fontes Size Taille Bold Gras Italic Italique Application Application Graph Text Texte des Graphiques Graph Titles Titres des Graphiques Big Text Grand Texte Details Détails &Cancel &Annuler &Ok &Ok Nasal Pillows Coussin nasal Span Events Envergure des evènements Flags Marque Minor Flags Maque mineur Waveforms Oscillation Data Channels Chaine de donée Settings Channels Réglage des chaines Unknown Channels Chaine inconnue Name Nom Color Couleur Label Libellé Data Reindex Required Réindexation des données nécéssaire A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? Il faudra réindexer les données ce qui prendra quelques minutes Etes-vous sur de vouloir le faire ? Restart Required Redémarage nécéssaire One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? Ces modfications vont nécésiter un redémarrage de l'application pour etre effectives Voulez-vous le faire maintenant ? Add this Location to the Import List Ajouter la localisation à la liste d'imporation Flag Minor Flag Span Always Minor Flag Type CPAP Events Oximeter Events Positional Events Sleep Stage Events Unknown Events Double click to change the descriptive name this channel. Double click to change the default color for this channel plot/flag/data. Here you can change the type of flag shown for this event This is the short-form label to indicate this channel on screen. This is a description of what this channel does. Lower Upper CPAP Waveforms Oximeter Waveforms Positional Waveforms Sleep Stage Waveforms Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Daily Graphs Graphiques Quotidien Overview Graphs Graphique généraux Graph Graphique This may not be a good idea Cela n'est peut etre pas une bonne idée ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). Les machines ResMed S9 effacent régulièrement les données de plus de 7 ou 30 jours de la carte SD (selon la résolution). If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. Si vous avez besoin un jour de réimporter ces données (dans SleepyHead ou ResScan) ces données aurons disparues. If you need to conserve disk space, please remember to carry out manual backups. Si vous avez besoin de consever de l'espace disque, n'oubliez pas de faire des sauvegardes manuels. Are you sure you want to disable these backups? Etes-vous sur de vouloire désactiver ces sauvegardes ? Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. Désactiver les sauvegardes automatiques n'est pas une bonne idée, car SleepyHead a besoin de reconstruire sa base de donnée si des erreurs apparaissent. Are you really sure you want to do this? Etes-vous vraiement sur de vouloir faire cela ? Min Min Max Max N/A N/A Oximetry Graphs Graphiques d'Oxymétrie Confirmation Confirmation Are you sure you want to reset your graph preferences to the defaults? Voulez vous vraiement réinitialiser les préférence des Graphiques aux valeurs par défaut ? ProfileSelect Select Profile Séléctionez le profil utilisateur Search: Rechercher: Start with the selected user profile. Démarrer avec le profil sélectionné. Create a new user profile. Créer un nouveau profil utilisateur. Choose a different SleepyHead data folder. Choisir un répertoire différent pour les données. &Different Folder Répertoire &Différent SleepyHead SleepyHead [version] [version] Click here if you didn't want to start SleepyHead. Cliquer ici pour ne pas lancer SleepyHead. &Quit &Quitter Folder: Répertoire: The current location of SleepyHead data store. Localisation actuel des données de SleepyHead. [data directory] [répertoire] New Profile Nouveau profil utilisateur &Select User &Sélection du profil utilisateur Open Profile Ouverture du profil Edit Profile Modifier le profil utilisateur Delete Profile Effacer le profile Enter Password for %1 Mot de passe pour %1 Incorrect Password Mot de passe incorrect You entered the password wrong too many times. Trop d'erreur de mot de passe. Enter the word DELETE below to confirm. Entrez le mot DELETE ci-dessous pour confirmer. You are about to destroy profile '%1'. Vous allez detruire le profil '%1'. Sorry Désolé You need to enter DELETE in capital letters. c'est DELETE en majuscule. Could not open profile.. You will need to delete this profile directory manually Impossible d'ouvrir ce profil. Effacez son répertoire manuellement You will find it under the following location: Vous le trouverez à cet endroit: You entered an incorrect password Mot de passe incorrect If you're trying to delete because you forgot the password, you need to delete it manually. Sous vous tentez d'effacer car vous avez oublié le mot de passe, vous dvez l'effacer à la main. There was an error deleting the profile directory, you need to manually remove it. Erreur lors de l'effacement du répertoire du profil; Vous devez l'effacer à la main. Question Question Are you sure you want to trash the profile "%1"? Etes vous sur de vouloir supprimer le profil utilisateur "%1" ? Double Checking: Do you really want "%1" profile to be obliterated? Double vérification: Voulez-vous vraiement supprimer définitvement le profil utilisateur "%1" ? Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data.. Don't say you weren't warned. :-p ok, le profil "%1" et toutes ses données va etre définitivement supprimé. Ne dites pas qu'on ne vous à pas prévenu :-p WTH??? Erreur imprévue! If you can read this you need to delete this profile directory manually (It's under %1) Veuillez supprimmer ce profil utilisateur manuellement ( localisation : %1) Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs. Signed: Nasty Programmer Si vous effacer car vous avez oublié le mot de passe, ce n'est pas la bonne méthode. Lisez la documentation. Signé : Le méchant programmeur Whoops. Zut. There was an error deleting the profile directory.. You need to manually remove %1 Il y a une erreur, veuillez supprimmer le profil utilisateur %1 manuellement Profile '%1' was succesfully deleted Profil '%1' effacé avec succès Create new profile Créer un nouveau profil Enter Password Entrez le mot de passe You entered an Incorrect Password too many times. Exiting! Trop d'erreur de mot de passe.Au revoir ! QObject No Data Pas de donée cm cm " " ft ft lb lb oz oz Kg Kg cmH2O cmH2Os Sleep Sommeil Wake Eveil Hours Heures Minutes Minutes Seconds Secondes Events/hr Evènement/Heure Hz Hz bpm bpm L/m L/m Error Erreur Warning Alerte Information Information Busy Occupé Cancel Annuler Zombie Zombie Oximeter Oximètre CPAP PPC BiPAP BiPAP Bi-Level Bi-Level EPAP EPAP Min EPAP EPAP Min Max EPAP EPAP Max IPAP IPAP Min IPAP IPAP Min Max IPAP IPAP Max APAP APAP ASV ASV ST/ASV ST/ASV Humidifier Humidifieur H H OA AO A A CA CA FL FL SA SA LE LE EP EP VS VS VS2 VS2 RERA RERA PP PP P P RE RE NR NR NRI NRI O2 O2 PC PC UF1 UF1 UF2 UF2 UF3 UF3 PS PS AHI IAH RDI IDR AI AI HI HI UAI UAI CAI CAI FLI FLI REI REI EPI EPI ÇSR ÇSR PB PB IE IE Insp. Time Durée inspiration Exp. Time Durée expiration Resp. Event Evenement Respiratoire Flow Limitation Limitation du débit Flow Limit Limitation du Flux SensAwake SensAwake Pat. Trig. Breath Resp. par Patient Tgt. Min. Vent Vent. act. Min Target Vent. Vent.Cible. Minute Vent. Vent.Minute. Tidal Volume Volume courant Tidal Volume Resp. Rate Taux de respiration Snore Ronflement Leak Fuite Leaks Fuites Total Leaks Total Fuites Unintentional Leaks Fuite involontaires MaskPressure Pression du masque Sleep Stage Période du sommeil Usage Utilisation Sessions Sessions Pr. Relief Restants de Pressions No Data Available Aucune donnée disponible Compliance Only :( Graphs Switched Off Summary Only :( Résumé seulement :( Sessions Switched Off Bookmarks Favoris Mode Mode Model Modele Brand Marque Serial Numéro de série Series Séries Machine Machine Channel Chaine Settings Réglages Inclination Inclinaison Orientation Orientation Name Nom DOB DDN Phone Téléphone Address Adresse Email Courriel Patient ID Identifiant du Patient Date Date Bedtime heure du coucher Wake-up Réveil Mask Time Utilisation du masque Unknown Inconnue None Aucun Ready Pret First Premier Last Dernier Start Début End Fin On On Off Off Yes Oui No Non Min Min Max Max Med Mil Average Moyen Median Médian Avg Moyen W-Avg Moyenne W BMI BMI Litres Litres ml ml Breaths/min Resp./min Degrees Degrée Please Note Merci de noter que &Yes &Oui &No &Non &Cancel &Annuler &Destroy &Détruire &Save &Sauvegarder Weight Poids Pulse Rate Fréquence Pulsation SpO2 SpO2 Plethy Plethy Flow Rate Débit Pressure Pression ? ? Severity (0-1) Gravité (0-1) Daily Quotidien Overview Aperçus Oximetry Oximètrie Event Flags Evénement Windows User Utilisateur Windows Software changes have been made that require the reimporting of the following machines data: Suite a des modifications logiciel est nécéssaire de réimporter les données de la machine a PPC: I can automatically purge this data for you, or you can cancel now and continue to run in a previous version. Je peux effacer cette donée pour vous ou vous pouvez annuler et continuer a utiliser la version précédent. Would you like me to purge this data this for you so you can run the new version? Souhaitez vous que j'efface cette donnée pour vous afin d'utiliser la nouvelle version ? SleepyHead (%1) needs to upgrade its database for %2 %3 %4 SleepyHead (%1) a besoin de mettre à jour sa base de donnée pour %2 %3 %4 <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <b>SleepyHead maintien une copie de la carte qu'il utilise dans cette optique</b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> <i>Vos anciennes données seront restaurées si la sauvegarde n'a pas été désactivée dans le préférences d'import des données<i> Launching Windows Explorer failed Echec au lancement de windows Explorer Could not find explorer.exe in path to launch Windows Explorer. Windows Explorer n'a pas été trouvé dans le chemin indiqué. SleepyHead does not yet have any automatic card backups stored for this device. SleepyHead ne fait pas de sauvegarde automatique de la carte SD pour ce matériel. This means you will need to import this machine data again afterwards from your own backups or data card. Ce qui signifie vous allez devoir réimporter les données par la suite a partir de vos propres sauvegardes. Important: Important: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. Une fois mis à jour, <font size=+1>ne pourrez plus</font> utiliser ce profil avec l'anciènne version. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. Si cela vous pose une souci, cliquez sur Non pour sortir, sauvegardez le profil manuellement avant de relancer SleepyHead de nouveau. Are you ready to upgrade, so you can run the new version of SleepyHead? Etes-vous prêt pour upgrader afin d'utiliser la nouvelle version de SleepyHead ? Machine Database Changes La base de de données de la machine a changé Sorry, the purge operation failed, which means this version of SleepyHead can't start. Désolé la purge à échoué. Cette version de SleepyHead ne peur démarrer. The machine data folder needs to be removed manually. Le répetroire de donnée de la machine doit etre effacé manuellement. This folder currently resides at the following location: emplacement actuel de ce répertoire : Rebuilding from %1 Backup Reconstruction de la sauvegarde de %1 Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? Voulez vous passer en sauvegarde automatique, ainsi la prochaine fois qu'une nouvelle version de SleepyHead doit le faire elle pourra s'en servir ? SleepyHead will now start the import wizard so you can reinstall your %1 data. SleepyHead va lancer l'assistant d'import pour réinstaller les données de votre %1. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: SleepyHead va quitter, ensuite lancez votre gestionnaire de fichier pour faire une copie de votre profile : Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. Utilisez votre gestion de fichier pour faire uen copie de votre répertoire du profil puis relancez SleepyHead pour terminer la mise à jour. Purge Failed Purge en échec Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually This folder currently resides at the following location: Erreur d'effacemet, pour fonctionner il faut effacer le répertoire de donnés manuellement Ce répertoire est situé la : SleepyHead Release Notes SpleepyHead Notes de diffusion Release Notes Note de publication &Ok, get on with it.. &Ok, continuons.. Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. Cherchez cette version dans <a href='%1'> les fichiers SleepyHead hébergés sur SourceForge</a>. A faster build of SleepyHead may be available Une version plus rapide de SleepyHead pourrait etre disponible You will not be bothered with this message again. Vous ne serez plus jamais ennuyé avec ce message. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. Cettet version fonctionnera correctement, mais un version "<b>%1%<b>" fonctionnerait encore mieux sur votre ordinateur. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. Cette version de SleepyHead est conçue pour fonctionner sur les ordinateurs anciens qui ne supportent pas OpenGL 2.0 mais il semble que le votre le supporte parfaitement. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. Cette version de SleepyHead est conçue pour fonctionner sur les ordinateurs anciens qui ne supportent pas OpenGL 2.0, mai il se pourrait qu'il y ai une version plus adapté à votre ordinateur. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. Si vous fonctionnez avec une machine virtuelle comme VirtualBox ou VMware, ce message ne vous concerne pas, aucune verision plus adéquate n'est disponible. Incompatible Graphics Hardware Carte graphique incompatible This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. Cette version de SleepyHead nécéssite le support d'OpenGL 2.0 pour fonctionner correctement et malheureusement votre ordinateur ne le supporte pas. You may need to update your computers graphics drivers from the GPU makers website. %1 Vous pourriez mettre à jour votre pilote graphique en téléchargeant une version plus récente du site web du fabriquant de votre carte graphique. %1 (<a href='http://intel.com/support'>Intel's support site</a>) (<a href='http://intel.com/support'>Site de Support d'Intel<a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. Comme les graphique ne s'afficherons pas correctement et peuvent causer des crash, cette version va s'arreter. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. Ne soyez pas découragé, il y a une version disponible nommée "<b>BrokenGL</b>" qui devrait fonctionner sur votre ordinateur. No SleepyHead data folder was found. Pas de répertoire de donnée SleepyHead de trouvé. Would you like SleepyHead to use the default location for storing its data? Voulez-vous que SleepyHead utilise le répertoire par défaut pour stocker ses données ? As you did not select a data folder, SleepyHead will exit. Comme vous n'avez pas sélectionné de répertoire SleepyHead va quitter. Next time you run, you will be asked again. Au prochain démarrage, la question vous sera posé de nouveau. You did not select a directory. Vous n'avez pas séléctioné de répertoire. SleepyHead will now start with your old one. SleepyHead Update Notes SpleepyHead Notes de Mise a jour Language Langue Question Question Choose or create new folder for SleepyHead data Choisissez ou créez un nouveau répertoire pour les données de SleepyHead Exiting Arret en cours The folder you chose is not empty, nor does it already contain valid SleepyHead data. Le répertoire n'est pas vide et ne contient pas de données SleepyHead valide. Are you sure you want to use this folder? Etes-vous sur que vous voulez utiliser ce répertoire ? SleepyHead SleepyHead Unspecified Non spécifié Nasal Pillows Coussin nasal Hybrid F/F Mask Masque Hybride (F/F) Nasal Interface Interface Nasale Full-Face Mask Masque Facial complet Are you sure you want to reset all your channel colors and settings to defaults? Voulez vous vraiement réinitialiser les préférence des Graphiques (couleur des chaine et réglages) aux valeurs par défaut ? Events Evènements Duration Durée (% %1 in events) (% %1 en évènements) Jan Jan Feb Fév Mar Mar Apr Avr May Mai Jun Jun Jul Jui Aug Aou Sep Sep Oct Oct Nov Nov Dec Dec Import Error Erreur d'import This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. L'import des cette machine ne peut se faire dans ce profile. Les jours enregistré ecraseraient ceux existants. Non Data Capable Machine Machine sans donnée Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. Votre Philips Respironics (Model %1) n'est malheureusement pas un modèle produisant des données. I'm sorry to report that SleepyHead can only track hours of use for this machine. Désolé mais SleepyHead peut seulement suivre la durée d'utilisation de cette machine. 15mm 15mm 22mm 22mm Flex Mode Mode Flex PRS1 pressure relief mode. Mode de dépression PRS1. C-Flex C-Flex C-Flex+ C-Flex+ A-Flex A-Flex Rise Time Monté temporisé Bi-Flex Bi-Flex Flex Level Niveau de Flex PRS1 pressure relief setting. Réglage de Dépression PRS1. x1 x1 x2 x2 x3 x3 x4 x4 x5 x5 Humidifier Status Etat de l'Humidificateur PRS1 humidifier connected? Hudificateur PRS1 connecté ? Disconnected Déconnecté Connected Connecté Heated Tubing Tube Chauffé Heated Tubing Connected Tube Chauffé connecté Headed Tubing mistake ? shoukd not been heated ? Tube en tete Humidification Level Niveau Humidification PRS1 Humidification level Niveau Humidification PRS1 Humid. Lvl. Niv. Humid. System One Resistance Status Etat Resistance System One Sys1 Resist. Status Etat de la Resistance Sys1 System One Resistance Setting Réglage de la Résistance System One System One Mask Resistance Setting Réglage de Résistance du masque System One Sys1 Resist. Set Réglages Res. Sys1 Hose Diameter Diamètre du tuyau Diameter of primary CPAP hose Diamètre du tuyau principal de PPC System One Resistance Lock Verrou de résistance System One Whether System One resistance settings are available to you. Selon disponibilité des réglages de résistance System One. Sys1 Resist. Lock Verrou Resit. Sys1 Auto On Auto On A few breaths automatically starts machine Mise en marche par respiration Auto Off Auto Off Machine automatically switches off Arrêt automatique de la machine Mask Alert Alert du Masque Whether or not machine allows Mask checking. Selon que la machine permet la vérification du masque. Show AHI Affihce l'IAH Whether or not machine shows AHI via LCD panel. Selon que la machine affiche ou pas les IAH sur l'affichage LCD Unknown PRS1 Code %1 Code PRS1 %1 inconnu PRS1_%1 PRS1_%1 Timed Breath Respiration chronometré Machine Initiated Breath Respiration provoqué par la machine TB TB Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! Impossible de traiter le fichier channels.xml, cette version est sévèrement cassé, pas d'autre choix que de quitter!! Therapy Pressure Pression de la Thérapie Inspiratory Pressure Pression d'Inspiration Lower Inspiratory Pressure Pression d'Inspiration la plus basse Higher Inspiratory Pressure Pression d'Inspiration la plus haute Expiratory Pressure Pression d'Expiration Lower Expiratory Pressure Pression d'Expiration la plus basse Higher Expiratory Pressure Pression d'Expiration la plus haute Pressure Support Pression supporté PS Min PS Min Pressure Support Minimum Pression supporté minimum PS Max PS Max Pressure Support Maximum Pression supporté Maximum Min Pressure Pression Min Minimum Therapy Pressure Pression de Thérapie Minimum Max Pressure Pression Maximum Maximum Therapy Pressure Pression de Thérapie Maximum Ramp Time Durée de la Rampe Ramp Delay Period Période de délais de la Rampe Ramp Pressure Pression de la Rampe Starting Ramp Pressure Préssion de départ de la Rampe Ramp Event Evènement de Rampe Ramp rampe Periodic Breathing Respiration Périodique A period of periodic breathing Un période de respiration périodique Vibratory Snore (VS2) Ronflement Vibratoire (VS2) Perfusion Index A relative assessment of the pulse strength at the monitoring site Perf. Index % Mask On Time Durée d'usage du Masque Time started according to str.edf Heure de départ selon str.edf Summary Only Résumé seulement Zero Upper Threshold Lower Threshold % % Clear Airway Apnea Apnée non obstructive An apnea where the airway is open Une apnée ou le passage de l'air est ouvert Obstructive Apnea Apnée Obstructive An apnea caused by airway obstruction Apnée causé par une obstruction du passage de l'air Hypopnea Hypopnée A partially obstructed airway Passage de l'air partiellement Obstrué Unclassified Apnea Apnée non classifiée An apnea that could not fit into a category Un apnée ne rentrant dans aucune catégorie UA UA An restriction in breathing from normal, causing a flattening of the flow waveform. Une restriction respiratoire normale, causant un applatissement de l'onde de flux. Respiratory Effort Related Arousal Respiratory effort-related arousal An restriction in breathing that causes an either an awakening or sleep disturbance. une restriction dans la respiration qui cause un réveil ou un micro-réveil. Vibratory Snore Ronflement vibratoire A vibratory snore un roflement vibratoire A vibratory snore as detcted by a System One machine Un ronflement vibratoire comme détecté par une machine SystemOne Pressure Pulse Pression d'impulsion A pulse of pressure 'pinged' to detect a closed airway. Une impulsion de pression envoyée pour détecter une obstruction. Large Leak Grosse Fuite A large mask leak affecting machine performance. Une grosse fuite affectant les performances de la machine. LL LL Pressure Min Pression Min Pressure Max Pression Max Leak Flag Maqueur de fuite LF LF Non Responding Event Un évènement ne répondant pas A type of respiratory event that won't respond to a pressure increase. Un évènement resporatoire ne répondant pas a l'augmentation de la pression. Expiratory Puff Bouffé Expiratoire Intellipap event where you breathe out your mouth. Evènement correspondant a une expiration par la bouche. SensAwake feature will reduce pressure when waking is detected. La fonctionnalié SenAwake reduira la pression quand l'éveil est détecté. User Flag #1 Evènement utilisateur #1 A user definable event detected by SleepyHead's flow waveform processor. Un évènement défiissable par l'utilisateur détécté par le moteur d'analyse de flux de SleepyHead. User Flag #2 Evènement utilisateur #2 User Flag #3 Evènement utilisateur #3 Heart rate in beats per minute Pouls en battements par minute SpO2 % SpO2 % Blood-oxygen saturation percentage % de saturation du sang en oxygène Plethysomogram Plethysomogram An optical Photo-plethysomogram showing heart rhythm Une photo optique plethysomgram motrant le rythme cardiaque Pulse Change Changement de pulsation A sudden (user definable) change in heart rate Un changement soudain (définissable par l'utilisateur) de pouls SpO2 Drop Baisse de SpO2 A sudden (user definable) drop in blood oxygen saturation Un baisse soudaine (definissable par l'utilisateur) d'oxygénation du sang SD SD Breathing flow rate waveform Courbe du flux respiratoire CPAP Session contains summary data only La session PPC ne contient qu'un résumé PAP Mode Mode PAP PAP Device Mode PAP Mode Matériel APAP (Variable) ASV (Fixed EPAP) ASV (EPAP Fixe) ASV (Variable EPAP) ASV L/min L/min Mask Pressure Pression du masque Mask Pressure (High resolution) Pression du masque (Haute Résolution) Amount of air displaced per breath Quantité d'air déplacé par respiration Graph displaying snore volume Graphique affichant le volume du ronflement Minute Ventilation Ventilation par minute Amount of air displaced per minute Quantité d'air déplacé par minute Respiratory Rate Vitesse respiratoire Rate of breaths per minute Respiration par minute Patient Triggered Breaths Respirations activées par le patient Percentage of breaths triggered by patient Pourcentage de respirations activées par le patient Pat. Trig. Breaths Reps. Act. Pat. Leak Rate Vitesse de fuite Rate of detected mask leakage Vitesse de fuite du masque I:E Ratio RAtion I:E Ratio between Inspiratory and Expiratory time Ration entre temps d'inspiration et d'expiration ratio ratio Expiratory Time Temps d'expiration Time taken to breathe out Temps pris pour expirer Inspiratory Time Temps d'inspiration Time taken to breathe in Temps pris pour inspirer Respiratory Event Evènement respiratoire A ResMed data source showing Respiratory Events Source de donnée de ResMed montrant les évènement respiratoire events évènements Graph showing severity of flow limitations Graph de sévérité des limitations de flux Flow Limit. Limitation de Flux. 0-1 100% {0-1?} Target Minute Ventilation Ventilation Cible par Minute Target Minute Ventilation? Ventilation Cible par Minute? Maximum Leak Fuite Maximum The maximum rate of mask leakage La vitesse maximum de fuite du masque Max Leaks Fuites Max Apnea Hypopnea Index Index Apnée Hypopnée Graph showing running AHI for the past hour Graphique montrant l'IAH pour les heures précédantes Total Leak Rate Total des Fuites Detected mask leakage including natural Mask leakages Fuite détectée incluant les fuite naturel du masque Median Leak Rate Vlume moyen de fuite Median rate of detected mask leakage Volume moyen des fuites du masque Median Leaks Fuites moyenne Respiratory Disturbance Index Index des désorde respiratoires Graph showing running RDI for the past hour Graph des Désordre Repiratoire pour les dernière heures Sleep position in degrees Position du someil en degré Upright angle in degrees Angle supérieur droit en degré About SleepyHead Au sujet de SleepyHead &Close &Fermer &Donate &Donner There are no graphs visible to print Pas de graphiques a imprimmer Would you like to show bookmarked areas in this report? voulez vous afficher les zones favorites dans ce rapport? This make take some time to complete.. Please don't touch anything until it's done. C'est long, ne touchez a rien en attendant. Printing %1 Report Impression du rapport %1 %1 Report rapport %1 : %1 hours, %2 minutes, %3 seconds : %1 Heures; %2 minutes, %3 secondes Range porté Fixed %1 %1 Fixe RDI %1 RDI: %1 AHI %1 AHI: %1 AI=%1 HI=%2 CAI=%3 AI=%1 HI=%2 CAI=%3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% UAI=%1 UAI= %1 NRI=%1 LKI=%2 EPI=%3 NRI=%1 LKI=%2 EPI=%3 Reporting from %1 to %2 Rapport du %1 au %2 Reporting data goes here Localisation des donées des rapports Entire Day's Flow Waveform Flux du jour entier Current Selection Sélection courante Entire Day Jour entier SleepyHead v%1 - http://sleepyhead.sourceforge.net SleepyHead v%1 - http://sleepyhead.sourceforge.net Page %1 of %2 Page %1 sur %2 SleepyHead has finished sending the job to the printer. SpleepyHead a terminé d'envoyer l'impression. Name: %1, %2 Nom: %1, %2 DOB: %1 Date de Naissane %1 Phone: %1 Téléphone: %1 Email: %1 Email: %1 Address: Adresse: Usage Statistics Statistiques d'Usage This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. Ce rapport a été généré par une préversion de SleepyHead (%1),<b>et n'a pas été approuvé en aucune façons conforme ou permettant un diagnotique médical<b>. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead SleepyHead est un logiciel ouvert (Open Source) disponible sur http://sourceforge.net/projects/SleepyHead Auto Bi-Level Auto Bi-niveau ASV Auto EPAP ASV Auto EPAP %1 threshold Seuil %1 No Waveform Available Pas de courbe disponible Plots Disabled Duration %1:%2:%3 Durée%1:%2:%3 AHI %1 AHI: %1 Days: %1 Jour: %1 Low Usage Days: %1 Jours de faible usage: %1 (%1% compliant, defined as > %2 hours) (%1% conforme, définie comme > %2 hours) (Sess: %1) (Sess: %1) Bedtime: %1 Coucher: %1 Waketime: %1 Réveil : %1 90% 90% (Summary Only) Unknown. Inconnus. There is a lockfile already present for profile '%1'. Il y a un fichier de verrouillage déjà présent pour le profil '%1'. You can only work with one instance of an individual SleepyHead profile at a time. Vous ne pouvez travailler qu'avec un seul profil Sleepyhead à la fois. Please close any other instances of SleepyHead running with this profile before proceeding. S'il vous plaît fermez toutes les autres instances de Sleepyhead fonctionnant avec ce profil avant de poursuivre. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. Si aucun autre Sleepyhead ne fonctione (par exemple, il s'est crashé la dernière fois!), ignorez ce message. There is a lockfile already present for this profile '%1', claimed on '%2'. Il y à un fichier de verrouillage déjà présent pour ce profil '%1', demandé sur '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. Si vous utilisez un stockage en cloud, assurez-vous Sleepyhead est fermé et la synchronisation est terminé sur l'autre ordinateur avant de poursuivre. Peak Pic Maximum Maximum %1% %2 %1% %2 Fixed Fixe Auto Auto Fixed Bi-Level Bi-Niveau Fixe Auto Bi-Level (Fixed PS) Auto Bi-Niveau (PS Fixe) Auto Bi-Level (Variable PS) Bi-Niveau Auto (Pres. Variable) ASV Fixed EPAP EPAP a ASV Fixe ASV Variable EPAP EPAP a ASV Variable %1%2 %1%2 Fixed %1 (%2) %1 Fixe (%2) Min %1 Max %2 (%3) Min %1 Max %2 (%3) EPAP %1 IPAP %2 (%3) EPAP %1 IPAP %2 (%3) PS %1 over %2-%3 (%4) PS %1 sur %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) EPAP %1 PS %2-%3 (%6) EPAP %1 PS %2-%3 (%6) %1 %2 %1 %2 %1-%2 %3 %1% {1-%2 %3?} Welcome to SleepyHead Bienvenue dans SleepyHead What would you like to do? Que souhaitez-vous faire? Please Import Some Data Merci d'importer des données CPAP<br/>Importer Import de<br/>PPC Oximetery<br/>Wizard Assisstant <br/>d'Oximétrie or View<br/>Statistics Voir<br/>Les Statistiques It might be a good idea to check preferences first,</br>as there are some options that affect import. Cela serait un bonne idée de vérifier les préférnces,</br>en effet il y a des options qui concernent l'import. First import can take a few minutes. Le premier import peut prendre quelques minutes. Click this box to see this in daily view. Cliquez sur cette case pour visaluser en vue quotidienne. The last time you used your %1... La dernière fois que vous avez utilisé votre %1 ... last night la nuit dernière yesterday hier %2 days ago il y %2 jours was %1 (on %2) était %1 (le %2) perfect :) Parfait :) pretty darn good très bien reasonably good assez bien technically "treated" techniquement "traité" not very good pas très bien horrible, please consult your doctor horrible, consulter votre médecin %1 hours, %2 minutes and %3 seconds %1 heures, %2 minutes and %3 secondes <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> You slept for %1. Vous avez dormi pendant %1. <font color = red>You only had the mask on for %1.</font> <font color = red> Vous n'avez porté le masque que %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). Vous n'avez pas de fuites <i>majeur</i> du masque (maximum %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. Vous avez eu une petite, mais acceptable quantié de fuite <i>majeur</i>. You had significant periods of <i>major</i> mask leakage. Vous avez des périodes significative de fuite <i>majeures</i>. Your mask is leaking way too much.. Talk to your CPAP advisor. Votre masque fuit beaucoup trop .. Parlez-en à votre conseiller de PPC. Your CPAP machine blasted you with a constant %1%2 of air Votre appareil PPC vous explose avec une pression d'air constante de %1%2 Your pressure was under %1%2 for %3% of the time. Votre pression était en dessous de %1%2 pour %3% du temps. Your machine blasted you with a constant %1-%2 %3 of air. Votre appareil vous explose avec une pression d'air constante de %1-%2 %3 . Your machine was under %1-%2 %3 for %4% of the time. Votre machine était en dessous de %1-%2 %3 pendant %4% du temps. Your EPAP pressure fixed at %1%2. Votre pression EPAP s'est fixé %1%2. Your EPAP pressure was under %1%2 for %3% of the time. Votre pression EPAP était en dessous de %1%2 pendant %3% du temps. Your IPAP pressure was under %1%2 for %3% of the time. Votre pression IPAP était en dessous de %1%2 pendant %3% du temps. You had an AHI of %1, which is considered %2 Vous aviez un IAH de %1, qui est considéré %2 You machine was on for %1. No CPAP data has been imported yet. Pas de données de PPC importé pour le moment. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> Données d'Oximétrie les plus récentes:<a onclick='alert("daily=%2");'>%1</a> (last night) (la nuit dernière) (yesterday) (hier) (%2 day ago) (il y à %2 jours) No oximetery data has been imported yet. Pas de données d'Oximétrie importé pour le moment. Very Important Warning Avertissement Très Important <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. <p>TOUJOURS<font size=+1 color=red><b> protéger en écriture </b></font> votre SDCards avant de l'insérer dans votre ordinateur. <span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <span title="Mac OSX et Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> écrivent des fichiers d'index sur la carte sans demander, ce qui peut rendre votre carte illisible par votre machine PPC. Contec Contec CMS50 CMS50 Fisher & Paykel Fisher & Paykel ICON ICON DeVilbiss DeVilbiss Intellipap Intellipap> SmartFlex Settings Réglages SmartFelx ChoiceMMed ChoiceMMed MD300 MD300 Respironics Respironics M-Series M-Series Philips Respironics Philips Respironics System One System One ResMed ResMed S9 S9 EPR: EPR: Somnopose Somnopose Somnopose Software Somnopose Software Zeo Zeo Personal Sleep Coach Personal Sleep Coach Database Outdated Please Rebuild CPAP Data Base de donnée périmée Merci de reconstruire les données de PPC SmartFlex Mode Mode SmartFelx Intellipap pressure relief mode. Mode dépression Intellipap. Ramp Only Rampe seulement Full Time Temps complet SmartFlex Level Niveau de SmartFlex Intellipap pressure relief level. Niveau de dépression Intellipap. VPAP Adapt VPAP Adaptable EPR EPR ResMed Exhale Pressure Relief Dépression d'expiration ResMed Patient??? Patient ??? EPR Level Niveau de l'EPR Exhale Pressure Relief Level Niveau de dépression d'expiration 0cmH2O 1cmH2O 2cmH2O 2cmH2O 3cmH2O 3CmH2O Weinmann Weinman SOMNOsoft2 SOMNOsoft2 (% of time) (% du temps) By Pressure Par Pression Statistics at Pressure Statistique a la Pression %1 Session #%2 SleepyHead is proudly brought to you by JediMark. d MMM [ %1 - %2 ] %1 %1 Hide All Events Show All Events Unpin %1 Graph Pin %1 Graph %1: %2 %1% %2 {1:?} Relief: %1 Hours: %1h, %2m, %3s Machine Information Information de la machine Journal Data SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead will not touch this folder, and will create a new one instead. Please be careful when playing in SleepyHead's profile folders :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. SleepyHead picked only the first one of these, and will use it in future: If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. CMS50F3.7 CMS50F CMS50F Loading %1 data... PLease Wait... Snapshot %1 QuaZipFilePrivate ZIP/UNZIP API error %1 Erreur de l'API de ZIP/UNZIP : %1 Report Form Formulaire about:blank ausujet:blanc SessionBar No Sessions Present Pas de session présente Statistics No CPAP data available. pas de donnée disponibles. %1 day of CPAP Data, on %2. %1 jour de donnée , sur %2. %1 days of CPAP Data, between %2 and %3 %1 jours de donnée , entre %2 et %3 Details Détails Most Recent le plus récent Last 7 Days Semaine dernière Last 30 Days Dernier mois Last 6 months Dernier 6 mois Last Year Dernière année RERA Index Indexe RERA Flow Limit Index Index de Limitation du Flux Hours per Night Heures par Nuit Min EPAP EPAP Min Max IPAP IPAP Max Average Pressure Pression Moyenne %1% Pressure Pression %1% Pressure Pression Average %1 %1 Moyenne %1% %2 %1% %2 %1 day of Oximetry Data, on %2. %1 jour de donnée d'Oxymetrie , sur %2. %1 days of Oximetry Data, between %2 and %3 %1 jours de donnée d'Oxymetire, entre %2 et %3 Average SpO2 SpO2 Moyenne Minimum SpO2 SpO2 Minimum SpO2 Events / Hour Evènement SpO2 /Heure % of time in SpO2 Events % du temps en evènement SpO2 Average Pulse Rate Fréquence Pulsation Moyenne Minimum Pulse Rate Fréquence Pulsation Mini Maximum Pulse Rate Fréquence Pulsation Maxi Pulse Change Events / Hour Changement de pulsation Nb/Heure CPAP Statistics Statistiques PPC CPAP Usage Usage de la PPC Average Hours per Night moyenne des Heures par Nuit Compliance Conformité Therapy Efficiacy Efficacité de la Thérapie Leak Statistics Statistiques des fuites Pressure Statistics Statistiques de Pression Oximeter Statistics Statistique de l'Oximètre Blood Oxygen Saturation Saturation en Oxygène du sang Pulse Rate Fréquence Pulsation %1 Median %1 Median 90% %1 90% %1 Min %1 %1 Min Max %1 %1 Max %1 Index Indexe %1 % of time in %1 % du temp en %1 % of time above %1 threshold % du temps audessus de la limite de %1 % of time below %1 threshold % du temps en dessous de la limite de %1 I can haz data?!? Des données svp !? This lonely sleepy sheep has no data :( Pas de donées Last Week Semaine dernière Last 6 Months Dernier 6 mois Last Session Dernière Session No %1 data available. Pas de donnée %1 disponible. %1 day of %2 Data on %3 %1 jour sur %2 de données sur %3 %1 days of %2 Data, between %3 and %4 %1 jours de %2 , entre %3 et %4 Usage Information Information d'utlisations Total Days Jours Total Compliant Days Jours Corrects Days AHI &gt;5.0 Jours AHI > 5.0 Best&nbsp;%1 Meilleur &bnsp; %1 Worst&nbsp;%1 Pire&nbsp;%1 Best RX Setting Meilleur Réglages RX Worst RX Setting Pires Réglages RX Changes to Prescription Settings Changement pas rapport aux réglages de la prescription Days Jours Pressure Relief Allégement de la pression FL FL Pr. Rel. Restants de Pressions. Pressure Settings Réglage de la pression Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. Le résumé d'efficacité ignore les réglages avec moins de %1 jours de données enregistrées. Machine Information Information de la machine First Use Première Utilisation Last Use Dernière Utilisation Summary No CPAP data available. pas de donnée disponibles. %1 day of CPAP Data, on %2. %1 jour de donnée , sur %2. %1 days of CPAP Data, between %2 and %3 %1 jours de donnée , entre %2 et %3 Details Détails Most Recent le plus récent Last 7 Days Semaine dernière Last 30 Days Dernier mois Last 6 months Dernier 6 mois Last Year Dernière année RERA Index Indexe RERA Flow Limit Index Index de Limitation du Flux Hours per Night Heures par Nuit Min EPAP EPAP Min Max IPAP IPAP Max Average Pressure Pression Moyenne %1% Pressure Pression %1% Pressure Pression Average %1 %1 Moyenne %1% %2 %1% %2 Oximetry Summary Résumé d'Oximétrie %1 day of Oximetry Data, on %2. %1 jour de donnée d'Oxymetrie , sur %2. %1 days of Oximetry Data, between %2 and %3 %1 jours de donnée d'Oxymetire, entre %2 et %3 Average SpO2 SpO2 Moyenne Minimum SpO2 SpO2 Minimum SpO2 Events / Hour Evènement SpO2 /Heure % of time in SpO2 Events % du temps en evènement SpO2 Average Pulse Rate Fréquence Pulsation Moyenne Minimum Pulse Rate Fréquence Pulsation Mini Maximum Pulse Rate Fréquence Pulsation Maxi Pulse Change Events / Hour Changement de pulsation Nb/Heure Usage Information Information d'utlisations Total Days Jours Total Compliant Days Jours Corrects Days AHI &gt;5.0 Jours AHI > 5.0 Best&nbsp;%1 Meilleur &bnsp; %1 Worst&nbsp;%1 Pire&nbsp;%1 Best RX Setting Meilleur Réglages RX Worst RX Setting Pires Réglages RX Days Jours FL FL Pr. Rel. Restants de Pressions. First Use Première Utilisation Last Use Dernière Utilisation UpdaterWindow SleepyHead Updater SpleepyHead Mise a jour A new version of $APP is available Une nouvelle version de $APP est disponible Version Information Informations de Version Release Notes Note de publication about:blank ausujet:blanc Build Notes Note de compilation Maybe &Later &Plus tard &Upgrade Now &Upgrader Maintenant Please wait while updates are downloaded and installed... Merci d'attendre téléchargement et installation en cours... Updates Mises à jours Component Composant Version Version Size Taille Progress Avancement Log Log Downloading & Installing Updates Téléchargment et Installation en cours &Finished &Fin de mise à jour Checking for SleepyHead Updates Vérification de disponibilité de mise à jour Requesting Requete enn cours Saving as Enregistrer comme XML update structure parsed cleanly Structure XML de mise à jour analysée correctement No updates were found for your platform. Aucune mise à jour disponible. SleepyHead Updates Mise à jour de SleepyHead No new updates were found for your platform. Aucune nouvelle mise à jour disponible. SleepyHead v%1, codename "%2" SpleepyHead v%1, nom de code "%2" platform notes Note spécifiques à la plateforme A new version of SleepyHead is available! Une nouvelle version est disponible ! Shiny new <b>v%1</b> is available. You're running old and busted v%2 Une toute nouvelle version <b>v%1</b> est disponible. Vous utilisez l'antique version v%2 An update for SleepyHead is available. Une mise à jour de SleepyHead est disponible. Version <b>%1</b> is available. You're currently running v%1 La version <b>v%1</b> est disponible. Vous utilisez la v%1 SleepyHead v%1 build notes Notes de compilation de la version %1 du logiciel Update to QtLibs (v%1) Mettez a jour la Librairie QtLibs en (v%1) There was an error parsing the XML Update file. Structure XML de mise à jour analysée avec ERREUR!. %1 bytes received %1 octets reçus Redirected to Redirigé vers File size mismatch for %1 Taille du fichier %1 incorrecte File integrity check failed for %1 Erreur de vérification du fichier %1 Extracting Extraction You might need to reinstall manually. Sorry :( Vous allez devoir reinstaller manuellement . Désolé :( Ugh.. Something went wrong with unzipping. Erreur lors de la décompression. Failed Echec Download Complete Téléchargement Terminé There was an error completing a network request: ( Erreur lors d'une requête réseau: ( Update Complete! Mise à jour terminée ! Updates Complete. SleepyHead needs to restart now, click Finished to do so. Mise à jour terminé. Cliquez Fin pour relancer SleepyHead. Update Failed :( Echec de la mise à jour :( Download Error. Sorry, try again later. Erreur de téléchargement. Désolé réessayez plus tard. Downloading & Installing Updates... Téléchargment et Installation en cours... Please wait while downloading and installing updates. Veuillez patienter pendant le téléchargement et l'installation des mises à jour. gGraph Snapshot gGraphView 100% zoom level Restore X-axis zoom too 100% to view entire days data. Reset Graph Layout Resets all graphs to a uniform height and default order. Y-Axis Plots CPAP Overlays Oximeter Overlays Dotted Lines Remove Clone Clone %1 Graph sleepyhead-0.9.8/Translations/English.en_UK.ts0000644000175000017500000126112212412506713020645 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. Please ensure you select 'upload' from the oximeter devices menu. Daily Form Go to the previous day Prev Show or hide the calender ... Go to the next day Next Go to the most recent day with data records Events View Size Notes Journal i Ctrl+I B Ctrl+B u Color Small Medium Big Zombie I'm feeling... Weight Awesome B.M.I. Bookmarks Add Bookmark Starts Remove Bookmark Flags Graphs Drop down this list to show/hide available graphs. Breakdown events UF1 UF2 No %1 events are recorded this day %1 event %1 events Session Start Times Session End Times Session Information Duration CPAP Sessions Oximetery Sessions Sleep Stage Sessions Position Sensor Sessions Unknown Session One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. Machine Settings Machine Settings Unavailable Total ramp time Time outside of ramp AHI excluding ramp "Nothing's here!" Bob is bored with this days lack of data. Hide all events Show all events Oximeter Information SpO2 Desaturations Pulse Change events SpO2 Baseline Used PAP Mode: %1<br/> This day has missing pressure, mode and settings data. %1%2 Statistics This day just contains summary data, only limited information is available . Total time in apnea Time over leak redline Sleep Wake Event Breakdown Sessions all off! Sessions exist for this day but are switched off. Impossibly short session Zero hours?? BRICK :( Sorry, your machine only provides compliance data. Complain to your Equipment Provider! Pick a Colour This bookmarked is in a currently disabled area.. Bookmark at %1 Show all graphs Hide all graphs ExportCSV Export as CSV Dates: Resolution: Details Sessions Daily Filename: Cancel Export Start: End: Quick Range: Most Recent Day Last Week Last Fortnight Last Month Last 6 Months Last Year Everything Custom ... SleepyHead_ Details_ Sessions_ Summary_ Select file to export to CSV Files (*.csv) DateTime Session Event Data/Duration Date Session Count Start End Total Time AHI Count Avg %1% FPIconLoader Import Error This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. MainWindow SleepyHead &Statistics <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> about:blank Report Mode Standard Monthly Date Range &Help Browser ... qrc:/docs/index.html Statistics Daily Overview Oximetry Import Help &File &View &Help &Data &Advanced Purge Oximetery Data Rebuild CPAP Data &Import Data Shift+F2 &Preferences &Profiles E&xit Exit View &Daily F5 View &Overview F6 View &Welcome F4 - Ctrl+Tab Use &AntiAliasing &About SleepyHead &Fullscreen Toggle F11 Show Debug Pane &Reset Graph Layout Check for &Updates Take &Screenshot F12 O&ximetry Wizard F7 Print &Report &Edit Profile &Link Graph Groups Daily Calendar F9 Backup &Journal Online Users &Guide &Frequently Asked Questions &Automatic Oximetry Cleanup Toggle &Line Cursor Change &User Purge &Current Selected Day All data for current CPAP machine Right &Sidebar Ctrl+L Daily Sidebar F8 View S&tatistics Navigation Bookmarks Records Purge ALL CPAP Data Exp&ort Data F10 View Statistics Import &ZEO Data Import RemStar &MSeries Data &Support SleepyHead Development Sleep Disorder Terms &Glossary Change &Language Change &Data Folder Import &Somnopose Data Current Days Profile Welcome &About Loading... Loading Data Please wait, importing from backup folder(s)... Please wait, scanning for CPAP data cards... When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. Import Problem Please insert your CPAP data card... Access to Import has been blocked while recalculations are in progress. CPAP Data Located Please wait, launching file dialog... No CPAP data card detected, launching file dialog... Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. Import Reminder Importing Data Welcome to SleepyHead About SleepyHead This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. This is a beta release, some features may not yet behave as expected. Please report any bugs you find to SleepyHead's SourceForge page. Currenly supported machines: CPAP Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) ResMed S9 models (CPAP, Auto, VPAP) DeVilbiss Intellipap (Auto) Fisher & Paykel ICON (CPAP, Auto) Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters ResMed S9 Oximeter Attachment Online Help Resources Note: I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> Further Information Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia Friendly forums to talk and learn about Sleep Apnea: <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, Copyright: &copy;2011-2014 License: This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. DISCLAIMER: This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. *** <u>Use at your own risk</u> *** Loading Revision: branch Build Date: %1 %2 Graphics Engine: %1 %1's Journal Choose where to save journal XML Files (*.xml) Are you sure you want to rebuild all CPAP data for the following machine: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. For some reason, SleepyHead does not have internal backups for the following machine: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Are you really sure you want to do this? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: Because there are no internal backups to rebuild from, you will have to restore from your own. James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Would you like to import from your own backups now? (you will have no data visible for this machine until you do) You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: Note as a precaution, the backup folder will be left in place. Are you <b>absolutely sure</b> you want to proceed? Are you sure you want to delete oximetry data for %1 <b>Please be aware you can not undo this operation!</b> Select the day with valid oximetry data in daily view first. Copyright <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Please ensure you are running the latest version before reporting any bugs. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! This red message line is intentional, and will not be a feature in the final version... Imported %1 CPAP session(s) from %2 Import Success Already up to date with CPAP data at %1 Up to date Couldn't find any valid Machine Data at %1 Choose a folder A %1 file structure for a %2 was located at: A %1 file structure was located at: Would you like to import from this location? Specify SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> Data Folder Location: <a href="file://%1">%2</a> This software is released under the GNU Public License v3.0<br/> SleepyHead Project Page SleepyHead Wiki Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ SleepyHead, brought to you by Jedimark Kudos & Credits Bugfixes, Patches and Platform Help: Translators: 3rd Party Libaries: SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. This software comes with absolutely no warranty, either express of implied. It comes with no guarantee of fitness for any particular purpose. No guarantees are made regarding the accuracy of any data this program displays. This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. Use this software entirely at your own risk. Access to Preferences has been blocked until recalculation completes. There was an error saving screenshot to file "%1" Screenshot saved to file "%1" Printing Disabled Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt Gah! If you can read this, the restart command didn't work. Your going to have to do it yourself manually. Performance will be degraded during these recalculations. Recalculating Indices Loading Event Data Recalculating Summaries Restart Required Recalculations are complete, the application now needs to restart to display the changes. Recalculations are now complete. Task Completed There was a problem opening ZEO File: Zeo CSV Import complete There was a problem opening MSeries block File: MSeries Import complete There was a problem opening Somnopose Data File: Somnopause Data Import complete MinMaxWidget Auto-Fit Defaults Override The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. The Minimum Y-Axis value.. Note this can be a negative number if you wish. The Maximum Y-Axis value.. Must be greater than Minimum to work. Scaling Mode This button resets the Min and Max to match the Auto-Fit NewProfile Edit User Profile I agree to all the conditions above. User Information User Name Keep the kids out.. Nothing more.. This isn't meant to be uber security. Password Protect Profile Password ...twice... Locale Settings Country TimeZone about:blank DST Zone Personal Information (for reports) First Name Last Name D.O.B. Gender Male Female Height metric archiac Contact Information Address Email Phone CPAP Treatment Information Date Diagnosed Untreated AHI CPAP Mode CPAP APAP Bi-Level ASV RX Pressure Doctors / Clinic Information Doctors Name Practice Name Patient ID SleepyHead TextLabel &Cancel &Back &Next Select Country Welcome to SleepyHead This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. PLEASE READ CAREFULLY SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. Accuracy of any data displayed is not and can not be guaranteed. Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. The author will not be held liable for <u>anything</u> related to the use or misuse of this software. Use of this software is entirely at your own risk. SleepyHead is copyright &copy;2011-2014 Mark Watkins Please provide a username for this profile Passwords don't match Profile Changes Accept and save this information? &Finish &Close this window Overview Form Range: Last Week Last Two Weeks Last Month Last Two Months Last Three Months Last 6 Months Last Year Everything Custom Start: End: Reset view to selected date range ... Toggle Graph Visibility Drop down to see list of graphs to switch on/off. Graphs Respiratory Disturbance Index Apnea Hypopnea Index Usage Usage (hours) Session Times Session Times (hours) % in %1 %1 (% of night) Large Leaks (% of night) Peak RDI Peak RDI Shows RDI Clusters (RDI/hr) Peak AHI Peak AHI Shows AHI Clusters (AHI/hr) Tidal Volume (ml) Minute Ventilation (L/min) Target Ventilation (L/min) Patient Triggered Breaths (%) (count) Oxygen Saturation (%) SensAwake (count) Body Mass Index How you felt (0-10) Zombie Meter breaths/min L/b %PTB % PB % %1 Show all graphs Hide all graphs OximeterImport Dialog Oximeter Import Wizard <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> Skip this page next time. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> Where would you like to import from? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> Directly from a recording on a device <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> Record attached to computer overnight (provides plethysomogram) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> Please connect your oximeter device Press Start to commence recording Show Live Graphs Duration SpO2 % Pulse Rate Multiple Sessions Detected Please choose which one you want to import into SleepyHead Start Time Details Import Completed. When did the recording start? Day recording (normally would of) started Oximeter Starting time I want to use the time reported by my oximeter's built in clock. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> Choose CPAP session to sync to: ... You can manually adjust the time here if required: HH:mm:ssap &Cancel &Information Page &Retry &Choose Session &End Recording &Sync and Save &Save and Finish &Start Scanning for compatible oximeters Could not detect any connected oximeter devices. Connecting to %1 Oximeter "%1", session %2 Waiting for %1 to start Waiting for the device to start the upload process... Select upload option on %1 Waiting for you to start the upload process... %1 device is uploading data... Please wait until oximeter upload process completes. Do not unplug your oximeter. Oximeter import completed.. Select a valid oximetry data file Oximetry Files (*.spo *.spor *.spo2 *.dat) No Oximetery module could parse the given file: Oximeter not detected Couldn't access oximeter Live Oximetery Mode Starting up... If you can still read this after a few seconds, cancel and try again Live Import Stopped Live Oximetery Stopped Live Oximetery import has been stopped %1 session(s) on %2, starting at %3 No CPAP data available on %1 %1 Recording... Finger not detected I want to use the time my computer recorded for this live oximetry session. I need to set the time manually, because my oximeter doesn't have an internal clock. Something went wrong getting session data CMS50 Session %1 Oximetry Form Date d/MM/yy h:mm:ss AP R&eset SpO2 Pulse ... &Open .spo/R File Serial &Import &Start Live Serial Port &Rescan Ports PreferencesDialog Preferences &Import Session Settings Combine Close Sessions Minutes Multiple sessions closer together than this value will be kept on the same day. Ignore Short Sessions <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> Day Split Time Sessions starting before this time will go to the previous calendar day. Keep session data in memory to speed up revisiting days. Cache Session Data (uses more system memory) Session Storage Options This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Compress SD Card Backups (slower first import, but makes backups smaller) The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> &CPAP CPAP Mask Information Mask Type Generic mask type. Select the one that's closest to your mask. Description The name of your mask, or at least the name you call it. Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. Mask Profile Statistical Model Leak calcs Started Using The date you started using this mask Leak Profile Pressure Leak <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) Use RDI instead of AHI (PRS1 only) Don't show any compliance information Show Compliance Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. hours as over of usage per night Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Custom User Event Flagging Flow Restriction Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. % <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> Duration of airflow restriction s Event Duration Allow duplicates near machine events. AHI/Hour Graph Settings Window Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. minutes Reset the counter to zero at beginning of each (time) window. Zero Reset CPAP Clock Drift Do not import sessions older than: Sessions older than this date will not be imported dd MMMM yyyy Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) seconds User definable threshold considered large leak L/min Whether to show the leak redline in the leak graph Show Leak Redline Search &Oximetry Type Oximetery Settings Show in Event Breakdown Piechart #1 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Resync Machine Detected Events (Experimental) Tries to forces the oximetry data to link with CPAP when possible. Link Oximetry and CPAP graphs SPO2 Percentage drop in oxygen saturation Pulse Sudden change in Pulse Rate of at least this amount bpm Minimum duration of drop in oxygen saturation Minimum duration of pulse change event. Small chunks of oximetry data under this amount will be discarded. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> &General Changes to the following settings needs a restart, but not a recalc. Preferred Calculation Methods Middle Calculations Upper Percentile For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. Median is recommended for ResMed users. Median Weighted Average Normal Average ResMed users probably should use 99th Percentile for visual consistency. True Maximum 99% Percentile Maximum Calcs General Settings Daily view navigation buttons will skip over days without data records Skip over Empty Days Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. Enable Multithreading Bypass the login screen and load the most recent User Profile Summary only data is more accurate for ResMed users if this is left on. Don't Split Summary Days Create SD Card Backups during Import (Turn this off at your own peril!) Events Reset &Defaults <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> Waveforms Flag rapid changes in oximetry stats Other oximetry options Flag SPO2 Desaturations Below Discard segments under Flag Pulse Rate Above Flag Pulse Rate Below Contec CMS50D+/E/F Contec CMS50F v3.7+ ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Update Oximeter Clock during import Show flags for machine detected events that haven't been identified yet. Show Unknown Flags Skip Login Screen Import without nagging Automatically Check For Updates Check for new version every Sourceforge hosts this project for free.. Please be considerate of their resources.. days. &Check for Updates now Last Checked For Updates: TextLabel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> I want to try experimental and test builds (Advanced users only please.) &Appearance Graph Settings Bar Tops Line Chart Overview Linecharts <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> milliseconds How long you want the tooltips to stay visible. Scroll Dampening Tooltip Timeout Default display height of graphs in pixels Graph Tooltips The visual method of displaying waveform overlay flags. Standard Bars Top Markers Graph Height Overlay Flags Line Thickness The pixel thickness of line plots Other Visual Settings Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. Use Anti-Aliasing Makes certain plots look more "square waved". Square Wave Plots Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. Show event breakdown pie chart Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. Use Pixmap Caching <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> Animations && Fancy Stuff Whether to allow changing yAxis scales by double clicking on yAxis labels Allow YAxis Scaling Application Fonts Font Size Bold Italic Application Graph Text Graph Titles Big Text Details &Cancel &Ok Nasal Pillows Name Color Flag Type Label CPAP Events Oximeter Events Positional Events Sleep Stage Events Unknown Events Double click to change the descriptive name this channel. Double click to change the default color for this channel plot/flag/data. Here you can change the type of flag shown for this event This is the short-form label to indicate this channel on screen. This is a description of what this channel does. Lower Upper CPAP Waveforms Oximeter Waveforms Positional Waveforms Sleep Stage Waveforms Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Data Reindex Required A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? Restart Required One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. Are you really sure you want to do this? Flag Minor Flag Span Always Minor This may not be a good idea ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. If you need to conserve disk space, please remember to carry out manual backups. Are you sure you want to disable these backups? ProfileSelect Select Profile Search: Start with the selected user profile. &Select User Create a new user profile. New Profile Choose a different SleepyHead data folder. &Different Folder SleepyHead [version] Click here if you didn't want to start SleepyHead. &Quit Folder: The current location of SleepyHead data store. [data directory] Open Profile Edit Profile Delete Profile Enter Password for %1 Incorrect Password You entered the password wrong too many times. Enter the word DELETE below to confirm. You are about to destroy profile '%1'. Sorry You need to enter DELETE in capital letters. Could not open profile.. You will need to delete this profile directory manually You will find it under the following location: You entered an incorrect password If you're trying to delete because you forgot the password, you need to delete it manually. There was an error deleting the profile directory, you need to manually remove it. Profile '%1' was succesfully deleted Create new profile Enter Password You entered an Incorrect Password too many times. Exiting! QObject No Data Events Duration (% %1 in events) Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec cm " ft lb oz Kg cmH2O Hours Minutes Seconds Events/hr Hz bpm Litres ml Breaths/min ? Severity (0-1) Degrees Error Warning Information Busy Please Note Compliance Only :( Graphs Switched Off Summary Only :( Sessions Switched Off &Yes &No &Cancel &Destroy &Save BMI Weight Zombie Pulse Rate SpO2 Plethy Pressure Daily Overview Oximetry Oximeter Event Flags CPAP BiPAP Bi-Level EPAP Min EPAP Max EPAP IPAP Min IPAP Max IPAP APAP ASV ST/ASV Humidifier H OA A CA FL SA LE EP VS VS2 RERA PP P RE NR NRI O2 PC UF1 UF2 UF3 PS AHI RDI AI HI UAI CAI FLI REI EPI ÇSR PB IE Insp. Time Exp. Time Resp. Event Flow Limitation Flow Limit SensAwake Pat. Trig. Breath Tgt. Min. Vent Target Vent. Minute Vent. Tidal Volume Resp. Rate Snore Leak Leaks Large Leak LL Total Leaks Unintentional Leaks MaskPressure Flow Rate Sleep Stage Usage Sessions Pr. Relief No Data Available Bookmarks SleepyHead Mode Model Brand Serial Series Machine Channel Settings Inclination Orientation Name DOB Phone Address Email Patient ID Date Bedtime Wake-up Mask Time Unknown None Ready First Last Start End On Off Yes No Min Max Med Average Median Avg W-Avg Import Error This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. Non Data Capable Machine Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. I'm sorry to report that SleepyHead can only track hours of use for this machine. 15mm 22mm Flex Mode PRS1 pressure relief mode. C-Flex C-Flex+ A-Flex Rise Time Bi-Flex Flex Level PRS1 pressure relief setting. x1 x2 x3 x4 x5 Humidifier Status PRS1 humidifier connected? Disconnected Connected Heated Tubing Heated Tubing Connected Headed Tubing Humidification Level PRS1 Humidification level Humid. Lvl. System One Resistance Status Sys1 Resist. Status System One Resistance Setting System One Mask Resistance Setting Sys1 Resist. Set Hose Diameter Diameter of primary CPAP hose System One Resistance Lock Whether System One resistance settings are available to you. Sys1 Resist. Lock Auto On A few breaths automatically starts machine Auto Off Machine automatically switches off Mask Alert Whether or not machine allows Mask checking. Show AHI Whether or not machine shows AHI via LCD panel. Unknown PRS1 Code %1 PRS1_%1 Timed Breath Machine Initiated Breath TB Windows User SleepyHead (%1) needs to upgrade its database for %2 %3 %4 <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> Launching Windows Explorer failed Could not find explorer.exe in path to launch Windows Explorer. SleepyHead does not yet have any automatic card backups stored for this device. This means you will need to import this machine data again afterwards from your own backups or data card. Important: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. Are you ready to upgrade, so you can run the new version of SleepyHead? Machine Database Changes Sorry, the purge operation failed, which means this version of SleepyHead can't start. The machine data folder needs to be removed manually. This folder currently resides at the following location: Rebuilding from %1 Backup Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? SleepyHead will now start the import wizard so you can reinstall your %1 data. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! Therapy Pressure Inspiratory Pressure Lower Inspiratory Pressure Higher Inspiratory Pressure Expiratory Pressure Lower Expiratory Pressure Higher Expiratory Pressure Pressure Support PS Min Pressure Support Minimum PS Max Pressure Support Maximum Min Pressure Minimum Therapy Pressure Max Pressure Maximum Therapy Pressure Ramp Time Ramp Delay Period Ramp Pressure Starting Ramp Pressure Ramp Event Ramp Periodic Breathing A period of periodic breathing Vibratory Snore (VS2) Mask On Time Time started according to str.edf Summary Only % Clear Airway Apnea An apnea where the airway is open Obstructive Apnea An apnea caused by airway obstruction Hypopnea A partially obstructed airway Unclassified Apnea An apnea that could not fit into a category UA An restriction in breathing from normal, causing a flattening of the flow waveform. Respiratory Effort Related Arousal An restriction in breathing that causes an either an awakening or sleep disturbance. Vibratory Snore A vibratory snore A vibratory snore as detcted by a System One machine Pressure Pulse A pulse of pressure 'pinged' to detect a closed airway. A large mask leak affecting machine performance. Non Responding Event A type of respiratory event that won't respond to a pressure increase. Expiratory Puff Intellipap event where you breathe out your mouth. SensAwake feature will reduce pressure when waking is detected. User Flag #1 A user definable event detected by SleepyHead's flow waveform processor. User Flag #2 User Flag #3 Heart rate in beats per minute SpO2 % Blood-oxygen saturation percentage Plethysomogram An optical Photo-plethysomogram showing heart rhythm Pulse Change A sudden (user definable) change in heart rate SpO2 Drop A sudden (user definable) drop in blood oxygen saturation SD Breathing flow rate waveform L/min Mask Pressure Mask Pressure (High resolution) Amount of air displaced per breath Graph displaying snore volume Minute Ventilation Amount of air displaced per minute Respiratory Rate Rate of breaths per minute Patient Triggered Breaths Percentage of breaths triggered by patient Pat. Trig. Breaths Leak Rate Rate of detected mask leakage I:E Ratio Ratio between Inspiratory and Expiratory time ratio Pressure Min Pressure Max Leak Flag LF Perfusion Index A relative assessment of the pulse strength at the monitoring site Perf. Index % Expiratory Time Time taken to breathe out Inspiratory Time Time taken to breathe in Respiratory Event A ResMed data source showing Respiratory Events Graph showing severity of flow limitations Flow Limit. Target Minute Ventilation Target Minute Ventilation? Maximum Leak The maximum rate of mask leakage Max Leaks Apnea Hypopnea Index Graph showing running AHI for the past hour Total Leak Rate Detected mask leakage including natural Mask leakages Median Leak Rate Median rate of detected mask leakage Median Leaks Respiratory Disturbance Index Graph showing running RDI for the past hour Sleep position in degrees Upright angle in degrees CPAP Session contains summary data only PAP Mode PAP Device Mode APAP (Variable) ASV (Fixed EPAP) ASV (Variable EPAP) Zero Upper Threshold Lower Threshold Release Notes &Ok, get on with it.. Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. A faster build of SleepyHead may be available You will not be bothered with this message again. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. Incompatible Graphics Hardware This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. You may need to update your computers graphics drivers from the GPU makers website. %1 (<a href='http://intel.com/support'>Intel's support site</a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. No SleepyHead data folder was found. Would you like SleepyHead to use the default location for storing its data? As you did not select a data folder, SleepyHead will exit. Next time you run, you will be asked again. You did not select a directory. SleepyHead will now start with your old one. Question Choose or create new folder for SleepyHead data Exiting The folder you chose is not empty, nor does it already contain valid SleepyHead data. Are you sure you want to use this folder? About SleepyHead &Close &Donate Unspecified Nasal Pillows Hybrid F/F Mask Nasal Interface Full-Face Mask Are you sure you want to reset all your channel colors and settings to defaults? There are no graphs visible to print Would you like to show bookmarked areas in this report? This make take some time to complete.. Please don't touch anything until it's done. Printing %1 Report %1 Report : %1 hours, %2 minutes, %3 seconds Range Fixed %1 RDI %1 AHI %1 AI=%1 HI=%2 CAI=%3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% UAI=%1 NRI=%1 LKI=%2 EPI=%3 Reporting from %1 to %2 Entire Day's Flow Waveform Current Selection Entire Day SleepyHead v%1 - http://sleepyhead.sourceforge.net Page %1 of %2 SleepyHead has finished sending the job to the printer. Name: %1, %2 DOB: %1 Phone: %1 Email: %1 Address: Usage Statistics This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead Auto Bi-Level ASV Auto EPAP Days: %1 Low Usage Days: %1 (%1% compliant, defined as > %2 hours) (Sess: %1) Bedtime: %1 Waketime: %1 90% (Summary Only) There is a lockfile already present for profile '%1'. You can only work with one instance of an individual SleepyHead profile at a time. Please close any other instances of SleepyHead running with this profile before proceeding. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. There is a lockfile already present for this profile '%1', claimed on '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. Peak %1% %2 Fixed Auto Fixed Bi-Level Auto Bi-Level (Fixed PS) Auto Bi-Level (Variable PS) ASV Fixed EPAP ASV Variable EPAP %1%2 Fixed %1 (%2) Min %1 Max %2 (%3) EPAP %1 IPAP %2 (%3) PS %1 over %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) EPAP %1 PS %2-%3 (%6) %1 %2 Welcome to SleepyHead What would you like to do? Please Import Some Data CPAP<br/>Importer Oximetery<br/>Wizard or View<br/>Statistics It might be a good idea to check preferences first,</br>as there are some options that affect import. First import can take a few minutes. Click this box to see this in daily view. The last time you used your %1... last night yesterday %2 days ago was %1 (on %2) perfect :) pretty darn good reasonably good technically "treated" not very good horrible, please consult your doctor <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> %1 hours, %2 minutes and %3 seconds <font color = red>You only had the mask on for %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. You had significant periods of <i>major</i> mask leakage. Your mask is leaking way too much.. Talk to your CPAP advisor. Your CPAP machine blasted you with a constant %1%2 of air Your pressure was under %1%2 for %3% of the time. Your machine blasted you with a constant %1-%2 %3 of air. Your machine was under %1-%2 %3 for %4% of the time. Your EPAP pressure fixed at %1%2. Your EPAP pressure was under %1%2 for %3% of the time. Your IPAP pressure was under %1%2 for %3% of the time. You had an AHI of %1, which is considered %2 You machine was on for %1. No CPAP data has been imported yet. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> (last night) (yesterday) (%2 day ago) No oximetery data has been imported yet. Very Important Warning <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. Contec CMS50 Fisher & Paykel ICON DeVilbiss Intellipap SmartFlex Settings ChoiceMMed MD300 Respironics M-Series Philips Respironics System One ResMed S9 EPR: Somnopose Somnopose Software Zeo Personal Sleep Coach (% of time) Database Outdated Please Rebuild CPAP Data SleepyHead is proudly brought to you by JediMark. d MMM [ %1 - %2 ] %1 Hide All Events Show All Events Unpin %1 Graph Pin %1 Graph Plots Disabled Duration %1:%2:%3 AHI %1 %1: %2 Relief: %1 Hours: %1h, %2m, %3s Machine Information Journal Data SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead will not touch this folder, and will create a new one instead. Please be careful when playing in SleepyHead's profile folders :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. SleepyHead picked only the first one of these, and will use it in future: If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. CMS50F3.7 CMS50F SmartFlex Mode Intellipap pressure relief mode. Ramp Only Full Time SmartFlex Level Intellipap pressure relief level. VPAP Adapt EPR ResMed Exhale Pressure Relief Patient??? EPR Level Exhale Pressure Relief Level 0cmH2O 1cmH2O 2cmH2O 3cmH2O Weinmann SOMNOsoft2 Loading %1 data... PLease Wait... By Pressure Statistics at Pressure %1 Session #%2 Snapshot %1 QuaZipFilePrivate ZIP/UNZIP API error %1 Report Form about:blank SessionBar No Sessions Present Statistics CPAP Statistics CPAP Usage Average Hours per Night Compliancy Compliance Compliance Therapy Efficiacy Leak Statistics Pressure Statistics Oximeter Statistics Blood Oxygen Saturation Pulse Rate %1 Median Average %1 90% %1 Min %1 Max %1 %1 Index % of time in %1 % of time above %1 threshold % of time below %1 threshold I can haz data?!? This lonely sleepy sheep has no data :( Most Recent Last Week Last 30 Days Last 6 Months Last Year Last Session Details No %1 data available. %1 day of %2 Data on %3 %1 days of %2 Data, between %3 and %4 Usage Information Total Days Compliant Days Days AHI &gt;5.0 Best&nbsp;%1 Worst&nbsp;%1 Best RX Setting Worst RX Setting Changes to Prescription Settings Days Pressure Relief Pressure Settings Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. Machine Information First Use Last Use UpdaterWindow SleepyHead Updater A new version of $APP is available Version Information Release Notes about:blank Build Notes Maybe &Later &Upgrade Now Please wait while updates are downloaded and installed... Updates Component Version Size Progress Log Downloading & Installing Updates &Finished Checking for SleepyHead Updates Requesting Saving as XML update structure parsed cleanly No updates were found for your platform. SleepyHead Updates No new updates were found for your platform. SleepyHead v%1, codename "%2" platform notes A new version of SleepyHead is available! Shiny new <b>v%1</b> is available. You're running old and busted v%2 An update for SleepyHead is available. Version <b>%1</b> is available. You're currently running v%1 SleepyHead v%1 build notes Update to QtLibs (v%1) There was an error parsing the XML Update file. %1 bytes received Redirected to File size mismatch for %1 File integrity check failed for %1 Extracting You might need to reinstall manually. Sorry :( Ugh.. Something went wrong with unzipping. Failed Download Complete There was an error completing a network request: ( Update Complete! Updates Complete. SleepyHead needs to restart now, click Finished to do so. Update Failed :( Download Error. Sorry, try again later. Downloading & Installing Updates... Please wait while downloading and installing updates. gGraph Snapshot gGraphView 100% zoom level Restore X-axis zoom too 100% to view entire days data. Reset Graph Layout Resets all graphs to a uniform height and default order. Y-Axis Plots CPAP Overlays Oximeter Overlays Dotted Lines Remove Clone Clone %1 Graph sleepyhead-0.9.8/Translations/Chinese.zh.ts0000644000175000017500000117474312412506713020266 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. 无法传输血氧仪数æ®. Please ensure you select 'upload' from the oximeter devices menu. 请确认已在血氧仪èœå•中选择'上传'æ“作. CMS50Serial No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving. è¡€æ°§ä»ªå¼€å¯æ—¶é—´è®¾ç½®æ— æ•ˆã€‚在ä¿å­˜ä¹‹å‰ï¼Œè¯·è®¾å®šæœ‰æ•ˆçš„è¡€æ°§ä»ªå¼€å¯æ—¶é—´ã€‚ Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine? F您是å¦å·²ç»åœ¨æ‰“开呼叿œºçš„åŒæ—¶å¼€å¯æ‚¨çš„血氧记录仪? Import Failed 导入失败 Import Failed. Wait for oximeter and try again. 导入失败,请é‡è¯•。 Information æ¶ˆæ¯ The most recent CPAP Session time has been selected as the start of your oximetry session. If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter. ä¸€èˆ¬æƒ…å†µä¸‹ï¼Œå‘¼å¸æœºä¸Žè¡€æ°§ä»ªæ˜¯åŒæ—¶å¼€å¯å·¥ä½œçš„ã€‚å¦‚æžœæ‚¨å¿˜è®°å¯¼å…¥å‘¼å¸æœºçš„æ•°æ®ï¼ŒçŽ°åœ¨å°±åšå§ï¼ç„¶åŽè¯·å†æ¬¡å¯¼å…¥è¡€æ°§ä»ªæ•°æ®ã€‚ Set Oximeter to Upload è¡€æ°§ä»ªä¸Šä¼ æ•°æ® Question 问题 Please Wait, Importing... 请ç¨åŽï¼Œæ•°æ®å¯¼å…¥ä¸­... Processing... 进行中... Daily B ç²— u 线 U1 U1 U2 U2 U3 U3 i æ–œ %1% %1% ... ... ASV ASV适应性支æŒé€šæ°”æ¨¡å¼ Avg å¹³å‡ Big 大 Med 中间值 100% 100% Form 表格 Next å‰è¿› Prev åŽé€€ Wake 醒 Apnea æš‚åœ Color 颜色 Int. Pulse åˆå§‹è„‰æ Notes 备注 Reset é‡ç½® Sleep ç¡ Small å° Hypopnea 低通气 Show all graphs 显示所有图表 Clear Airway å¼€æ”¾æ°”é“ Journal 日记 Reset the graph heights to uniform sizes 统一图表高度 Position Sensor Sessions ä½ç½®ä¼ æ„Ÿå™¨ä¼šè¯ Add Bookmark 添加标记 Remove Bookmark 删除标记 Pick a Colour 选择一ç§é¢œè‰² Complain to your Equipment Provider! è°´è´£ä½ çš„å‘¼å¸æœºä¾›åº”商å§! Session Information 会è¯ä¿¡æ¯ Sessions all off! 关闭所有会è¯! Oximetery Sessions è¡€æ°§è®¡ä¼šè¯ %1 event %1 事件 Go to the most recent day with data records è·³è½¬åˆ°æœ€è¿‘çš„æ•°æ® Machine Settings 设置 No Graphs On! 无图表显示! <b>Please Note:</b> This day just contains summary data, only limited information is available . <b> 请注æ„:</b> 这一天åªå«æœ‰ç®€æ˜“æ•°æ®ï¼Œä¿¡æ¯å¾ˆæœ‰é™ã€‚ User Flags 用户标记 B.M.I. 体釿Œ‡æ•°. Sleep Stage Sessions ç¡çœ é˜¶æ®µä¼šè¯ Oximeter Information è¡€æ°§ä»ªä¿¡æ¯ Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked. 血氧仪存在这一日期的数æ®,但是时间戳存在差异,所以图形显示ä¸ä¼šè¢«å…³è”. Ctrl+B Ctrl+B Ctrl+I Ctrl+I Events 事件 CPAP Sessions æ­£åŽ‹å‘¼å¸æœºé˜¶æ®µä¼šè¯ Medium 中 PB/CSR å‘¨æœŸæ€§å‘¼å¸ Zoom fully out ç¼©åˆ°æœ€å° Starts 开始 VSnore 鼾声指数 Sorry, your machine only provides compliance data. 对ä¸èµ·ï¼Œä½ çš„è®¾å¤‡åªæä¾›ç›¸å®¹æ•°æ®ã€‚ Weight ä½“é‡ This bookmarked is in a currently disabled area.. 此标记现ä½äºŽä¸å¯ç”¨åŒºåŸŸã€‚ Zombie æžå·® Bookmarks 标记簇 %1 events %1 事件 events 事件 BRICK :( 崩溃 :( Exh&nbsp;Puff 排&nbsp;æ°” Int. SpO2 åˆå§‹è¡€æ ·é¥±å’Œåº¦ Event Breakdown 时间分类 Selection AHI 所选AHI SpO2 Desaturations 血氧低饱和 Awesome æžå¥½ Pulse Change events 脉æå˜åŒ–事件 Flow Limit æ°”æµé™åˆ¶ SpO2 Baseline Used 血样饱和度基准 Zero hours?? é›¶å°æ—¶?? PAP Setting 呼叿œºè®¾ç½® Obstructive 阻塞性 Go to the previous day å‰ä¸€å¤© Drop down this list to show/hide available graphs. 滚动èœå•以显示更多图表。 Bookmark at %1 在%1添加标记 Statistics 统计 Events/hour 事件/å°æ—¶ Breakdown 分类 Unknown Session æœªçŸ¥ä¼šè¯ VSnore2 鼾声指数II Sessions exist for this day but are switched off. 会è¯å­˜åœ¨ï¼Œä½†æ˜¯å·²è¢«å…³é—­ã€‚ PAP Mode: %1<br/> 正压通气模å¼: %1<br/> Duration æ—¶é•¿ View Size 显示尺寸 Hide all graphs éšè—所有图表 Impossibly short session ä¸å¯ç”¨çš„ä¼šè¯ No Graphs :( 没有图表 :( No %1 events are recorded this day æ—  %1 事件 Oximetry data exists for this day, however it's timestamps are too different, so the Graphs will not be linked. 血氧仪有数æ®è®°å½•,但是时钟ä¸åŒ¹é…,故图表ä¸å…³è”。 Show or hide the calender 显示或者éšè—日历 One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. è¿™ä¸€ä¼šè¯æœ‰å¤šä¸ªæ³¢å½¢ï¼Œå…¶ä¸­å¾ˆå¤šæ³¢å½¢ä¸èƒ½æ­£ç¡®å åŠ ï¼Œé€ æˆæºæ•°æ®å‡ºé”™ã€‚ I'm feeling... 我感觉... No data available æ•°æ®ä¸å¯ç”¨ Go to the next day 下一天 Session Start Times 会è¯å¼€å§‹æ¬¡æ•° Session End Times 会è¯ç»“æŸæ¬¡æ•° Machine Settings Unavailable 设置ä¸å¯ç”¨ EPR:%1 EPR_LEVEL:%2 EPR:%1 EPR_LEVEL:%2 This day has missing pressure, mode and settings data. 所选日期的压力,模å¼ä»¥åŠè®¾ç½®æ•°æ®ä¸¢å¤±. %1%2 %1%2 This day just contains summary data, only limited information is available . ä»…æœ‰æ­¤æ—¥çš„æ¦‚è¦æ•°æ®.仅嫿œ‰å°‘é‡å¯ç”¨ä¿¡æ¯. Time over leak redline æ¼æ°”æ—¶é•¿è¶…é™ Summary Only :( 仅有概è¦ä¿¡æ¯:( UF1 UF1 UF2 UF2 Flags: 标记: Total time in apnea æš‚åœæ€»æ—¶é—´ Total ramp time æ–œå¡å‡åŽ‹æ€»æ—¶é—´ Time outside of ramp æ–œå¡å‡åŽ‹ä»¥ä¸ºçš„æ—¶é—´ AHI excluding ramp 包å«è°æ³¢å‡åŽ‹æ—¶çš„AHI Hide all events éšè—所有事件 Show all events 显示所有事件 Flags 标记 Graphs 图表 "Nothing's here!" Bob is bored with this days lack of data. ExportCSV ... ... AHI AHI End ç»“æŸ %1% %1% Avg å¹³å‡ Date 日期 End: 结æŸ: Quick Range: 快速范围: Daily 日常 Event 事件 Start 开始 Last Fortnight å‰ä¸¤å‘¨ Most Recent Day 最近的 Count 计数 Filename: 文档åç§°: Select file to export to 选择文件导出到 Resolution: 分辨率: Cancel å–æ¶ˆ Dates: 日期: Custom 自定义 Export 导出 Start: 开始: Data/Duration æ•°æ®/æ—¶é•¿ CSV Files (*.csv) CSV文件(*.ccsv) Last Month 上个月 SleepyHead_ SleepyHead_ Last 6 Months 过去六个月 Total Time 总时长 DateTime 日期 æ—¶é—´ Session Count 会è¯è®¡æ•° Session ä¼šè¯ Everything 所有 Last Week 上周 Last Year 去年 Export as CSV 导出为CSVæ ¼å¼æ•°æ® Sessions_ 会è¯_ Details 详情 Summary_ 概è¦_ Details_ 详情_ Sessions ä¼šè¯ FPIconLoader Import Error 导入出错 This Machine Record cannot be imported in this profile. 本机器所存数æ®ä¸èƒ½å¯¼å…¥æ­¤ç”¨æˆ·. The Day records overlap with already existing content. 本日的数æ®å·²è¦†ç›–已存储的内容. MainWindow - - F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 ... ... F11 F11 F12 F12 Yes 是的 CPAP æŒç»­æ°”铿­£åŽ‹é€šæ°” Gah! 哦! Help 帮助 CPAP data was recently purged and needs to be re-imported. 呼叿œºçš„æ•°æ®å·²è¢«æ¸…é™¤ï¼Œè¯·é‡æ–°å¯¼å…¥. DISCLAIMER: å…责声明: About SleepyHead 关于SleepyHead &Data &æ•°æ® &File &文档 &Help &帮助 &View &查看 There was a problem opening Somnopose Data File: 打开ç¡å§¿æ•°æ®æ–‡ä»¶å‡ºé”™: &About SleepyHead &关于 SleepyHead E&xit &退出 Daily 日常 Note: 注æ„: Would you like to import from the path(s) shown above? 您希望从如上显示的路径导入数æ®å—? <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Main_Page">SleepyHead 维基百科</a><br/> Import &ZEO Data 导入&ZEOæ•°æ® Copyright: 版æƒ: MSeries Import complete Mç³»åˆ—å‘¼å¸æœºæ•°æ®å¯¼å…¥å®Œæˆ There was an error saving screenshot to file "%1" é”™è¯¯ä¿¡æ¯æˆªå±å­˜å‚¨åœ¨ "%1"文档中 New Location æ–°ä½ç½® This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. 这款软件用于å助读å–用于治疗ç¡çœ éšœç¢çš„å„ç§CPAP的数æ®. Importing Data æ­£åœ¨å¯¼å…¥æ•°æ® No CPAP data card detected, launching file dialog... æ²¡æœ‰æ£€æµ‹åˆ°å‘¼å¸æœºæ•°æ®å¡ï¼Œæ­£åœ¨å¯åЍ坹è¯... Select another folder 选择其他文件夹 Online Users &Guide 在线&æŒ‡å— The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. 作者ä¸ä¸ºä½¿ç”¨è€…由于任何形å¼çš„使用此软件对其所造æˆçš„任何伤害负责. Please wait, launching file dialog... 请ç¨ç­‰,正在å¯åЍ坹è¯... View O&ximetry 查看&è¡€æ°§æ•°æ® Are you sure you want to purge all CPAP data for the following machine: 你确定需è¦åˆ é™¤æ‰€æœ‰å‘¼å¸æœºæ•°æ®å—: Online Help Resources 在线帮助 View &Welcome 查看&æ¬¢è¿Žä¿¡æ¯ Currenly supported machines: 所支æŒçš„æœºåž‹: View S&ummary 查看&æ¦‚è¦ This software is NOT suitable for medical diagnosis, CPAP complaince reporting and other similar purposes. 这款软件ä¸é€‚ç”¨äºŽåŒ»ç–—è¯Šæ–­ï¼Œå‘¼å¸æœºå…¼å®¹æ€§æŠ¥å‘Šå‡ºå…·ä»¥åŠå…¶å®ƒç±»ä¼¼çš„目的。 Loading Data è½½å…¥æ•°æ® This software comes with absolutely no warranty, either express of implied. è¯¥è½¯ä»¶ä¸æä¾›è´¨ä¿ã€‚ There was a problem opening MSeries block File: 打开Mç³»åˆ—å‘¼å¸æœºæ–‡ä»¶å‡ºé”™: <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. SleepyHead的编写时基于 <a href="http://qt-project.org">Qt Application æž¶æž„</a>. Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters 康泰 CMS50D+, CMS50E and CMS50F 血氧仪 Kudos & Credits 致&è°¢ Recalculations are complete, the application now needs to restart to display the changes. å†è®¡ç®—完毕。软件需è¦é‡å¯ä»¥æ˜¾ç¤ºæ–°æ•°æ®ã€‚ Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) 飞利浦伟康System One(CPAP Pro, Auto, BIPIP & ASV模å¼) &copy;2011-2014 &copy;2011-2014 Build Date 建档日期 The author and any associates of his accept NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. 本软件的作者以åŠå作者对由于软件正常或滥用期间é‡åˆ°çš„é‡è¦æˆ–者éžé‡è¦é—®é¢˜æ‰€äº§ç”Ÿçš„æŸå以åŠä¸åˆ©å½±å“ä¸äºˆè´Ÿè´£ã€‚ Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt 请使用 QT 4.8.5 或其更高版本,æ¥ä¿®å¤SleepyHead由于打å°é”™è¯¯å¯¼è‡´çš„崩溃 &About &关于 Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ ä¸è¦å¿˜è®°ä¸º SleepyHead 在 <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> 或者 <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ 上点赞 &Link Graph Groups &å…³è”图表组 Further Information æ›´è¿›ä¸€æ­¥çš„ä¿¡æ¯ View &Daily 查看&日常 View &Overview 查看&总览 Import Problem Couldn't find any new Machine Data at the locations given 导入出错 没有å‘çŽ°æ–°çš„æ•°æ® Access to Preferences has been blocked until recalculation completes. 釿–°è®¡ç®—完æˆä¹‹å‰ï¼Œå‚数设置功能将ä¸èƒ½å®žçŽ°ã€‚ Import RemStar &MSeries Data 导入瑞斯迈&Mç³»åˆ—å‘¼å¸æœºæ•°æ® Loading 载入中 &Help Browser &帮助 Got a neat idea on how to improve SleepyHead? Check out SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent</a> 有帮助 SleepyHead 改进的好办法? 去 SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">金点å­çœ‹çœ‹</a> Do you have a CMS50[x] Oximeter? One is required to use this section. 你的血氧仪是CM550[x]å—? 本软件适用这款产å“。 &Current Selected Day &所选日期 Change &User 更改&用户 Would you like to remember this import location for next time? 希望为了方便下次使用而记ä½è¿™ä¸ªå¯¼å…¥ä½ç½®å—? All data for current CPAP machine 所有当å‰å‘¼å¸æœºçš„æ•°æ® In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. SleepyHead使用<a href="http://sourceforge.net/projects/quazip">Sergey A. Tachenov çš„</a> QuaZip,所更新的代ç ä½äºŽä¸€ä¸ªå°è£…C++外壳内的Gilles Vollant çš„ ZIP/UNZIP压缩包. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. 为 Mac用户 加入一些 <a href='qrc:/docs/usage.html'>使用注æ„</a>, 和其他é‡è¦ä¿¡æ¯. Friendly forums to talk and learn about Sleep Apnea: å¯ä»¥ç”¨æ¥å­¦ä¹ å’Œè®¨è®ºç¡çœ æš‚åœçš„论å›: Please wait, scanning for CPAP data cards... 请ç¨ç­‰,正在扫æç”±å­˜å‚¨å¡æ‰«ææ•°æ®.. View S&tatistics 查看统&计 Monthly æ¯æœˆ Cancel å–æ¶ˆ Change &Language 更改&语言 This software is released under the GNU Public License v3.0<br/> 这个软件是基于GNU V3.0版本å‘布的<br/> Import from where? å¯¼å…¥æ¥æº? <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Frequently_Asked_Questions">常è§é—®é¢˜</a><br/> Loading Event Data è½½å…¥äº‹ä»¶æ•°æ® SleepyHead's Online <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> SleepyHead 在线 <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">使用指å—</a><br/> No guarantees are made regarding the accuracy of any data this program displays. ä¸ä¿è¯æœ¬è½¯ä»¶æ˜¾ç¤ºçš„æ‰€æœ‰æ•°æ®çš„准确性。 It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module. 血氧仪模å—通信串å£ä½¿ç”¨æ”¯æŒå¤šå¹³å°çš„ <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> æ•°æ®åº“. Import 导入 Are you sure you want to purge all CPAP data for the following machine: 你确定需è¦åˆ é™¤æ‰€æœ‰å‘¼å¸æœºæ•°æ®å—: The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. 本软件的作者以åŠå作者对由于软件正常或滥用期间é‡åˆ°çš„é‡è¦æˆ–者éžé‡è¦é—®é¢˜æ‰€äº§ç”Ÿçš„æŸå以åŠä¸åˆ©å½±å“ä¸äºˆè´Ÿè´£ã€‚ It comes with no guarantee of fitness for any particular purpose. ä¸åšé€‚åˆä»»ä½•特定任务的ä¿è¯ã€‚ Authors Twitter Feed 作者TWITTERå馈 Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. 特别感谢æ¥è‡ªCAPAPTalkçš„ <a href='http://cpaptalk.com'>Pugsy</a> å¯¹æ–‡æ¡£ä»¥åŠæ•™ç¨‹çš„制作的帮助, 也å‘å…¶ä»–å助测试软件并分享数æ®çš„å„ä½è‡´è°¢. Would you like this done automatically from the Backup Folder? 您希望自动导入备份文件夹的内容å—? Please wait, importing from backup folder(s)... 请ç¨ç­‰,正在由备份文件夹导入... Welcome to SleepyHead 欢迎使用SleepyHead SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. SleepyHead是一款基于开å‘者个人ç¡çœ éšœç¢æ–¹é¢çš„ç»éªŒï¼Œä»¥åŠä¼—多饱å—类似困扰的众多测试者的å馈,编写而æˆ. Restart Required 需è¦é‡å¯ ResMed S9 Oximeter Attachment 瑞æ€è¿ˆS9血氧仪附件 &Bookmarks &标记 Right &Sidebar å³&ä¾§è¾¹æ  This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. è¿™ä¸æ˜¯ä¸€æ¬¾åŒ»ç–—软件,它仅仅是一款将数æ®å›¾å½¢åŒ–显示的研究工具。 Click here to choose a folder 请选择一个文件夹 &Rebuild Oximetry Indices &é‡å»ºè¡€æ°§ç´¢å¼• branch 分支 Translators: 翻译: Remember this Location? è®°ä½è¿™ä¸ªä½ç½®å—? The Usual 常用 Profile é…置文件 View Statistics æŸ¥çœ‹ç»Ÿè®¡ä¿¡æ¯ CPAP Data Located æ•°æ®å·²å®šä½ Access to Import has been blocked while recalculations are in progress. 导入数æ®é‡é˜»ï¼Œé‡æ–°è®¡ç®—进行中。 <p>The author wishes to express thanks to James Marshall and Rich Freeman for their assistance with this project.</p> <p>感谢 James Marshallå’Œ Rich Freeman 的帮助</p> Sleep Disorder Terms &Glossary 呼å¸å¤±è°ƒç—‡æœ¯è¯­&定义 This is a beta release, some features may not yet behave as expected. 这是测试版,有些功能并ä¸å®Œå–„. Copyright ç‰ˆæƒ about:blank about:空白 SleepyHead Project Page SleepHead 项目页 *** <u>Use at your own risk</u> *** *** <u>åŽæžœè‡ªè´Ÿ</u> *** &Records &ä¿å­˜ Use &AntiAliasing 使用&抗锯齿设置 I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. ä¸å»ºè®®ä½¿ç”¨è¿™ä¸ªå†…建æµè§ˆå™¨ç½‘上冲浪,尽管它å¯ä»¥,但是在æŸç§ç¨‹åº¦ä¸Šï¼Œå®ƒå…¶å®žåªæ˜¯ä¸ªå¸®åŠ©æ–‡æ¡£. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia ç¡çœ å‘¼å¸æš‚åœ<a href='http://en.wikipedia.org/wiki/Sleep_apnea'>在</a>维基百科 This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. è¿™ <font color='red'><u>并䏿˜¯</u></font> 一款医疗软件.它仅仅是一款数æ®è¯»æ˜¾è½¯ä»¶ ,且ä¸ä¿è¯ä»»ä½•è®¡ç®—ä»¥åŠæ˜¾ç¤ºä¿¡æ¯çš„ç²¾ç¡®æ€§ä»¥åŠæ­£ç¡®æ€§. Somnopause Data Import complete ç¡å§¿æ•°æ®å¯¼å…¥å®Œæˆ Report Mode æŠ¥å‘Šæ¨¡å¼ Bugfixes, Patches and Platform Help: 纠错,è¡¥ä¸ä»¥åŠç³»ç»Ÿå¹³å°å¸®åŠ©æ–¹é¢: <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary">ç¡çœ éšœç¢ä¸“业术语</a><br/> &Profiles &é…置文件 DeVilbiss Intellipap (Auto) 德百世Intellipap(Auto) SleepyHead, brought to you by Jedimark SleepyHead作者: Jedimark Use this software entirely at your own risk. 使用此款软件的风险由用户自行承担。 Printing Disabled 打å°ç¦ç”¨ Standard 标准的 There was a problem opening ZEO File: ZEO文档出错: Loading... 载入中... CPAP Datacard structures were detected at the following locations: 在如下ä½ç½®æ£€æµ‹åˆ°å‘¼å¸æœºæ•°æ®: Statistics 统计 &Statistics &统计 Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. è¯·ç‰¢è®°éœ€æŒ‡å‘æ‚¨çš„æ•°æ®å¡çš„æ ¹ç›®å½•或者盘符,è€Œä¸æ˜¯å­ç›®å½•. Do you just want to Import from the usual (remembered) locations? 希望从已记ä½çš„ä½ç½®è¿›è¡Œå¯¼å…¥å—? Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here. Chen, you may put your own name here!! Arie Klerk (Dutch), Steffen Reitz (German), åŽç»­å°†ä¼šåŠ å…¥æ›´å¤š. Ctrl+Tab Ctrl+Tab &Support SleepyHead Development &支æŒSleepyHeadçš„å¼€å‘ &Support Sleepyhead Development &帮助 SleepyHead 改进 <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">警告: </span>这是一个预å‘布版本的软件,其部分功能å¯èƒ½å¹¶ä¸å°½å¦‚人æ„.</p></body></html> 3rd Party Libaries: 第三方数æ®åº“: ResMed S9 models (CPAP, Auto, VPAP) 瑞æ€è¿ˆ S9 (CPAP, Auto, VPAP) Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. 对于您的å¥åº·,您的医生是您最好的选择. &Advanced &高级 Zeo CSV Import complete Zeo CSVå¯¼å…¥å®Œæˆ Question 问题 &Import Data &å¯¼å…¥æ•°æ® Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. æ­¤<a href='qrc:/docs/release_notes.html'>版本的</a> 介ç». This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. 这款软件ä¸é€‚ç”¨äºŽåŒ»ç–—è¯Šæ–­ï¼Œå‘¼å¸æœºå…¼å®¹æ€§æŠ¥å‘Šå‡ºå…·ä»¥åŠå…¶å®ƒç±»ä¼¼çš„目的. Print &Report 打å°&报告 &Reset Graph Layout &é‡ç½®å›¾è¡¨å¸ƒå±€ Performance will be degraded during these recalculations. 在å†è®¡ç®—的过程中,软件性能会é™ä½Žã€‚ This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. å…è´¹å‘布基于<a href="qrc:/COPYING">GNU Public 许å¯</a>. SleepyHead SleepyHead If you can read this, the restart command didn't work. Your going to have to do it yourself manually. 如果你看到此æ¡ä¿¡æ¯ï¼Œè¯´æ˜Žé‡å¯å‘½ä»¤æœªèµ·ä½œç”¨ï¼Œéœ€è¦æ‰‹åЍé‡å¯ã€‚ SleepyHead Wiki SleepHead 维基百科 Take &Screenshot &æˆªå± Overview 总览 Exp&ort &导出 Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. 感谢使用SleepyHead,如果觉得它好用,请ä¸å通过Paypalæèµ ï¼Œå¯¹å…¶çš„完善进行支æŒ. Show Debug Pane æ˜¾ç¤ºè°ƒè¯•é¢æ¿ Revision: 版本: Task Completed ä»»åŠ¡ç»“æŸ &Edit Profile &编辑é…置文件 Import Reminder 导入æç¤º Recalculations are now complete. 计算完æˆã€‚ Welcome æ¬¢è¿Žä¿¡æ¯ Import &Somnopose Data 导入&ç¡å§¿æ•°æ® James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone. James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone. SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> Check for &Updates 检查&æ›´æ–° Screenshot saved to file "%1" 截å±å­˜å‚¨äºŽ "%1" &Preferences &傿•°è®¾ç½® Fisher & Paykel ICON (CPAP, Auto) è´¹&雪(CPAP, Auto) If you find this free software to be of use, please consider supporting the development efforts by making a paypal donation to the Author 这是一款å…费软件,å¯ä»¥é€šè¿‡åˆ°PayPalææ¬¾ä»¥æ”¯æŒæ­¤æ¬¾è½¯ä»¶çš„开呿”¹è¿› Recalculating Summaries 汇总统计中 &Fullscreen Toggle &å…¨å±åˆ‡æ¢ Please report any bugs you find to SleepyHead's SourceForge page. 请将è¿è¡Œè½¯ä»¶ä¸­é‡åˆ°çš„错误å‘é€åˆ°SourceForgeçš„SleepyHead页é¢. &Frequently Asked Questions &常è§é—®é¢˜ &Purge CPAP Data &æ¸…é™¤æ•°æ® qrc:/docs/index.html qrc:/docs/index.html Shift+F2 Shift+F2 Oximetry 血氧测定 Please wait, SleepyHead is importing data... 请ç¨ç­‰,SleepyHead正在导入数æ®... Data successfully imported from the following locations æ•°æ®å·²æœ‰å¦‚下ä½ç½®æˆåŠŸå¯¼å…¥ Recalculating Indices 釿–°è®¡ç®—指数 (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) (未使用SSL加密技术,所以请ä¸è¦æŠŠå¯†ç æˆ–其他个人信æ¯é”®å…¥å…¶ä¸­) Data Folder Location 文件ä½ç½® Change &Data Folder 更改&文件夹 License: 许å¯: &Navigation &导航 Are you sure? 确定? Date Range 日期范围 Purge Oximetery Data æ¸…é™¤è¡€æ°§ä»ªæ•°æ® O&ximetry Wizard è¡€&氧仪安装å‘导 Purge &Current Selected Day 清除&æ‰€é€‰å¤©çš„æ•°æ® Current Days 当å‰å¤©æ•° <b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum. <b>警告:</b> 这是一款以测试为目的的预å‘售软件,请勿 <b>NOT</b>分享到SleepyHead Testing Forum以外. Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version. Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version. When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. <b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes. <b>警告:</b> 本软件所生æˆçš„æŠ¥å‘Šä¸å¯ç”¨äºŽåŒ»ç–—诊断. These messages are only a temporary feature. Some people thought they were an error. These messages are only a temporary feature. Some people thought they were an error。 Data successfully imported from the following locations: æ•°æ®å·²ä»Žä»¥ä¸‹ä½ç½®æˆåŠŸå¯¼å…¥: Couldn't find any new Machine Data at the locations given. 指定ä½ç½®æœªå‘现å¯ç”¨æ•°æ®. Import Problem 导入错误 Choose a folder 选择一个文件夹 SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> SleepyHead 的在线 <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">用户手册</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">常è§é—®é¢˜</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">术语</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> Build Date: %1 %2 创建日期: %1 %2 Graphics Engine: %1 图形引擎:%1 Data Folder Location: %1 æ•°æ®æ–‡ä»¶å¤¹ä½ç½®:%1 Are you sure you want to purge all CPAP data for the following machine: 你确定清除如下机器的所有数æ®: Not all session data could be removed, you have to delete the following folder manually. æœªèƒ½æ¸…é™¤æ‰€æœ‰ä¼šè¯æ•°æ®,请手动清除如下文件夹. Machine data has been successfully purged. æ•°æ®å·²ç»æˆåŠŸæ¸…é™¤. Would you like to reimport from the backup folder? æ‚¨å¸Œæœ›ç”±å¤‡ä»½æ–‡ä»¶å¤¹é‡æ–°å¯¼å…¥æ•°æ®å—? Please wait, importing... 请ç¨åŽ.正在导入... Are you sure you want to delete oximetry data for %1 确定清除%1内的血氧仪数æ®å— <b>Please be aware you can not undo this operation!</b> <b>è¯·æ³¨æ„æ‚¨ä¸èƒ½æ’¤é”€è¯¥æ“作!</b> Select the day with valid oximetry data in daily view first. è¯·å…ˆåœ¨æ¯æ—¥è§†å›¾ä¸­é€‰æ‹©æœ‰æ•ˆè¡€æ°§ä»ªæ•°æ®. Rebuild CPAP Data é‡å»ºæ•°æ® Exit 推出 &Automatic Oximetry Cleanup &血氧仪数æ®è‡ªåŠ¨æ¸…ç† Toggle &Line Cursor 切æ¢&线游标 Foo FOO Please insert your CPAP data card... 请æ’入呼叿œºæ•°æ®å¡... Are you sure you want to rebuild all CPAP data for the following machine: 确定在如下机器中é‡å»ºå‘¼å¸æœºæ•°æ®å—: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. 请注æ„,这将在SleepHead内部存储被关闭或者其他原因使得未能正确存储的情况下,导致图表数æ®ä¸¢å¤±. For some reason, SleepyHead does not have internal backups for the following machine: 由于æŸç§åŽŸå› ,Sleephead并没有此机器的内部备份文件: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Are you really sure you want to do this? 确定? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: 清除未能正确进行,请手动删除: Because there are no internal backups to rebuild from, you will have to restore from your own. 由于没有å¯ç”¨çš„内部备份å¯ä¾›é‡å»ºä½¿ç”¨ï¼Œè¯·è‡ªè¡Œé‡æ–°å¯¼å…¥ã€‚ Would you like to import from your own backups now? (you will have no data visible for this machine until you do) 您希望从立å³ç”±å¤‡ä»½å¯¼å…¥å—?(完æˆå¯¼å…¥ï¼Œæ‰èƒ½æœ‰æ•°æ®æ˜¾ç¤º) A %1 file structure for a %2 was located at: %1文件结构的%2ä½ç½®åœ¨: A %1 file structure was located at: %1 文件结构的ä½ç½®åœ¨: Would you like to import from this location? 从这里导入å—? Specify 指定 Navigation 导航 Bookmarks 标记簇 Records 存档 Purge ALL CPAP Data åˆ é™¤æ‰€æœ‰å‘¼å¸æœºæ•°æ® F10 F10 Ctrl+L Ctrl+L Daily Sidebar æ¯æ—¥ä¾§è¾¹æ  Daily Calendar 日历 F9 F9 Imported %1 CPAP session(s) from %2 导入 %1呼叿œºä¼šè¯ç”± %2 Import Success 导入æˆåŠŸ Already up to date with CPAP data at %1 å·²å…¨éƒ¨æ›´æ–°çš„å‘¼å¸æœºæ•°æ®åœ¨ %1 Up to date 最新 Couldn't find any valid Machine Data at %1 æ²¡æœ‰æœ‰æ•ˆçš„å‘¼å¸æœºæ•°æ®åœ¨ %1 You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: ä½ å°†è¦ <font size=+2>消除</font> SleepyHead为如下机器建立的数æ®åº“: Note as a precaution, the backup folder will be left in place. 以防万一,备份文件夹将被ä¿ç•™. Are you <b>absolutely sure</b> you want to proceed? 您 <b>完全肯定</b> 需è¦ç»§ç»­å—? Exp&ort Data Backup &Journal <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Please ensure you are running the latest version before reporting any bugs. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! This red message line is intentional, and will not be a feature in the final version... Data Folder Location: <a href="file://%1">%2</a> James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. %1's Journal Choose where to save journal XML Files (*.xml) MinMaxWidget Auto-Fit Defaults Override The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. The Minimum Y-Axis value.. Note this can be a negative number if you wish. The Maximum Y-Axis value.. Must be greater than Minimum to work. Scaling Mode This button resets the Min and Max to match the Auto-Fit NewProfile ... ... ASV 适应性支æŒåŒæœŸæ¨¡å¼ APAP 全自动正压通气 CPAP æŒç»­æ°”铿­£åŽ‹é€šæ°” Male ç”· &Back &上一步 &Next &下一步 TimeZone 时区 Email 电å­é‚®ä»¶ Phone ç”µè¯ Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. 所有生æˆçš„æŠ¥å‘Šä»…é™ä¸ªäººä½¿ç”¨,且ä¸èƒ½å¤Ÿä½œä¸ºåŒ»ç–—诊断. SleepyHead is copyright &copy;2011-2014 Mark Watkins SleepyHead 版æƒå½’于 &copy;2011-2014 Mark Watkins <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; font-style:italic;">Welcome to SleepyHead</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">This software is being designed to help you review data related to your CPAP treatment.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">It's intended as merely a data viewer, and not a substitute for competent medical guidance from your Doctor. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">This software has been released freely under the </span><a href="qrc:/LICENSE.txt"><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline; color:#0000ff;">GNU Public License</span></a><span style=" font-family:'Sans'; font-size:10pt;">, and comes with no warranty, and without ANY claims to fitness for any purpose.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Accuracy of any data displayed is not and can not be guaranteed. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;"><br />Any reports generated are for PERSONAL USE ONLY, and not fit for compliance purposes.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The author will not be held liable for </span><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline;">anything</span><span style=" font-family:'Sans'; font-size:10pt;"> related to the use or misuse of this software. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Use at your own risk. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">This software is copyright ©2011 Mark Watkins </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; font-style:italic;">欢迎使用SleepyHead</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">æœ¬è½¯ä»¶ç”¨äºŽå‘¼å¸æœºæ•°æ®è¯»å–并图形化显示.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">本软件的作用为数æ®è¯»å–与显示,并ä¸èƒ½ä½œä¸ºè¯Šæ–­ä¾æ®. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">本软件基于GNU </span><a href="qrc:/LICENSE.txt"><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline; color:#0000ff;">å…è´¹å‘布</span></a><span style=" font-family:'Sans'; font-size:10pt;">, 并䏿供 ä»»ä½•å½¢å¼ çš„å…³äºŽ.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">æ•°æ®å‡†ç¡®æ€§çš„ä¿è¯. </span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;"><br />任何ç»ç”±æ­¤è½¯ä»¶ç”Ÿæˆçš„æŠ¥å‘Šä½œä¸ºè‡ªç”¨å‚考,ä¸é€‚用于任何以éµä»Žæ€§(医嘱等)为目的的用途.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">ä½œè€…ä¸æ‰¿æ‹… </span><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline;">任何</span><span style=" font-family:'Sans'; font-size:10pt;"> 由于软件使用引起的问题所带æ¥çš„æŸå¤±. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Use at your own risk. </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">ç‰ˆæƒæ‰€æœ‰ ©2011 Mark Watkins </span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p></body></html> The author will not be held liable for <u>anything</u> related to the use or misuse of this software. 作者ä¸ä¸º <u>任何</u> 使用本软件造æˆçš„åŽæžœè´Ÿè´£. &Close this window &å…³é—­çª—å£ Edit User Profile ç¼–è¾‘ç”¨æˆ·ä¿¡æ¯ qrc:/docs/update_notes.html qrc:/docs/update_notes.html CPAP Treatment Information 呼叿œºæ²»ç–—ä¿¡æ¯ Password Protect Profile 密ç ä¿æŠ¤ Accuracy of any data displayed is not and can not be guaranteed. ä¸ä¿è¯ä»»ä½•显示数æ®çš„æ­£ç¡®æ€§. D.O.B. 生日. Click here to choose where to store SleepyHead data. 点击选择存储SleepyHeadæ•°æ®çš„ä½ç½®ã€‚ Data Folder æ•°æ®æ–‡ä»¶å¤¹ Female 女 Gender 性别 Height 身高 Contact Information è”ç³»æ–¹å¼ Locale Settings 地点 SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. SleepyHead仅是一款数æ®è¯»æ˜¾è½¯ä»¶,å¹¶ä¸é€‚用于å–代您的医生所给的建议. Welcome to SleepyHead 欢迎使用SleepyHead CPAP Mode CPAPæ¨¡å¼ Select Country 国家 PLEASE READ CAREFULLY 请认真阅读 Untreated AHI 未治疗时的AHI Keep the kids out.. Nothing more.. This isn't meant to be uber security. 远离孩å­...仅此而已....è¿™ä¸ç»å¯¹å®‰å…¨ã€‚ metric 公制 Address åœ°å€ I agree to all the conditions above. åŒæ„ä»¥ä¸Šæ¡æ¬¾ã€‚ DST Zone å¤ä»¤æ—¶ archiac This means very old-fashioned, outdated archiac RX Pressure 释放压力 Password å¯†ç  Use of this software is entirely at your own risk. åŽæžœè‡ªè´Ÿ. Passwords don't match 密ç ä¸åŒ¹é… First Name å Last Name å§“ Country 国家 &Cancel &å–æ¶ˆ &Finish &å®Œæˆ Bi-Level åŒæ°´å¹³ Profile Changes ç”¨æˆ·ä¿¡æ¯æ›´æ”¹ Personal Information (for reports) ä¸ªäººä¿¡æ¯ User Name å§“å SleepyHead SleepyHead SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. SleepyHead 基于 <a href='qrc:/COPYING'>GNU Public 许å¯å‘布</a>, å¹¶ä¸å«è´¨ä¿ä»¥åŠä¸ä¿è¯é€‚用于用户以任何目的的使用. This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. 这款软件用于å助读å–用于治疗ç¡çœ éšœç¢çš„å„ç§CPAP的数æ®. User Information ç”¨æˆ·ä¿¡æ¯ Empty Username 空白用户å ...twice... ...两次... Doctors Name 医生姓å Shows the directory where SleepyHead data will be stored. 显示SleepyHead所需存储数æ®çš„目录。 Doctors / Clinic Information 医生/è¯Šæ‰€ä¿¡æ¯ Practice Name 患者姓å Date Diagnosed 诊断日期 TextLabel 文本标签 Accept and save this information? ä¿å­˜ä¿¡æ¯? Patient ID æ‚£è€…ç¼–å· Please provide a username for this profile 请输入用户å about:blank 空白 Overview ... ... L/b å‡/å‘¼å¸ % PB % å‘¨æœŸæ€§å‘¼å¸ %PTB % 患者触å‘å‘¼å¸ End: 结æŸ: Form 表格 Target Ventilation (L/min) 目标 通气率 (å‡/分钟) Usage 使用 Respiratory Disturbance Index å‘¼å¸ ç´Šä¹± 指数 Show all graphs 显示所有图表 Reset view to selected date range é‡ç½®æ˜¯è§†çª—范围 Zombie Meter 麻木程度 Drop down to see list of graphs to switch on/off. 滚动èœå•以显示视图切æ¢å¼€å…³ã€‚ Peak RDI Shows RDI Clusters (RDI/hr) RDI峰值 显示RDI组 (RDI/å°æ—¶ï¼‰ Peak AHI Shows AHI Clusters (AHI/hr) AHI峰值 显示AHI组 (AHI/å°æ—¶) Usage (hours) 使用 (å°æ—¶ï¼‰ Last Three Months å‰ä¸‰ä¸ªæœˆ Respiratory Rate (breaths/min) å‘¼å¸ é¢‘çŽ‡ (呼叿¬¡æ•°/分钟) No Graphs On! 无图表显示! Custom 自定义 How you felt (0-10) 感觉如何 (0-10) Graphs 图表 Range: 范围: Start: 开始: SensAwake (count) 觉醒 (计数) Last Month 上个月 Apnea Hypopnea Index æš‚åœ ä½Žé€šæ°” 指数 % in PB % å‘¨æœŸæ€§å‘¼å¸ Last 6 Months å‰å…­ä¸ªæœˆ Body Mass Index 身体 é‡é‡ 指数 Minute Ventilation (L/min) 分钟 通气率 (å‡/分钟) Oxygen Saturation (%) 氧饱和度 (%) Session Times ä¼šè¯ Last Two Weeks å‰ä¸¤å‘¨ Everything 所有 Last Week 上周 Last Year 去年 breaths/min 呼叿¬¡æ•°/分钟 Toggle Graph Visibility 切æ¢è§†å›¾ Peak AHI AHI峰值 Peak RDI RDI峰值 Events/Hr 事件/å°æ—¶ Hide all graphs éšè—所有图表 Periodic Breathing (% of night) 周期性 å‘¼å¸ (% 夜) Patient Triggered Breaths (%) 患者 è§¦å‘ å‘¼å¸ ï¼ˆ%) Session Times (hours) ä¼šè¯æ—¶é•¿ (å°æ—¶) (count) (计数) Last Two Months å‰ä¸¤ä¸ªæœˆ Tidal Volume (ml) å‘¼å¸ å®¹é‡ ï¼ˆæ¯«å‡ï¼‰ % in %1 % in %1 %1 (% of night) %1 (% 晚) Large Leaks (% of night) 大釿¼æ°” (% 晚) % %1 % %1 OximeterImport Dialog å¯¹è¯ Oximeter Import Wizard 血氧仪导入å‘导 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> Skip this page next time. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> Where would you like to import from? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> Directly from a recording on a device <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> Record attached to computer overnight (provides plethysomogram) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> Please connect your oximeter device Press Start to commence recording Show Live Graphs Duration æ—¶é•¿ SpO2 % 血氧饱和度 % Pulse Rate 脉æ Multiple Sessions Detected Please choose which one you want to import into SleepyHead Details 详情 Import Completed. When did the recording start? Day recording (normally would of) started Oximeter Starting time I want to use the time reported by my oximeter's built in clock. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> Choose CPAP session to sync to: ... ... You can manually adjust the time here if required: HH:mm:ssap &Cancel &å–æ¶ˆ &Information Page &Retry &Choose Session &End Recording &Sync and Save &Save and Finish &Start &开始 Scanning for compatible oximeters Could not detect any connected oximeter devices. Connecting to %1 Oximeter Select upload option on %1 Waiting for you to start the upload process... %1 device is uploading data... Please wait until oximeter upload process completes. Do not unplug your oximeter. Oximeter import completed.. Select a valid oximetry data file Oximetry Files (*.spo *.spor *.spo2 *.dat) No Oximetery module could parse the given file: Oximeter not detected Couldn't access oximeter Live Oximetery Mode Starting up... If you can still read this after a few seconds, cancel and try again Live Import Stopped Live Oximetery Stopped Live Oximetery import has been stopped %1 session(s) on %2, starting at %3 No CPAP data available on %1 %1 %1% {1?} Recording... Finger not detected I want to use the time my computer recorded for this live oximetry session. I need to set the time manually, because my oximeter doesn't have an internal clock. Something went wrong getting session data CMS50 Session %1 CMS50 ä¼šè¯ %1 Start Time "%1", session %2 Waiting for %1 to start Waiting for the device to start the upload process... Oximetry ... ... Date 日期 Form 表格 Save ä¿å­˜ SpO2 血氧饱和度 Please make sure your oximeter is switched on, and in the right mode to transmit data. 请确ä¿è¡€æ°§ä»ªå·²ç»æ‰“开并且置于正确的模å¼ä»¥ä¾¿æ•°æ®ä¼ è¾“。 &Stop &åœæ­¢ Pulse 脉æ Please connect oximeter device 请连接血氧仪 &Start &开始 Creating a new oximetry session will destroy the old one. Would you like to save it first? 创建一个新的会è¯ä¼šè¦†ç›–旧的。 是å¦å°†æ—§çš„会è¯è¿›è¡Œä¿å­˜? Would you like to save this oximetery session? ä¿å­˜è¿™ä¸ªè¡€æ°§ä»ªä¼šè¯? &Open .spo/R File &打开 SPO/R 文档 Cancel å–æ¶ˆ Check Oximeter is Ready 血氧仪已就绪 Oximeter Error! 血氧计故障! Couldn't open oximetry file " 无法打开血氧仪文件" Save Session? ä¿å­˜? R&eset é‡&ç½® Select an oximetry file é€‰æ‹©ä¸€ä¸ªè¡€æ°§ä»ªæ•°æ®æ–‡ä»¶ Oximetry Error! Something is wrong with the device connection. 血氧仪故障! 是å¦è¿žæŽ¥ã€‚ Serial &Import åºåˆ—å· & 导入 Oximetry Files (*.spo *.spoR) 血氧仪文档((*.spo *.spoR) Serial Port äº§å£ d/MM/yy h:mm:ss AP æ—¥/月/å¹´ å°æ—¶:分钟:ç§’ Please Wait 请ç¨ç­‰ &Start Live &开始 Connect Oximeter 连接血氧仪 Please make sure Oximeter device is in upload mode. 请确ä¿è¡€æ°§ä»ªå¤„于上传模å¼ã€‚ Control 控制 Oximetry live recording has been terminated due to timeout. 血氧仪实时记录已ç»ç”±äºŽè¶…æ—¶è€Œåœæ­¢ã€‚ Destroy It 删除 &Rescan Ports &扫æç«¯å£ Opening this oximetry file will destroy the current session. Would you like to keep it? 打开血氧仪文档会æŸå现有的会è¯ã€‚ 您希望ä¿å­˜è¿™ä¸ªä¼šè¯å—? Device Connected 设备已连接 Keep This Recording? ä»ç„¶è®°å½•? Oximeter Error The device has not responded.. Make sure it's switched on. 血氧仪故障 设备未å“应。请确ä¿å·²æ‰“开。 Oximeter Error The device did not respond.. Make sure it's switched on. 血氧仪故障 设备未å“应。请确ä¿å·²æ‰“开。 Opening this oximetry session will destroy the unsavedsession in the oximetry tab. Would you like to store it first? 打开这个血氧仪文化会æŸå在血氧仪æ å†…的未存储会è¯ã€‚ 是å¦å…ˆä¿å­˜ä¼šè¯? No Oximetry Data æ— è¡€æ°§æ•°æ® PreferencesDialog % % s s ID ç¼–å· &Ok &好的 Add 添加 N/A ä¸é€‚用 bpm æ¯åˆ†é’Ÿè„‰æ Graph Height 图表高度 Font 字体 Leak æ¼æ°” SPO2 血氧饱和度 Show 显示 Size å¤§å° Type 类型 Skip Login Screen è·³è¿‡ç™»å½•ç•Œé¢ Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) 显示RDIï¼Œè€Œä¸æ˜¯AHI (RDI=AHI+RERA) &CPAP &æŒç»­æ°”铿­£åŽ‹é€šæ°” General Settings 通用设置 <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> <html><head/><body><p>在使用åŒå‘è§¦æ‘¸æ¿æ”¾å¤§æ—¶ï¼Œæ»šåŠ¨æ˜¾ç¤ºæ›´å®¹æ˜“</p><p>50ms是推è值.</p></body></html> Daily Graphs 日常图表 Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. åŽ‹ç¼©çš„ç‘žæ–¯è¿ˆæ•°æ®æ–‡ä»¶(EDF)的备份å¯ä»¥èŠ‚çœç¡¬ç›˜ç©ºé—´ã€‚ 压缩过的文件将ä¿å­˜ä¸º.gzæ ¼å¼, 这是MACå’Œlinuxå¹³å°çš„å¸¸è§æ–‡ä»¶æ ¼å¼.. SleepyHeadå¯ä»¥ä»Žæœ¬åœ°ç¡¬ç›˜å¯¼å…¥å¤‡ä»½æ–‡ä»¶.. 如果使用ResScan读å–,需è¦å…ˆè¡Œè§£åŽ‹.. Event 事件 Event Duration 事件区间 Graph 图表 Pulse 脉æ days. 天. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">会è¯å°†ä¼šæ¯”这个ç¨çŸ­å¹¶ä¸”ä¸ä¼šæ˜¾ç¤º<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> The name of your mask, or at least the name you call it. é¢ç½©å称。 Ignore Short Sessions å¿½ç•¥çŸ­æ—¶ä¼šè¯ Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. æ°”æµé™å€¼çš„中值百分比 20%的气æµé™å€¼æœ‰åˆ©äºŽæ£€æµ‹å‘¼å¸æš‚åœã€‚ Sessions starting before this time will go to the previous calendar day. 在此之å‰å¼€å§‹ä¸€æ®µä¼šè¯å°†ä¼šè®¡å…¥ä¸Šä¸€å¤©. The date you started using this mask 开始使用此é¢ç½©çš„æ—¥æœŸ Session Storage Options 会è¯å­˜å‚¨é€‰é¡¹ Graph Titles 图表标题 Zero Reset å½’é›¶ The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. éšåŽçš„选择将会影å“到SleepyHead所å ç”¨çš„ç©ºé—´ä»¥åŠæ•°æ®å¯¼å…¥çš„æ—¶é—´ã€‚ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">自定义标记是一个检测被机器忽略的事件实验方法。它们<span style=" text-decoration: underline;">ä¸</span>包å«äºŽ AHI.</p></body></html> Show event breakdown pie chart 显示饼图 Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. 激活/ç¦ç”¨ï¼ˆå®žéªŒæ€§ï¼‰çªå‡ºäº‹ä»¶æ ‡è®°ã€‚ å…许检测边缘事件以åŠè®¾å¤‡é—æ¼äº‹ä»¶ è¿™ä¸ªé€‰é¡¹å¿…é¡»åœ¨å¯¼å…¥å‰æ¿€æ´»ï¼Œå¦åˆ™éœ€è¦æ¸…除缓存。 Flow Restriction æ°”æµé™åˆ¶ Show Compliance æ˜¾ç¤ºå…¼å®¹ä¿¡æ¯ Are you sure you want to reset your graph preferences to the defaults? é‡ç½®å›¾è¡¨è®¾ç½®ä¸ºé»˜è®¤å€¼? Minimum duration of drop in oxygen saturation 血氧饱和下é™çš„æœ€å°åŒºé—´ Overview Linecharts 线形图概览 Whether to allow changing yAxis scales by double clicking on yAxis labels 是å¦å…许以åŒå‡»Yè½´æ¥è¿›è¡ŒY轴的缩放 Contec CMS50 康泰 CMS50 Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. åƒç´ æ˜ å°„缓存是图形加速技术,或许会导致在您的æ“作系统上的字体显示异常. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">正在更æ¢SDå¡å¤‡ä»½åŽ‹ç¼©é€‰é¡¹ä¸ä¼šè‡ªåЍ冿¬¡åŽ‹ç¼©æ•°æ® </span></p></body></html> Bypass the login screen and load the most recent User Profile 跳过用户登录界é¢ï¼Œç™»å½•常用用户 Data Reindex Required é‡å»ºæ•°æ®ç´¢å¼• Scroll Dampening 滚动抑制 hours å°æ—¶ Nasal Pillows 鼻枕 If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. 如果您需è¦é‡æ–°å¯¼å…¥æ•°æ®ï¼Œè¿™ä¸ªæ•°æ®å°†ä¼šä¸¢å¤±ã€‚ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">如果你愿æ„å°è¯•新功能或者修正程åºï¼Œè¯·ç‚¹å‡»è¿™é‡Œ.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">但是请注æ„这将有å¯èƒ½ç ´å代ç ..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Leak Profile æ¼æ°”傿•° Standard Bars æ ‡å‡†å¯¼èˆªæ¡ Mask Profile é¢ç½©å‚æ•° 99% Percentile 99% Small chunks of oximetry data under this amount will be discarded. 在此数值下的血氧饱和数æ®å—将会被èˆå¼ƒã€‚ Top & Bottom Markers 顶端 & 底部 标志带 Reset the counter to zero at beginning of each (time) window. 在æ¯ä¸ªçª—壿‰“开时将计数器归零。 One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? 软件需è¦é‡å¯ æ¥å®žçŽ°è¿™äº›æ›´æ”¹ 希望进行更改å—? Not entirely sure if this will get to live or not.. ä¸å®Œå…¨ç¡®å®šæ˜¯å¦å·²ç»æˆåŠŸ.. Discard chunks under èˆå¼ƒå¦‚下数æ®å— minutes 分钟 Minutes 分钟 Graph Settings 图形设置 CPAP Mask Information CPAPé¢ç½©ä¿¡æ¯ Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. æ„å¤–æ¼æ°”计算方法(如果您的机器没有æä¾›è¿™ä¸ªæ¨¡åž‹ï¼‰ 备注:ç»éªŒç»Ÿè®¡æ¨¡åž‹ã€‚ Bold çªå‡ºæ˜¾ç¤º Colour 颜色 Minimum duration of pulse change event. è„‰ææ”¹å˜äº‹ä»¶çš„æœ€å°åŒºé—´ã€‚ Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. å锯齿技术å¯ä»¥ä½¿å¾—图表显示更加圆润 当这一功能å¯ç”¨æ—¶ï¼Œç‰¹å®šçš„图å—会çªå‡ºæ˜¾ç¤º åœ¨æ‰“å°æŠ¥å‘Šä¸­ä¹Ÿä¼šä½“çŽ°å‡ºæ¥ è¯•è¯•çœ‹ã€‚ Oximetry Graphs 血氧仪图表 Median is recommended for ResMed users. 建议瑞斯迈用户选择中值。 Graphs 图表 of usage per night æ¯æ™šä½¿ç”¨æ—¶é—´ &Check for Updates now &å³åˆ»æ£€æŸ¥æ›´æ–° Italic æ„大利 Enable Multithreading å¯ç”¨å¤šçº¿ç¨‹ This may not be a good idea 䏿­£ç¡®çš„应用 Weighted Average å¹³å‡ä½“é‡ Median 中间的 Turn on/off the spinning "context" cube. It really doesn't use that much resources.. :) 打开/关闭 æ–‡æ¡£æ»‘å— æ–‡æ¡£æ»‘å—éžå¸¸èŠ‚çœèµ„æºï¼Œå»ºè®®æ‰“å¼€.. :) Sudden change in Pulse Rate of at least this amount 脉æçªç„¶æ”¹å˜çš„æœ€å°å€¼ Remove 删除 Search 查询 This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) 这将为瑞斯迈的SDå¡ä¿ç•™ä¸€å¤‡ä»½æ•°æ®ã€‚ 瑞斯迈的机器仅会将高分辨率的数æ®ä¿å­˜7天,图表ä¿å­˜30天。 SleepyHeadå¯ä»¥ä¿å­˜è¿™äº›æ•°æ®çš„å‰¯æœ¬ä»¥å¤‡å†æ¬¡ä½¿ç”¨ã€‚ (强烈建议,除éžä½ çš„ç£ç›˜ç©ºé—´ä¸è¶³æˆ–者ä¸åœ¨æ„图表数æ®ï¼‰ Window çª—å£ Middle Calculations 中值计算 Skip over Empty Days è·³è¿‡æ— æ•°æ®æ—¥æœŸ This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. Sleepyhead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) 这将为瑞斯迈的SDå¡ä¿ç•™ä¸€å¤‡ä»½æ•°æ®ã€‚ 瑞斯迈的机器仅会将高分辨率的数æ®ä¿å­˜7天,图表ä¿å­˜30天。 SleepyHeadå¯ä»¥ä¿å­˜è¿™äº›æ•°æ®çš„å‰¯æœ¬ä»¥å¤‡å†æ¬¡ä½¿ç”¨ã€‚ (强烈建议,除éžä½ çš„ç£ç›˜ç©ºé—´ä¸è¶³æˆ–者ä¸åœ¨æ„图表数æ®ï¼‰ Allow duplicates near machine events. å…许多é‡è®°å½•趋近机器事件数æ®ã€‚ The visual method of displaying waveform overlay flags. 将视窗显示的波形的标记进行å åŠ ã€‚ Upper Percentile 增大 Restart Required é‡å¯è¯·æ±‚ Generic mask type. Select the one that's closest to your mask. 通用é¢ç½©ã€‚选择一款最接近的é¢ç½©ã€‚ True Maximum 真æžå¤§å€¼ For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. ä¸ºäº†ä¿æŒä¸€è‡´ï¼Œç‘žæ–¯è¿ˆçš„用户需è¦è®¾ç½®95%, 它将作为唯一值出现在汇总界é¢å†…。 Graph Text 图表文字 Session Settings 会è¯è®¾ç½® <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">åƒç´ æ˜ å°„缓存是一ç§å›¾å½¢åŠ é€ŸæŠ€æœ¯ï¼Œä½†æ˜¯å®ƒæœ‰å¯èƒ½ä¼šå¯¼è‡´å­—ä½“æ˜¾ç¤ºä¸æ­£å¸¸.</span></p></body></html> Cache Session Data (uses more system memory) ç¼“å­˜ä¼šè¯æ•°æ®ï¼ˆä½¿ç”¨æ›´å¤šçš„内存) Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. å…许使用多核CPU以æé«˜æ€§èƒ½ æé«˜å¯¼å…¥æ€§èƒ½ã€‚ Tries to forces the oximetry data to link with CPAP when possible. 多次å°è¯•在å¯èƒ½æ—¶å°†è¡€æ°§ä»ªæ•°æ®ä¸ŽCPAPæ•°æ®ç›¸ç»“åˆã€‚ Line Chart 线形图 How long you want the tooltips to stay visible. 设置工具æ¡å¯è§æ—¶é—´ã€‚ Multiple sessions closer together than this value will be kept on the same day. 缩å°å¤šä¸ªä¼šè¯é—´è·å¯ä»¥ä½¿å…¶æ˜¾ç¤ºåœ¨åŒä¸€å¤©. Duration of airflow restriction æ°”æµé™åˆ¶åŒºé—´ Bar Tops 任务æ¡ç½®é¡¶ Automatically Check For Updates 自动检查更新 I want to try experimental and test builds (Advanced users only please.) 我愿æ„å°è¯•测试版本(仅适用高阶用户) as over 大于 Are you sure you want to disable these backups? 你确定è¦ç¦ç”¨å¤‡ä»½å—? Overview Graphs 图表总览 Create SD Card Backups during Import (only for ResMed so far, highly recommended) 在导入的时候为SD塿•°æ®åˆ›å»ºå¤‡ä»½(ä»…é™ç‘žæ–¯è¿ˆï¼Œå¼ºçƒˆå»ºè®®) Other Visual Settings 其他显示设置 Pressure 压力 Day Split Time 时段 Big Text 大文本 <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> <html><head/><body><p>æ­¤é¡¹åŠŸèƒ½å·²è¢«å–æ¶ˆï¼Œä½†ä¼šåœ¨åŽç»­ç‰ˆæœ¬å†…加入. </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">æ­£åœ¨åŒæ­¥è¡€æ°§æ•°æ®ä»¥åŠCPAPæ•°æ®</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">ä»Žä¸²å£æˆ–者SpO2 Review 导入CMS50æ•°æ® </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> 需è¦åŒæ­¥æ¥ä¿®æ­£æ—¶é—´.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">峿—¶æ˜¾ç¤ºæ¨¡å¼ï¼ˆéœ€è¦ä¸²å£çº¿ï¼‰å¯ä»¥å‡†ç¡®çš„åŒæ­¥CMS50,但是ä¸èƒ½å“应CPAP的时钟漂移.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">如果打开血氧仪存储模å¼çš„ </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">åŒæ—¶ </span><span style=" font-family:'Sans'; font-size:10pt;">打开CPAP,那么å¯ä»¥ä¸€èµ·è¿›è¡ŒåŒæ­¥. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">串å£å¯¼å…¥çš„æ—¶é—´æˆ³ç”±å‰ä¸€ä¸ªæ™šä¸Šçš„第一个CPAP会è¯å¼€å§‹ï¼Œæ‰€ä»¥è¯·å…ˆå¯¼å…¥CPAPæ•°æ®</span></p></body></html> Description æè¿° ResMed users probably should use 99th Percentile for visual consistency. 为ä¿è¯è§†è§‰ä¸€è‡´æ€§ï¼Œè¯·ç‘žæ–¯è¿ˆç”¨æˆ·é€‰æ‹©ç™¾åˆ†ä¹‹99. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">备注: </span>æ¼æ°”é…置已ä¸å†å·¥ä½œ..</p></body></html> ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). 在ä¸åŒçš„分辨率下,瑞斯迈S9仅会将SDå¡å†…的数æ®ä¿å­˜6天到30天. Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. 注æ„使用时间低于4ä¸ªå°æ—¶çš„æ—¥å­ã€‚ Daily view navigation buttons will skip over days without data records 敲击日常查看导航按钮将跳过没有数æ®çš„æ—¥å­ seconds ç§’ Mask Type é¢ç½©ç±»åž‹ Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. 为AHI/å°æ—¶å›¾è¡¨çš„æ¯ä¸€ä¸ªç‚¹è°ƒèŠ‚æ•°æ®é‡ 默认值到60分钟,强烈建议使用这一默认值。 &Cancel &å–æ¶ˆ Last Checked For Updates: 上次的更新: Details 详情 &Events &事件 Use Anti-Aliasing 使用å锯齿技术显示 Overpriced ResMed S9 Oximeter 定价过高的瑞斯迈S9血氧仪 Animations && Fancy Stuff 动画 && 爱好 &Import &导入 AHI/Hour Graph Settings AHI/å°æ—¶å›¾è¡¨è®¾ç½® Add this Location to the Import List 在导入列表中添加新ä½ç½® Use Oximetry 使用血氧仪 Changes to the following settings needs a restart, but not a recalc. 更改如下设置需è¦é‡å¯ï¼Œä½†ä¸éœ€è¦é‡æ–°ä¼°ç®—。 Compress Session Data (makes SleepyHead data smaller, but day changing slower.) åŽ‹ç¼©ä¼šè¯æ•°æ®ï¼ˆå¯ä»¥ä½¿SleepyHead æ•°æ®æ›´å°ï¼‰ &Appearance &外观 The pixel thickness of line plots 行å—åƒç´  &Defaults &默认值 Filters the graph list. Simply start typing the name of the graph your looking for. å›¾è¡¨è¿‡æ»¤å™¨ã€‚è¾“å…¥ä½ æ‰€è¦æŸ¥è¯¢çš„图标的å称。 Combine Close Sessions å…³é—­æ‰€æœ‰ä¼šè¯ Allow YAxis Scaling å…许Y轴缩放 Use Pixmap Caching 使用象素映射缓存 Check for new version every æ¯æ¬¡éƒ½æ£€æŸ¥æ˜¯å¦æœ‰æ–°ç‰ˆæœ¬ Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. å…è®¸å¯¹å›¾è¡¨æˆªå± æ•°æ®æ±‡æ€»é¥¼å›¾å°†ä½¿ç”¨è¿™ä¸€æ–¹æ³• 也å¯ä»¥æ‰“å°ä»£ç  当开å¯è¿™ä¸ªåŠŸèƒ½æ—¶ï¼ŒæŸäº›æ—§ç”µè„‘或者è€ç‰ˆæœ¬çš„ Qt软件会导致软件ä¸ç¨³å®š. Maximum Calcs 最大估算值 This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. 这会使得SleepyHead的数æ®ä»…å åŽŸæœ‰å¤§çº¦ä¸€åŠçš„空间。 当然,这也会使导入数æ®çš„æ—¶é—´å˜é•¿ã€‚ 如果你有一å°è£…有å°å®¹é‡å›ºæ€ç¡¬ç›˜çš„电脑,这是个ä¸é”™çš„选择。 Tooltip Timeout 工具æ¡è¶…æ—¶ Preferences 傿•°è®¾ç½® <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">æ­£åœ¨åŒæ­¥è¡€æ°§æ•°æ®ä»¥åŠCPAPæ•°æ®</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">ä»Žä¸²å£æˆ–者SpO2 Review 导入CMS50æ•°æ® </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> 需è¦åŒæ­¥æ¥ä¿®æ­£æ—¶é—´.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">峿—¶æ˜¾ç¤ºæ¨¡å¼ï¼ˆéœ€è¦ä¸²å£çº¿ï¼‰å¯ä»¥å‡†ç¡®çš„åŒæ­¥CMS50,但是ä¸èƒ½å“应CPAP的时钟漂移.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">如果打开血氧仪存储模å¼çš„ </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">åŒæ—¶ </span><span style=" font-family:'Sans'; font-size:10pt;">打开CPAP,那么å¯ä»¥ä¸€èµ·è¿›è¡ŒåŒæ­¥. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">串å£å¯¼å…¥çš„æ—¶é—´æˆ³ç”±å‰ä¸€ä¸ªæ™šä¸Šçš„第一个CPAP会è¯å¼€å§‹ï¼Œæ‰€ä»¥è¯·å…ˆå¯¼å…¥CPAPæ•°æ®</span></p></body></html> Started Using 开始使用 Sourceforge hosts this project for free.. Please be considerate of their resources.. 这个å…费项目是由SourceForgeï¼Œè¯·çæƒœä»–äººçš„åŠ³åŠ¨æˆæžœã€‚ Default display height of graphs in pixels 使用默认项目显示图标高度 Leak calcs æ¼æ°”计算 Overlay Flags å åŠ æ ‡è®° Confirmation 确定 Makes certain plots look more "square waved". åœ¨ç‰¹å®šåŒºå—æ˜¾ç¤ºæ›´å¤šçš„æ–¹æ³¢. Flag changes in oximetry stats è¡€æ°§ç»Ÿè®¡æ ‡è®°æ”¹å˜ Percentage drop in oxygen saturation è¡€æ°§é¥±å’Œç™¾åˆ†æ¯”ä¸‹é™ &General &通用 Keep session data in memory to speed up revisiting days. å°†ä¼šè¯æ•°æ®ä¿ç•™åœ¨å†…存中å¯ä»¥æ›´ä¾¿æ·çš„回顾。 If you need to conserve disk space, please remember to carry out manual backups. 如果您è¦é‡Šæ”¾ç£ç›˜ç©ºé—´ï¼Œè¯·åŠ¡å¿…å…ˆå¤‡ä»½. Link Oximetry and CPAP graphs åˆå¹¶è¡€æ°§ä»ªä¸ŽCPAP图表 Compress SD Card Backups (slower first import, but makes backups smaller) 压缩备份SD塿•°æ®ï¼ˆå¯¼å…¥é€Ÿåº¦å˜æ…¢ï¼ŒèŠ‚çœç©ºé—´ï¼‰ Don't show any compliance information 䏿˜¾ç¤ºå…¼å®¹çš„ä¿¡æ¯ Normal Average æ­£å¸¸ä½“é‡ A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? 为了更改数æ®è®¾ç½®å°†é‡å»ºç´¢å¼•,这将花费几分钟的时间。 ç¡®å®šè¦æ›´æ•°æ®å—? Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) ä¸è¦è®¾ç½®è¿™é¡¹é™¤éžä½ ç¡®å®šCPAP时钟漂移 å°è¯•ä¸Žç”µè„‘çš„æ—¶é’ŸåŒæ­¥ï¼ˆéœ€è¦ä¸Žæ—¶é’ŸæœåŠ¡å™¨åŒæ­¥ï¼‰ Preferred Calculation Methods 首选的计算方法 Statistical Model 统计模型 Double click on the (Y-axis) min/max values to edit them åŒå‡»Yè½´æ¥è®¾ç½®æœ€å°/最大值 Graph Tooltips 图形工具æç¤º Custom User Event Flagging 自定义用户事件标记 milliseconds 毫秒 &Oximetry &è¡€æ°§æµ‹é‡ CPAP Clock Drift CPAP时钟漂移 Import Locations 导入ä½ç½® Square Wave Plots æ–¹æ³¢åŒºå— TextLabel 文本标签 Application Fonts 应用程åºå­—体 Application 应用 Line Thickness 线宽 Use RDI instead of AHI (PRS1 only) 用RDI替æ¢AHI(åªé€‚用于飞利浦伟康 System One) Do not import sessions older than: 请ä¸è¦å¯¼å…¥æ—©äºŽå¦‚下时间的数æ®: Sessions older than this date will not be imported 早于这个时间的数æ®å°†ä¸èƒ½å¯¼å…¥ dd MMMM yyyy 天天 月月月月 å¹´å¹´å¹´å¹´ Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON) 在导入SD塿•°æ®æ—¶è‡ªåЍ备份(对瑞æ€è¿ˆå’Œè´¹é›ªæœºåž‹å°¤å…¶é‡è¦) User definable threshold considered large leak ç”¨æˆ·è‡ªå®šä¹‰å¤§é‡æ¼æ°”数值 L/min å‡/分钟 Whether to show the leak redline in the leak graph 是å¦åœ¨æ¼æ°”å›¾è¡¨ä¸­æ˜¾ç¤ºæ¼æ°”é™å€¼çº¢çº¿ Show Leak Redline æ˜¾ç¤ºæ¼æ°”é™å€¼çº¢çº¿ Oximetery Settings 血氧仪设置 Contec CMS50D+ 康泰 CMS50D+ Contec CMS50E/F 康泰 CMS50E/F Contec CMS50F v3.7 康泰 CMS50F v3.7 Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. å…³é—­è‡ªåŠ¨å¤‡ä»½æ—¶ä¸æ˜Žæ™ºçš„.因为在è¿è¡Œå‡ºé”™çš„æƒ…况下SleepHead需è¦é‡æ–°å»ºç«‹æ•°æ®åº“. Are you really sure you want to do this? 确定? Show in Event Breakdown Piechart 在事件分类饼图中显示 #1 #1 #2 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. 这个实验性的选项是为了使用SleepHeadäº‹ä»¶æ ‡è®°æ¥æ”¹è¿›å¯¹å‘¼å¸æœºäº‹ä»¶ä½ç½®çš„侦测. Resync Machine Detected Events (Experimental) 釿–°åŒæ­¥å‘¼å¸æœºæ¥ä¾¦æµ‹äº‹ä»¶(试验性功能) Summary only data is more accurate for ResMed users if this is left on. 打开此功能,瑞æ€è¿ˆç”¨æˆ·å°†èŽ·å¾—æ›´å‡†ç¡®çš„æ¦‚è¦æ•°æ®. Don't Split Summary Days ä¸è¦åˆ†å‰²æ¦‚è¦å¤©æ•° Create SD Card Backups during Import (Turn this off at your own peril!) 导入时为创建备份(ä¾ä¸ªäººå–œå¥½æ‰“开或关闭) C&hannels 通&é“ Reset &Defaults æ¢å¤&默认设置 <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">警告: </span>这仅仅是æç¤ºæ‚¨å¯ä»¥è¿™ä¹ˆåšï¼Œä½†æ˜¯å¹¶ä¸æ„å‘³ç€æ˜¯å¥½çš„.</p></body></html> Show flags for machine detected events that haven't been identified yet. æ˜¾ç¤ºå·²æ ‡è®°ä½†ä»æœªè¢«è¯†åˆ«çš„事件. Show Unknown Flags 显示ä½ç½®æ ‡è®° Span Events æŒç»­äº‹ä»¶ Flags 标记 Minor Flags æœ€å°æ ‡è®° Waveforms 波形 Data Channels æ•°æ®é€šé“ Settings Channels è®¾ç½®é€šé“ Unknown Channels ä½ç½®é€šé“ Name å§“å Color 颜色 Label 标签 Events 事件 Flag rapid changes in oximetry stats Other oximetry options Flag SPO2 Desaturations Below Discard segments under Flag Pulse Rate Above Flag Pulse Rate Below Contec CMS50D+/E/F Contec CMS50F v3.7+ 康泰 CMS50F v3.7+ {50F?} ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Update Oximeter Clock during import Import without nagging Flag Minor Flag Span Always Minor Flag Type CPAP Events Oximeter Events Positional Events Sleep Stage Events Unknown Events Double click to change the descriptive name this channel. Double click to change the default color for this channel plot/flag/data. Here you can change the type of flag shown for this event This is the short-form label to indicate this channel on screen. This is a description of what this channel does. Lower Upper CPAP Waveforms Oximeter Waveforms Positional Waveforms Sleep Stage Waveforms Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Top Markers ProfileSelect Double Checking: Do you really want "%1" profile to be obliterated? åŒå‡»: 删除%1é…置文件å—? &Quit &退出 Create a new user profile. 创建新用户. Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs. Signed: Nasty Programmer 啊哦...如果您在忘记密ç çš„æƒ…况下正å°è¯•删除,请阅读此文档. ç­¾å:令人ä¸å¿«çš„作者 [data directory] [æ•°æ®ç›®å½•] Are you sure you want to trash the profile "%1"? 删除%1é…置文件? Open Profile 打开é…置文件 Edit Profile 编辑é…置文件 The current location of SleepyHead data store. SleepyHeadæ•°æ®å­˜äºŽæ­¤å¤„. Incorrect Password é”™è¯¯å¯†ç  Choose a different SleepyHead data folder. 选择其他的SleepyHeadæ•°æ®æ–‡ä»¶å¤¹. WTH??? What the Hell??? Enter Password for %1 é”®å…¥å¯†ç  %1 New Profile æ–°é…置文件 &Different Folder &其他文件夹 There was an error deleting the profile directory.. You need to manually remove %1 删除é…置文件过程中出错,请手动删除%1 &Select User &选择用户 Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data.. Don't say you weren't warned. :-p 是的,我将完全删除é…置文件%1和所有与其相关的数æ®. 请谨慎选择 :-p Start with the selected user profile. 用所选的用户设置å¯åŠ¨è½¯ä»¶. If you can read this you need to delete this profile directory manually (It's under %1) 如果您看到此æ¡ä¿¡æ¯ï¼Œè¯·æ‰‹åŠ¨åˆ é™¤é…置文件目录(在%1下) Click here if you didn't want to start SleepyHead. å–æ¶ˆå¯åЍSleepyHead. Delete Profile 删除é…置文件 Select Profile 选择é…置文件 Question 问题 SleepyHead SleepyHead [version] [版本] You entered the password wrong too many times. 键入密ç é”™è¯¯æ¬¡æ•°è¿‡å¤š. Enter Password é”®å…¥å¯†ç  Folder: 文件夹: Whoops. 哎呀. You entered an Incorrect Password too many times. Exiting! 输入密ç é”™è¯¯æ¬¡æ•°è¿‡å¤šï¼Œé€€å‡º! Search: 查找: You are about to destroy profile '%1'. æ‚¨å°†è¦æ¸…除'%1'. Enter the word DELETE below to confirm. åœ¨ä¸‹é¢æ•²å…¥ DELETE 以确认. Sorry 抱歉 You need to enter DELETE in capital letters. 需è¦é”®å…¥å…¨å¤§å†™å­—æ¯ DELETE. Could not open profile.. You will need to delete this profile directory manually 无法打开,è¯·é‡æ–°è‡ªè¡Œå»ºç«‹ You will find it under the following location: 您将在如下ä½ç½®æ‰¾åˆ°: You entered an incorrect password 密ç ä¸æ­£ç¡® If you're trying to delete because you forgot the password, you need to delete it manually. 如果因为忘记密ç è€Œåˆ é™¤,请手动æ“作. There was an error deleting the profile directory, you need to manually remove it. é…置文件目录出错,请手动移除. Profile '%1' was succesfully deleted é…置文件 '%1'å·²æˆåŠŸåˆ é™¤ Create new profile 创建一个新的é…置文件 QObject " " % % A 未分类 H 低通气 P 压力 ?? ?? AI 呼叿š‚åœæŒ‡æ•° CA 中枢性 EP 呼气压力 FL æ°”æµå—é™ HI 低通气指数 IE å‘¼å¸ LE æ¼æ°”率 LL 大釿¼æ°” Kg 公斤 O2 æ°§æ°” OA 阻塞性 NR 未å“应事件 PB å‘¨æœŸæ€§å‘¼å¸ PC æ··åˆé¢ç½© PP 最高压力 PS 压力 On å¼€å¯ RE 呼å¸ä½œç”¨ SA 呼叿š‚åœ SD SD UA æœªçŸ¥æš‚åœ VS 鼾声指数 cm 厘米 ft 英尺 hz Hz lb 磅 oz ç›Žå¸ 0-1 0-1 90% 90% AHI 呼叿š‚åœä½Žé€šæ°”指数 ASV 适应性支æŒé€šæ°”æ¨¡å¼ BMI 体釿Œ‡æ•° CAI ä¸­æž¢æ€§æš‚åœæŒ‡æ•° Apr 四月 Aug 八月 Avg å¹³å‡ DOB 生日 Bpm Bpm EPI 呼气压力指数 Dec å二月 FLI æ°”æµå—陿Œ‡æ•° End ç»“æŸ Feb 二月 L/m å‡/分钟 Jan 一月 Jul 七月 Jun 六月 NRI 未å“应事件指数 Mar 三月 Max 最大 May 五月 Med 中间值 Min æœ€å° Nov å一月 Oct åæœˆ Off 关闭 RDI 呼å¸ç´Šä¹±æŒ‡æ•° REI 呼å¸ä½œç”¨æŒ‡æ•° UAI æœªçŸ¥æš‚åœæŒ‡æ•° UF1 UF1 UF2 UF2 UF3 UF3 Sep 乿œˆ VS2 鼾声指数2 bpm 次æ¯åˆ†é’Ÿ ÇSR æ½®å¼å‘¼å¸ APAP 全自动正压通气 CPAP æŒç»­æ°”铿­£åŽ‹é€šæ°” Min EPAP 呼气压力最å°å€¼ EPAP 呼气压力 Date 日期 Min IPAP 叿°”压力最å°å€¼ IPAP 叿°”压力 Last 最åŽä¸€æ¬¡ Leak æ¼æ°”率 Mode æ¨¡å¼ Name å§“å None æ—  RERA 呼å¸åŠªåŠ›ç›¸å…³æ€§è§‰é†’ SpO2 血氧饱和度 Resp. Event 呼叿—¶é—´ Inclination ä¾§å§ About SleepyHead 关于SleepyHead Therapy Pressure 治疗压力 BiPAP åŒæ°´å¹³æ°”铿­£åŽ‹é€šæ°” Brand å“牌 Daily 日常 Email 电å­é‚®ä»¶ Error 错误 First 第一次 Ramp Pressure åŽ‹åŠ›ä¸Šå‡ L/min å‡/分钟 Hours å°æ—¶ Leaks æ¼æ°”率 Model åž‹å¼ Phone 电è¯å·ç  Ready 就绪 W-Avg W-Avg Snore 鼾声 Start 开始 Usage 使用 Respiratory Disturbance Index 呼å¸ç´Šä¹±æŒ‡æ•° cmH2O 厘米水柱 Pressure Support åŽ‹åŠ›æ”¯æŒ Hypopnea 低通气 ratio 比率 Tidal Volume 呼å¸å®¹é‡ Entire Day 整天 Heart rate in beats per minute å¿ƒè„æ¯åˆ†é’Ÿçš„跳动次数 A large mask leak affecting machine performance. 大釿¼æ°”å½±å“呼叿œºæ€§èƒ½. An restriction in breathing from normal, causing a flattening of the flow waveform. 正常的呼å¸é™åˆ¶,导致波形呈æ‰å¹³çж. Pat. Trig. Breath 患者触å‘å‘¼å¸ Ramp Delay Period æ–œå¡å‡åŽ‹æœŸé—´ Purge Failed 清ç†å¤±è´¥ Pulse Change 脉æå˜åŒ– Sleep Stage ç¡çœ é˜¶æ®µ Would you like me to purge this data this for you so you can run the new version? å¸Œæœ›çŽ°åœ¨æ¸…ç†æ•°æ®ä»¥ä½¿ç”¨æ–°æ•°æ®å—? Minute Vent. 分钟通气率. Respiratory Effort Related Arousal 呼å¸åŠªåŠ›ç›¸å…³å¾®è§‰é†’ SpO2 Drop 血氧饱和度é™ä½Ž SensAwake feature will reduce pressure when waking is detected. è§‰é†’ä¾¦æµ‹åŠŸèƒ½ä¼šåœ¨ä¾¦æµ‹åˆ°é†’æ¥æ—¶é™ä½Žå‘¼å¸æœºçš„压力. Upright angle in degrees 垂直 Higher Expiratory Pressure 更高的呼气压力 Nasal Pillows 鼻枕 SleepyHead has finished sending the job to the printer. 已将报告å‘é€åˆ°æ‰“å°æœº. NRI=%1 LKI=%2 EPI=%3 未å“应事件指数=%1 æ¼æ°”指数=%2 呼气压力指数=%3 &Close &关闭 A vibratory snore 一次振动打鼾 Vibratory Snore 振动打鼾 Lower Inspiratory Pressure æ›´ä½Žçš„å¸æ°”压力 You did not select a directory. SleepyHead will now start with your old one. 你没有选择目录. SleepyHead将会从上次的目录å¯åЍ. Resp. Rate 呼å¸é€Ÿçއ Insp. Time 叿°”æ—¶é—´ Exp. Time 呼气时间 Import Error 导入出错 Machine 机器 A sudden (user definable) drop in blood oxygen saturation 血氧饱和度çªç„¶é™ä½Ž As you did not select a data folder, SleepyHead will exit. Next time you run, you will be asked again. 因为您没有选择一个å¯ç”¨çš„æ•°æ®æ–‡ä»¶å¤¹,SleepyHead将退出. 下次è¿è¡Œæ—¶ï¼Œä»ç„¶ä¼šè¯¢é—®. Nasal Interface é¼»æŽ¥å£ There are no graphs visible to print æ— å¯æ‰“å°å›¾è¡¨ Target Vent. 目标通气率. An apnea that could not fit into a category ä¸é€‚ç”¨äºŽä»»ä½•åˆ†ç±»çš„å‘¼å¸æš‚åœ Sleep position in degrees ç¡çœ ä½“ä½è§’度 minutes 分钟 This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. 此报告由 SleepyHead预å‘å¸ƒç‰ˆç”Ÿæˆ (%1), <b>ä¸å¯ä½œä¸ºä»»ä½•åŒ»ç–—è¯Šæ–­çš„ä¾æ®</b>. Periodic Breathing å‘¨æœŸæ€§å‘¼å¸ Ramp Time æ–œå¡å‡åŽ‹æ—¶é—´ Unintentional Leaks æ— æ„è¯†æ¼æ°”é‡ Would you like to show bookmarked areas in this report? 是å¦å¸Œæœ›åœ¨æŠ¥å‘Šä¸­æ˜¾ç¤ºæ ‡è®°åŒºåŸŸ? Apnea Hypopnea Index 呼叿š‚åœä½Žé€šæ°”指数 This make take some time to complete.. Please don't touch anything until it's done. 请è€å¿ƒç­‰å¾…. ç¦æ­¢ä¸€åˆ‡æ“作直到完æˆ. Patient Triggered Breaths 患者出å‘çš„å‘¼å¸ No Waveform Available 没有å¯ç”¨æ³¢å½¢ Events 事件 IPAPHi 叿°”压力最大值 IPAPLo 叿°”压力最å°å€¼ (% %1 in events) (% %1 事件) No Data æ— æ•°æ® SleepyHead Update Notes 软件å‡çº§ä¿¡æ¯ Page %1 of %2 é¡µç  %1 到 %2 Median 中值 PS Max åŽ‹åŠ›æ”¯æŒæœ€å¤§åŽ‹åŠ› PS Min 最å°åŽ‹åŠ› Full-Face Mask 全脸é¢ç½© Flow Limit. æ°”æµé™åˆ¶. Choose or create new folder for SleepyHead data 选喿ˆ–者创建一个SleepyHeadæ•°æ®æ–‡ä»¶å¤¹ Detected mask leakage including natural Mask leakages 包å«è‡ªç„¶æ¼æ°”在内的é¢ç½©æ¼æ°”率 Plethy 足够的 SensAwake 觉醒 ST/ASV 自å‘/定时 ASV Median Leaks æ¼æ°”率中值 %1 Report %1报告 Pr. Relief 压力释放 Serial ä¸²å· A user definable event detected by SleepyHead's flow waveform processor. å¯è¢«ç”¨ç”¨æˆ·åœ¨SleepyHead波形处ç†å™¨ä¾¦æµ‹åˆ°çš„事件. SpO2 % 血氧饱和度 % I can automatically purge this data for you, or you can cancel now and continue to run in a previous version. 如果继续å¯ä»¥è‡ªåŠ¨æ¸…ç†æ•°æ®ï¼Œä¹Ÿå¯ä»¥å–消清ç†è¿›è€Œä½¿ç”¨ä¹‹å‰çš„版本. Update å‡çº§ AHI %1 呼叿š‚åœä½Žé€šæ°”指数(AHI) %1 Weight ä½“é‡ Mask Pressure (High resolution) é¢ç½©åŽ‹åŠ›(高分辨率) Orientation å®šä½ Event Flags 呼å¸äº‹ä»¶ Zombie 呆瓜 Bookmarks 标记簇 An apnea where the airway is open æ°”é“å¼€æ”¾æƒ…å†µä¸‹çš„å‘¼å¸æš‚åœ Flow Limitation æ°”æµå—é™ Phone: %1 电è¯å·ç :%1 Low Usage Days=%1 低使用天数=%1 &Ok, get on with it.. &好的. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead SleepyHead是一款开æºçš„软件 http://sourceforge.net/projects/SleepyHead RDI %1 呼å¸ç´Šä¹±æŒ‡æ•°(RDI) %1 I'm sorry to report that SleepyHead can only track hours of use for this machine. éžå¸¸æŠ±æ­‰çš„统治您SleepyHeadåªèƒ½è·Ÿè¸ªè¯»å–è¿™æ¬¾æœºå™¨ä»…æœ‰çš„å‡ ä¸ªå°æ—¶çš„æ•°æ®. Flow Rate æ°”æµé€Ÿçއ Time taken to breathe out 呼气时间 events 事件 An optical Photo-plethysomogram showing heart rhythm 光学探测显示心率 Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually This folder currently resides at the following location: 对ä¸èµ·ï¼ŒSleepyHead无法正常å¯åŠ¨ï¼Œæ•°æ®æ— æ³•自动清除。请手动删除SleepyHead çš„æ•°æ®æ–‡ä»¶å¤¹. 文件夹ä½ç½®å¦‚下所示: Pr. Min 最å°åŽ‹åŠ› Pr. Max 最大压力 I:E Ratio 呼叿¯”率 Amount of air displaced per breath æ¯æ¬¡å‘¼å¸æ°”é‡ Pat. Trig. Breaths 患者触å‘呼å¸çއ Address åœ°å€ REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% 呼å¸ä½œç”¨æŒ‡æ•°=%1 鼾声指数=%2 æ°”æµå—陿Œ‡æ•°=%3 周期性呼å¸/潮湿呼å¸=%4% Name: %1, %2 åå­—: %1, %2 Leak Rate æ¼æ°”率 Reporting from %1 to %2 正在生æˆç”± %1 到 %2 的报告 Email: %1 电å­é‚®ç®±: %1 Inspiratory Pressure 叿°”压力 A pulse of pressure 'pinged' to detect a closed airway. 通过压力脉冲'ç °'å¯ä»¥ä¾¦æµ‹åˆ°æ°”é“关闭. Non Responding Event 未å“应事件 Ramp Pr. æ–œå¡å‡åŽ‹. Language 语言 Median Leak Rate æ¼æ°”率中值 Rate of breaths per minute æ¯åˆ†é’Ÿå‘¼å¸çš„æ¬¡æ•° Usage Statistics 使用统计 Graph displaying snore volume 图形显示鼾声指数 Max EPAP 呼气压力最大值 Max IPAP 叿°”压力最大值 (%%1 compliant, defined as > %2 hours) (%%1 ä¾ä»Žæ€§, 定义为 > %2 å°æ—¶) Bedtime ç¡çœ æ—¶é—´ No SleepyHead data folder was found. Would you like SleepyHead to use the default location for storing its data? 没有找到SleepyHeadæ•°æ®æ–‡ä»¶å¤¹. 您希望SleepyHead将数æ®å­˜å‚¨äºŽé»˜è®¤æ–‡ä»¶å¤¹å—? Pressure 压力 Average å¹³å‡ Target Minute Ventilation 目标分钟通气率 Amount of air displaced per minute æ¯åˆ†é’Ÿçš„æ¢æ°”é‡ Percentage of breaths triggered by patient 患者出å‘的呼å¸ç™¾åˆ†æ¯” Non Data Capable Machine æ²¡æœ‰ä½¿ç”¨æœºå™¨çš„æ•°æ® Plethysomogram 体积æè¿°æœ¯ Unclassified Apnea æœªå®šä¹‰çš„å‘¼å¸æš‚åœ Starting Ramp Pressure 开始斜å¡å‡åŽ‹ DOB: %1 生日:%1 Intellipap event where you breathe out your mouth. Intellipap侦测到的嘴部呼å¸äº‹ä»¶. Flow Limit æ°”æµå—é™ UAI=%1 æœªçŸ¥æš‚åœæŒ‡æ•°=%1 Pulse Rate 脉æ This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. 所存数æ®ä¸Žæ­¤é…置文件ä¸ç¬¦ æ•°æ®å·²è¢«çŽ°æœ‰å†…å®¹è¦†ç›–. Graph showing running AHI for the past hour åŒè¡Œæ˜¾ç¤ºè¿‡åŽ»ä¸€ä¸ªå°æ—¶çš„AHI Graph showing running RDI for the past hour å›¾å½¢æ˜¾ç¤ºè¿‡åŽ»ä¸€ä¸ªå°æ—¶çš„RDI seconds ç§’ Mask Time é¢ç½©ä½¿ç”¨æ—¶é—´ Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. æ‚¨çš„é£žåˆ©æµ¦ä¼Ÿåº·å‘¼å¸æœº (åž‹å· %1) ä¸é€‚用. Channel é€šé“ Hybrid F/F Mask æ··åˆé¢ç½© Max Leaks æœ€å¤§æ¼æ°”率 A period of periodic breathing å‘¨æœŸæ€§å‘¼å¸æœŸé—´ Days=%1 天数=%1 &Donate &æèµ  Address: 地å€: Waketime=%1 觉醒时间=%1 degrees 角度 User Flag #1 用户标记#1 User Flag #2 用户标记#2 User Flag #3 用户标记#3 A ResMed data source showing Respiratory Events 瑞æ€è¿ˆæ•°æ®æºæ˜¾ç¤ºçš„呼叿—¶é—´ Bedtime=%1 ç¡çœ æ—¶é—´=%1 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% 呼å¸ä½œç”¨æŒ‡æ•°=%1 鼾声指数=%2 æ°”æµå—陿Œ‡æ•°=%3 周期性呼å¸/潮湿呼å¸=%4%% Median rate of detected mask leakage é¢ç½©æ¼æ°”率的中间值 Mask Pressure é¢ç½©åŽ‹åŠ› A vibratory snore as detcted by a System One machine 振动打鼾å¯è¢«System One侦测到 events/hour 事件/å°æ—¶ Reporting data goes here 报告数æ®ä½ç½® Respiratory Event 呼å¸äº‹ä»¶ A type of respiratory event that won't respond to a pressure increase. 未导致压力上å‡çš„呼å¸äº‹ä»¶. Clear Airway Apnea 开放气é“呼叿š‚åœ Windows User Windows用户 Unspecified 未定义 Question 问题 Higher Inspiratory Pressure æ›´é«˜çš„å¸æ°”压力 Bi-Level åŒæ°´å¹³ SleepyHead v%1 - http://sleepyhead.sourceforge.net SleepyHead v%1 - http://sleepyhead.sourceforge.net Unknown 未知 events/hr 事件/å°æ—¶ SleepyHead SleepyHead Duration æ—¶é•¿ (Sess=%1) (会è¯=%1) Sessions ä¼šè¯ Settings 设置 Overview 总览 Target Minute Ventilation? 目标分钟通气率? Entire Day's Flow Waveform å…¨å¤©æ°”æµæ³¢å½¢ Exiting 正在退出 An restriction in breathing that causes an either an awakening or sleep disturbance. 此类呼å¸é™åˆ¶å¯¼è‡´æ—¢ä¸æ˜¯è§‰é†’ä¹Ÿä¸æ˜¯ç¡çœ éšœç¢çš„状æ€. Pressure Support Maximum åŽ‹åŠ›æ”¯æŒæœ€å¤§å€¼ Graph showing severity of flow limitations 图形显示气æµé™åˆ¶çš„严é‡ç¨‹åº¦ : %1 hours, %2 minutes, %3 seconds :%1 å°æ—¶, %2 分钟, %3 ç§’ Software changes have been made that require the reimporting of the following machines data: è½¯ä»¶è®¾ç½®æ›´æ”¹ï¼Œè¯·é‡æ–°å¯¼å…¥å¦‚下数æ®: A partially obstructed airway æ°”é“部分阻塞 Pressure Support Minimum åŽ‹åŠ›æ”¯æŒæœ€å°å€¼ Large Leak 大釿¼æ°” Wake-up 醒 Warning 警告 Min Pressure 最å°åŽ‹åŠ› Total Leak Rate æ€»æ¼æ°”率 No Directory 没有目录 Max Pressure 最大压力 MaskPressure é¢ç½©åŽ‹åŠ› Total Leaks æ€»æ¼æ°”é‡ Minute Ventilation 分钟通气率 Rate of detected mask leakage é¢ç½©æ¼æ°”率 Breathing flow rate waveform 呼叿µé‡æ³¢å½¢ Lower Expiratory Pressure 更低的呼气压力 AI=%1 HI=%2 CAI=%3 æš‚åœæŒ‡æ•°=%1 低通气指数=%2 ä¸­æž¢æ€§æš‚åœæŒ‡æ•°=%3 This is a beta software and some functionality may not work as intended yet. 此测试版本å¯èƒ½å­˜åœ¨æŸäº›æœªçŸ¥é—®é¢˜. Time taken to breathe in 叿°”æ—¶é—´ Maximum Therapy Pressure 最大治疗压力 Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! æ— æ³•è§£æž Channels.xml,å·²æŸå,退出! Current Selection 当å‰é€‰æ‹© Obstructive Apnea é˜»å¡žæ€§å‘¼å¸æš‚åœ Blood-oxygen saturation percentage 血氧饱和百分比 Inspiratory Time 叿°”æ—¶é—´ Respiratory Rate 呼å¸é¢‘率 Please report any bugs you find to SleepyHead's SourceForge page. 请将è¿è¡Œè½¯ä»¶ä¸­é‡åˆ°çš„错误å‘é€åˆ°SourceForgeçš„SleepyHead页é¢. Printing %1 Report 正在打å°%1报告 Expiratory Time 呼气时间 Expiratory Puff å˜´éƒ¨å‘¼å¸ Maximum Leak æœ€å¤§æ¼æ°”率 Ratio between Inspiratory and Expiratory time å‘¼æ°”å’Œå¸æ°”时间的比率 Minimum Therapy Pressure æœ€å°æ²»ç–—压力 A sudden (user definable) change in heart rate 心率çªå˜ Oximetry 血氧测定 Oximeter 血氧仪 The maximum rate of mask leakage é¢ç½©çš„æœ€å¤§æ¼æ°”率 Machine Database Changes æ•°æ®åº“更改 The folder you chose is not empty, nor does it already contain valid SleepyHead data. Are you sure you want to use this folder? 您选了一个éžç©ºæ–‡ä»¶å¤¹ï¼Œä¸”æ­¤æ–‡ä»¶å¤¹å«æœ‰SleepyHeadå¯ç”¨çš„æ•°æ®. 您ä»ç„¶ç¡®è®¤æŒ‡å®šè¿™ä¸ªæ–‡ä»¶å¤¹å—? Expiratory Pressure 呼气压力 Tgt. Min. Vent 目标 分钟 通气 Release Notes 版本注释 Pressure Pulse 压力脉冲 Humidifier 湿度 Patient ID æ‚£è€…ç¼–å· An apnea caused by airway obstruction æ°”é“阻塞状æ€ä¸‹çš„呼叿š‚åœ Days: %1 天数:%1 Low Usage Days: %1 低使用天数:%1 (%1% compliant, defined as > %2 hours) (%1% ä¾ä»Žæ€§, 定义为 > %2 å°æ—¶) (Sess: %1) (会è¯:%1) Bedtime: %1 ç¡çœ æ—¶é—´:%1 Waketime: %1 觉醒时间:%1 Minutes 分钟 Seconds ç§’ Events/hr 事件/å°æ—¶ Hz Hz Litres å‡ ml æ¯«å‡ Breaths/min 呼叿¬¡æ•°/分钟 Severety (0-1) Severety (0-1) Degrees 度 Information æ¶ˆæ¯ Busy å¿™ Please Note 请留言 &Yes &是 &No &ä¸ &Cancel &å–æ¶ˆ &Destroy &删除 &Save &ä¿å­˜ No Data Available æ— å¯ç”¨æ•°æ® Unknown PRS1 Code %1 未知耳朵PRS1ç¼–ç %1 PRS1_%1 PRS1_%1 Launching Windows Explorer failed å¯åŠ¨è§†çª—æµè§ˆå™¨å¤±è´¥ Could not find explorer.exe in path to launch Windows Explorer. 未找到视窗æµè§ˆå™¨çš„坿‰§è¡Œæ–‡ä»¶. SleepyHead (%1) needs to upgrade its database for %2 %3 %4 SleepyHead (%1) 需è¦ä¸º %2 %3 %4å‡çº§æ•°æ®åº“ <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <b>SleepyHead 为您ä¿å­˜ä¸€ä»½æ•°æ®å¤‡ä»½ä»¥å¤‡ä¸æ—¶ä¹‹éœ€.</b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> SleepyHead does not yet have any automatic card backups stored for this device. SleepyHead ä¸èƒ½ä¸ºæ­¤è®¾å¤‡è‡ªåЍ备份. This means you will need to import this machine data again afterwards from your own backups or data card. è¿™æ„å‘³ç€æ‚¨éœ€è¦è‡ªè¡Œç”±æ‚¨çš„存档或者数æ®å¡ä¸­å¯¼å…¥æ•°æ®. Important: é‡è¦æç¤º: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. 一旦å‡çº§,ä½ <font size=+1>å°†ä¸èƒ½</font> 在之å‰çš„版本中应用此é…置文件. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. 如果你在æ„这个,那么就点击ä¸é€€å‡º,ç„¶åŽæ‰‹åŠ¨å¤‡ä»½æ‚¨çš„é…置文件.而åŽå†æ¬¡è¿è¡ŒSleepHead. Are you ready to upgrade, so you can run the new version of SleepyHead? 确定å‡çº§ä»¥ä½¿ç”¨æ–°ç‰ˆSleepHead? Sorry, the purge operation failed, which means this version of SleepyHead can't start. 抱歉,清除æ“作失败,SleepHead无法å¯åЍ. The machine data folder needs to be removed manually. æ•°æ®æ–‡ä»¶å¤¹éœ€è¦æ‰‹åŠ¨ç§»é™¤. This folder currently resides at the following location: 本地文档ä½ç½®: Rebuilding from %1 Backup ç”±%1备份é‡å»ºä¸­ Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? 您希望打开自动备份功能å—? SleepyHead will now start the import wizard so you can reinstall your %1 data. SleepHead现在开始导入å‘å¯¼ï¼Œä¾¿äºŽæ‚¨é‡æ–°å®‰è£…%1的数æ®. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: SleepHead将会推出,ç„¶åŽå°†å°è¯•打开文件管ç†å™¨ä»¥ä¾¿äºŽæ‚¨æ‰‹åЍ备份é…置文件于: Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. 利用文件管ç†å™¨æ¥åˆ›å»ºé…置文件列表的备份,然åŽé‡å¯SleepHead以完æˆå‡çº§. Vibratory Snore (VS2) å‘¼å¸ é¢‘çŽ‡ (呼叿¬¡æ•°/分钟) Mask On Time é¢å…·ä½¿ç”¨æ—¶é—´ Time started according to str.edf 计时å‚ç…§str.edf Summary Only 仅有概è¦ä¿¡æ¯ CPAP Session contains summary data onlyf CPAP会è¯ä¿¡æ¯ä»…嫿œ‰æ¦‚è¦æ•°æ® Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. 查找这一版本 <a href='%1'>在Sourceforge的存档</a>. A faster build of SleepyHead may be available A faster build of SleepyHead may be available You will not be bothered with this message again. ä½ å°†ä¸ä¼šå†è¢«æ­¤ä¿¡æ¯æ‰“扰. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. 这个版本ä¸é”™,但是有一个 "<b>%1</b>" Build版会在您的电脑的è¿è¡Œçš„æ›´åŠ æµç•…. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. SleepyHeadæ­¤Build版适用于è€å¼ç¼ºä¹OpenGel 2.0支æŒçš„电脑,但是您的电脑对其完全支æŒ. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. SleepyHeadæ­¤Build版适用于è€å¼ç¼ºä¹OpenGel 2.0支æŒçš„电脑,å°±åƒæ‚¨çš„电脑一样,但是此版本的软件ä»å¯ä»¥åœ¨æ‚¨çš„电脑上较好的使用. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. 如果您在如VirtualBOX或者VMwae此类的虚拟机中è¿è¡Œè½¯ä»¶ï¼Œè¯·å¿½ç•¥æ­¤ä¿¡æ¯ï¼Œå› ä¸ºæ²¡æœ‰æ›´å¥½çš„版本以适用于虚拟机. Incompatible Graphics Hardware ä¸å…¼å®¹çš„æ˜¾å¡ This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. æ­¤Build版本需è¦OpenGel2.0,ä½†æ‚¨çš„ç”µè„‘ä¸æ”¯æŒ. You may need to update your computers graphics drivers from the GPU makers website. %1 请å‡çº§æ‚¨çš„æ˜¾å¡. %1 (<a href='http://intel.com/support'>Intel's support site</a>) (<a href='http://intel.com/support'>英特尔网站</a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. 图形渲染出错,将会导致软件崩溃,软件将退出. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. ä¸è¦ç°å¿ƒï¼Œæœ¬è½¯ä»¶çš„ "<b>-BrokenGL</b>"版本å¯ä»¥åº”用与您的电脑. No SleepyHead data folder was found. 没有å‘现SleepyHeadæ•°æ®æ–‡ä»¶å¤¹. Would you like SleepyHead to use the default location for storing its data? 您希望SleepyHead在默认文件夹ä½ç½®å‚¨å­˜æ•°æ®å—? As you did not select a data folder, SleepyHead will exit. å› ä¸ºæ‚¨æ²¡æœ‰é€‰æ‹©ä¸€ä¸ªæœ‰æ•ˆçš„æ•°æ®æ–‡ä»¶å¤¹,SleepyHead将退出. Next time you run, you will be asked again. 下次è¿è¡Œæ—¶,å°†ä¼šå†æ¬¡è¯¢é—®. You did not select a directory. 你没有选择目录. SleepyHead will now start with your old one. SleepHead正从旧的目录å¯åЍ. The folder you chose is not empty, nor does it already contain valid SleepyHead data. æ‰€é€‰çš„å¹¶ä¸æ˜¯ç©ºæ–‡ä»¶,也没有å¯ç”¨çš„SleepyHeadæ•°æ®. Are you sure you want to use this folder? 确认选择这个文件夹å—? There is a lockfile already present for profile '%1'. There is a lockfile already present for profile '%1'. You can only work with one instance of an individual SleepyHead profile at a time. æ¯æ¬¡åªèƒ½æ‰“开一个å•独的SleepyHeadé…置文件. Please close any other instances of SleepyHead running with this profile before proceeding. 在进行之å‰è¯·å…³é—­å…¶ä»–的正在è¿è¡Œçš„SleepyHeadé…置实例. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. 如果没有其他的SleepyHead实例在è¿è¡Œï¼ˆå¦‚,上次崩溃时).请忽略此信æ¯. There is a lockfile already present for this profile '%1', claimed on '%2'. There is a lockfile already present for this profile '%1', claimed on '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. 如果您使用云存储,请确ä¿SleepyHeadå·²ç»åŒæ­¥å®Œæ¯•,且软件已ç»å…³é—­. Unknown. 未知. ? ? Severity (0-1) 严é‡ç¨‹åº¦ (0-1) Fixed 固定的 Auto 自动的 Fixed Bi-Level å›ºå®šåŒæ°´å¹³ Auto Bi-Level (Fixed PS) è‡ªåŠ¨åŒæ°´å¹³ ASV Fixed EPAP ASV Fixed EPAP ASV Variable EPAP ASV Variable EPAP %1 %2 %1 %2 %1-%2 %3 %1-%2 %3 Range 范围 Fixed %1 固定%1 Auto Bi-Level å…¨è‡ªåŠ¨åŒæ°´å¹³ Welcome to SleepyHead 欢迎使用SleepyHead What would you like to do? 确定? Please Import Some Data è¯·å¯¼å…¥æ•°æ® CPAP<br/>Importer CPAP<br/>æ•°æ®å¯¼å…¥ Oximetery<br/>Wizard 血氧仪<br/>安装å‘导 View<br/>Statistics 查看<br/>统计 It might be a good idea to check preferences first,</br>as there are some options that affect import. 鉴于有些选项与数æ®å¯¼å…¥ç›¸å…³,</br>.请先对é…置文件进行设置. First import can take a few minutes. 第一次导入将会花费数分钟. Click this box to see this in daily view. 点击方å—开坿—¥è§†å›¾. The last time you used your %1... 上一次您使用您的%1... last night 上一晚 yesterday 昨天 %2 days ago %2 å¤©ä»¥å‰ was %1 (on %2) 是 %1 (在 %2) perfect :) 很好:) pretty darn good éžå¸¸å¥½ reasonably good 还行 technically "treated" 技术上讲的"治疗" not very good ä¸å¥½ horrible, please consult your doctor ææ€– ,å’¨è¯¢å¤§å¤«å§ %1 hours, %2 minutes and %3 seconds %1 å°æ—¶, %2分钟 %3 ç§’ You slept for %1. 您ç¡äº† %1. <font color = red>You only had the mask on for %1.</font> <font color = red>带呼å¸é¢ç½© %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). 没有 <i>主è¦çš„</i> æ¼æ°” (最大是 %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. å°‘é‡å¯æŽ¥å—çš„<i>主è¦</i> é¢ç½©æ¼æ°”. You had significant periods of <i>major</i> mask leakage. 严é‡çš„<i>主è¦</i> é¢ç½©æ¼æ°”. Your mask is leaking way too much.. Talk to your CPAP advisor. æ¼æ°”太严é‡ï¼Œè¯·å‘呼叿œºé¡¾é—®å¯»æ±‚帮助. Your CPAP machine blasted you with a constant %1%2 of air 呼叿œºä»¥æŒç»­çš„%1%2æ°”æµæ‘§æ®‹ä½  Your pressure was under %1%2 for %3% of the time. 压力低于 %1%2 ,æŒç»­æ—¶é—´%3%. Your machine blasted you with a constant %1-%2 %3 of air. 呼叿œºä»¥æŒç»­çš„%1-%2 %3 æ°”æµæ‘§æ®‹ä½ . Your machine was under %1-%2 %3 for %4% of the time. 压力低于 %1-%2 %3 ,æŒç»­æ—¶é—´%4% . Your EPAP pressure was under %1%2 for %3% of the time. 呼气压力低于 %1%2 ,æŒç»­æ—¶é—´ %3% . Your IPAP pressure was under %1%2 for %3% of the time. 叿°”压力低于 %1%2 ,æŒç»­æ—¶é—´ %3% . No CPAP data has been imported yet. æœªå¯¼å…¥å‘¼å¸æœºæ•°æ®. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> 最新的血氧仪数æ®: <a onclick='alert("daily=%2");'>%1</a> (last night) (上一晚) (yesterday) (昨天) (%2 day ago) (%2 天以å‰) No oximetery data has been imported yet. 未导入血氧仪数æ®. Very Important Warning é‡è¦è­¦å‘Š <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. <p>总是<font size=+1 color=red><b>å†™ä¿æŠ¤</b></font> æ‚¨çš„å‘¼å¸æœºSDæ•°æ®å¡ï¼Œåœ¨æ’入电脑å‰. <span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>æŸäº›æ“作系统</font></span> 会自动在SDå¡ä¸Šåˆ›å»ºæ–‡ä»¶è€Œä¸æç¤ºï¼Œè¿™æ ·ä¼šå¯¼è‡´å‘¼å¸æœºä¸èƒ½æ­£ç¡®è¯†åˆ«è¯¥å¡ã€‚ Contec Contec CMS50 CMS50 Fisher & Paykel Fisher & Paykel ICON ICON DeVilbiss DeVilbiss Intellipap ChoiceMMed ChoiceMMed MD300 MD300 Respironics Respironics M-Series M-Series Philips Respironics Philips Respironics System One System One ResMed ResMed S9 S9 Somnopose Somnopose Somnopose Software Somnopose Software Zeo Zeo Personal Sleep Coach ç¡çœ æ•™ç»ƒ Ramp Event æ–œå¡å¯åŠ¨äº‹ä»¶ Ramp æ–œå¡å¯åЍ Your EPAP pressure fixed at %1%2. 呼气压力固定于 %1%2. Database Outdated Please Rebuild CPAP Data æ•°æ®åº“过期 请é‡å»ºå‘¼å¸æœºæ•°æ® %1 threshold %1 临界值 Sleep ç¡ Wake 醒 Series 系列 Yes 是的 No ä¸ Auto Bi-Level (Variable PS) å…¨è‡ªåŠ¨åŒæ°´å¹³(压力å¯å˜) %1%2 %1%2 Fixed %1 (%2) 固定 %1 (%2) Min %1 Max %2 (%3) æœ€å° %1 最大%2(%3) EPAP %1 IPAP %2 (%3) 呼气压力 %1 叿°”压力%2 (%3) PS %1 over %2-%3 (%4) 压力 %1 超过 %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) 最å°å‘¼æ°”压力%1 æœ€å¤§å¸æ°”压力%2 压力 %3-%4 (%5) EPAP %1 PS %2-%3 (%6) 呼气压力 %1 压力 %2-%3 (%6) SmartFlex Mode SmartFlexæ¨¡å¼ Intellipap pressure relief mode. Intellipa压力释放模å¼. Ramp Only ä»…æ–œå¡å‡åŽ‹ Full Time 全部时间 SmartFlex Level SmartFlex 级 Intellipap pressure relief level. Intellipap 压力释放水平. SmartFlex Settings SmartFlex设置 15mm 15mm 22mm 22mm Flex Mode Flexæ¨¡å¼ PRS1 pressure relief mode. PRS1 压力释放模å¼. C-Flex C-Flex C-Flex+ C-Flex+ A-Flex A-Flex Rise Time ä¸Šå‡æ—¶é—´ Bi-Flex Bi-Flex Flex Level Flex Level PRS1 pressure relief setting. PRS1 压力释放设置. x1 X1 x2 X2 x3 X3 x4 X4 x5 X5 Humidifier Status åŠ æ¹¿å™¨çŠ¶æ€ PRS1 humidifier connected? PRS1 加湿器连接? Disconnected æ–­å¼€ Connected 连接 Humidification Level 加湿程度 PRS1 Humidification level PRS1加湿水平 Humid. Lvl. Humid. Lvl. System One Resistance Status System One Resistance Status Sys1 Resist. Status Sys1 Resist. Status System One Resistance Setting System One Resistance Setting System One Mask Resistance Setting System Oneé¢ç½©é˜»åŠ›è®¾ç½® Sys1 Resist. Set Sys1 Resist. Set Hose Diameter 管径 Diameter of primary CPAP hose 呼叿œºä¸»ç®¡å†…径 System One Resistance Lock System One 阻力é”定 Whether System One resistance settings are available to you. System One的阻力设定å¯ç”¨å—. Sys1 Resist. Lock Sys1 Resist. Lock Auto On 自动打开 A few breaths automatically starts machine 自动打开机器在几次呼å¸åŽ Auto Off 自动关闭 Machine automatically switches off 呼叿œºè‡ªåЍ关闭 Mask Alert é¢ç½©æŠ¥è­¦ Whether or not machine allows Mask checking. 是å¦å…è®¸å‘¼å¸æœºè¿›è¡Œé¢ç½©æ£€æŸ¥. Show AHI 显示AHI Whether or not machine shows AHI via LCD panel. 是å¦åœ¨å‘¼å¸æœºLCDå±å¹•上显示AHI. Timed Breath çŸ­æ—¶é—´çš„å‘¼å¸ Machine Initiated Breath 呼å¸è§¦å‘æœºå™¨å¼€å¯ TB TB VPAP Adapt VPAP自适应 EPR EPR ResMed Exhale Pressure Relief 瑞æ€è¿ˆå‘¼æ°”压力释放 Patient??? ç—…æ‚£??? EPR Level 呼气压力释放水平 Exhale Pressure Relief Level 呼气压力释放水平 0cmH2O 0cmH2O 1cmH2O 1cmH2O 2cmH2O 2cmH2O 3cmH2O 3cmH2O EPR: 呼气压力释放: Weinmann Weinmann SOMNOsoft2 SOMNOsoft2 Pressure Min 最å°åŽ‹åŠ› Pressure Max 最大压力 Leak Flag æ¼æ°”标志 LF æ¼æ°”标志 CPAP Session contains summary data only 仅嫿œ‰æ¦‚è¦æ•°æ® PAP Mode æ­£åŽ‹é€šæ°”æ¨¡å¼ PAP Device Mode æ­£åŽ‹é€šæ°”æ¨¡å¼ ASV (Fixed EPAP) ASVæ¨¡å¼ (固定呼气压力) ASV (Variable EPAP) ASVï¼Œæ¨¡å¼ (å¯å˜å‘¼æ°”压力) Are you sure you want to reset all your channel colors and settings to defaults? 确定将所有通é“颜色æ¢å¤é»˜è®¤è®¾ç½®å—? ASV Auto EPAP ASV 自动呼气压力 You had an AHI of %1, which is considered %2 You had an AHI of %1, which is considered %2 (% of time) (% of time) Duration %1:%2:%3 æ—¶é•¿ %1:%2:%3 AHI %1 AHI %1 Peak 峰值 Maximum 最大 %1% %2 %1% %2 Heated Tubing 加热管路 Heated Tubing Connected 加热管路已连接 Headed Tubing 加热管路 By Pressure 压力 Statistics at Pressure 压力统计 SleepyHead is proudly brought to you by JediMark. d MMM [ %1 - %2 ] %1 %1% {1?} Hide All Events Show All Events Unpin %1 Graph Pin %1 Graph Plots Disabled (Summary Only) %1: %2 %1% %2 {1:?} Relief: %1 Hours: %1h, %2m, %3s Machine Information æœºå™¨ä¿¡æ¯ Compliance Only :( Graphs Switched Off Summary Only :( 仅有概è¦ä¿¡æ¯:( Sessions Switched Off Journal Data SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead will not touch this folder, and will create a new one instead. Please be careful when playing in SleepyHead's profile folders :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. SleepyHead picked only the first one of these, and will use it in future: If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. CMS50F3.7 CMS50F CMS50F Loading %1 data... PLease Wait... Perfusion Index A relative assessment of the pulse strength at the monitoring site Perf. Index % APAP (Variable) Zero Upper Threshold Lower Threshold %1 Session #%2 You machine was on for %1. <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> or Snapshot %1 QextSerialPort General write operation failure 一般写入æ“作失败 Caught a non-blocked signal (POSIX) 抓å–到éžé˜»æ­¢ä¿¡å·(便æºå¼æ“作系统接å£) Receive buffer overflow 接å—缓冲区溢出 There was an I/O error while communicating with the port I/O错误 The %1 file doesn't exists 命å为 %1 的文件ä¸å­˜åœ¨ General read operation failure ä¸€èˆ¬è¯»å–æ“作失败 The port detected a break condition 监测到文件æŸå Character buffer overrun 字符缓冲溢出 Permission denied æ‹’ç»è®¿é—® Invalid file descriptor (port was not opened correctly) 无效的文件标示符(ç«¯å£æ²¡æœ‰æ­£ç¡®æ‰“å¼€) Device is already locked 设备已é”定 Transmit buffer overflow å‘é€ç¼“冲区溢出 Operation timed out (POSIX) æ“作超时(便æºå¼æ“作系统接å£) No Error has occurred æ— æ•…éšœå‘生 The port detected a parity error in the received data 奇嶿 ¡éªŒé”™è¯¯ The port detected a framing error (usually caused by incorrect baud rate settings) é€šä¿¡é”™è¯¯ï¼ˆè¯·é‡æ–°è®¾ç½®æ³¢ç‰¹çŽ‡ï¼‰ The file opened by the port is not a valid device 请连接适当的设备,此设备无效 Unable to allocate memory tables (POSIX) 内存无法分é…(便æºå¼æ“作系统接å£) Unknown error: %1 ä½ç½®é”™è¯¯: %1 QuaGzipFile Opening gzip for both reading and writing is not supported 䏿”¯æŒè¯»å†™GZIP文件 Could not gzopen() file ä¸èƒ½å¤Ÿè§£åŽ‹()文件 QIODevice::Append is not supported for GZIP QIODevice::æŒ‡å®šæ‰“å¼€æ–‡ä»¶ä¸æ”¯æŒ GZIP æ ¼å¼æ–‡ä»¶ You can open a gzip either for reading or for writing. Which is it? è¯»å– è¿˜æ˜¯ 写入? QuaZIODevice QIODevice::ReadWrite is not supported for QuaZIODevice QIODevice::䏿”¯æŒå¯¹ QuaZIODevice 的读写 QIODevice::Append is not supported for QuaZIODevice QIODevice::æŒ‡å®šæ–‡ä»¶ä¸æ”¯æŒ QuaZIODevice QuaZipFilePrivate ZIP/UNZIP API error %1 压缩/解压缩 端å£é”™è¯¯ %1 Report Form 表格 about:blank about:空白 SessionBar No Sessions Present æ²¡æœ‰ä¼šè¯ Statistics Days 天数 Best&nbsp;%1 最好&nbsp;%1 Usage Information ä½¿ç”¨ä¿¡æ¯ PS %1 åŽ‹åŠ›æ”¯æŒ %1 SleepyHead is pretty much useless without it. SleepyHeadéžå¸¸éœ€è¦å®ƒ. Oximeter Statistics 血氧仪统计 CPAP Usage CPAP使用情况 Blood Oxygen Saturation 血氧饱和度 Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. 功效显示忽略低于处方设置%1天数的数æ®. % of time in %1 % 在 %1 时间中 Last 30 Days 过去三å天 Compliant Days ä¾ä»Žå¤©æ•° %1 Index %1 指数 Worst RX Setting 最差治疗方案设定 Best RX Setting 最佳治疗方案设定 90% %1 90% %1 %1 day of %2 Data on %3 %1 天在 %2 中的数æ®åœ¨ %3 Changes to Prescription Settings æ”¹å˜æ²»ç–—方案设定 Therapy Efficiacy 治疗效率 Pr. Rel. 压力释放. Max %1 最大 %1 %1 Median %1 中值 Min %1 æœ€å° %1 Most Recent 最近 Pressure Settings 压力设置 Pressure Statistics 压力统计 Compliancy ä¾ä»Žæ€§ Last 6 Months 过去六个月 Total Days 总天数 CPAP %1 CPAP %1 Average %1 å¹³å‡ %1 No %1 data available. %1 æ•°æ®å¯ç”¨. Last Use 最åŽä¸€æ¬¡ First import can take a few minutes. 第一次导入将会花费数分钟. Pulse Rate 脉æ First Use 首次 Days AHI &gt;5.0 AHI &gt;5.0 的天数 EPAP %1 呼气压力 %1 Last Week 上周 Last Year 去年 Details 详情 Worst&nbsp;%1 最差&nbsp;%1 %1 days of %2 Data, between %3 and %4 %1 天的在 %2中的数æ®,在%3 å’Œ %4 之间 APAP %1 - %2 APAP %1 - %2 Please Import Some Data è¯·å¯¼å…¥æ•°æ® Last Session ä¸Šä¸€ä¸ªä¼šè¯ Machine Information æœºå™¨ä¿¡æ¯ CPAP Statistics CPAP统计 IPAP %1 叿°”压力 %1 Leak Statistics æ¼æ°”统计 It might be a good idea to check preferences first,</br>as there are some options that affect import. 鉴于有些选项与数æ®å¯¼å…¥ç›¸å…³,</br>.请先对é…置文件进行设置. Average Hours per Night 平凿¯æ™šçš„å°æ—¶æ•° Compliance ä¾ä»Žæ€§ % of time above %1 threshold % 的时间高于 %1 阈值 % of time below %1 threshold % 的时间低于 %1 阈值 Fixed %1 固定%1 I can haz data?!? I can haz data?!? This lonely sleepy sheep has no data :( æ— æ•°æ® :( Fixed %1 %2 固定%1 %2 Pressure Relief 压力释放 Summary FL æ°”æµå—é™ Min EPAP 呼气压力最å°å€¼ Days 天数 Best&nbsp;%1 最好&nbsp;%1 Usage Information ä½¿ç”¨ä¿¡æ¯ Min Pres. 最å°åŽ‹åŠ›. Average Pulse Rate å¹³å‡è„‰æ Average Pressure å¹³å‡åŽ‹åŠ› SleepyHead is pretty much useless without it. SleepyHeadéžå¸¸éœ€è¦å®ƒ. No CPAP data available. 没有å¯ç”¨çš„CPAPæ•°æ®. %1% %2 %1% %2 The above has a threshold which excludes day counts less than %1 from the best/worst highlighting 以上显示为从最好/最差中排除å°äºŽ%1çš„æ•°æ® %1 days of CPAP Data, between %2 and %3 %1 天的数æ®, 在 %2.å’Œ %3 之间 Last 30 Days 过去三å天 Compliant Days 相兼容的天数 No CPAP Machine Data Imported 没有CPAPæ•°æ®è¢«å¯¼å…¥ RERA Index 呼å¸åŠªåŠ›ç›¸å…³æ€§è§‰é†’æŒ‡æ•° Worst RX Setting 最差治疗方案设定 Best RX Setting 最佳治疗方案设定 Last 7 Days 过去一周 Changes to Prescription Settings æ”¹å˜æ²»ç–—方案设定 %1 day of Oximetry Data, on %2. %1 天的血氧数æ®, 在 %2. Pr. Rel. 压力释放. PS Max 最大压力 PS Min 最å°åŽ‹åŠ› Last 6 months 过去六个月 Most Recent 最近 Maximum Pulse Rate 最大脉æ Minimum Pulse Rate 最å°è„‰æ Total Days 总天数 CPAP Statistics as of CPAP统计开始于 Average %1 å¹³å‡ %1 Max IPAP 叿°”压力最大值 Last Use 最åŽä¸€æ¬¡ First import can take a few minutes. 第一次导入将会花费数分钟. Pressure 压力 Hours per Night å°æ—¶æ¯æ™š Oximetry Summary è¡€æ°§æ•°æ®æ¦‚览 First Use 首次 Days AHI &gt;5.0 AHI &gt;5.0 的天数 Average SpO2 å¹³å‡è¡€æ°§é¥±å’Œåº¦ %1% Pressure %1% 压力 Max Pres. 最大压力. Last Year 去年 Details 详情 Worst&nbsp;%1 最差&nbsp;%1 %1 days of Oximetry Data, between %2 and %3 %1 天的血氧数æ®, 在 %2 与 %3 之间 % of time in SpO2 Events % 的时间的血氧饱和度事件 SpO2 Events / Hour 血样饱和度 事件/å°æ—¶ Please Import Some Data è¯·å¯¼å…¥æ•°æ® Machine Information æœºå™¨ä¿¡æ¯ %1 day of CPAP Data, on %2. %1 天的数æ®, 在 %2. Pulse Change Events / Hour è„‰ææ³¢åЍ æ—¶é—´/å°æ—¶ Minimum SpO2 最低宣扬饱和度 It might be a good idea to check preferences first,</br>as there are some options that affect import. 鉴于有些选项与数æ®å¯¼å…¥ç›¸å…³,</br>.请先对é…置文件进行设置. Flow Limit Index æ°”æµå—陿Œ‡æ•° UpdaterWindow Log 登录 Size å¤§å° Saving as ä¿å­˜ä¸º &Finished &å®Œæˆ Redirected to 釿–°å®šä½åˆ° A new version of SleepyHead is available! 有更新! Download Error. Sorry, try again later. 下载出错,请ç¨åŽå†è¯•. There was an error parsing the XML Update file. XMLå‡çº§æ–‡ä»¶è§£æžå¤±è´¥. Updates Complete. SleepyHead needs to restart now, click Finished to do so. å‡çº§å®Œæ¯•ï¼Œè¯·ç‚¹å‡»å®Œæˆæ¥é‡å¯SlpeeyHead. XML update structure parsed cleanly XML结构å‡çº§è§£æžå®Œæ¯• Version <b>%1</b> is available. You're currently running v%1 版本 <b>%1</b> å·²å¯ç”¨. 已安装的 v%1 Please wait while updates are downloaded and installed... 请è€å¿ƒç­‰å¾…下载安装结æŸ... Shiny new <b>v%1</b> is available. You're running old and busted v%2 闪亮亮的新版 <b>v%1</b> å·²ç»é€€å‡º. 速度走起! v%2 SleepyHead Updater SleepyHead å‡çº§ç¨‹åº SleepyHead Updates SLeepyHeadå‡çº§ Component 元件 Failed 失败 &Upgrade Now &现在å‡çº§ Version Information ç‰ˆæœ¬ä¿¡æ¯ Build Notes 建档日期 No new updates were found for your platform. 未å‘现此系统的更新文件. Download Complete 下载完毕 No updates were found for your platform. 未å‘现新版本. Downloading & Installing Updates 正在下载&安装å‡çº§æ–‡ä»¶ Maybe &Later å¯èƒ½ &åŽæ¥ Extracting æå–中 Update to QtLibs (v%1) å‡çº§åˆ° QtLibs (v%1) about:blank about:空白 Update Failed :( å‡çº§å¤±è´¥ :( SleepyHead v%1, codename "%2" SleepyHead v%1 ,代ç åç§° "%2 Progress 进行中 Checking for SleepyHead Updates 检查更新 Please wait while downloading and installing updates. 请è€å¿ƒç­‰å¾…. File integrity check failed for %1 文件完整性校验失败,由于 %1 的原因 %1 bytes received 已下载 %1 字节 A new version of $APP is available 新版本的$APP You might need to reinstall manually. Sorry :( 抱歉,请手动安装. :( Updates å‡çº§æ–‡ä»¶ Downloading & Installing Updates... 正在下载&安装å‡çº§æ–‡ä»¶... Version 版本 Update Complete! å‡çº§å®Œæ¯•! SleepyHead v%1 build notes SleepyHead v%1 ç‰ˆæœ¬ä¿¡æ¯ Requesting 正在请求 platform notes ç³»ç»Ÿä¿¡æ¯ Ugh.. Something went wrong with unzipping. 啊...解压缩失败.. An update for SleepyHead is available. SleepyHead有更新文件å¯ç”¨. File size mismatch for %1 文件大å°ä¸ç¬¦åˆäºŽ %1 There was an error completing a network request: ( è”网时出错: ( Release Notes 版本注释 gGraph Snapshot gGraphView 100% zoom level Reset Graph Layout Plots CPAP Overlays Oximeter Overlays Dotted Lines Restore X-axis zoom too 100% to view entire days data. Resets all graphs to a uniform height and default order. Y-Axis Remove Clone Clone %1 Graph sleepyhead-0.9.8/Translations/Nederlands.nl.ts0000644000175000017500000174745712412506713020767 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. Er kwam geen gegevensoverdracht van de oxymeter. Please ensure you select 'upload' from the oximeter devices menu. Kies eerst 'upload' in het menu van de oxymeter. CMS50Serial Processing... Verwerken... Question Vraag Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine? Heb je eraan gedacht om de oxymeter precies gelijk met je CPAP te starten? Information Informatie The most recent CPAP Session time has been selected as the start of your oximetry session. If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter. Het begin van de laatste CPAP sessie is gekozen als start voor je oxymetrie sessie. Als je bent vergeten om eerst de CPAP data te importeren, doe dat dan nu eerst en dan opnieuw de oxymeter. No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving. Er is geen geldige starttijd voor deze oxymetrie sessie. Pas de starttijd aan voordat je het opslaat. That's ok, I will use the time provided by your oximeter, however it will sync better next time if you start your oximeter recording at the same time your CPAP machine starts up. Dat is OK, ik zal de tijd van de oxymeter gebruiken. Maar het synchroniseren zal beter gaan als je de oxymeter tegelijk start met je CPAP. If you haven't set your oximeter clock you will have to manually edit this time before saving this oximetry session. Als je de klok van de oxymeter niet hebt ingesteld, moet je deze tijd aanpassen voordat je de sessie opslaat. It looks like your oximeter doesn't provide a valid start time, I'm going to set this oximetry session starting time to the CPAP starting time anyway. Het ziet ernaar uit dat de oxymeter niet een goede starttijd aangeeft. Ik zet deze starttijd nu gelijk aan die van de CPAP. You may have to adjust it manually if you remember the real start time before saving this session. Je kunt beter de tijd nu corrigeren, als je weet wat de echte starttijd was. (Also, did you remember to import todays CPAP data first?) (Ben je niet vergeten om EERST de CPAP gegevens te importeren?) The most recent CPAP Session time has been selected as the start of your oximetry session. Het tijdstip van de meest recente CPAP sessie wordt gebruikt als starttijd van de oxymetrie sessie. If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter. Als je vergeten bent om eerst de CPAP gegevens te importeren, doe dat dan nu en importeer daarna opnieuw de gegevens van de oxymeter. No valid start time was provided for this oximeter session. Er is geen geldige starttijd voor deze oxymetrie sessie opgegeven. You will likely have to adjust your oximeter sessions start time before saving. Je kunt beter de klok van de oxymeter gelijkzetten voordat je dit opslaat. Please Wait, Importing... Even wachten, import loopt... Import Failed. Wait for oximeter and try again. Import mislukt, Wacht tot de oxymeter klaar is en probeer het opnieuw. Something went wrong with reading from the Oximeter. Er ging iets fout bij het importeren vanaf de oxymeter. Please wait for oximeter to finish tranmitting than try restarting import again. Wacht even tot de oxymeter klaar is met verzenden en start dan de import opnieuw. Import Failed Import mislukt Set Oximeter to Upload Start Upload op de oxymeter Daily Form Staat bovenaan het venster hierboven Formulier Go to the previous day Ga naar de vorige dag Prev Niet gezien Vorige Show or hide the calender Kalender aan/uit zetten ... ... Go to the next day Ga naar de volgende dag Next Niet gezien Volgende Go to the most recent day with data records WJG: compacter Ga naar de laatste dag met gegevens Details Details about:blank Niet gezien about:blank Events WJG: Zou 'Apneus' niet beter zijn dan Gebeurtenissen'? Want dat is wat hier geteld wordt en het past beter op de ruimte van het tabje. AK: Nee, er zijn ook andere gebeurtenissen: snurken, RERA, enz. Misschien 'evenementen' of 'incidenten'? Incidenten View Size Onder INCIDENTEN Misschien is 'Zoomniveau' beter? Beeldgrootte Notes WJG: Is compacter, past beter op tabje In verband met de koppeling met Bladwijzers, lijkt me 'Notities' beter. Notities Journal WJG: is gebruikelijker Dagboek Small Klein Medium Medium Big Groot Color Kleur i i Ctrl+I Toetsenbord combinatie voor cursief Ctrl+I u u B B Ctrl+B Toetsenbord combinatie voor vet Ctrl+B Zombie Zombie I'm feeling... Ik voel me ... Weight Gewicht Awesome Fantastisch B.M.I. zonder puntjes? B.M.I. Bookmarks Bladwijzers Add Bookmark Bladwijzer toevoegen Starts WJG: er wordt een punt in de tijd mee aangegeven vanaf wanneer je opmerkingen wilt plaatsen Vanaf Remove Bookmark Bladwijzer verwijderen Flags Markeringen Graphs Grafieken Zoom fully out Volledig uitzoomen 100% 100% Reset the graph heights to uniform sizes Maak de grafiekhoogtes weer gelijk Reset Reset hoogtes Flags: Markeringen: Drop down this list to show/hide available graphs. WJG: In het Engels ook nogal omslachtig AK: Wellicht 'beschikbare' ook weglaten, is verwarrend, want de eerste is gelijk een (belangrijke) keuze Toon/verberg grafieken. Flow Rate AK: Afgekort wegens ruimtegebrek Stroomsnelh. RDI WJG: Wat is RDI? AK: Respiratory Disturbance Index, iets van Respironics RDI AHI AHI Mask Pressure Maskerdruk Pressure Druk Leak Lek Snore Snurken Resp. Rate Afgekort wegens ruimtegebrek Ademtempo Tidal Volume Teugvolume Minute Vent. Minuutventilatie Flow Limitation Staat in: Instellingen-Grafieken Stroombeperk. Pat. Trig. Breath WJG: te lang, past niet AK: Heeel moeilijk! Pat. Veroorz. Ademh. Resp. Event WJG: Zie 'event' AK: zie mijn opmerking bij 'event' Incident Insp. Time Staat in: Instellingen-Grafieken Inademtijd Exp. Time Staat in: Instellingen-Grafieken Uitademtijd IE WJG: wat is IE? AK: Bij een BIPAP Verhouding Inhalatie- Exhalatietijd, dus I/E I/E Sleep Stage Staat in: Instellingen-Grafieken Slaapfase Breakdown Niet gezien Verdeling events incidenten H Letters in de cirkelgrafiek H A Letters in de cirkelgrafiek A OA Letters in de cirkelgrafiek OA CA Letters in de cirkelgrafiek CA is Clear Airway, wat gelijk staat met Centrale Apneu CA RE Letters in de cirkelgrafiek RE NR Letters in de cirkelgrafiek NR FL Letters in de cirkelgrafiek FL PB Letters in de cirkelgrafiek PB E Letters in de cirkelgrafiek E L Letters in de cirkelgrafiek L NRI Letters in de cirkelgrafiek NRI VS Letters in de cirkelgrafiek VS VS2 Letters in de cirkelgrafiek VS2 UF1 Letters in de cirkelgrafiek UF1 UF2 Letters in de cirkelgrafiek UF2 UF3 Letters in de cirkelgrafiek UF3 Selection AHI Selectie AHI CSR CSR PR PR U1 U1 U2 U2 U3 U3 O2 O2 Events/hour Incidenten/uur PD PD No Data Geen gegevens No %1 events are recorded this day Er zijn vandaag geen %1 incidenten geweest %1 event %1 incident %1 events %1 incidenten PAP Mode: %1<br/> Soort PAP: %1<br/> This day has missing pressure, mode and settings data. Op deze dag ontbreken gegevens over druk, soort PAP en instellingen. %1%2 %1%2 This day just contains summary data, only limited information is available . Van deze dag zijn alleen overzichtsgegevens beschikbaar. Total time in apnea Totale Tijd in Apneu Time over leak redline Tijdsduur boven de rode leklimiet Time spent in ramp Tijd doorgebracht in druk-aanloop Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked. WJG: spelling oxymetrie (zie Van Dale) AK: mee eens Oxymetriegegevens beschikbaar, maar de tijden verschillen teveel: de grafieken worden niet verbonden. No Graphs :( Geen grafieken :( CPAP CPAP APAP APAP Bi-Level BiPAP ASV Adaptieve ventilatie-instelling ASI? AK: Hmmm ASV=Adaptive Servo-Ventilation Maar het is een vierde soort apparaat, tegen Centrale Apneus ASV Unknown Onbekend Date Datum Sleep Start Wake Einde Hypopnea Hypopneu (H) Apnea Onbekende apneu (A) Obstructive AK: nee,Obstructieve is bijv.nw. bij apneu Toch ief, staat in de tabel Obstructieve apneu (OA) Flow Limit AK: Inderdaad, bedoeld wordt een herkende vermindering in luchtstroom, hij gebruikt Flow Limit en -Limitation door elkaar Stroombeperking (FL) Clear Airway Open luchtweg of Centrale apneu (CA) User Flags Gebruikers vlag (UF) RERA RERA (RE) VSnore VSnore (VS) VSnore2 VSnore2 PB/CSR PA(PB)/CSR Exh&nbsp;Puff Exh&nbsp;Pufje Event Breakdown Verdeling incidenten Sessions all off! Niet gevonden Alle sessies uit! Sessions exist for this day but are switched off. Er zijn wel sessies, maar die staan uit. Impossibly short session Onmogelijk korte sessie Zero hours?? Nul uren??? BRICK :( Arie: Als er niets uit komt is het echt fout Volgens mij zit er een foutje in deze string: dat eerste ( hoort er niet in dacht ik... Oh, dat is een smiley ;-) BAKSTEEN :( Sorry, your machine does not record data. WJG: machine = groter; apparaat gebruikelijker voor dit soort toestellen (zie Van Dale - apparaat, waarbij beademingsapparaat genoemd wordt Sorry, je apparaat bewaart geen gegevens. Complain to your Equipment Provider! Klaag bij je leverancier! Avg Gem. Med Med. Statistics Statistieken Channel Kanaal Min Min. %1% %1% Max Max. <b>Please Note:</b> This day just contains summary data, only limited information is available . <b>Let op:</b> Deze dag heeft alleen overzichtsgegevens; alleen beperkte informatie dus. No data available Geen gegevens beschikbaar Oximeter Information Oxymeterinformatie Int. Pulse Int. polsslag Int. SpO2 Int. SpO2 Session Start Times Starttijden Session End Times Stoptijden Duration Tijdsduur Oximetery Sessions Oxymetrie sessies Position Sensor Sessions Sessies met positie-sensor Unknown Session Onbekende sessie Machine Settings Unavailable Geen apparaat-instellingen beschikbaar Total ramp time Totale aanlooptijd Time outside of ramp Tijd na aanloop AHI excluding ramp AHI buiten de aanloop "Nothing's here!" "Er is hier niets!" Bob is bored with this days lack of data. Bob verveelt zich met deze dag zonder gegevens. Hide all events Verberg alle incidenten Show all events Toon alle incidenten EPR:%1 EPR_LEVEL:%2 EPR: %1 (uit of aan), EPR niveau: %2 SpO2 Desaturations WJG: hoofdletter D? SpO2 desaturaties Pulse Change events AK: Oei! Bedoeld worden plotselinge, kortdurende wijzigingen in de polsslag. Maar hoe maak je dat kort? Polsslag incidenten SpO2 Baseline Used WJG: hoofdletter B? SpO2 basislijn gebruikt Machine Settings Apparaatinstellingen Pr. Relief Drukvermindering Humidifier Bevochtiger Session Information Sessie-informatie SessionID Sessienummer On is een schakelaar, beneuwd of het past... aan/uit Start Start End Einde CPAP Sessions CPAP-sessies Oximetry Sessions Oxymetriesessies Oximeter Oxymeter Sleep Stage Sessions Slaapfasesessies One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. WJG: tikfout Een of meer golfvormgegevens had foutieve brongegevens. Sommige kunnen niet goed aansluiten. PAP Setting Instelling PAP Sorry, your machine only provides compliance data. Sorry, jouw apparaat geeft uitsluitend gegevens over compliantie. Pick a Colour Kies een kleur This bookmarked is in a currently disabled area.. Deze bladwijzer staat in een uitgeschakeld gebied.. Bookmark at %1 Bladwijzer bij %1 Show all graphs Toon alle grafieken No Graphs On! Alle grafieken staan uit! Summary Only :( Alleen overzichtgegevens :( Hide all graphs Verberg alle grafieken ExportCSV Export as CSV Exporteer naar .csv bestand Dates: Periode: Resolution: Resolutie: Details Details Sessions Sessies Daily Dagelijks Filename: Bestandsnaam: Cancel Annuleren Export Exporteren Start: Start: End: Einde: Quick Range: Snelkeuze: Most Recent Day WJG: zie ook bij Daily Meest recente dag Last Week Afgelopen week Last Fortnight Afgelopen twee weken Last Month Afgelopen maand Last 6 Months Afgelopen halfjaar Last Year AK: Bij vorig jaar denk ik nu aan 2012. Bedoeld wordt een jaar voor gisteren.... Dat is toch afgelopen jaar? Afgelopen jaar Everything Alles Custom Zelf kiezen ... ... SleepyHead_ SleepyHead_ Details_ Details_ Sessions_ WJG: Engels is meervoud AK: Wat betekent het streepje erachter? Het zit in de bestandsnaam, het streepje is een spatie Sessies_ Summary_ Overzicht_ Select file to export to Kies exportbestand CSV Files (*.csv) bestandstype CSV bestanden (*.csv) DateTime Datum-Tijd Session Sessie Event Incident Data/Duration Gegevens/duur Date Datum Session Count Aantal sessies Start Start End Einde Total Time Totale tijdsduur AHI AHI Count Aantal Avg gem. %1% %1% FPIconLoader Import Error Importfout This Machine Record cannot be imported in this profile. Deze apparaatgegevens kunnen niet in dit profiel worden geimporteerd. The Day records overlap with already existing content. De gegevens van deze dag overlappen met bestaande gegevens. MainWindow SleepyHead AK: Ik ben van mening dat we de naam niet moeten vertalen SleepyHead &Statistics &Statistieken <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Waarschuwing: </span>Dit is een testversie, delen van dit programma zouden nog niet kunnen werken zoals verwacht.</p></body></html> about:blank about:blank Report Mode Soort rapportage Standard Standaard layout Monthly Maand layout Date Range Tijdspanne &Help Browser AK: Volgens mij brengt dit je naar: "Over SleepyHead". 20/9 WJG: is dat niet gewoon wat er helemaal boven in de menubalk staat,ongeacht waar je in het programma bent? AK: klopt &Over SleepyHead ... ... qrc:/docs/index.html geen idee! &Navigation &Navigatie Statistics Statistieken Daily Dagelijks Overview Overzicht Oximetry Oxymetrie Import Importeren Help Over SleepyHead &Bookmarks AK: Beter B&ladwijzers en &Bestand B&ladwijzers &Records &Erelijst &File WJG: Onderstreepte letter kan geen B zijn, is al gebruikt bij Bladwijzers AK: Dan zou ik het andersom doen: B&ladwijzers &Bestand &View &Weergave &Help &Help &Data &Gegevens &Advanced Ge&avanceerd Ctrl+L &Purge CPAP Data WJG: W is al gebruikt bij Weergave Wis &CPAP gegevens Purge Oximetery Data Wis oxymetrie gegevens Purge ALL CPAP Data Wis ALLE gegevens Rebuild CPAP Data Herstel CPAP gegevens &Import Data Gegevens &importeren Shift+F2 &Preferences WJG: i is al gebruikt bij Gegevens importeren I&nstellingen &Profiles &Profielen Exit Afsluiten O&ximetry Wizard O&xymetrie wizard &Automatic Oximetry Cleanup &Automatisch opschonen van de oxymetrie-gegevens F10 Toggle &Line Cursor Kies &Lijn of Cursor E&xit &Afsluiten View &Daily 20/9 WJG: aangepast na compilatie &Dagweergave F5 View &Overview &Overzichtpagina F6 View &Welcome WJG: Om de al gebruikte W te omzeilen AK: Waar staat dat Welkomst-/Startscherm??? 20/9 WJG: Goeie vraag, waarschijnlijk dateert dat nog uit een oudere versie en heeft Mark dat niet opgeruimd? &Welkomstscherm F4 - Ctrl+Tab Use &AntiAliasing Gebruik &Anti-aliasing &About SleepyHead WJG: O is al gebruikt Over &SleepyHead &Fullscreen Toggle &Volledig scherm aan/uit F11 Show Debug Pane Foutopsporingsvenster &Reset Graph Layout &Reset alle grafieken Check for &Updates Zoek naar &updates Take &Screenshot &Schermopname maken F12 Exp&ort Data Exp&orteer gegevens Daily Calendar Dagkalender F9 Backup &Journal &Dagboek opslaan View O&ximetry O&xymetrievenster F7 Print &Report &Rapport afdrukken &Edit Profile Profiel &aanpassen &Link Graph Groups Grafiekgroepen &koppelen Exp&ort Exp&orteer Online Users &Guide Online &gebruiksaanwijzing &Frequently Asked Questions &FAQ &Rebuild Oximetry Indices Oxymetrie-indexen &herstellen Change &User Ander &profiel Purge &Current Selected Day Wis de &huidige geselecteerde dag Current Days Huidige dagen &Current Selected Day &Geselecteerde dag All data for current CPAP machine Alle gegevens van dit apparaat Right &Sidebar &Rechter zijbalk aan/uit Daily Sidebar Zijbalk dagoverzicht F8 View S&tatistics Bekijk S&tatistiek Navigation Navigatie Records Gegevens View Statistics Bekijk Statistiek Import &Somnopose Data Importeer &SomnoPose gegevens View S&ummary &Statistiekpagina Import &ZEO Data Importeer &ZEO gegevens Import RemStar &MSeries Data Importeer RemStar &M-series gegevens &Support SleepyHead Development &Help bij ontwikkeling SleepyHead Sleep Disorder Terms &Glossary &Woordenlijst slaapaandoeningen Change &Language Wijzig &Taal Change &Data Folder Wijzig &Gegevensmap Loading Data Gegevens laden Datacard Located Datakaart gevonden A %1 datacard structure was detected at %2 Would you like to import from this location? Een %1 datakaart structuur gevonden op %2 Wil je vanaf deze lokatie importeren? Yes Ja Select another folder Selecteer een andere map Please wait, SleepyHead is importing data... Even wachten, SleepyHead importeert gegevens... Importing Data Gegevens importeren RDI RDI AHI AHI No CPAP data available. Geen CPAP-gegevens beschikbaar. %1 day of CPAP Data, on %2. Dag %1 van CPAP-gegevens, op %2. %1 days of CPAP Data, between %2 and %3 %1 dagen met CPAP-gegevens, tussen %2 en %3 Details Details Most Recent Laatste ingelezen dag Last 7 Days WJG: hoeft niet per se een week te zijn? Afgelopen 7 dagen Last 30 Days Afgelopen 30 dagen Last 6 months Afgelopen 6 maanden Last Year AK: Zie mijn eerdere opmerking Afgelopen jaar RERA Index RERA-index Flow Limit Index En wat wordt de afkorting? AK: SBI Stroom Beperking Index (FLI) Hours per Night Uren per nacht Min EPAP Min. EPAP %1% EPAP %1% EPAP Max IPAP Max. IPAP %1% IPAP %1% IPAP Average Pressure Gemiddelde druk %1% Pressure %1% Druk Pressure Druk Average %1 Gemiddelde %1 %1% %2 %1% %2 Oximetry Summary Oxymetrie overzicht %1 day of Oximetry Data, on %2. %1 dag van oxymetriegegevens, op %2 %1 days of Oximetry Data, between %2 and %3 %1 dagen van oxymetrie-gegevens, tussen %2 en %3 Average SpO2 Gemiddelde SpO2 Minimum SpO2 Minimum SpO2 SpO2 Events / Hour Dit zijn echt geen apneus, hoor... SpO2 incidenten per uur % of time in SpO2 Events Tijd in SpO2 incidenten Average Pulse Rate Gemiddelde polsslag Minimum Pulse Rate Minumum polsslag Maximum Pulse Rate Maximum polsslag Pulse Change Events / Hour Het gaat om veranderingen als incident Polsslagincidenten per uur Usage Information Dit staat onder "records" Gebruiksinformatie Total Days Totaal aantal dagen Compliant Days Therapietrouw-dagen Days AHI &gt;5.0 Dagen met AHI &gt 5,0 Best&nbsp;%1 Beste &nbsp;%1 Worst&nbsp;%1 Slechtste &nbsp;%1 CPAP CPAP APAP APAP Bi-Level BiPAP ST/ASV Adaptieve ventilatie-instelling ASI? ST/ASV Best RX Setting Beste Rx instelling Mode Modus Worst RX Setting Slechtste Rx instelling EPAP EPAP IPAPLo IPAP laag IPAPHi IPAP hoog PS Min PS min. PS Max PS max. IPAP IPAP PS PS Min Pres. Min. druk Max Pres. Max. druk First Eerste dag Last Laatste dag Days Dagen FL FL Machine Apparaat Pr. Rel. Drukvermindering %5 %1% EPAP=%2<br/>%3% IPAP=%4 %5 %1% EPAP=%2<br/>%3% IPAP=%4 %3 %1% Pressure=%2 %3 %1% Druk=%2 Brand Merk Model Type Serial Serienummer First Use Eerste gebruik Last Use Laatste gebruik Loading Laden <html><body><div align='center'><h2>SleepyHead v%1.%2.%3-%4 (%8)</h2>Build Date: %5 %6<br/>%7<br/>Data Folder: %9<hr>Copyright &copy;2011 Mark Watkins (jedimark) <br> <a href='http://sleepyhead.sourceforge.net'>http://sleepyhead.sourceforge.net</a> <hr>This software is released under the GNU Public License <br><i>This software comes with absolutely no warranty, either express of implied. It comes with no guarantee of fitness for any particular purpose. No guarantees are made regarding the accuracy of any data this program displays.</div></body></html> WJG: juridische terminologie aangepast. Klopt de Nederlandse downloadsite? AK: De site wijzigt niet, is een algemene verwijzing. De vertaling wordt tzt in het standaard programma opgenomen, als taalkeuze. <html><body><div align='center'><h2>SleepyHead v%1.%2.%3-%4 (%8)</h2>Build Date: %5 %6<br/>%7<br/>Data Folder: %9<hr>Copyright &copy;2011 Mark Watkins (jedimark) <br> <a href='http://sleepyhead.sourceforge.net'>http://sleepyhead.sourceforge.net</a> <hr>Deze software is vrijgegeven onder de GNU Public License <br> <i> Deze software sluit elke vorm van aansprakelijkheid uit, zowel expliciet als impliciet. Het wordt geleverd zonder waarborg voor geschiktheid voor een bepaald doel. Er zijn geen garanties met betrekking tot de juistheid van de gegevens die dit programma toont.</div></body></html> About SleepyHead Over SleepyHead There are no graphs visible to print Geen zichtbare grafieken om af te drukken Bookmarks Bladwijzers Would you like to show bookmarked areas in this report? Wil je gebieden met bladwijzer in dit rapport tonen? This make take some time to complete.. Please don't touch anything until it's done. Dit kan even duren... Alsjeblieft niets aanraken tot ik klaar ben! Printing %1 Report Rapport %1 afdrukken %1 Report %1 Rapport Name: %1, %2 Naam: %1, %2 DOB: %1 Geboortedatum: %1 Patient ID: %1 Patientnr.: %1 Phone: %1 Telefoon: %1 Email: %1 E-mail: %1 Address: %1 Adres: %1 Mask Time: Maskertijd: Bedtime: Gaan slapen: Wake-up: Opgestaan: Machine: Apparaaat: Mode: Modus: ASV Adaptieve ventilatie-instelling ASI? ASV Unknown Onbekend RDI %1 RDI %1 AHI %1 AHI %1 AI=%1 HI=%2 CAI=%3 AI=%1 HI=%2 CAI=%3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% UAI=%1 UAI=%1 NRI=%1 LKI=%2 EPI=%3 NRI=%1 LKI=%2 EPI=%3 Weight %1 Gewicht %1 BMI %1 BMI %1 Zombie %1/10 Zombie %1/10 Reporting from %1 to %2 Rapport van %1 tot %2 Reporting data goes here De rapportgegevens komen hier Entire Day's Flow Waveform Flow golfvorm hele dag SleepyHead v%1 - http://sleepyhead.sourceforge.net SleepyHead v%1 - http://sleepyhead.sourceforge.net Page %1 of %2 Pagina %1 van %2 Profile Profiel Welcome Welkom &About &Over Loading... Laden... When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. <b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes. <b>Waarschuwing</b> De rapporten die dit programma maakt zijn niet bruikbaar voor compliantie of medische diagnose. Imported %1 CPAP session(s) from %2 %1 Sessies geimporteerd van %2 Import Success Import gelukt Already up to date with CPAP data at %1 Al bijgewerkt met gegevens van %1 Up to date Reeds bijgewerkt Couldn't find any valid Machine Data at %1 Kon geen geldige gegevens vinden op %1 Access to Import has been blocked while recalculations are in progress. Tijdens een herberekening kan niet geïmporteerd worden. Import from where? Waar vandaan importeren? Do you just want to Import from the usual (remembered) locations? Wil je van de gebruikelijke (opgeslagen) lokatie importeren? The Usual Gebruikelijk New Location Nieuw Cancel Annuleren Remember this Location? Deze lokatie bewaren? Would you like to remember this import location for next time? Wil je deze lokatie bewaren voor de volgende keer? Data successfully imported from the following locations Gegevens succesvol geïmporteerd vanaf Import Problem Couldn't find any new Machine Data at the locations given Probleem: Kon geen nieuwe gegevens op de bekende lokaties vinden Please wait, scanning for CPAP data cards... Even wachten, zoeken naar SD kaart met CPAP gegevens... Data successfully imported from the following locations: Gegevens succesvol geimporteerd van: Couldn't find any new Machine Data at the locations given. Kon geen nieuwe gegevens op deze locatie vinden. Import Problem Import probleem Click here to choose a folder Klik hier om een folder te kiezen CPAP Data Located CPAP gegevens gevonden CPAP Datacard structures were detected at the following locations: CPAP gegevens-structuur gevonden op de volgende lokaties: Would you like to import from the path(s) shown above? Wil je van bovenstaande lokatie gegevens downloaden? Please wait, launching file dialog... Even wachten, gegevens dialoog starten... No CPAP data card detected, launching file dialog... Geen CPAP gegevens gevonden, dialoog starten... Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. LET OP: kies de hoofdmap of een drive letter, niet een submap. Import Reminder Import herinnering Welcome to SleepyHead Welkom bij SleepyHead This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. Deze software is gemaakt om u te helpen bij het beoordelen van de gegevens van een CPAP, die wordt gebruikt bij de behandeling van verschillende slaapstoornissen. SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. SleepyHead is ontworpen door een softwareontwikkelaar met persoonlijke ervaring van een slaapstoornis en gevormd door de feedback van vele andere welwillende testers die omgaan met vergelijkbare omstandigheden. This is a beta release, some features may not yet behave as expected. Dit is een bètaversie, mogelijk dat bepaalde functies zich nog niet gedragen als verwacht. Please report any bugs you find to SleepyHead's SourceForge page. Geef alle bugs die je vindt op bij de SourceForge pagina van SleepyHead. Currenly supported machines: Momenteel ondersteunde apparaten: Philips Respironics System One (CPAP, Auto, BiPAP & ASV models) Philips Respironics System One (CPAP, AutoPAP, BiPAP & ASV modellen) ResMed S9 models (CPAP, Auto, VPAP) ResMed S9 modellen (CPAP, AutoPAP, VPAP) DeVilbiss Intellipap (Auto) DeVilbiss Intellipap (Auto) Fisher & Paykel ICON (CPAP, Auto) Fisher & Paykel ICON (CPAP, AutoPAP) Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters Contec CMS50D+, CMS50E en CMS50F (niet de 50FW) Oxymeters ResMed S9 Oximeter Attachment ResMed S9 Oxymeter adapter Online Help Resources Online hulpbronnen Note: Let op: I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. Deze ingebouwde webbrowser is niet geschikt op uitgebreid te surfen, het werkt maar is vooral bedoeld als help browser. (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) (Ondersteunt geen SSL-encryptie, dus het is geen goed idee om uw wachtwoorden of persoonlijke gegevens ergens te typen.) SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> De website van het <a href='http://www.sourceforge.net/projects/sleepyhead'> SleepyHead Project</a> op de site van SourceForge<br/> Got a neat idea on how to improve SleepyHead? Check out SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent</a> Heb je een leuk idee om SleepyHead te verbeteren? Ga naar SleepyHead's <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent (in het Engels). Further Information Verdere informatie Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. Hier staan de <a href='qrc:/docs/release_notes.html'>release notes</a> voor deze versie. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. Plus een paar <a href='qrc:/docs/usage.html'>gebruiks-aantekeningen</a>, en belangrijke informatie voor Mac gebruikers. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia Informatie over <a href='http://nl.wikipedia.org/wiki/Slaapapneu'>Slaapapneu</a> op de Nederlandse Wikipedia Friendly forums to talk and learn about Sleep Apnea: Vriendelijke forums om te praten en leren over slaapapneu: <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, <a href='http://www.apneuvereniging.nl/forum'>het forum van de ApneuVereniging</a>, <a href='http://www.cpaptalk.com'>het CPAPTalk Forum</a> en <a href='http://s7.zetaboards.com/Apnea_Board/index'>Apnea Board</a> <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, Copyright: Auteursrecht: &copy;2011-2014 License: Licentie: This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. De software wordt vrijgegeven onder de <a href="qrc:/COPYING">GNU Public License</a>. DISCLAIMER: AANSPRAKELIJKHEID: This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. Dit is GEEN MEDISCHE SOFTWARE, maar meer een onderzoeksgereedschap voor de visuele interpretatie van gegevens uit ondersteunde apparatuur.Deze software is NIET TOEPASBAAR voor medische diagnose, CPAP compliantie rapportage of vergelijkbare doelen. The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. De auteur en al zijn collega's accepteren GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software. Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. Uw arts is altijd de eerste en beste bron van hulp voor het belangrijke onderwerp van uw gezondheid. *** <u>Use at your own risk</u> *** *** <u>Het gebruik van deze software is geheel voor eigen risico</u> *** Revision: Revisie: branch Tak Data Folder Location: <a href="file://%1">%2</a> Gegevensmap: <a href="file://%1">%2</a> James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Een speciaal woord van dank voor Pugsy en RobySue van <a href='http://cpaptalk.com'>CPAPTalk</a> voor hun hulp bij de documentatie en handleidingen, en voor iedereen die heeft meegewerkt door te testen en hun CPAP gegevens met elkaar te delen. Are you sure you want to rebuild all CPAP data for the following machine: Weet je zeker dat je alle CPAP gegevens voor het volgende apparaat wilt herstellen: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. Houd er rekening mee, dat dit kan leiden tot verlies van grafische gegevens indien de interne back-ups van SleepyHead op enige manier zijn uitgeschakeld of verstoord. For some reason, SleepyHead does not have internal backups for the following machine: Om een ​​of andere reden heeft SleepyHead geen interne back-ups voor de volgende machine: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Mits je <i>je<b> zelf </b> backups gemaakt hebt van AL JE CPAP gegevens </i>, kun je dit nog steeds afronden, maar je zal deze back-ups handmatig moeten terugzetten. Are you really sure you want to do this? Weet je echt zeker dat je dit wilt? You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: Je staat op het punt om alle gegevens te <font size=+2>vernietigen</font> van het volgende apparaat: Note as a precaution, the backup folder will be left in place. Ter geruststelling: de backup map blijft intakt. Are you <b>absolutely sure</b> you want to proceed? Weet je <b>absoluut zeker</b> dat je wilt doorgaan? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: Het samenstellen is mislukt, je moet zelf de volgende map wissen: %1's Journal %1's dagboek Choose where to save journal Kies waar het dagboek moet worden opgeslagen XML Files (*.xml) XML bestanden (*.xml) Because there are no internal backups to rebuild from, you will have to restore from your own. Aangezien er geen interne backups zijn om uit te herstellen, moet je dat uit je eigen backups doen. <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. <b>Waarschuwing:</b> Dit is een voorpublicatie van het programma, het zal zich soms onstabiel gedragen. Het is bedoeld om te testen. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Als je grafiek- of gegevensfouten tegenkomt na installatie van een nieuwe versie, probeer dan de CPAP database opnieuw op te bouwen uit het gegevensmenu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Zorg dat je steeds backups maakt van de map SleepyHeadData zolang je werkt met testversies. Please ensure you are running the latest version before reporting any bugs. Probeer eerst de nieuwste versie voordat je fouten rapporteert. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Er wordt verwacht dat je een .zip bestand van je CPAP gegevens of een crash report instuurt als je fouten rapporteert. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! Denk twee keer na voordat je een foutrapport instuurt. Zoek ALSJEBLIEFT eerst, want waarschijnlijk ben je niet de eerste die het heeft gemerkt! This red message line is intentional, and will not be a feature in the final version... Would you like to import from your own backups now? (you will have no data visible for this machine until you do) Wil je nu importeren vanuit je eigen back-ups? (je hebt geen zichtbare gegevens voor dit apparaat totdat je dit doet) Are you sure you want to delete oximetry data for %1 Weet je zeker dat je de oxymetrie-gegevens van %1 wilt wissen <b>Please be aware you can not undo this operation!</b> <b>Dit kan niet ongedaan worden gemaakt!</b> Select the day with valid oximetry data in daily view first. Selecteer eerst de dag met geldige oxymetrie-gegevens in het dagoverzicht. Build Date Versiedatum Data Folder Location Locatie folder SleepyHeadData Copyright Copyright This software is released under the GNU Public License v3.0<br/> De software wordt vrijgegeven onder de GNU Public License v3.0<br/> SleepyHead Project Page SleepyHead Project pagina SleepyHead Wiki SleepyHead Wiki Are you sure you want to purge all CPAP data for the following machine: Weet je zeker dat je alle CPAP gegevens van het volgende apparaat wilt wissen: James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, and Sean Stangl. James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, en Sean Stangl. Are you sure you want to purge all CPAP data for the following machine: Weet je zeker dat je alle CPAP gegevens wilt wissen voor het volgende apparaat: Not all session data could be removed, you have to delete the following folder manually. Niet alle sessiegegevens konden worden gewist. Je moet zelf de volgende map wissen. Machine data has been successfully purged. Alle gegevens zijn succesvol gewist. Would you like to reimport from the backup folder? Wil je uit de backup-map opnieuw importeren? Please wait, importing... Even wachten, importeren... There was a problem opening Somnopose Data File: Er was een probleem met het openen van het SomnoPose gegevensbestand: Somnopause Data Import complete Import van SomnoPose gegevens voltooid Authors Twitter Feed Twitter-feed van de auteur <p>The author wishes to express thanks to James Marshall and Rich Freeman for their assistance with this project.</p> <p>De auteur wil James Marshall en Rich Freeman bedanken voor hun hulp bij dit project</p> This software comes with absolutely no warranty, either express of implied. Deze software sluit elke vorm van aansprakelijkheid uit, zowel expliciet als impliciet. It comes with no guarantee of fitness for any particular purpose. Het wordt geleverd zonder waarborg voor geschiktheid voor een bepaald doel. No guarantees are made regarding the accuracy of any data this program displays. Er zijn geen garanties met betrekking tot de juistheid van de gegevens die dit programma toont. This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. Dit is GEEN MEDISCHE SOFTWARE, maar meer een onderzoeksgereedschap voor de visuele interpretatie van gegevens uit ondersteunde apparatuur. This software is NOT suitable for medical diagnosis, CPAP complaince reporting and other similar purposes. Deze software is NIET TOEPASBAAR voor medische diagnose, CPAP compliantie rapportage of vergelijkbare doelen. The author and any associates of his accept NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. De auteur en al zijn collegas accepteren GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software. Use this software entirely at your own risk. Het gebruik van deze software is geheel voor eigen risico. If you find this free software to be of use, please consider supporting the development efforts by making a paypal donation to the Author Wanneer u dit programma de moeite waard vindt, steun dan de ontwikkeling met een PayPal donatie aan de auteur Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ Vergeet niet om SleepyHead op <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> of <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</a> een like of +1 te geven SleepyHead, brought to you by Jedimark SleepyHead, een product van JediMark Kudos & Credits Lof en dank Bugfixes, Patches and Platform Help: Opgeloste programmafouten, aanpassingen en hulp bij de ontwikkeling: Translators: Vertalers: Arie Klerk (Dutch), Steffen Reitz (German). Arie Klerk (Nederlands), Steffen Reitz (Deutsch). 3rd Party Libaries: Externe programmabibliotheken: SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. SleepyHead wordt gebouwd met het <a href="http://qt-project.org">Qt toepassingsraamwerk</a>. It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module. Het maakt gebruik van de universele <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> bibliotheek voor toegang tot de seriele poort in the oxymetrie module. In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. Voor de automatische update maakt SleepyHead gebruik van <a href="http://sourceforge.net/projects/quazip">QuaZip</a> door Sergey A. Tachenov, het is een C++ verpakking van Gilles Vollant's ZIP/UNZIP pakket. Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Een speciaal woord van dank voor Pugsy van <a href='http://cpaptalk.com'>CPAPTalk</a> voor haar hulp bij de documentatie en handleidingen, en voor iedereen die heeft meegewerkt door hun CPAP gegevens te testen en delen met elkaar. Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. Bedankt voor het gebruik van Sleepyhead. Als je het goed kunt gebruiken, dan kun je overwegen de toekomstige ontwikkeling te steunen door middel van een donatie via Paypal. This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. Deze software is NIET TOEPASBAAR voor medische diagnose, CPAP compliantie rapportage of vergelijkbare doelen. The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. De auteur en al zijn collegas accepteren GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software. Access to Preferences has been blocked until recalculation completes. Toegang tot de instellingen is geblokkeerd gedurende herberekening. Question Vraag CPAP data was recently purged and needs to be re-imported. De CPAP gegevens zijn recent gewist en moeten opnieuw worden geïmporteerd. Would you like this done automatically from the Backup Folder? Wil je dit automatisch laten doen vanuit de backup map? Please wait, importing from backup folder(s)... Even wachten, importeren vanuit de backup-map(pen)... Please insert your CPAP data card... Plaats je cpap gegevenskaart... Choose a folder Kies een gegevensmap A %1 file structure for a %2 was located at: Een %1 bestandsstructuur voor een %2 is gevonden op: A %1 file structure was located at: Een %1 bestandsstructuur is gevonden op: Would you like to import from this location? Wil je vanaf deze lokatie importeren? Specify Specificeren Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) Philips Respironics System One (CPAP Pro, AutoPAP, BiPAP en ASV modellen) SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> Gebruiksaanwijzing van SleepyHead op het net: <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">(nog in het Engels)</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Termen en begrippen</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> <a href='http://www.apneuvereniging.nl'>ApneuVereniging</a> Build Date: %1 %2 Versie datum: %1 %2 Graphics Engine: %1 Grafische kaart: %1 Data Folder Location: %1 Gegevens map: %1 Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here. Arie Klerk (Nederlands), Steffen Reitz (Duits), Chen Hao (Chinees), Lars-Erik Söderström (Zweeds), Damien Vigneron (Frans) en anderen die nog moeten worden toegevoegd. Do you have a CMS50[x] Oximeter? One is required to use this section. Heeft u een CMS50[x] oxymeter? Die is vereist voor gebruik van deze sectie. There was an error saving screenshot to file "%1" Er is iets fout gegaan bij het opslaan van een beeldschermafdruk naar het bestand "%1" Screenshot saved to file "%1" Schermafbeelding bewaard als bestand "%1" Printing Disabled Afdrukken is uitgeschakeld Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt Gah! Bah! If you can read this, the restart command didn't work. Your going to have to do it yourself manually. Als je dit kunt lezen, heeft het herstartcommando niet gewerkt. Je zult het handmatig moeten doen. Are you sure? Weet je het zeker? Are you sure you want to purge all CPAP data for the following machine: Weet je zeker dat je alle CPAP-gegevens wilt wissen van het volgende apparaat: Performance will be degraded during these recalculations. Tijdens herberekening gaan de prestaties van de PC achteruit. Recalculating Indices Herberekening van de indexen Loading Event Data Incident gegevens laden Recalculating Summaries Overzichten opnieuw berekenen Restart Required Herstart vereist Recalculations are complete, the application now needs to restart to display the changes. Herberekening voltooid, de applicatie moet nu herstarten om de wijzigingen zichtbaar te maken. Recalculations are now complete. Herberekening voltooid. Task Completed Taak voltooid There was a problem opening ZEO File: Er was een probleem met het openen van het ZEO gegevensbestand: Zeo CSV Import complete Import van het ZEO .csv bestand voltooid There was a problem opening MSeries block File: Er was een probleem bij het openen van het M-Series blokbestand: MSeries Import complete Import M-Series voltooid MinMaxWidget Auto-Fit Automatisch Defaults Standaard Override Instellen The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. Instelling y-as: 'Automatisch' om alles te zien, 'Standaard' voor fabrieksinstelling en 'Instellen' om zelf te kiezen. The Minimum Y-Axis value.. Note this can be a negative number if you wish. De minimale waarde. Dit mag negatief zijn als je wilt. The Maximum Y-Axis value.. Must be greater than Minimum to work. De maximale waarde. Deze moet groter zijn dan de minimale waarde. Scaling Mode Schaalinstelling This button resets the Min and Max to match the Auto-Fit Deze knop reset de min en max waarden naar Automatisch NewProfile Edit User Profile Gebruikersprofiel aanpassen Language Taal English English Data Folder Bestandsmap Shows the directory where SleepyHead data will be stored. De gegevens van SleepyHead worden in deze map opgeslagen. Click here to choose where to store SleepyHead data. Dit is een hulptekst, mag lang zijn. 20/9 WJG: op zich met de redenatie eens, al ben ik er ook voor om hulpteksten zo compact en duidelijk mogelijk te houden. Kies hier waar SleepyHead gegevens opslaat. ... ... <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:italic;">Welcome to SleepyHead</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This software is being designed to help you review data related to your CPAP treatment.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It's intended as merely a data viewer, and not a substitute for competent medical guidance from your Doctor. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This software has been released freely under the <a href="qrc:/LICENSE.txt"><span style=" text-decoration: underline; color:#0000ff;">GNU Public License</span></a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accuracy of any data displayed is not and can not be guaranteed. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Any reports generated are for PERSONAL USE ONLY, and not fit for compliance purposes.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The author will not be held liable for <span style=" text-decoration: underline;">anything</span> related to the use or misuse of this software. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use at your own risk. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This software is copyright ©2011 Mark Watkins </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:italic;">Welkom bij SleepyHead</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dit programma is ontworpen als hulp bij het beoordelen van de gegevens over je CPAP behandeling.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het is voornamelijk bedoeld om gegevens te bekijken en absoluut geen vervanging van de medische begeleiding door je arts. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze software is vrijelijk uitgegeven onder de <a href="qrc:/LICENSE.txt"><span style=" text-decoration: underline; color:#0000ff;">GNU Public License</span></a>, en wordt geleverd zonder garantie en zonder enige aanspraak op geschiktheid voor welk doel dan ook.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De juistheid van alle weergegeven gegevens is niet en kan niet worden gegarandeerd. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Ieder gegenereerd rapport is voor EIGEN GEBRUIK en is niet geschikt om de naleving te beoordelen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De auteur kan niet verantwoordelijk worden gehouden voor <span style=" text-decoration: underline;">alles</span> dat is gerelateerd aan het gebruik of misbruik van deze programmatuur. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Gebruik op eigen risico. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Auteursrecht software ©2011 Mark Watkins </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> qrc:/docs/intro.html qrc:/docs/intro.html I agree to all the conditions above. Ik ga akkoord met alle bovengenoemde voorwaarden. User Information Gebruikersinformatie User Name Naam gebruiker Keep the kids out.. Nothing more.. This isn't meant to be uber security. WJG: Mooi gevonden! Hou de kinderen erbuiten... niets meer of minder... Dit is GEEN ECHTE BEVEILIGING. Password Protect Profile Wachtwoordbeveiliging van het profiel Password Wachtwoord ...twice... ... nog eens ... Locale Settings Landinstellingen Country Land TimeZone Tijdzone about:blank about:blank DST Zone Automatische zomertijd Personal Information (for reports) Persoonlijke informatie (voor rapporten) First Name Voornaam Last Name Achternaam D.O.B. Geboortedatum Gender Geslacht Male Man Female Vrouw Height Lengte metric metrisch archiac WJG: is grapje van de maker AK: Ik heb het nu ook door! archaïsch Contact Information Contactinformatie Address Adres Email E-mail Phone Telefoon CPAP Treatment Information Informatie over de behandeling Date Diagnosed Datum diagnose Untreated AHI Onbehandelde AHI CPAP Mode WJG: klopt dit wel, want Bi-level en APAP zijn in feite geen CPAP-soorten, toch? Ik geef maar wat alternatieven, ook spreekt het wel voor zich en zou je ook 'Soort CPAP' kunnen laten staan. 20/9 WJG: Soort apparaat lijkt me prima! Soort apparaat CPAP CPAP APAP APAP Bi-Level Bi-level ASV Adaptieve ventilatie-instelling ASI? ASV RX Pressure Voorgeschreven druk Doctors / Clinic Information Specialist/ziekenhuis Doctors Name Specialist Practice Name WJG: zou dit niet bedoeld worden? Bij het adres wordt wel duidelijk welk ziekenhuis het is. Bij mij is de behandeling bij 'Longziekten', misschien heet dat bij een ander ziekenhuis anders? Afdeling Patient ID Patient-ID SleepyHead SleepyHead TextLabel Tekstlabel &Cancel &Annuleren &Back &Terug &Next &Volgende Select Country Kies land Welcome to SleepyHead Welkom bij SleepyHead This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. Deze software is ontworpen om je te helpen bij het analyseren van de gegevens van je CPAP. SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. SleepyHead is vrij vrijgegeven onder de <a href='qrc:/COPYING'> GNU Public License </ a>, en wordt geleverd zonder garantie en zonder enige aanspraak op geschiktheid voor enig doel. PLEASE READ CAREFULLY GRAAG AANDACHTIG LEZEN SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. SleepyHead is voornamelijk bedoeld om gegevens te bekijken en absoluut geen vervanging voor de medische begeleiding door uw arts. Accuracy of any data displayed is not and can not be guaranteed. De betrouwbaarheid van de weergegeven gegevens wordt en kan nooit worden gegarandeerd. Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. Alle rapportages zijn voor EIGEN GEBRUIK en kunnen ONDER GEEN VOORWAARDE worden toegepast voor medische diagnostiek. The author will not be held liable for <u>anything</u> related to the use or misuse of this software. De auteur accepteert GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software. Use of this software is entirely at your own risk. Het gebruik van deze software is geheel voor eigen risico. SleepyHead is copyright &copy;2011-2014 Mark Watkins Het auteursrecht van SleepyHead &copy;2011-2014 berust bij Mark Watkins Please provide a username for this profile Geef een gebruikersnaam voor dit profiel Empty Username Geen gebruikernaam Passwords don't match Wachtwoorden komen niet overeen Profile Changes Profielwijzigingen Accept and save this information? Opslaan? &Finish &Einde &Close this window &Sluit dit venster Overview Form Formulier Range: Bereik: Last Week Afgelopen week Last Two Weeks Afgelopen twee weken Last Month Afgelopen maand Last Two Months Afgelopen twee maanden Last Three Months Afgelopen drie maanden Last 6 Months Afgelopen halfjaar Last Year Afgelopen jaar Everything Alles Custom Zelf kiezen Start: Start: End: Einde: Reset view to selected date range WJG: is wat preciezer, als het past Herstel naar geselecteerd datumbereik ... ... Toggle Graph Visibility Grafieken aan/uit Drop down to see list of graphs to switch on/off. Lijst met grafieken om aan/uit te zetten. Graphs Grafieken RDI RDI AHI AHI Apnea Hypopnea Index Apneu Hypopneu Index Usage Gebruik Usage (hours) Gebruik (uren) Flow Limit Stroombeperking Session Times Sessietijden Session Times (hours) Sessietijden (uren) Pressure (cmH2O) Druk (cmWK) Settings Instellingen Leaks Maskerlek Unintentional Leaks (L/min) Maskerlek (l/min) Total Leaks Totale lek Total Leaks (L/min) Totale lek (l/min) Respiratory Disturbance Index Ademhalings Stoornis Index (RDI) % in PB WJG: moet dat niet 'periodieke ademhaling zijn, zie volgende item AK: Discussie % in PB Periodic Breathing (% of night) WJG: wat wordt er eigenlijk precies mee bedoeld? Gaat het hier om de reguliere/normale ademhaling, d.w.z. zonder ademstops? Dan zou je 'periodiek beter door 'Reguliere' of 'Normale' kunnen vervangen. AK: Het is een oscillerende ademhaling, mss is "Cyclische" beter? 20/9: Dat zou dan beter zijn. Cyclische ademhaling (PB) (% van de nacht) % in %1 % in %1 %1 (% of night) %1 (% van de nacht) Large Leaks (% of night) Groot lek (% van de nacht) Peak RDI AK: Deze niet vertalen? Respiratory Disturbance Index... Piek RDI Peak RDI Shows RDI Clusters (RDI/hr) WJG: zo'n spellingsdingetje met streepjes en al dan niet aan elkaar schrijven. AK: Deze niet vertalen? Respiratory Disturbance Index... 20/9 WJG: Als dat gangbaar is om het onvertaald te gebruiken, dan inderdaad laten. Piek RDI, maakt RDI-clusters zichtbaar (RDI/uur) Peak AHI Piek-AHI Peak AHI Shows AHI Clusters (AHI/hr) Piek-AHI, maakt AHI-clusters zichtbaar (AHI/uur) (count) (aantal) Resp. Rate WJG: afgebroken vanwege beschikbare ruimte Ademtempo Respiratory Rate (breaths/min) WJG: afbreeksreepje Ademtempo (per minuut) Tidal Volume Teugvolume Tidal Volume (ml) WJG: maar misschien past het ook wel zonder afbreking AK: Ik zie het nergens... 20/9 WJG: Als je met je cursor over de grafiek Tidal Vulume beweegt en op de grafiektitel gaat staan, zie je een geel hulptekstje verschijnen (is bij al die grafieken het geval). De breedte van die gele balonnetjes past zich aan de tekst aan - tot op zekere hoogte. Teugvolume (ml) Minute Vent. WJG: ik weet niet precies wat er getoond wordt, ik ken de waarden niet, maar 'minuutventitlatie' lijkt me niet goed. 'Minute' kan in het Engels ook 'zeer klein, miniem' betekenen, misschien moet het eerder in die richting gezocht worden, in plaats van met tijdeenheden? AK: Nee, het is The average minute ventilation (tidal volume x rate). Staat in: Instellingen-Grafieken Minuutventilatie Minute Ventilation (L/min) WJG: zie vorige Minuutventilatie (l/min) Target Vent. WJG: zit een beetje met het woord 'ventialtie'. Kan ook 'verversing' zijn. Mijn kennis van het lezen van deze grafiek schiet me hier echter te kort. AK: Ik zie het nergens staan... 20/9 WJG: Is de een na onderste keuze in het dropdown menuutje rechtsonder Doelventilatie Target Ventilation (L/min) WJG: zie vorige Doelventilatie (l/min) Pat. Trig. Br. Staat in: Instellingen-Grafieken Pat. geact. teugen Patient Triggered Breaths (%) WJG: als dit past is dit 'meer' Nederlands Patient geactiveerde ademhaling (PTB) (%) Sessions Sessies Sessions (count) Sessies (aantal) Pulse Rate Polsslag Pulse Rate (bpm) Polsslag (per minuut) Oxygen Saturation (%) Zuurstofsaturatie (%) SensAwake (count) SensAwake (aantal) Body Mass Index Body Mass Index (BMI) Zombie Zombie How you felt (0-10) Hoe je je voelde (0-10) Events/Hr Incidenten/uur Zombie Meter Zombie-meter FL FL breaths/min teugen/min L/b l/teug L/m l/min %PTB WJG: patiënt-geactiveerde teugen? Of betekent PTB hier iets anders dan patient triggered breaths AK: Ik zie het nergens... Even afwachten % PTB % PB WJG: ? zie vorige AK: Cyclische ademhaling kan niet: CA is al Centrale Apneu... % Cyclische ademhaling (PB) % %1 % %1 Show all graphs Alle grafieken zichtbaar No Graphs On! Grafieken staan uit! Hide all graphs Verberg alle grafieken OximeterImport Dialog Dialoog Oximeter Import Wizard Oxymeter import wizard <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> Skip this page next time. Sla deze pagina volgende keer over. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> <html><head/><body><p>SleepyHead ondersteunt de Contec CMS50D+/E/F serie van oxymeters volledig, <br/>net zoals gegevensbestanden van de ChoiceMMed MD300W1 oxymeters'</p></body></html> Where would you like to import from? Waar wilt u vandaan importeren? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> <html><head/><body><p>Deze optie geeft de mogelijkheid om de gegevens uit je oxymeter (via een kabel) te importeren.</p><p>Na kiezen van deze optie, moet bij sommige oxymeters de upload gestart worden.</p></body></html> Directly from a recording on a device Direct van af de oxymeter <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> <html><head/><body><p>Als je er geen probleem mee hebt om de hele nacht aan de computer te hangen, geeft deze optie de mogelijkheid van een live "plethysomogram"-grafiek, met indicatie van het hartritme en natuurlijk de normale zuurstofsaturatiegrafiek.</p></body></html> Record attached to computer overnight (provides plethysomogram) Opname direct naar de computer (geeft plethysomogram) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> <html><head/><body><p>Deze optie laat gegevensbestanden importeren, die door het programma van de oxymeter zijn gemaakt, zoals SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review Importeren van gegevensbestanden van een ander programma, zoals SpO2Review <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Herinnering voor CPAP gebruikers: </span><span style=" color:#fb0000;">Heb je eraan gedacht om eerst je CPAP sessies te importeren?</span></p><p>Als je dat vergeet, heb je geen geldige tijd om de oxymetrie-sessie mee te synchroniseren.<br/><br/>Om een goede synchronisatie te krijgen moet je altijd de twee apparaten tegelijk starten.</p></body></html> Please connect your oximeter device Sluit je oxymeter aan Press Start to commence recording Druk op Start om de opname te beginnen Show Live Graphs Live grafieken laten zien Duration Tijdsduur SpO2 % SpO2 % Pulse Rate Polsslag Multiple Sessions Detected Meerdere sessies gevonden Please choose which one you want to import into SleepyHead Kies welke je wilt importeren Start Time Starttijd Import Time Import tijd Details Details Import Completed. When did the recording start? Import gelukt. Wanneer is de opname gestart? Day recording (normally would of) started De dag waarop de opname (normaal gesproken) gestart is Oximeter Starting time Oxymeter starttijd I want to use the time reported by my oximeter's built in clock. Ik wil de tijd van de klok van de oxymeter gebruiken. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. Ik startte de oxymeter (ongeveer) tegelijk met de CPAP. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>SleepyHead heeft een starttijd nodig om de sessie op te kunnen slaan.</p><p>Kies een van de volgende opties:</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> <html><head/><body><p>Let op: Beide apparaten tegelijk starten is altijd nauwkeuriger.</p></body></html> Choose CPAP session to sync to: Kies de CPAP-sessie waarmee moet worden gesynchroniseerd: ... ... You can manually adjust the time here if required: Je kunt hier eventueel de tijd zelf aanpassen: HH:mm:ssap uu:mm:ss AP &Cancel &Annuleren &Information Page &Informatiepagina &Retry &Opnieuw &Choose Session &Kies sessie &End Recording &Einde opname &Sync and Save &Sync en sla op &Save and Finish &Opslaan en afsluiten &Start &Start Scanning for compatible oximeters Zoeken naar een compatibele oxymeter Could not detect any connected oximeter devices. Kon geen enkele oxymeter vinden. Connecting to %1 Oximeter Verbinden met de oxymeter %1 "%1", session %2 "%1", sessie %2 Waiting for %1 to start Wacht op starten van %1 Waiting for the device to start the upload process... Wacht tot het apparaat gaat verzenden... Select upload option on %1 Kies 'upload' op de %1 Waiting for you to start the upload process... Wachten tot 'upload' start... %1 device is uploading data... Oxymeter %1 stuurt gegevens... Please wait until oximeter upload process completes. Do not unplug your oximeter. Even wachten tot de gegevensoverdracht klaar is. Houd de oxymeter aangesloten. Oximeter import completed.. Import geslaagd.. Select a valid oximetry data file Kies een geldig gegevensbestand Oximetry Files (*.spo *.spor *.dat) Oxymetrie bestanden: *.spo, *.spor, *.dat Oximetry Files (*.spo *.spor *.spo2 *.dat) Oxymetrie bestanden (*.spo, *.spor, *.spo2 *.dat) No Oximetery module could parse the given file: Er was geen oxymeter die het opgegeven bestand kon lezen: Oximeter not detected Geen oxymeter gedetecteerd Couldn't access oximeter Kon geen oxymeter benaderen Live Oximetery Mode Directe oxymetrie-aansluiting Starting up... Opstarten... If you can still read this after a few seconds, cancel and try again Als je dit na enkele seconden nog ziet, druk dan op 'cancel' en probeer het opnieuw Live Import Stopped Directe import beeindigd Live Oximetery Stopped Directe oxymetrie gestopt Live Oximetery import has been stopped Directe oxymetrie-import is beeindigd %1 session(s) on %2, starting at %3 %1 sessie(s) op %2, beginnend met %3 No CPAP data available on %1 Geen CPAP gegevens beschikbaar op %1 %1 %1 Recording... Opnemen... Finger not detected Geen vinger gedetecteerd I want to use the time my computer recorded for this live oximetry session. Ik wil de tijd van mijn computer gebruiken voor deze directe oxymetrie-sessie. I need to set the time manually, because my oximeter doesn't have an internal clock. Ik moet de tijd zelf instellen, want mijn oxymeter heeft geen klok. Something went wrong getting session data Er ging iets fout bij het ophalen van sessie-gegevens CMS50 Session %1 CMS50 sessie %1 Oximetry Form Formulier Date Datum d/MM/yy h:mm:ss AP dd/MM/jj uu:mm:ss AP R&eset R&eset SpO2 SpO2 Pulse Pols ... ... &Open .spo/R File &Open SpO/R gegevensbestand Serial &Import Seriële &import &Start Live &Start live Serial Port Seriële poort &Rescan Ports &Herscan poorten Control WJG: Ik heb geen oxymeter, kan in SleepyHead niet kijken wat hier bedoeld wordt. 'Control' kan verschillende betekenissen hebben: beheren en checken (contoleren) Control No Oximetry Data Geen oxymetriegegevens Connect Oximeter Sluit oxymeter aan Please connect oximeter device Sluit aub de oxymeter aan Device Connected Oxymeter aangesloten Please make sure Oximeter device is in upload mode. Zet de oxymeter op UPLOAD Oximetry live recording has been terminated due to timeout. Oxymetrie live-opname is beëindigd vanwege time-out. &Start &Start Current oximetry session still has unsaved data in it. Er zijn nog niet opgeslagen oxymetrie-gegevens. Would you like to save it first? Wil je die eerst opslaan? Save Session? Sessie opslaan? Creating a new oximetry session will destroy the old one. Would you like to save it first? Een nieuwe oxymetriesessie zal de oude wissen. Wilt u de oude eerst opslaan? Save Opslaan Destroy It Wissen! Cancel Annuleren Please Wait Even geduld Oximetry Error! Something is wrong with the device connection. Oxymetrie fout! Er ging iets fout bij de aansluiting. &Stop &Stop Oximeter Error The device has not responded.. Make sure it's switched on. Oxymetrie fout! Het apparaat reageerde niet... staat het wel aan? Keep This Recording? Deze gegevens bewaren? Would you like to save this oximetery session? Wil je deze oxymetie sessie bewaren? Opening this oximetry file will destroy the current session. Would you like to keep it? De huidige sessie gaat verloren als je dit bestand opent. Wil je hem bewaren? Select an oximetry file Kies een oxymetrie bestand Oximetry Files (*.spo *.spoR) Oxymetrie bestanden (*.spo, *.spoR) Couldn't open oximetry file " Kon het oxymeter bestand niet openen " Opening this oximetry session will destroy the unsavedsession in the oximetry tab. Would you like to store it first? Als je deze oxymetie sessie opent, gaat de niet opgeslagen sessie verloren. Wil je deze eerst opslaan? Ready Klaar Check Oximeter is Ready WJG: spelling Controleer of de oxymeter aan staat Oximeter Error The device did not respond.. Make sure it's switched on. WJG: ik vermoed een inconsistentie bij de naker van het programma (zie vertaling twee regels hierboven): de werkwoordtijden zijn verschillend, maar de bedoeling zal hetzelfde zijn. Oxymetriefout! Het apparaat reageerde niet... staat het wel aan? Please make sure your oximeter is switched on, and in the right mode to transmit data. Controleer of de oxymeter aan staat en op gegevensoverdracht is ingesteld. Oximeter Error! Oxymeterfout! PreferencesDialog Preferences Instellingen &Import &Importeer Session Settings Sessie-instellingen Combine Close Sessions Combineer nabije sessies Minutes Minuten Multiple sessions closer together than this value will be kept on the same day. Tijd tussen sessies die nog tot dezelfde dag gerekend moeten worden. Ignore Short Sessions Negeer korte sessies <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kortere sessies worden niet weergegeven<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> Day Split Time Volgende dag start om Sessions starting before this time will go to the previous calendar day. Sessies die voor dit tijdstip gestart werden, horen bij de vorige dag. Keep session data in memory to speed up revisiting days. Houd sessiegegevens in geheugen voor hogere snelheid. Cache Session Data (uses more system memory) Cache sessiegegevens (kost meer geheugen) Session Storage Options Opties voor sessie-opslag This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) WJG: kleine spellingsdingetjes, o.a. de twee hoofdletters in SleepyHead; die Mark is zelf niet altijd consistent, maar het is dan ook geen linguïst AK: <grin> Dit zorgt voor een back-up van de SD-kaart voor ResMed-apparaten, ResMed apparaten verwijderen hoge resolutie-gegevens ouder dan 7 dagen, en grafiekgegevens die ouder zijn dan 30 dagen.. SleepyHead kan een kopie van deze gegevens bewaren voor na een herinstallatie. (Sterk aanbevolen, tenzij je weinig schijfruimte hebt of niets om grafiekgegevens geeft) Create SD Card Backups during Import (only for ResMed so far, highly recommended) Maak tijdens importeren een back-up van de SD-kaart (alleen nog voor ResMed, sterk aan te bevelen) This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. WJG: iets te kort door de bocht in de eerste regel, want de opslag wordt niet langzamer (dat kan ook niet), maar de processen gaan trager AK: In SSD zit al een disk, dus niet nog eens schijf... En het is niet eens een schijf ;-)) 20/9 WJG: De facto heb je natuurlijk gelijk, alleen wordt er in de volksmond wel over een schijf gesproken. AK: Dank je! Je hebt gelijk... De grootte van de opslag wordt gehalveerd, maar maakt het importeren en verwerken trager. Als je een nieuwe computer met SSD hebt, is dit een goede keuze. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) Comprimeer sessiegegevens (minder opslagruimte, maar tragere verwerking). Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Comprimeer ResMed (EDF) back-ups om schijfruimte te besparen. Back-ups van EDF bestanden worden opgeslagen in het gz-formaat, dat veel gebruikt wordt op Mac & Linux-systemen .. SleepyHead kan hier rechtstreeks uit importeren, maar voor ResScan moeten de .gz-bestanden eerst uitgepakt worden. Compress SD Card Backups (slower first import, but makes backups smaller) Comprimeer SD-kaart back-ups (langzamere eerste import, maar minder opslagruimte nodig) The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. De volgende opties hebben effect op de gebruikte schijfruimte en op de snelheid van importeren. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Wijzigen van SD-backup compressie comprimeert de back-upgegevens niet automatisch opnieuw. </span></p></body></html> &CPAP &Masker en apparaat CPAP Mask Information Informatie over het masker Mask Type Soort masker Generic mask type. Select the one that's closest to your mask. Algemeen maskertype. Kies wat het beste overeenkomt. Description Beschrijving The name of your mask, or at least the name you call it. De naam van het masker, of zoals je het noemt. Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. WJG: spreken we de gebruiker met 'u' of 'je' aan? Vaak tutoyeer je, wat gezien de luchtige toon van de teksten ook mijn voorkeur heeft. Denk dat de hele vertaling nog een keer hierop nagelopen moet worden. Wijze van berekening van maskerlekkage, als het apparaat dat niet zelf doet. Opmerking: Het statistisch model is experimenteel. Mask Profile Masker lekprofiel Statistical Model Statistisch model Leak calcs Lekkage? 20/9 WJG: Nergens anders wordt 'lekkage' gebruikt - al zou dat wel een beter woord zijn Berekening lekkage Started Using Start gebruik The date you started using this mask De datum waarop je het masker in gebruik nam Leak Profile Masker lekprofiel Pressure Druk Leak Lekkage <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Let op: </span>Het onderstaande werkt nog niet...</p></body></html> Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) WJG: is voor RDI geen Nederlandse vertaling? Is natuurlijk het probleem met veel van die afkortingen. AK: Mss later? Toont de "Respiratory Disturbance Index (RDI)" ipv de "Apneu Hypopneu Index (AHI)" (RDI = AHI + RERA) Use RDI instead of AHI (PRS1 only) Gebruik RDI in plaats van AHI (alleen bij PRS1) Don't show any compliance information WJG: lastige. Ik denk dat het hier gaat om het al dan niet opvolgen van het gebruik. Gaat hier om het aantal uren dat je het masker per nacht gebruikt. Compliance is naleving in de zin van wetten, maar voor ander gebruik zeg je wat anders. 'Opvolgen' is er een voor, maar ik vind dat het allemaal niet zo lekker past. Kortom, hier ben ik niet helemaal uit. AK: Compliantie is al gebruikelijk,therapietrouw is dè uitdrukking Toon informatie over therapietrouw Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON) Maak backups van de SD kaart gedurende het importeren (Belangrijk voor ResMed en F&P Icon) Show Compliance AK: Het gaat om de juridische term... 20/9 WJG: Dat lijkt me wat sterk... Er zijn toch geen wettelijke sancties verbonden aan het al dan niet gebruiken van je masker? AK: Zie hier boven Laat therapietrouw zien Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. WJG: bij gebrek aan beter, maar 'niet-compliant' en 'compliant' zijn geen termen die je in Van Dale tegenkomt Als ze het maar begrijpen, klachten mogen Beschouw dagen met minder gebruik als "niet-therapietrouw". 4 uur wordt meestal als "therapietrouw" beschouwd . hours uren as over indien meer dan of usage per night gebruik per nacht Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Zet experimentele incidentmarkeringen aan of uit. Dit detecteert incidenten 'op het randje' en door het apparaat gemiste incidenten. Deze optie moet worden aangezet vóór het importeren, anders eerst alles wissen. Custom User Event Flagging AK: Het is een keuze van de gebruiker... 20/9 WJG: Oké, maar dan moet het streepje weg. Aangepaste gebruikers markering Flow Restriction AK: Inderdaad, afsluiting is 0%, hier kan je kiezen, Debietreductie Debietbeperking Stroombeperking Debietbegrenzing Doorstroombeperking Debietreductie Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. Percentage van de vermindering van de luchtstroom ten opzichte van de mediane waarde. Een waarde van 20% werkt goed voor het opsporen van apneus. % % <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aangepast markeren is een experimentele werkwijze voor het detecteren van incidenten die zijn gemist door het apparaat. Ze worden <span style=" text-decoration: underline;">niet </ span> opgenomen in de AHI.</p></body></html> Duration of airflow restriction 20/9 WJG: Vanaf hier weer verder gegaan Duur van de vermindering van de luchtstroom s s Event Duration Tijdsduur incident Allow duplicates near machine events. 20/9 WJG: Maar ik kan deze tekst niet terugvinden op het tabblad CPAP van Preferences AK: inderdaad, vreemd Sta duplicaten toe vlak naast apparaat-incidenten. AHI/Hour Graph Settings Instelling grafiek AHI/uur Window 20/9 WJG: past beter in het schermpje en is ook wel duidelijk. Ik kan deze instelling overigens niet wijzigen Tijdsduur Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. Regelt de hoeveelheid gegevens die worden beschouwd voor elk punt in de grafiek AHI/uur. Staat standaard op 60 minuten. Sterk aanbevolen het op deze waarde te laten staan, anders is het geen AHI/uur meer. minutes minuten Reset the counter to zero at beginning of each (time) window. Zet de teller op nul aan het begin van elke periode. Zero Reset Telkens op nul zetten CPAP Clock Drift Correctie afwijking klok CPAP Do not import sessions older than: Importeer geen sessies ouder dan: Sessions older than this date will not be imported Sessies ouder dan deze datum worden niet geimporteerd dd MMMM yyyy dd MMMM jjjj Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) 20/9 WJG: beslissing nemen over aanspreekpersoon en dat consistent doorvoeren Wijzig dit niet, tenzij je zeker weet dat de klok van je CPAP fout staat. Probeer hem eerst te synchroniseren met de klok van de PC (niet mogelijk voor PRS1) seconds seconden Show in Event Breakdown Piechart Laat zien in de incidenten grafiek #1 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Deze experimentele optie probeert de incident-markeringen te gebruiken om een betere correlatie te kunnen zien. Resync Machine Detected Events (Experimental) Synchroniseer de door het apparaat gedetecteerde incidenten opnieuw (experimenteel) User definable threshold considered large leak Instelbare grens voor 'overmatige' lekkage (meestal 24 l/min) L/min l/min Whether to show the leak redline in the leak graph Of je de rode lijn in de lekgrafiek wilt zien Show Leak Redline Maak leklimiet zichtbaar &Events Deze tab zie ik niet... &Incidenten Not entirely sure if this will get to live or not.. 20/9 WJG: Mooi compact Onzeker of dit ooit gaat werken.. Show Tonen Colour Kleur Event Staat in: Instellingen-Grafieken Incident ID ID Graphs Grafieken Search Zoeken Filters the graph list. Simply start typing the name of the graph your looking for. Filtert de grafiek lijst. Gewoon beginnen met het typen van de naam van de grafiek die je zoekt. &Defaults &Standaardinstellingen Double click on the (Y-axis) min/max values to edit them Dubbelklik op de min/max waarden om de Y-as te wijzigen &Oximetry &Oxymetrie Use Oximetry Gebruik oxymeter Type Type Contec CMS50 Contec CMS50 Line Thickness Lijndikte The pixel thickness of line plots Pixelgrootte van lijngrafieken Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. "Pixmap caching" is een grafische versnellingstechniek. Kan problemen geven bij sommige teksten in de grafische omgeving. <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> <html><head/><body><p>Deze instellingen zijn tijdelijk uitgeschakeld. Ze komen later terug.</p></body></html> Overpriced ResMed S9 Oximeter (Te dure) ResMed S9 oxymeter Tries to forces the oximetry data to link with CPAP when possible. Dwingt de oxymetergegevens te koppelen met de CPAP, indien mogelijk. Link Oximetry and CPAP graphs Koppel oxymeter met andere grafieken Flag changes in oximetry stats Markeer veranderingen in oxymeterstatistieken SPO2 SpO2 Percentage drop in oxygen saturation 20/9 WJG: Zuurstof wellicht niet echt nodig? Percentage daling van zuurstofsaturatie Pulse 209/ WJG: Als 't past Polsslag Sudden change in Pulse Rate of at least this amount Plotselinge verandering in polsslag van tenminste deze hoeveelheid bpm 20/9 WJG: slagen per minuut per minuut Minimum duration of drop in oxygen saturation Minimale duur van de verlaging Minimum duration of pulse change event. Minimale duur van de verandering van de polsslag. Discard chunks under Verwaarloos als korter dan Small chunks of oximetry data under this amount will be discarded. Kortdurende oxymetrie-incidenten worden verwaarloosd. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does <span style=" font-weight:600; text-decoration: underline;">not</span> have the correct timestamp needed to sync.</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you start your Oximeters recording mode at <span style=" font-style:italic;">exactly </span>the same time you start your CPAP machine, you can now also achieve sync. </p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</p></body></html> 20/9 WJG: Iets met koppeltekens gedaan en u in je veranderd <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Synchronisatie van oximetrie- en CPAP-gegevens</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De geïmporteerde gegevens van de CMS50 uit SpO2Review (dus uit .spoR bestanden) zowel als de seriële import methode hebben <span style=" font-weight:600; text-decoration: underline;">niet</span> de correcte tijdsaanduiding die voor synchronisatie nodig is.</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Live view-modus (met een seriële kabel) is een manier om een ​​nauwkeurige synchronisatie op CMS50 oxymeters te bereiken, maar houdt geen rekening met de verlopende CPAP klok.</p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als de opname van de oxymeter <span style=" font-style:italic;"> precies </span> tegelijk met de CPAP wordt gestart,is er ook synchronisatie bereikt. </p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het proces van seriële import neemt de starttijd van de eerste CPAP sessie van de afgelopen nacht. (Vergeet niet om eerst de CPAP gegevens te importeren!)</p></body></html> &General &Algemeen General Settings Algemene instellingen Daily view navigation buttons will skip over days without data records De navigatieknoppen slaan de dagen zonder gegevens over Skip over Empty Days Sla lege dagen over Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. Gebruik meerdere CPU-cores voor betere prestaties. Werkt vooral bij importeren. Enable Multithreading Multithreading inschakelen Bypass the login screen and load the most recent User Profile Sla het inlogscherm over en laad het meest recente gebruikersprofiel Skip Login Screen Sla login-scherm over Changes to the following settings needs a restart, but not a recalc. Wijzigingen in de volgende instellingen werken pas na een herstart, maar er is geen herberekening nodig. Summary only data is more accurate for ResMed users if this is left on. Voor ResMed gebruikers kan dit beter aan blijven staan. Don't Split Summary Days Dagen met uitsluitend overzichtgegeens niet splitsen Create SD Card Backups during Import (Turn this off at your own peril!) Maak tijdens importeren een backup van de SD-kaart (Uitschakelen op eigen risico!) C&hannels &Kanalen Reset &Defaults &Standaardinstellingen herstellen <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Waarschuwing: </span>Hoewel het mogelijk is, betekent dit nog niet dat het een goede keuze is </p></body></html> Oximetery Settings Oxymetrie instellingen Contec CMS50D+ Contec CMS50D+ Contec CMS50E/F Contec CMS50E/F Contec CMS50F v3.7 Contec CMS50F v3.7 Preferred Calculation Methods Voorkeur berekeningsmethoden Middle Calculations Gemiddelden Upper Percentile Bovenste percentiel For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. 20/9 WJG: koppelteken en extra woorje Voor consistentie moeten ResMed-gebruikers hier 95% instellen, want dit is de enige waarde die beschikbaar is op de dagen met alleen een samenvatting. Median is recommended for ResMed users. Mediaan wordt aanbevolen voor ResMed-gebruikers. Median Mediaan Weighted Average Gewogen gemiddelde Normal Average Normaal gemiddelde ResMed users probably should use 99th Percentile for visual consistency. 20/9 WJG: koppelteken en Van Dale zegt 'het' tegen percentiel ResMed-gebruikers moeten waarschijnlijk het 99e percentiel gebruiken voor visuele consistentie. True Maximum Ware maximum 99% Percentile 99% percentiel Maximum Calcs Berekening maximum Import Locations 20/9 WJG: spelling Importlocaties Add Toevoegen Remove Verwijderen Automatically Check For Updates Automatisch controleren op updates Check for new version every Controleer elke Sourceforge hosts this project for free.. Please be considerate of their resources.. Sourceforge hosts dit project gratis .. Maak er zorgvuldig gebruik van.. days. dagen. &Check for Updates now Nu &controleren Last Checked For Updates: Laatste controle: TextLabel Tekstlabel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> 20/9 WJG: aanpsreekvorm <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als je geïnteresseerd bent in het helpen testen van nieuwe features en bugfixes, klik hier.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Maar wees gewaarschuwd: dit zal soms vastlopers betekenen!!</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> I want to try experimental and test builds (Advanced users only please.) Ik wil experimentele en testupdates proberen (s.v.p. alleen gevorderde gebruikers!) &Appearance &Uiterlijk Graph Settings Grafiekinstellingen Bar Tops Staafgrafieken Line Chart Lijngrafieken Overview Linecharts Overzicht lijngrafieken <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> Dit maakt scrollen makkelijker bij een tablet, 50 ms wordt aanbevolen. milliseconds milliseconden Scroll Dampening Scrollen dempen Overlay Flags Markeringen The visual method of displaying waveform overlay flags. De visuele methode voor het tonen van markeringen in golfvormgrafieken. Standard Bars Standaardbalken Top & Bottom Markers Onder en boven Graph Height Grafiekhoogte Default display height of graphs in pixels Standaardhoogte grafieken in pixels How long you want the tooltips to stay visible. Hoe lang moeten de tooltips zichtbaar blijven? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Synchroniseer oxymetrie en CPAP gegevens</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">De CMS50 gegevens, geimporteerd uit SpO2Review (uit .spoR bestanden) en de seriele import methode hebben </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">niet</span><span style=" font-family:'Sans'; font-size:10pt;"> de correcte kloktijd die nodig is voor synchronisatie.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live weergave (met een seriele/USB kabel) is een manier om een accurate synchronisatie met CMS50 oxymeters te krijgen, maar helpt ook niet tegen het verlopen van de klok van de CPAP.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Als je de opname van je oxymeter op </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">precies </span><span style=" font-family:'Sans'; font-size:10pt;">hetzelfde moment start met je CPAP, kun je ook synchroon lopen. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Het proces van import neemt de starttijd van de eerste CPAP sessie van de vorige nacht. (Vergeet niet om eerst je CPAP gegevens te importeren!)</span></p></body></html> Events Incidenten Flag rapid changes in oximetry stats Markeer snelle veranderingen in de oxymeter statistieken Other oximetry options Andere oxymeter opties Flag SPO2 Desaturations Below Markeer SpO2 desaturaties onder Discard segments under Verwerp segmenten onder Flag Pulse Rate Above Markeer polsslag boven Flag Pulse Rate Below Markeer polsslag onder Contec CMS50D+/E/F Contec CMS50F v3.7+ Contec CMS50F v3.7+ {50F?} ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Als je oxymeter het ondersteunt, zal SleepyHead de klok gelijkzetten met de computer. Update Oximeter Clock during import Zet de klok van de oxymeter gelijk gedurende het importeren Show flags for machine detected events that haven't been identified yet. Zet de markeringen voor de zelf gekozen incident-vlaggen aan. Show Unknown Flags Toon onbekende incidenten Import without nagging Importeer zonder vragen Tooltip Timeout Tooltip timeout Graph Tooltips Grafiek tekstballonnen Top Markers Top markeringen Other Visual Settings Overige visuele instellingen Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. Anti-aliasing strijkt de grafieken glad. Sommige grafieken zien er dan mooier uit. Dit is ook van invloed op afgedrukte rapporten. Probeer het en kijk of je het leuk vindt. Use Anti-Aliasing Gebruik Anti-aliasing Makes certain plots look more "square waved". Zorgt ervoor dat sommige grafieken er hoekiger uitzien. Square Wave Plots Hoekige golfgrafieken Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. 20/9 WJG: ietsje duidelijker en past beter in het hulptekstje Toont grafieken als "screenshots". Het cirkeldiagram van de incidentgrafiek maakt hiervan gebruik, net als de afdrukcode. Helaas veroorzaken sommige oudere computers en versies van Qt dat hierdoor deze toepassing instabiel wordt. Show event breakdown pie chart Toon cirkeldiagram <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pixmap caching is een graphische versnellingstechniek. Het kan echter wel problemen opleveren met de tekst bij de grafieken, afhankelijk van het computerplatform.</span></p></body></html> Use Pixmap Caching Gebruik Pixmap Caching Turn on/off the spinning "context" cube. It really doesn't use that much resources.. :) Zet de ronddraaiende kubus aan. Gebruikt echt niet zoveel geheugen... :) Animations && Fancy Stuff Animaties en grappige dingen Whether to allow changing yAxis scales by double clicking on yAxis labels Toestaan om de automatische y-as instelling te wijzigen door dubbelklikken op een label Allow YAxis Scaling Sta automatische y-as instelling toe Application Fonts Tekstinstellingen Font Lettertype Size Grootte Bold Vet Italic Cursief Application Toepassing Graph Text Grafiektekst Graph Titles Gafiektitels Big Text Grote tekst Details Details &Cancel &Annuleren &Ok &OK Nasal Pillows Neuskussens Span Events Gebeurtenissen binnen het gekozen bereik Flags Markeringen Minor Flags Geringe markeringen Waveforms Golfvormgrafiek Data Channels Gegevenskanalen Settings Channels Instellingskanalen Unknown Channels Onbekende kanalen Name Naam Color Kleur Label Label Data Reindex Required Gegevens opnieuw indexeren A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? Herindexering van de gegevens is nodig. Dit kan een paar minuten duren. Weet je zeker dat je deze wijzigingen wilt doorvoeren? Restart Required Herstart vereist One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? Een of meer wijzigingen vereisen dat SleepyHead opnieuw start, opdat deze veranderingen in werking treden. Wil je dit nu doen? Add this Location to the Import List Voeg deze locatie toe aan de importlijst Flag Markering Minor Flag Kleine vlag Span Bereik Always Minor Altijd klein Flag Type Soort markering CPAP Events CPAP incidenten Oximeter Events Oxymeter incidenten Positional Events Positie incidenten Sleep Stage Events Slaapfase incidenten Unknown Events Onbekende incidenten Double click to change the descriptive name this channel. Dubbelklik om de naam van dit kanaal te wijzigen. Double click to change the default color for this channel plot/flag/data. Dubbelklik om de kleur te wijzigen van dit kanaal (grafiek/markering/gegevens). Here you can change the type of flag shown for this event Hier kun je het soort markering van dit incident wijzigen This is the short-form label to indicate this channel on screen. Dit is het beknopte label om dit kanaal op het scherm te tonen. This is a description of what this channel does. Dit is de beschrijving van wat dit kanaal doet. Lower Onderste Upper Bovenste CPAP Waveforms CPAP golfgrafiek Oximeter Waveforms Oxymeter grafiek Positional Waveforms Positie grafiek Sleep Stage Waveforms Slaapfase grafiek Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Hier kun je de <b>onderste</b> drempel instellen van enkele berekeningen aan de %1 grafiek Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Hier kun je de <b>bovenste</b> drempel instellen van enkele berekeningen aan de %1 grafiek Daily Graphs Dagelijkse grafieken Overview Graphs Overzichtgrafieken Graph Grafiek This may not be a good idea Dit lijkt me niet zo'n goed idee ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). ResMed S9 apparaten wissen bepaalde gegevens van je SD kaart als ze ouder zijn dan 7 en 30 dagen (afhankelijk van de resolutie). If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. Als je ooit gegevens opnieuw moet inlezen (in SleepyHead of in ResScan), krijg je deze gegevens niet terug. If you need to conserve disk space, please remember to carry out manual backups. Als je zuinig moet zijn met schijfruimte, vergeet dan niet om zelf backups te maken. Are you sure you want to disable these backups? Weet je zeker dat je deze automatische backups wilt uitschakelen? Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. Het is geen goed idee om da automatische backup-functie uit te schakelen, SleepyHead heeft deze nodig voor het eventuele herstellen van de database. Are you really sure you want to do this? Weet je zeker dat je dit wilt? Min Min. Max Max. N/A nvt Oximetry Graphs Oxymetriegrafieken Confirmation Bevestiging Are you sure you want to reset your graph preferences to the defaults? Weet je zeker dat je de grafieken opnieuw wilt instellen op standaardwaarden? ProfileSelect Select Profile Kies profiel Search: Zoeken: Start with the selected user profile. Start met het geselecteerde gebruikersprofiel. Create a new user profile. Maak een nieuw gebruikersprofiel. Choose a different SleepyHead data folder. Kies een andere map met SleepyHeadData. &Different Folder &Andere map SleepyHead SleepyHead [version] [versie] Click here if you didn't want to start SleepyHead. Klik hier als je SleepyHead niet wilt starten. &Quit &Afsluiten Folder: Map: The current location of SleepyHead data store. De huidige locatie van de map met SleepyHeadData. [data directory] [gegevens directory] New Profile Nieuw profiel &Select User &Selecteer profiel Open Profile Open profiel Edit Profile Wijzig profiel Delete Profile Wis profiel Enter Password for %1 Geef wachtwoord voor %1 Incorrect Password Verkeerd wachtwoord You entered the password wrong too many times. Je hebt te vaak een verkeerd wachtwoord getypt. Enter the word DELETE below to confirm. Typ het woord DELETE hieronder om te bevestigen. You are about to destroy profile '%1'. Je wist nu het profiel '%1'. Sorry Sorry You need to enter DELETE in capital letters. Je moet het woord DELETE in HOOFDLETTERS intypen. Could not open profile.. You will need to delete this profile directory manually Kon het profiel niet openen. Je moet de profieldirectory zelf wissen You will find it under the following location: Je vindt die op de volgende locatie: You entered an incorrect password Je hebt een verkeerd wachtwoord gegeven If you're trying to delete because you forgot the password, you need to delete it manually. Als je probeert om het te wissen omdat je het wachtwoord bent vergeten, moet je de directory zelf wissen. There was an error deleting the profile directory, you need to manually remove it. Er ging iets mis bij het wissen van de profieldirectory, je moet deze zelf wissen. Question Vraag Are you sure you want to trash the profile "%1"? Weet je zeker dat profiel "%1" moet worden gewist? Double Checking: Do you really want "%1" profile to be obliterated? Echt waar: Wil je echt profiel %1 WISSEN? Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data.. Don't say you weren't warned. :-p OK, ik ga nu het profiel en al de gegevens van "%1"vernietigen.. Zeg niet dat je het niet wist... ;-p WTH??? Hè???? If you can read this you need to delete this profile directory manually (It's under %1) Als je dit leest, moet je de profielmap handmatig verwijderen (Hij heet: %1) Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs. Signed: Nasty Programmer Hehe... Als je het profiel wilt wissen omdat je het wachtwoord vergeten bent, doe je iets verkeerd: Lees de documentatie. Ondertekend: Vervelende programmeur Whoops. Oeps. There was an error deleting the profile directory.. You need to manually remove %1 Er ging iets mis bij het wissen. Je moet zelf de map %1 verwijderen Profile '%1' was succesfully deleted Het profiel '%1' is succesvol gewist Create new profile Maak nieuw profiel Enter Password Geef wachtwoord You entered an Incorrect Password too many times. Exiting! Je typte te vaak een verkeerd wachtwoord. Het programma wordt nu afgesloten! QObject No Data Geen gegevens cm cm " inch ft ft lb lb oz oz Kg kg cmH2O cmWk Sleep Start Wake Einde Hours Uren bpm slagen per minuut L/m l/min Error Fout Warning Waarschuwing Please Note LET OP &Yes &Ja &No &Nee &Cancel &Annuleren &Destroy &Wissen &Save &Opslaan Min EPAP Min. EPAP Max EPAP Max. EPAP Min IPAP Min. IPAP Max IPAP Max. IPAP ÇSR CSR On Aan Off Uit BMI BMI Minutes Minuten Seconds Seconden Events/hr Incidenten per uur Hz Hz Litres Liters ml ml Breaths/min Ademhalingen per minuut Severety (0-1) Ernst (0 - 1) Degrees Graden Information Informatie Busy Bezig Yes Ja Cancel Annuleren Weight Gewicht Zombie Zombie Pulse Rate 20/9 WJG: overal gebruiken we polsslag - moeten we daar eigenlijk niet hartslag van maken? Dat lijkt me eigenlijk beter... Toch maar niet (nog) Polsslag SpO2 SpO2 Plethy 20/9 WJG: Wat is dat? AK: Het kwam me bekend voor: plethy definition, meaning, English dictionary, synonym, see also 'plethora',plethoric',plenty',pleat', Reverso dictionary, English definition, English vocabulary. DAT HAD JIJ TOCH MOETEN WETEN? Plethysmos = toename http://www.apneaboard.com/forums/Thread-CMS50D--3956 Plethy Oximeter oxymeter CPAP CPAP BiPAP BiPAP Bi-Level Bi-level EPAP EPAP IPAP IPAP IPAPLo IPAP laag IPAPHi IPAP hoog APAP APAP ASV ASV ST/ASV ST/ASV Humidifier Bevochtiger H H OA OA A A CA CA FL FL SA SA LE LE EP EP VS VS VS2 VS2 RERA RERA (RE) PP PP P P RE RE NR NR NRI NRI O2 O2 PC PC UF1 UF1 UF2 UF2 UF3 UF3 PS PS AHI AHI RDI RDI AI AI HI HI UAI UAI CAI CAI FLI FLI REI REI EPI EPI ÇSR ÃSR PB PB IE I/E Insp. Time Inademtijd Exp. Time Uitademtijd Resp. Event Ademhalings-incident Flow Limitation Stroombeperking Flow Limit Stroombeperking SensAwake SensAwake Pat. Trig. Breath Pat. Veroorz. Ademh Tgt. Min. Vent Doel min. vent Target Vent. Doelventilatie. Minute Vent. Minuutventilatie. Tidal Volume Teugvolume Resp. Rate Ademtempo Snore Snurken Leak Lekkage Leaks Maskerlek Total Leaks Totale lek Unintentional Leaks Onbedoelde lek MaskPressure Maskerdruk Flow Rate Stroomsnelheid Sleep Stage Slaapfase Usage Gebruik Sessions Sessies Pr. Relief Drukvermindering No Data Available Geen gegevens beschikbaar Compliance Only :( Alleen naleving ;( Graphs Switched Off Grafieken uitgeschakeld Summary Only :( Alleen overzichtgegevens :( Sessions Switched Off Sessies uitgeschakeld Bookmarks Bladwijzers Mode Modus Model Type Brand Merk Serial Serienummer Series Serie Machine Apparaat Channel Kanaal Settings Instellingen Inclination Inclinatie Orientation Orientatie Name Naam DOB Geboortedatum Phone Telefoon Address Adres Email E-mail Patient ID Patient-ID Date Datum Bedtime Gaan slapen Wake-up Opgestaan Mask Time Maskertijd Unknown Onbekend None Geen Ready Klaar First Eerste dag Last Laatste dag Start Start End Einde No Nee Min Min. Max Max. Med Med Average Gemiddeld Median Mediaan Avg Gem. W-Avg Gew. gem. Pressure Druk ? ? Severity (0-1) Ernst (0-1) Daily Dagelijks Overview Overzicht Oximetry Oxymetrie Event Flags Incident markeringen Windows User Windows-gebruiker Software changes have been made that require the reimporting of the following machines data: Door een wijziging in het programma moeten de volgende gegevens van het apparaat opnieuw worden opgehaald: I can automatically purge this data for you, or you can cancel now and continue to run in a previous version. Ik kan automatisch deze gegevens wissen, tenzij je nu afbreekt en de oude versie blijft gebruiken. Would you like me to purge this data this for you so you can run the new version? Wil je dat ik de gegevens voor je wis zodat je de nieuwe versie kunt gaan gebruiken? SleepyHead (%1) needs to upgrade its database for %2 %3 %4 SleepyHead (%1) moet de database voor %2 %3 %4.vernieuwen <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <b>SleepyHead maakt een backup van je SD-kaart voor dit doel.</b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> <i>Je oude gegevens moeten worden ingelezen, als de backup-functie tenminste niet is uitgeschakeld</i> SleepyHead does <font size=+1>not</font> yet have an automatic card backup capabilities for this device. SleepyHead heeft voor dit apparaat nog <font size=+1>geen</font> mogelijkheid voor een automatische backup . Launching Windows Explorer failed Het is niet gelukt om de Windows Verkenner te starten Could not find explorer.exe in path to launch Windows Explorer. Kan explorer.exe niet in het pad vinden. SleepyHead does not yet have any automatic card backups stored for this device. SleepyHead heeft nog geen automatische backup-functie voor dit apparaat. This means you will need to import this machine data again afterwards from your own backups or data card. Dat betekent dat je de gegevens van dit apparaat straks opnieuw van de kaart of uit een eigen backup moet inlezen. Important: Belangrijk: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. Na deze upgrade kun je de gegevens van dit profiel.<font size=+1>niet meer</font> gebruiken met een eerdere versie. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. Als je je zorgen maakt, klik dan op Nee om af te sluiten en maak eerst een backup van je profiel voordat je SleepyHead opnieuw start. Are you ready to upgrade, so you can run the new version of SleepyHead? Ben je er klaar voor om met de nieuwe versie te gaan werken? Machine Database Changes Wijzigingen in de gegevens van het apparaat Sorry, the purge operation failed, which means this version of SleepyHead can't start. Sorry, het wissen is mislukt. Dat betekent dat deze versie van SleepyHead niet kan starten. The machine data folder needs to be removed manually. Je moet zelf de map SleepyHeadData wissen. This folder currently resides at the following location: Deze map staat momenteel hier: Rebuilding from %1 Backup Herstellen vanuit backup %1 Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? Wil je de automatische backup-functie inschakelen, opdat SleepyHead eventueel de database kan herstellen? SleepyHead will now start the import wizard so you can reinstall your %1 data. Er wordt een importhulp gestart zodat je de gegevens van je %1 kunt inlezen. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: SleepyHead sluit nu af en probeert het bestandsbeheer te starten, zodat je een backup van het profiel kunt maken: Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. Gebruik het bestandsbeheer om een copie van het profiel te maken. Start daarna SleepyHead opnieuw en maak het proces verder af. Purge Failed Wissen mislukt Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually This folder currently resides at the following location: Sorry, ik kon de gegevens niet wissen, deze versie van SleepyHead kan daardoor niet starten. De map met gegevens van SleepyHead moet je zelf wissen. De map vind je op: SleepyHead Release Notes SleepyHead versie-opmerkingen Release Notes Versie-opmerkingen &Ok, get on with it.. &OK, laten we beginnen.. Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. Zoek deze versie op <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. A faster build of SleepyHead may be available Er kan een snellere versie van SleepyHead beschikbaar zijn You will not be bothered with this message again. Ik zal je niet meer met dit bericht lastigvallen. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. Deze versie zal goed draaien, maar een versie met de aanduidng "<b>%1</b>" zal waarschijnlijk beter draaien op deze computer. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. Deze versie van SleepyHead is ontworpen voor oudere computers zonder 'open GL 2.0' ondersteuning, maar bij deze computer hoeft dat niet. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. Deze versie van SleepyHead is ontworpen voor oudere computers zonder 'open GL 2.0' ondersteuning, zoals ook deze computer. Maar er is wellicht een nieuwere versie beschikbaar. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. Als je dit draait in een virtuele machine als VirtualBox of VMware, negeer deze opmerking dan: er is geen betere versie. Incompatible Graphics Hardware Incompatibele graphicskaart This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. Deze versie van SleepyHead werkt met OpenGL 2.0 en helaas ondersteunt deze computer dat niet. You may need to update your computers graphics drivers from the GPU makers website. %1 Wellicht helpt het om de drivers van de grafische kaart te updaten bij %1 (<a href='http://intel.com/support'>Intel's support site</a>) (<a href='http://intel.com/support'>Intel's support site</a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. Het programma zal worden afgesloten omdat de grafische mogelijkheden beperkt zijn en de computer waarschijnlijk toch zal crashen. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. Wees niet teleurgesteld: er is een andere versie met <b> -BrokenGL</b> die wel op deze computer moet draaien. No SleepyHead data folder was found. Er is geen map met gegevens van SleepyHead gevonden. Would you like SleepyHead to use the default location for storing its data? Wil je dat SleepyHead de standaard locatie voor gegevensopslag gebruikt? As you did not select a data folder, SleepyHead will exit. Omdat je geen map voor gegevensopslag hebt gekozen, wordt SleepyHead nu afgesloten. Next time you run, you will be asked again. Volgende keer als je het programma start, wordt deze vraag weer gesteld. You did not select a directory. Je hebt geen map gekozen. SleepyHead will now start with your old one. SleepyHead start nu met de oude map. SleepyHead Update Notes SleepyHead update-opmerkingen Update Bijwerken Language Taal Question Vraag No SleepyHead data folder was found. Would you like SleepyHead to use the default location for storing its data? Geen SleepyHeadData folder gevonden. Wil je dat SleepyHead de standaard lokatie gebruikt voor gegevensopslag? Choose or create new folder for SleepyHead data Kies of maak een nieuwe map voor SleepyHeadData Exiting Afsluiten As you did not select a data folder, SleepyHead will exit. Next time you run, you will be asked again. Doordat je geen gegevensfolder hebt gekozen, wordt SleepyHead gestopt. De volgende keer wordt het opnieuw gevraagd. No Directory Geen directory You did not select a directory. SleepyHead will now start with your old one. Je hebt geen directory gekozen. SleepyHead wordt nu gestart met je vorige directory: The folder you chose is not empty, nor does it already contain valid SleepyHead data. De map die je koos is niet leeg, maar bevat ook geen gegevens van SleepyHead. Are you sure you want to use this folder? Weet je zeker dat je deze map wilt gebruiken? The folder you chose is not empty, nor does it already contain valid SleepyHead data. Are you sure you want to use this folder? De folder die je gekozen hebt is niet leeg, maar bevat ook geen bruikbare SleepyHeadData. Weet je zeker dat je deze wilt gebruiken? SleepyHead SleepyHead Unspecified Niet gespecificeerd Nasal Pillows Neuskussens Hybrid F/F Mask Hybride volgelaatsmasker Nasal Interface Neustussenstuk Full-Face Mask Volgelaatsmasker Are you sure you want to reset all your channel colors and settings to defaults? Weet je zeker dat je de kleuren en instellingen van alle grafieken wilt herstellen? Import Error Importfout This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. Deze apparaatgegevens kunnen niet in dit profiel worden geimporteerd. De gegevens overlappen reeds bestaande gegevens. Non Data Capable Machine Dit apparaat verstrekt geen gegevens Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. Uw apparaat van Respironics (Model %1) kan helaas geen gegevens verstrekken. I'm sorry to report that SleepyHead can only track hours of use for this machine. Het spijt me dat SleepyHead voor dit apparaat alleen de gebruiksuren kan bijhouden. 15mm 15mm 22mm 22mm Flex Mode Flex modus PRS1 pressure relief mode. PRS1 drukhulp modus. C-Flex C-flex C-Flex+ C-flex+ A-Flex A-flex Rise Time Stijgtijd Bi-Flex Bi-flex Flex Level Flex instelling PRS1 pressure relief setting. PRS1 drukhulp instelling. x1 x2 x3 x4 x5 Humidifier Status Status bevochtiger PRS1 humidifier connected? Is de bevochtiger aan de PRS1 aangesloten? Disconnected Losgekoppeld Connected Aangekoppeld Heated Tubing Verwarmde slang Heated Tubing Connected Verwarmde slang aangesloten Headed Tubing Verwarmde slang Humidification Level Instelling bevochtiger PRS1 Humidification level Instelling bevochtiger PRS1 Humid. Lvl. Bevocht.inst. System One Resistance Status Status System One weerstand Sys1 Resist. Status Status? System One Resistance Setting Instelling System One weerstand System One Mask Resistance Setting Instelling maskerweerstand Sys1 Resist. Set Inst.weerst. Hose Diameter Slangdiameter Diameter of primary CPAP hose Diameter van de belangrijkste slang System One Resistance Lock Weerstand vergrendeling Whether System One resistance settings are available to you. Of de instellingen beschikbaar zijn. Sys1 Resist. Lock Vergrendeld? Auto On Automatische start A few breaths automatically starts machine Het apparaat start na enkele ademhalingen Auto Off Automatisch uit Machine automatically switches off Het apparaat schakelt automatisch uit Mask Alert Masker waarschuwing Whether or not machine allows Mask checking. Of controle van het masker is ingeschakeld. Show AHI Toon AHI Whether or not machine shows AHI via LCD panel. Of het apparaat de AHI op het scherm toont. Unknown PRS1 Code %1 Onbekende PRS1 code %1 PRS1_%1 PRS1_%1 Timed Breath Geprogrammeerde ademhaling Machine Initiated Breath Door apparaat getriggerde ademhaling TB TB About SleepyHead Over SleepyHead &Close &Sluiten &Donate &Doneren There are no graphs visible to print Geen zichtbare grafieken om af te drukken Would you like to show bookmarked areas in this report? Wil je gebieden met bladwijzer in dit rapport tonen? This make take some time to complete.. Please don't touch anything until it's done. Dit kan even duren... Alsjeblieft niets aanraken tot ik klaar ben. Printing %1 Report Rapport %1 afdrukken %1 Report %1 Rapport : %1 hours, %2 minutes, %3 seconds : %1 uren, %2 minuten, %3 seconden Range Bereik Fixed %1 %1 gerepareerd RDI %1 RDI %1 AHI %1 AHI %1 AI=%1 HI=%2 CAI=%3 AI: %1 HI: %2 CAI: %3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4% REI: %1 VSI: %2 FLI; %3 PB/CSR: %4% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% REI: %1 VSI: %2 FLI: %3 PB/CSR: %4%% UAI=%1 UAI: %1 NRI=%1 LKI=%2 EPI=%3 NRI: %1 LKI: %2 EPI: %3 Reporting from %1 to %2 Rapport van %1 tot %2 Reporting data goes here De rapportgegevens komen hier Entire Day's Flow Waveform Flow golfvorm hele dag Current Selection Huidige selectie Entire Day Gehele dag SleepyHead v%1 - http://sleepyhead.sourceforge.net SleepyHead v%1 - http://sleepyhead.sourceforge.net Page %1 of %2 Pagina %1 van %2 SleepyHead has finished sending the job to the printer. SleepyHead is klaar met afdrukken. This is an unstable build so expect the possibility things will go wrong. Dit is een onstabiele versie, dus je kunt verwachten dat er wat mis gaat. Please report bugs you find here to SleepyHead's developer mailing list. Geef alsjeblieft de fouten door aan de ontwikkelaar van SleepyHead of aan de vertaler: klerk@apneuvereniging.nl This is a beta software and some functionality may not work as intended yet. Dit is een beta programma, sommige funties zouden niet naar verwachting kunnen werken. Please report any bugs you find to SleepyHead's SourceForge page. Geef alle bugs die je vindt op bij de SourceForge pagina van SleepyHead. Jan Jan Feb Feb Mar Mrt Apr Apr May Mei Jun Jun Jul Jul Aug Aug Sep Sep Oct Okt Nov Nov Dec Dec Events Incidenten Duration Tijdsduur (% %1 in events) (%1% in incidenten) (%%1 in events) (%%1 in incidenten) Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! Kon Channels.xml niet lezen, deze versie is echt brak, geen andere keuze dan om af te breken! Therapy Pressure Therapiedruk Inspiratory Pressure Inademdruk Lower Inspiratory Pressure Laagste inademdruk Higher Inspiratory Pressure Hoogste inademdruk Expiratory Pressure Uitademdruk Lower Expiratory Pressure Onderste uitademdruk Higher Expiratory Pressure Bovenste uitademdruk Pressure Support Drukhulp PS Min PS min. Pressure Support Minimum Minimale drukhulp PS Max PS max. Pressure Support Maximum Maximale drukhulp Min Pressure Minimale druk Minimum Therapy Pressure Minimum therapiedruk Pressure Min Minimum druk Pressure Max Maximum druk Perfusion Index Perfusie index A relative assessment of the pulse strength at the monitoring site Een relatieve benadering van de sterkte van de polsslag op de gemeten plek Perf. Index % Perf index % CPAP Session contains summary data only Deze sessie bevat uitsluitend overzichtgegevens PAP Mode Soort apparaat PAP Device Mode Soort PAP APAP (Variable) APAP (variabel) ASV (Fixed EPAP) ASV (Vaste EPAP) ASV (Variable EPAP) ASV (Variabele EPAP) Zero Nul Upper Threshold Bovengrens Lower Threshold Ondergrens Pr. Min Min. druk Max Pressure Max. druk Maximum Therapy Pressure Maximum therapiedruk Pr. Max Max. druk Ramp Time Aanlooptijd Ramp Delay Period Aanloop vertraging Ramp Event Aanloop incident Ramp Aanloop Vibratory Snore (VS2) Vibrerend snurken (VS2) Leak Flag Lekmarkering (LF) LF LF Mask On Time Tijdstip masker opgezet Time started according to str.edf Starttijd volgens het bestand str.edf Summary Only Alleen overzichtsgegevens CPAP Session contains summary data onlyf De CPAP sessie bevat alleen overzichtsgegevens minutes minuten Ramp Pressure Aanloopdruk Starting Ramp Pressure Aanloop startdruk Ramp Pr. Aanloopdruk. Periodic Breathing Cyclische ademhaling (PB) A period of periodic breathing Een periode van cyclische ademhaling % % Clear Airway Apnea Open luchtweg apneu (CA) An apnea where the airway is open Een apneu waarbij de luchtweg niet is afgesloten events/hr gebeurtenissen per uur Obstructive Apnea Obstructieve apneu (XXXXX) An apnea caused by airway obstruction Een apneu waarbij de luchtweg is afgesloten Hypopnea Hypopneu (H) A partially obstructed airway Een gedeeltelijk afgesloten luchtweg Unclassified Apnea Onbekende apneu (A) An apnea that could not fit into a category Een apneu die niet traceerbaar was UA UA An restriction in breathing from normal, causing a flattening of the flow waveform. Een abnormale beperking van de ademhaling, waardoor de stroom afvlakte. Respiratory Effort Related Arousal Arousal door ademprobleem (RERA) An restriction in breathing that causes an either an awakening or sleep disturbance. Een stroombeperking die (gedeeltelijk) ontwaken (arousal) veroorzaakt. Vibratory Snore Vibrerend snurken A vibratory snore Een snurk A vibratory snore as detcted by a System One machine System One detecteert vibrerend snurken Pressure Pulse drukpuls A pulse of pressure 'pinged' to detect a closed airway. Een kleine drukgolf waarmee een afgesloten luchtweg wordt gedetecteerd. Large Leak XXXXXXXXXX A large mask leak affecting machine performance. Dusdanige lekkage dat het apparaat niet meer goed detecteert. LL LL Non Responding Event Incident zonder reactie A type of respiratory event that won't respond to a pressure increase. Een ademhalings-incident dat niet door drukverhoging ophoudt. Expiratory Puff Uitademstoot Intellipap event where you breathe out your mouth. Een Intellipap incident waarbij je door de mond uitademt. SensAwake feature will reduce pressure when waking is detected. De SensAwake functie verlaagt de druk als een arousal wordt gedetecteerd. User Flag #1 Gebruikersmarkering #1 A user definable event detected by SleepyHead's flow waveform processor. Door de gebruiker instelbaar incident dat door SleepyHead wordt herkend. User Flag #2 Gebruikersmarkering #2 User Flag #3 Gebruikersmarkering #3 Heart rate in beats per minute Pols in slagen per minuut Blood-oxygen saturation percentage Bloedzuurstof saturatie in procent SpO2 % SpO2 % Plethysomogram Plethysomogram hz hz An optical Photo-plethysomogram showing heart rhythm Een optisch foto-plethysomogram die het hartritme laat zien Pulse Change Wijziging in polsslag A sudden (user definable) change in heart rate Een plotselinge verandering in polsslag (instelbaar) SpO2 Drop SpO2 verlaging A sudden (user definable) drop in blood oxygen saturation Een plotselinge verlaging in zuurstofsaturatie (instelbaar) SD SD Breathing flow rate waveform Ademhalings golfvorm L/min l/min Mask Pressure Maskerdruk Mask Pressure (High resolution) Maskerdruk (hoge resolutie) Amount of air displaced per breath Hoeveelheid lucht verplaatst door ademhaling Graph displaying snore volume Grafiek die de mate van snurken weergeeft ?? ?? Minute Ventilation Minuutventilatie Amount of air displaced per minute Hoeveelheid verplaatste lucht per minuut Respiratory Rate Ademhalingstempo Rate of breaths per minute Tempo van de ademhaling per minuut Bpm slagen per minuut Patient Triggered Breaths Pat. Veroorz. Ademh Percentage of breaths triggered by patient Percentage ademhalingen door de patient Pat. Trig. Breaths Pat. geact. teugen Leak Rate Leksnelheid Rate of detected mask leakage Snelheid van de maskerlekkage I:E Ratio I:E verhouding Ratio between Inspiratory and Expiratory time Verhouding tussen inadem- en uitademtijd ratio verhouding Expiratory Time Uitademtijd Time taken to breathe out Tijdsduur van het uitademen seconds seconden Inspiratory Time Inademtijd Time taken to breathe in Tijdsduur van het inademen Respiratory Event Ademhalingsincident A ResMed data source showing Respiratory Events Een ResMed gegevensblok met ademhalingsincidenten events incidenten Graph showing severity of flow limitations Grafiek die de ernst van de stroombeperking aangeeft Flow Limit. Stroombeperk. 0-1 0=open, 1=dicht Target Minute Ventilation Doelminuutventilatie Target Minute Ventilation? Doelminuutventilatie? Maximum Leak Maximum lekkage The maximum rate of mask leakage De maximum leksnelheid Max Leaks Max. lek Apnea Hypopnea Index Apneu-hypopneu Index Graph showing running AHI for the past hour Grafiek met de voortschrijdende AHI van het afgelopen uur events/hour gebeurtenissen per uur Total Leak Rate Totale lekkage Detected mask leakage including natural Mask leakages Gedetecteerde maskerlekkage inclusief de bedoelde lek Median Leak Rate Mediaan van de lekkage Median rate of detected mask leakage De mediaan van de leksnelheid Median Leaks Mediaan lek Respiratory Disturbance Index Ademhalings Stoornis Index (RDI) Graph showing running RDI for the past hour Grafiek met de voorstschrijdende RDI van het afgelopen uur Sleep position in degrees Slaaphouding in graden degrees graden Upright angle in degrees Zit/lig stand in graden Name: %1, %2 Naam: %2 %1 DOB: %1 Geboortedatum: %1 Phone: %1 Telefoon: %1 Email: %1 E-mail: %1 Address: Adres: Usage Statistics Gebruiks-statistieken This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. Dit rapport is vervaardigd met een testversie van SleepyHead (%1), <b>en is op geen enkele wijze geschikt voor de bepaling van de therapietrouw of medische diagnose</b>. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead SleepyHead is een gratis "open-source" programma, beschikbaar op <a>http://sleepfiles.com/SH/</a> <b>Inlichtingen in Nederland en België: klerk@apneuvereniging.nl</b> Auto Bi-Level Auto Bi-level ASV Auto EPAP ASV auto EPAP ASV AutoEPAP ASV met auto-EPAP %1 threshold %1 drempel No Waveform Available Geen golfvorm gedetecteerd Plots Disabled Grafieken uitgeschakeld Duration %1:%2:%3 Tijdsduur %1 %2 %3 AHI %1 AHI %1 Days=%1 Dagen: %1 Low Usage Days=%1 Korte dagen: %1 (%%1 compliant, defined as > %2 hours) (1%% therapietrouw, met > %2 uren) (Sess=%1) Sessie: %1 Bedtime=%1 Naar bed: %1 Waketime=%1 Opstaan: %1 Days: %1 Dagen: %1 Low Usage Days: %1 Korte dagen: %1 (%1% compliant, defined as > %2 hours) (%1% therapietrouw, met meer dan %2 uren) (Sess: %1) (Sessies: %1) Bedtime: %1 Naar bed: %1 Waketime: %1 Opstaan: %1 90% 90% (Summary Only) (Alleen overzichtgegevens) Unknown. Onbekend. There is a lockfile already present for profile '%1'. Er is een blokkeervlag voor het profiel '%1'. You can only work with one instance of an individual SleepyHead profile at a time. Je mag in SleepyHead maar met een profiel tegelijk open hebben. Please close any other instances of SleepyHead running with this profile before proceeding. Sluit alsjeblieft elk ander programma dat dit profiel gebruikt. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. Als er geen andere programma's draaien, mag deze boodschap worden genegeerd (was SleepyHead gecrasht?). There is a lockfile already present for this profile '%1', claimed on '%2'. Er is een blokkeervlag voor het profiel '%1', dat in gebruik is door '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. Als je cloud-opslag gebruikt, zorg dan dat SleepyHead is afgesloten en de synchronisatie is afgerond voordat je verder gaat. Peak Piek Maximum Maximum %1% %2 %1% %2 Fixed Vast Auto Auto Fixed Bi-Level Vaste Bi-level Auto Bi-Level (Fixed PS) Auto Bi-level (met vaste PS) Auto Bi-Level (Variable PS) Auto Bi-level (Variabele PS) ASV Fixed EPAP ASV met vaste EPAP ASV Variable EPAP ASV met variabele EPAP %1%2 %1%2 Fixed %1 (%2) Vaste %1 (%2) Min %1 Max %2 (%3) Min: %1 Max: %2 (%3) EPAP %1 IPAP %2 (%3) EPAP: %1 IPAP: %2 (%3) PS %1 over %2-%3 (%4) PS: %1 over %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) Min EPAP: %1 Max IPAP: %2 PS: %3-%4 (%5) EPAP %1 PS %2-%3 (%6) EPAP: %1 PS: %2-%3 (%6) %1 %2 %1 %2 %1-%2 %3 %1-%2 %3% PS %3 over %1-%2 %4 PS %3 boven %1-%2 %4% PS %4-%5 over %1-%3 %6 PS %4-%5 boven %1-%3 %6% PS %4-%5 over EPAP %1-%2 Max %3 %6 PS %4-%5 boven EPAP %1-%2 max. %3 %6% Welcome to SleepyHead Welkom bij SleepyHead What would you like to do? Wat wil je gaan doen? Please Import Some Data Graag eerst enige gegevens importeren CPAP<br/>Importer CPAP<br/>importeren Oximetery<br/>Wizard Oxymetrie<br/>wizard or of View<br/>Statistics Statistieken<br/>bekijken It might be a good idea to check preferences first,</br>as there are some options that affect import. Het zou een goed idee zijn om eerst de instellingen te bekijken,</br>omdat daar een paar opties staan die belangrijk zijn bij het importeren. First import can take a few minutes. De eerste import kan enkele minuten duren. Click this box to see this in daily view. Klik hierop om het dagoverzicht te zien. The last time you used your %1... De laatste keer dat je de %1 gebruikte ... last night afgelopen nacht yesterday gisteren %2 days ago %2 dagen geleden was %1 (on %2) was %1 (op %2). perfect :) perfect :) pretty darn good verduveld goed reasonably good behoorlijk goed technically "treated" technisch gezien: "behandeld" not very good niet erg goed horrible, please consult your doctor verschrikkelijk, neem contact op met je arts <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Bepaalde operating systemen</font></span> schrijven zonder te vragen index-bestanden naar de kaart. Hierdoor kan de kaart voor jouw CPAP onleesbaar worden. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> <p>Als tweede beschermingsmaatregel moet je ALTIJD de kaart EERST AFSLUITEN voor verwijderen!</p> Your had an AHI of %1, which is considered %2. Je had een AHI van %1, dat wordt beschouwd als %2. %1 hours, %2 minutes and %3 seconds %1 uren, %2 minuten en %3 seconden You slept for %1. Je sliep gedurende %1. <font color = red>You only had the mask on for %1.</font> <font color=red>Je droeg je masker maar gedurende %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). Je had geen <i>'overmatige'</i> maskerlekkage (maximaal %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. Je had een korte, maar acceptabele hoeveelheid <i>'overmatige'</i> maskerlekkage. You had significant periods of <i>major</i> mask leakage. Je had flinke periodes met <i>'overmatige'</i> maskerlekkage. Your mask is leaking way too much.. Talk to your CPAP advisor. Je masker lekt veel te veel. Praat eens met je OSAS verpleegkundige. Your CPAP machine blasted you with a constant %1%2 of air Je CPAP blies met een constante %1%2 luchtdruk Your pressure was under %1%2 for %3% of the time. Je druk was %3% van de tijd beneden %1%2 (mediaan). Your machine blasted you with a constant %1-%2 %3 of air. Je apparaat blies met een constante %1-%2 %3 luchtdruk. Your machine was under %1-%2 %3 for %4% of the time. Je CPAP was beneden %1-%2 %3 gedurende %4% van de tijd. Your EPAP pressure fixed at %1%2. Je EPAP druk stond vast op %1%2. Your EPAP pressure was under %1%2 for %3% of the time. Je EPAP druk was beneden %1%2 gedurende %3% van de tijd. Your IPAP pressure was under %1%2 for %3% of the time. Je IPAP druk was beneden %1%2 gedurende %3% van de tijd. You had an AHI of %1, which is considered %2 Je had een AHI van %1, dat wordt beschouwd als %2. You machine was on for %1. Je apparaat stond gedurende %1 aan. No CPAP data has been imported yet. Er zijn nog geen CPAP gegevens geimporteerd. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> Meest recente oxymeterie gegevens: <a onclick='alert("daily=%2");'>%1</a> (last night) (afgelopen nacht) (yesterday) (gisteren) (%2 day ago) (%2 dag(en) geleden) No oximetery data has been imported yet. Er zijn nog geen gegevens van de oxymeter geimporteerd. Very Important Warning Erg belangrijk: Waarschuwing <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. <p>Je moet ALTIJD<font size=+1 color=red> de SD kaart van je CPAP <b>tegen schrijven beveiligen</b></font> voordat je hem in de computer steekt. <span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Bepaalde operating systemen</font></span> schrijven zonder te vragen index-bestanden naar de kaart. Hierdoor kan de kaart voor jouw CPAP onleesbaar worden. Contec Contec CMS50 CMS50 Fisher & Paykel Fisher & Paykell ICON ICON DeVilbiss DeVilbiss Intellipap IntelliPap SmartFlex Settings Instellingen SmartFlex ChoiceMMed MD300 MD300 Respironics Respironics M-Series M-series Philips Respironics Philips Respironics System One System One ResMed ResMed S9 S9 EPR: EPR: Somnopose SomnoPose Somnopose Software SomnoPose Programma Zeo Zeo Personal Sleep Coach Persoonlijke Slaap Trainer Database Outdated Please Rebuild CPAP Data Verouderde database Gaarne gegevens opnieuw inlezen SmartFlex Mode SmartFlex instelling Intellipap pressure relief mode. IntelliPap drukhulp modus. Ramp Only Alleen tijdens aanloop Full Time Continu SmartFlex Level Instelling SmartFlex Intellipap pressure relief level. IntelliPap drukhulp instelling VPAP Adapt Aangepaste VPAP EPR EPR ResMed Exhale Pressure Relief ResMed uitademingsdrukhulp Patient??? Patient??? EPR Level EPR niveau Exhale Pressure Relief Level Niveau van uitademingsdrukhulp 0cmH2O 0 cmWK 1cmH2O 1 cmWK 2cmH2O 2 cmWK 3cmH2O 3 cmWK Weinmann Weinmann SOMNOsoft2 SOMNOsoft2 (% of time) (% van de tijd) By Pressure Drukafhankelijkheid Statistics at Pressure Drukafhankelijke statistiek %1 Session #%2 %1 Sessie #%2 SleepyHead is proudly brought to you by JediMark. SleepyHead wordt u met trots aangeboden door JediMark d MMM [ %1 - %2 ] %1 %1 Hide All Events Verberg alle incidenten Show All Events Toon alle incidenten Unpin %1 Graph %1 grafiek losmaken Pin %1 Graph %1 grafiek vastzetten %1: %2 %1% %2 {1:?} Relief: %1 Vermindering:%1 Hours: %1h, %2m, %3s Tijd: %1h, %2mm %3s Machine Information Apparaat-informatie Journal Data Dagboek gegevens SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead vond een oude dagboek, maar het schijnt dat de naam is gewijzigd: SleepyHead will not touch this folder, and will create a new one instead. SleepyHead zal niet doen met deze map, maar zal een nieuwe maken. Please be careful when playing in SleepyHead's profile folders :-P Weez voorzichtig met wijzigen van de profielmappen van SleepyHead :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. Om de een of andere reden heet SleepyHead geen dagboekgegevens in je profiel gevonden, maar wel meerdere mappen met dagboekgegevens. SleepyHead picked only the first one of these, and will use it in future: SleepyHead heeft de eerste gebruikt en zal deze blijven gebruiken. If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. Als de oude gegevens ontbreken, copieer dan alle Journal_XXXXXXX mappen naar deze map. CMS50F3.7 CMS50F CMS50F Loading %1 data... Gegevens van %1 laden PLease Wait... Even wachten... Snapshot %1 QextSerialPort No Error has occurred Geen fouten Invalid file descriptor (port was not opened correctly) Onjuiste bestandsbeschrijving (poort was niet correct geopend) Unable to allocate memory tables (POSIX) Kan geen geheugentabellen toewijzen (POSIX) Caught a non-blocked signal (POSIX) Ontving een niet-geblokkeerd signaal (POSIX) Operation timed out (POSIX) Bewerkingstijd verlopen (POSIX) The file opened by the port is not a valid device Het bestand verwijst naar een ongeldig apparaat The port detected a break condition De poort werd afgesloten The port detected a framing error (usually caused by incorrect baud rate settings) De poort gaf een foutmelding (waarschijnlijk de baudrate fout ingesteld) There was an I/O error while communicating with the port I/O fout bij communicatie met de poort Character buffer overrun Karakterbuffer overloop Receive buffer overflow Ontving buffer overloop The port detected a parity error in the received data De poort detecteerde een pariteitsfout in de gegevens Transmit buffer overflow Zendbuffer overloop General read operation failure Algemene leesfout General write operation failure Algemene schrijffout The %1 file doesn't exists Het bestand %1 bestaat niet Permission denied Toegang geweigerd Device is already locked Het apparaat is al afgesloten Unknown error: %1 Onbekende fout: %1 QuaGzipFile QIODevice::Append is not supported for GZIP QIODevice::Append is not supported for GZIP Opening gzip for both reading and writing is not supported Opening gzip for both reading and writing is not supported You can open a gzip either for reading or for writing. Which is it? Je kunt een gzip bestand openen voor lezen of schrijven, wat wil je? Could not gzopen() file Kan gzopen() bestand niet openen QuaZIODevice QIODevice::Append is not supported for QuaZIODevice QIODevice::Append is not supported for QuaZIODevice QIODevice::ReadWrite is not supported for QuaZIODevice QIODevice::ReadWrite is not supported for QuaZIODevice QuaZipFilePrivate ZIP/UNZIP API error %1 Fout bij in/uitpakken van %1 Report Form Formulier about:blank about:blank SessionBar No Sessions Present Geen sessies gevonden Statistics Please Import Some Data Graag eerst enige gegevens importeren SleepyHead is pretty much useless without it. SleepyHead is nogal nutteloos zonder gegevens. It might be a good idea to check preferences first,</br>as there are some options that affect import. Het is een goed idee om eerst enige instellingen te controleren, er zijn enkele opties die de import beinvloeden. First import can take a few minutes. De eerste keer kan enkele minuten duren. No CPAP Machine Data Imported Geen CPAP gegevens geimporteerd CPAP Statistics as of CPAP statistiek van No CPAP data available. Geen CPAP-gegevens beschikbaar. %1 day of CPAP Data, on %2. Dag %1 van CPAP-gegevens, op %2. %1 days of CPAP Data, between %2 and %3 %1 dagen met CPAP-gegevens, tussen %2 en %3 Details Details Most Recent Laatste ingelezen dag Last 7 Days Afgelopen 7 dagen Last 30 Days Afgelopen 30 dagen Last 6 months Afgelopen 6 maanden Last Year Afgelopen jaar RERA Index RERA-index Flow Limit Index Stroom Beperking Index (FLI) Hours per Night Uren per nacht Min EPAP Min. EPAP Max IPAP Max. IPAP Average Pressure Gemiddelde druk %1% Pressure %1% Druk Pressure Druk Average %1 Gemiddelde %1 %1% %2 %1% %2 Oximetry Statistics Oxymeter statistiek %1 day of Oximetry Data, on %2. %1 dag van oxymetriegegevens, op %2 %1 days of Oximetry Data, between %2 and %3 %1 dagen van oxymetrie-gegevens, tussen %2 en %3 Average SpO2 Gemiddelde SpO2 Minimum SpO2 Minimum SpO2 SpO2 Events / Hour SpO2 incidenten per uur % of time in SpO2 Events Percentage tijd in SpO2 gebeurtenissen Average Pulse Rate Gemiddelde polsslag Minimum Pulse Rate Minumum polsslag Maximum Pulse Rate Maximum polsslag Pulse Change Events / Hour Polsslag-incidenten per uur CPAP Statistics CPAP statistiek CPAP Usage CPAP gebruik Average Hours per Night Gemiddeld aantal uren per nacht Compliance Therapietrouw Therapy Efficiacy Therapie effectiviteit Leak Statistics Lekstatistiek Pressure Statistics Drukstatistiek Oximeter Statistics Oxymeterstatistiek Blood Oxygen Saturation Bloedzuurstof saturatie Pulse Rate Polsslag %1 Median %1 mediaan 90% %1 90% %1 Min %1 Min. %1 Max %1 Max. %1 %1 Index %1 index % of time in %1 Tijd in %1 % of time above %1 threshold Tijd boven de %1 grens % of time below %1 threshold Tijd onder de %1 grens I can haz data?!? haz = slang voor have Ik wil DATA?!? This lonely sleepy sheep has no data :( Dit eenzame slaperige schaap heeft geen gegevens :( Last Week Afgelopen week Last 6 Months Afgelopen halfjaar Last Session Laatste sessie No %1 data available. Geen %1 gegevens beschikbaar. %1 day of %2 Data on %3 %1 dagen met %2 gegevens van %3 %1 days of %2 Data, between %3 and %4 %1 dagen met %2 gegevens tussen %3 en %4 Usage Information Gebruiksinformatie Total Days Totaal aantal dagen Compliant Days Therapietrouw-dagen Days AHI &gt;5.0 Dagen met AHI &gt;5,0 Best&nbsp;%1 Beste&nbsp;%1 Worst&nbsp;%1 Slechtste&nbsp;%1 Best RX Setting Beste Rx instelling Worst RX Setting Slechtste Rx instelling Changes to Prescription Settings Wijzigingen in de voorgeschreven instellingen Days Dagen Pressure Relief Drukvermindering Fixed %1 %2 %1 %2 gerepareerd %1 - %2 %3 %1 - %2 %3 EPAP %1 %3 IPAP %2 %3 EPAP %1 %3 IPAP %2 %3 PS %4 over %1 - %2 %3 PS %4 boven %1 - %2 %3 EPAP %1, PS %2-%3 %4 EPAP %1, PS %2-%3 %4 EPAP %1-%2, PS %3-%4 %5 EPAP %1-%2, PS %3-%4 %5 FL FL Pr. Rel. Drukvermindering Pressure Settings Drukinstellingen EPAP %1 EPAP %1 PS %1 PS %1 IPAP %1 IPAP %1 APAP %1 - %2 APAP %1 - %2 CPAP %1 CPAP %1 Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. De markeringen betreffen uitsluitend periodes met meer dan %1 dagen aan opgeslagen gegevens. Fixed %1 %1 gerepareerd Machine Information Apparaat informatie First Use Eerste gebruik Last Use Laatste gebruik Summary Please Import Some Data Graag eerst enige gegevens importeren SleepyHead is pretty much useless without it. SleepyHead is nogal nutteloos zonder gegevens It might be a good idea to check preferences first,</br>as there are some options that affect import. Het is een goed idee om eerst enige instellingen te controleren, er zijn enkele opties die de import beinvloeden First import can take a few minutes. De eerste keer kan het even duren... No CPAP Machine Data Imported Geen CPAP gegevens geimporteerd CPAP Statistics as of CPAP statistiek van No CPAP data available. Geen CPAP-gegevens beschikbaar. %1 day of CPAP Data, on %2. Dag %1 van CPAP-gegevens, op %2. %1 days of CPAP Data, between %2 and %3 %1 dagen met CPAP-gegevens, tussen %2 en %3 Details Details Most Recent Laatste ingelezen dag Last 7 Days Afgelopen 7 dagen Last 30 Days Afgelopen 30 dagen Last 6 months Afgelopen 6 maanden Last Year Afgelopen jaar RERA Index RERA-index Flow Limit Index Stroom Beperking Index (FLI) Hours per Night Uren per nacht Min EPAP Min. EPAP Max IPAP Max. IPAP Average Pressure Gemiddelde druk %1% Pressure %1% Druk Pressure Druk Average %1 Gemiddelde %1 %1% %2 %1% %2 Oximetry Summary Oxymetrie overzicht %1 day of Oximetry Data, on %2. %1 dag van oxymetriegegevens, op %2 %1 days of Oximetry Data, between %2 and %3 %1 dagen van oxymetrie-gegevens, tussen %2 en %3 Average SpO2 Gemiddelde SpO2 Minimum SpO2 Minimum SpO2 SpO2 Events / Hour SpO2 incidenten per uur % of time in SpO2 Events Percentage tijd in SpO2 incidenten Average Pulse Rate Gemiddelde polsslag Minimum Pulse Rate Minumum polsslag Maximum Pulse Rate Maximum polsslag Pulse Change Events / Hour Polsslagincidenten per uur Usage Information Gebruiksinformatie Total Days Totaal aantal dagen Compliant Days Therapietrouw-dagen Days AHI &gt;5.0 Dagen met AHI &gt;5,0 Best&nbsp;%1 Beste &nbsp;%1 Worst&nbsp;%1 Slechtste &nbsp;%1 Best RX Setting Beste Rx instelling Worst RX Setting Slechtste Rx instelling Changes to Prescription Settings Wijzigingen in de voorgeschreven instellingen PS Min PS min. PS Max PS max. Min Pres. Min. druk Max Pres. Max. druk Days Dagen FL FL Pr. Rel. Drukvermindering The above has a threshold which excludes day counts less than %1 from the best/worst highlighting In het bovenstaande wordt een periode met minder dan %1 dagen niet in de analyse meegenomen Machine Information Apparaat informatie First Use Eerste gebruik Last Use Laatste gebruik UpdaterWindow SleepyHead Updater SleepyHead Updater A new version of $APP is available Er is een nieuwe versie van $APP Version Information Versie-informatie Release Notes Versie-opmerkingen about:blank about:blank Build Notes Build-opmerkingen Maybe &Later Misschien &later &Upgrade Now Nu &upgraden Please wait while updates are downloaded and installed... Wacht even tot de updates zijn gedownload en geïnstalleerd... Updates Updates Component Onderdeel Version Versie Size Grootte Progress Voortgang Log Log Downloading & Installing Updates Bestanden worden gedownload en geïnstalleerd &Finished &Klaar Checking for SleepyHead Updates Zoeken naar updates Requesting Aanvragen Saving as Opslaan als XML update structure parsed cleanly XML updatestructuur werd juist ontleed No updates were found for your platform. Er zijn geen updates gevonden. SleepyHead Updates SleepyHead Updates No new updates were found for your platform. Er zijn geen nieuwe updates gevonden. SleepyHead v%1, codename "%2" SleepyHead versie %1, codename "%2" platform notes Opmerkingen over het platform A new version of SleepyHead is available! Er is een nieuwe versie van SleepyHead beschikbaar! Shiny new <b>v%1</b> is available. You're running old and busted v%2 Er is een splinternieuwe <b>versie %1</b> beschikbaar. Jij werkt nog met de oude en versleten versie %2 An update for SleepyHead is available. Er is een update voor SleepyHead. Version <b>%1</b> is available. You're currently running v%1 Versie <b>%1</b> is beschikbaar. Je gebruikt nu versie %1 SleepyHead v%1 build notes Opmerkingen over SleepyHead versie %1 Update to QtLibs (v%1) Update naar QTlibs (versie %1) There was an error parsing the XML Update file. Er is een fout opgetreden tijdens het ontleden van het bijgewerkte XML-bestand. %1 bytes received %1 bytes ontvangen Redirected to Doorgestuurd naar File size mismatch for %1 Bestandsgrootte van %1 klopt niet File integrity check failed for %1 Fout in bestandsintegriteit van %1 Extracting Uitpakken You might need to reinstall manually. Sorry :( Wellicht opnieuw installeren?! Sorry ;-(( Ugh.. Something went wrong with unzipping. Oef! Er ging iets fout bij het uitpakken. Failed Mislukt Download Complete Download klaar There was an error completing a network request: ( Er was een fout bij een netwerkverzoek: :( Update Complete! Update klaar! Updates Complete. SleepyHead needs to restart now, click Finished to do so. Klaar met updaten. SleepyHead moet opnieuw worden opgestart, klik op Afsluiten. Update Failed :( Update mislukt :( Download Error. Sorry, try again later. Fout met downloaden. Probeer het later nog eens. Downloading & Installing Updates... Updates downloaden en installeren... Please wait while downloading and installing updates. Wacht even terwijl we downloaden en installeren. gGraph Snapshot gGraphView 100% zoom level 100% zoomniveau Restore X-axis zoom too 100% to view entire days data. Herstel het zoomniveau naar 100% om de hele grafiek te zien. Reset Graph Layout Herstel alle grafieken Resets all graphs to a uniform height and default order. Herstelt alle grafieken naar standaard hoogte en volgorde. Y-Axis Y-as Plots Grafieken CPAP Overlays apneu-markeringen Oximeter Overlays SpO2-markeringen Dotted Lines Stippellijnen Remove Clone Clone %1 Graph sleepyhead-0.9.8/Translations/Deutsch.de.ts0000644000175000017500000113420012412506713020236 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. Keine Datenübertragung vom Oximeter möglich. Please ensure you select 'upload' from the oximeter devices menu. Bitte stellen Sie sicher, dass Sie den'Upload' aus dem Menü des Oximeter Gerätes auswählt haben. CMS50Serial No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving. Es wurde keine gültige Startzeit für diese Oximeter-Sitzung zur Verfügung gestellt. Stellen Sie sicher, dass Sie Ihre Oximetrie-Daten vor der Startzeit gespeichert haben. Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine? Haben Sie daran gedacht, das Ihre Oximeter Aufnahme genau zur gleichen Zeit, wie Ihre CPAP-Geräte begonnen haben, zu starten? Import Failed Import fehlgeschlagen Import Failed. Wait for oximeter and try again. Import fehlgeschlagen. Warten Sie auf die Oximeter-Daten und versuchen Sie es erneut. Information Information The most recent CPAP Session time has been selected as the start of your oximetry session. If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter. Die letzte CPAP Sitzungszeit wurde als Beginn Ihrer Oxymetrie Sitzung ausgewählt. Wenn Sie vergessen haben, die heutigen CPAP-Daten zu importieren, sollten Sie Dies jetzt tun und dann wieder von Ihrem Oximeter importieren. Set Oximeter to Upload Oximeter zum hochladen verbunden Question Frage Please Wait, Importing... Bitte warten Sie bis der Import abgeschlossen ist... Processing... Verarbeitung... That's ok, I will use the time provided by your oximeter, however it will sync better next time if you start your oximeter recording at the same time your CPAP machine starts up. Um eine ordnungsgemäße Syncronisation zu gewährleisten starten Sie bitte Ihr CPAP-Gerät gleichzeitig mit Ihrem Oximeter-Gerät. If you haven't set your oximeter clock you will have to manually edit this time before saving this oximetry session. Wenn Sie Ihre Oximeter Uhr nicht eingestellt haben, müssen Sie Diese vor dem Speichern der Oxymetrie-Sitzung, manuell festlegen. It looks like your oximeter doesn't provide a valid start time, I'm going to set this oximetry session starting time to the CPAP starting time anyway. Es sieht aus als ob Sie Ihrem Oximeter keine gültige Startzeit gegeben haben. Das Programm wird die Oximeter Startzeit auf die Startzeit Ihres CPAP-Gerätes festlegen. You may have to adjust it manually if you remember the real start time before saving this session. Eventuell müssen Sie die richtige Startzeit vor dem speichern der Sitzung manuell anpassen. (Also, did you remember to import todays CPAP data first?) (Haben Sie daran gedacht, zuerst die heutigen CPAP-Daten zu importieren?) The most recent CPAP Session time has been selected as the start of your oximetry session. Die letzte CPAP Sitzungszeit wurde als Beginn Ihrer Oxymetrie Sitzung ausgewählt. If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter. Wenn Sie vergessen haben, die letzten CPAP-Daten zu importieren, tun Sie das jetzt und importieren Sie dann die Oximeterdaten erneut. No valid start time was provided for this oximeter session. Es wurde keine gültige Startzeit, für diese Oximeter-Sitzung, zur Verfügung gestellt. You will likely have to adjust your oximeter sessions start time before saving. Sie werden wahrscheinlich die Oximeter Sitzungs Startzeit vor dem Speichern einstellen müssen. Something went wrong with reading from the Oximeter. Das lesen aus dem Oximeter-Gerät hat nicht funktioniert. Please wait for oximeter to finish tranmitting than try restarting import again. Bitte warten Sie bis das Oximeter fertig übertragen hat und starten Sie dann erneut den Import. Daily B B u u U1 U1 U2 U2 U3 U3 i i %1% %1% ... ... Avg Durchschnitt Big Groß Med Med 100% 100% Form Form Next Weiter Prev Zurück Wake Aufgewacht Color Farbe Int. Pulse Int. Puls Notes Aufzeichnungen Reset Rücksetzen Sleep Zu Bett Small Klein Show all graphs Alle Diagramme zeigen Journal Journal Reset the graph heights to uniform sizes Stellen Sie die Diagramme auf eine einheitliche Höhe ein Position Sensor Sessions Position Sensor Sitzungen Add Bookmark Neues Lesezeichen Remove Bookmark Lesezeichen entfernen Pick a Colour Wählen Sie eine Farbe Complain to your Equipment Provider! Beschweren Sie sich bei Ihren Anbieter! Session Information Sitzungsinformationen Sessions all off! Alle Sitzungen schließen! Oximetery Sessions Oximetrie Sitzungen %1 event %1 Ereignis Go to the most recent day with data records Zum letzten Tag mit Datensätzen Machine Settings Geräteeinstellungen No Graphs On! Keine Diagramme an! <b>Please Note:</b> This day just contains summary data, only limited information is available . <b> Bitte beachten Sie: </ b> Dieser Tag enthält nur zusammengefasste Daten und es stehen nur begrenzte Informationen zur Verfügung. B.M.I. B.M.I. Sleep Stage Sessions Schlafstadium Sitzungen Oximeter Information Oximeter Informationen Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked. Oximetriedaten existieren für diesen Tag, aber die Zeitstempel sindl unterschiedlich, so dass die Grafiken nicht verknüpft werden. Ctrl+B Ctrl+B Ctrl+I Ctrl+I Events Ereignisse CPAP Sessions CPAP Sitzung Medium Mittel Zoom fully out Vergrößern voll aus Starts Startet Sorry, your machine only provides compliance data. Es tut uns leid, Ihr Gerät bietet nur Compliance-Daten. Weight Gewicht This bookmarked is in a currently disabled area.. Dies ist ein mit Lesezeichen derzeit deaktivierter Bereich .. Zombie Nicht gut Bookmarks Lesezeichen %1 events %1 Ereignisse events ereignisse BRICK :( BLOCK :( Int. SpO2 Int. SpO2 Event Breakdown Ereignis Pannen Selection AHI Auswahl AHI SpO2 Desaturations SpO2 Entsättigungen Awesome Sehr gut Pulse Change events Pulsereignis ändern SpO2 Baseline Used SpO2-Baseline Gebraucht Zero hours?? Null-Stunden?? Go to the previous day Zum vorherigen Tag Drop down this list to show/hide available graphs. Lassen Sie sich diese Liste der Grafiken / verbergen verfügbar zeigen. Bookmark at %1 Lesezeichen bei %1 Statistics Statistiken Events/hour Ereignisse/Stunde Breakdown Aufschlüsselung Unknown Session Unbekannte Sitzung Sessions exist for this day but are switched off. Sitzungen existieren heute sind aber ausgeschaltet. PAP Mode: %1<br/> PAP Modus: %1<br/> Duration Dauer View Size Größen Hide all graphs Ausblenden aller Diagramme Impossibly short session Sehr kurze Sitzung No Graphs :( Keine Diagramme :( No %1 events are recorded this day Keine %1-Ereignisse werden an diesem Tag aufgezeichnet Show or hide the calender Ein / Aus Kalender One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. Eine oder mehrere Signalaufzeichnung für diese Sitzung hatte fehlerhafte Quelldaten. Einige Wellenlagerung Punkte können nicht richtig übereinstimmen. I'm feeling... Ich fühle mich ... No data available Keine Daten vorhanden Go to the next day Gehen Sie auf den nächsten Tag Session Start Times Sitzungsstartzeit Session End Times Sitzungsendzeit %1%2 %1% {1%2?} This day just contains summary data, only limited information is available . Dieser Tag enthält nur zusammengefasste Daten. Es stehen nur begrenzte Informationen zur Verfügung. Time over leak redline Zeit über Leck rote Linie Machine Settings Unavailable Geräteeinstellungen nicht verfügbar EPR:%1 EPR_LEVEL:%2 EPR:%1 EPR_LEVEL:%2 This day has missing pressure, mode and settings data. An diesem Tag fehlen die Einstellungsdaten für den Druck. Summary Only :( Nur die Zusammenfassung: ( UF1 UF1 UF2 UF2 Flags: Flaggen: Total time in apnea Gesamtzeit des Apnoe Total ramp time Gesamte Rampenzeit Time outside of ramp Außerhalb der Rampenzeit AHI excluding ramp AHI ohne Rampe Hide all events Alle Ereignisse einblenden Show all events Alle Ereignisse anzeigen Flags Flaggen Graphs Diagramme "Nothing's here!" Bob is bored with this days lack of data. ExportCSV ... ... AHI AHI End Ende %1% %1% Avg Gem Date Datum End: Ende: Quick Range: Zeitspanne: Daily Täglich Event Ereignis Start Start Last Fortnight Letzten Vierzehn Tage Most Recent Day Neuste Tag Count Land Filename: Dateiname: Select file to export to Wählen Sie die Datei, um zu Exportieren Resolution: Auflösung: Cancel Aufheben Dates: Termine: Custom In Gebrauch Export Export Start: Start: Data/Duration Daten / Dauer CSV Files (*.csv) CSV Dateien (*.csv) Last Month Letzter Monat SleepyHead_ SleepyHead_ Last 6 Months Letzten 6 Monate Total Time Gesamte Zeit DateTime Datum-Zeit Session Count Sitzungs Anzahl Session Sitzung Everything Alles Last Week Letzte Woche Last Year Letztes Jahr Export as CSV Export in CSV Datei Sessions_ Sitzungen_ Details Details Summary_ Zusammenfassung_ Details_ Details_ Sessions Sitzungen FPIconLoader Import Error Import Fehler This Machine Record cannot be imported in this profile. Dieser Geräte-Datensatz kann in diesem Profil nicht importiert werden. The Day records overlap with already existing content. Die Aufzeichnungen dieses Tages überschneiden sich mit bereits vorhandenen Inhalt. MainWindow - - F4 F4 F5 F5 F6 F6 F7 F7 F8 F8 ... ... F11 F11 F12 F12 Yes Ja CPAP CPAP Gah! Bah! Help Hilfe CPAP data was recently purged and needs to be re-imported. CPAP-Daten wurden kürzlich gereinigt und mussen neu importiert werden. DISCLAIMER: HAFTUNGSAUSSCHLUSS: About SleepyHead Über SleepyHead &Data &Daten &File &Datei &Help &Hilfe &View &Ansicht There was a problem opening Somnopose Data File: Es gab ein Problem beim Öffnen CSV Datendatei: &About SleepyHead &Über SleepyHead E&xit &Schließen Daily Täglich Note: Hinweis: Import &ZEO Data Import &ZEO Daten Copyright: Urheberrecht: James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, and Sean Stangl. James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99 und Sean Stangl. MSeries Import complete M-Serie komplett Importiert There was an error saving screenshot to file "%1" Es gab einen Fehler beim Speichern Screenshot in Datei "%1" This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. Diese Software wurde entwickelt, um Ihnen bei der Überprüfung der von CPAP-Geräten produzierten Daten, in der Behandlung von verschiedenen Schlafstörungen zu helfen. Importing Data Importieren von Daten No CPAP data card detected, launching file dialog... Kein CPAP-Datenkarte erkannt, Dateidialog starten ... Select another folder Wählen Sie einen anderen Online Users &Guide Online &Handbuch The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. Der Autor kann nicht von Nutzern, die sich selbst oder Andere durch den Gebrauch oder Missbrauch dieser Software schaden, haftbar gemacht werden. Please wait, launching file dialog... Bitte warten, Dialog-Datein starten ... View O&ximetry &Oximetrieansicht Online Help Resources Online Hilfe View &Welcome &Willkommensansicht Currenly supported machines: Currenly unterstützte Geräte: Loading Data Lade Daten This software comes with absolutely no warranty, either express of implied. Diese Software arbeitet ausdrücklich ohne Garantie. There was a problem opening MSeries block File: Es gab ein Problem beim Öffnen von M-Serie Block-Datei: <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, <a href='http://www.apneuvereniging.nl/forum'>ApneuVereinigung</a>, SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. SleepyHead ist mit der <a href="http://qt-project.org"> Qt Application Framework </ a> erstellt. Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters Contec CMS50D +, CMS50E und CMS50F (nicht 50FW) Pulsoximeter Kudos & Credits Lob & Dank Recalculations are complete, the application now needs to restart to display the changes. Warten Sie bis die Rückrechnungen abgeschlossen sind, Anwendung jetzt neu zu starten, um die Änderungen anzuzeigen. Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV-Modelle) &copy;2011-2014 Build Date Herstellungsdatum Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt Bitte um einen Wiederaufbau von SleepyHead mit Qt 4.8.5 oder höher, das Drucken verursacht einen Absturz mit dieser Version von Qt Philips Respironics System One (CPAP, Auto, BiPAP & ASV models) Philips Respironics System One (CPAP, AutoPAP, BiPAP & ASV Modelle) &About &Schließen Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ Vergessen Sie nicht, auf <a href="http://www.facebook.com/SleepyHeadCPAP"> Facebook </ a> oder <a href mag / +1 SleepyHead = "http://plus.google.com/ u/0/b/101426655252362287937 "> Google+ &Link Graph Groups &Link-Diagramm Gruppen Further Information Weitere Informationen View &Daily &Tagesansicht View &Overview &Übersichtsansicht Import Problem Couldn't find any new Machine Data at the locations given Import Problem Konnte keine neuen Gerätedaten an diesem Standorten finden Access to Preferences has been blocked until recalculation completes. Zugriff auf Einstellungen wurde blockiert, bis die Neuberechnung abgeschlossen ist. Import RemStar &MSeries Data Import REMSTAR & M-Serie Daten Loading Laden &Help Browser &Browser Hilfe Got a neat idea on how to improve SleepyHead? Check out SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent</a> Haben Sie eine gute Idee, wie man SleepyHead verbessern kann? Schauen Sie unter SleepyHead <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/"> Idea Torrent </ a> Do you have a CMS50[x] Oximeter? One is required to use this section. Haben Sie eine CMS50 [x] Oximeter? Eines ist erforderlich, um diesen Abschnitt zu verwenden. &Current Selected Day &Daten des ausgewählten Tages Change &User &Benutzer ändern All data for current CPAP machine Alle Daten für das aktuelle CPAP-Gerät In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. In dem Update-Code, verwendet Sleepyhead <a href="http://sourceforge.net/projects/quazip"> QuaZip </ a> von Sergey A. Tachenov, die eine C + +-Wrapper über Gilles Vollant die PLZ / UNZIP Paket ist. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. Plus ein paar <a href='qrc:/docs/usage.html'> Verwendungshinweise </ a>, und einige wichtige Informationen für Mac-Nutzer. Friendly forums to talk and learn about Sleep Apnea: Bitte sprechen Sie freundlich in den Foren um mehr über SleepyHead zu erfahren: Please wait, scanning for CPAP data cards... Bitte warten, Scannen von CPAP-Datenkarten ... View S&tatistics Statistik &anzeigen Monthly Monatlich Cancel Schließen Change &Language &Sprache auswählen This software is released under the GNU Public License v3.0<br/> Diese Software wird unter der GNU Public Lizenz v3.0 veröffentlicht <br/> Loading Event Data Lade Ereignisdaten SleepyHead's Online <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> SleepyHead`s Online <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> No guarantees are made regarding the accuracy of any data this program displays. Bezüglich der Genauigkeit der Daten übernehmen wir keine Garantie. It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module. Es nutzt die Cross-Plattform <a href="http://code.google.com/p/qextserialport"> QExtSerialPort </ a>-Bibliothek für Zugriff auf serielle Ports in dem Pulsoximetrie-Modul. Import Import Are you sure you want to purge all CPAP data for the following machine: Sind Sie sicher, dass Sie alle CPAP-Daten für das folgenden Gerät reinigen wollen: The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. Der Autor und alle Mitwirkenden übernehmen keinerlei Verantwortung für Schäden, Probleme aus der Nutzung oder falschen Verwendung dieser Software. It comes with no guarantee of fitness for any particular purpose. Ohne Garantie. Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Besonderen Dank an Pugsy von <a href='http://cpaptalk.com'> CPAPTalk </ a> für ihre Hilfe mit Dokumentation und Tutorials, sowie alle, die sich durch die Prüfung geholfen und teilen ihre CPAP-Daten. Would you like this done automatically from the Backup Folder? Möchten Sie diesen Import Standort für das nächste Mal merken? Please wait, importing from backup folder(s)... Bitte warten, Import von Backup-Ordner (n) ... Welcome to SleepyHead Willkommen bei SleepyHead SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. SleepyHead wurde durch einen Software-Entwickler mit persönlichen Erfahrungen mit einer Schlafstörung entwickelt und durch das Feedback vieler anderer Tester, die sich mit ähnlichen Bedingungen auseinandersetzen müssen. Restart Required Neustart erforderlich ResMed S9 Oximeter Attachment ResMed S9 Oxymeter Adapter &Bookmarks &Lesezeichen Right &Sidebar &Seitenleiste rechts This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. Dies ist KEINE medizinische Software, es ist nur ein Recherche-Tool, welches eine visuelle Interpretation der Daten, welche von unterstützten Geräten aufgezeichnet wird, bietet. Click here to choose a folder Klicken Sie hier, um einen Ordner zu wählen, &Rebuild Oximetry Indices &Wiederaufbau Oximeter-Indizes branch Zweig Translators: Übersetzer: Profile Profile View Statistics Statistiken anzeigen CPAP Data Located CPAP-Daten liegen an Access to Import has been blocked while recalculations are in progress. Der Zugang zu Import wurde blockiert, während Neuberechnungen im Gange sind. Sleep Disorder Terms &Glossary &Schlafstörungen Nutzungswörterbuch This is a beta release, some features may not yet behave as expected. Dies ist eine Beta-Version und einige Funktionen funktionieren noch nicht wie erwartet. Copyright Urheberrechte about:blank Leere Seite SleepyHead Project Page SleepyHead-Projekt-Seite *** <u>Use at your own risk</u> *** *** <u> Benutzung auf eigene Gefahr </ u> *** &Records &Datensätze Use &AntiAliasing Verwenden Sie &Antialiasing I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. Ich empfehle, nicht mit diesem Browser zu Surfen. Es wird funktionieren, aber er ist vor allem als Hilfe-Browser gedacht. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia Über <a href='http://en.wikipedia.org/wiki/Sleep_apnea'> Schlafapnoe </ a> auf Wikipedia This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. Dies ist <font color='red'> <u> KEINE </ u> </ font> medizinische Software. Diese Anwendung ist nur ein Daten-Viewer und keine Garantie hinsichtlich der Genauigkeit oder Richtigkeit von Berechnungen oder Daten, die angezeigt werden. Somnopause Data Import complete Somnopause Data Import abgeschlossen Report Mode Report Modus Bugfixes, Patches and Platform Help: Fehlerbehebung, Patches und Platform-Hilfe: <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary"> Glossar der Schlafstörung Bedingungen </ a> <br/> &Profiles &Profile DeVilbiss Intellipap (Auto) DeVilbiss Intellipap (Auto) SleepyHead, brought to you by Jedimark SleepyHead, entwickelt von Jedimark Use this software entirely at your own risk. Benutzen Sie diese Software auf eigenes Risiko. Printing Disabled Drucken abschalten Standard Standard There was a problem opening ZEO File: Es gab ein Problem beim Öffnen der ZEO Datei: Loading... Laden... CPAP Datacard structures were detected at the following locations: CPAP Datacard Strukturen wurden an folgenden Orten festgestellt: Statistics Statistiken &Statistics &Statistiken Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. Bitte denken Sie daran, den Import vom Stammordner oder Laufwerkbuchstaben der Datenkarte durchzuführen, und nicht auf einem Unterordner verweisen. Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here. Arie Klerk (Dutch), Steffen Reitz (Deutsch), und Andere, die ich noch hier hinzufügen werde. Ctrl+Tab Ctrl+Tab &Support SleepyHead Development SleepyHead Entwicklung & Support <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> <html> <head/> <body> <p> <span style=" font-weight:600;"> Achtung: </ span> Das ist eine Pre-Release-Software. Einige Teile dieses Programms können noch nicht, wie vorgesehen, funktionieren . </ p> </ body> </ html> 3rd Party Libaries: ResMed S9 models (CPAP, Auto, VPAP) ResMed S9 Modellen (CPAP, AutoPAP, VPAP) Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. Ihr Arzt sollte Ihre erste und einzige Quelle der Führung über die wichtige Frage der Verwaltung Ihrer Gesundheit sein. &Advanced &Fortgeschrittene Zeo CSV Import complete Zeo CSV Import abgeschlossen Question Frage &Import Data &Daten Importieren Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. Hier sind die <a href='qrc:/docs/release_notes.html'> Release Notes </ a> für diese Version. This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. Diese Software ist NICHT geeignet für die medizinische Diagnostik, CPAP complaince Berichterstattung und ähnliche Zwecke.. Print &Report &Drucken &Reset Graph Layout &Zurücksetzen der Diagrammansicht Performance will be degraded during these recalculations. Die Leistung wird in diesen Neuberechnungen abgebaut werden. This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. Diese Software ist frei unter der <a href="qrc:/COPYING"> GNU Public Lizenz </ a> veröffentlicht. SleepyHead SleepyHead If you can read this, the restart command didn't work. Your going to have to do it yourself manually. Wenn Sie dies lesen können, zählt der Befehl Neustart nicht. manuell Neustarten. SleepyHead Wiki SleepyHead Wiki Take &Screenshot &Bildschirmverwaltung Overview Übersicht Exp&ort &Exportieren Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. Vielen Dank für die Verwendung von SleepyHead. Wenn Sie innerhalb Ihrer Mittel Ressourcen finden, beachten Sie bitte die Förderung zukünftiger Entwicklung durch eine Spende über PayPal. Show Debug Pane Debug-Fenster anzeigen Revision: Überprüfung: Task Completed Erledigt &Edit Profile &Profil bearbeiten Import Reminder Import Erinnerung Recalculations are now complete. Neuberechnungen sind nun abgeschlossen. Welcome Willkommen Import &Somnopose Data Import & CSV Daten James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone. James Marshall, Reich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Schlaufen, manders99, Sean Stangl und Roy Stone. SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> SleepyHead ist <a href='http://www.sourceforge.net/projects/sleepyhead'> Projekt-Website </ a> auf Sourceforge <br/> Check for &Updates Suche nach &Updates Screenshot saved to file "%1" Screenshot Datei gespeichert "%1" &Preferences &Einstellungen Fisher & Paykel ICON (CPAP, Auto) Fisher & Paykel ICON (CPAP, Auto) Recalculating Summaries Neuberechnung Zusammenfassungen &Fullscreen Toggle &Vollbild umschalten Please report any bugs you find to SleepyHead's SourceForge page. Bitte melden Sie alle Fehler, die Sie finden, auf der SleepyHead Sourceforge-Seite. &Frequently Asked Questions &Häufig gestellte Fragen &Purge CPAP Data &Säuberung der CPAP Daten qrc:/docs/index.html qrc:/docs/index.html Shift+F2 Shift+F2 Oximetry Oxymetrie Please wait, SleepyHead is importing data... Bitte warten, SleepyHead ist beim Importieren von Daten ... Arie Klerk (Dutch), Steffen Reitz (German). Arie Klerk (Dutch), Steffen Reitz (Deutsch). Data successfully imported from the following locations Die Daten wurden erfolgreich von folgenden Orten importiert Recalculating Indices Neuberechnung der Indizes <a href='http://s7.zetaboards.com/Apnea_Board/index'>Apnea Board</a> <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) (Das Programm unterstützt keine SSL-Verschlüsselung, so dass es keine gute Idee ist, Ihre Passwörter oder persönliche Daten irgendwo einzugeben.) Data Folder Location Datenordner Standort Change &Data Folder &Datenordner ändern License: Lizenz: &Navigation &Navigation Are you sure? Sind Sie sicher? Date Range Datumsbereich Purge Oximetery Data Bereinigen der Oximetrie Daten Purge &Current Selected Day Bereinigen & aktualisieren des aktuell ausgewählten Tages Current Days Aktuelle Tage Data successfully imported from the following locations: Die Daten wurden erfolgreich von folgenden Orten importiert: Couldn't find any new Machine Data at the locations given. Es konnten keine neuen Gerätedaten an den Standorten gefunden werden. Import Problem Importproblem Build Date: %1 %2 Erstellungsdatum: %1 %2 Graphics Engine: %1 Grafikfunktion: %1 Data Folder Location: %1 Datenordner Stanort: %1 Are you sure you want to purge all CPAP data for the following machine: Sind Sie sicher, dass Sie alle CPAP-Daten für das folgenden Gerät reinigen wollen: Not all session data could be removed, you have to delete the following folder manually. Da nicht alle Sitzungs-Daten entfernt werden konnten, müssen Sie den folgenden Ordner manuell löschen. Machine data has been successfully purged. Gerätedaten wurden erfolgreich gelöscht. Would you like to reimport from the backup folder? Möchten Sie aus dem Backup-Ordner importieren? Please wait, importing... Bitte warten Sie, bis der Import abgeschlossen ist... Are you sure you want to delete oximetry data for %1 Sind Sie sicher, dass Sie die Oximetriedaten löschen möchten %1 <b>Please be aware you can not undo this operation!</b> <b>Bitte beachten Sie, dass Sie diesen Vorgang nicht rückgängig machen können!</b> Select the day with valid oximetry data in daily view first. Wählen Sie den Tag mit gültigen Oximetriedaten in der täglichen Ansicht zuerst. Exit Ausgang O&ximetry Wizard O&ximetrie Assistent <b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum. <b> Achtung: </ b> Diese Pre-Release-Build ist nur für Beta-Tester gedacht. Bitte <b> NICHT </ b> Aktien außerhalb des SleepyHead Testing Forums. Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version. Bitte melden Sie Fehler für diesen Build auf dem SleepyHead Testing Forum, überprüfen Sie aber zuerst die Release Thread, um sicherzustellen, dass Sie die aktuellste Version verwenden. When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. Wenn Sie Fehler melden, stellen Sie bitte sicher, dass Sie die SleepyHead Versionsnummer, Betriebssystem Details und CPAP-Geräte-Modelldaten angeben. <b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes. <b> Achtung: </ b> Die Berichte die die Software erzeugt sind nicht für die Einhaltung oder medizinische Diagnosezwecke geeignet. These messages are only a temporary feature. Some people thought they were an error. Diese Meldungen sind nur einer temporären Funktion zugeordnet. Einige Nutzer dachten, dass die Meldungen Fehler waren. Choose a folder Wählen Sie einen Ordner SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Benutzerhandbuch</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Häufig gestellte Fragen</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossar der Schlafstörung AGB</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> Toggle &Line Cursor Knie & Linien Pfeiltasten Ctrl+S Ctrl+S Rebuild CPAP Data Wiederaufbau der CPAP Daten &Automatic Oximetry Cleanup &Automatische Bereinigung der Oxymetrie Foo Foo Please insert your CPAP data card... Bitte benutzen Sie Ihre CPAP-Datenkarte ... Are you sure you want to rebuild all CPAP data for the following machine: Sind Sie sicher, dass Sie alle CPAP Daten für das folgende Gerät neu erstellen möchten: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. Bitte beachten Sie, dass dies zu einem Verlust der Daten führen kann, wenn die interne Sicherungen von SleepyHead deaktiviert ist. For some reason, SleepyHead does not have internal backups for the following machine: Aus irgendeinem Grund hat SleepyHead keine interne Sicherungen für folgendes Gerät: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Vorausgesetzt, Sie haben <i> <b> eigene </ b> Backups für ALLE Ihre CPAP-Daten </ i>, die Sie noch vervollständigen können erstellt. Aber Sie müssen die Backups manuell wiederherstellen. Are you really sure you want to do this? Sind Sie wirklich sicher, dass Sie das tun wollen? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: Ein Datenberechtigungsfehler ist aufgetreten. Sie müssen den Ordner selbst löschen: Because there are no internal backups to rebuild from, you will have to restore from your own. Es existiert keine interne Datensicherung. Sie müssen Ihre eigene verwenden. Would you like to import from your own backups now? (you will have no data visible for this machine until you do) Möchten Sie jetzt Ihr eigenes Backup importieren? (Es wird nichts angezeigt bevor Sie nicht Ihre Daten einspielen) A %1 file structure for a %2 was located at: Eine%1 Dateistruktur für eine %2 wurde in: A %1 file structure was located at: Eine%1 Dateistruktur befindet sich unter: Would you like to import from this location? Möchten Sie von diesem Ort impoertieren? Specify einzeln Ausführen Navigation Navigation Bookmarks Lesezeichen Records Aufnehmen Purge ALL CPAP Data Säuberung aller CPAP-Daten F10 F10 Ctrl+L Ctrl+L Daily Sidebar Randleiste täglich Daily Calendar Kalender täglich F9 F9 Imported %1 CPAP session(s) from %2 Importiert%1 CPAP-Sitzung(en) von %2 Import Success Erfolgreicher Import Already up to date with CPAP data at %1 Bereits aktuelle CPAP Daten %1 Up to date Neuster Sand Couldn't find any valid Machine Data at %1 Hier konnten keine gültigen Gerätedaten gefunden werden %1 You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: Sie sind dabei, <font size=+2>Auslöschen</font> SleepyHead der Gerätedatenbank für folgendes Gerät: Note as a precaution, the backup folder will be left in place. Als Vorsichtsmaßnahme werden die Backup Ordner an Ort und Stelle belassen. Are you <b>absolutely sure</b> you want to proceed? Sind Sie <b>absolut sicher</b> das Sie fortfahren möchten? Exp&ort Data Backup &Journal <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Please ensure you are running the latest version before reporting any bugs. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! This red message line is intentional, and will not be a feature in the final version... Data Folder Location: <a href="file://%1">%2</a> James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. %1's Journal Choose where to save journal XML Files (*.xml) MinMaxWidget Auto-Fit Defaults Override The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. The Minimum Y-Axis value.. Note this can be a negative number if you wish. The Maximum Y-Axis value.. Must be greater than Minimum to work. Scaling Mode This button resets the Min and Max to match the Auto-Fit NewProfile ASV ASV APAP APAP CPAP CPAP Male Männlich &Back &Zurück &Next &Weiter TimeZone Zeitzone Email E-mail Phone Telefon Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. Alle Berichte die erzeugt werden, sind nur zum persönlichen Gebrauch und in keiner Weise für die Einhaltung medizinischer Diagnosezwecke geeignet. SleepyHead is copyright &copy;2011-2014 Mark Watkins SleepyHead ist copyright &copy;2011-2014 Mark Watkins The author will not be held liable for <u>anything</u> related to the use or misuse of this software. Der Autor haftet nicht für <u> nichts </ u>, was mit den Gebrauch oder Missbrauch dieser Software im Zusammenhang steht. &Close this window &Fenster schliessen Edit User Profile Benutzerprofil bearbeiten qrc:/docs/update_notes.html qrc:/docs/intro.html CPAP Treatment Information CPAP-Behandlung Information Password Protect Profile Projektpasswort Accuracy of any data displayed is not and can not be guaranteed. Für die Korrektheit der Daten kann nicht garantiert werden. D.O.B. Geb. Dat. Female Weiblich Gender Geschlecht Height Größe Contact Information Kontaktinformationen Locale Settings Ländereinstellungen SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. SleepyHead ist nur als Daten-Viewer geeignet und definitiv kein Ersatz für eine kompetente medizinische Anleitung für Ihren Arzt bestimmt. Welcome to SleepyHead Willkommen bei SleepyHead CPAP Mode CPAP Modus Select Country Land wählen PLEASE READ CAREFULLY BITTE LESEN SIE Untreated AHI Unbehandelter AHI Keep the kids out.. Nothing more.. This isn't meant to be uber security. Die Software ist nichts für Kinder. metric metrisch Address Adresse I agree to all the conditions above. Ich bin mit allen oben genannten Bedingungen einverstanden. DST Zone Automatische Sommerzeit archiac archaïsch RX Pressure RX Druck Password Passwort Use of this software is entirely at your own risk. Die Nutzung der Software erfolgt auf eigene Gefahr. Passwords don't match Passwörter stimmen nicht überein First Name Vorname Last Name Nachname Country Land &Cancel &Schließen &Finish &Ende Bi-Level Bi-Level Profile Changes Profiländerungen Personal Information (for reports) Persönliche Informationen (für Berichte) User Name Benutzername SleepyHead SleepyHead SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. SleepyHead ist frei unter der <a href='qrc:/COPYING'> GNU Public License </ a> veröffentlicht worden, und ist ohne Garantie und ohne Ansprüche, für die Eignung eines bestimmten Zwecks. This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. Diese Software wird entwickelt, um Ihnen bei der Überprüfung der von Ihrem CPAP-Geräte und zugehörige Ausrüstung erzeugten Daten zu unterstützen. User Information Benutzerinformationen Empty Username Kein Benutzername ...twice... ... zweimal ... Doctors Name Name des Arztes Doctors / Clinic Information Name des Arztes in der Klinik Practice Name Name der Praxis Date Diagnosed Diagnosedatum TextLabel Textlabel Accept and save this information? Akzeptieren und speichern Sie diese Informationen? Patient ID Patient-ID Please provide a username for this profile Bitte geben Sie einen Benutzernamen für dieses Profil an about:blank Leere Seite Overview ... ... L/b L/b % PB % PB %PTB %PTB End: Ende: Form Form Target Ventilation (L/min) Ziel Lüftung (L/min) Usage Verwendung Respiratory Disturbance Index Atem- Störung Index Show all graphs Alle Diagramme zeigen Reset view to selected date range Ansicht zurücksetzen zu ausgewählten Zeitraum Zombie Meter Mir geht es Drop down to see list of graphs to switch on/off. Drop-Down-Liste, Diagramme, Ein-/ Ausschalten. Peak RDI Shows RDI Clusters (RDI/hr) Spitzen RDI Zeigt FEI-Cluster (RDI/h) Peak AHI Shows AHI Clusters (AHI/hr) Spitzen AHI Zeigt AHI-Cluster (AHI/h) Usage (hours) Verwendung (Stunden) Last Three Months Letzten 3 Monate Respiratory Rate (breaths/min) Atem- Rate (Atemzüge / min) No Graphs On! Keine Diagramme an! Custom Gebrauch How you felt (0-10) Wie fühlen Sie sich? (0-10) Graphs Diagramme Range: Zeitraum: Start: Start: SensAwake (count) SensAwake (Anzahl) Last Month Letzter Monat Apnea Hypopnea Index Apnoe Hypopnoe Index % in PB % in PB Last 6 Months Letzten 6 Monate Body Mass Index Body Masse Index Minute Ventilation (L/min) Atem-Minuten Volumen (L/min) Oxygen Saturation (%) Sauerstoffsättigung in (%) Session Times Anwendungszeit Last Two Weeks Letzten zwei Wochen Everything Alles Last Week Letzte Woche Last Year Letztes Jahr breaths/min Atmungen pro Minuten Toggle Graph Visibility Umschalten Sichtbarkeit Diagramm Peak AHI Spitzen AHI Peak RDI Spitzen RDI Events/Hr Ereignisse/h Hide all graphs Alle Diagramme zeigen Periodic Breathing (% of night) periodischer Atem (% der Nacht) Patient Triggered Breaths (%) vom Patient ausgelöste Atemzüge (%) Session Times (hours) Sitzungs Zeiten (Stunden) (count) (Anzahl) Last Two Months Letzten 2 Monate Tidal Volume (ml) Atem-Zug- Volumen (ml) % in %1 % in %1 %1 (% of night) %1 (% der Nacht) Large Leaks (% of night) Große Lecks (% der Nacht) % %1 % %1 OximeterImport Dialog Dialog Oximeter Import Wizard Oximeter Import-Assistenten <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Diese Übersetzung bitte nicht durchführen, weil eine neue Aufteilung stattfinden wird)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> Skip this page next time. Überspringen Sie diese Seite das nächste Mal. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> <html><head/><body><p>SleepyHead unterstütztl Contec CMS50D + / E / F Serien Oximeter, <br/>sowie Daten-Dateien welche durch die Software von Choicemmed MD300W1 Oximeter "erzeugt werden.</p></body></html> Where would you like to import from? Von wo wollen Sie importieren? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> <html><head/><body><p>Diese Option ermöglicht den Import (über Kabel) aus Ihrem Oximeter.</p><p>Nach der Auswahl dieser Option, werden einige Einstellungen im Oximeter erforderlich sein um den Upload zu starten.</p></body></html> Directly from a recording on a device Direkt von einer Aufnahme auf einem Gerät <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> <html><head/><body><p>Sollten Sie das Pulsoximeter über Nacht an einem PC betreiben kann diese Option sehr nützlich sein um Herzrhythmusstörungen zu erkennen.</p></body></html> Record attached to computer overnight (provides plethysomogram) Waren Sie über Nacht an den PC angeschlossen benutzen Sie das (Plethysonogramm) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> <html><head/><body><p>Diese Option ermöglicht den Import von Dateien, welche durch Software von SpO2 Review erzeugt wurde.</p></body></html> Import from a datafile saved by another program, like SpO2Review Import aus einer Datendatei von einem anderen Programm, welche von SpO2Review gespeichert wurden <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Erinnerung für CPAP-Anwender: </span><span style=" color:#fb0000;">Haben Sie daran gedacht, zuerst Ihre CPAP-Daten zu importieren?</span></p><p>Wenn Sie das vergessen haben, werden Sie keine gültige Zeit für diese Oxymetrie Sitzung erhalten.<br/><br/>Um sicherzustellen,dass eine gute Synchronisierung zwischen den Geräten erfolgt, müssen Sie beide Geräte zur gleichen Zeit starten.</p></body></html> Please connect your oximeter device Bitte verbinden Sie Ihr Oximeter-Gerät Press Start to commence recording Drücken Sie Start, um die Aufnahme zu beginnen Show Live Graphs Live-Diagramme anzeigen Duration Dauer SpO2 % SpO2 % Pulse Rate Pulsrate Multiple Sessions Detected Mehrere Sitzungen erkannt Please choose which one you want to import into SleepyHead Bitte wählen Sie, welche Sie in SleepyHead importieren möchten Import Time Importzeit Details Details Import Completed. When did the recording start? Import abgeschlossen. Wann hat die Aufnahme zu starten? Day recording (normally would of) started Normalerweise wird der Tag der Aufnahme gestartet Oximeter Starting time Oximeter Startzeit I want to use the time reported by my oximeter's built in clock. Ich will die Zeit von meiner im Oximeter eingebauten Uhr verwenden. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. Ich begann diese Oximeter Aufnahme zur gleichen Zeit (oder nahe der Zeit) wie eine Session auf meinem CPAP-Gerät. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>SleepyHead benötigt eine Startzeit um zu wissen wo diese Oxymetrie-Sitzung gespeichert werden soll.</p><p>Wählen Sie eine der folgenden Optionen:</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> <html><head/><body><p>Hinweis: Synchronisieren Sie die CPAP-Sitzungs- Startzeit. Danach wird das Ergebnis immer genauer sein.</p></body></html> Choose CPAP session to sync to: Wählen Sie aus um die CPAP-Sitzung zu synchronisieren: ... ... You can manually adjust the time here if required: Falls erforderlich, können Sie hier die Zeit manuell einstellen: HH:mm:ssap HH:mm:ssap &Cancel &Schließen &Information Page &Informationsseite &Retry &Wiederholen &Choose Session &Wählen Sie die Sitzung &End Recording &Aufnahme Beenden &Sync and Save &Sync und Speichern &Save and Finish &Speichern und Beenden &Start &Start Scanning for compatible oximeters Scannen von kompatieblen Oximetern Could not detect any connected oximeter devices. Konnte keine angeschlossenen Oximeter Geräte erkennen. Connecting to %1 Oximeter Anschließen an ein %1 Oximeter Select upload option on %1 Wählen Sie eine Uploadfunktion %1 Waiting for you to start the upload process... Warten Sie bis der Uploadvorgang startet... %1 device is uploading data... %1 Gerät Hochladen von Daten... Please wait until oximeter upload process completes. Do not unplug your oximeter. Bitte warten Sie, bis der Oximeter Upload-Vorgang abgeschlossen ist. Nicht das Oximeter trennen. Oximeter import completed.. Oximerterdatenimport abgeschlossen.. Select a valid oximetry data file Wählen Sie eine gültige Oximetriedatendatei aus No Oximetery module could parse the given file: Das Oximetery Modul konnte die angegebene Datei nicht analysieren: Oximeter not detected Kein Oximeter angeschlossen Couldn't access oximeter Konnte nicht auf das Oxiimeter zugreifen Live Oximetery Mode Live Oximetrie Modus Starting up... Sarten Sie... If you can still read this after a few seconds, cancel and try again Sollte der Vorgang zu lange dauern, starten Sie Ihn nach ein paar Sekunden erneut Live Import Stopped Live Import stoppen Live Oximetery Stopped Live Oximetrie stoppen Live Oximetery import has been stopped Live-Oximetrie-Import wurde gestoppt %1 session(s) on %2, starting at %3 %1 Sitzung(en) an %2, Starten ab %3 No CPAP data available on %1 Keine CPAP Daten auf%1 verfügbar %1 %1 Recording... Aufnahme... Finger not detected Kein Fingerchlip angeschlossen I want to use the time my computer recorded for this live oximetry session. Ich möchte die Zeit von meinem Computer für diese Live-Oxymetrie-Sitzung benutzen. I need to set the time manually, because my oximeter doesn't have an internal clock. Ich muss die Zeit manuell einstellen, denn mein Oximeter hat keine eigebaute Uhr. Something went wrong getting session data Ein Fehler ist immer wenn Sitzungs-Daten nicht übereinstimmen CMS50 Session %1 CMS50 Sitzung %1 Oximetry Files (*.spo *.spor *.spo2 *.dat) Oximetriedateiendungen (*.spo *.spor *.dat) Start Time "%1", session %2 Waiting for %1 to start Waiting for the device to start the upload process... Oximetry ... ... Date Datum Form Form Save speichern SpO2 SpO2 Please make sure your oximeter is switched on, and in the right mode to transmit data. Bitte stellen Sie sicher, dass Ihr Oximeter eingeschaltet ist, und in dem richtigen Modus, um Daten zu übertragen. &Stop &Stop Pulse Puls Please connect oximeter device Bitte verbinden Sie das Oximeter-Gerät &Start &Start Creating a new oximetry session will destroy the old one. Would you like to save it first? Erstellen einer neuen Sitzung wird die Pulsoximetriedaten löschen. Möchten Sie diese zuerst speichern? Would you like to save this oximetery session? Möchten Sie die Oximetriesitzung speichern? &Open .spo/R File &Öffnen .spo/R Datei Cancel Stornieren Check Oximeter is Ready Überprüfen Sie ob das Oximeter bereit ist Oximeter Error! Oximeter Fehler! Couldn't open oximetry file " Konnte Oximetriedatei nicht öffnen " Save Session? Sitzung speichern? R&eset R&eset Select an oximetry file Wählen Sie eine Oxymetrie-Datei Oximetry Error! Something is wrong with the device connection. Oxymetrie Fehler! Etwas ist falsch mit dem Geräteanschluss. Serial &Import Serien & Import Oximetry Files (*.spo *.spoR) Oxymetrie-Dateien (*. Spo *. Spor) Serial Port Serien Port d/MM/yy h:mm:ss AP d/MM/yy h:mm:ss AP Please Wait Bitte warten &Start Live &Start-Live Connect Oximeter Oximeter schließen Please make sure Oximeter device is in upload mode. Bitte stellen Sie sicher ob das Oximeter Gerät im Upload-Modus ist. Control Kontrolle Oximetry live recording has been terminated due to timeout. Oxymetrie Live-Aufnahme wurde wegen Zeitüberschreitung beendet. Destroy It Zerstören Sie &Rescan Ports &Ports neu scannen Opening this oximetry file will destroy the current session. Would you like to keep it? Öffnen dieser Datei wird die aktuelle Sitzung löschen. Möchten Sie zuerst speichern? Device Connected Gerät angeschlossen Keep This Recording? Möchten Sie diese Aufnahme behalten? Oximeter Error The device has not responded.. Make sure it's switched on. Oximeter Fehler Das Gerät hat nicht geantwortet .. Stellen Sie sicher, das es eingeschaltet ist. Oximeter Error The device did not respond.. Make sure it's switched on. Oximeter Fehler Das Gerät hat nicht reagiert .. Stellen Sie sicher, das es eingeschaltet ist. Opening this oximetry session will destroy the unsavedsession in the oximetry tab. Would you like to store it first? Öffnen dieser Sitzung wird die Pulsoximetrie unsavedsession in der Registerkarte Oxymetrie löschen. Möchten Sie zuerst speichern? No Oximetry Data Keine Oximetriedaten Current oximetry session still has unsaved data in it. Die aktuelle Oxymetrie-Sitzung entspricht immer noch nicht den gespeicherten Daten. Would you like to save it first? Möchten Sie die daten zuerst speichern? PreferencesDialog % % s s ID ID &Ok &OK N/A N/A bpm bpm Graph Height Diagrammhöhe Font Schriftart Leak Leck SPO2 SpO2 Show Zeigen Size Größe Type Typ Skip Login Screen Weiter mit Anmeldebildschirm Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) Zeigt Respiratory Disturbance Index anstelle des Apnoe / Hypopnoe-Index (RDI = AHI + RERA) &CPAP &CPAP General Settings Allgemeine Einstellungen <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> <html> <head/> <body> <p> Dies macht Blättern im einfacher auf empfindliche bidirektionale TouchPads gezoomt </p><p> 50ms ist der empfohlenen Wert. </p></body></html> Daily Graphs Tagesgrafik Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Komprimieren ResMed (EDF) Backups, um Speicherplatz zu sparen. Gesicherte EDF-Dateien werden im. Gz-Format gespeichert, die häufig auf Mac & Linux-Plattformen ist .. Soll SleepyHead aus diesem komprimierten Backup-Verzeichnis nativ importieren .. Wenn Sie ResScan verwenden werden die. Gz-Dateien benötigen, müssen aber zuerst dekomprimiert werden .. Event Veranstaltung Event Duration Veranstaltungdauer Graph Diagramm Pulse Puls days. tägl. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> <! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li {white-space: pre-wrap; } </ style> </ head> <body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sessions in der Dauer kürzer als diese nicht angezeigt <span style=" font-style:italic;">. </ span> </ p> <p style = "-qt-Absatz-type: leer, margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;-qt-Block-indent: 0; text-indent : 0px; font-style: italic; "> </ p> </ body> </ html> The name of your mask, or at least the name you call it. Der Name der Maske, oder zumindest der Name, wie Sie die Maske bezeichnen. Ignore Short Sessions Ignorieren von kurzen Sitzungen Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. Prozentualer Anteil der Einschränkung des Luftstroms aus dem Mittelwert. Ein Wert von 20% eignet sich gut zum Nachweis von Apnoen. Sessions starting before this time will go to the previous calendar day. Sitzungen vor dieser Zeit werden auf den voangegangenen Tag genommen. The date you started using this mask Das Datum, an dem Sie mit dieser Maske begonnen haben Session Storage Options Sitzungs Speicher Optonen Graph Titles Diagrammtitel Zero Reset Nullsetzung The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. Die folgenden Optionen beeinflussen die Menge an Speicherplatz welcher Sleepyhead verwendet, und Diese haben einen Einfluss darauf, wie lange der Import dauert. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> <! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li {white-space: pre-wrap; } </ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Individuelle Beflaggung ist ein experimentellen Verfahren zum Nachweis von Veranstaltungen, die von der Maschine verpasst. Sie sind <span style=" text-decoration: underline;"> nicht </ span> in AHI enthalten. </ P> </ body> </ html> Show event breakdown pie chart Zeige Ereignis Aufschlüsselung im Kreisdiagramm Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Aktivieren/Deaktivieren experimentellen Veranstaltung Markieren von Verbesserungen. Es wird erlaubt, Borderline-Ereignisse, und einige die Maschine verpasst. Diese Option muss vor dem Import aktiviert werden, da sonst eine Reinigung erforderlich ist. Flow Restriction Durchflussbegrenzung Show Compliance Einhaltung Anzeigen Are you sure you want to reset your graph preferences to the defaults? Sind Sie sicher, dass Sie Ihre Grafik-Einstellungen auf die Standardwerte zurücksetzen wollen? Minimum duration of drop in oxygen saturation Mindestdauer des Abfalls der Sauerstoffsättigung Overview Linecharts Übersicht Liniendiagramme Whether to allow changing yAxis scales by double clicking on yAxis labels Ob sich ändernde yAchse Skalen durch Doppelklick auf yAchse Etiketten ermöglichen Contec CMS50 Contec CMS50 Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. Pixmap-Caching ist eine Grafikbeschleunigungstechnik, welche zu Problemen mit der Anzeige von Schrift in dem Grafik-Anzeigebereich auf Ihrer Plattform führen kann. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> <! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li {white-space: pre-wrap; } </ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font-style: italic;"> Ändern SD Backup-Komprimierungsoptionen nicht automatisch Backup-Daten komprimieren. </ span> </ p> </ body> </ html> Bypass the login screen and load the most recent User Profile Umgehen Sie den Login-Bildschirm und laden Sie das neueste Benutzerprofil Data Reindex Required Erforderliche Daten indizieren Scroll Dampening Bildlauf Dämpfung hours Stunden Nasal Pillows Nasenpolster If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. Diese Daten können nicht zurückgeholt werden. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li {white-space: pre-wrap; } </ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Wenn Ihr Interesse an Test helfen neue Features und Bugfixes früh, klicken Sie hier. </ p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font-style: italic;"> Aber bitte gewarnt, dies wird manchmal bedeuten breaky Code werden .. </ span> </ p> <p style = "-qt-Absatz-type: leer, margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;-qt-Block-indent: 0; text-indent : 0px; "> </ p> </ body> </ html> Leak Profile Leck Profil Standard Bars Standardbalken Mask Profile Masken Profil 99% Percentile 99% Prozentuale Small chunks of oximetry data under this amount will be discarded. Kleine Abschnitte von Oximetriedaten unter diesem Betrag, werden verworfen. Top & Bottom Markers Oben & Unten Markierungen Reset the counter to zero at beginning of each (time) window. Setzen Sie den Zähler auf Null zu Beginn eines jeden (Zeit-) Abschnittes. One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? Eine oder mehrere der Änderungen, die Sie vorgenommen haben, benötigen das diese Anwendung neu gestartet wird, damit diese Änderungen in Kraft treten. Möchten Sie das jetzt tun? Not entirely sure if this will get to live or not.. Nicht völlig sicher, wenn das kommen wird, um zu leben, oder nicht.. Discard chunks under Verwerfen Sie die Teile nach minutes minuten Minutes Minuten Graph Settings Diagramm-Einstellungen CPAP Mask Information CPAP Maskeninformation Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. Methode der Berechnung, wenn unbeabsichtigte Lecks von Ihrem Gerät nicht zur Verfügung gestellt werden. Hinweis: Statistisches Modell ist experimentell. Bold Fett Colour Farbe Minimum duration of pulse change event. Mindestdauer von Pulswechsel-Ereignissen. Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. Anti-Aliasing gilt für eine Verbesserung der grphischen Darstellung .. Bestimmte Darstellungen sehen besser aus wenn Sie das aktivieren. Dies wirkt sich auch auf gedruckte Berichte Berichte aus. Probieren Sie es aus und sehen, ob es Ihnen gefällt. Oximetry Graphs Oximetriediagramm Median is recommended for ResMed users. Mittlere ist für ResMed Benutzer empfohlen. Graphs Diagramme of usage per night Nutzung pro Nacht &Check for Updates now &Prüfen auf eine neue Version Italic Kursiv Enable Multithreading aktivieren Sie Multithreading This may not be a good idea Das ist keine gute Idee Weighted Average gewichteter Durchschnitt Median Mittlere Sudden change in Pulse Rate of at least this amount Plötzliche Änderung in Pulsfrequenz von mindestens diesen Betrag Search Suche This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) Dies hält eine Sicherung der SD-Karte Daten für ResMed Maschinen, ResMed Maschinen hochauflösende Daten, die älter als 7 Tage zu löschen, Grafik und Daten, die älter als 30 Tage .. Sleepyhead können eine Kopie dieser Daten halten, wenn Sie jemals brauchen werden, um neu zu installieren. (Sehr empfehlenswert, es sei denn, Ihre kurz auf Speicherplatz oder nicht über die Diagrammdaten care) Window Windows Middle Calculations Mittel Berechnungen Skip over Empty Days Leere Tage überspringen Allow duplicates near machine events. Gerät für Duplikate von Ereignissen zulassen. The visual method of displaying waveform overlay flags. Das visuelle Verfahren zur Darstellung von Wellenüberlagerungsansichten. Upper Percentile Obere Prozentuale Restart Required Neustart erforderlich Generic mask type. Select the one that's closest to your mask. Generischer Maskentyp. Wählen Sie den aus, der Ihrer Maske am ehesten gleicht. True Maximum Echte Maximum For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. Für Konsistenz sollten ResMed Nutzer hier 95% verwenden, denn dies ist der einzige Wert in der Tageszusammenfassung der lieferbar ist. Graph Text Diagrammtext Session Settings Sitzungseinstellungen Cache Session Data (uses more system memory) Cache-Sitzungs-Daten (verbraucht mehr Systemspeicher) Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. Erlaubt die Verwendung von mehreren CPU-Kernen, wenn verfügbar, um die Leistung zu verbessern. Vor allem wirkt sich das auf den Import von Daten aus. Tries to forces the oximetry data to link with CPAP when possible. Versucht, die Oximetriedaten mit CPAP zu verlinken, wenn Dies möglich ist. Line Chart Liniendiagramm How long you want the tooltips to stay visible. Wie lange sollen die Tooltips sichtbar bleiben. Multiple sessions closer together than this value will be kept on the same day. Mehrere Sitzungen näher als dieser Wert wird am gleichen Tag gehalten werden. Duration of airflow restriction Dauer der Behinderung des Luftstroms Bar Tops Balkendiagramme Automatically Check For Updates Automatisch nach Updates suchen I want to try experimental and test builds (Advanced users only please.) Ich will versuchen, Versuchs-und Tests zu benutzen (Bitte nur fortgeschrittene Benutzer.) as over mehr als Are you sure you want to disable these backups? Sind Sie sicher, dass Sie diese Sicherungen deaktivieren wollen? Overview Graphs Übersichtsdiagramme Create SD Card Backups during Import (only for ResMed so far, highly recommended) SD-Karte Backups erstellen während des Imports (nur für ResMed, sehr zu empfehlen) Other Visual Settings Andere Visuelle Einstellungen Pressure Druck Day Split Time Tages Zwischenzeit Big Text Großer Text <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> <html> <head/> <body> <p> Diese Eigenschaften haben vor kurzem beschnitten worden. Sie werden später wieder zu kommen. </ p> </ body> </ html> Description Beschreibung ResMed users probably should use 99th Percentile for visual consistency. ResMed Benutzer sollte 99. Perzentile für die visuelle Konsistenz verwenden. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> <! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li {white-space: pre-wrap; } </ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font-weight: 600; font-style: normal;"> Hinweis: </ span> Leak Profile derzeit noch nicht funktioniert .. </ p> </ body> </ html> ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). ResMed S9 Geräte routinemäßig bestimmte Daten von der SD-Karte, die älter als 7 und 30 Tagen (je nach Auflösung) zu löschen. Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. Tage mit der Benutzung des Gerätes mit unter 4 Stunden ist "nicht konform".mehr als 4 Stnden sind in Ordnung. Daily view navigation buttons will skip over days without data records Tagesansicht Navigationstasten wird die Tage ohne Datensätze überspringen seconds Sekunden Mask Type Maskentyp Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. Stellt die Datenmenge für jeden Punkt in dem AHI/ Stunde Diagramm bereit. Standardwerte auf 60 Minuten .. Sehr zu empfehlen. &Cancel &Abbrechen Last Checked For Updates: Letzte Kontrolle Updates: Details Details &Events &Veranstaltungen Use Anti-Aliasing Verwenden Sie Anti-Aliasing Animations && Fancy Stuff Animationen && gutes Material &Import &Importieren AHI/Hour Graph Settings AHI/ Stunde Grafik-Einstellungen Use Oximetry Oxymetrie verwenden Changes to the following settings needs a restart, but not a recalc. Änderungen an den folgenden Einstellungen benötigt einen Neustart, aber keine Neuberechnung. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) Komprimieren der Sitzungsdaten (Daten macht Sleepyhead kleiner, aber das wechseln zum Tag langsamer) &Appearance & Erscheinungsbild The pixel thickness of line plots Die Pixeldicke von Liniendiagrammen &Defaults & Standard Filters the graph list. Simply start typing the name of the graph your looking for. Filtert die Grafik-Liste. Suchen Sie einfach die Grafik, die Sie starten wollen. Combine Close Sessions Kombinieren Schließen Sitzung Allow YAxis Scaling Erlauben Sie YAxis Skalierung Use Pixmap Caching Verwenden Pixmap Zwischenspeicherung Check for new version every Alle auf neue Version prüfen Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. Ermöglicht Graphen zu "screenshotted"für die Anzeige zu werden. Das Event-Pannenkreisdiagramm verwendet diese Methode, wie auch der Druck Code. Leider sind einige ältere Computer / Qt-Versionen kann dazu führen, diese Anwendung instabil mit dieser Funktion aktiviert sein. Maximum Calcs Maximale Calcs This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. Dies macht die SleepyHead Daten etwa halb so groß. Aber es macht den Import und den Wechsel zur Tagesansicht langsamer .. Wenn Sie einen Computer mit einem kleinen Speicherplatz haben, ist dies eine gute Option. Tooltip Timeout Kurzinfo Zeitüberschreitung Preferences Einstellungen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> <! DOCTYPE HTML PUBLIC " - / / W3C / / DTD HTML 4.0 / / EN " " http://www.w3.org/TR/REC-html40/strict.dtd " > <html> <head> <meta name="qrichtext" content="1" /> <style type="text/css"> p, li { white-space : pre -wrap ; } </ style> </ head> <body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font -family: " Sans '; font-size: 10pt ; font-weight: 600; " > Syncing Oxymetrie und CPAP Daten < / span> < / p> <p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p> <p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> CMS50 von SpO2Review (von . Spor -Dateien) oder die serielle Import-Methode importiert Daten nicht </ span> <span style = "font- Familie : " Sans '; font-size: 10pt ; font-weight: 600; text-decoration : underline ; " > nicht </ span> <span style = "font -family: " Sans '; font-size: 10pt ; " > die korrekte Zeitstempel benötigt, um zu synchronisieren. </ span> </ p> <p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p> <p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> Live-View -Modus ( mit einem seriellen Kabel ) ist eine Möglichkeit , um eine genaue Synchronisierung auf CMS50 Oximeter acheive , aber nicht Zähler für CPAP Uhr driften. </ span> </ p> <p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p> <p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> Wenn Sie Ihr Oximeter an </ span> <span style = " font-family starten Sie die Aufnahme -Modus: " Sans '; font-size : 10pt ; font- style: italic ; " > genau </ span> <span style=" font-family:'Sans'; font-size:10pt;"> die gleiche Zeit, die Sie Ihrem CPAP-Gerät starten , können Sie jetzt auch erreichen sync. </ span> </ p> <p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p> <p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> die Serienimportvorgangdauert die Startzeit von den letzten Nächten CPAP ersten Sitzung. (Denken Sie daran , zuerst Ihre CPAP -Daten importieren ! ) </ Span> </ p> < / body> < / html> Started Using Erste Schritte mit Sourceforge hosts this project for free.. Please be considerate of their resources.. Sourceforge hält dieses Projekt kostenlos .. Mit Rücksicht auf ihre Ressourcen .. Default display height of graphs in pixels Standardanzeige Höhe von Diagrammen in Pixel Leak calcs Berechnung der Leck Overlay Flags Übersichtsbezeichnung Confirmation Bestätigung Makes certain plots look more "square waved". Macht bestimmte Abschnitte vom Aussehen her "schwenkbar". Flag changes in oximetry stats Bezeichnungsveränderungen in Oxymetrie Statistik Percentage drop in oxygen saturation Prozentualer Abfall der Sauerstoffsättigung &General &Allgemein Keep session data in memory to speed up revisiting days. Halten Sie Sitzungsdaten im Speicher um die Wiederanzeige der Tage zu beschleunigen. If you need to conserve disk space, please remember to carry out manual backups. Wenn Sie Speicherplatz sparen müssen, denken Sie bitte daran, manuelle Backups zu erstellen. Link Oximetry and CPAP graphs Link-Oxymetrie und CPAP Diagramme Compress SD Card Backups (slower first import, but makes backups smaller) Komprimieren der Backups auf der SD-Karte (langsamer beim ersten Import, aber macht Backups kleiner) Don't show any compliance information Keine Gewährungsinformationen mehr anzeigen Normal Average Normaler Durchschnitt A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? Ein Daten Reindizierung proceedure ist erforderlich, um diese Änderungen zu übernehmen. Dieser Vorgang kann einige Minuten dauern. Sind Sie sicher, dass Sie diese Änderungen vornehmen wollen? Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) Wählen Sie diese, wenn Sie wissen, dass Ihre CPAP Uhr aus ist. Versuchen Sie mit Ihrer PC-Uhr zu synchronisieren (was im Zeitserver synchronisiert werden sollte) Preferred Calculation Methods Bevorzugte Berechnungsmethoden Statistical Model Statistische Modelle Double click on the (Y-axis) min/max values to edit them Klicken Sie doppelt auf die (Y-Achse) min / max-Werte, um sie zu bearbeiten Graph Tooltips Diagramm Tooltips Custom User Event Flagging Individuelles Benutzerereignis kennzeichnen milliseconds millisekunden &Oximetry &Oxymetrie CPAP Clock Drift CPAP Wecker benutzen Square Wave Plots Quadratwelle-Anschläge TextLabel Textlabel Application Fonts Anwendungs Schriften Application Anwendung Line Thickness Linienstärke Use RDI instead of AHI (PRS1 only) Verwenden Sie anstelle von RDI AHI (nur PRS1) Do not import sessions older than: Keine älteren als diese Sitzung importieren: Sessions older than this date will not be imported Sitzungen älter als dieses Datum werden nicht importiert dd MMMM yyyy dd MMMM yyyy Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON) Während des Imports SD-Karten Backup erstellen (Dies ist für ResMed und FP ICON ziemlich wichtig) User definable threshold considered large leak Frei definierbare Schwelle als großes Leck L/min L/min Whether to show the leak redline in the leak graph Ob die Leck rote Linie im Leck Graphen angezeigt werden soll Show Leak Redline Zeige Leck rote Linie Oximetery Settings Oximetereinstellungen Contec CMS50D+ Contec CMS50D+ Contec CMS50E/F Contec CMS50E/F Contec CMS50F v3.7 Contec CMS50F v3.7 Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. Das Abschalten der automatischen Backups ist keine gute Idee, weil SleepyHead Dieses braucht, um die Datenbank neu zu erstellen, wenn Fehler gefunden wurden. Are you really sure you want to do this? Sind Sie wirklich sicher, dass Sie das tun wollen? Show in Event Breakdown Piechart Die Ereignispannen als Kreisdiagramm anzeigen #1 #1 #2 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Diese experimentelle Option versucht, das Markieren von Ereignis-System zu verwenden, um von SleepyHead erkannte Geräteereignisse in ihrerPositionierung zu verbessern. Resync Machine Detected Events (Experimental) Nach der Resynchronisierung des Gerätes erfasste Ereignisse (experimentell) Summary only data is more accurate for ResMed users if this is left on. Nur zusammengefasste Daten sind genauer für ResMed Benutzer, wenn dieser nach links auf. Don't Split Summary Days Kein gesplitteten Übersichttage Create SD Card Backups during Import (Turn this off at your own peril!) Erstellen Sie ein SD-Karten Backup während des Imports (Deaktivieren Sie dieses auf eigene Gefahr!) C&hannels K&anäle Reset &Defaults Zurücksetzen &Standardwerte <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Warnung: </span>Nur weil Sie können, bedeutet das nicht,dass es eine gute Übung ist.</p></body></html> Show flags for machine detected events that haven't been identified yet. Erfasste Ereignissflaggen vom Gerät, die noch nicht identifiziert wurden. Show Unknown Flags Unbekannte Flaggen zeigen Span Events Spanne des Ereignisses Flags Flaggen Minor Flags Kleine Flaggen Waveforms Wellenformen Data Channels Datenkanäle Settings Channels Einstellungskanäle Unknown Channels unbekannte Kanäle Name Name Color Farbe Label Aufschrift Events Ereignisse Flag rapid changes in oximetry stats Other oximetry options Flag SPO2 Desaturations Below Discard segments under Flag Pulse Rate Above Flag Pulse Rate Below Contec CMS50D+/E/F Contec CMS50F v3.7+ Contec CMS50F v3.7+ {50F?} ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Update Oximeter Clock during import Import without nagging Flag Minor Flag Span Always Minor Flag Type CPAP Events Oximeter Events Positional Events Sleep Stage Events Unknown Events Double click to change the descriptive name this channel. Double click to change the default color for this channel plot/flag/data. Here you can change the type of flag shown for this event This is the short-form label to indicate this channel on screen. This is a description of what this channel does. Lower Upper CPAP Waveforms Oximeter Waveforms Positional Waveforms Sleep Stage Waveforms Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Top Markers ProfileSelect Double Checking: Do you really want "%1" profile to be obliterated? Doppelprüfung : Wollen Sie wirklich das "%1"-Profil, löschen? &Quit &Beenden Create a new user profile. Erstellen Sie ein neues Benutzerprofil. Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs. Signed: Nasty Programmer Moment ... Wenn Sie versuchen zu löschen, weil Sie das Passwort vergessen haben, ist das nicht richtig. Lesen Sie die Dokumentation. Unterzeichnet: Nasty Programmer [data directory] [Datenverzeichnis] Are you sure you want to trash the profile "%1"? Sind Sie sicher, dass Sie das Profil löschen wollen "%1"? Open Profile Profil Öffnen Edit Profile Profil bearbeiten The current location of SleepyHead data store. Der aktuelle Ort des SleepyHead Datenspeichers. Incorrect Password Inkorrektes Passwort Choose a different SleepyHead data folder. Wählen Sie einen anderen SleepyHead Datenordner aus. WTH??? WTH??? Enter Password for %1 Passwort eingeben für %1 New Profile Neues Profil &Different Folder &Anderen Ordner There was an error deleting the profile directory.. You need to manually remove %1 Es gab einen Fehler beim Löschen des Profil- Verzeichnises .. Sie müssen es manuell entfernen %1 &Select User &Zum ausgewählten Benutzer Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data.. Don't say you weren't warned. :-p Okay, ich bin einverstanden das Profil "%1" und alle enthaltenen Daten völlig zu löschen .. Sagen Sie nicht, dass Sie nicht gewarnt wurden. :-p Start with the selected user profile. Beginnen Sie mit dem ausgewählten Benutzerprofil. If you can read this you need to delete this profile directory manually (It's under %1) Wenn Sie Dies lesen müssen Sie das Profil-Verzeichnis manuell löschen (es ist unter %1) Click here if you didn't want to start SleepyHead. Klicken Sie hier, wenn Sie nicht wollen, das Sleepyhead startet. Delete Profile Profil löschen Select Profile Wählen Sie ein Profil aus Question Frage SleepyHead SleepyHead [version] (Version) You entered the password wrong too many times. Sie haben zu oft das falsche Kennwort eingegeben. Enter Password Passwort eingeben Folder: Ordner: Whoops. Hoppla. You entered an Incorrect Password too many times. Exiting! Sie haben zu oft ein falsches Passwort eingegeben. Verlassen! Search: Suche: You are about to destroy profile '%1'. Sie sind dabei, das Profil zu zerstören '%1'. Enter the word DELETE below to confirm. Um fortzufahren bestätigen Sie unten das Wort LÖSCHEN. Sorry Entschuldigung You need to enter DELETE in capital letters. Sie müssen DELETE in Großbuchstaben eingeben. Could not open profile.. You will need to delete this profile directory manually Kann Profil nicht öffnen .. Sie sollten das Profil-Verzeichnis manuell löschen You will find it under the following location: Sie finden es unter der folgenden Position: You entered an incorrect password Sie haben ein falsches Passwort eingegeben If you're trying to delete because you forgot the password, you need to delete it manually. Wenn Sie versuchen das Profil zu löschen, weil Sie Ihr Passwort vergessen haben, müssen Sie es manuell löschen. There was an error deleting the profile directory, you need to manually remove it. Es gab einen Fehler beim Löschen des Profil-Verzeichnisses, sie müssen es manuell entfernen. Profile '%1' was succesfully deleted Profil '%1' wurde erfolgreich gelöscht Create new profile Neues Profil erstellen QObject " " % % A A H H P P ?? ?? AI AI CA CA EP EP FL FL HI HI IE IE LE LE LL LL Kg kg O2 O2 OA OA NR NR PB PB PC PC PP PP PS PS On An RE RE SA SA SD SD UA UA VS VS cm cm ft ft hz hz lb lb oz oz 0-1 0=offen, 1=zu 90% 90% AHI AHI ASV ASV BMI BMI CAI CAI Apr Apr Aug Aug Avg Gem DOB Geburtsdatum Bpm Bpm EPI EPI Dec Dez FLI FLI End Ende Feb Feb L/m L/m Jan Jan Jul Jul Jun Jun NRI NRI Mar März Max Max May Mai Med Med Min Min Nov Nov Oct Okt Off Aus RDI RDI REI REI UAI UAI UF1 UF1 UF2 UF2 UF3 UF3 Sep Sep VS2 VS2 bpm bpm ÇSR CSR APAP APAP CPAP CPAP Min EPAP Min EPAP EPAP EPAP Date Datum Min IPAP Min. IPAP IPAP IPAP Last Letzte Verwendung Leak Leck Mode Modus Name Name None Keiner RERA RERA SpO2 SpO2 Resp. Event Resp. Ereignis Inclination Neigung About SleepyHead Über SleepyHead Therapy Pressure Therapiedruck BiPAP BiPAP Brand Marke Daily Täglich Email E-mail Error Fehler First Erste Verwendung Ramp Pressure Rampen Druck L/min L/min Hours Stunden Leaks Lecks Model Model Phone Telefon Ready Bereit W-Avg W-Durchschnitt Snore Schnarchen Start Start Usage Verwendung Respiratory Disturbance Index Atem-Störungs-Verzeichnis cmH2O cmH2O Pressure Support Druckunterstützung Hypopnea Hypopnoe ratio Verhältnis Tidal Volume AZV Entire Day Ganzer Tag Heart rate in beats per minute Die Herzfrequenz in Schlägen pro Minute A large mask leak affecting machine performance. Eine zu große Maske beeinflußt die Geräteleistung. An restriction in breathing from normal, causing a flattening of the flow waveform. Eine Einschränkung bei der normalen Atmung, was zu einer Abflachung der Strömungswellenform führt. Pat. Trig. Breath Pat. Trig. Atem Ramp Delay Period Rampen-Verzögerungszeit Purge Failed Bereinigen fehlgeschlagen Pulse Change Impulsänderung Sleep Stage Schlafstadium Would you like me to purge this data this for you so you can run the new version? Soll das Programm diese Daten für Sie reinigen, so dass Sie die neue Version benutzen können? Minute Vent. Minuten Vent. Respiratory Effort Related Arousal Atemanstrengung bei Erregung SpO2 Drop SpO2-Tropfen SensAwake feature will reduce pressure when waking is detected. (SensAwake Funktion) wird den Druck reduzieren, wenn die Funktion erkennt, dass Sie wachwerden. Upright angle in degrees Bis rechten Winkel in Grad Higher Expiratory Pressure Höherer Expirationsdruck Nasal Pillows Nasenpolster SleepyHead has finished sending the job to the printer. SleepyHead hat den Auftrag an den Drucker gesendet. NRI=%1 LKI=%2 EPI=%3 NRI=%1 LKI=%2 EPI=%3 &Close &Schließen A vibratory snore Eine Schnarchvibration Vibratory Snore Schnarchvibration Lower Inspiratory Pressure Niedrigster Inspirationsdruck You did not select a directory. SleepyHead will now start with your old one. Sie haben kein Verzeichnis ausgewählt. SleepyHead wird nun mit Ihren alten Daten starten. Resp. Rate Resp. Rate Insp. Time Insp. Zeit Exp. Time Exp. Zeit Import Error Import Fehler Machine Gerät A sudden (user definable) drop in blood oxygen saturation Ein plötzlicher (frei definierbarer) Abfall der Blutsauerstoffsättigung As you did not select a data folder, SleepyHead will exit. Next time you run, you will be asked again. Wenn Sie keinen Datenordner auswählen, wird Sleepyhead geschlossen. Wenn sie das nächste Mal starten, werden Sie wieder gefragt. Nasal Interface Nasen Schnittstelle There are no graphs visible to print Im Druck sind keine Diagramme sichtbar Target Vent. Ziel Vent. An apnea that could not fit into a category Ein Apnoe ohne Kategorie Sleep position in degrees Schlafposition in Grad minutes minuten This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. Dieser Bericht wurde von einer Pre-Release-Version von Sleepyhead (%1) erzeugt, <b> und eignet sich in keiner Weise für medizinische Diagnosezwecke. </ b>. Periodic Breathing Regelmäßige Atmung Ramp Time Rampenzeit Unintentional Leaks Unbeabsichtigte Lecks Would you like to show bookmarked areas in this report? Möchten Sie die Lesezeichen Bereiche in diesem Bericht anzeigen? Apnea Hypopnea Index Apnoe-Hypopnoe-Index This make take some time to complete.. Please don't touch anything until it's done. Dieser Vorgang nimmt einige Zeit in Anspruch .. Bitte warten Sie, bis er abgeschlossen ist. Patient Triggered Breaths Durch Patienten ausgelöste Atemzüge No Waveform Available Kein Wellenform verfügbar Events Ereignisse (% %1 in events) (% %1 der Ereignisse) No Data Keine Daten Page %1 of %2 Seite %1 von %2 Median Mittlere PS Max PS Max PS Min PS Min Full-Face Mask Nase-Mund Maske Flow Limit. Fließgrenze. Choose or create new folder for SleepyHead data Wählen Sie oder erstellen Sie einen neuen Ordner für die SleepyHead Daten Detected mask leakage including natural Mask leakages Erkannte Masken Lecks einschließlich der natürlichen Maskenlecks Plethy Plethy (Ein Gerät zum Bestimmen und Registrieren der Variationen in der Größe oder des Volumens eines Schenkels, der Arm oder Bein, und somit die Variationen in der Menge des Blutes in dem Glied.) SensAwake Druckverminderungstechnologie während des Wachwerdens ST/ASV ST/ASV Median Leaks Mittlere Lecks %1 Report %1 Bericht Pr. Relief Druckentlastung Serial Serien Nummer A user definable event detected by SleepyHead's flow waveform processor. Der SleepyHead Flusswellenformprozessor hat ein definierbares Ereignis erkannt. SpO2 % SpO2 % I can automatically purge this data for you, or you can cancel now and continue to run in a previous version. Das Programm kann diese Daten für Sieautomatisch reinigen, oder Sie können jetzt abbrechen und weiter in einer früheren Version bleiben. AHI %1 AHI %1 Weight Gewicht Mask Pressure (High resolution) Maskendruck (hohe Auflösung) Orientation Orientierung Event Flags Ereignismarkierungen Zombie Mir geht es Bookmarks Lesezeichen An apnea where the airway is open Atemaussetzer obwohl Atemwege offen sind Flow Limitation Flusslimitierung Phone: %1 Telefon: %1 Low Usage Days=%1 Wenige Nutzungstage =%1 &Ok, get on with it.. &Ok, weitermachen mit.. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead SleepyHead ist eine kostenlose Open-Source-Software von http://sourceforge.net/projects/SleepyHead RDI %1 RDI %1 I'm sorry to report that SleepyHead can only track hours of use for this machine. Es tut mir leid, aber SleepyHead kann für dieses Gerät nur Stunden verfolgen. Flow Rate Fließrate Time taken to breathe out Ausatmungszeit events Ereignisse An optical Photo-plethysomogram showing heart rhythm Eine optische Darstellung vom Herzrhythmus Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually This folder currently resides at the following location: Entschuldigung, konnte diese Daten nicht löschen, was bedeutet, diese Version von SleepyHead kann nicht starten .. Daten-Ordner von SleepyHead muss manuell entfernt werden Dieser Ordner befindet sich derzeit an der folgenden Position: Pr. Min min. Druck Pr. Max max. Druck I:E Ratio I: E-Verhältnis Amount of air displaced per breath Luftmenge pro Atemzug verdrängt Pat. Trig. Breaths Pat. Trig. Atemzüge Address Adresse Name: %1, %2 Name: %1, %2 Leak Rate Leckrate Reporting from %1 to %2 Berichterstattung vom %1 bis %2 Email: %1 E-mail: %1 Inspiratory Pressure Einatmungsdruck A pulse of pressure 'pinged' to detect a closed airway. Ein Druckimpuls um geschlossene Atemwege zu öffnen. Non Responding Event Kein Ereignis registriert Ramp Pr. Anlauf Dr. Median Leak Rate Mittlere Leckrate Rate of breaths per minute Bewerten der Atemzüge pro Minute Usage Statistics Verwendung der Statistik Graph displaying snore volume Graphische Anzeige Schnarchvolumen Max EPAP Max EPAP Max IPAP Max IPAP (%%1 compliant, defined as > %2 hours) (%%1 konform, definiert als >%2 Stunden) Bedtime Schlafenszeit No SleepyHead data folder was found. Would you like SleepyHead to use the default location for storing its data? Es wurde kein SleepyHead Datenordner gefunden. Möchten Sie den Sleepyhead Standardordner zum Speichern ihrer Daten verwenden? Pressure Druck Average Durchschnitt Target Minute Ventilation Zielminutenvolumen Amount of air displaced per minute Atemminutenvolumen Percentage of breaths triggered by patient Prozentualer Anteil der Atemzüge vom Patienten ausgelöst Non Data Capable Machine Gerät nicht Datenfähig Plethysomogram Plethysomogramm Unclassified Apnea Apnoe ohne Zuordnung Starting Ramp Pressure Anlaufdruck DOB: %1 Geb.-Datum: %1 Intellipap event where you breathe out your mouth. Intellipap Ereignis, bei der Sie mit dem Mund ausatmen. Flow Limit Fließgrenze UAI=%1 UAI=%1 Pulse Rate Pulsrate This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. Dieser Gerätedatensatz kann nicht in diesem Profil importiert werden. Die Tagessätze überschneiden sich mit bereits vorhandenen Inhalten. Graph showing running AHI for the past hour Diagrammanzeige des AHI der letzten Stunde Graph showing running RDI for the past hour Diagrammanzeige des RDI der letzten Stunde seconds Sekunden Mask Time Maskenzeit Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. Ihr Philips Respironics CPAP-Gerät (Modell%1) ist leider nicht in der Lage ein Datenmodell zu erstellen. Channel Kanal Hybrid F/F Mask Hybrid F / F-Maske Max Leaks Max Lecks A period of periodic breathing Zeitraum der wiederkehrenden Atmung Days=%1 Tage=%1 &Donate &Spenden Address: Adresse: Waketime=%1 Aufwachzeit=%1 degrees Grad User Flag #1 Benutzer Markierung #1 User Flag #2 Benutzer Markierung #2 User Flag #3 Benutzer Markierung #3 A ResMed data source showing Respiratory Events Die ResMed Datenquelle, der Atem Ereignisse Bedtime=%1 Schlafengehen=%1 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% Median rate of detected mask leakage Mittlere Rate der bemerkten Masken Lecks Mask Pressure Maskendruck A vibratory snore as detcted by a System One machine Eine Schnarchvibration die durch ein System One endeckt wurde events/hour Ereignisse/Stunde Reporting data goes here Die Berichtsdaten befinden sich hier Respiratory Event Atem Ereignis A type of respiratory event that won't respond to a pressure increase. Eine Art von Atem Ereignis, welches auf keinen Druckanstieg reagiert. Clear Airway Apnea Klarer Atemwegsverschluss Windows User Windows Benutzer Unspecified Unspezifisch Question Frage Higher Inspiratory Pressure Höchster Inspirationsdruck Bi-Level Zweite Ebene SleepyHead v%1 - http://sleepyhead.sourceforge.net SleepyHead v%1 - http://sleepyhead.sourceforge.net Unknown Unbekannt events/hr Ereignisse/h SleepyHead SleepyHead Duration Dauer (Sess=%1) (Sess=%1) Sessions Sitzungen Settings Einstellungen Overview Überblick Target Minute Ventilation? Zielminutenvolumen? Entire Day's Flow Waveform Gesamte Tages Flusswellenform Exiting Verlassen An restriction in breathing that causes an either an awakening or sleep disturbance. Eine Einschränkung bei der Atmung, die entweder ein Erwachen oder eine Schlafstörung verursacht. Pressure Support Maximum Druckunterstützung Maximum Graph showing severity of flow limitations Graphische Darstellung des Schweregrades der Flusslimitierungen : %1 hours, %2 minutes, %3 seconds : %1 Stunden, %2 Minuten, %3 Sekunden Software changes have been made that require the reimporting of the following machines data: Es sind Software Änderungen vorgenommen wurden, die das Wiederherstellen der folgenden Geräte-Daten benötigen: A partially obstructed airway Teilweise behinderte Atemwege Pressure Support Minimum Druckunterstützung Minimum Large Leak Großes Leck Wake-up Aufwachzeit Warning Warnung Min Pressure Mindestdruck Total Leak Rate Gesamtleckrate No Directory Kein Verzeichnis Max Pressure Größter Druck MaskPressure Maskendruck Total Leaks Anzahl der Lecks Minute Ventilation Minutenvolumen Rate of detected mask leakage Anzahl erkannter Masken Lecks Breathing flow rate waveform Atemflussrate Wellenform Lower Expiratory Pressure Niedriger Exspirationsdruck AI=%1 HI=%2 CAI=%3 AI=%1 HI=%2 CAI=%3 Time taken to breathe in Einatmungszeit Maximum Therapy Pressure Größter Therapiedruck Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! Konnte die Kanäle.xml nicht analysieren. Bitte beenden Sie den Vorgang!! Current Selection Aktuelle Auswahl Obstructive Apnea Obstruktiver Schlafapnoe Blood-oxygen saturation percentage Blutsauerstoffsättigung in Prozent Inspiratory Time Einatemzeit Respiratory Rate Atemfrequenz Printing %1 Report Drucken %1 Bericht Expiratory Time Ausatemzeit Expiratory Puff Ausatem Hauch Maximum Leak Maximale Lecks Ratio between Inspiratory and Expiratory time Verhältnis zwischen den expiratorischen Zeiten Minimum Therapy Pressure Kleinster Theraphiedruck A sudden (user definable) change in heart rate Eine plötzliche (frei definierbare) Veränderung der Herzfrequenz Oximetry Oximetrie Oximeter Oximeter The maximum rate of mask leakage Der Höchstsatz der Maskenlecks Machine Database Changes Gerätedatenbankänderungen The folder you chose is not empty, nor does it already contain valid SleepyHead data. Are you sure you want to use this folder? Der Ordner, den Sie gewählt haben, beinhaltet noch gültige SleepHead Daten. Sind Sie sicher, dass Sie diesen Ordner nutzen wollen? Expiratory Pressure Ausatmungsdruck Tgt. Min. Vent Tgt. Minute entlüften Release Notes Versionshinweise Pressure Pulse Druckimpuls Humidifier Luftbefeuchter Patient ID Patienten-Nr An apnea caused by airway obstruction Eine Apnoe durch Obstruktion der Atemwege verursacht Days: %1 Tage: %1 Low Usage Days: %1 Tage mit zu geringer Nutzung: %1 (%1% compliant, defined as > %2 hours) (%1% konform, definiert als >%2 Stunden) (Sess: %1) (Sitzung: %1) Bedtime: %1 Schlafenszeit: %1 Waketime: %1 Aufwachzeit: %1 Minutes Minuten Seconds Sekunden Events/hr Ereignisse/Stunde Hz Hz Breaths/min Atmungen/min Severety (0-1) Außergewöhnliche Schwere (0-1) Degrees Grad Information Information Busy Beschäftigt Please Note Bitte warten Sie &Yes &Ja &No &Nein &Cancel &Schließen &Destroy &Vernichten &Save &Speichern Unknown PRS1 Code %1 Unbekannt PRS1 Code %1 PRS1_%1 PRS1_%1 Sorry, the purge operation failed, which means this version of SleepyHead can't start. Entschuldigung, der Reinigungsvorgang ist fehlgeschlagen, was bedeutet, dass diese Version von SleepyHead nicht gestartet werden kann. The machine data folder needs to be removed manually. Die Gerätedaten-Ordner müssen manuell entfernt werden. This folder currently resides at the following location: Dieser Ordner befindet sich derzeit an der folgenden Position: Mask On Time Masken-Einschaltzeit Time started according to str.edf Zeit nach str.edf gestartet Summary Only Nur Zusammenfassung CPAP Session contains summary data onlyf CPAP-Sitzung enthält nur zusammengefasste Daten Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. Suchen Sie in diesem Aufbau <a href='%1'>SleepyHead's Dateien gehostet Sourceforge</a>. A faster build of SleepyHead may be available Bald wird eine schnellere Version von SleepyHead verfügbar sein You will not be bothered with this message again. Sie werden mit dieser Nachricht nicht wieder belästigt werden. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. Diese Version wird gut laufen, aber ein "<b>%1</b>" markierte Version von SleepyHead wird wahrscheinlich viel besser auf Ihrem Computer laufen. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. Dieser Aufbau von SleepyHead wurde entwickelt, um mit älteren Rechner ohne OpenGL 2.0-Unterstützung zu arbeiten, aber es sieht so aus als ob Ihr Computer die volle Unterstützung bietet. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. Dieser Aufbau von SleepyHead wurde entwickelt, um mit älteren Rechnern ohne OpenGL 2.0-Unterstützung zu arbeiten, aber es kann immer noch eine bessere Version für den Computer verfügbar sein. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. Wenn Sie mit einer virtuellen Maschine wie VirtualBox oder VMware arbeiten, ignorieren Sie bitte diese Nachricht, da kein besserer Aufbau verfügbar ist. Incompatible Graphics Hardware Inkompatible Grafik Hardware This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. Dieser Aufbau von SleepyHead benötigt OpenGL 2.0-Unterstützung um vollständig funktionieren zu können, aber leider fehlt Ihrem Computer diese Fähigkeit. You may need to update your computers graphics drivers from the GPU makers website. %1 Möglicherweise müssen Sie Ihren Computer-Grafiktreiber von der GPU-Hersteller Website aktualisieren. %1 (<a href='http://intel.com/support'>Intel's support site</a>) (<a href='http://intel.com/support'>Support-Website von Intel</a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. Da die Grafiken nicht richtig funktionieren, kann es zu Abstürzen führen. Dieser Aufbau wird jetzt beendet. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. Lassen Sie sich nicht entmutigen, es gibt einen weiteren Aufbau "<b>-BrokenGL </ b>", der auf Ihrem Computer funktionieren sollte. No SleepyHead data folder was found. Es wurden keine SleepyHead Datenordner gefunden. Would you like SleepyHead to use the default location for storing its data? Möchten Sie den SleepyHead Standardordner zum Speichern ihrer Daten verwenden? As you did not select a data folder, SleepyHead will exit. Wenn Sie keinen Datenordner auswählen wird SleepyHead geschlossen. Next time you run, you will be asked again. Beim nächsten Startvorgang werden Sie wieder gefragt. You did not select a directory. Sie haben kein Verzeichnis ausgewählt. SleepyHead will now start with your old one. SleepyHead versucht mit Ihren alten Daten zu starten. The folder you chose is not empty, nor does it already contain valid SleepyHead data. Der Ordner, den Sie gewählt haben, ist nicht leer. Es sind noch gültige SleepyHead Daten enthalten. Are you sure you want to use this folder? Sind Sie sicher, dass Sie diesen Ordner nutzen möchten? Unknown. Unbekannt. Litres Liter ml ml No Data Available Keine Daten verfügbar Launching Windows Explorer failed Das Starten vom Windows Explorer ist gescheitert Could not find explorer.exe in path to launch Windows Explorer. Explorer.exe konnte nicht den Pfad im Windows-Explorer starten. SleepyHead (%1) needs to upgrade its database for %2 %3 %4 SleepyHead (%1) braucht, um seine Datenbank zu aktualisieren %2 %3 %4 <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <b> SleepyHead hält eine Sicherung der Geräte-Datenkarte, die es für diesen Zweck verwendet. </ b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> <i> Ihre alten Gerätedaten sollten regeneriert werden. Sie haben die Backup-Funktion während eines früheren Datenimports nicht deaktiviert. </ i> SleepyHead does not yet have any automatic card backups stored for this device. SleepyHead verfügt noch nicht über alle für dieses Gerät gespeicherten automatischen Karten Backups. This means you will need to import this machine data again afterwards from your own backups or data card. Das heißt, Sie müssen diese Gerätedaten danach wieder von Ihren eigenen Backups oder Datenkarte importieren. Important: Wichtig: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. Wenn Sie ein Upgrade beauftragen, können Sie <font size=+1> nicht </ font> dieses Profil verwenden mehr mit der vorherigen Version. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. Wenn Sie besorgt sind, klicken Sie auf Nein, um Ihr Profil manuell zu beenden und starten Sie ein Backup, bevor Sie Schlafmütze wieder verwenden. Are you ready to upgrade, so you can run the new version of SleepyHead? Sie können Sie die neue Version von Sleepyhead benutzen. Sind Sie bereit für ein Upgrade? Rebuilding from %1 Backup Wiederaufbau von%1-Backup Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? Möchten Sie auf automatische Sicherungen wechseln, so dass beim nächsten Mal, wenn Sie eine neue Version von SleepyHead benutzen, diese wieder aufgebaut wird? SleepyHead will now start the import wizard so you can reinstall your %1 data. SleepyHead wird nun den Import-Assistenten starten, so dass Sie Ihre%1 Daten neu installieren können. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: SleepyHead wird jetzt beendet, versuchen Sie Ihren Dateimanager zu starten, so dass Sie Ihr Profil manuell zurück holen: Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. Verwenden Sie Ihren Datei-Manager um eine Kopie von Ihrem Profilverzeichnis zu machen, danach starten Sie Sleepyhead und führen den Upgrade-Prozess zu Ende. Vibratory Snore (VS2) Vibrations-Schnarchen (VS2) There is a lockfile already present for profile '%1'. Es ist eine bereits für Ihr Profil vorliegende Sperrdatei '%1'. You can only work with one instance of an individual SleepyHead profile at a time. Sie können nur mit einer Instanz eines einzelnen SleepyHead-Profils zur gleichen Zeit arbeiten. Please close any other instances of SleepyHead running with this profile before proceeding. Bitte schließen Sie alle anderen Instanzen von Sleepyhead mit diesem Profil, bevor Sie fortfahren. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. Wenn keine anderen Instanzen von Sleepyhead ausgeführt werden (z. B., Absturz beim letzten startenl!),können Sie diese Nachricht ignorieren. There is a lockfile already present for this profile '%1', claimed on '%2'. Es ist ein bereits für dieses Profil vorhanden Sperrdatei '%1', behauptete auf '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. Wenn Sie mit Cloud-Storage arbeiten, stellen Sie sicher das Sleepyhead auf den anderen PC geschlossen ist. Sie müssen warten bis die Syncronisierung mit dem anderen PC abgeschlossen ist. ? ? Severity (0-1) Außergewöhnliche Schwere (0-1) Fixed Fest Auto Auto Fixed Bi-Level Feste Doppelebene Auto Bi-Level (Fixed PS) Automatische Doppelebene (Fest PS) ASV Fixed EPAP ASV fest EPAP ASV Variable EPAP ASV Variable EPAP %1 %2 %1 %2 %1-%2 %3 %1-%2 %3 Range Angebot Fixed %1 Fest %1 Auto Bi-Level Automatische Doppelebene Welcome to SleepyHead Willkommen bei SleepyHead What would you like to do? Was möchten Sie tun? Please Import Some Data Bitte Importieren Sie einige Daten CPAP<br/>Importer CPAP<br/>Importeur Oximetery<br/>Wizard Oximetrie<br/>Assistent View<br/>Statistics Ansicht<br/>Statistik It might be a good idea to check preferences first,</br>as there are some options that affect import. Es könnte eine gute Idee sein, Vorlieben zuerst zu überprüfen, </ br> da gibt es einige Optionen, die Sie verändern können. First import can take a few minutes. Der erste Import kann ein paar Minuten dauern. Click this box to see this in daily view. Klicken Sie auf dieses Feld, um die täglichen Ansicht anzuzeigen. The last time you used your %1... Das letzte Mal verwendet %1... last night letzte Nacht yesterday gestern %2 days ago %2 vor Tagen was %1 (on %2) war %1 (an %2) perfect :) perfekt :) pretty darn good verdammt gut reasonably good mäßig gut technically "treated" technisch "behandelt" not very good nicht sehr gut horrible, please consult your doctor schrecklich, konsultieren Sie bitte Ihren Arzt %1 hours, %2 minutes and %3 seconds %1 Stunden, %2 Minuten und %3 Sekunden You slept for %1. Sie schliefen %1. <font color = red>You only had the mask on for %1.</font> <font color = red>Sie hatten nur die Maske auf %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). Sie hatten keine <i>großen</i> Maskenlecks (maximum war %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. Sie hatte eine kleine, aber akzeptable Menge von <i> großen </ i> Masken Leckagen. You had significant periods of <i>major</i> mask leakage. Sie hatten erhebliche Zeiträume von <i> Großen </ i> Maskenlecks. Your mask is leaking way too much.. Talk to your CPAP advisor. Ihre Maske ist zu oft undicht .. Sprechen Sie mit Ihrem CPAP-Berater. Your CPAP machine blasted you with a constant %1%2 of air Ihr CPAP-Gerät versorgt Sie mit einer konstanten %1%2 Luft Your pressure was under %1%2 for %3% of the time. Für diese Zeit war Ihr Druck unter %1%2 für %3%. Your machine blasted you with a constant %1-%2 %3 of air. Ihr Gerät versorgt Sie mit einer konstanten %1-%2 %3 Luft. Your machine was under %1-%2 %3 for %4% of the time. Ihr Gerät war in dieser Zeit unter %1-%2 %3 für %4%. Your EPAP pressure was under %1%2 for %3% of the time. Ihre EPAP- Druck war unter %1%2 für %3% diese Zeit. Your IPAP pressure was under %1%2 for %3% of the time. Ihre IPAP- Druck war unter %1%2 für %3% diese Zeit. No CPAP data has been imported yet. Es wurden noch keine CPAP-Daten importiert. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> Neuste Oximetriedaten: <a onclick='alert("daily=%2");'>%1</a> (last night) (letzte Nacht) (yesterday) (gestern) (%2 day ago) (%2 Vortag) No oximetery data has been imported yet. Es wurden noch keine Oximetriedaten importiert. Very Important Warning Sehr wichtige Warnung <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. <p>IMMER <font size=+1 color=red><b>write protect</b></font> CPAP SDCards, bevor Sie sie in Ihren Computer. <span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> Index-Dateien, um die Karte zu schreiben, ohne zu fragen, was Ihre Karte unlesbar machen können von Ihrem CPAP-Gerät. Contec Contec CMS50 CMS50 Fisher & Paykel Fisher & Paykel ICON ICON DeVilbiss DeVilbiss Intellipap Intellipap ChoiceMMed ChoiceMMed MD300 MD300 Respironics Respironics M-Series M-Series Philips Respironics Philips Respironics System One System One ResMed ResMed S9 S9 Somnopose Somnopose Somnopose Software Somnopose Software Zeo Zeo Personal Sleep Coach Persönlichen Schlaftrainer Ramp Event Rampenereignis Ramp Rampe Your EPAP pressure fixed at %1%2. Ihre EPAP Druck fixiert ein %1%2. Database Outdated Please Rebuild CPAP Data veraltete Datenbank Bitte Rebuild CPAP Daten laden %1 threshold %1 Schwelle Sleep Zu Bett Wake Aufgewacht Series Serie Yes Ja No Nein Auto Bi-Level (Variable PS) Automatische Doppelebene (Variable PS) %1%2 %1% {1%2?} Fixed %1 (%2) Fest %1 (%2) Min %1 Max %2 (%3) Min %1 Max %2 (%3) EPAP %1 IPAP %2 (%3) EPAP %1 IPAP %2 (%3) PS %1 over %2-%3 (%4) PS %1 über %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) EPAP %1 PS %2-%3 (%6) EPAP %1 PS %2-%3 (%6) SmartFlex Mode SmartFlex-Modus Intellipap pressure relief mode. Intellipap Druckmodus. Ramp Only Nur Rampe Full Time Volle Zeit SmartFlex Level Smartflex Ebene Intellipap pressure relief level. Intellipap Druckniveau. SmartFlex Settings SmartFlex Einstellungen 15mm 15mm 22mm 22mm Flex Mode Flex Modus PRS1 pressure relief mode. PRS1 Druckmodus. C-Flex C-Flex C-Flex+ C-Flex+ A-Flex A-Flex Rise Time Anstiegszeit Bi-Flex Bi-Flex Flex Level Flex-Ebene PRS1 pressure relief setting. PRS1 Druckeinstellung. x1 x1 x2 x2 x3 x3 x4 x4 x5 x5 Humidifier Status Luftbefeuchter Status PRS1 humidifier connected? PRS1 Luftbefeuchter angeschlossen? Disconnected Getrennt Connected Angeschlossen Humidification Level Befeuchtung Ebene PRS1 Humidification level PRS1 Befeuchtung Ebene Humid. Lvl. Feucht. Lvl. System One Resistance Status System One Resistenzstatus Sys1 Resist. Status SYS1 Resistenzstatus System One Resistance Setting System One Resistenzeinstellungen System One Mask Resistance Setting System One Masken Resistenzeinstellungen Sys1 Resist. Set Sys1 Resist. Einst Hose Diameter Schlauchdurchmesser Diameter of primary CPAP hose Durchmesser des Primär CPAP Schlauch System One Resistance Lock System One Widerstandssperre Whether System One resistance settings are available to you. Die Widerstandseinstellungen von System One sind für Sie da. Sys1 Resist. Lock Sys1 Widerst. Sperre Auto On Automatisch ein A few breaths automatically starts machine Nach ein paar Atemzügen startet dias Gerät autmatisch Auto Off Automatisch aus Machine automatically switches off Gerät schaltet sich automatisch aus Mask Alert Maskenalarm Whether or not machine allows Mask checking. Soll das Gerät die Maskenprüfung ermöglichen. Show AHI Zeige AHI Whether or not machine shows AHI via LCD panel. Soll das Gerät AHI über LCD-Panel zeigen. Timed Breath Zeitüberschreitung Atem Machine Initiated Breath Gerät Initiiert Atem TB TB VPAP Adapt VPAP Anpassung EPR EPR ResMed Exhale Pressure Relief ResMed Ausatem Druckentlastung Patient??? Patient??? EPR Level EPR Ebene Exhale Pressure Relief Level Ausatem Druckentlastungs Ebene 0cmH2O 0cmH2O 1cmH2O 1cmH2O 2cmH2O 2cmH2O 3cmH2O 3cmH2O EPR: EPR: Weinmann Weinmann SOMNOsoft2 SOMNOsoft2 Pressure Min Mindestdruck Pressure Max Maximaler Druck Leak Flag Leck Flagge LF LF CPAP Session contains summary data only CPAP Sitzung enthält nur Übersichtsdaten PAP Mode PAP Modus PAP Device Mode PAP Gerätemodus ASV (Fixed EPAP) ASV (Fest EPAP) ASV (Variable EPAP) ASV (Variabel EPAP) Are you sure you want to reset all your channel colors and settings to defaults? Sind Sie sicher, dass Sie wollen, alle Ihre Kanal-Farben und-Einstellungen auf die Standardwerte zurücksetzen? ASV Auto EPAP ASV Auto EPAP You had an AHI of %1, which is considered %2 AHI von %1, die Sie hatten %2 (% of time) (% der Zeit) Duration %1:%2:%3 Dauer %1:%2:%3 AHI %1 AHI %1 Peak Spitze Maximum Maximum %1% %2 %1% %2 Heated Tubing beheizte Schläuche Heated Tubing Connected beheizter Schlauch angeschlossen Headed Tubing geleitete Schläuche By Pressure durch Druck Statistics at Pressure Statistiken des Drucks SleepyHead is proudly brought to you by JediMark. d MMM [ %1 - %2 ] %1 %1 Hide All Events Show All Events Unpin %1 Graph Pin %1 Graph Plots Disabled (Summary Only) %1: %2 %1% %2 {1:?} Relief: %1 Hours: %1h, %2m, %3s Machine Information Geräte-Informationen Compliance Only :( Graphs Switched Off Summary Only :( Nur die Zusammenfassung: ( Sessions Switched Off Journal Data SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead will not touch this folder, and will create a new one instead. Please be careful when playing in SleepyHead's profile folders :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. SleepyHead picked only the first one of these, and will use it in future: If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. CMS50F3.7 CMS50F CMS50F Loading %1 data... PLease Wait... Perfusion Index A relative assessment of the pulse strength at the monitoring site Perf. Index % APAP (Variable) Zero Upper Threshold Lower Threshold %1 Session #%2 You machine was on for %1. <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> or Snapshot %1 QextSerialPort General write operation failure Allgemeiner Schreibvorgangsausfall Caught a non-blocked signal (POSIX) Ein nicht blockiertes Signal empangen (POSIX) Receive buffer overflow Empfangspufferüberlauf There was an I/O error while communicating with the port Es gab einen I /O-Fehler während der Kommunikation mit dem Port The %1 file doesn't exists Die Datei %1 existiert nicht General read operation failure Allgemeiner Betriebsausfall The port detected a break condition Der Port ist unterbrochen Character buffer overrun Zeichenpufferüberlauf Permission denied Zugriff verweigert Invalid file descriptor (port was not opened correctly) Ungültige Dateibeschreibung (Port wurde nicht richtig geöffnet) Device is already locked Gerät bereits gesperrt Transmit buffer overflow Sendepufferüberlauf Operation timed out (POSIX) Betriebszeitüberschreitung (POSIX) No Error has occurred Kein Fehler aufgetreten The port detected a parity error in the received data Der Port hat einen Paritätsfehler in den empfangenen Daten The port detected a framing error (usually caused by incorrect baud rate settings) Der Anschluss erkennt einen Rahmenfehler (in der Regel durch falsche Baudrate verursacht) The file opened by the port is not a valid device Die Datei von der der Port geöffnet ist, ist kein gültiges Gerät Unable to allocate memory tables (POSIX) Kann Speicher nicht den Tabellen zuweisen (POSIX) Unknown error: %1 Unbekannter Fehler: %1 QuaZipFilePrivate ZIP/UNZIP API error %1 PLZ / UNZIP API-Fehler %1 Report Form Form about:blank Leere Seite SessionBar No Sessions Present Gegenwärtig keine Sitzung Statistics FL FL Days Tage Best&nbsp;%1 Bester&nbsp;%1 Usage Information Nutzungsdaten PS %1 PS %1 SleepyHead is pretty much useless without it. SleepyHead benötigt den durchschnittlichen Druck. Oximeter Statistics Oximetrie-Statistik CPAP Usage CPAP-Nutzung Blood Oxygen Saturation Blutsauerstoffsättigung Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. Diese Darstellung ignoriert Therapieeinstellungen mit weniger als %1 Tagen der aufgezeichneten Daten. % of time in %1 % der Zeit in %1 Last 30 Days Die letzten 30 Tage Compliant Days Konforme Tage %1 Index %1 Index Worst RX Setting Schlechteste RX-Einstellung Best RX Setting Beste RX-Einstellung 90% %1 90% %1 %1 day of %2 Data on %3 %1 Tage %2 Daten über %3 Changes to Prescription Settings Änderungen an den Einstellungen nur nach Absprache mit Ihrem Arzt vornehmen Therapy Efficiacy Therapie-Effizienz Pr. Rel. Druck Mind. Max %1 Max %1 %1 Median %1 Mittlere Min %1 Min %1 Most Recent Der letzte Tag Pressure Settings Druckeinstellungen Pressure Statistics Druck-Statistik Compliancy Kompatibilität Last 6 Months Die letzten 6 Monate Total Days Tage insgesamt CPAP %1 CPAP %1 Average %1 Durchschnittlich %1 No %1 data available. Keine %1 Daten verfügbar. Last Use Zuletzt verwendet First import can take a few minutes. Der erste Import kann ein paar Minuten dauern. Pulse Rate Pulsrate First Use Erste Verwendung Days AHI &gt;5.0 Tage AHI &gt;5.0 EPAP %1 EPAP %1 Last Week Letzte Woche Last Year Letztes Jahr Details Details Worst&nbsp;%1 Schlechtester&nbsp;%1 %1 days of %2 Data, between %3 and %4 %1 Tage %2 Daten, zwischen %3 und %4 APAP %1 - %2 APAP %1 - %2 Please Import Some Data Bitte Importieren Sie einige Daten Last Session Die letzte Sitzung Machine Information Geräte-Informationen CPAP Statistics CPAP-Statistik IPAP %1 IPAP %1 Leak Statistics Leck-Statistik It might be a good idea to check preferences first,</br>as there are some options that affect import. Es könnte eine gute Idee sein, Vorlieben zuerst zu überprüfen, </ br> da gibt es einige Optionen, die Sie verändern können. Average Hours per Night Durchschnittliche Stunden pro Nacht Compliance Beachtung % of time above %1 threshold % der Zeit über %1 Schwelle % of time below %1 threshold % der Zeit unter %1 Schwelle Fixed %1 Fest %1 I can haz data?!? Ich kann Daten haz?!? This lonely sleepy sheep has no data :( Diese Daten sind keine Schlafdaten :( Fixed %1 %2 Fest %1 %2 Pressure Relief Druckentlastung UpdaterWindow Log Anmelden Size Größe Saving as Speichern als &Finished &Fertig Redirected to umgeleitet A new version of SleepyHead is available! Eine neue Version von SleepyHead ist vorhanden! Download Error. Sorry, try again later. Download-Fehler. Es tut uns leid, versuchen Sie es später erneut. There was an error parsing the XML Update file. Es gab einen Fehler beim Analysieren der XML Update Datei. Updates Complete. SleepyHead needs to restart now, click Finished to do so. Updates komplett. SleepyHead muss jetzt neu starten, klicken Sie auf Fertig, um dies zu tun. XML update structure parsed cleanly XML-Update-Struktur sauber analysiert Version <b>%1</b> is available. You're currently running v%1 Version <b>%1 </ b> zur Verfügung. Es wird derzeit ausgeführt v%1 Please wait while updates are downloaded and installed... Bitte warten Sie solange, bis Updates heruntergeladen und installiert wurden ... Shiny new <b>v%1</b> is available. You're running old and busted v%2 Eine neue Version <b> v%1</ b> zur Verfügung. Sie betreiben eine alte Version v%2 SleepyHead Updater SleepyHead Updater SleepyHead Updates SleepyHead Updates Component Komponente Failed Gescheitert &Upgrade Now &Jetzt ein Upgrade Version Information Versionsinformationen Build Notes Erstellen Sie Notizen No new updates were found for your platform. Es wurden keine neuen Updates für Ihre Plattform gefunden. Download Complete Download komplett No updates were found for your platform. Es stehen keine neuen Updates zur Verfügung. Downloading & Installing Updates Herunterladen & Installieren von Updates Maybe &Later Möglicherweise &Später Extracting Extrahieren Update to QtLibs (v%1) Aktualisieren Sie QtLibs (v%1) about:blank Leere Seite Update Failed :( Update fehlgeschlagen: ( SleepyHead v%1, codename "%2" SleepyHead v%1, Deckname "%2" Progress Fortschritt Checking for SleepyHead Updates Es wird nach Updates für SleepyHead gesucht Please wait while downloading and installing updates. Bitte warten Sie, während das Herunterladen und die Installation von Updates läuft. File integrity check failed for %1 Datei-Integritätsprüfung fehlgeschlagen %1 %1 bytes received %1 Bytes empfangen A new version of $APP is available Eine neue Version von $APP ist vorhanden You might need to reinstall manually. Sorry :( Möglicherweise müssen Sie manuell neu installieren. Es tut uns leid: ( Updates Updates Downloading & Installing Updates... Herunterladen & Installieren von Updates... Version Version Update Complete! Update komplett! SleepyHead v%1 build notes SleepyHead v%1 Aufbau Hinweise Requesting Anfordern platform notes Plattform Notizen Ugh.. Something went wrong with unzipping. Pfui .. Etwas ist schiefgelaufen mit dem Entpacken. An update for SleepyHead is available. Ein Update für SleepyHead ist vorhanden. File size mismatch for %1 Dateigröße Fehlanpassung für %1 There was an error completing a network request: ( Es gab einen Fehler bei einer Netzwerkanfrage: ( Release Notes Versionshinweise gGraph Snapshot gGraphView 100% zoom level Reset Graph Layout Plots CPAP Overlays Oximeter Overlays Dotted Lines Restore X-axis zoom too 100% to view entire days data. Resets all graphs to a uniform height and default order. Y-Axis Remove Clone Clone %1 Graph sleepyhead-0.9.8/Translations/Espaniol.es.ts0000644000175000017500000141163712412506713020444 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. No se recibió transmisión de datos alguna desde el oxímetro. Please ensure you select 'upload' from the oximeter devices menu. Need to know how is 'upload' translated Por favor asegúrese de seleccionar 'upload' o 'descargar' desde el menú de Dispositivos de Oximetría. Daily Form Formulario Go to the previous day Ir al día anterior Prev or previo Anterior Show or hide the calender Mostrar u ocultar el calendario ... ... Go to the next day Ir al día siguiente Next or próximo Siguiente Go to the most recent day with data records Ir al día más reciente con datos registrados Events Eventos View Size Ver tamaño Notes Notas Journal or agenda Diario Small Pequeño Medium Mediano Big Grande Flags Graphs Color Color i i Ctrl+I Ctrl+I u u B B Ctrl+B Ctrl+B Zombie Zombi I'm feeling... Me siento... Weight Peso Awesome Increíble B.M.I. Ãndice de masa corporal I.M.C. Bookmarks Marcadores Add Bookmark Añadir Marcador Starts ¿inicios? Inicia Remove Bookmark Eliminar Marcador Zoom fully out Zoom completamente alejado 100% 100% Reset the graph heights to uniform sizes mmm Reajustar las alturas en la gráfica a tamaños uniformes Reset reajustar,recomponer Reinicializar Drop down this list to show/hide available graphs. Expanda esta lista para mostrar u ocultar los gráficos disponibles. Breakdown desarrollo, descomponer, desarrollar, DESGLOSAR Desglose events eventos Selection AHI Ãndice de Apnea/Hipoapnea | ¿selección? Selección IAH U1 ¿? U1 U2 ¿? U2 U3 ¿? U3 No %1 events are recorded this day . al final No hay eventos %1 registrados este día %1 event Evento %1 %1 events Eventos %1 PAP Mode: %1<br/> Modo de PAP: %1<br/> Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked. Existen datos de oximetría para este día pero sus marcas de tiempo no coinciden, por lo que los gráficos no serán enlazados. No Graphs :( No hay gráficos :( Int. Pulse mmm? Int. Pulso Int. SpO2 Int. SpO2 UF1 UF1 UF2 UF2 Session Start Times Hora de inicio de sesión Session End Times Hora de fin de sesión Duration Duración Oximetery Sessions Sesiones de Oximetría Position Sensor Sessions Sesiones del sensor de posición Unknown Session Sesión Desconocida Machine Settings Unavailable Ajustes de la máquina no disponibles EPR:%1 EPR_LEVEL:%2 EPR:%1 NIVEL_EPR:%2 This day has missing pressure, mode and settings data. Este día carece de datos de presión, modo y ajustes. %1%2 %1%2 This day just contains summary data, only limited information is available . Este día contiene información de resumen, sólo está disponibe información limitada. Time over leak redline mmm Límite de tiempo sobre fuga Time spent in ramp Tiempo pasado en rampa Sleep Sueño Wake Vigilia Event Breakdown Desglose de eventos Sessions all off! ¡Todas las sesionos deshabilitadas! Sessions exist for this day but are switched off. Existen sesiones para este día pero fueron deshabilitadas. Impossibly short session Sesión imposiblemente corta Zero hours?? ¿Cero horas? BRICK :( Ladrillo :( Complain to your Equipment Provider! ¡Quéjesete con el proveedor de su equipo! Statistics Estadísticas No data available No hay datos disponibles Oximeter Information Información del Oxímetro SpO2 Desaturations Desaturaciones SpO2 Pulse Change events Eventos de cambio de pulso SpO2 Baseline Used Línea basal de SpO2 usada Machine Settings Ajustes de la máquina Session Information Información de sesión CPAP Sessions Sesiones CPAP Sleep Stage Sessions Sesiones de Etapas del Sueño One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. Uno o más de los registros de forma de onda para esta sesión tenía datos fuente defectuosos. Algunos de los puntos superpuestos de la forma de onda podrían no encajar correctamente. Total time in apnea Total ramp time Tiempo total en rampa Time outside of ramp Tiempo fuera de la dampa AHI excluding ramp IAH fuera de rampa Sorry, your machine only provides compliance data. Lo siento, su máquina sólo proporciona información de cumplimiento. "Nothing's here!" Bob is bored with this days lack of data. Pick a Colour Escoja un color This bookmarked is in a currently disabled area.. Este marcador está en un área actualmente deshabilitada. Bookmark at %1 Marcador en %1 Show all graphs Mostrar todos los gráficos Hide all events Show all events No Graphs On! ¡Ningún gráfico mostrado! Summary Only :( Únicamente resumen :( Hide all graphs Ocultar todos los gráficos ExportCSV Export as CSV Exportar como CSV Dates: Fechas: Resolution: Resolución: Details Detallado Sessions Sesiones Daily Diario Filename: Nombre del archivo: Cancel Cancelar Export Exportar Start: Inicio: End: Fin: Quick Range: Intérvalo rápido: Most Recent Day Último Día Last Week Última Semana Last Fortnight Última Quincena Last Month Último Mes Last 6 Months Último Semestre Last Year Último Año Everything Todo Custom Personalizado ... ... SleepyHead_ SleepyHead_ Details_ Detalles_ Sessions_ Sesiones_ Summary_ Resumen_ Select file to export to Seleccione archivo a exportar CSV Files (*.csv) Archivos CSV (*.csv) DateTime FechaHora Session Sesión Event Evento Data/Duration Datos/Duración Date Fecha Session Count ¿conteo de sesiones? Conteo de sesión Start Inicio End Fin Total Time Tiempo total AHI IAH Count Conteo Avg Media %1% %1% FPIconLoader Import Error Error de Importación This Machine Record cannot be imported in this profile. Este registro de máquina no puede ser importado a este perfi. The Day records overlap with already existing content. Estos registros diarios se traslapan con contenido previamente existente. MainWindow SleepyHead SleepyHead &Statistics E&stadísticas <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Este es software de pre-lanzamiento, algunas partes de este programa podrían no funcionar como se pretende.</p></body></html> about:blank about:blank Report Mode Modo de reporte Standard Estándar Monthly Mensual Date Range Intérvalo de fechas &Help Browser Navegador de A&yuda ... ... qrc:/docs/index.html qrc:/docs/index.html &Navigation &Navegación Statistics Estadísticas Daily mmm Vista por día Overview Vista general Oximetry Oximetría Import Importar Help Ayuda &Bookmarks &Marcadores &Records &Registros &File &Archivo &View &Vista &Help A&yuda &Data &Datos &Advanced &Avanzado Purge Oximetery Data Purgar datos de oxímetro Rebuild CPAP Data Restablecer Datos de CPAP &Import Data &Importar datos Shift+F2 Shift+F2 &Preferences &Preferencias &Profiles &Perfiles E&xit &Salir Exit Salir View &Daily Ver Vista por &Día F5 F5 View &Overview Ver Vista &General F6 F6 View &Welcome Ver &Bienvenida F4 F4 - - Ctrl+Tab Ctrl+Tab Use &AntiAliasing Usar &AntiAliasing &About SleepyHead &Acerca de SleepyHead &Fullscreen Toggle Cambiar a &Pantalla Completa F11 F11 Show Debug Pane Mostrar panel de depuración &Reset Graph Layout &Reinicializar Gráfico Check for &Updates B&uscar Actualizaciones Take &Screenshot &Capturar Pantalla F12 F12 O&ximetry Wizard Asistente de O&ximetría F7 F7 Print &Report Imprimir &Reporte &Edit Profile &Editar perfil &Link Graph Groups &Enlazar Grupos de Gráficos Daily Calendar F9 F9 Backup &Journal Exp&ort Exp&ortar Online Users &Guide &Guía del Usuario (en línea) &Frequently Asked Questions Preguntas &Frecuentes &Automatic Oximetry Cleanup &Limpieza Automática de Oximetría Toggle &Line Cursor Activar Cursor de &Línea Ctrl+S Ctrl+S Foo Foo Change &User Cambiar &Usuario Purge &Current Selected Day &Purgar día actualmente seleccionado All data for current CPAP machine Todos los datos para la máquina de CPAP actual Right &Sidebar Acti&var panel derecho Ctrl+L Daily Sidebar F8 F8 View S&tatistics Ver Es&tadísticas Navigation Bookmarks Marcadores Records Purge ALL CPAP Data Exp&ort Data F10 F10 View Statistics Import &ZEO Data Importar Datos de &ZEO Import RemStar &MSeries Data Importar Datos de REMstar y Serie &M &Support SleepyHead Development Apoyar el De&sarrollo de SleepyHead Sleep Disorder Terms &Glossary Glosario de &Términos de Transtornos del Sueño Change &Language Cambiar &Idioma Change &Data Folder Cambiar &Directorio de Datos Import &Somnopose Data Importar Datos de &Somnopose Current Days Días Actuales Profile Perfil Welcome Bienvenida &About &Acerca de Loading... Cargando... Loading Data Cargando Datos Access to Import has been blocked while recalculations are in progress. Se ha bloqueado el acceso a Importar mientras hay recalculaciones en progreso. Importing Data Importando Datos Import Problem Couldn't find any new Machine Data at the locations given Problema de Importación No se pudieron encontrar nuevos datos de máquina en las ubicaciones proporcionadas Loading Cargando Copyright Copyright SleepyHead Project Page Página del Proyecto SleepyHead SleepyHead Wiki Wiki de SleepyHead This software is released under the GNU Public License v3.0<br/> Este software fue liberado bajo una Licencia Pública GNU v3.0<br/> This software comes with absolutely no warranty, either express of implied. Este software no viene con absolutamente ninguna garantía ya sea de manera expresa o implicada. It comes with no guarantee of fitness for any particular purpose. No viene con ninguna garantía de capacidad para ningún propósito en particular. No guarantees are made regarding the accuracy of any data this program displays. No se ha dado ninguna garantía con respecto a la exactitud de dato alguno mostrado por este programa. This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. Este no es un software médico, sino meramente una herramienta de investigación que proporciona una interpretación visual de los datos registrados por los dispositivos soportados. Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ No olvide darle Like ó +1 a Sleepyhead en <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> o <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ Please wait, SleepyHead is importing data... Por favor espere, SleepyHead está importando datos... Data successfully imported from the following locations Datos exitosamente importados desde las siguientes ubicaciones <b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum. <b>Advertencia:</b>Esta versión de prelanzamiento es únicamente para evaluadores beta. Favor de <b>NO</b> compartir fuera del Foro de Pruebas de SleepyHead. Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version. Favor de reportar errores para esta versión en el Foro de Pruebas de SleepyHead, pero primero revise el hilo de lanzamientos para asegurarse de que está ejecutando la última versión. When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. Cuando reporte errores, por favor asegúrese de proporcionar el número de versión de SleepyHead y los detalles de su sistema operativo así como el modelo de su dispositivo de CPAP. <b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes. <b>Advertencia:</b> Los reportes que este software genera no son aptos como prueba de apego ni para diagnóstico médico. These messages are only a temporary feature. Some people thought they were an error. Estos mensajes son sólo una característica temporal. Algunas personas pensaron que se trataba de un error. Please wait, importing from backup folder(s)... Por favor espere, importando desde el(los) directorio(s) de respaldo... Data successfully imported from the following locations: Datos exitosamente importados desde las siguientes ubicaciones: Couldn't find any new Machine Data at the locations given. No se pudieron encontrar nuevos datos de máquina en las ubicaciones proporcionadas. Import Problem Problema de Importación Couldn't find any valid Machine Data at %1 No se pudieron encontrar datos de máquina válidos en %1 Please insert your CPAP data card... Por favor inserte la tarjeta de datos de CPAP... Please wait, scanning for CPAP data cards... Por favor espere, detectando tarjetas de datos de CPAP... CPAP Data Located Datos de CPAP encontrados Please wait, launching file dialog... Por favor espere, lanzando diálogo de archivo... No CPAP data card detected, launching file dialog... No se detectó tarjeta de datos de CPAP, lanzando diálogo de archivo... Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. Por favor recuerde señalar al importador directorio raíz o letra de unidad de la tarjeta de datos y no a un subdirectorio. Import Reminder Importar Recordatorio Welcome to SleepyHead Bienvenido a SleepyHead About SleepyHead Acerca de SleepyHead This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. Este software ha sido creado para asisitirlo a revisar los datos producidos por las máquinas de CPAP que son utilizadas para el tratamiento de varios transtornos del sueño. SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. SleepyHead ha sido diseñado por un desarrollador de software con experiencia personal en transtornos del sueño, y ha sido moldeado a su vez por la retroalimentación de muchos evaluadores entusiastas que lidian con padecimientos similares. This is a beta release, some features may not yet behave as expected. Este es un lanzamiento beta, algunas características podrían aún no comportarse como se espera. Please report any bugs you find to SleepyHead's SourceForge page. Favor de reportar cualquie error que encuentre en la página de SourceForge de SleepyHead. Currenly supported machines: Máquinas actualmente soportadas: CPAP CPAP ResMed S9 models (CPAP, Auto, VPAP) ResMed S9 (modelos CPAP, Auto, VPAP) DeVilbiss Intellipap (Auto) DeVilbiss Intellipap (Auto) Fisher & Paykel ICON (CPAP, Auto) Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters Oxímetros Contec CMS50D+, CMS50E y CMS50F (no 50FW) ResMed S9 Oximeter Attachment Accesorio de Oxímetro ResMed S9 Online Help Resources Recursos de Ayuda en Línea Note: Nota: I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. No se recomienda usar este navegador integrado para explorar intensivamente la red. Funcionará, aunque fue ideado sólo como navegador para temas de ayuda. (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) (No se soporta encriptación SSL, así que no es buena idea anotar tus contraseñas o detalles personales en cualquier parte.) SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> <a href='http://www.sourceforge.net/projects/sleepyhead'>Sitio Web</a> del proyecto SleepyHead en SourceForge<br/> Further Information Más Información Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. Aquí están las<a href='qrc:/docs/release_notes.html'>Notas de la Versión</a>actuales. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. Además de unas pocas <a href='qrc:/docs/usage.html'>Notas de Uso</a>, y alguna información importante para usuarios de Mac. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia Acerca de la<a href='http://es.wikipedia.org/wiki/Apnea_del_sue%C3%B1o'>Apnea del Sueño</a> en Wikipedia Friendly forums to talk and learn about Sleep Apnea: Foros amigables para hablar y aprender sobre Apnea del Sueño: <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, <a href='http://www.cpaptalk.com'>Foro CPAPTalk (en inglés)</a> Copyright: Copyright: &copy;2011-2014 License: Licencia: This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. Este software fue liberado bajo una <a href="qrc:/COPYING">Licencia Pública GNU</a>. DISCLAIMER: RENUNCIA DE RESPONSABILIDAD: This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. Este <font color='red'><u>NO</u></font> es un software médico. Esta aplicación es meramente un visualizador de datos, y no se proporciona ninguna garantía en cuanto a la exactitud o corrección de cualquiera de los cálculos o datos mostrados. The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. El autor no será considerado responsable por quienquiera que se dañe a sí mismo o a otros por el uso o mal uso de este software. Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. Su médico debe ser siempre su primera y mejor fuente de orientación en cuanto a la importante tarea de administrar su salud. *** <u>Use at your own risk</u> *** *** <u>Úsese bajo su propio riesgo</u> *** Revision: Revisión: branch rama ramal Build Date: %1 %2 Fecha de compilación: %1 %2 Graphics Engine: %1 Motor Gráfico: %1 %1's Journal Choose where to save journal XML Files (*.xml) Data Folder Location: %1 Ubicación del Directorio de Datos: %1 SleepyHead, brought to you by Jedimark Sleepyhead, traído a usted por Jedimark Kudos & Credits Agradecimientos y Créditos Bugfixes, Patches and Platform Help: Correcciones,Parches y Ayuda de Plataforma: James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone. James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl y Roy Stone. Translators: Traductores: 3rd Party Libaries: Librerías de terceros: SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. SleepyHead fue realizado usando el <a href="http://qt-project.org">Marco de Aplicación Qt</a>. It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module. Se usa la librería<a href="http://code.google.com/p/qextserialport">QExtSerialPort</a>para acceso al puerto serie en el Módulo de Oximetría. In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. En el código del actualizador, SleepyHead utiliza <a href="http://sourceforge.net/projects/quazip">QuaZip</a> creado por Sergey A. Tachenov, el cual es una referencia de contenido en C++ del paquete ZIP/UNZIP de Gilles Vollant. Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Un agradecimiento especial a Pugsy del foro <a href='http://cpaptalk.com'>CPAPTalk</a>por su ayuda con la documentación y tutoriales, así como a todos los que ayudaron al probar y compartir sus datos de CPAP. Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. Gracias por usar SleepyHead. Si lo considera dentro de sus posibilidades, por favor apoye el futuro desarrollo haciendo una donación a través de Paypal. This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. Este software NO es apto para su uso en diagnóstico médico, ni para reportar apego al del tratamiento así como tampoco CUALQUIER otro uso médico. The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. Tanto el autor así como cualquier otro asociado con él NO aceptan responsabilidad por daños, consecuencia resultante o no del uso o mal uso de este software. Use this software entirely at your own risk. Use este software completamente bajo su propio riesgo. Access to Preferences has been blocked until recalculation completes. El acceso a Preferencias ha sido bloqueado hasta que se complete la recalculación. Please wait, importing... Por favor espere, importando... Are you sure you want to delete oximetry data for %1 Está usted seguro de borrar los datos de oximetría para %1 <b>Please be aware you can not undo this operation!</b> <b>¡Por favor esté consciente de que esta operación no puede ser deshecha!</b> Select the day with valid oximetry data in daily view first. Seleccione primero un día con datos de oximetría válidos en la Vista por Día. Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) Philips Respironics System One (modelos CPAP Pro, Auto, BiPAP y ASV) Imported %1 CPAP session(s) from %2 Se importó(aron) %1 sesión(es) de CPAP desde %2 Import Success Importación Exitosa Already up to date with CPAP data at %1 Datos de CPAP al corriente en %1 Up to date Al corriente Choose a folder Elija un directorio A %1 file structure for a %2 was located at: Una estructura de archivo %1 para un %2 fue encontrada en: A %1 file structure was located at: Una estructura de archivo %1 fue encontrada en: Would you like to import from this location? ¿Desea usted importar desde esta ubicación? Specify Especifique SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Guía de Usuario</a><br/>en línea de SleepyHead <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Preguntas Frecuentes</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glosario de Términos de Transtornos del Sueño</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">Wiki de SleepyHead</a><br/> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here. :D <3 Arie Klerk (Holandés), Steffen Reitz (Alemán), Chen Hao (Chino), Lars-Erik Söderström (Sueco), Damien Vigneron (Francés), António Jorge Costa (Portugués), Judith Guzmán (Español) y otros aún pendientes de añadir. There was an error saving screenshot to file "%1" Hubo un error al guardar la captura de pantalla en el archivo "%1" Screenshot saved to file "%1" Captura de pantalla guardada en el archivo "%1" Printing Disabled Impresión deshabilitada Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt Por favor recompile SleepyHead con Qt 4.8.5 o superior, ya que al imprimir se causa una falla con esta versión de Qt Gah! ¡Gah! If you can read this, the restart command didn't work. Your going to have to do it yourself manually. Si puede leer esto, el comando reiniciar no funcionó. Tendrá usted que hacerlo manualmente. Are you sure you want to rebuild all CPAP data for the following machine: ¿Está usted seguro de que quiere reestablecer todos los datos de CPAP para la siguiente máquina?: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. Por favor considere que esto podría resultar en la pérdida de datos del gráfico si los respaldos internos de SleepyHead son deshabilitados o interferidos de algún modo. For some reason, SleepyHead does not have internal backups for the following machine: Por algún motivo SleepyHead no tiene respaldos internos para la siguiente máquina: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Suponiendo que usted ha hecho <i>sus <b>propios</b> respaldos para TODOS sus datos de CPAP</i>, aún puede completar esta operación pero tendrá que restaurar desde sus respaldos manualmente. Are you really sure you want to do this? ¿Está en verdad seguro de querer realizar esto? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: Un error de permiso de archivo o similar arruinó el proceso de purgado, tendrá usted que eliminar el siguiente directorio manualmente: Because there are no internal backups to rebuild from, you will have to restore from your own. Debido a que no hay respaldos internos desde donde reestablecer, tendrá que restaurar usted mismo. <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Please ensure you are running the latest version before reporting any bugs. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! This red message line is intentional, and will not be a feature in the final version... Data Folder Location: <a href="file://%1">%2</a> James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Would you like to import from your own backups now? (you will have no data visible for this machine until you do) ¿Le gustaría importar desde sus propios respaldos ahora? (No habrá datos visibles para esta máquina hasta que así lo haga) You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: Note as a precaution, the backup folder will be left in place. Are you <b>absolutely sure</b> you want to proceed? Performance will be degraded during these recalculations. El desempeño se reducirá durante estas recalculaciones. Recalculating Indices Recalculando Ãndices Loading Event Data Cargando Datos de Eventos Recalculating Summaries Recalculando Resúmenes Restart Required Reinicio Requerido Recalculations are complete, the application now needs to restart to display the changes. Las recalculaciones están completas, se requiere reiniciar la aplicación para reflejar los cambios. Recalculations are now complete. Las recalculaciones están ahora completas. Task Completed Tarea Completada There was a problem opening ZEO File: Hubo un problema abriendo el Archivo ZEO: Zeo CSV Import complete Importación de CSV Zeo There was a problem opening MSeries block File: Hubo un problema abriendo el Archivo de Bloques del SerieM: MSeries Import complete Importación de SerieM completa There was a problem opening Somnopose Data File: Hubo un problema abriendo el Archivo de Datos Somnopose: Somnopause Data Import complete Importación de Datos de Somnopause completada MinMaxWidget Auto-Fit Defaults Override The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. The Minimum Y-Axis value.. Note this can be a negative number if you wish. The Maximum Y-Axis value.. Must be greater than Minimum to work. Scaling Mode This button resets the Min and Max to match the Auto-Fit NewProfile Edit User Profile Editar Perfil de Usuario I agree to all the conditions above. Acepto todas las condiciones arriba mencionadas. User Information Información de Usuario User Name Nombre de Usuario Keep the kids out.. Nothing more.. This isn't meant to be uber security. Mantenga a los niños lejos nada más. Esto no se supone que sea máxima seguridad. Password Protect Profile Perfil Protegido por Contraseña Password Contraseña ...twice... ...otra vez... Locale Settings Configuración Local Country País TimeZone Zona Horaria about:blank DST Zone Zona de Horario de Verano Personal Information (for reports) Información Personal (para los reportes) First Name Nombre Last Name Apellidos D.O.B. Fecha de Nacimiento Gender Sexo Male Masculino Female Femenino Height Altura metric Métrico archiac Arcaico Contact Information Información de Contacto Address Domicilio Email Correo Electrónico Phone Teléfono CPAP Treatment Information Información del Tratamiento CPAP Date Diagnosed Fecha de Diagnóstico Untreated AHI IAH sin tratar CPAP Mode Modo de CPAP CPAP APAP Bi-Level Bi-Nivel ASV RX Pressure Presión Diagnosticada Doctors / Clinic Information Información del Médico/Clínica Doctors Name Nombre del Médico Practice Name Especialidad Patient ID ID de paciente SleepyHead TextLabel Etiqueta de Texto &Cancel &Cancelar &Back &Anterior &Next &Siguiente Select Country Seleccione País Welcome to SleepyHead Bienvenido a SleepyHead This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. Este software ha sido creado para asisitirlo a revisar los datos producidos por las máquinas de CPAP y otros equipos relacionados. SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. Este software fue liberado bajo una <a href="qrc:/COPYING">Licencia Pública GNU</a>. y no viene con ninguna garantía o afirmación de capacidad para propósito alguno. PLEASE READ CAREFULLY POR FAVOR LEA CUIDADOSAMENTE SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. SleepyHead ha sido concebido únicamente como un visor de datos, y definitivamente no como un sucedáneo de la orientación médica competente por parte de su médico tratatante. Accuracy of any data displayed is not and can not be guaranteed. La exactitud de los datos mostrados no está y no puede ser garantizada. Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. Cualquier reporte generado es EXCLUSIVAMENTE PARA USO PERSONAL y no es adecuado DE NINGÚN MODO para fines de apego al tratamiento o diagnóstico médico. The author will not be held liable for <u>anything</u> related to the use or misuse of this software. El autor no será considerado responsable por <u> absolutamente nada</u>relacionado con el uso o mal uso de este software. Use of this software is entirely at your own risk. El uso de este software es completamente bajo su propio riesgo. SleepyHead is copyright &copy;2011-2014 Mark Watkins SleepyHead tiene copyright &copy;2011-2014 Mark Watkins Please provide a username for this profile Por favor proporcione un nombre de usuario para este perfiĺ Passwords don't match Las contraseñas no coinciden Profile Changes Cambios al Perfil Accept and save this information? ¿Aceptar y guardar esta información? &Finish &Finalizar &Close this window &Cerrar esta Ventana Overview Form Formulario Range: Intérvalo: Last Week Última Semana Last Two Weeks Última Quincena Last Month Último Mes Last Two Months Último Bimestre Last Three Months Último Trimestre Last 6 Months Último Semestre Last Year Último Año Everything Todo Custom Personalizado Start: Inicio: End: Fin: Reset view to selected date range Reinicializar vista al intérvalo seleccionado ... ... Toggle Graph Visibility Activar Visibilidad del Gráfico Drop down to see list of graphs to switch on/off. Expanda esta lista para mostrar u ocultar los gráficos disponibles. Graphs Gráficos Respiratory Disturbance Index Ãndice de Perturbación Respiratoria Apnea Hypopnea Index Ãndice de Apnea- Hipoapnea Usage Uso Usage (hours) Uso (horas) Session Times Horarios de la sesión Session Times (hours) Tiempo de la sesión (horas) % in PB Respiración Periódica % en RP Periodic Breathing (% of night) Respiración Periódica (% de la noche) % in %1 %1 (% of night) Large Leaks (% of night) Peak RDI Ãndice de Perturbación Respiratoria IPR Pico Peak RDI Shows RDI Clusters (RDI/hr) IPR Pico Se muestran Grupos de IPR (IPR/hora) Peak AHI IAH Pico Peak AHI Shows AHI Clusters (AHI/hr) IAH Pico Se muestran Grupos de IAH (IAH/hora) Tidal Volume (ml) Volumen Corriente (mL) Minute Ventilation (L/min) Ventilación Minuto (L/min) Target Ventilation (L/min) Ventilación Objetivo (L/min) Patient Triggered Breaths (%) No estoy segura Inpiraciones iniciadas por el paciente (%) (count) (conteo) Oxygen Saturation (%) Saturación de Oxígeno (%) SensAwake (count) SensAwake (conteo) Body Mass Index Ãndice de Masa Corporaĺ How you felt (0-10) ¿Cómo se sintió? (0-10) Zombie Meter Zombímetro breaths/min inpiraciones/minuto L/b L/inspiración %PTB Inspiraciones Iniciadas por el Paciente %IIP % PB Respiración Periódica %RP % %1 Show all graphs Mostrar todos los gráficos No Graphs On! ¡Ningún gráfico mostrado! Hide all graphs Ocultar todos los gráficos OximeterImport Dialog Diálogo Oximeter Import Wizard Asistente para la Importación de Datos desde el Oxímetro <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> No lo tocaré aún o.O Skip this page next time. Saltar esta pantalla la próxima vez. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> <html><head/><body><p>SleepyHead soporta completamente los oxímetros en serie Contec CMS50D+/E/F , <br/>así como los archivos de datos creados por el software de los oxímetros ChoiceMMed MD300W1.</p></body></html> Where would you like to import from? ¿Desde dónde le gustaría importar? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> <html><head/><body><p>Esta opción le permititirá importar (mediante un cable) los registros internos de su oxímetro.</p><p>Es posible que después de seleccionar esta opción deba realizar alguna acción en el menú del dispositivo para iniciar la descarga en algunos dispositivos.</p></body></html> Directly from a recording on a device Directamente desde un registro en el dispositivo <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> <html><head/><body><p>Si no le molesta estar delante de una computadora funcionando toda la noche, esta opción le proporcionará una útil gráfica de pletismografía, la cual indica el ritmo cardiaco además de las lecturas normales de oximetría.</p></body></html> Record attached to computer overnight (provides plethysomogram) Desde un registro procesado de un día para otro (proporciona pletismografía) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> <html><head/><body><p>Esta opción le permitirá importar datos desde archivos creados por el software de acompañamiento del oxímetro de pulso, tales como SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review Desde un archivo de datos guardado por otro programa, como SpO2Review <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Recordatorio para usuarios de CPAP: </span><span style=" color:#fb0000;">¿Ha importado sus sesiones de CPAP primero?</span></p><p>De no ser así no tendrá una línea de tiempo válida con la cual sincronizar esta sesión de oximetría.<br/><br/>Para asegurar una buena sincronización entre dispositivos, siempre trate de iniciarlos al mismo tiempo. Please connect your oximeter device Por favor conecte su oxímetro Press Start to commence recording Presione Inicio para comenzar el registro Show Live Graphs Mostrar Gráficos en Vivo Duration Duración SpO2 % % SpO2 Pulse Rate Frecuencia de Pulso Multiple Sessions Detected Múltiples sesiones detectadas Please choose which one you want to import into SleepyHead Por favor elija cuál desea importar a SleepyHead Start Time Import Time Hora de Importación Details Detalles Import Completed. When did the recording start? Importación Completada. ¿Cuándó comenzó la grabación? Day recording (normally would of) started ding (normally would of) ?? Regitro diario comenzado Oximeter Starting time Hora de inicio del oxímetro I want to use the time reported by my oximeter's built in clock. Quiero usar la hora registrada por el reloj interno de mi oxímetro. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. Inicié esta grabación del oxímetro al mismo (o casi) tiempo de una sesión de mi máquina CPAP. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>SleepyHead necesita un tiempo inicial para saber dónde guardar esta sesión de oximetría.</p><p>Elija una de las opciones siguientes:</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> <html><head/><body><p>Nota: Sincronizar con el inicio de una sesión CPAP será siempre más preciso.</p></body></html> Choose CPAP session to sync to: Elija con cuál sesión CPAP sincronizar: ... ... You can manually adjust the time here if required: Puede ajustar manualmente la hora si es necesario: HH:mm:ssap ap? HH:mm:ssap &Cancel &Cancelar &Information Page &Hoja de información &Retry &Choose Session &Escoger Sesión &End Recording &Finalizar Registro &Sync and Save &Sincronizar y Guardar &Save and Finish &Guardar y Terminar &Start &Iniciar Scanning for compatible oximeters Buscanda oxímetros compatibles Could not detect any connected oximeter devices. No se pudieron detectar oxímetros conectados. Connecting to %1 Oximeter Conectando al oxímetro %1 "%1", session %2 Waiting for %1 to start Waiting for the device to start the upload process... Select upload option on %1 Seleccione ĺa opción adecuada para realizar la descarga en %1 Waiting for you to start the upload process... Empezando a que usted inicie el proceso de descarga... %1 device is uploading data... El dispositivo %1 está descargando información... Please wait until oximeter upload process completes. Do not unplug your oximeter. Por favor espere hasta que la descarga desde el oxímetro finalice. No lo desconecte. Oximeter import completed.. Importación desde el oxímetro completada. Select a valid oximetry data file Seleccione un archivo válido con datos de oximetría Oximetry Files (*.spo *.spor *.spo2 *.dat) Archivos de Qximetría (*.spo *.spor *.spo2 *.dat) No Oximetery module could parse the given file: Ninguno de los módulos de oximetría puede interpretar el archivo proporcionado: Oximeter not detected Oxímetro no detectado Couldn't access oximeter No se pudo acceder al oxímetro Live Oximetery Mode Modo de oximetría en vivo Starting up... Iniciando... If you can still read this after a few seconds, cancel and try again Si aún puede leer esto después de asgunos segundos, cancele e inténtelo de nuevo Live Import Stopped Importación en vivo detenida Live Oximetery Stopped Oximetría en vivo detenida Live Oximetery import has been stopped La importación de oximetría en vivo ha sido detenida %1 session(s) on %2, starting at %3 %1 sesión(es) en %2, comenzando en %3 No CPAP data available on %1 No hay datos de CPAP disponibles en %1 %1 %1 Recording... Registrando... Finger not detected Dedo no detectado I want to use the time my computer recorded for this live oximetry session. Quiero usar la hora registrada por mi computadora para esta sesión de oximetría en vivo. I need to set the time manually, because my oximeter doesn't have an internal clock. Necesito configurar la hora manualmente porque mi oxímetro no tiene reloj interno. Something went wrong getting session data Algo salió mal al obtener los datos de la sesión CMS50 Session %1 Sesión CMS50 %1 Oximetry Form Formulario Date Fecha d/MM/yy h:mm:ss AP ¿ap? d/MM/aa h:mm:ss AP R&eset R&einicializar SpO2 Pulse Pulso ... ... &Open .spo/R File &Abrir archivo .spo/R Serial &Import &Importación en serie &Start Live Iniciar en &vivo Serial Port Puerto Serie &Rescan Ports Volver a &buscar puertos PreferencesDialog Preferences Preferencias &Import &Importar Session Settings Configuración de la sesión Combine Close Sessions Combinar Sesiones Cerradas Minutes Minutos Multiple sessions closer together than this value will be kept on the same day. Sesiones múltiples más cercanas que este valor serán mantenidas en el mimsmo día. Ignore Short Sessions Ignorar sesiones cortas <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sesiones de duración menor a esta no serán mostradas<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> Day Split Time Hora de cambio de día Sessions starting before this time will go to the previous calendar day. Sesiones comenzadas antes de esta hora van al día calendario previo. Keep session data in memory to speed up revisiting days. Mantener los datos de sesión en la memoria para agilizar la revisión de los días. Cache Session Data (uses more system memory) Almacenar datos de sesión en caché (se usa más memoria del sistema) Summary only data is more accurate for ResMed users if this is left on. Los datos de sólo resumen son más precisos para usuarion de ResMed si se marca esta opción. Don't Split Summary Days No separar días de resumen Session Storage Options Opciones de almacenamiento de sesión This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) Esto mantiene un respaldo de los datos de la tarjeta SD para las máquinas ResMed. Las máquinas ResMed eliminan los datos de alta resolución más viejos de 7 días, y los datos de gráficos más viejos de 30. SleepyHead puede almacenar una copia de dichos datos por si usted alguna vez requiere reinstalar (altamente recomendado,a menos que tenga poco espacio en disco y no le importe la información de gráficos). Create SD Card Backups during Import (Turn this off at your own peril!) This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. Esto hace que SleepyHead ocupe la mitad de espacio, pero la importación y el cambio entre días demorará más. Si tiene una computadora nueva con un pequeño disco de estado sólido, esta es una buena opción. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) Comprimir datos de sesión (vuelve más pequeños los datos de SH, pero el cambio entre días se ralentiza) Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Comprime los respaldos de ResMed (EDF) para ahorrar espacio en disco. Los archivos EDF respaldados son almacenados en formato .gz, el cual es común en plataformas Mac y Linux. SleepyHead puede importar desde este directorio comprimido de respaldo de manera nativa. Para usarse con ResScan se requerirá descomprimir los archivos .gz primero. Compress SD Card Backups (slower first import, but makes backups smaller) Comprimir Respaldos de tarjeta SD (primera importación más lenta, respaldos más pequeños) The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. Las siguientes opciones afectan la cantidad de espacio en disco usada por SleepyHead, y todas afectan el tiempo que toman las importaciones en realizarse. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Cambiar las opciones de compresión de los respaldos de la tarjeta SD no recomprimen automáticamente los datos de respaldo.</span></p></body></html> &CPAP &CPAP CPAP Mask Information Información de máscara para CPAP Mask Type Tipo de mascarilla Generic mask type. Select the one that's closest to your mask. Tipo genérico de mascarilla. Seleccione el que sea más cercano a la suya. Description Descripción The name of your mask, or at least the name you call it. El nombre de su mascarilla, o al menos como usted la llama. Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. Método para el cálculo de fugas accidentales si es que no es proporcionado por su máquina. Nota: La de modelo estadístico es experimental. Mask Profile Perfil de mascarilla Statistical Model Modelo Estadístico Leak calcs Cálculos de fuga Started Using Inicio de uso The date you started using this mask El día en que comenzó a usar esta mascarilla Leak Profile Perfil de fuga Pressure Presión Leak Fuga <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Nota: </span>Los perfiles de fuga no funcionan aún.</p></body></html> Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) Muestra el índice de Perturbación Respiratoria en vez del índice de Apnea-Hipoapnea (IPR=IAH+RERA) Use RDI instead of AHI (PRS1 only) Usar IPR en vez de IAH (sólo PRS1) Don't show any compliance information No mostrar información de cumplimiento (apego) Show Compliance Mostrar cumplimiento Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. Considerar días con menos uso que este como incumplidos. Cuatro horas son generalmente consideradas como en cumplimiento. hours horas as over Más de of usage per night de uso por noche Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Habilitar/deshabilitar mejoras experimentales de detección de eventos. Esto permite detectar eventos limítrofes, y algunos que la máquina pasó por alto. Esta opción debe habilitarse antes de importar, de otro modo es requerida una purga. Custom User Event Flagging Detección de eventos personalizada por el usuario Flow Restriction Restricción de flujo Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. Porcentaje de restricción de fluje respecto al valor medio. Un valor de 20% funciona bien para detectar apneas. % % <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La deteccióon personalizada es un método experimental para detectar eventos errados por la máquina. Estos <span style=" text-decoration: underline;">no</span> están incluidos en el IAH.</p></body></html> Duration of airflow restriction Duración de la restricción de flujo s s Event Duration Duración del evento Allow duplicates near machine events. Permitir duplicados cercanos a eventos de la máquina. AHI/Hour Graph Settings Configuración del Gráfico IAH/hora Window Ventana Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. Ajusta la cantidad de datos considerados para cada punto en el gráfico IAH/hora. 60 minutos por defecto. Se recomienda dejar este valor. minutes minutos Reset the counter to zero at beginning of each (time) window. Reinicializa el contador a cero al inicio de cada ventana de tiempo. Zero Reset Reinicializar a cero CPAP Clock Drift Deriva del reloj del CPAP Do not import sessions older than: No importar sesiones más antiguas que: Sessions older than this date will not be imported Las sesiones más antiguas que esta fecha no serán importadas dd MMMM yyyy dd MMMM aaaa Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON) Crear respaldos de la tarjeta SD durante la importación (Esto es muy importante para ResMed y FP ICON) Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) No modificar a menos que el reloj del CPAP esté errado. Trate de sincronizarlo con el reloj de su computadora (que debe estar sincronizado a un servidor) seconds segundos Show in Event Breakdown Piechart Mostra gráfico de pastel con el desglose de eventos #1 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Esta opción experimental trata de usar el sistema de detección de eventos de SleepyHead para mejorar el posicionamiento de los eventos detectados por la máquina. Resync Machine Detected Events (Experimental) Resincronizar los eventos detectados por la máquina (EXPERIMENTAL) User definable threshold considered large leak Umbral definible por el usuario para la consideración de fugas grandes L/min L/min Whether to show the leak redline in the leak graph Mostrar/Ocultar la línea roja en el gráfico de fugas Show Leak Redline Mostrar línea roja de fugas &Events &Eventos Not entirely sure if this will get to live or not.. No es seguro si esto sobrevivirá o no. Show Mostrar Colour Color Event Evento Graphs G&ráficos Search Buscar Filters the graph list. Simply start typing the name of the graph your looking for. Filtra la lista de gráficos. Sólo empiece a teclear el nombre del gráfico buscado. &Defaults Por &Defecto Double click on the (Y-axis) min/max values to edit them Doble clic en los valores min/máx (Eje Y) para editarlos &Oximetry &Oximetría Type Tipo Tries to forces the oximetry data to link with CPAP when possible. Intenta forzar los datos de oximetría a enlazarse con es CPAP cuando sea posible. Link Oximetry and CPAP graphs Enlazar gráficos de CPAP y oximetría Flag changes in oximetry stats Señalar cambios en las estadísticas de oximetría SPO2 Percentage drop in oxygen saturation Porcentaje de caída en la saturación de oxígeno Pulse Pulso Sudden change in Pulse Rate of at least this amount Cambio repentino en el pulso de al menos esta cantidad bpm ppm Minimum duration of drop in oxygen saturation Duración mínima de la caída en la saturación de oxígeno Minimum duration of pulse change event. Duración mínima del evento de cambio en el pulso. Discard chunks under Descartar fragmentos menores a Small chunks of oximetry data under this amount will be discarded. Fragmentos pequeños de datos de oximetría menores a esta cantidad serán descartados. &General General Settings Configuración General Daily view navigation buttons will skip over days without data records Los botones de navegación en la vista diaria se saltarán los días sin datos Skip over Empty Days Saltar días vacíos Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. Permitir el uso de núcleos múltiples del CPU de ser posible para mejorar el desempeño. Afecta principalmente al importador. Enable Multithreading Habilitar Multithreading Bypass the login screen and load the most recent User Profile Saltar la pantalla de inicio de sesión y cargar el perfil de usuario más reciente Skip Login Screen Saltar pantalla de inicio de sesión <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> <html><head/><body><p>Estas características han sido podadas. Volverán después.</p></body></html> Changes to the following settings needs a restart, but not a recalc. Cambios a los siguientes ajustes requieren un reinicio pero no una recalculación. Oximetery Settings Ajustes de oximetría Preferred Calculation Methods Métodos de cálculo preferidos Middle Calculations ¡? Cálculo del centro Upper Percentile Percentil superior For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. Para consistencia, los usuarios de ResMed deben usar 95% aquí, ya que es el único valor disponible en los días de sólo resumen. Median is recommended for ResMed users. Se recomienda Mediana para los usuarios de ResMed. Median Mediana Weighted Average Promedio Ponderado Normal Average Promedio ResMed users probably should use 99th Percentile for visual consistency. Los usuarios de ResMed deberían usad percentil 99 para consistencia visual. True Maximum Máximo Verdadero 99% Percentile Percentil 99% Maximum Calcs Cálculo de máximo Automatically Check For Updates Buscar actualizaciones automáticamente Check for new version every Buscar por una nueva versión cada Sourceforge hosts this project for free.. Please be considerate of their resources.. SourceForge hospeda este proyecto de manera gratuita. Por favor sea considerado con sus recursos. days. días. &Check for Updates now &Buscar actualizaciones ahora Last Checked For Updates: Ultima búsqueda de actualizaciones: TextLabel Etiqueta de Texto <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si está interesado en ayudar a evaluar nuevas características y correcciones anticipadamente, haga clic aquí.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Pero considere que eso podría involucrar código inestable en algunas ocasiones.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> I want to try experimental and test builds (Advanced users only please.) Quiero probar versiones experimentales y de evaluación. (Sólo usuarios avanzados por favor.) &Appearance A&pariencia Graph Settings Ajustes de gráficos Bar Tops ? Barras Line Chart Líneas Overview Linecharts Gráficos de vista general <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> <html><head/><body><p>Esto hace que el deplazamiento mientras se hace zoom sea más fácil en Touchpads bidireccionales sensibles.</p><p>El valor recomendado son 50 ms.</p></body></html> milliseconds milisegundos Scroll Dampening Atenuación del desplazamiento Overlay Flags Sobreponer indicadores Line Thickness Grosor de línea The pixel thickness of line plots Grosor del pixel en gráficos de línea Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. El caché Pixmap es una técnica de aceleración de gráficos. Puede causar problemas con el uso de fuentes durante el despliegue de gráficos en tu plataforma. The visual method of displaying waveform overlay flags. Método visual para mostrar los indicadores sobrepuestos de la forma de onda. Standard Bars Barras estándar Top & Bottom Markers Marcas arriba y abajo Graph Height Altura del gráfico Default display height of graphs in pixels Altura por defecto para el despliegue de gráficos en pixeles How long you want the tooltips to stay visible. Que tanto tiempo permanece visible la ventana de ayuda contextual. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Sincronizando datos de oximetría y CPAP</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;"> Datos CMS50 importados desde SpO2Review (de archivos .spoR) o el método de importación serie </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">no</span><span style=" font-family:'Sans'; font-size:10pt;"> tienen las marcas de tiempo necesarias para sincronizar.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">El modo de visualización en vivo (usando un cable serie) es la única manera de obtener una sincronización precisa con las oxímetros CMS50, pero no compensa la deriva del reloj del CPAP.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Si inicia el modo de grabación de los oxímetros </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactamente </span><span style=" font-family:'Sans'; font-size:10pt;">al mismo tiempo que inicia su máquina CPAP, ahora también puede lograr la sincronización </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">El proceso de importación serie toma la hora de inicio de la último sesión CPAP. (¡Recuerde importar los datos del CPAP primero!)</span></p></body></html> Events Eventos Reset &Defaults <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> Waveforms Flag rapid changes in oximetry stats Other oximetry options Flag SPO2 Desaturations Below Discard segments under Flag Pulse Rate Above Flag Pulse Rate Below Contec CMS50D+/E/F Contec CMS50F v3.7+ ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Update Oximeter Clock during import Show flags for machine detected events that haven't been identified yet. Show Unknown Flags Import without nagging Tooltip Timeout Visibilidad del menú de ayuda contextual Graph Tooltips Ayuda contextual del gráfico Top Markers Other Visual Settings Otras configuraciones visuales Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. El Anti-Aliasing suaviza la líneas en los gráficos. Algunos gráficos lucen más atractivos con esta opción activada. También afectará a los reportes impresos. Pruébela y vea si le agrada. Use Anti-Aliasing Usar Anti-Aliasing Makes certain plots look more "square waved". Hace que algunos gráficos luzcan más "cuadrados". Square Wave Plots Gráficos de onda cuadrada Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. Permite que se puedan hacer capturas de pantalla de los gráficos. Tanto el gráfico de pastel con el desglose de eventos como el código de impresión usan este método. Desafortunadamente algunas computadoras o versiones de Qt viejas pueden volver inestable esta aplicación si se activa esta opción. Show event breakdown pie chart Mostrar gráfico de pastel con el desglose de eventos Use Pixmap Caching Usar caché Pixmap Animations && Fancy Stuff elegantes, no coquetas Animaciones y cosas coquetas Whether to allow changing yAxis scales by double clicking on yAxis labels Permitir cambiar la escala del eje Y haciendo dobli clic en sus etiquetas Allow YAxis Scaling Permitir escalado del eje Y Application Fonts Fuentes de la aplicación Font Fuente Size Tamaño Bold Negritas Italic Itálica Application Aplicación Graph Text Texto del Gráfico Graph Titles Títulos del gráfico Big Text Texto grande Details Detalles &Cancel &Cancelar &Ok &Aceptar Flag Minor Flag Span Always Minor Nasal Pillows Almohadillas nasales Name Nombre Color Color Flag Type Label CPAP Events Oximeter Events Positional Events Sleep Stage Events Unknown Events Double click to change the descriptive name this channel. Double click to change the default color for this channel plot/flag/data. Here you can change the type of flag shown for this event This is the short-form label to indicate this channel on screen. This is a description of what this channel does. Lower Upper CPAP Waveforms Oximeter Waveforms Positional Waveforms Sleep Stage Waveforms Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Data Reindex Required Se requiere reindizar datos A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? Se requiere reindizar los datos para aplicar estos cambios. Esta operación tomará un par de minutos para completarse. ¿Está seguro que quiere realizar estos cambios? Restart Required Reinicio Requerido One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? Uno o más de los cambios realizados requieren que esta aplicación sea reiniciada para que surtan efecto. ¿Le gustaría hacer esto ahora? Daily Graphs Gráficos por día Overview Graphs Gráficos generales Graph Gráfico Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. Desactivar los respaldos automáticos no es una buena idea, porque SleepyHead los necesita para restaurar la base de datos si se producen errores. Are you really sure you want to do this? ¿Está verdaderamente seguro de querer realizar esto? Confirmation Confirmación Are you sure you want to reset your graph preferences to the defaults? ¿Está seguro de que quiere reinicializar los ajustes de gráficos a sus valores por defecto? This may not be a good idea Esto podría no ser una buena idea ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). Las máquinas ResMed S9 rutinariamente eliminan ciertos datos de la tarjeta SD si son anteriores a 7 y 30 días (depende de la resolución). If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. Si alguna vez requiere reimportar estos datos nuevamente, tanto en SleepyHead como en ResScan, estos no estarán disponibles. If you need to conserve disk space, please remember to carry out manual backups. Si requiere conservar espacio en disco, por favor recuerde realizar respaldos manuales. Are you sure you want to disable these backups? ¿Está seguro de que quiere deshabilitar estos respaldos? ProfileSelect Select Profile Seleccione perfil de usuario Search: Buscar: Start with the selected user profile. Iniciar con el perfil de usuario seleccionado. Create a new user profile. Crear un nuevo perfil de usuario. Choose a different SleepyHead data folder. Elegir un directorio de datos distinto para SleepyHead. &Different Folder &Directorio distinto SleepyHead SleepyHead [version] [versión] Click here if you didn't want to start SleepyHead. Haga clic aquí si no quería isiciar SleepyHead. &Quit &Salir Folder: Directorio: The current location of SleepyHead data store. Ubicación actual del almacenamiento de datos de SleepyHead. [data directory] [directorio de datos] New Profile Nuevo perfil &Select User &Seleccionar Usuario Open Profile Abrir perfil Edit Profile Editar perfil Delete Profile Eliminar perfil Enter Password for %1 Ingrese contraseña para %1 Incorrect Password Contraseña incorrecta You entered the password wrong too many times. Ha ingresado una contraseña equivocada demasiadas veces. Enter the word DELETE below to confirm. I don know if changing here changes the string comparison also, so let DELETE as it is Escriba DELETE debajo para confirmar. You are about to destroy profile '%1'. Está a punto de destruir el perfil '%1'. Sorry Lo sentimos You need to enter DELETE in capital letters. Necesita escribir DELETE en mayúsculas. Could not open profile.. You will need to delete this profile directory manually No se pudo abrir el perfil. Necesitará eliminar el directorio de este perfil manualmente You will find it under the following location: Lo encontrará en esta ubicación: You entered an incorrect password Ha ingresado una contraseña incorrecta If you're trying to delete because you forgot the password, you need to delete it manually. Si está tratando de eliminarlo porque olvidó la contraseña, tendrá que hacerlo manualmente. There was an error deleting the profile directory, you need to manually remove it. Hubo un error al eliminar el directorio con el perfil, necesitará removerlo manualmente. Profile '%1' was succesfully deleted El perfil '%1' fue eliminado con éxito Create new profile Crear nuevo perfil Enter Password Ingrese contraseña You entered an Incorrect Password too many times. Exiting! Ha ingresado una contraseña incorrecta demasiadas veces. ¡Saliendo! QObject No Data Sin datos On Activado Off Desactivado cm cm " " ft pie(s) lb libra(s) oz Kg cmH2O Hours Horas bpm pulsaciones por minuto/ ¿latidos por minuto? ppm ? Severity (0-1) Severidad (0-1) Error Warning Advertencia Please Note Por favor considere Compliance Only :( Graphs Switched Off Summary Only :( Únicamente resumen :( Sessions Switched Off &Yes &Sí &No &Cancel &Cancelar &Destroy &Destruir &Save &Guardad BMI índice de masa corporal IMC Weight Peso Zombie Zombi Pulse Rate Frecuencia de Pulso SpO2 Plethy Pleti Pressure Presión Daily Vista por día Overview Vista general Oximetry Oximetría Oximeter Oxímetro Event Flags Indicadores de eventos CPAP CPAP BiPAP BiPAP Bi-Level Bi-Nivel EPAP Min EPAP Max EPAP IPAP APAP ASV ST/ASV Humidifier Humidificador H OA AO A CA AC FL LF LE evento de fuga EF EP Resoplido RS VS ronquido vibratorio RV VS2 RV2 RERA PP P RE NR NRI O2 PC CP UF1 UF1 UF2 UF2 UF3 UF3 PS SP AHI IAH RDI IPR AI IA HI IH UAI IANC CAI Ãndice de vía aérea despejada IVAD FLI ILF REI IRE EPI IRS Min IPAP Minutes Minutos Seconds Segundos Events/hr Eventos/hora Hz Litres Litros ml Breaths/min Inspiraciones/min Degrees Grados Information Información Busy Ocupado Max IPAP SA ÇSR RÇS PB RP IE Insp. Time Tiempo Insp. Exp. Time Tiempo Exp. Resp. Event Evento Resp. Flow Limitation Limitación de flujo Flow Limit Límite de flujo SensAwake Pat. Trig. Breath Insp. Inic. p/el U. Tgt. Min. Vent Vent. Min. Objetivo Target Vent. Vent. Objetivo Minute Vent. Vent. Minuto Tidal Volume Volumen corriente Resp. Rate Frec. Resp. Snore Ronquido Leak Fuga Leaks Fugas Total Leaks Fugas totales Unintentional Leaks Fugas accidentales MaskPressure PresiónMascarilla Flow Rate Tasa de flujo Sleep Stage Estado del sueño Usage Uso Sessions Sesiones Pr. Relief Alivio de Presión No Data Available Sin información disponible Bookmarks Marcadores SleepyHead SleepyHead Mode Modo Model Modelo Brand Marca Serial # de Serie Series Serie Machine Máquina Channel Canal Settings Ajustes Name Nombre DOB Fecha de Nacimiento Phone Teléfono Address Domicilio Email Correo Electrónico Patient ID ID de paciente Date Fecha Bedtime Hora de dormir Wake-up Hora de levantarse Mask Time Tiempo de mascarilla Unknown Desconocido None Ninguno Ready Listo First Primero Last Último Start Inicio End Fin Yes No Min Max Med Mediana Average Promedio Median Mediana Avg Prom. W-Avg Prom. Pond. Import Error Error de Importación This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. Este registro de máquina no puede ser importado a este perfiĺ. Los datos se traslapan con contenido previo. Non Data Capable Machine Máquina sin capacidad de registro Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. Desafortunadamente el modelo de su CPAP Philips Respironics (Modelo %1) no tiene capacidad para el registro de datos. I'm sorry to report that SleepyHead can only track hours of use for this machine. Lamentamos informarle que SleepyHead sólo puede dar seguimiento a las horas de uso de esta máquina. 15mm 22mm Flex Mode PRS1 pressure relief mode. C-Flex C-Flex+ A-Flex Rise Time Bi-Flex Flex Level PRS1 pressure relief setting. x1 x2 x3 x4 x5 Humidifier Status PRS1 humidifier connected? Disconnected Connected Heated Tubing Heated Tubing Connected Headed Tubing Humidification Level PRS1 Humidification level Humid. Lvl. System One Resistance Status Sys1 Resist. Status System One Resistance Setting System One Mask Resistance Setting Sys1 Resist. Set Hose Diameter Diameter of primary CPAP hose System One Resistance Lock Whether System One resistance settings are available to you. Sys1 Resist. Lock Auto On A few breaths automatically starts machine Auto Off Machine automatically switches off Mask Alert Whether or not machine allows Mask checking. Show AHI Whether or not machine shows AHI via LCD panel. Unknown PRS1 Code %1 Código %1 de PRS1, desconocido PRS1_%1 PRS1_%1 Timed Breath Machine Initiated Breath TB Windows User Usuario de Windows SleepyHead (%1) needs to upgrade its database for %2 %3 %4 SleepyHead (%1) requiere actualizar su base de datos para %2 %3 %4 <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <b>SleepyHead mantiene un respaldo de la tarjeta de datos de sus dispositivos que se usa para este propósito.</b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> <i>Los datos antiguos de su máquina deben ser regenerados, suponienda que esta característica no haya sido deshabilitada en Preferencias durante una importación de datos previa.</i> Launching Windows Explorer failed Falló el lanzamiento del Explorador de Windows Could not find explorer.exe in path to launch Windows Explorer. No se halló explorer.exe en el 'path' para lanzar el Explorador de Windows. SleepyHead does not yet have any automatic card backups stored for this device. SleepyHead aún no tiene almacenado ningún respaldo automático de tarjeta para este dispositivo. This means you will need to import this machine data again afterwards from your own backups or data card. Esto significa que tendrá que importar los datos de esta máquina nuevamente después, desde sus propios respaldos de sa tarjeta de datos. Important: Importante: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. Una vez que actualice, <font size=+1>no podrá</font> usar este perfil con las versiones previas nunca más. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. Si esta preocupado, haga clic en No para salir, y respalde manualmente su perfil antes de iniciar nuevamente SleepyHead. Are you ready to upgrade, so you can run the new version of SleepyHead? ¿Esta seguro de actualizar para correr la nueva versión de SleepyHead? Machine Database Changes Cambios a la base de datos de la máquina Sorry, the purge operation failed, which means this version of SleepyHead can't start. Lo sentimos, la operación de purga ha fallado. Esto significa que esta versión de SleepyHead no puede iniciar. The machine data folder needs to be removed manually. El directorio de datos de la máquina debe ser removido manualmente. This folder currently resides at the following location: Este directorio reside actualmente en la siguiente ubicación: Rebuilding from %1 Backup Reconstruyendo desde el respaldo de %1 Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? ¿Le gustaría activar los respaldos automáticos para que en caso de que una nueva versión de SleepyHead lo requiera, pueda reconstruir desde ellos? SleepyHead will now start the import wizard so you can reinstall your %1 data. SleepyHead iniciará ahora el asistente de importación para que pueda reinstalar sus datos de %1. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: Ahora SleepyHead cerrará y tratará entonces de abrir el administrador de archivos de su computadora para que usted pueda respaldar manualmente su perfil: Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. Use su administrador de archivos para hacer una copia del directorio de su perfil. Después reinicie SleepyHead para terminar el proceso de actualización. Release Notes Notas de la Versión &Ok, get on with it.. &Entendido, adelante. Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. Busque esta versión en <a href='%1'> los archivos de SleepyHead hospedados en SourceForge</a>. A faster build of SleepyHead may be available Una versión más rápida de SleepyHead podría estar disponible. You will not be bothered with this message again. No será molestado nuevamente con este mensaje. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. Esta versión correrá bien, pero una versión compilada con etiqueta "<b>%1</b>" probablemente correrá más suavemente en su computadora. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. Esta versión de SleepyHead fue diseñada para trabajar con computadoras viejas sin soporte para OpenGL2.0. Pero su computadora lo soporta completamente al parecer. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. Esta versión de SleepyHead fue diseñada para trabajar con computadoras viejas sin soporte para OpenGL2.0. del cual su computadora carece. Pero aún así podría haber disponibé una mejor versión para su computadora. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. Si está corriendo esto en una máquina virtual como VirtualBox o VMware, por favor ignore este mensaje, ya que no hay mejor versión disponible. Incompatible Graphics Hardware Hardware Gráfico Incompatible This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. Esta versión de SleepyHead requiere soporte de OpenGL2.0 para su correcto funcionamiento y desafortunadamente su computadora carece de esta característica. You may need to update your computers graphics drivers from the GPU makers website. %1 Es posible que deba actualizar los drivers gráficos de su computadora desde el sitio del fabricante del GPU.%1 (<a href='http://intel.com/support'>Intel's support site</a>) (<a href='http://www.intel.com/p/es_XL/support/'>Sitio de soporte de Intel</a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. Debido a que los gráficos no se pueden generar correctamente, se podrían producir fallos. Esta versión cerrará automaáticamente. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. No se desanime, hay otra versión etiquetada "<b>BrokenGL</b>" que debería funcionar en su computadora. No SleepyHead data folder was found. No se encontró ningún directorio de datos de SleepyHead. Would you like SleepyHead to use the default location for storing its data? ¿Le gustaría que SleepyHead use la ubicación por defecto para almacenar sus datos? As you did not select a data folder, SleepyHead will exit. Ya que no seleccionó ningún directorio de datos, SleepyHead cerrará. Next time you run, you will be asked again. Se le preguntará de nuevo la próxima vez. You did not select a directory. No seleccionó ningún directorio. SleepyHead will now start with your old one. SleepyHead ahora iniciará con el antiguo. Question Pregunta Choose or create new folder for SleepyHead data Elegir o crear un nuevo directorio para los datos de SleepyHead Exiting Saliendo The folder you chose is not empty, nor does it already contain valid SleepyHead data. El directorio que eligió no está vacío, ni contiene datos válidos de SleepyHead. Are you sure you want to use this folder? ¿Está seguro que quiere usar este directorio? About SleepyHead Acerca de SleepyHead &Close &Cerrar &Donate &Donar Unspecified No especificado Nasal Pillows Almohadillas nasales Hybrid F/F Mask Mascarilla Híbrida C/C Nasal Interface Interfaz Nasal Full-Face Mask Mascarilla de cara completa Are you sure you want to reset all your channel colors and settings to defaults? There are no graphs visible to print No hay graficos visibles para imprimir Would you like to show bookmarked areas in this report? ¿Le gustaría mostrar las áreas con marcadores en este reporte? This make take some time to complete.. Please don't touch anything until it's done. Esto podría tomar algo de tiempo en completarse. Por favor no toque nada hasta que finalize. Printing %1 Report Imprimiendo reporte %1 %1 Report Reporte %1 : %1 hours, %2 minutes, %3 seconds : %1 horas, %2 minutos, %3 segundos Range Intérvalo Fixed %1 Fijo %1 RDI %1 AHI %1 AI=%1 HI=%2 CAI=%3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% UAI=%1 NRI=%1 LKI=%2 EPI=%3 Reporting from %1 to %2 Reportando desde %1 hasta %2 Reporting data goes here Aqui va la fecha a reportar Entire Day's Flow Waveform Forma de onda del día completo Current Selection Selección actual Entire Day Día completo SleepyHead v%1 - http://sleepyhead.sourceforge.net SleeepyHead v%! - ttp://sleepyhead.sourceforge.net Page %1 of %2 Página %1 de %2 SleepyHead has finished sending the job to the printer. SleepyHead ha enviado el trabajo a la impresora. Jan Ene Feb Mar Apr Abr May Jun Jul Aug Ago Sep Oct Nov Dec Dic Events Eventos Duration Duración (% %1 in events) (%-%1 en eventos) Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! No se puede leer Channels.xml, esta compilación está gravemente dañada ¡no queda mas que abortar! Therapy Pressure Presión Terapéutica Inspiratory Pressure Presión Inspiratoria Lower Inspiratory Pressure Presión inspiratoria inferior Higher Inspiratory Pressure Presión inspiratoria superior Expiratory Pressure Presión Expiratoria Lower Expiratory Pressure Presión expiratoria inferior Higher Expiratory Pressure Presión expiratoria superior Pressure Support Soporte de presión PS Min SP Min Pressure Support Minimum Soporte de presión mínimo PS Max SP Máx Pressure Support Maximum Soporte de presión máximo Min Pressure Presión Mín Minimum Therapy Pressure Presión de terapia mínima Pr. Min P Mín Max Pressure Presión Máxima Maximum Therapy Pressure Máxima terapia de presión Pr. Max P Máx Ramp Time Tiempo de rampa Ramp Delay Period Periodo de retraso de rampa Ramp Pressure Presión de rampa Starting Ramp Pressure Presión inicial de rampa Ramp Pr. P. Rampa Ramp Event Evento de Rampa Ramp Rampa Periodic Breathing Respiración periódica A period of periodic breathing Un periodo de respiración periódca Vibratory Snore (VS2) Ronquido vibratorio (VS2) Mask On Time Mascarilla a tiempo Time started according to str.edf Hora de inicio según str.edf Summary Only Sólo resumen CPAP Session contains summary data onlyf La sesión de CPAP sólo contiene un resumen % % Clear Airway Apnea Apnea Central An apnea where the airway is open Una apnea mientras la vía aérea se encuentra abierta Obstructive Apnea Apnea Obtructiva An apnea caused by airway obstruction Una apnea provocada por obstrucción de la vía aérea Hypopnea Hipoapnea A partially obstructed airway Una vía aérea parcialmente obstruida Unclassified Apnea Apnea no clasificada An apnea that could not fit into a category Una apnea que no se pudo categorizar UA ANC An restriction in breathing from normal, causing a flattening of the flow waveform. Respiratory Effort Related Arousal An restriction in breathing that causes an either an awakening or sleep disturbance. Vibratory Snore A vibratory snore A vibratory snore as detcted by a System One machine Pressure Pulse A pulse of pressure 'pinged' to detect a closed airway. Large Leak A large mask leak affecting machine performance. LL Non Responding Event A type of respiratory event that won't respond to a pressure increase. Expiratory Puff Intellipap event where you breathe out your mouth. SensAwake feature will reduce pressure when waking is detected. User Flag #1 A user definable event detected by SleepyHead's flow waveform processor. User Flag #2 User Flag #3 Heart rate in beats per minute Blood-oxygen saturation percentage SpO2 % % SpO2 Plethysomogram An optical Photo-plethysomogram showing heart rhythm Pulse Change A sudden (user definable) change in heart rate SpO2 Drop A sudden (user definable) drop in blood oxygen saturation SD Breathing flow rate waveform L/min Mask Pressure Mask Pressure (High resolution) Amount of air displaced per breath Graph displaying snore volume Minute Ventilation Amount of air displaced per minute Respiratory Rate Rate of breaths per minute Patient Triggered Breaths Percentage of breaths triggered by patient Pat. Trig. Breaths Leak Rate Rate of detected mask leakage I:E Ratio Ratio between Inspiratory and Expiratory time ratio Pressure Min Pressure Max Leak Flag LF Perfusion Index A relative assessment of the pulse strength at the monitoring site Perf. Index % Expiratory Time Time taken to breathe out Inspiratory Time Time taken to breathe in Respiratory Event A ResMed data source showing Respiratory Events Graph showing severity of flow limitations Flow Limit. Target Minute Ventilation Target Minute Ventilation? Maximum Leak The maximum rate of mask leakage Max Leaks Apnea Hypopnea Index Graph showing running AHI for the past hour Total Leak Rate Detected mask leakage including natural Mask leakages Median Leak Rate Median rate of detected mask leakage Median Leaks Respiratory Disturbance Index Graph showing running RDI for the past hour CPAP Session contains summary data only PAP Mode PAP Device Mode APAP (Variable) ASV (Fixed EPAP) ASV (Variable EPAP) Zero Upper Threshold Lower Threshold Orientation Sleep position in degrees Inclination Upright angle in degrees Name: %1, %2 DOB: %1 Phone: %1 Email: %1 Address: Usage Statistics This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead Auto Bi-Level ASV Auto EPAP Days: %1 Low Usage Days: %1 (%1% compliant, defined as > %2 hours) (Sess: %1) Bedtime: %1 Waketime: %1 90% 100% {90%?} (Summary Only) There is a lockfile already present for profile '%1'. You can only work with one instance of an individual SleepyHead profile at a time. Please close any other instances of SleepyHead running with this profile before proceeding. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. There is a lockfile already present for this profile '%1', claimed on '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. Peak %1% %2 Fixed Auto Fixed Bi-Level Auto Bi-Level (Fixed PS) Auto Bi-Level (Variable PS) ASV Fixed EPAP ASV Variable EPAP %1%2 %1%2 Fixed %1 (%2) Min %1 Max %2 (%3) EPAP %1 IPAP %2 (%3) PS %1 over %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) EPAP %1 PS %2-%3 (%6) %1 %2 %1 %2 %1-%2 %3 %1-%2 %3 Welcome to SleepyHead Bienvenido a SleepyHead What would you like to do? Please Import Some Data CPAP<br/>Importer Oximetery<br/>Wizard or View<br/>Statistics It might be a good idea to check preferences first,</br>as there are some options that affect import. First import can take a few minutes. Click this box to see this in daily view. The last time you used your %1... last night yesterday %2 days ago was %1 (on %2) perfect :) pretty darn good reasonably good technically "treated" not very good horrible, please consult your doctor You had an AHI of %1, which is considered %2 %1 hours, %2 minutes and %3 seconds You machine was on for %1. <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> <font color = red>You only had the mask on for %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. You had significant periods of <i>major</i> mask leakage. Your mask is leaking way too much.. Talk to your CPAP advisor. Your CPAP machine blasted you with a constant %1%2 of air Your pressure was under %1%2 for %3% of the time. Your machine blasted you with a constant %1-%2 %3 of air. Your machine was under %1-%2 %3 for %4% of the time. Your EPAP pressure fixed at %1%2. Your EPAP pressure was under %1%2 for %3% of the time. Your IPAP pressure was under %1%2 for %3% of the time. No CPAP data has been imported yet. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> (last night) (yesterday) (%2 day ago) No oximetery data has been imported yet. Very Important Warning <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. Contec CMS50 Fisher & Paykel ICON DeVilbiss Intellipap SmartFlex Settings ChoiceMMed MD300 Respironics M-Series Philips Respironics System One ResMed S9 EPR: Somnopose Somnopose Software Zeo Personal Sleep Coach VPAP Adapt EPR ResMed Exhale Pressure Relief Patient??? EPR Level Exhale Pressure Relief Level 0cmH2O 1cmH2O 2cmH2O 3cmH2O (% of time) Database Outdated Please Rebuild CPAP Data Snapshot %1 SleepyHead is proudly brought to you by JediMark. d MMM [ %1 - %2 ] %1 %1 Hide All Events Show All Events Unpin %1 Graph Pin %1 Graph Plots Disabled Duration %1:%2:%3 AHI %1 %1: %2 Relief: %1 Hours: %1h, %2m, %3s Machine Information Información de la máquina Journal Data SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead will not touch this folder, and will create a new one instead. Please be careful when playing in SleepyHead's profile folders :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. SleepyHead picked only the first one of these, and will use it in future: If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. CMS50F3.7 CMS50F SmartFlex Mode Intellipap pressure relief mode. Ramp Only Full Time SmartFlex Level Intellipap pressure relief level. Weinmann SOMNOsoft2 Loading %1 data... PLease Wait... By Pressure Statistics at Pressure %1 Session #%2 QuaZipFilePrivate ZIP/UNZIP API error %1 Error de la API ZIP/UNZIP %1 Report Form Formulario about:blank about:blank SessionBar No Sessions Present No hay sesiones presentes Statistics Details Detallado Detalles Most Recent Más reciente Más recientes Compliance Cumplimiento Apego Last 30 Days Último Mes Últimos 30 días Last Year Último Año Average %1 Promedio %1 CPAP Statistics Estadísticas de CPAP CPAP Usage Uso de CPAP Average Hours per Night Promedio de horas por noche Therapy Efficiacy Eficacia de la terapia Leak Statistics Estadísticas de fuga Pressure Statistics Estadísticas de presión Oximeter Statistics Estadísticas del oxímetro Blood Oxygen Saturation Saturación de oxígeno en sangre Pulse Rate Frecuencia de Pulso %1 Median %1 Mediana 90% %1 90% %1 Min %1 Mín %1 Max %1 Max %1 %1 Index Ãndice %1 % of time in %1 % del tiempo en %1 % of time above %1 threshold % del tiempo por encima del umbral de %1 % of time below %1 threshold % del tiempo por debajo del umbral de %1 I can haz data?!? ¿Puedes proporcionarme datos? This lonely sleepy sheep has no data :( Esta solitaria ovejita somnolienta no tiene datos :( Last Week Última Semana Last 6 Months Último Semestre últimos 6 meses Last Session Última sesión No %1 data available. No hay datos %1 disponibles %1 day of %2 Data on %3 %1 día(s) de datos %2 en %3 %1 days of %2 Data, between %3 and %4 %1 día(s) de datos %2 entre %3 y %4 Usage Information Información de uso Total Days Días totales Compliant Days Días cumplidos días con cumplimiento Days AHI &gt;5.0 Días IAH &gt;5.0 Best&nbsp;%1 Mejor&nbsp;%1 Worst&nbsp;%1 Peor&nbsp;%1 Best RX Setting Mejor Prescripción Worst RX Setting Peor Prescripción Changes to Prescription Settings Cambios a la prescripción Days Días Pressure Relief Pr. Rel. Al. Pres. Pressure Settings Ajustes de presión Fixed %1 %2 Fijo %1 %2 %1 - %2 %3 %1 - %2 %3 EPAP %1 %3 IPAP %2 %3 EPAP %1 %3 IPAP %2 %3 PS %4 over %1 - %2 %3 PS %4 sobre %1 - %2 %3 Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. El resaltado de eficacia ignora las prescripciones con menos de %1 día(s) de datos registrados. Machine Information Información de la máquina First Use Primer Uso Last Use Último Uso UpdaterWindow SleepyHead Updater Actualizador de SleepyHead A new version of $APP is available Una nueva versión de $APP está disponible Version Information Información de la versión Release Notes Notas de la Versión about:blank about:blank Build Notes Notas de Compilación Maybe &Later Quizás &Después &Upgrade Now &Actualizar Ahora Please wait while updates are downloaded and installed... Por favor espere mientras se descargan e instalan las actualizaciones... Updates Actualizaciones Component Componente Version Versión Size Tamaño Progress Progreso Log Bitácora Downloading & Installing Updates Descargando e instalando actualizaciones &Finished &Finalizado Checking for SleepyHead Updates Verificando actualizaciones de SleepyHead Requesting Solicitando Saving as Guardando como XML update structure parsed cleanly La actualización de estructura XML se realizó limpiamente No updates were found for your platform. No se encontraron actualizaciones para su plataforma. SleepyHead Updates Actualizaciones de SleepyHead No new updates were found for your platform. No se encontraron nuevas actualizaciones para su plataforma. SleepyHead v%1, codename "%2" SleepyHead v%1, nombre clave "%2" platform notes Notas de la Plataforma A new version of SleepyHead is available! ¡Una nueva versión de SleepyHead está disponible! Shiny new <b>v%1</b> is available. You're running old and busted v%2 La nueva y brillante versión <b>v%1</b> está disponible. Usted está corriendo la vieja y gastada v%2 An update for SleepyHead is available. Una actualización para SleepyHead está disponible. Version <b>%1</b> is available. You're currently running v%1 La versión <b>%1</b> está disponible. Usted está usando la v%1 SleepyHead v%1 build notes Notas de compilación de SleepyHead v%1 Update to QtLibs (v%1) Actualización de QtLibs (v%1) There was an error parsing the XML Update file. Hubo un error interpretando el archivo de actualización XML. %1 bytes received %1 bytes recibidos Redirected to Redirigido a File size mismatch for %1 Tamaño del archivo %1 no coincide File integrity check failed for %1 Falló la comprobación de integridad para %1 Extracting Extrayendo You might need to reinstall manually. Sorry :( Lo sentimos :( Es posible que requiera reinstalar manualmente Ugh.. Something went wrong with unzipping. Ups... Algo salió mal al descomprimir. Failed Fallido Download Complete Descarga Completada There was an error completing a network request: ( Hubo un error completando una petición de red:( Update Complete! Actualización Completada Updates Complete. SleepyHead needs to restart now, click Finished to do so. Actualizaciones completas. SleepyHead requiere reiniciar ahora, haga clic en Finalizado para hacerlo. Update Failed :( Actualización Fallida :( Download Error. Sorry, try again later. Error de descarga. Lo sentimos, intente nuevamente más tarde. Downloading & Installing Updates... Descargando e instalando actualizaciones... Please wait while downloading and installing updates. Por favor espere mientras se descargan e instalan las actualizaciones. gGraph Snapshot gGraphView 100% zoom level Restore X-axis zoom too 100% to view entire days data. Reset Graph Layout Resets all graphs to a uniform height and default order. Y-Axis Plots CPAP Overlays Oximeter Overlays Dotted Lines Remove Clone Clone %1 Graph sleepyhead-0.9.8/Translations/Bulgarian.bg.ts0000755000175000017500000126072312412506713020560 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. Please ensure you select 'upload' from the oximeter devices menu. Daily Form Go to the previous day Prev Show or hide the calender ... Go to the next day Next Go to the most recent day with data records Events View Size Notes Journal Small Medium Big Flags Graphs Color i Ctrl+I u B Ctrl+B Zombie I'm feeling... Weight Awesome B.M.I. Bookmarks Add Bookmark Starts Remove Bookmark Drop down this list to show/hide available graphs. Breakdown events No %1 events are recorded this day %1 event %1 events PAP Mode: %1<br/> UF1 UF2 Session Start Times Session End Times Duration Oximetery Sessions Position Sensor Sessions Unknown Session Machine Settings Unavailable This day has missing pressure, mode and settings data. %1%2 This day just contains summary data, only limited information is available . Total time in apnea Time over leak redline Sleep Wake Event Breakdown Sessions all off! Sessions exist for this day but are switched off. Impossibly short session Zero hours?? BRICK :( Complain to your Equipment Provider! Statistics Oximeter Information SpO2 Desaturations Pulse Change events SpO2 Baseline Used Machine Settings Session Information CPAP Sessions Sleep Stage Sessions One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. Total ramp time Time outside of ramp AHI excluding ramp Sorry, your machine only provides compliance data. "Nothing's here!" Bob is bored with this days lack of data. Pick a Colour This bookmarked is in a currently disabled area.. Bookmark at %1 Show all graphs Hide all events Show all events Hide all graphs ExportCSV Export as CSV Dates: Resolution: Details Sessions Daily Filename: Cancel Export Start: End: Quick Range: Most Recent Day Last Week Last Fortnight Last Month Last 6 Months Last Year Everything Custom ... SleepyHead_ Details_ Sessions_ Summary_ Select file to export to CSV Files (*.csv) DateTime Session Event Data/Duration Date Session Count Start End Total Time AHI Count Avg %1% FPIconLoader Import Error This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. MainWindow SleepyHead &Statistics <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> about:blank Report Mode Standard Monthly Date Range &Help Browser ... qrc:/docs/index.html Statistics Daily Overview Oximetry Import Help &File &View &Help &Data &Advanced Purge Oximetery Data Rebuild CPAP Data &Import Data Shift+F2 &Preferences &Profiles E&xit Exit View &Daily F5 View &Overview F6 View &Welcome F4 - Ctrl+Tab Use &AntiAliasing &About SleepyHead &Fullscreen Toggle F11 Show Debug Pane &Reset Graph Layout Check for &Updates Take &Screenshot F12 O&ximetry Wizard F7 Print &Report &Edit Profile &Link Graph Groups Daily Calendar F9 Backup &Journal Online Users &Guide &Frequently Asked Questions &Automatic Oximetry Cleanup Toggle &Line Cursor Change &User Purge &Current Selected Day All data for current CPAP machine Right &Sidebar Ctrl+L Daily Sidebar F8 View S&tatistics Navigation Bookmarks Records Purge ALL CPAP Data Exp&ort Data F10 View Statistics Import &ZEO Data Import RemStar &MSeries Data &Support SleepyHead Development Sleep Disorder Terms &Glossary Change &Language Change &Data Folder Import &Somnopose Data Current Days Profile Welcome &About Loading... Loading Data Access to Import has been blocked while recalculations are in progress. Importing Data Please wait, importing from backup folder(s)... Please wait, scanning for CPAP data cards... When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. Import Problem Couldn't find any valid Machine Data at %1 Please insert your CPAP data card... CPAP Data Located Please wait, launching file dialog... No CPAP data card detected, launching file dialog... Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. Import Reminder Welcome to SleepyHead About SleepyHead This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. This is a beta release, some features may not yet behave as expected. Please report any bugs you find to SleepyHead's SourceForge page. Currenly supported machines: CPAP ResMed S9 models (CPAP, Auto, VPAP) DeVilbiss Intellipap (Auto) Fisher & Paykel ICON (CPAP, Auto) Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters ResMed S9 Oximeter Attachment Online Help Resources Note: I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> Further Information Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia Friendly forums to talk and learn about Sleep Apnea: <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, Copyright: &copy;2011-2014 License: This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. DISCLAIMER: This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. *** <u>Use at your own risk</u> *** Loading Revision: branch Data Folder Location: <a href="file://%1">%2</a> James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Are you sure you want to rebuild all CPAP data for the following machine: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. For some reason, SleepyHead does not have internal backups for the following machine: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Are you really sure you want to do this? You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: Note as a precaution, the backup folder will be left in place. Are you <b>absolutely sure</b> you want to proceed? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: %1's Journal Choose where to save journal XML Files (*.xml) Because there are no internal backups to rebuild from, you will have to restore from your own. Would you like to import from your own backups now? (you will have no data visible for this machine until you do) Are you sure you want to delete oximetry data for %1 <b>Please be aware you can not undo this operation!</b> Select the day with valid oximetry data in daily view first. Copyright <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Please ensure you are running the latest version before reporting any bugs. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! This red message line is intentional, and will not be a feature in the final version... Imported %1 CPAP session(s) from %2 Import Success Already up to date with CPAP data at %1 Up to date Choose a folder A %1 file structure for a %2 was located at: A %1 file structure was located at: Would you like to import from this location? Specify SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> This software is released under the GNU Public License v3.0<br/> SleepyHead Project Page SleepyHead Wiki Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ SleepyHead, brought to you by Jedimark Kudos & Credits Bugfixes, Patches and Platform Help: Translators: 3rd Party Libaries: SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. This software comes with absolutely no warranty, either express of implied. It comes with no guarantee of fitness for any particular purpose. No guarantees are made regarding the accuracy of any data this program displays. This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. Use this software entirely at your own risk. Access to Preferences has been blocked until recalculation completes. Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) Build Date: %1 %2 Graphics Engine: %1 There was an error saving screenshot to file "%1" Screenshot saved to file "%1" Printing Disabled Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt Gah! If you can read this, the restart command didn't work. Your going to have to do it yourself manually. Performance will be degraded during these recalculations. Recalculating Indices Loading Event Data Recalculating Summaries Restart Required Recalculations are complete, the application now needs to restart to display the changes. Recalculations are now complete. Task Completed There was a problem opening ZEO File: Zeo CSV Import complete There was a problem opening MSeries block File: MSeries Import complete There was a problem opening Somnopose Data File: Somnopause Data Import complete MinMaxWidget Auto-Fit Defaults Override The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. The Minimum Y-Axis value.. Note this can be a negative number if you wish. The Maximum Y-Axis value.. Must be greater than Minimum to work. Scaling Mode This button resets the Min and Max to match the Auto-Fit NewProfile Edit User Profile I agree to all the conditions above. User Information User Name Keep the kids out.. Nothing more.. This isn't meant to be uber security. Password Protect Profile Password ...twice... Locale Settings Country TimeZone about:blank DST Zone Personal Information (for reports) First Name Last Name D.O.B. Gender Male Female Height metric archiac Contact Information Address Email Phone CPAP Treatment Information Date Diagnosed Untreated AHI CPAP Mode CPAP APAP Bi-Level ASV RX Pressure Doctors / Clinic Information Doctors Name Practice Name Patient ID SleepyHead TextLabel &Cancel &Back &Next Select Country Welcome to SleepyHead This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. PLEASE READ CAREFULLY SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. Accuracy of any data displayed is not and can not be guaranteed. Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. The author will not be held liable for <u>anything</u> related to the use or misuse of this software. Use of this software is entirely at your own risk. SleepyHead is copyright &copy;2011-2014 Mark Watkins Please provide a username for this profile Passwords don't match Profile Changes Accept and save this information? &Finish &Close this window Overview Form Range: Last Week Last Two Weeks Last Month Last Two Months Last Three Months Last 6 Months Last Year Everything Custom Start: End: Reset view to selected date range ... Toggle Graph Visibility Drop down to see list of graphs to switch on/off. Graphs Respiratory Disturbance Index Apnea Hypopnea Index Usage Usage (hours) Session Times Session Times (hours) % in %1 %1 (% of night) Large Leaks (% of night) Peak RDI Peak RDI Shows RDI Clusters (RDI/hr) Peak AHI Peak AHI Shows AHI Clusters (AHI/hr) Tidal Volume (ml) Minute Ventilation (L/min) Target Ventilation (L/min) Patient Triggered Breaths (%) (count) Oxygen Saturation (%) SensAwake (count) Body Mass Index How you felt (0-10) Zombie Meter breaths/min L/b %PTB % PB % %1 Show all graphs Hide all graphs OximeterImport Dialog Oximeter Import Wizard <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> Skip this page next time. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> Where would you like to import from? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> Directly from a recording on a device <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> Record attached to computer overnight (provides plethysomogram) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> Please connect your oximeter device Press Start to commence recording Show Live Graphs Duration SpO2 % Pulse Rate Multiple Sessions Detected Please choose which one you want to import into SleepyHead Start Time Details Import Completed. When did the recording start? Day recording (normally would of) started Oximeter Starting time I want to use the time reported by my oximeter's built in clock. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> Choose CPAP session to sync to: ... You can manually adjust the time here if required: HH:mm:ssap &Cancel &Information Page &Retry &Choose Session &End Recording &Sync and Save &Save and Finish &Start Scanning for compatible oximeters Could not detect any connected oximeter devices. Connecting to %1 Oximeter "%1", session %2 Waiting for %1 to start Waiting for the device to start the upload process... Select upload option on %1 Waiting for you to start the upload process... %1 device is uploading data... Please wait until oximeter upload process completes. Do not unplug your oximeter. Oximeter import completed.. Select a valid oximetry data file Oximetry Files (*.spo *.spor *.spo2 *.dat) No Oximetery module could parse the given file: Oximeter not detected Couldn't access oximeter Live Oximetery Mode Starting up... If you can still read this after a few seconds, cancel and try again Live Import Stopped Live Oximetery Stopped Live Oximetery import has been stopped %1 session(s) on %2, starting at %3 No CPAP data available on %1 %1 Recording... Finger not detected I want to use the time my computer recorded for this live oximetry session. I need to set the time manually, because my oximeter doesn't have an internal clock. Something went wrong getting session data CMS50 Session %1 Oximetry Form Date d/MM/yy h:mm:ss AP R&eset SpO2 Pulse ... &Open .spo/R File Serial &Import &Start Live Serial Port &Rescan Ports PreferencesDialog Preferences &Import Session Settings Combine Close Sessions Minutes Multiple sessions closer together than this value will be kept on the same day. Ignore Short Sessions <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> Day Split Time Sessions starting before this time will go to the previous calendar day. Keep session data in memory to speed up revisiting days. Cache Session Data (uses more system memory) Summary only data is more accurate for ResMed users if this is left on. Don't Split Summary Days Session Storage Options This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) Create SD Card Backups during Import (Turn this off at your own peril!) This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Compress SD Card Backups (slower first import, but makes backups smaller) The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> &CPAP CPAP Mask Information Mask Type Generic mask type. Select the one that's closest to your mask. Description The name of your mask, or at least the name you call it. Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. Mask Profile Statistical Model Leak calcs Started Using The date you started using this mask Leak Profile Pressure Leak <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) Use RDI instead of AHI (PRS1 only) Don't show any compliance information Show Compliance Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. hours as over of usage per night Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Custom User Event Flagging Flow Restriction Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. % <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> Duration of airflow restriction s Event Duration Allow duplicates near machine events. AHI/Hour Graph Settings Window Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. minutes Reset the counter to zero at beginning of each (time) window. Zero Reset CPAP Clock Drift Do not import sessions older than: Sessions older than this date will not be imported dd MMMM yyyy Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) seconds Show in Event Breakdown Piechart #1 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Resync Machine Detected Events (Experimental) User definable threshold considered large leak L/min Whether to show the leak redline in the leak graph Show Leak Redline Search &Oximetry Type Tries to forces the oximetry data to link with CPAP when possible. Link Oximetry and CPAP graphs SPO2 Percentage drop in oxygen saturation Pulse Sudden change in Pulse Rate of at least this amount bpm Minimum duration of drop in oxygen saturation Minimum duration of pulse change event. Small chunks of oximetry data under this amount will be discarded. &General General Settings Daily view navigation buttons will skip over days without data records Skip over Empty Days Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. Enable Multithreading Bypass the login screen and load the most recent User Profile Skip Login Screen <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> Changes to the following settings needs a restart, but not a recalc. Oximetery Settings Preferred Calculation Methods Middle Calculations Upper Percentile For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. Median is recommended for ResMed users. Median Weighted Average Normal Average ResMed users probably should use 99th Percentile for visual consistency. True Maximum 99% Percentile Maximum Calcs Automatically Check For Updates Check for new version every Sourceforge hosts this project for free.. Please be considerate of their resources.. days. &Check for Updates now Last Checked For Updates: TextLabel <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> I want to try experimental and test builds (Advanced users only please.) &Appearance Graph Settings Bar Tops Line Chart Overview Linecharts <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> milliseconds Scroll Dampening Overlay Flags Line Thickness The pixel thickness of line plots Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. The visual method of displaying waveform overlay flags. Standard Bars Graph Height Default display height of graphs in pixels How long you want the tooltips to stay visible. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> Events Reset &Defaults <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> Waveforms Flag rapid changes in oximetry stats Other oximetry options Flag SPO2 Desaturations Below Discard segments under Flag Pulse Rate Above Flag Pulse Rate Below Contec CMS50D+/E/F Contec CMS50F v3.7+ ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Update Oximeter Clock during import Show flags for machine detected events that haven't been identified yet. Show Unknown Flags Import without nagging Tooltip Timeout Graph Tooltips Top Markers Other Visual Settings Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. Use Anti-Aliasing Makes certain plots look more "square waved". Square Wave Plots Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. Show event breakdown pie chart Use Pixmap Caching Animations && Fancy Stuff Whether to allow changing yAxis scales by double clicking on yAxis labels Allow YAxis Scaling Application Fonts Font Size Bold Italic Application Graph Text Graph Titles Big Text Details &Cancel &Ok Nasal Pillows Name Color Flag Type Label CPAP Events Oximeter Events Positional Events Sleep Stage Events Unknown Events Double click to change the descriptive name this channel. Double click to change the default color for this channel plot/flag/data. Here you can change the type of flag shown for this event This is the short-form label to indicate this channel on screen. This is a description of what this channel does. Lower Upper CPAP Waveforms Oximeter Waveforms Positional Waveforms Sleep Stage Waveforms Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Data Reindex Required A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? Restart Required One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. Are you really sure you want to do this? Flag Minor Flag Span Always Minor This may not be a good idea ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. If you need to conserve disk space, please remember to carry out manual backups. Are you sure you want to disable these backups? ProfileSelect Select Profile Search: Start with the selected user profile. Create a new user profile. Choose a different SleepyHead data folder. &Different Folder SleepyHead [version] Click here if you didn't want to start SleepyHead. &Quit Folder: The current location of SleepyHead data store. [data directory] New Profile &Select User Open Profile Edit Profile Delete Profile Enter Password for %1 Incorrect Password You entered the password wrong too many times. Enter the word DELETE below to confirm. You are about to destroy profile '%1'. Sorry You need to enter DELETE in capital letters. Could not open profile.. You will need to delete this profile directory manually You will find it under the following location: You entered an incorrect password If you're trying to delete because you forgot the password, you need to delete it manually. There was an error deleting the profile directory, you need to manually remove it. Profile '%1' was succesfully deleted Create new profile Enter Password You entered an Incorrect Password too many times. Exiting! QObject No Data On Off cm " ft lb oz Kg cmH2O Hours bpm ? Severity (0-1) Error Warning Please Note Compliance Only :( Graphs Switched Off Summary Only :( Sessions Switched Off &Yes &No &Cancel &Destroy &Save BMI Weight Zombie Pulse Rate SpO2 Plethy Pressure Daily Overview Oximetry Oximeter Event Flags CPAP BiPAP Bi-Level EPAP Min EPAP Max EPAP IPAP APAP ASV ST/ASV Humidifier H OA A CA FL LE EP VS VS2 RERA PP P RE NR NRI O2 PC UF1 UF2 UF3 PS AHI RDI AI HI UAI CAI FLI REI EPI Min IPAP Minutes Seconds Events/hr Hz Litres ml Breaths/min Degrees Information Busy Max IPAP SA ÇSR PB IE Insp. Time Exp. Time Resp. Event Flow Limitation Flow Limit SensAwake Pat. Trig. Breath Tgt. Min. Vent Target Vent. Minute Vent. Tidal Volume Resp. Rate Snore Leak Leaks Total Leaks Unintentional Leaks MaskPressure Flow Rate Sleep Stage Usage Sessions Pr. Relief No Data Available Bookmarks SleepyHead Mode Model Brand Serial Series Machine Channel Settings Name DOB Phone Address Email Patient ID Date Bedtime Wake-up Mask Time Unknown None Ready First Last Start End Yes No Min Max Med Average Median Avg W-Avg Import Error This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. Non Data Capable Machine Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. I'm sorry to report that SleepyHead can only track hours of use for this machine. 15mm 22mm Flex Mode PRS1 pressure relief mode. C-Flex C-Flex+ A-Flex Rise Time Bi-Flex Flex Level PRS1 pressure relief setting. x1 x2 x3 x4 x5 Humidifier Status PRS1 humidifier connected? Disconnected Connected Heated Tubing Heated Tubing Connected Headed Tubing Humidification Level PRS1 Humidification level Humid. Lvl. System One Resistance Status Sys1 Resist. Status System One Resistance Setting System One Mask Resistance Setting Sys1 Resist. Set Hose Diameter Diameter of primary CPAP hose System One Resistance Lock Whether System One resistance settings are available to you. Sys1 Resist. Lock Auto On A few breaths automatically starts machine Auto Off Machine automatically switches off Mask Alert Whether or not machine allows Mask checking. Show AHI Whether or not machine shows AHI via LCD panel. Unknown PRS1 Code %1 PRS1_%1 Timed Breath Machine Initiated Breath TB Windows User SleepyHead (%1) needs to upgrade its database for %2 %3 %4 <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> Launching Windows Explorer failed Could not find explorer.exe in path to launch Windows Explorer. SleepyHead does not yet have any automatic card backups stored for this device. This means you will need to import this machine data again afterwards from your own backups or data card. Important: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. Are you ready to upgrade, so you can run the new version of SleepyHead? Machine Database Changes Sorry, the purge operation failed, which means this version of SleepyHead can't start. The machine data folder needs to be removed manually. This folder currently resides at the following location: Rebuilding from %1 Backup Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? SleepyHead will now start the import wizard so you can reinstall your %1 data. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. Release Notes &Ok, get on with it.. Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. A faster build of SleepyHead may be available You will not be bothered with this message again. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. Incompatible Graphics Hardware This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. You may need to update your computers graphics drivers from the GPU makers website. %1 (<a href='http://intel.com/support'>Intel's support site</a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. No SleepyHead data folder was found. Would you like SleepyHead to use the default location for storing its data? As you did not select a data folder, SleepyHead will exit. Next time you run, you will be asked again. You did not select a directory. SleepyHead will now start with your old one. Question Choose or create new folder for SleepyHead data Exiting The folder you chose is not empty, nor does it already contain valid SleepyHead data. Are you sure you want to use this folder? About SleepyHead &Close &Donate Unspecified Nasal Pillows Hybrid F/F Mask Nasal Interface Full-Face Mask Are you sure you want to reset all your channel colors and settings to defaults? There are no graphs visible to print Would you like to show bookmarked areas in this report? This make take some time to complete.. Please don't touch anything until it's done. Printing %1 Report %1 Report : %1 hours, %2 minutes, %3 seconds Range Fixed %1 RDI %1 AHI %1 AI=%1 HI=%2 CAI=%3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% UAI=%1 NRI=%1 LKI=%2 EPI=%3 Reporting from %1 to %2 Entire Day's Flow Waveform Current Selection Entire Day SleepyHead v%1 - http://sleepyhead.sourceforge.net Page %1 of %2 SleepyHead has finished sending the job to the printer. Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Events Duration (% %1 in events) Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! Therapy Pressure Inspiratory Pressure Lower Inspiratory Pressure Higher Inspiratory Pressure Expiratory Pressure Lower Expiratory Pressure Higher Expiratory Pressure Pressure Support PS Min Pressure Support Minimum PS Max Pressure Support Maximum Min Pressure Minimum Therapy Pressure Max Pressure Maximum Therapy Pressure Ramp Time Ramp Delay Period Ramp Pressure Starting Ramp Pressure Ramp Event Ramp Periodic Breathing A period of periodic breathing Vibratory Snore (VS2) Mask On Time Time started according to str.edf Summary Only % Clear Airway Apnea An apnea where the airway is open Obstructive Apnea An apnea caused by airway obstruction Hypopnea A partially obstructed airway Unclassified Apnea An apnea that could not fit into a category UA An restriction in breathing from normal, causing a flattening of the flow waveform. Respiratory Effort Related Arousal An restriction in breathing that causes an either an awakening or sleep disturbance. Vibratory Snore A vibratory snore A vibratory snore as detcted by a System One machine Pressure Pulse A pulse of pressure 'pinged' to detect a closed airway. Large Leak A large mask leak affecting machine performance. LL Non Responding Event A type of respiratory event that won't respond to a pressure increase. Expiratory Puff Intellipap event where you breathe out your mouth. SensAwake feature will reduce pressure when waking is detected. User Flag #1 A user definable event detected by SleepyHead's flow waveform processor. User Flag #2 User Flag #3 Heart rate in beats per minute Blood-oxygen saturation percentage SpO2 % Plethysomogram An optical Photo-plethysomogram showing heart rhythm Pulse Change A sudden (user definable) change in heart rate SpO2 Drop A sudden (user definable) drop in blood oxygen saturation SD Breathing flow rate waveform L/min Mask Pressure Mask Pressure (High resolution) Amount of air displaced per breath Graph displaying snore volume Minute Ventilation Amount of air displaced per minute Respiratory Rate Rate of breaths per minute Patient Triggered Breaths Percentage of breaths triggered by patient Pat. Trig. Breaths Leak Rate Rate of detected mask leakage I:E Ratio Ratio between Inspiratory and Expiratory time ratio Pressure Min Pressure Max Leak Flag LF Perfusion Index A relative assessment of the pulse strength at the monitoring site Perf. Index % Expiratory Time Time taken to breathe out Inspiratory Time Time taken to breathe in Respiratory Event A ResMed data source showing Respiratory Events Graph showing severity of flow limitations Flow Limit. Target Minute Ventilation Target Minute Ventilation? Maximum Leak The maximum rate of mask leakage Max Leaks Apnea Hypopnea Index Graph showing running AHI for the past hour Total Leak Rate Detected mask leakage including natural Mask leakages Median Leak Rate Median rate of detected mask leakage Median Leaks Respiratory Disturbance Index Graph showing running RDI for the past hour CPAP Session contains summary data only PAP Mode PAP Device Mode APAP (Variable) ASV (Fixed EPAP) ASV (Variable EPAP) Zero Upper Threshold Lower Threshold Orientation Sleep position in degrees Inclination Upright angle in degrees Name: %1, %2 DOB: %1 Phone: %1 Email: %1 Address: Usage Statistics This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead Auto Bi-Level ASV Auto EPAP Days: %1 Low Usage Days: %1 (%1% compliant, defined as > %2 hours) (Sess: %1) Bedtime: %1 Waketime: %1 90% (Summary Only) There is a lockfile already present for profile '%1'. You can only work with one instance of an individual SleepyHead profile at a time. Please close any other instances of SleepyHead running with this profile before proceeding. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. There is a lockfile already present for this profile '%1', claimed on '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. Peak %1% %2 Fixed Auto Fixed Bi-Level Auto Bi-Level (Fixed PS) Auto Bi-Level (Variable PS) ASV Fixed EPAP ASV Variable EPAP %1%2 Fixed %1 (%2) Min %1 Max %2 (%3) EPAP %1 IPAP %2 (%3) PS %1 over %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) EPAP %1 PS %2-%3 (%6) %1 %2 Welcome to SleepyHead What would you like to do? Please Import Some Data CPAP<br/>Importer Oximetery<br/>Wizard or View<br/>Statistics It might be a good idea to check preferences first,</br>as there are some options that affect import. First import can take a few minutes. Click this box to see this in daily view. The last time you used your %1... last night yesterday %2 days ago was %1 (on %2) perfect :) pretty darn good reasonably good technically "treated" not very good horrible, please consult your doctor You had an AHI of %1, which is considered %2 %1 hours, %2 minutes and %3 seconds You machine was on for %1. <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> <font color = red>You only had the mask on for %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. You had significant periods of <i>major</i> mask leakage. Your mask is leaking way too much.. Talk to your CPAP advisor. Your CPAP machine blasted you with a constant %1%2 of air Your pressure was under %1%2 for %3% of the time. Your machine blasted you with a constant %1-%2 %3 of air. Your machine was under %1-%2 %3 for %4% of the time. Your EPAP pressure fixed at %1%2. Your EPAP pressure was under %1%2 for %3% of the time. Your IPAP pressure was under %1%2 for %3% of the time. No CPAP data has been imported yet. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> (last night) (yesterday) (%2 day ago) No oximetery data has been imported yet. Very Important Warning <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. Contec CMS50 Fisher & Paykel ICON DeVilbiss Intellipap SmartFlex Settings ChoiceMMed MD300 Respironics M-Series Philips Respironics System One ResMed S9 EPR: Somnopose Somnopose Software Zeo Personal Sleep Coach VPAP Adapt EPR ResMed Exhale Pressure Relief Patient??? EPR Level Exhale Pressure Relief Level 0cmH2O 1cmH2O 2cmH2O 3cmH2O (% of time) Database Outdated Please Rebuild CPAP Data SleepyHead is proudly brought to you by JediMark. d MMM [ %1 - %2 ] %1 Hide All Events Show All Events Unpin %1 Graph Pin %1 Graph Plots Disabled Duration %1:%2:%3 AHI %1 %1: %2 Relief: %1 Hours: %1h, %2m, %3s Machine Information Journal Data SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead will not touch this folder, and will create a new one instead. Please be careful when playing in SleepyHead's profile folders :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. SleepyHead picked only the first one of these, and will use it in future: If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. CMS50F3.7 CMS50F SmartFlex Mode Intellipap pressure relief mode. Ramp Only Full Time SmartFlex Level Intellipap pressure relief level. Weinmann SOMNOsoft2 Loading %1 data... PLease Wait... By Pressure Statistics at Pressure %1 Session #%2 Snapshot %1 QuaZipFilePrivate ZIP/UNZIP API error %1 Report Form about:blank SessionBar No Sessions Present Statistics Details Most Recent Compliance Last 30 Days Last Year Average %1 CPAP Statistics CPAP Usage Average Hours per Night Therapy Efficiacy Leak Statistics Pressure Statistics Oximeter Statistics Blood Oxygen Saturation Pulse Rate %1 Median 90% %1 Min %1 Max %1 %1 Index % of time in %1 % of time above %1 threshold % of time below %1 threshold I can haz data?!? This lonely sleepy sheep has no data :( Last Week Last 6 Months Last Session No %1 data available. %1 day of %2 Data on %3 %1 days of %2 Data, between %3 and %4 Usage Information Total Days Compliant Days Days AHI &gt;5.0 Best&nbsp;%1 Worst&nbsp;%1 Best RX Setting Worst RX Setting Changes to Prescription Settings Days Pressure Relief Pressure Settings Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. Machine Information First Use Last Use UpdaterWindow SleepyHead Updater A new version of $APP is available Version Information Release Notes about:blank Build Notes Maybe &Later &Upgrade Now Please wait while updates are downloaded and installed... Updates Component Version Size Progress Log Downloading & Installing Updates &Finished Checking for SleepyHead Updates Requesting Saving as XML update structure parsed cleanly No updates were found for your platform. SleepyHead Updates No new updates were found for your platform. SleepyHead v%1, codename "%2" platform notes A new version of SleepyHead is available! Shiny new <b>v%1</b> is available. You're running old and busted v%2 An update for SleepyHead is available. Version <b>%1</b> is available. You're currently running v%1 SleepyHead v%1 build notes Update to QtLibs (v%1) There was an error parsing the XML Update file. %1 bytes received Redirected to File size mismatch for %1 File integrity check failed for %1 Extracting You might need to reinstall manually. Sorry :( Ugh.. Something went wrong with unzipping. Failed Download Complete There was an error completing a network request: ( Update Complete! Updates Complete. SleepyHead needs to restart now, click Finished to do so. Update Failed :( Download Error. Sorry, try again later. Downloading & Installing Updates... Please wait while downloading and installing updates. gGraph Snapshot gGraphView 100% zoom level Restore X-axis zoom too 100% to view entire days data. Reset Graph Layout Resets all graphs to a uniform height and default order. Y-Axis Plots CPAP Overlays Oximeter Overlays Dotted Lines Remove Clone Clone %1 Graph sleepyhead-0.9.8/Translations/Svenska.se.ts0000644000175000017500000143321012412506713020273 0ustar sergiosergio CMS50Loader Could not get data transmission from oximeter. Kan inte fÃ¥ data-anslutningen att fungera frÃ¥n pulsoximetern. Please ensure you select 'upload' from the oximeter devices menu. Försäkra dig om att du valt "upload" frÃ¥n displayen pÃ¥ pulsoximetern. CMS50Serial Processing... Bearbetar... Question FrÃ¥ga Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine? Kom du ihÃ¥g att starta din puls/syremätare exakt samma tid som du startade din CPAP-maskin? Information Information The most recent CPAP Session time has been selected as the start of your oximetry session. If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter. Din sista användning av CPAP-maskinen används som start för din puls/syremätar inspelning. Om du glömt att importera senaste CPAP-data först, gör det nu, och importera sen igen frÃ¥n din puls/syremätare. No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving. Ingen giltig starttid lämnades för denna puls/syre-mätning. Du mÃ¥ste förmodligen justera start-tiden för senaste mätningen innan du sparar. Please Wait, Importing... Var snäll och vänta en stund, importerar... Import Failed. Wait for oximeter and try again. Import misslyckades. Vänta pÃ¥ puls/syremätaren och försök igen. Import Failed Import misslyckades Set Oximeter to Upload Ställ in puls/syremätaren att ladda upp Daily Form Formulär Go to the previous day GÃ¥ till föregÃ¥ende dag Prev FöregÃ¥ende Show or hide the calender Dölj eller visa kalender ... ... Go to the next day GÃ¥ till nästa dag Next Nästa Go to the most recent day with data records GÃ¥ till senaste dagen med data Details Detaljer about:blank om:tom Events Händelser View Size Visa storlek Notes Noteringar Journal Journal Small Liten Medium Medium Big Stor Color Färg i i Ctrl+I Ctrl+I u u B B Ctrl+B Ctrl+B Zombie Zombie I'm feeling... Jag känner mig ... Weight Vikt Awesome Toppen B.M.I. B.M.I. Bookmarks Bokmärken Add Bookmark Lägg till bokmärke Starts Startar Remove Bookmark Ta bort bokmärke Flags Graphs Zoom fully out Zooma fullt ut 100% 100% Reset the graph heights to uniform sizes Ã…terställ grafens höjd till enhetlig storlek Reset Ã…terställ Drop down this list to show/hide available graphs. Släpp ner den här listen för att visa / dölja tillgängliga grafer. Breakdown Fördela events händelser Selection AHI Urval AHI U1 U1 U2 U2 U3 U3 Events/hour Händelser/timme No %1 events are recorded this day Inga %1 händelser är registrerade denna dag %1 event %1 händelse %1 events %1 händelser Oximetry data exists for this day, however it's timestamps are too different, so the Graphs will not be linked. Oximetridata finns för denna dag, men dom är tidsstämplade alltför olika, sÃ¥ Grafer kommer inte att kopplas. No Graphs :( Inga diagram :( ASV ASV Sleep Sömn Wake Vakna Hypopnea Hypopné Apnea Apnea Obstructive Obstruktiv Flow Limit Flödesbegränsning Clear Airway Öppna luftvägar User Flags Egna flaggor VSnore Snarkning VSnore2 Snarkning 2 PB/CSR PB/CSR Exh&nbsp;Puff Exh&nbsp;Puff Event Breakdown Händelser i detalj Sessions all off! Alla sessioner av! Sessions exist for this day but are switched off. Sessioner finns för denna dag men är avstängda. Impossibly short session Onaturligt kort session Zero hours?? 0 timmar?? BRICK :( Tegelsten :-( Sorry, your machine does not record data. Jag är ledsen, men din maskin registerar ingen data. Complain to your Equipment Provider! Klaga till Ã¥terförsäljaren! Avg Genomsnitt Med Medium Statistics Statistisk %1% %1% <b>Please Note:</b> This day just contains summary data, only limited information is available . <b>Observera:</b> Den här dagen innehÃ¥ller bara sammanfattningsdata, finns endast begränsad information. No data available Inga data tillgängliga Oximeter Information Oximeter information Int. Pulse Int. Puls Int. SpO2 Int. SpO2 Session Start Times Periodens Start Tid Session End Times Periodens Slut Tid Duration Varaktighet Oximetery Sessions UF1 UF1 UF2 UF2 Position Sensor Sessions Lägesgivaren Period Unknown Session Machine Settings Unavailable Maskin Inställningar Ej Tillgängliga EPR:%1 EPR_LEVEL:%2 EPR:%1 EPR_LEVEL:%2 SpO2 Desaturations Minskning av syrgasmättnad Pulse Change events Pulsförändringar SpO2 Baseline Used Baslinje för syrgasmättnad används Machine Settings Maskininställningar Session Information Sessions information SessionID Session ID CPAP Sessions CPAP Sessions Oximetry Sessions Oximeter Sessions Sleep Stage Sessions Sömnstadie Sessions Sleep Stage Sömnstadie One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly. En eller flera flödeskurvor för den här sessionen hade felaktiga källdata. Vissa flödeskurvor kanske inte visas korrekt. PAP Mode: %1<br/> This day has missing pressure, mode and settings data. Den här dagen saknar tryck, läges, och inställningsdata. %1%2 %1%2 This day just contains summary data, only limited information is available . Den här dagen innehÃ¥ller bara sammanfattningsdata, endast begränsad information är tillgänglig. Total time in apnea Time over leak redline Tid över röda läckage-linjen Total ramp time Time outside of ramp AHI excluding ramp Hide all events Show all events Sorry, your machine only provides compliance data. Ledsen, men din maskin sparar bara tid som maskinen använts. "Nothing's here!" Bob is bored with this days lack of data. Pick a Colour Välj en färg This bookmarked is in a currently disabled area.. Detta bokmärke är i ett för tillfället inaktiverat omrÃ¥de .. Bookmark at %1 Bokmärke pÃ¥ %1 Show all graphs Visa alla grafer No Graphs On! Inga grafer pÃ¥! Summary Only :( Endast Sammanfattning :( Hide all graphs Dölj alla grafer ExportCSV Export as CSV Exportera som CSV Dates: Datum: Resolution: Upplösning: Details Detaljer Sessions Sessioner Daily Daglig Filename: Filnamn: Cancel Avbryt Export Exportera Start: Börja: End: Sluta: Quick Range: SnabbIntervall: Most Recent Day Den senaste dagen Last Week Förra veckan Last Fortnight Senaste 2 veckorna Last Month Senaste mÃ¥naden Last 6 Months Senaste 6 mÃ¥naderna Last Year Senaste Ã¥ret Everything Allt Custom Anpassa ... ... SleepyHead_ SleepyHead Details_ Detaljer_ Sessions_ Sessions_ Summary_ Sammanfattning_ Select file to export to Välj fil att exportera till CSV Files (*.csv) CSV Filer (*.csv) DateTime ??? Datum Session Session Event Händelse Data/Duration Data/Varaktighet Date Datum Session Count Session antal Start Börja End Sluta Total Time Total tid AHI AHI Count Räkna Avg Genomsnitt %1% %1% FPIconLoader Import Error Import-fel This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. MainWindow SleepyHead SleepyHead &Statistics &Statistisk <html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html> <html><head/><body><p><span style=" font-weight:600;">Varning: </span>Det här är en förhands-vesion, och vissa funktioner fungerar inte som avsett ännu.</p></body></html> about:blank om:tom Report Mode Rapport läge Standard Standard Monthly MÃ¥nadsvis Date Range Datumintervall &Help Browser &Hjälp webbläsare ... ... qrc:/docs/index.html qrc:/docs/index.html &Navigation &Navigation Statistics Statistisk Daily Dagligen Overview Översikt Oximetry Oximetry Import Import Help Hjälp &Bookmarks &Bokmärke &Records &Uppgifter &File &Fil &View &Vy &Help &Hjälp &Data &Data &Advanced &Avancerad &Purge CPAP Data &Rensa CPAP Data Purge Oximetery Data Radera Oximetry-data &Import Data &Importera Data Shift+F2 Shift+F2 &Preferences &Inställningar &Profiles &Profiler E&xit G&Ã¥ ur Navigation Bookmarks Bokmärken Records Purge ALL CPAP Data Rebuild CPAP Data Exit View &Daily Visa &Dagligen F5 F5 View &Overview Vy &Översikt F6 F6 View &Welcome View &Välkommen F4 F4 - - Ctrl+Tab Ctrl+Tab Use &AntiAliasing Använd &Antialias &About SleepyHead &Om SleepyHead &Fullscreen Toggle &Helskärm Växla F11 F11 Show Debug Pane Visa Felsöknings Fönster &Reset Graph Layout &Ã…terställ Graferna Check for &Updates Kontrollera om det finns nya &uppdateringar Take &Screenshot Ta en &skärmdump F12 F12 O&ximetry Wizard O&ximetry Guiden Exp&ort Data &Automatic Oximetry Cleanup Purge &Current Selected Day Radera den &aktuella dagen F10 F10 View S&tatistics Visa S&tatistik View Statistics Visa statistik &Support SleepyHead Development &Stöd SleepyHead:s utveckling Change &Language Ändra &SprÃ¥k Change &Data Folder Ändra &Data-Mapp Import &Somnopose Data Importera &Somnopose Data Current Days Aktuella dagar Daily Calendar F9 F9 Backup &Journal View O&ximetry Visa O&ximetri F7 F7 Print &Report Skriv ut &Rapport &Edit Profile &Redigera Profil &Link Graph Groups &Länk Graf Grupp Exp&ort Exp&ort Online Users &Guide Online användar &Handbok &Frequently Asked Questions &Ã…terkommande frÃ¥gor &Rebuild Oximetry Indices &Uppdatera Oximetri Indexen Change &User Växla &Användare &Current Selected Day &Aktuell vald dag All data for current CPAP machine Alla data för aktuell CPAP maskin Right &Sidebar Höger &meny Toggle &Line Cursor Ctrl+L Daily Sidebar F8 F8 View S&ummary Visa S&ummering Import &ZEO Data Import &ZEO Data Import RemStar &MSeries Data Import Remstar &MSeries Data &Support Sleepyhead Development &Stöd SleepyHead Utveckling Sleep Disorder Terms &Glossary Sömnstörningar uttryck och &Ordlista Profile Profil Welcome Välkommen &About &Om Loading... Laddar... <b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum. <b>Varning:</b> Denna förhands-version är avsedd endast för betatestare. Vänligen dela <b>INTE</b> detta program utanför SleepyHead Testing Forum. Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version. Vänligen rapportera fel i denna version till SleepyHead Testing Forum, men börja med att spana in release trÃ¥den för att se till att du kör den senaste versionen. When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model. Vid redovisning av buggar, vänligen se till att rapportera SleepyHead versionsnummer, operativsystem och CPAP maskinmodell. <b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes. <b>Varning:</b> Rapporterna som detta program genererar kan inte användas för användnings-rapportering eller för att ställa medicinska diagnoser. These messages are only a temporary feature. Some people thought they were an error. Dom här meddelandena är bara en temporär funktion, En del personer har trott dom var felmeddelanden. Loading Data Laddar data CPAP data was recently purged and needs to be re-imported. CPAP-data har nyligen rensats, och behöver Ã¥ter importeras. Would you like this done automatically from the Backup Folder? Vill du att detta görs automatiskt frÃ¥n Backup-mappen? Please wait, importing from backup folder(s)... Vänta, importerar frÃ¥n backup-mappen(s)... Data successfully imported from the following locations: Data-importen lyckades frÃ¥n: Couldn't find any new Machine Data at the locations given. Kunde inte finna nÃ¥gra nya maskin-data frÃ¥n den plats som angetts. Import Problem Import problem Please wait, scanning for CPAP data cards... Vänta, söker efter CPAP minnes-kort... Choose a folder Välj en mapp <b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes. If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu. Make sure your keep your SleepyHead data folder backed up when trying testing versions. Please ensure you are running the latest version before reporting any bugs. Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report. Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it! This red message line is intentional, and will not be a feature in the final version... Imported %1 CPAP session(s) from %2 Import Success Already up to date with CPAP data at %1 Up to date Couldn't find any valid Machine Data at %1 Please insert your CPAP data card... Access to Import has been blocked while recalculations are in progress. TillgÃ¥ngen till import har blockerats medan omräkning pÃ¥gÃ¥r. A %1 file structure for a %2 was located at: A %1 file structure was located at: CPAP Data Located CPAP-data hittades CPAP Datacard structures were detected at the following locations: CPAP minneskort-data hittades pÃ¥ följande plats: Would you like to import from the path(s) shown above? Vill du importera frÃ¥n den plats(s) som visas ovan? Select another folder Välj en anna mapp Please wait, launching file dialog... Vänta, visar fil-hanteraren... No CPAP data card detected, launching file dialog... Inget CPAP minneskort hittades, visar fil-hanteraren... Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder. Kom ihÃ¥g att markera "roten" pÃ¥ det minneskort där du har CPAP-data, och inte en under-mapp. Tex: (G:). Import Reminder Import pÃ¥minnelse Please wait, SleepyHead is importing data... Vänta, SleepyHead importerar data... Data successfully imported from the following locations Data-importen lyckades frÃ¥n följande plats Import from where? Importera frÃ¥n vart? Do you just want to Import from the usual (remembered) locations? Vill du importera frÃ¥n den vanliga platsen? The Usual Den vanliga New Location Ny plats Cancel Avbryt Importing Data Importerar data Remember this Location? Kom ihÃ¥g denna plats? Would you like to remember this import location for next time? Vill du komma ihÃ¥g den här import platsen till nästa gÃ¥ng? Import Problem Couldn't find any new Machine Data at the locations given Import Problem Det gick inte att hitta nÃ¥gra nya maskindata pÃ¥ de platser som angetts Would you like to import from this location? Specify Welcome to SleepyHead Välkommen till SleepyHead About SleepyHead Om SleepyHead This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders. Det här programmet har skapats för att hjälpa dig visa den data som samlas av CPAP-maskinen, för att underlätta i behandlingen av SömnApne. SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions. SleepyHead har utvecklats av en programmerare med egen erfarenhet av sömnapne, tillsammans med mÃ¥nga andra som använder programmet och hjälper till att utveckla det. This is a beta release, some features may not yet behave as expected. Det här är en test-version av programmet, och vissa funktioner kanske inte fungerar som förväntat. Please report any bugs you find to SleepyHead's SourceForge page. Rapportera fel och buggar du hittar till SleepyHead´s SourceForge page. Currenly supported machines: Maskiner som stöds för närvarande: CPAP CPAP Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models) Philips Respironics System One (CPAP Pro, Auto, BIPAP & ASV models) ResMed S9 models (CPAP, Auto, VPAP) ResMed S9 models (CPAP, Auto, VPAP) DeVilbiss Intellipap (Auto) DeVilbiss Intellipap (Auto) Fisher & Paykel ICON (CPAP, Auto) Fisher & Paykel ICON (CPAP, Auto) Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters ResMed S9 Oximeter Attachment ResMed S9 Oximeter Attachment Online Help Resources Online FrÃ¥gor och Svar Note: Notering: I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser. Jag rekomenderar inte att använda denna webläsare till normal surfning pÃ¥ internet, den fungerar men är huvudsakligen avsedd för hjälpavsnittet. (It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.) (SSL kryptering stöds inte, sÃ¥ det är ingen bra ide att skriva lösenord och personlig information här.) SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/> SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Användarmanual</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Vanliga frÃ¥gor</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Ordlista för SömnApne</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/> SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/> SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Hemsida</a> pÃ¥ SourceForge<br/> Further Information Vidare Information Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version. Här är <a href='qrc:/docs/release_notes.html'>nyheter</a> för denna vesion. Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users. Plus nÃ¥gra <a href='qrc:/docs/usage.html'>bra att veta</a>, samt viktig information för MAC-användare. About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia Om <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>SömnApne</a> pÃ¥ Wikipedia Friendly forums to talk and learn about Sleep Apnea: Trevligt forum för att prata om och lära sig mer om SömnApne: <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>, <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> <a href='http://www.apneaboard.com/forums/'>Apnea Board</a> Copyright: Copyright: &copy;2011-2014 &copy;2011-2014 License: Licens: This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>. Det här programmet fÃ¥r användas fritt under <a href="qrc:/COPYING">GNU Public License</a>. DISCLAIMER: ANSVARSFRISKRIVNING: This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed. Det här är <font color='red'><u>INTE</u></font> medicinsk programvara. Det här programmet är enbart till för att visa data, och inga garantier ges pÃ¥ noggranhet och korrekthet hos beräkningar eller visade data. The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software. Upphovsmannen eller översättarna kan INTE hÃ¥llas ansvariga om nÃ¥gon skadar sig själv eller andra genom att använda denna programvara. Your doctor should always be your first and best source of guidance regarding the important matter of managing your health. Din doktor ska alltid vara ditt första och bästa val av vägledning beträffande den viktiga frÃ¥gan om att bäst hantera din egen hälsa. *** <u>Use at your own risk</u> *** *** <u>Använd pÃ¥ egen risk</u> *** Loading Laddar Revision: Ändring: branch branch Build Date: %1 %2 Skapad: %1 %2 Graphics Engine: %1 Grafik Motor: %1 Data Folder Location: <a href="file://%1">%2</a> James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson. Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here. Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Are you sure you want to rebuild all CPAP data for the following machine: Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way. For some reason, SleepyHead does not have internal backups for the following machine: Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually. Are you really sure you want to do this? Är du verkligen säker pÃ¥ att du vill göra detta? Because there are no internal backups to rebuild from, you will have to restore from your own. Would you like to import from your own backups now? (you will have no data visible for this machine until you do) You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine: Note as a precaution, the backup folder will be left in place. Are you <b>absolutely sure</b> you want to proceed? A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually: %1's Journal Choose where to save journal XML Files (*.xml) Data Folder Location: %1 Data-mapp sökväg: %1 This software is released under the GNU Public License v3.0<br/> Det här programmet är skapat under GNU Public License v3.0<br/> Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ Glöm inte att gilla/+1 SleepyHead pÃ¥ <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ SleepyHead, brought to you by Jedimark SleepyHead, skapad för dig av Jedimark Kudos & Credits Stort tack till medverkande Bugfixes, Patches and Platform Help: Buggfixar, Uppdateringar och Utvecklingshjälp: James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone. James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone. Translators: Översättare: Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here. Arie Klerk (Holländska), Steffen Reitz (Tyska), Lars-Erik Söderström (Svenska), och andra som allt eftersom kommer att läggas in här. 3rd Party Libaries: 3:e parts bibliotek: SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>. SleepyHead är utvecklad med hjälp av <a href="http://qt-project.org">Qt Application Framework</a>. It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module. Det använder plattformen <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> bibliotek för seriell port-anslutning i Oximeter-modulen. In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package. I översättnings-koden, använder SleepyHead <a href="http://sourceforge.net/projects/quazip">QuaZip</a> av Sergey A. Tachenov, som är ett C++ omslag över Gilles Vollant's ZIP/UNZIP paket. Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data. Ett speciellt tack till Pugsy frÃ¥n <a href='http://cpaptalk.com'>CPAPTalk</a> för hennes hjälp med dokumentation och vägledning, likasÃ¥ alla andra som hjälpt till med testning och med att delat sina personliga cpap-data. Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal. Tack för att du använder SLeepyHead Om du finner SleepyHead användbart sÃ¥ överväg gärna att stödja framtida utveckling genom att skänka en slant via PayPal. This software comes with absolutely no warranty, either express of implied. Denna programvara levereras utan garanti, varken uttryckligen eller underförstÃ¥tt. It comes with no guarantee of fitness for any particular purpose. Den levereras utan garanti för dess lämplighet för ett visst ändamÃ¥l. No guarantees are made regarding the accuracy of any data this program displays. Inga garantier kan lämnas för riktigheten av dom uppgifter detta program visar. This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. Detta är inte en medicinsk programvara, det är bara ett forskningsverktyg som ger en visuell tolkning av uppgifter som registrerats av dom enheter som stöds. This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter. Denna programvaras ändamÃ¥l är inte lämplig för medicinsk diagnostik, inte heller är den lämplig för CPAP användnings-rapportering, eller nÃ¥gon annan medicinsk användning för den delen. The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software. Författaren och nÃ¥gon som är tillhörande med honom tar inte ansvar för skador, frÃ¥gor eller icke-frÃ¥gor till följd av användning eller felaktig användning av denna programvara. Use this software entirely at your own risk. Använd denna programvara helt pÃ¥ egen risk. There was an error saving screenshot to file "%1" Det uppstod ett fel när skärmdumpen skulle sparas till filen "%1" Screenshot saved to file "%1" Skärmdumpen sparades till filen "%1" Are you sure you want to purge all CPAP data for the following machine: Är du säker pÃ¥ att du vill rensa alla CPAP uppgifter för följande maskin: Not all session data could be removed, you have to delete the following folder manually. Inte alla sovperiods-data kan tas bort, du mÃ¥ste ta bort följande mapp manuellt. Machine data has been successfully purged. Maskin data har raderats. Would you like to reimport from the backup folder? Vill du importera en gÃ¥ng till frÃ¥n säkerhetskopierings-mappen? Please wait, importing... Vänta, importerar ... There was a problem opening Somnopose Data File: Det gick inte att öppna Somnopose datafil: Somnopause Data Import complete Somnopose Data-Import komplett Are you sure you want to delete oximetry data for %1 Är du säker pÃ¥ att du vill ta bort oximetridata för %1 <b>Please be aware you can not undo this operation!</b> <b>Tänk pÃ¥ att du INTE kan Ã¥ngra den här Ã¥tgärden!</b> Select the day with valid oximetry data in daily view first. Markera dagen med giltiga oximetridata i daglig vy först. Build Date Skapad den Data Folder Data katalog Copyright Copyright This software is released under the GNU Public License v3.0<br> Denna programvara är släppt under GNU Public License v3.0 <br> SleepyHead Project Page SleepyHead projekt sida SleepyHead Wiki SleepyHead Wiki Authors Twitter Feed Författare till Twitter flöde <p>The author wishes to express thanks to James Marshall and Rich Freeman for their assistance with this project.</p> <p> Författaren vill framföra tack till James Marshall och Rich Freeman för deras hjälp med det här projektet. </ p> This software comes with absolutely no warranty, either express of implied. It comes with no guarantee of fitness for any particular purpose. No guarantees are made regarding the accuracy of any data this program displays. Denna programvara levereras med absolut ingen garanti, vare sig uttryckligen eller underförstÃ¥dd. Den kommerinte med nÃ¥gon garanti för lämplighet för ett visst ändamÃ¥l. Inga garantier kan lämnas beträffande giltigheten av data som programmet visar. This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. This software is NOT suitable for medical diagnosis, CPAP complaince reporting and other similar purposes. Detta är inte medicinsk programvara, utan det är bara ett forskningsverktyg som ger en visuell tolkning av uppgifter som registrerats av enheter som stöds. Denna programvara är inte lämplig för medicinsk diagnos, CPAP complaince rapportering och andra liknande ändamÃ¥l. The author and any associates of his accept NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software<br/>Use this software entirely at your own risk. Författaren och alla medarbetare tar inte ansvar för skador, problem eller icke-problem till följd av användning eller felaktig användning av denna programvara <br/> Använd denna programvara helt pÃ¥ egen risk. If you find this free software to be of use, please consider supporting the development efforts by making a paypal donation to the Author Om du tycker den här fria programvaran är användbar, överväg att stödja utvecklingsarbetet genom att göra en paypal donation till författaren Access to Preferences has been blocked until recalculation completes. TillgÃ¥ng till Preferences har blockerats tills omräkning avslutas. Question FrÃ¥ga Do you have a CMS50[x] Oximeter? One is required to use this section. Har du en CMS50 [x] Oximeter? Den är nödvändig för att använda det här avsnittet. Printing Disabled Utskrift inaktiverad Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt Vänligen Ã¥teruppbygg Sleepyhead med Qt 4.8.5 eller högre, eftersom utskriften orsakar en krasch med denna version av Qt Gah! Gah! If you can read this, the restart command didn't work. Your going to have to do it yourself manually. Om du kan läsa detta, fungerade inte kommandot omstart . Du kommer att behöva göra det själv manuellt. Are you sure? Är du säker? Are you sure you want to purge all CPAP data for the following machine: Är du säker pÃ¥ att du vill rensa alla CPAP uppgifter till följande maskiner: Performance will be degraded during these recalculations. Prestandan försämras under dessa omräkningar. Recalculating Indices Räknar om indexen Loading Event Data Laddar händelse data Recalculating Summaries Räknar om Sammanfattning Restart Required Omstart krävs Recalculations are complete, the application now needs to restart to display the changes. Omräkningar är klar, programmet behöver nu starta om för att visa ändringarna. Recalculations are now complete. Omräkningen är nu klar. Task Completed Uppgiften är klar There was a problem opening ZEO File: Det var ett problem att öppna ZEO Fil: Zeo CSV Import complete Zeo CSV import är klar There was a problem opening MSeries block File: Det var ett problem att öppna MSeries block fil: MSeries Import complete MSeries Import är klar MinMaxWidget Auto-Fit Defaults Override The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own. The Minimum Y-Axis value.. Note this can be a negative number if you wish. The Maximum Y-Axis value.. Must be greater than Minimum to work. Scaling Mode This button resets the Min and Max to match the Auto-Fit NewProfile Edit User Profile Redigera användarprofil about:blank om:tom I agree to all the conditions above. Jag godkänner alla villkor ovan. User Information Användar-information User Name Användar-namn Keep the kids out.. Nothing more.. This isn't meant to be uber security. HÃ¥ll barnen ifrÃ¥n programmet...inte mer... det här är inte tänkt att vara topphemligt. Password Protect Profile Lösenordsskyddad profil Password Lösenord ...twice... ...2 gÃ¥nger... Locale Settings Lokala inställningar Country Land TimeZone Tids-zone qrc:/docs/update_notes.html qrc:/docs/update_notes.html DST Zone DST zone Personal Information (for reports) Personlig information (för rapporter) First Name Förnamn Last Name Efternamn D.O.B. Födelsedatum Gender Kön Male Man Female Kvinna Height Längd metric Metrisk archiac ????? Contact Information Kontakt information Address Adress Email E-post Phone Telefon CPAP Treatment Information CPAP behandlingsinformation Date Diagnosed Datum för diagnos Untreated AHI Obehandlad AHI CPAP Mode CPAP-inställning CPAP CPAP APAP APAP Bi-Level Bi-Level ASV ASV RX Pressure Föreskrivet tryck Doctors / Clinic Information Doktors journalföring Doctors Name Sömn-doktor Practice Name Sjukhus/avd. Patient ID Patient ID SleepyHead SleepyHead TextLabel Textfält &Cancel &Avbryt &Back &tillbaka &Next &nästa Select Country Välj land Welcome to SleepyHead Välkommen till SleepyHead This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment. Denna programvara är utformad för att hjälpa dig att granska dom sömn-data som sparas av din CPAP-maskin varje natt och tillhörande utrustning. SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose. Sleepyhead har släppts fritt under <a href='qrc:/COPYING'> GNU Public License </a>, och kommer inte med nÃ¥gon garanti, och utan nÃ¥gra ansprÃ¥k pÃ¥ att vara lämpligt för nÃ¥got ändamÃ¥l. PLEASE READ CAREFULLY VAR VÄNLIG OCH LÄS DETTA NOGA SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor. Sleepyhead är avsedd enbart för att visa sömn-data, och är definitivt inte en ersättning för kompetent medicinsk rÃ¥dgivning frÃ¥n din läkare. Accuracy of any data displayed is not and can not be guaranteed. Noggrannhet av alla data som visas är inte och kan inte garanteras. Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes. Alla rapporter som genereras är FÖR PERSONLIG BRUK, och passar INTE PÃ… NÃ…GOT SÄTT för efterlevnad eller för medicinska diagnostiska ändamÃ¥l. The author will not be held liable for <u>anything</u> related to the use or misuse of this software. Författaren kan inte hÃ¥llas ansvarig för <u>nÃ¥gonting</u> i samband med användning eller missbruk av denna programvara. Use of this software is entirely at your own risk. Användning av denna programvara sker helt pÃ¥ egen risk. SleepyHead is copyright &copy;2011-2014 Mark Watkins Sleepyhead är copyright &copy;2011-2014 Mark Watkins Please provide a username for this profile Ange ett användarnamn för den här profilen Passwords don't match Lösenorden matchar inte Profile Changes Profil-ändringar Accept and save this information? Acceptera och spara denna information? &Finish &Avsluta &Close this window &Stäng detta fönster Overview Form Formulär Range: Intervall: Last Week Förra veckan Last Two Weeks Senaste 2 veckorna Last Month Senaste mÃ¥naden Last Two Months Senaste 2 mÃ¥naderna Last Three Months Senaste 3 mÃ¥naderna Last 6 Months Senaste 6 mÃ¥naderna Last Year Senaste Ã¥ret Everything Allt Custom Anpassa Start: Börja: End: Avsluta: Reset view to selected date range Ã…terställ vy till valt datum intervall ... ... Toggle Graph Visibility Växla grafens synlighet Drop down to see list of graphs to switch on/off. Öppna meny för att se lista pÃ¥ grafer att visa/dölja. Graphs Grafer Respiratory Disturbance Index Andnings (Respiratory) Störnings (Disturbance) Index Apnea Hypopnea Index Apnea Hypopnea Index Usage Användning Usage (hours) Användning (timmar) Session Times Antal Perioder Session Times (hours) Periodens Timmar % in PB % in PB Periodic Breathing (% of night) Periodisk Andning (% av natten) % in %1 %1 (% of night) Large Leaks (% of night) Peak RDI Högsta RDI Peak RDI Shows RDI Clusters (RDI/hr) Högsta RDI Visar RDI Kluster (RDI/tim) Peak AHI Högsta AHI Peak AHI Shows AHI Clusters (AHI/hr) Högsta AHI Visar AHI Kluster (AHI/tim) Tidal Volume (ml) Tidal Volym (ml) Minute Ventilation (L/min) Minut Ventilation (L/min) Target Ventilation (L/min) MÃ¥l Ventilation (L/min) Patient Triggered Breaths (%) Patient Triggade Andetag (%) (count) (räkna) Oxygen Saturation (%) Syremättnad (%) SensAwake (count) SensAwake (räkna) Body Mass Index Body Mass Index How you felt (0-10) Hur du känner dig (0-10) Zombie Meter Zombis Mätare breaths/min andetag/min L/b L/b %PTB %PTB % PB % PB % %1 Show all graphs Visa alla grafer No Graphs On! Inga grafer pÃ¥! Hide all graphs Dölj alla grafer OximeterImport Dialog Dialog Oximeter Import Wizard Oximeter import-guid <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p> <p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html> Skip this page next time. Hoppa över den här sidan nästa gÃ¥ng. <html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html> <html><head/><body><p>SleepyHead stöder fullt ut Contec CMS50D+/E/F serial oximeters, <br/>och även data-filer gjorda av ChoiceMMed MD300W1 oximeters' mjukvara.</p></body></html> Where would you like to import from? Vart vill du importera ifrÃ¥n? <html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html> <html><head/><body><p>Det här alternativet gör att du kan importera (via kabel) frÃ¥n dina oximetrars interna inspelningar. </p><p>När du har valt detta alternativ, kommer vissa oximetrar kräver att du väljer nÃ¥got pÃ¥ enhetsmenyn för att inleda uppladdningen. </p></body></html> Directly from a recording on a device Direkt frÃ¥n en inspelning pÃ¥ en enhet <html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html> <html><head/><body><p>Om du inte har nÃ¥got emot att vara ansluten till en dator som är pÃ¥slagen över natten, kan detta alternativ ge en användbar plethysomogram kurva, vilket ger en indikation pÃ¥ hjärtrytmen, ovanpÃ¥ den normala oximetri avläsningen.</p></body></html> Record attached to computer overnight (provides plethysomogram) Registrering ansluten till datorn över natten (erbjuder plethysomogram) <html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html> <html><head/><body><p>Det här alternativet tillÃ¥ter dig att importera frÃ¥n datafiler som skapats av program som följde med pulsoximetern, tex: SpO2Review.</p></body></html> Import from a datafile saved by another program, like SpO2Review Importera frÃ¥n en datafil som sparats av ett annat program, tex: SpO2Review <html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></html> <html><head/><body><p><span style=" font-weight:600; font-style:italic;">PÃ¥minnelse för CPAP-användare: </span><span style=" color:#fb0000;">Kom du ihÃ¥g att importera dina CPAP inspelningar först?</span></p><p>Om du har glömt, har du inte en giltig tid att synkronisera denna oximetri inspelning med.<br/><br/>För att säkerställa god synkronisering mellan enheter, försök alltid att starta bÃ¥da pÃ¥ samma gÃ¥ng.</p></body></html> Please connect your oximeter device Anslut din oximeter enhet Press Start to commence recording Tryck pÃ¥ Start för att pÃ¥börja inspelningen Show Live Graphs Visa Live Diagram Duration Varaktighet SpO2 % SpO2 % Pulse Rate Puls Multiple Sessions Detected Flera inspelningar upptäckta Please choose which one you want to import into SleepyHead Välj vilken du vill importera till SleepyHead Start Time Import Time Tid för import Details Detaljer Import Completed. When did the recording start? Importen är klar. När pÃ¥börjades inspelningen? Day recording (normally would of) started Inspelning (normalt ) startade Oximeter Starting time Oximeter inspelning startade I want to use the time reported by my oximeter's built in clock. Jag vill använda den tid som rapporteras av min oximeters inbyggda klocka. I started this oximeter recording at (or near) the same time as a session on my CPAP machine. Jag startade denna pulsoximeter inspelning samtidigt (eller nära) som jag startade min CPAP-maskin. <html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html> <html><head/><body><p>Sleepyhead behöver en starttid för att veta var du vill spara den här oximetri inspelningen.</p><p>Välj ett av följande alternativ:</p></body></html> <html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html> <html><head/><body><p>Observera: Synkronisera med CPAP-inspelningens starttid kommer alltid att vara mera exakt.</p></body></html> Choose CPAP session to sync to: Välj CPAP-inspelning att synkronisera med: ... ... You can manually adjust the time here if required: Du kan manuellt justera tiden här om det behövs: HH:mm:ssap HH:mm:ssap &Cancel &Avsluta &Information Page &Informationssida &Retry &Försök igen &Choose Session &Välj inspelning &End Recording &Slut pÃ¥ inspelning &Sync and Save &Synka och spara &Save and Finish &Spara och avsluta &Start &Start Scanning for compatible oximeters Söker efter kompatibla Oximetrar Could not detect any connected oximeter devices. Kunde inte detektera nÃ¥gon ansluten Oximeter-enhet. Connecting to %1 Oximeter Ansluter till %1 Oximeter "%1", session %2 Waiting for %1 to start Waiting for the device to start the upload process... Select upload option on %1 Välj metod för uppladdning pÃ¥ %1 Waiting for you to start the upload process... Väntar pÃ¥ att du ska starta uppladdningen... %1 device is uploading data... %1 enheten laddar upp data... Please wait until oximeter upload process completes. Do not unplug your oximeter. Vänta tills oximeter-uppladdningsprocessen är klar. Koppla inte bort din oximeter. Oximeter import completed.. Oximeter-import är färdig.. Select a valid oximetry data file Välj en giltig oximeter datafil Oximetry Files (*.spo *.spor *.spo2 *.dat) Oximeter filer (*.spo *.spor *.spo2 *.dat) No Oximetery module could parse the given file: Ingen Oximeter modul kunde tolka den valda filen: Oximeter not detected Ingen Oximeter ansluten Couldn't access oximeter Kunde inte ansluta till Oximetern Live Oximetery Mode Oximeter-läge "LIVE" Starting up... Startar... If you can still read this after a few seconds, cancel and try again Om du fortfarande efter nÃ¥gra sekunder kan läsa detta, avsluta och försök igen. Live Import Stopped "LIVE" import stoppad Live Oximetery Stopped "LIVE" Oximeter stoppad Live Oximetery import has been stopped "LIVE" Oximeter-import har blivit stoppad %1 session(s) on %2, starting at %3 %1 inspelning(s) pÃ¥ %2, startade %3 No CPAP data available on %1 IngenCPAP-data tillgänglig pÃ¥ %1 %1 %1 Recording... Spelar in... Finger not detected Inget finger detekterat I want to use the time my computer recorded for this live oximetry session. Jag vill använda tiden datorn registrerat för denna "LIVE" oximetri inspelning. I need to set the time manually, because my oximeter doesn't have an internal clock. Jag vill sätta tiden manuellt, eftersom min oximeter inte har egen inbyggd klocka. Something went wrong getting session data NÃ¥got gick fel vid mottagandet av inspelningsdata CMS50 Session %1 CMS50 inspelning %1 Oximetry Form Formulär Date Datum d/MM/yy h:mm:ss AP d/MM/yy h:mm:ss AP R&eset R&eset SpO2 SpO2 Pulse Puls ... ... &Open .spo/R File &Öppna .spo/R Fil Serial &Import Seriell &Import &Start Live &Start Live Serial Port Seriell Port &Rescan Ports &Rescan Port PreferencesDialog Preferences Inställningar &Import &Import Session Settings Period Inställningar Combine Close Sessions SlÃ¥ samman perioder med kort avbrott mellan Minutes Minuter Multiple sessions closer together than this value will be kept on the same day. Flera sessioner närmare varandra än detta värde kommer att hÃ¥llas samma dag. Ignore Short Sessions Ignonera korta perioder <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Perioder med kortare varaktighet än detta kommer inte att visas<span style=" font-style:italic;">.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html> Day Split Time Tidpunkt när dagar delas Sessions starting before this time will go to the previous calendar day. Perioder som startar före den här tiden kommer att höra till föregÃ¥ende dag. Keep session data in memory to speed up revisiting days. HÃ¥ll period-data i minnet för att fÃ¥ snabbare Ã¥tkomst senare. Cache Session Data (uses more system memory) Cache period-Data (använder mer systemminne) Summary only data is more accurate for ResMed users if this is left on. Don't Split Summary Days Session Storage Options Period lagrings-option Create SD Card Backups during Import (Turn this off at your own peril!) This makes SleepyHead's data take around half as much space. But it makes import and day changing take longer.. If you've got a new computer with a small solid state disk, this is a good option. Detta gör att SleepyHead data tar ungefär hälften sÃ¥ mycket utrymme. Men det gör att import och dag-förändringar tar längre tid .. Om du har en ny dator med en liten solid state disk, är det här ett bra alternativ. Compress Session Data (makes SleepyHead data smaller, but day changing slower.) Komprimera period Data (gör SleepyHead:s data mindre, men skifta dag lÃ¥ngsammare.) Compress ResMed (EDF) backups to save disk space. Backed up EDF files are stored in the .gz format, which is common on Mac & Linux platforms.. SleepyHead can import from this compressed backup directory natively.. To use with ResScan will require the .gz files to be uncompressed first.. Komprimera ResMed (EDF) säkerhetskopior för att spara diskutrymme. Säkerhetskopierade EDF-filer lagras i .gz format, vilket är vanligt pÃ¥ Mac & Linux-plattformar.. Sleepyhead kan importera frÃ¥n denna komprimerade backup katalog.. Om du vill använda med ResScan kräver de att .gz filerna är okomprimerade först.. Compress SD Card Backups (slower first import, but makes backups smaller) Komprimera SD-kort:s säkerhetskopiering (lÃ¥ngsammare första importen, men gör säkerhetskopior mindre) The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes. Följande alternativ pÃ¥verkar hur mycket diskutrymme SleepyHead använder, och alla har en effekt pÃ¥ hur lÃ¥ng tid importen tar. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data. </span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Ändra SD Backup komprimeringsalternativ kommer inte att automatiskt komprimera säkerhetskopierade data. </span></p></body></html> &CPAP &CPAP CPAP Mask Information CPAP Mask Information Mask Type Mask Typ Generic mask type. Select the one that's closest to your mask. Standard typ av mask. Välj den som är närmast din mask. Description Beskrivning The name of your mask, or at least the name you call it. Namnet pÃ¥ din mask, eller Ã¥tminstone namnet du kallar den. Method of unintentional leaks calculation if not provided by your machine. Note: Statistical Model is experimental. Metod för oavsiktliga läckage-beräkningar om det inte fÃ¥s frÃ¥n din maskin. Obs: Statistisk modell är experimentell. Mask Profile Mask Profil Statistical Model Statistisk Modell Leak calcs Läckage calcs Started Using Började använda The date you started using this mask Det datum du började använda din mask Leak Profile Läckage Profil Pressure Tryck Leak Läcka <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Notera: </span>Läckage-profiler fungerar för närvarande inte..</p></body></html> Show in Event Breakdown Piechart #1 #2 This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning. Resync Machine Detected Events (Experimental) Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA) Visar Respiratory Störning Index istället för Apnea/Hypopné Index (RDI=AHI + RERA) Use RDI instead of AHI (PRS1 only) Använd RDI istället för AHI (PRS1 only) Don't show any compliance information Visa inte nÃ¥gon compliance information Do not import sessions older than: Importera inte sessioner äldre än: Sessions older than this date will not be imported Sessioner äldre än detta datum kommer inte att importeras dd MMMM yyyy dd MMMM yyyy This maintains a backup of SD-card data for ResMed machines, ResMed machines delete high resolution data older than 7 days, and graph data older than 30 days.. SleepyHead can keep a copy of this data if you ever need to reinstall. (Highly recomended, unless your short on disk space or don't care about the graph data) Detta innebär backup av SD-kortdata för ResMed maskiner, ResMed maskiner raderar högupplösta data äldre än 7 dagar, och grafdata äldre än 30 dagar.. Sleepyhead kan behÃ¥lla en kopia av dessa uppgifter om du behöver installera om. (Starkt rekommenderat, om du inte har ont om diskutrymme eller inte bryr dig om grafdata) Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON) Skapa SD Card Säkerhetskopior under Import (Detta är ganska viktigt för ResMed och FP ICON) Show Compliance Visa Compliance Regard days with under this usage as "incompliant". 4 hours is usually considered compliant. Betrakta dagar med mindre användning än detta som "uppfyller inte villkoren". 4 timmar brukar anses som "Compliant". hours Timmar as over eftersom över of usage per night användning per natt Enable/disable experimental event flagging enhancements. It allows detecting borderline events, and some the machine missed. This option must be enabled before import, otherwise a purge is required. Aktivera/inaktivera experimentella händelse-flaggningar. Det gör att man hittargränsfalls-händelser, och en del av dom maskinen missat. Detta alternativ mÃ¥ste aktiveras innan import, annars behövs en rensning. Custom User Event Flagging Användardefinerad Händelse-Flaggning Flow Restriction Flödesbegränsning Percentage of restriction in airflow from the median value. A value of 20% works well for detecting apneas. Procent av begränsning i luftflödet frÃ¥n medianvärdet. Ett värde pÃ¥ 20% fungerar bra för att upptäcka apnéer. % % <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Användardefinerade flaggor är en experimentell metod för att detektera händelser som missats av maskinen. Dom är <span style=" text-decoration: underline;">inte</span> inräknade i AHI.</p></body></html> Duration of airflow restriction Varaktighet luftflödesbegränsning s s Event Duration Varaktighet Händelse Allow duplicates near machine events. TillÃ¥t dubbletter nära maskinhändelser. AHI/Hour Graph Settings AHI/Timme Graf-inställning Window Fönster Adjusts the amount of data considered for each point in the AHI/Hour graph. Defaults to 60 minutes.. Highly recommend it's left at this value. Justerar mängden data som behövs för varje punkt i AHI / Timme grafen. Standardvärdet är 60 minuter .. Rekommenderas starkt att använda detta värdet. minutes Minuter Reset the counter to zero at beginning of each (time) window. Ã…terställ räknaren till noll vid början av varje (tid) fönster. Zero Reset Ã…terställ till noll Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform. Pixmap caching är en grafikacceleration teknik. Kan orsaka problem med typsnittsvisning i grafvisningsomrÃ¥det pÃ¥ din plattform. <html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html> <html><head/><body><p>Dessa funktioner har nyligen beskurits. De kommer att komma tillbaka senare. </p></body></html> CPAP Clock Drift CPAP klock avvikelse Don't touch this unless you know your CPAP clock is out. Try to sync it to your PC's clock (which should be synced to a timeserver) Rör inte detta om du inte vet att din CPAP klocka är fel. Försök att synkronisera den till din dators klocka (som bör synkroniseras till en tidsserver) seconds Sekunder User definable threshold considered large leak Användardefinerat tröskelvärde avseende stort läckage L/min L/min Whether to show the leak redline in the leak graph Huruvida den röda linjen ska visas i läckage-grafen Show Leak Redline Visa röda linjen för stort läckage &Events &Händelse Not entirely sure if this will get to live or not.. Inte helt säker pÃ¥ om detta kommer att fÃ¥ leva eller inte.. Show Visa Colour Färg Event Händelse ID ID Graphs Graf Search Sök Filters the graph list. Simply start typing the name of the graph your looking for. Filtrerar graflistan. Börja helt enkelt med att skriva namnet pÃ¥ diagrammet du letar efter. &Defaults &Förvalt Double click on the (Y-axis) min/max values to edit them Dubbelklicka pÃ¥ (Y-axeln) min/max värden för att redigera dem &Oximetry &Oximeter Type Typ Tries to forces the oximetry data to link with CPAP when possible. Försöker att forcera att länka Oximeterdata med CPAP när det är möjligt. Link Oximetry and CPAP graphs Länka Oximeter och CPAP grafer Flag changes in oximetry stats Flagga förändringar i Oximeter-statistik SPO2 SPO2 Percentage drop in oxygen saturation Procentuell minskning i syremättnaden Pulse Puls Sudden change in Pulse Rate of at least this amount Plötslig förändring i puls pÃ¥ minst denna nivÃ¥ bpm Andetag per minut Minimum duration of drop in oxygen saturation Minsta tid för nedgÃ¥ng i syremättnad Minimum duration of pulse change event. Minsta tid för pulsändringshändelse. Discard chunks under Kassera värden under Small chunks of oximetry data under this amount will be discarded. SmÃ¥ bitar av oximetridata under detta värde kommer att raderas. &General &Allmän General Settings Allmänna Inställningar Daily view navigation buttons will skip over days without data records Dagliga vy/navigeringsknapparna hoppar över dagar utan dataposter Skip over Empty Days Hoppa över Tomma Dagar Allow use of multiple CPU cores where available to improve performance. Mainly affects the importer. TillÃ¥t användning av flera processorkärnor där sÃ¥dana finns för att förbättra prestanda. Drabbar främst importmodulen. Enable Multithreading Aktivera Multithreading Bypass the login screen and load the most recent User Profile Hoppa över inloggningsskärmen och ladda den senaste användarprofilen Skip Login Screen Hoppa över inloggningsskärmen Changes to the following settings needs a restart, but not a recalc. Ändras följande inställningar behövs en omstart, men inte en omräkning. Oximetery Settings Oximeter Inställningar Contec CMS50D+ Contec CMS50D+ Contec CMS50E/F Contec CMS50E/F Contec CMS50F v3.7 Contec CMS50F v3.7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CPAP machine, you can now also achieve sync. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Synkronisering av Oximeter och CPAP-data</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data importerad frÃ¥n SpO2Review (frÃ¥n .spoR filer) eller med seriellimport-metoden, har </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">inte</span><span style=" font-family:'Sans'; font-size:10pt;"> den korrekta tiden som krävs för att synka.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live visnings-läget (med en seriell kabel) är ett sätt att Ã¥stadkomma en korrekt synk pÃ¥ CMS50 oximetrar, men justerar inte för CPAP klockans drift.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Om du startar din Oximeter-inspelning pÃ¥ </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exakt </span><span style=" font-family:'Sans'; font-size:10pt;">samma tid som du startar din CPAP-maskin,sÃ¥ kan du ocksÃ¥ synka tiden. </span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Serie importen tar starttiden frÃ¥n sista natten/första CPAP sessionen. (Kom ihÃ¥g att importera dina CPAP data först!)</span></p></body></html> Preferred Calculation Methods Prioriterade Beräkningsmetoder Middle Calculations Medel Beräkningar Upper Percentile Övre Procenten For consistancy, ResMed users should use 95% here, as this is the only value available on summary-only days. För konsekvensens skull bör ResMed användare använda 95% här, eftersom det är det enda värdet som finns pÃ¥ bara-översikts dagar. Median is recommended for ResMed users. Median rekomenderas för ResMed-användare. Median Median Weighted Average Vägt genomsnitt Normal Average Normal Genomsnitt ResMed users probably should use 99th Percentile for visual consistency. ResMed användare bör förmodligen använda 99: e percentilen för visuell konsekvens. True Maximum Sant maximal 99% Percentile 99% Percentile Maximum Calcs Maximum Calcs Automatically Check For Updates Kontrollera uppdateringar automatiskt Check for new version every Kolla efter ny version varje Sourceforge hosts this project for free.. Please be considerate of their resources.. Sourceforge är värd för detta projekt gratis .. Var omtänksam mot deras resurser.. days. dagar. &Check for Updates now &Sök efter uppdateringar nu Last Checked For Updates: Senaste kontroll efter uppdateringar: TextLabel Textetikett <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Om du är intresserad av att hjälpa till med att testa nya funktioner och buggfixar tidigt, klicka här..</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Men varnar för det kommer ibland innebära dÃ¥lig kod..</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> I want to try experimental and test builds (Advanced users only please.) Jag vill prova experimentella och test-versioner (vänligen bara avancerade användare.) &Appearance &Utseende Graph Settings Graf-inställningar Bar Tops Bar Tops Line Chart Linjediagram Overview Linecharts Översikt Linjediagram <html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html> <html><head/><body><p>Detta gör rullning när du har zoomat in lättare i känsliga dubbelriktade pekplattor</p><p>50ms rekommenderas som värde.</p></body></html> milliseconds millisekunder Scroll Dampening Scroll Dämpning Graph Tooltips Graf verktygstips Overlay Flags Overlay Flagga The visual method of displaying waveform overlay flags. Den visuella metoden att visa overlay vÃ¥gformsflaggor. Standard Bars Standard Bars Top & Bottom Markers Topp & Botten markörer Graph Height Graf-höjd Default display height of graphs in pixels Standard visning graf-höjd i pixlar Events Händelser Reset &Defaults <html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html> Waveforms Flag rapid changes in oximetry stats Other oximetry options Flag SPO2 Desaturations Below Discard segments under Flag Pulse Rate Above Flag Pulse Rate Below Contec CMS50D+/E/F Contec CMS50F v3.7+ Contec CMS50F v3.7+ {50F?} ChoiceMMed MD300W1 ResMed S9 Oximeter Module If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time. Update Oximeter Clock during import Show flags for machine detected events that haven't been identified yet. Show Unknown Flags Import without nagging How long you want the tooltips to stay visible. Hur länge du vill att verktygstips ska vara synliga. Tooltip Timeout Tooltip Timeout Top Markers Line Thickness Linje-tjocklek The pixel thickness of line plots Pixel tjocklek linjediagram Other Visual Settings Andra Visuella inställningar Anti-Aliasing applies smoothing to graph plots.. Certain plots look more attractive with this on. This also affects printed reports. Try it and see if you like it. Anti-Aliasing Utjämnar grafer och utskrifter.. Vissa grafer ser mer attraktiv ut med detta pÃ¥. Detta pÃ¥verkar även utskrivna rapporter. Prova och se om du gillar det. Use Anti-Aliasing Använd Anti-Aliasing Makes certain plots look more "square waved". Gör vissa grafer mer som "fyrkantsvÃ¥gor". Square Wave Plots FyrkantvÃ¥gs-visning Allows graphs to be "screenshotted" for display purposes. The Event Breakdown PIE chart uses this method, as does the printing code. Unfortunately some older computers/versions of Qt can cause this application to be unstable with this feature enabled. TillÃ¥ter grafer att vara "screenshotted" för visning. Händelse-visningen via tÃ¥rtdiagrammet använder denna metod, liksom skrivarkoden. Tyvärr kan en del äldre datorer/versioner av Qt orsaka detta program för att vara instabilt med denna funktion aktiverad. Show event breakdown pie chart Visar händelse-uppdelning som tÃ¥rtdiagram Use Pixmap Caching Använd Pixmap Caching Animations && Fancy Stuff Animationer & andra roliga saker Whether to allow changing yAxis scales by double clicking on yAxis labels Om du vill tillÃ¥ta att ändra yAxelns skala genom att dubbelklicka pÃ¥ yAxelns etikett Allow YAxis Scaling TillÃ¥t YAxel Skalning Application Fonts Applikations teckensnitt Font Teckensnitt Size Storlek Bold Markerad.. Italic Italic Application Application Graph Text Graf-text Graph Titles Graf-rubrik Big Text Stor Text Details Detaljer &Cancel &Avbryt &Ok &Ok Flag Minor Flag Span Always Minor Nasal Pillows Näs-kuddar Name Namn Color Färg Flag Type Label CPAP Events Oximeter Events Positional Events Sleep Stage Events Unknown Events Double click to change the descriptive name this channel. Double click to change the default color for this channel plot/flag/data. Here you can change the type of flag shown for this event This is the short-form label to indicate this channel on screen. This is a description of what this channel does. Lower Upper CPAP Waveforms Oximeter Waveforms Positional Waveforms Sleep Stage Waveforms Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform Data Reindex Required Data indexering krävs A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete. Are you sure you want to make these changes? En data omindexerings-procedur krävs för att tillämpa dessa ändringar. Denna operation kan ta ett par minuter att slutföra. Är du säker pÃ¥ att du vill göra dessa förändringar? Restart Required Omstart krävs One or more of the changes you have made will require this application to be restarted, in order for these changes to come into effect. Would you like do this now? En eller flera av de ändringar du har gjort kommer att kräva att det här programmet startas om, för att dessa ändringar skall träda i kraft. Vill du göra det nu? Daily Graphs Dagliga grafer Overview Graphs Översikt Grafer Graph Graf N/A Ej Tillgänglig Confirmation Bekräftelse Are you sure you want to reset your graph preferences to the defaults? Är du säker pÃ¥ att du vill Ã¥terställa din grafinställningar till standardvärdena? This may not be a good idea Det här kanske inte är en bra idè ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution). ResMed S9 maskiner tar rutinmässigt bort vissa data frÃ¥n ditt SD-kort äldre än 7 och 30 dagar (beroende pÃ¥ upplösning). If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back. Om du nÃ¥gonsin behöver importera dessa data igen (antingen i Sleepyhead eller ResScan) dessa data kommer inte komma tillbaka. If you need to conserve disk space, please remember to carry out manual backups. Om du behöver för att spara diskutrymme, kom ihÃ¥g att utföra manuell säkerhetskopiering. Are you sure you want to disable these backups? Är du säker pÃ¥ att du vill inaktivera dessa säkerhetskopior? Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found. Avstängning av automatiska säkerhetskopior är inte en bra idé, eftersom Sleepy behöver dessa för att bygga om databasen om fel hittas. Are you really sure you want to do this? Är du verkligen säker pÃ¥ att du vill göra detta? ProfileSelect Select Profile Välj profil Search: Sök: Start with the selected user profile. Starta med den valda användarprofilen. Create a new user profile. Skapa en ny användar-profil. Choose a different SleepyHead data folder. Välj en annan data-mapp för SleepyHead. &Different Folder &Annan mapp SleepyHead SleepyHead [version] [version] Click here if you didn't want to start SleepyHead. Klicka här om du inte vill starta SleepyHead. &Quit &Avsluta Folder: Katalog: The current location of SleepyHead data store. Den aktuella platsen för SleepyHead.s datalagring. [data directory] [data bibliotek] New Profile Ny profil &Select User &välj användare Open Profile Öppna profil Edit Profile Ändra profil Delete Profile Radera profil Enter Password for %1 Skriv lösenord för %1 Incorrect Password Felaktigt lösenord You entered the password wrong too many times. Du skrev fel lösenord för mÃ¥nga gÃ¥nger. You are about to destroy profile '%1'. Du är pÃ¥ väg att förstöra profil e '%1'. Enter the word DELETE below to confirm. Skriv ordet DELETE här under för att bekräfta. Sorry Ledsen You need to enter DELETE in capital letters. Du mÃ¥ste skriva ordet DELETE med stora bokstäver. Could not open profile.. You will need to delete this profile directory manually Kunde inte öppna profil.. Du mÃ¥ste radera den här profilen manuellt You will find it under the following location: Du hittar det under följande plats: You entered an incorrect password Du skrev ett felaktigt lösenord If you're trying to delete because you forgot the password, you need to delete it manually. Om du försöker ta bort eftersom du glömt lösenordet, mÃ¥ste du ta bort det manuellt. There was an error deleting the profile directory, you need to manually remove it. Det uppstod ett fel när du raderade katalogen, du mÃ¥ste ta bort den manuellt. Profile '%1' was succesfully deleted Profil '%1' raderades fullständigt Create new profile Skapa ny profil Enter Password Skriv lösenordet You entered an Incorrect Password too many times. Exiting! Du har skrivit in fel lösenord för mÃ¥nga gÃ¥nger. Spännande! QObject No Data Ingen data On PÃ¥ Off Av cm cm " " ft ft lb lb oz oz Kg Kg cmH2O cmH2O Hours Timmar Minutes Minuter Seconds Sekunder Events/hr Händelser/Timme % % Hz Hz bpm Andetag per minut Error Fel Warning Varning BMI BMI Weight Vikt Zombie Zombie Pulse Rate Puls SpO2 SpO2 Plethy Plethy Pressure Tryck Daily Dagligen Overview Översikt Oximetry Oximetri Oximeter Oximeter Event Flags Händelseflagga CPAP CPAP BiPAP BiPAP Bi-Level Bi-Level EPAP EPAP IPAP IPAP L/min Liter/minut Litres Liter ml ml Breaths/min Andetag/minut ?? ?? ratio förhÃ¥llande Severety (0-1) Allvarlighetsgrad (0-1) Degrees Grader Question FrÃ¥ga Information Information Busy Upptagen Please Note Notera Compliance Only :( Graphs Switched Off Summary Only :( Endast Sammanfattning :( Sessions Switched Off &Yes &Ja &No &Nej &Cancel &Avbryt &Destroy &Förstöra &Save &Spara Min EPAP Min EPAP Max EPAP Max EPAP Min IPAP Min IPAP Max IPAP Max IPAP APAP APAP ASV ASV ST/ASV ST/ASV Humidifier Befuktare H H OA OA A A CA CA FL FL SA SA LE LE EP EP VS VS VS2 VS2 RERA RERA PP PP P P RE RE NR NR NRI NRI O2 O2 PC PC UF1 UF1 UF2 UF2 UF3 UF3 PS PS AHI AHI RDI RDI AI AI HI HI UAI UAI CAI CAI FLI FLI REI REI EPI EPI ÇSR CSR PB PB IE IE Insp. Time Inandningstid Exp. Time Utandningstid Resp. Event Andningshändelser Flow Limitation Flödesbegränsning Flow Limit Flödesgräns SensAwake SensAwake Pat. Trig. Breath Patient triggat andetag Tgt. Min. Vent MÃ¥l minventilation Target Vent. MÃ¥lventilation. Minute Vent. Minutventilation. Tidal Volume Tidalvolym Resp. Rate Andningsfrekvens Snore Snarkning Leak Läcka Leaks Läckage Large Leak Stor läcka LL LL Total Leaks Totalt läckage Unintentional Leaks Oavsiktlig Läcka MaskPressure Masktryck Flow Rate Flödeshastighet Sleep Stage Sömnstadie Usage Användning Sessions Sessioner Pr. Relief Trycklättnad No Data Available Ingen data tillgänglig ? Severity (0-1) Bookmarks Bokmärken SleepyHead SleepyHead Mode Läge Model Modell Brand Fabrikat Serial Serienummer Series Machine Maskin Channel Kanal Settings Inställningar Inclination Dragning Orientation Inriktning Name Namn DOB Födelsedatum Phone Telefon Address Adress Email E-post Patient ID Patient ID Date Datum Bedtime Sängdags Wake-up Vakna Mask Time Mask pÃ¥ Unknown Okänd None Ingen Ready Färdig First Först Last Sist Start Börja End Sluta Yes No Min Min Max Max Med Medium Average Genomsnitt Median Median Avg Genomsnitt W-Avg W-Avg Import Error Import-fel This Machine Record cannot be imported in this profile. The Day records overlap with already existing content. Denna maskins inspelning kan inte importeras i denna profil. Inspelningen överlappar existerande innehÃ¥ll. Non Data Capable Machine EJ data-kapabel maskin Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model. Din Philips Respironics CPAP-maskin (Model %1) är tyvärr inte en data kapabel modell. I'm sorry to report that SleepyHead can only track hours of use for this machine. Jag är ledsen att rapportera att Sleepyhead bara kan visa timmars användning för denna maskin. 15mm 22mm Pressure Pulse Tryck Puls A pulse of pressure 'pinged' to detect a closed airway. En puls av lufttryck ivägskickad för att upptäcka en stängd luftväg. Flex Mode PRS1 pressure relief mode. C-Flex C-Flex+ A-Flex Rise Time Bi-Flex Flex Level PRS1 pressure relief setting. x1 x2 x3 x4 x5 Humidifier Status PRS1 humidifier connected? Disconnected Connected Heated Tubing Heated Tubing Connected Headed Tubing Humidification Level PRS1 Humidification level Humid. Lvl. System One Resistance Status Sys1 Resist. Status System One Resistance Setting System One Mask Resistance Setting Sys1 Resist. Set Hose Diameter Diameter of primary CPAP hose System One Resistance Lock Whether System One resistance settings are available to you. Sys1 Resist. Lock Auto On A few breaths automatically starts machine Auto Off Machine automatically switches off Mask Alert Whether or not machine allows Mask checking. Show AHI Whether or not machine shows AHI via LCD panel. Unknown PRS1 Code %1 Okänd PRS1 Code %1 PRS1_%1 PRS1_%1 Timed Breath Machine Initiated Breath TB Windows User Windows-användare Launching Windows Explorer failed Starta Utforskaren misslyckades Could not find explorer.exe in path to launch Windows Explorer. Det gick inte att hitta explorer.exe i datorn för att starta Utforskaren. SleepyHead (%1) needs to upgrade its database for %2 %3 %4 Sleepyhead (%1) mÃ¥ste uppgradera sin databas för %2 %3 %4 <b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b> <b>Sleepyhead har en säkerhetskopia av dina enheters minneskort som den använder för detta ändamÃ¥l.</b> <i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i> <i>Dina gamla maskindata bör regenereras förutsatt att denna backup funktion inte har inaktiverats i inställningarna under en tidigare dataimport.</i> SleepyHead does not yet have any automatic card backups stored for this device. Sleepyhead har ännu inte nÃ¥gra automatiska kortsäkerhetskopior som sparats för denna enhet. This means you will need to import this machine data again afterwards from your own backups or data card. Detta innebär att du kommer att behöva importera denna maskindata igen efterÃ¥t frÃ¥n dina egna säkerhetskopior eller datakort. Important: Viktigt: Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore. Efter du har uppgraderat, du <font size=+1>kan inte</font>använda denna profil med den tidigare versionen längre. If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again. Om du är orolig, klicka pÃ¥ Nej för att avsluta, och säkerhetskopiera din profil manuellt innan du startar SleepyHead igen. Are you ready to upgrade, so you can run the new version of SleepyHead? Är du redo att uppgradera, sÃ¥ du kan använda den nya versionen av SleepyHead? Machine Database Changes Maskindatabas Förändringar Sorry, the purge operation failed, which means this version of SleepyHead can't start. Tyvärr, rensningen misslyckades, vilket innebär att den här versionen av Sleepyhead inte kan starta. The machine data folder needs to be removed manually. Maskinens data-katalog mÃ¥ste raderas manuellt. This folder currently resides at the following location: Denna mapp är för närvarande pÃ¥ följande plats: Rebuilding from %1 Backup Ã…terskapar frÃ¥n %1 Säkerhetskopia Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these? Vill du slÃ¥ pÃ¥ automatisk säkerhetskopiering, sÃ¥ nästa gÃ¥ng en ny version av SleepyHead behöver göra det, kan Ã¥terskapa frÃ¥n dessa? SleepyHead will now start the import wizard so you can reinstall your %1 data. SleepyHead startar nu import-guiden sÃ¥ du kan Ã¥terinstallera dina %1 data. SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up: Sleepyhead kommer nu att avslutas, starta sen om din filhanterare sÃ¥ att du kan säkerhetskopiera din profil manuellt: Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process. Använd filhanteraren för att göra en kopia av din profilmapp, sedan det är klart, starta om Sleepyhead och slutför uppgraderingen. Release Notes Nyheter i denna version &Ok, get on with it.. &Ok, gÃ¥ vidare med det.. Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>. Leta efter denna version i <a href='%1'>SleepyHead's filer som är lagrade hos Sourceforge</a>. A faster build of SleepyHead may be available En snabbare version av SleepyHead kan vara tillgänglig You will not be bothered with this message again. Du kommer inte bli störd av det här meddelandet igen. This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer. Denna version kommer att fungera bra, men en "<b>%1</b>" märkt version av Sleepyhead kommer sannolikt köras mycket smidigare pÃ¥ din dator. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it. Denna version av SleepyHead var utformad för att fungera med äldre datorer som saknar OpenGL 2.0 stöd, men det ser ut som din dator har fullt stöd för det. This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer. Denna version av SleepyHead var utformad för att fungera med äldre datorer som saknar OpenGL 2.0 stöd, vilket din har, sÃ¥ det kan finnas en bättre version för din dator. If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available. Om du kör detta i en virtuell maskin som VirtualBox eller VMware, vänligen bortse frÃ¥n detta meddelande, eftersom ingen bättre version är tillgänglig. Incompatible Graphics Hardware Ej lämplig grafik-hÃ¥rdvara This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability. Denna version av SleepyHead kräver OpenGL 2.0 stöd för att kunna fungera fullständigt, och tyvärr sÃ¥ saknar din dator denna funktion. You may need to update your computers graphics drivers from the GPU makers website. %1 Du kan behöva uppdatera din dators grafikdrivrutiner frÃ¥n tillverkarens webbplats. %1 (<a href='http://intel.com/support'>Intel's support site</a>) (<a href='http://intel.com/support'>Intel's support site</a>) Because graphs will not render correctly, and it may cause crashes, this build will now exit. Eftersom grafer inte kommer att visas pÃ¥ rätt sätt och kanske orsaka krasher, sÃ¥ avslutas denna version nu. Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer. Bli inte nedslagen, det finns en annan version tillgänglig märkt "<b>-BrokenGL</b>" som bör fungera pÃ¥ din dator. No SleepyHead data folder was found. Ingen SleepyHead data-mapp hittades. Would you like SleepyHead to use the default location for storing its data? Vill du att SleepyHead använder standardplatsen för att lagra sina data? Choose or create new folder for SleepyHead data Välj eller skapa en ny mapp för SleepyHead:s data Exiting Spännande As you did not select a data folder, SleepyHead will exit. Eftersom du inte valt en data-mapp sÃ¥ avslutas SleepyHead. Next time you run, you will be asked again. Nästa gÃ¥ng du kör detta, sÃ¥ blir du tillfrÃ¥gad igen. You did not select a directory. Du valde inte en katalog. SleepyHead will now start with your old one. SleepyHead startar nu med din gamla. The folder you chose is not empty, nor does it already contain valid SleepyHead data. Mappen du väljer inte är tom, inte innehÃ¥ller den giltiga SleepyHead data heller. Are you sure you want to use this folder? Är du säker du vill använda den här mappen? About SleepyHead Om SleepyHead &Close &Stäng &Donate &Skänk en slant Unspecified Ospecifierad Nasal Pillows Näs-kuddar Hybrid F/F Mask Hybrid FullFace mask Nasal Interface Näs-masker Full-Face Mask Full-Face Mask Are you sure you want to reset all your channel colors and settings to defaults? There are no graphs visible to print Det finns inga grafer synliga för utskrift Would you like to show bookmarked areas in this report? Vill du visa bokmärkta omrÃ¥den i denna rapport? This make take some time to complete.. Please don't touch anything until it's done. Detta gör att det tar tid att slutföra... Rör ingenting förrän det är klart. Printing %1 Report Skriver %1 rapport %1 Report %1 Rapport : %1 hours, %2 minutes, %3 seconds : %1 timme, %2 minuter, %3 sekunder Range Fixed %1 Fast %1 RDI %1 RDI %1 AHI %1 AHI %1 AI=%1 HI=%2 CAI=%3 AI=%1 HI=%2 CAI=%3 REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%% UAI=%1 UAI=%1 NRI=%1 LKI=%2 EPI=%3 NRI=%1 LKI=%2 EPI=%3 Reporting from %1 to %2 Rapporterar frÃ¥n %1 till %2 Reporting data goes here Rapportera uppgifter kan göras här Entire Day's Flow Waveform Dagens alla flödes-data Current Selection Aktuell markering Entire Day Hela dagen SleepyHead v%1 - http://sleepyhead.sourceforge.net SleepyHead v%1 - http://sleepyhead.sourceforge.net Page %1 of %2 Sida %1 av %2 SleepyHead has finished sending the job to the printer. SleepyHead har skickat utskriften till skrivaren. No Waveform Available Ingen flödes-data tillgänglig Events Händelser Duration Varaktighet (% %1 in events) (% %1 i händelser) Days: %1 Dagar. %1 Low Usage Days: %1 Dagar med lÃ¥g användning: %1 (%1% compliant, defined as > %2 hours) (%1% användning, definerad som > %2 timmar) (Sess: %1) (Sess: %1) Bedtime: %1 Sängdags: %1 Waketime: %1 Uppvakningstid: %1 90% 90% (Summary Only) Jan Jan Feb Feb Mar Mar Apr Apr May Maj Jun Jun Jul Jul Aug Aug Sep Sep Oct Okt Nov Nov Dec Dec Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!! Gick inte att analysera Channels.xml, denna version är pÃ¥ allvar borked, inget annat val än att avbryta !! Therapy Pressure Terapi tryck Inspiratory Pressure Inandningstryck Lower Inspiratory Pressure Lägre Inandningstryck Higher Inspiratory Pressure Högre inandningstryck Expiratory Pressure Utandningstryck Lower Expiratory Pressure Lägre utandningstryck Higher Expiratory Pressure Högre utandningstryck Pressure Support Tryckstöd PS Min PS Min Pressure Support Minimum Tryckstöd minimum PS Max PS Max Pressure Support Maximum Tryckstöd Maximum Min Pressure Min Tryck Minimum Therapy Pressure Minimum Terapi Tryck Pr. Min Pr. Min Max Pressure Max Tryck Maximum Therapy Pressure Maximum Terapi Tryck Pr. Max Pr. Max Ramp Time Ramp Tid Ramp Delay Period Ramp fördröjnings period Ramp Pressure Ramptryck Starting Ramp Pressure Start Ramptryck Ramp Pr. Ramp Pr. Pressure Min Pressure Max Ramp Event Ramp Periodic Breathing Periodisk Andning A period of periodic breathing En period av periodisk andning Clear Airway Apnea Central Apne An apnea where the airway is open Ett andningsuppehÃ¥ll där luftvägarna är öppna Obstructive Apnea Obstruktiv Apne An apnea caused by airway obstruction Ett andningsuppehÃ¥ll där luftvägarna är blockerade Hypopnea Hypopné A partially obstructed airway En delvis blockerad luftväg Unclassified Apnea Ospecifierat andningsuppehÃ¥ll An apnea that could not fit into a category Ett andningsuppehÃ¥ll som inte kan placeras i nÃ¥gon kategori UA UA An restriction in breathing from normal, causing a flattening of the flow waveform. En begränsning i andningen frÃ¥n normalt, vilket orsakar en utplaning av flödes vÃ¥gformen. Respiratory Effort Related Arousal Andningsrelaterat uppvaknande An restriction in breathing that causes an either an awakening or sleep disturbance. En begränsning att andas som orsakar en antingen ett uppvaknande eller sömnstörningar. Vibratory Snore Snarkning A vibratory snore En snarkning Vibratory Snore (VS2) Snarkning (VS2) A vibratory snore as detcted by a System One machine En snarkning som registreras av Philips System One maskin Leak Flag A large mask leak affecting machine performance. En stor mask läcka som pÃ¥verkar maskinens prestanda. LF Non Responding Event En händelse som inte reageras pÃ¥ A type of respiratory event that won't respond to a pressure increase. En typ av andnings händelse som inte kommer att ge nÃ¥gon tryckökning. Expiratory Puff Utandnings puff Intellipap event where you breathe out your mouth. Intellipap händelse där du andas ut genom munnen. SensAwake feature will reduce pressure when waking is detected. SensAwake funktion minskar trycket när uppvaknande upptäcks. User Flag #1 Användar flagga#1 A user definable event detected by SleepyHead's flow waveform processor. En användardefinierad händelse som upptäcks av SleepyHead:s flödes-vÃ¥gform processor. User Flag #2 Användar flagga #2 User Flag #3 Användar flagga #3 Heart rate in beats per minute Puls i slag per minut SpO2 % SpO2 % Blood-oxygen saturation percentage Blod-syremättnadsprocent Plethysomogram Plethysomogram An optical Photo-plethysomogram showing heart rhythm En optisk foto-plethysomogram visande hjärtrytmen Perfusion Index A relative assessment of the pulse strength at the monitoring site Perf. Index % Pulse Change Puls förändring A sudden (user definable) change in heart rate En plötslig (användardefinierad) förändring av hjärtfrekvensen SpO2 Drop SpO2 NedgÃ¥ng A sudden (user definable) drop in blood oxygen saturation En plötslig (användardefinierad) nedgÃ¥ng i blodets syremättnad SD SD Breathing flow rate waveform Andning flödesvÃ¥gform Mask Pressure Mask Tryck Mask Pressure (High resolution) Mask Tryck (Hög upplösning) Amount of air displaced per breath Mängden luft visad per andetag Graph displaying snore volume Graf som visar omfattningen av snarkning Minute Ventilation Minut Ventilation Amount of air displaced per minute Mängden luft visad per minut Respiratory Rate Andningsfrekvens Rate of breaths per minute Andningsfrekvens per minut Patient Triggered Breaths Patient Triggade Andetag Percentage of breaths triggered by patient Procentandel av andetag utlösta av patienten Pat. Trig. Breaths Patient triggade andetag Leak Rate Storlek pÃ¥ Läckage Rate of detected mask leakage Storlek pÃ¥ upptäckta mask-läckage I:E Ratio I:E förhÃ¥llande Ratio between Inspiratory and Expiratory time FörhÃ¥llande mellan inandningstid och utandningstid Expiratory Time Utandningstid Time taken to breathe out Tid för att andas ut Inspiratory Time Inandningstid Time taken to breathe in Tid för att andas in Respiratory Event Andnings händelse A ResMed data source showing Respiratory Events En ResMed datakälla som visar Andnings händelser Graph showing severity of flow limitations Diagram som visar svÃ¥righetsgraden av flödesbegränsningar Flow Limit. Flödesbegränsning. Target Minute Ventilation MÃ¥l Minut Ventilation Target Minute Ventilation? MÃ¥l Minut Ventilation? Maximum Leak Maximum läckage The maximum rate of mask leakage Största uppmätta mask-läckaget Max Leaks Max läcka Apnea Hypopnea Index Apnea Hypopnea Index Graph showing running AHI for the past hour Diagram som visar rullande AHI den senaste timmen Total Leak Rate Totalt läckage Detected mask leakage including natural Mask leakages Upptäckta mask läckage inkluderande naturligt Mask läckage Median Leak Rate Median Läckage Median rate of detected mask leakage Median upptäckta mask läckage Median Leaks Median Läckage Respiratory Disturbance Index Andningsstörningsindex Graph showing running RDI for the past hour Diagram som visar rullande RDI den senaste timmen Sleep position in degrees Sovposition i grader Upright angle in degrees Upprätt vinkel i grader Mask On Time Tid för mask pÃ¥ Time started according to str.edf Tiden började enligt str.edf Summary Only Sammanställning enbart CPAP Session contains summary data only PAP Mode PAP Device Mode APAP (Variable) ASV (Fixed EPAP) ASV (Variable EPAP) Zero Upper Threshold Lower Threshold CPAP Session contains summary data onlyf CPAP period innehÃ¥ller sammanfattningsdata enbart There is a lockfile already present for profile '%1'. Det finns en lockfile redan för profil '%1'. You can only work with one instance of an individual SleepyHead profile at a time. Du kan bara arbeta med en instans av en enskild Sleepyhead-profil Ã¥t gÃ¥ngen. Please close any other instances of SleepyHead running with this profile before proceeding. Stäng alla andra instanser av Sleepyhead som kör med den här profilen innan du fortsätter. If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message. Om inga andra instanser av Sleepyhead körs (t.ex. kraschade det förra gÃ¥ngen!), Är det säkert att ignorera detta meddelande. There is a lockfile already present for this profile '%1', claimed on '%2'. Det finns en lockfile redan för den här profilen '%1', hävdade pÃ¥ '%2'. If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding. Om du använder moln lagring, se till SleepyHead är stängd och synkronisering har slutfört först pÃ¥ den andra datorn innan du fortsätter. Name: %1, %2 Namn: %1, %2 DOB: %1 Födelsedatum: %1 Phone: %1 Telefon: %1 Email: %1 E-post: %1 Address: Adress: Usage Statistics Användningsstatistik This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>. Denna rapport har genererats av en förhandsversion av Sleepyhead (%1), <b> och har inte godkänts pÃ¥ nÃ¥got sätt för efterlevnad eller medicinska diagnostiska ändamÃ¥l</b>. SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead Sleepyhead är fri programvara med öppen källkod tillgänglig frÃ¥n http://sourceforge.net/projects/SleepyHead Auto Bi-Level ASV Auto EPAP (% of time) Database Outdated Please Rebuild CPAP Data SleepyHead is proudly brought to you by JediMark. d MMM [ %1 - %2 ] %1 %1 Hide All Events Show All Events Unpin %1 Graph Pin %1 Graph Plots Disabled Duration %1:%2:%3 AHI %1 %1: %2 Relief: %1 Hours: %1h, %2m, %3s Machine Information Maskin Information %1 %2 %1 %2 Peak %1% %2 Fixed Auto Fixed Bi-Level Auto Bi-Level (Fixed PS) Auto Bi-Level (Variable PS) ASV Fixed EPAP ASV Variable EPAP %1%2 %1%2 Fixed %1 (%2) Min %1 Max %2 (%3) EPAP %1 IPAP %2 (%3) PS %1 over %2-%3 (%4) Min EPAP %1 Max IPAP %2 PS %3-%4 (%5) EPAP %1 PS %2-%3 (%6) Journal Data SleepyHead found an old Journal folder, but it looks like it's been renamed: SleepyHead will not touch this folder, and will create a new one instead. Please be careful when playing in SleepyHead's profile folders :-P For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders. SleepyHead picked only the first one of these, and will use it in future: If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually. Contec CMS50 CMS50F3.7 CMS50F Fisher & Paykel ICON SmartFlex Mode Intellipap pressure relief mode. Ramp Only Full Time SmartFlex Level Intellipap pressure relief level. DeVilbiss Intellipap SmartFlex Settings ChoiceMMed MD300 Respironics M-Series Philips Respironics System One VPAP Adapt EPR ResMed Exhale Pressure Relief Patient??? EPR Level Exhale Pressure Relief Level 0cmH2O 1cmH2O 2cmH2O 3cmH2O ResMed S9 EPR: Somnopose Somnopose Software Weinmann SOMNOsoft2 Zeo Personal Sleep Coach Loading %1 data... PLease Wait... By Pressure Statistics at Pressure %1 Session #%2 Welcome to SleepyHead Välkommen till SleepyHead What would you like to do? Please Import Some Data Vänligen Importera Vissa Data CPAP<br/>Importer Oximetery<br/>Wizard or View<br/>Statistics It might be a good idea to check preferences first,</br>as there are some options that affect import. Det kan vara en god idé att kolla inställningarna först,</br>eftersom det finns nÃ¥gra alternativ som kan pÃ¥verka importen. First import can take a few minutes. Första importen kan ta nÃ¥gra minuter. Click this box to see this in daily view. The last time you used your %1... last night yesterday %2 days ago was %1 (on %2) perfect :) pretty darn good reasonably good technically "treated" not very good horrible, please consult your doctor You had an AHI of %1, which is considered %2 %1 hours, %2 minutes and %3 seconds You machine was on for %1. <font color = red>You only had the mask on for %1.</font> You had no <i>major</i> mask leaks (maximum was %1 %2). You had a small but acceptable amount of <i>major</i> mask leakage. You had significant periods of <i>major</i> mask leakage. Your mask is leaking way too much.. Talk to your CPAP advisor. Your CPAP machine blasted you with a constant %1%2 of air Your pressure was under %1%2 for %3% of the time. Your machine blasted you with a constant %1-%2 %3 of air. Your machine was under %1-%2 %3 for %4% of the time. Your EPAP pressure fixed at %1%2. Your IPAP pressure was under %1%2 for %3% of the time. Your EPAP pressure was under %1%2 for %3% of the time. No CPAP data has been imported yet. Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> (last night) (yesterday) (%2 day ago) No oximetery data has been imported yet. Very Important Warning <p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer. <p><span title="Mac OSX and Win8.1" onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine. <p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p> Snapshot %1 QuaZipFilePrivate ZIP/UNZIP API error %1 ZIP/UNZIP API error %1 Report Form Formulär about:blank om:tom SessionBar No Sessions Present Ingen Period finns för närvarande Statistics CPAP Statistics CPAP Statistik CPAP Usage CPAP Användning Average Hours per Night Genomsnitt timmar per natt Compliance Användning Therapy Efficiacy Terapi Effektivitet Leak Statistics Läckage Statistik Pressure Statistics Tryck Statistik Oximeter Statistics Oximeter Statistik Blood Oxygen Saturation Blod Syremättnad Pulse Rate Puls %1 Median %1 Median Average %1 Genomsnitt %1 90% %1 90% %1 Min %1 Min %1 Max %1 Max %1 %1 Index %1 Index % of time in %1 % av tiden i %1 % of time above %1 threshold % av tiden ovan %1 linjen % of time below %1 threshold % av tiden under %1 linjen Please Import Some Data Vänligen Importera Vissa Data SleepyHead is pretty much useless without it. Sleepyhead är ganska meningslöst utan den. It might be a good idea to check preferences first,</br>as there are some options that affect import. Det kan vara en god idé att kolla inställningarna först,</br>eftersom det finns nÃ¥gra alternativ som kan pÃ¥verka importen. First import can take a few minutes. Första importen kan ta nÃ¥gra minuter. I can haz data?!? This lonely sleepy sheep has no data :( Most Recent Nyaste Last Week Förra veckan Last 30 Days Sista 30 dagarna Last 6 Months Senaste 6 mÃ¥naderna Last Year Senaste Ã¥ret Last Session Sista perioden Details Detaljer No %1 data available. Ingen %1 data tillgänglig. %1 day of %2 Data on %3 %1 dag av %2 Data pÃ¥ %3 %1 days of %2 Data, between %3 and %4 %1 dagar av %2 Data, mellan %3 och %4 Usage Information Användnings Information Total Days Totalt dagar Compliant Days Användnings-dagar Days AHI &gt;5.0 Dagar AHI &gt;5.0 Best&nbsp;%1 Bäst&nbsp;%1 Worst&nbsp;%1 Sämsta&nbsp;%1 Best RX Setting Bästa Tryck Inställning Worst RX Setting Sämsta Tryck Inställning Changes to Prescription Settings Ändringar av Tryck-inställningar Days Dagar Pressure Relief Pr. Rel. Tryck-lättnad. Pressure Settings Tryck Inställning Efficacy highlighting ignores prescription settings with less than %1 days of recorded data. Markering av Bästa/Sämsta ignorerar inställningar med mindre än %1 dagar av samma inställning. EPAP %1 EPAP %1 PS %1 PS %1 IPAP %1 IPAP %1 APAP %1 - %2 APAP %1 - %2 Fixed %1 Fast %1 Machine Information Maskin Information First Use Första användning Last Use Sista användning UpdaterWindow SleepyHead Updater SleepyHead Uppdateraren A new version of $APP is available En ny version av $APP är tillgänglig Version Information Versions Information Release Notes Nyheter i denna version about:blank om:tom Build Notes Versions noteringar Maybe &Later Kanske &Senare &Upgrade Now &Uppgradera nu Please wait while updates are downloaded and installed... Vänta medan uppdateringar hämtas och installeras ... Updates Uppdateringar Component Komponent Version Version Size Storlek Progress Framsteg Log Logg Downloading & Installing Updates Laddar ned och installerar uppdateringar &Finished &Avslutad Checking for SleepyHead Updates Söker efter SleepyHead uppdateringar Requesting Begära Saving as Sparar som XML update structure parsed cleanly XML uppdateringsstruktur analyserad OK No updates were found for your platform. Ingen uppdatering hittades för din plattform. SleepyHead Updates SleepyHead Uppdateringar No new updates were found for your platform. Ingen ny uppdatering hittades för din plattform. SleepyHead v%1, codename "%2" SleepyHead v%1, kodnamn "%2" platform notes Plattforms noteringar A new version of SleepyHead is available! En ny version av SleepyHead är tillgänglig! Shiny new <b>v%1</b> is available. You're running old and busted v%2 Skinande nya <b>v%1</b> är tillgänglig. Du kör gamla och sämre v%2 An update for SleepyHead is available. En uppdatering för SleepyHead är tillgänglig. Version <b>%1</b> is available. You're currently running v%1 Version <b>%1</b> är tillgänglig. Du använder v%1 SleepyHead v%1 build notes SleepyHead v%1 versions noteringar Update to QtLibs (v%1) Uppdatera till QtLibs (v%1) There was an error parsing the XML Update file. Det uppstod ett fel vid granskningen av XML Uppdaterings-filen. %1 bytes received %1 bytes mottaget Redirected to Omdirigerad till File size mismatch for %1 Filstorlek misstämmer för %1 File integrity check failed for %1 Integritetskontrollen misslyckades för %1 Extracting Extraktera You might need to reinstall manually. Sorry :( Du mÃ¥ste kanske Ã¥terinstallera manuellt. FörlÃ¥t :( Ugh.. Something went wrong with unzipping. Ugh.. NÃ¥got gick snett under upp-packningen. Failed Misslyckades Download Complete Nerladdning fullständig There was an error completing a network request: ( Det uppstod ett fel vid utförandet av en nätverksbegäran: ( Update Complete! Uppdatering Slutförd! Updates Complete. SleepyHead needs to restart now, click Finished to do so. Uppdatering färdig. SleepyHead mÃ¥ste startas om, klicka Avsluta för att starta om. Update Failed :( Uppdatering misslyckades :( Download Error. Sorry, try again later. Nerladdningsfel. Sorry, försök igen senare. Downloading & Installing Updates... Laddar ner & installerar uppdateringar... Please wait while downloading and installing updates. Vänta medan du hämtar och installerar uppdateringar. gGraph Snapshot gGraphView 100% zoom level Restore X-axis zoom too 100% to view entire days data. Reset Graph Layout Resets all graphs to a uniform height and default order. Y-Axis Plots CPAP Overlays Oximeter Overlays Dotted Lines Remove Clone Clone %1 Graph sleepyhead-0.9.8/history/0000755000175000017500000000000012412506713014717 5ustar sergiosergiosleepyhead-0.9.8/history/cpap.py0000644000175000017500000015062412412506713016224 0ustar sergiosergio#!/usr/bin/env python ''' This python script is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This python script is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this script; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ''' # Author: Mark Watkins # Date: 09/03/2011 # Purpose: CPAP Support # License: GPL #Attempt at faster CPAP Loader import sys import os from struct import * from datetime import datetime as DT from datetime import timedelta,date,time #,datetime,date,time import time from matplotlib.dates import drange from matplotlib.figure import Figure from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas from pylab import * #from pytz import timezone import pytz import gobject import gtk MYTIMEZONE="Australia/Queensland"; localtz=pytz.timezone(MYTIMEZONE) utc = pytz.utc utcoff=time.timezone / -(60*60) Device_Types={ "Unknown":0, "PAP":1, "Oximeter":2, "ZEO":3 } def LookupDeviceType(type): for k,v in Device_Types.iteritems(): if type.lower()==k.lower(): return v return 0 class Event: code=0 time=None data=[] def __init__(self,time,code,data): self.time=time self.code=code self.data=data class Waveform: time=None def __init__(self,time,waveform,size,duration,format,rate): self.time=time self.waveform=waveform self.size=size self.duration=duration self.format=format self.rate=rate class Machine: def __init__(self,brand,model,type): self.brand=brand self.model=model self.type=LookupDeviceType(type) def Open(self): print "in Machine.Open()"; class OxiMeter(Machine): CodeTypes=['Error','Pulse','SpO2'] def __init__(self,brand,model): Machine.__init__(self,brand,model,"Oximeter") import serial class CMS50X(OxiMeter): Baudrate=19200 Timeout=5 Home=os.path.expanduser('~') #LogDirectory=Home+os.sep+"CMS50" #os.system("mkdir "+LogDirectory) def __init__(self): OxiMeter.__init__(self,"Contec","CMS50X") self.Device=None self.devopen=False # Borrowed from PySerial if (os.name=="nt") or (sys.platform=="win32"): self.ports = [] for i in range(256): try: s = serial.Serial(i) self.ports.append( (i, s.portstr)) s.close() # explicit close 'cause of delayed GC in java except serial.SerialException: pass self.Device=self.ports[5] elif os.name=='posix': import glob self.ports=glob.glob('/dev/ttyUSB*') if (len(self.ports)>0): self.Device=self.ports[0] def Open(self): if not self.Device: print "No serial device detected" return False if self.devopen: print "Device is already open" return True try: self.ser=serial.Serial(self.Device,self.Baudrate,timeout=self.Timeout) except: print "Couldn't open",self.Device return False self.ser.flushInput() self.lastpulse=0 self.lastspo2=0 self.devopen=True return True def Close(self): if (self.devopen): ser.close() self.devopen=False def Read(self): while self.devopen: while self.devopen: h=self.ser.read(1) if len(h)>0: if (ord(h[0]) & 0x80): # Sync Bit break else: #print "Timeout!"; self.devopen=False return None c=self.ser.read(4) if len(c)==4: break else: #print "Sync error"; self.devopen=False return None hdr=ord(h) if (hdr & 0x10): alarm=True else: alarm=False if (hdr & 0x8):# or (hdr & 0x20): # (hdr & 0x10)==alarm signal=True else: signal=False wave1=ord(c[0]) wave2=ord(c[1]) pulse=ord(c[2]) spo2=ord(c[3]) return [signal,alarm,wave1,wave2,pulse,spo2] def Save(self,time,code,value): if (not self.start): return delta=time-self.lasttime s=int(((delta.seconds*1000)+delta.microseconds/1000)) self.events[self.start].append(s>>8) self.events[self.start].append(s&255) self.events[self.start].append(code) self.events[self.start].append(value) self.evcnt+=1 self.lasttime=time def Record(self,path): if self.devopen: return (None,None) self.starttime=DT.utcnow() self.lasttime=self.starttime lt=self.lasttime self.Open() lastpulse=0 lastspo2=0 lastalarm=True lastsignal=True self.evcnt=0 wave=[dict(),dict()] wavestart=None self.start=None self.events=dict() while self.devopen: D=self.Read() if not D: continue t=DT.utcnow(); d=t-lt if D[0]!=lastsignal or ((t-self.lasttime)>timedelta(seconds=64)): self.Save(t,0,D[0]) lastsignal=D[0] if D[1]!=lastalarm or ((t-self.lasttime)>timedelta(seconds=64)): self.Save(t,1,D[1]) lastalarm=D[1] if (not self.start or (d>timedelta(microseconds=30000))): #Lost serial sync for wavefom self.start=t print "Starting new event chunk",self.start self.events[self.start]=bytearray() lt=t if D[1]: continue if (not wavestart or (d>timedelta(microseconds=30000))): #Lost serial sync for wavefom wavestart=t wave[0][wavestart]=bytearray() wave[1][wavestart]=bytearray() print "Starting new wave chunk",wavestart wave[0][wavestart].append(D[2]) wave[1][wavestart].append(D[3]) if (D[4]!=lastpulse) or ((t-self.lasttime)>timedelta(seconds=64)): self.Save(t,2,D[4]) lastpulse=D[4] if (D[5]!=lastspo2) or ((t-self.lasttime)>timedelta(seconds=64)): self.Save(t,3,D[5]) lastspo2=D[5] self.Close() if (path[-1]!=os.sep): path+=os.sep ed=sorted(self.events.keys()) basename=path+ed[0].strftime("CMS50-%Y%m%d-%H%M%S") efname=basename+".001" magic=0x35534d43 #CMS5 f=open(efname,"wb"); j=0 for k,v in self.events.iteritems(): header=bytearray(16) timestamp=time.mktime(k.timetupple()) l=len(v) struct.pack_into('time[1]): continue if (endtime[1]): continue if (endself.sessiontimes[s][1]): val+=len(self.session[s][type]); else: for e in self.session[s][type]: if (e.time>=start) and (e.time<=end): val+=1 return val def FirstLastEventTime(self,field,start,end): sess=self.GetEvSessions(start,end) a1=self.sessiontimes[sess[0]][0] a2=self.sessiontimes[sess[-1]][1] #if (a1>=start): # st=a1 #else: st=a1 for e in self.session[sess[0]][field]: if (e.time>=start): st=e.time break; #if (a2<=end): #et=a2 #else: et=a2 for e in self.session[sess[-1]][field]: if (e.time>=end): et=e.time break; return (st,et) def GetTotalTime(self,start,end): t=timedelta(seconds=0) sess=self.GetEvSessions(start,end) for s in sess: #print self.sessiontimes[s] a1=self.sessiontimes[s][0] a2=self.sessiontimes[s][1] d=a2-a1 if a1end: d-=a2-end #print s,a2-a1 t+=d return t def GetEvents(self,type,start,end): if type not in self.CodeTypes: print "Unrecognized cpap code",field return None sess=self.GetEvSessions(start,end) E=[] for s in sess: for e in self.session[s][type]: if e.time>=start and e.time<=end: E.append(e) return E def GetEventsPlot(self,type,start,end,dc=None,di=0,padsession=False): if type not in self.CodeTypes: print "Unrecognized cpap code",field return None sess=self.GetEvSessions(start,end) T=[] D=[] laste=None firste=None for s in sess: for e in self.session[s][type]: if e.time>=start and e.time<=end: if not firste and padsession: firste=e D.append(0) T.append(e.time) T.append(e.time) if dc: D.append(dc) else: D.append(e.data[di]) laste=e if padsession: if laste: D.append(0) T.append(laste.time) return (T,D) def GetFlowPlots(self,start,end): sess=self.GetFlowSessions(start,end) T=[] D=[] for s in sess: X=[] Y=[] for w in self.flowrate[s]: d=timedelta(microseconds=w.rate*1000000.0) t=w.time for i in w.waveform: if t>=start and t<=end: Y.append(i) X.append(t) t+=d T.append(X) D.append(Y) return (T,D) def ScanMachines(self,path): print "Pure virtual function" exit(1) def OpenSD(self): self.machine=dict() self.session=dict() self.sessiontimes=dict() self.flowrate=dict() self.flowtimes=dict(); if os.name=="posix": posix_mountpoints=["/media","/mnt"] d=[] for i in posix_mountpoints: try: a=os.listdir(i) for j in range(0,len(a)): a[j]=i+os.sep+a[j] #print j d.extend(a) except: 1 elif (os.name=="nt") or (sys.platform=="win32"): #Meh.. i'll figure this out later. d=['D:','E:','F:','G:','H:','I:','J:'] #elif sys.platform=="darwin": #Darwin is posix aswell, but where? # d=[] r=0 if not len(d): print "I've have no idea where for an SDCard on",os.name,sys.platform return 0 print "Looking for CPAP data in",d for i in d: if self.ScanMachines(i): r+=1 return r def GetDays(self,numdays=7,date=None): DAYS=[] if (not date): dt=DT.now()#localtz.localize(DT.utcnow())-timedelta(hours=24); else: dt=date for i in range(0,numdays): d=dt.date(); (sleep,wake)=cpap.GetBedtime(dt) if sleep!=None: ln=wake-sleep b=cpap.GetTotalTime(sleep,wake) DAYS.append([d,sleep,wake,ln,b]) dt-=timedelta(hours=24) return DAYS class PRS1(CPAP): codes=dict() codes[0]=['UN1',[2,1]] codes[1]=['UN2',[2,1]] codes[2]=['PR',[2,1]] codes[3]=['BP',[2,1,1]] codes[4]=['PP',[2,1]] codes[5]=['RE',[2,1]] codes[6]=['OA',[2,1]] codes[7]=['CA',[2,1]] codes[0xa]=['H',[2,1]] codes[0xb]=['UNB',[2,2]] codes[0xc]=['FL',[2,1]] codes[0xd]=['VS',[2]] codes[0xe]=['UNE',[2,1,1,1]] codes[0xf]=['CSR',[2,2,1]] codes[0x10]=['UN10',[2,2,1]] codes[0x11]=['LR',[2,1,1]] codes[0x12]=['SUM',[1,1,2]] def __init__(self): CPAP.__init__(self,"Philips Respironics","System One") def ScanMachines(self,path): try: d=os.listdir(path); r=d.index("P-Series"); except: return False path+=os.sep+d[r]; try: d=os.listdir(path); except: print "Path",path,"unreadable" return False prs1unit=[] l=0 for f in d: if (f[0]!='P'): continue if (f[1].isdigit()): if f not in self.machine.keys(): self.machine[f]=[] self.machine[f].append(path+os.sep+f) l+=1 if not l: print "No",self.model,"machine data stored under",path return False return True def OpenMachine(self,serial): if serial not in self.machine.keys(): print "Couldn't open device!" return False self.session=dict() self.sessiontimes=dict() self.flowrate=dict() self.flowtimes=dict(); for path in self.machine[serial]: self.ReadMachineData(path,serial) def ReadMachineData(self,path,serial): try: d=os.listdir(path); r=d.index("p0"); except: print "Expected PRS1's p0 directory, and couldn't find it",path return False path+=os.sep+"p0" try: df=os.listdir(path); except: print "Couldn't read directory" return False r=0 for f in df: filename=f e2=f.rfind('.') if (e2<0): continue ext=int(f[e2+1:]) seq=int(f[0:e2]) if (ext==2) and (not seq in self.session.keys()): if self.Read002(path,filename): r+=1 elif (ext==5) and (not seq in self.flowrate.keys()): if self.Read005(path,filename): r+=1 if (r>0): print "Loaded",r,"files for",serial return True def Read002(self,path,filename): fn=path+os.sep+filename try: f=open(fn,'rb'); except: print "Couldn't Open File",fn return False header=f.read(16) if (len(header)<16): print "Not enough header data in",filename f.close() return False sm=0 for i in range(0,15): sm+=ord(header[i]) sm&=0xff h1=ord(header[0]); filesize,=unpack_from('0): #These events are also classed as vibratory snore E=Event(td,c,fields) self.session[sequence]['VS'].append(E); if (c==2) or (c==3): #CPAP Pressure fields[0]/=10.0 if c==3: fields[1]/=10.0 #Bipap E=Event(d,c,fields) #print E.time.astimezone(localtz),self.CodeTypes[gc],fields self.session[sequence][self.CodeTypes[gc]].append(E); self.sessiontimes[sequence]=[starttime,td] return True def Read005(self,path,filename): #print "Importing file",filename fn=path+os.sep+filename try: f=open(fn,'rb'); except: print "Couldn't Open File",fn return False done=0 blocks=0; starts=None while not done: header=f.read(24) if (len(header)<24): if (blocks==0): print "Not enough header data in",filename f.close() return False done=1 break; sm=0 for i in range(0,23): sm+=ord(header[i]) sm&=0xff h1=ord(header[0]); blocksize,=unpack_from('self.xlimits[1]): #check start and end are within xlimits print "Creating Highlights out of xlimit area is a sucky idea in matplotlib"; self.HL[index]=self.ax.axvspan(start,end,facecolor=color,alpha=0.5) #self.ax.draw_patches(self.HL[index]) self.ResetLimits() def SetXLim(self,start,end): self.xlimits=[start,end] self.ax.set_xlim(self.xlimits) def SetYLim(self,bottom,top): self.ylimits=[bottom,top] self.ax.set_ylim(self.ylimits) def ResetLimits(self): self.ax.set_xlim(self.xlimits) self.ax.set_ylim(self.ylimits) def SetDateTicks(self): e=self.xlimits[1]-self.xlimits[0] self.ax.xaxis.set_major_formatter(DateFormatter("%H:%M",tz=localtz)) if e>=timedelta(hours=10): self.ax.xaxis.set_major_locator(HourLocator(range(0,100,2),tz=localtz)) self.ax.xaxis.set_minor_locator(MinuteLocator(range( 0,100,10),tz=localtz)) elif e>=timedelta(hours=4): self.ax.xaxis.set_major_locator(HourLocator(range(0,100,1),tz=localtz)) self.ax.xaxis.set_minor_locator(MinuteLocator(range( 0,100,5),tz=localtz)) elif e>=timedelta(seconds=3600): self.ax.xaxis.set_major_locator(MinuteLocator(range(0,100,30),tz=localtz)) self.ax.xaxis.set_minor_locator(MinuteLocator(range( 0,100,1),tz=localtz)) elif e>=timedelta(seconds=1200): self.ax.xaxis.set_major_locator(MinuteLocator(range(0,100,5),tz=localtz)) self.ax.xaxis.set_minor_locator(SecondLocator(range( 0,100,15),tz=localtz)) elif e>=timedelta(seconds=300): self.ax.xaxis.set_major_locator(MinuteLocator(range(0,100,1),tz=localtz)) self.ax.xaxis.set_minor_locator(SecondLocator(range(0,100,5),tz=localtz)) else: self.ax.xaxis.set_major_locator(SecondLocator(range(0,100,30),tz=localtz)) self.ax.xaxis.set_minor_locator(SecondLocator(range(0,100,1),tz=localtz)) self.ax.xaxis.set_major_formatter(DateFormatter("%H:%M:%S",tz=localtz)) class LeaksGraph(Graph): def __init__(self,cpap,xlim=[0,0],ylim=[0,129],grid=True): Graph.__init__(self,"Leak Rate") #self.ax=ax self.machine=cpap self.Create() self.ylimits=ylim self.grid=grid self.xlimits=xlim self.T=[] self.D=[] def Update(self,start,end): if self.xlimits: if (start==self.xlimits[0]) and (end==self.xlimits[1]): return #(start,end)=self.machine.FirstLastEventTime('LR',start,end) (self.T,self.D)=self.machine.GetEventsPlot('LR',start=start,end=end,padsession=True) self.xlimits=[self.T[0],self.T[-1]] avg=sum(self.D)/len(self.D) for i in range(0,len(self.D)): self.D[i]-=avg; print "Average Leaks:",avg def Plot(self): self.ax.cla() self.SetTitle(self.name) if (self.grid): self.ax.grid(True); if len(self.T)>0: self.ax.plot_date(self.T,self.D,'black',aa=True,tz=localtz) self.ax.fill_between(self.T,self.D,0,color='gray') self.SetDateTicks() self.ax.yaxis.set_major_locator(MultipleLocator(20)) self.ax.yaxis.set_minor_locator(MultipleLocator(5)) self.ResetLimits() class PressureGraph(Graph): def __init__(self,cpap,xlim=[0,0],ylim=[1,20],grid=True): self.name="Pressure" #self.ax=ax self.machine=cpap self.Create() self.ylimits=ylim self.grid=grid self.xlimits=xlim self.T=[] self.D=[] def Update(self,start,end): if self.xlimits: if (start==self.xlimits[0]) and (end==self.xlimits[1]): return #(start,end)=self.machine.FirstLastEventTime('LR',start,end) self.xlimits=[start,end] (self.T,self.D)=self.machine.GetEventsPlot('PR',start=start,end=end) (self.T1,self.D1)=self.machine.GetEventsPlot('BP',start=start,end=end,di=0) (self.T2,self.D2)=self.machine.GetEventsPlot('BP',start=start,end=end,di=1) #for i in range(0,len(self.D)): # self.D[i]/=10.0; #avg=sum(self.D)/len(self.D) #print "Average Pressure:",avg def Plot(self): self.ax.cla() self.SetTitle(self.name) if (self.grid): self.ax.grid(True); if len(self.T)>0: self.ax.plot_date(self.T,self.D,'green',aa=True,tz=localtz) if (len(self.T1)>0): self.ax.plot_date(self.T1,self.D2,'orange',aa=True,tz=localtz) if (len(self.T2)>0): self.ax.plot_date(self.T2,self.D2,'purple',aa=True,tz=localtz) self.SetDateTicks() self.ax.yaxis.set_major_locator(MultipleLocator(5)) self.ax.yaxis.set_minor_locator(MultipleLocator(1)) self.ResetLimits() class SleepFlagsGraph(Graph): colours=['','y','r','k','b','c','m','g'] flags=['','RE','VS','FL','H','OA','CA','CSR'] barcolors=['w','#ffffd0','#ffdfdf','#efefef','#d0d0ff','#cfefff','#ebcdef','#dfffdf','w']; marker='.' def __init__(self,cpap,waveform,xlim=[0,0],ylim=[0,10],grid=True): self.name="Sleep Flags" self.waveform=waveform #self.ax=ax self.machine=cpap self.Create(height=175) self.ylimits=[0,len(self.flags)] self.grid=grid self.xlimits=xlim self.T=dict() self.D=dict() self.canvas.mpl_connect('pick_event', self.onpick) self.canvas.mpl_connect('button_press_event', self.on_press) self.canvas.mpl_connect('button_release_event', self.on_release) #self.canvas.mpl_connect('scroll_event', self.on_scroll) self.lastscroll=DT.now() self.scrollsteps=0 #self.canvas.mpl_connect('motion_notify_event', self.on_motion) def onpick(self,event): N = len(event.ind) if not N: return True return True thisline = event.artist xdata, ydata = thisline.get_data() ind = event.ind wavedelta=timedelta(seconds=300) #self.waveform.xlimits[1]-self.waveform.xlimits[0] d=timedelta(seconds=wavedelta.seconds/2) self.waveform.xlimits[0]=xdata[ind][0]-d if (self.waveform.xlimits[0](self.xlimits[1]-wavedelta)): self.waveform.xlimits[0]=self.xlimits[1]-wavedelta self.waveform.xlimits[1]=self.waveform.xlimits[0]+wavedelta; self.Highlight(self.waveform.xlimits[0],self.waveform.xlimits[1],'orange') self.Redraw() self.waveform.ResetLimits() self.waveform.SetDateTicks() self.waveform.Redraw() def do_scroll(self,steps,event): ct=DT.now() if (cttimedelta(seconds=3600)): wd=timedelta(seconds=300) self.waveform.xlimits[0]=d1-timedelta(seconds=wd.seconds/2); self.waveform.xlimits[1]=self.waveform.xlimits[0]+wd else: self.waveform.xlimits[0]=d1 self.waveform.xlimits[1]=d2 if (self.waveform.xlimits[0]self.xlimits[1]): self.waveform.xlimits[1]=self.xlimits[1] self.waveform.xlimits[0]=self.xlimits[1]-wd self.Highlight(self.waveform.xlimits[0],self.waveform.xlimits[1],'orange') self.Redraw() self.waveform.ResetLimits(); self.waveform.SetDateTicks() self.waveform.Redraw() def Update(self,start,end): if self.xlimits: if (start==self.xlimits[0]) and (end==self.xlimits[1]): return #(start,end)=self.machine.FirstLastEventTime('LR',start,end) self.xlimits=[start,end] #if self.waveform: #self.waveform.xlimits[0]=start #self.WaveDelta=timedelta(seconds=300) #self.waveform.xlimits[1]=start+self.WaveDelta j=0 for i in self.flags: if (i=="CSR"): self.T[i]=[] E=self.machine.GetEvents(i,start=start,end=end) for e in E: r=e.time-timedelta(seconds=e.data[1])-timedelta(seconds=e.data[0]/2) self.T[i].append(r) self.D[i]=[j]*len(self.T[i]) elif (i!=""): (self.T[i],self.D[i])=self.machine.GetEventsPlot(i,start=start,end=end,dc=j) j+=1 def Plot(self): self.ax.cla() self.SetTitle(self.name) if (self.grid): self.ax.grid(True); j=0; for i in self.flags: if (i!=""): if (len(self.T[i])>0): self.ax.plot_date(self.T[i],self.D[i],self.colours[j]+self.marker,picker=5,aa=False,tz=localtz,alpha=1) j+=1 self.SetDateTicks() self.ax.yaxis.set_major_locator(MultipleLocator(1)) self.ax.set_yticklabels(self.flags) yTicks=[0] yTicks.extend(self.ax.get_yticks()) h=(yTicks[1]-yTicks[0]) for i in range(1,len(yTicks)): yTicks[i]-=h/2 a1=date2num(self.xlimits[0]) a2=date2num(self.xlimits[1]) self.ax.barh(yTicks, [a2-a1]*len(yTicks), height=h, left=a1, color=self.barcolors,alpha=0.5) self.ResetLimits() class WaveformGraph(Graph): colours=['y','r','k','b','c','m','g'] flags=['RE','VS','FL','H','OA','CA'] def __init__(self,cpap,xlim=[0,0],ylim=[-69,69],grid=True): self.name="Flow Rate Waveform" #self.ax=ax self.machine=cpap self.Create() self.ylimits=ylim self.grid=grid self.xlimits=xlim self.T=[] self.D=[] self.FT=dict() self.FD=dict() self.canvas.mpl_connect('button_press_event', self.on_press) self.canvas.mpl_connect('button_release_event', self.on_release) self.canvas.mpl_connect('scroll_event', self.on_scroll) self.lastscroll=DT.now() self.scrollsteps=0 self.sg=None def set_sleepgraph(self,sg): self.sg=sg def on_press(self,event): if event.inaxes != self.ax: return contains, attrd = self.ax.patch.contains(event) if not contains: return #print 'event contains', self.ax.patch.xy x0, y0 = self.ax.patch.xy self.press = event.xdata, event.ydata def on_release(self,event): if event.inaxes != self.ax: return #if event.inaxes != self.ax: return #minx=min(event.xdata,self.press[0]); #maxx=max(event.xdata,self.press[0]); d1=num2date(self.press[0],tz=localtz) d2=num2date(event.xdata,tz=localtz) d=d2-d1 self.xlimits[0]-=d self.xlimits[1]-=d if self.xlimits[0]self.sg.xlimits[1]: self.xlimits[1]=self.sg.xlimits[1] self.xlimits[0]=self.xlimits[1]-d #update SleepGraph if (self.sg): self.sg.Highlight(self.xlimits[0],self.xlimits[1],'orange') self.sg.Redraw() self.ResetLimits() self.SetDateTicks() self.Redraw() def do_scroll(self,steps,event): ct=DT.now() if (ctlastpressure: cod="PUP" elif p0): self.ax.plot_date(self.FT[i],self.FD[i],self.colours[j]+'d',aa=True,alpha=.8,tz=localtz) self.ax.vlines(self.FT[i],50,-50,self.colours[j],lw=1,alpha=0.4) j+=1 j=0 for i in range(0,len(self.T)): self.ax.plot_date(self.T[i],self.D[i],'green',aa=True,tz=localtz,alpha=0.7) self.SetDateTicks() self.ax.yaxis.set_major_locator(MultipleLocator(20)) self.ax.yaxis.set_minor_locator(MultipleLocator(5)) if (len(self.FT['PUP'])): self.ax.plot_date(self.FT['PUP'],self.FD['PUP'],'k^',aa=True,alpha=.8,tz=localtz) if (len(self.FT['PDN'])): self.ax.plot_date(self.FT['PDN'],self.FD['PDN'],'kv',aa=True,alpha=.8,tz=localtz) if (len(self.FT['PP'])): self.ax.plot_date(self.FT['PP'],self.FD['PP'],'r.',aa=True,alpha=.8,tz=localtz) for E in self.FT['CSR']: e=E.time-timedelta(seconds=E.data[1]); s=e-timedelta(seconds=E.data[0]) self.ax.axvspan(s,e,facecolor='#d0ffd0'); #self.Highlight(s,e,color="#d0ffd0",index=j) self.ResetLimits() def AboutBox(a): txt='''SleepyHead v0.02 Details: Author: Mark Watkins (jedimark) Homepage: http://sleepyhead.sourceforge.net Please report any bugs on sourceforge. License: This software is released under the GNU Public Licence. Disclaimer: This is not medical software. Any output this program produces should not be used to make medical decisions. Special Thanks: Mike Hoolehan - Check out his awesome Onkor Project Troy Schultz - For great technical advice Mark Bruscke - For encouragement and advice and to the very awesome CPAPTalk Forum ''' msg=gtk.MessageDialog(flags=gtk.DIALOG_MODAL,type=gtk.MESSAGE_INFO,buttons=gtk.BUTTONS_CLOSE) msg.set_markup(txt) msg.run() msg.destroy() def CreateMenu(): file_menu = gtk.Menu() open_item = gtk.MenuItem("_Backup SD Card") save_item = gtk.MenuItem("_Print") quit_item = gtk.MenuItem("E_xit") file_menu.append(open_item) file_menu.append(save_item) file_menu.append(quit_item) quit_item.connect_object ("activate", lambda x: gtk.main_quit(), "file.quit") open_item.show() save_item.show() quit_item.show() help_menu = gtk.Menu() about_item = gtk.MenuItem("_About") about_item.connect_object("activate",AboutBox,"help.about") help_menu.append(about_item) about_item.show() file_item = gtk.MenuItem("_File") file_item.show() help_item = gtk.MenuItem("_Help") help_item.show() menu_bar = gtk.MenuBar() menu_bar.show() file_item.set_submenu(file_menu) menu_bar.append(file_item) help_item.set_submenu(help_menu) menu_bar.append(help_item) return menu_bar class DailyGraphs: def __init__(self,cpap): self.cpap=cpap self.layout=gtk.ScrolledWindow() self.layout.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC) self.vbox = gtk.VBox() self.layout.add_with_viewport(self.vbox) self.graph=dict(); self.graph['Waveform']=WaveformGraph(cpap) self.graph['Leaks']=LeaksGraph(cpap) self.graph['Pressure']=PressureGraph(cpap) self.graph['SleepFlags']=SleepFlagsGraph(cpap,self.graph['Waveform']) self.graph['Waveform'].set_sleepgraph(self.graph['SleepFlags']) self.vbox.pack_start(self.graph['SleepFlags'].canvas,expand=False) self.vbox.pack_start(self.graph['Waveform'].canvas,expand=False) self.vbox.pack_start(self.graph['Leaks'].canvas,expand=False) self.vbox.pack_start(self.graph['Pressure'].canvas,expand=False) self.machines=gtk.combo_box_new_text() for mach in cpap.machine.keys(): self.machines.append_text(mach) self.datesel=gtk.Calendar() self.textbox=gtk.TextView(buffer=None) self.textbox.set_editable(False) self.datesel.connect('month_changed',self.cal_month_selected,cpap) self.datesel.connect('day_selected',self.cal_day_selected) self.machines.connect("changed",self.select_machine,cpap) self.databox = gtk.VBox(homogeneous=False) self.rescanbutton=gtk.Button("_Rescan Media") self.rescanbutton.connect('pressed',self.pushed_rescan) #self.zeobutton=gtk.Button("Load _ZEO Data") #self.oxibutton=gtk.Button("Load _Oximeter Data") self.databox.pack_start(self.machines,expand=False,padding=2) self.databox.pack_start(self.datesel,expand=False,padding=2) self.databox.pack_start(self.rescanbutton,expand=False,padding=0) #self.databox.pack_start(self.zeobutton,expand=False,padding=0) #self.databox.pack_start(self.oxibutton,expand=False,padding=0) self.databox.pack_start(self.textbox,expand=True,padding=2) self.machines.set_active(0) #self.cal_month_selected(self.datesel,cpap) #self.cal_day_selected(self.datesel) def select_machine(self,combo,cpap): msg=gtk.MessageDialog(type=gtk.MESSAGE_INFO,buttons=gtk.BUTTONS_NONE,message_format="Please wait, Loading CPAP Data") msg.show_all() gtk.gdk.window_process_all_updates() mach=combo.get_active_text(); cpap.OpenMachine(mach) msg.destroy() self.cal_month_selected(self.datesel,self.cpap) self.cal_day_selected(self.datesel) def pushed_rescan(self,event): self.cpap.OpenSD() mach=self.machines.get_active_text(); self.machines.get_model().clear() j=0 cmi=-1 for m in cpap.machine.keys(): i=self.machines.insert_text(j,m) if (m==mach): cmi=j j+=1 if (cmi>=0): self.machines.set_active(cmi) else: self.machines.set_active(0) #cpap.OpenMachine(mach) self.cal_month_selected(self.datesel,self.cpap) #self.cal_day_selected(self.datesel) def Draw(self): for k,v in self.graph.iteritems(): v.Redraw() def ShowGraphs(self,show): if show: vis=True else: vis=False for i in self.graph.keys(): self.graph[i].canvas.set_visible(vis) def Update(self,start,end): for k,v in self.graph.iteritems(): v.Update(start,end) sess=cpap.GetFlowSessions(start,end) if (len(sess)>0): wvis=True; else: wvis=False; self.graph['Waveform'].canvas.set_visible(wvis) text="Date: "+start.astimezone(localtz).strftime("%Y-%m-%d")+"\n\n" text+="Bedtime: "+start.astimezone(localtz).strftime("%H:%M:%S")+"\n" text+="Waketime: "+end.astimezone(localtz).strftime("%H:%M:%S")+"\n\n" tt=cpap.GetTotalTime(start,end) text+="Total Time: "+str(tt)+"\n\n" if not wvis: text+="No Waveform Data Available\n\n" oa=cpap.CountEvents('OA',start,end) h=cpap.CountEvents('H',start,end) ah=oa+h ca=cpap.CountEvents('CA',start,end) fl=cpap.CountEvents('FL',start,end) vs=cpap.CountEvents('VS',start,end) re=cpap.CountEvents('RE',start,end) PR=cpap.GetEvents('PR',start,end) if (len(PR)>0): avgp=0 laste=PR[0] lastp=int(PR[0].data[0]*10) lastt=PR[0].time TPR=[timedelta(seconds=0)]*256 don=False totalptime=timedelta(0) for e in PR[1:]: p=int(e.data[0]*10) TPR[lastp]+=(e.time-lastt) totalptime+=(e.time-lastt) lastt=e.time lastp=p #if (not don): # TPR[lastp]+=lastt- np=timedelta(seconds=totalptime.seconds*.9) npc=timedelta(seconds=0) npp=0 lastp=0 for i in range(0,256): lpc=npc npc+=TPR[i] if (npc>=np): s2=1-(float(lpc.seconds)/float(npc.seconds)) d=(i-lastp)/10.0 npp=(lastp/10.0)+(s2*d) break if TPR[i]>timedelta(seconds=0): lastp=i avgp=0 sm1=0 sm2=0 sm3=0 for i in range(0,256): if TPR[i]>timedelta(seconds=0): s=float(TPR[i].seconds)/float(totalptime.seconds) sm1+=s*float(i) sm2+=s sm3=(float(i)/10.0)*TPR[i].seconds #avgp=sm3/totalptime.seconds avgp=sm1/sm2/10.0 #Weighted Average else: avgp=0 npp=0 LK=cpap.GetEvents('LR',start,end); avgl=0 for e in LK: avgl+=e.data[0]-19 avgl/=len(LK) CSR=cpap.GetEvents('CSR',start,end); dur=0 for e in CSR: dur+=e.data[0]; csr=(100.0/tt.seconds)*dur text+="Average Pressure=%(#)0.2f\n"%{'#':avgp} text+="90%% Pressure=%(#)0.2f\n\n"%{'#':npp} text+="CSR %% of night=%(#)0.2f\n" % {"#":csr} s=tt.seconds/3600.0 text+="OA=%(#)0.2f\n"%{'#':oa/s} text+="H=%(#)0.2f\n"%{'#':h/s} text+="CA=%(#)0.2f\n"%{'#':ca/s} text+="FL=%(#)0.2f\n"%{'#':fl/s} text+="VS=%(#)0.2f\n"%{'#':vs/s} text+="RE=%(#)0.2f\n"%{'#':re/s} text+="AHI=%(#)0.2f\n\n"%{'#':ah/s} text+="Leak=%(#)0.2f\n"%{'#':avgl} buf=self.textbox.get_buffer() buf.set_text(text) #self.date.set_text()) # self.bedtime.set_text("Bedtime: "+start.astimezone(localtz).strftime("%H:%M:%S")) # self.waketime.set_text("Waketime: "+end.astimezone(localtz).strftime("%H:%M:%S")) def Plot(self): for k,v in self.graph.iteritems(): v.Plot() self.graph['Waveform'].ResetLimits() def cal_month_selected(self,cal,cpap): (y,m,d)=cal.get_date(); d=1 m+=2 if (m>11): y+=1 m%=12 ldom=DT(y,m,d,0,0,0)-timedelta(hours=1) #print "Getting",ldom.day,"days back from",ldom D=cpap.GetDays(ldom.day,date=ldom) cal.freeze() for i in range(0,ldom.day-1): cal.unmark_day(i) for i in D: cal.mark_day(i[0].day) cal.thaw() def cal_day_selected(self,cal): (y,m,d)=cal.get_date() dat=DT(y,m+1,d,0,0,0) (st,et)=cpap.GetBedtime(dat) if st: msg=gtk.MessageDialog(type=gtk.MESSAGE_INFO,buttons=gtk.BUTTONS_NONE,message_format="Updating Plots - Please wait") msg.show_all() gtk.gdk.window_process_all_updates() self.ShowGraphs(True) #print "Bedtime",st.astimezone(localtz),"Wakeup",et.astimezone(localtz) self.Update(st,et) self.Plot() self.Draw() msg.destroy() else: self.ShowGraphs(False) text="No data available for selected date" buf=self.textbox.get_buffer() buf.set_text(text) path="/home/mark/.sleepyhead/CMS50" #cms50=CMS50X() #(event,wave)=cms50.Record(path) #exit(1) cpap=PRS1() cpap.OpenSD() win=gtk.Window() win.connect("destroy", lambda x: gtk.main_quit()) win.set_default_size(1200,680) win.set_title("SleepyHead v0.02") mainbox=gtk.VBox() mainbox.pack_start(CreateMenu(),expand=False) notebook=gtk.Notebook() notebook.unset_flags(gtk.CAN_FOCUS) dailybox=gtk.HBox() spo2box=gtk.HBox() mainbox.pack_start(notebook,expand=True) DG=DailyGraphs(cpap) dailybox.pack_start(DG.databox,expand=False) dailybox.pack_start(DG.layout,expand=True) page1=notebook.insert_page(dailybox,gtk.Label("Daily")) #page2=notebook.insert_page(dailybox,gtk.Label("Overview")) #page3=notebook.insert_page(spo2box,gtk.Label("SpO2")) notebook.set_current_page(page1) win.add(mainbox) win.show_all() gtk.main() sleepyhead-0.9.8/history/README0000644000175000017500000000070212412506713015576 0ustar sergiosergioThis folder contains the python/GTK script I (jedimark) wrote that eventually turned into SleepyHead I can't honestly tell you if this is the latest version, because the computer I originally wrote this on died. I put it here for project history, reference (and humour at how sad it is.) It requires matplotlib and pygtk to run.. Probably pytz too, I honestly can't remember if it needed any other libs. I've mostly forgotten python since then. sleepyhead-0.9.8/COPYING0000644000175000017500000010451312412506713014255 0ustar sergiosergio GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .